You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
81 lines
3.1 KiB
81 lines
3.1 KiB
/** @odoo-module **/
|
|
/**
|
|
* This file is used to add a some functions to SearchModel for creating filter .
|
|
*/
|
|
import { SearchModel} from "@web/search/search_model";
|
|
import {patch} from "@web/core/utils/patch";
|
|
import {toTree} from "@advanced_search_widget/js/domain_tree"
|
|
|
|
patch(SearchModel.prototype, 'advanced_search_widget', {
|
|
setup() {
|
|
return this._super(...arguments);
|
|
},
|
|
FieldType(tree, description) {
|
|
// Return a description of the domain operator string based on the operator
|
|
if (tree.valueAST.type === 2) {
|
|
description += ' is';
|
|
if (tree.operator === '=' && !tree.valueAST.value) {
|
|
description += ' not';
|
|
}
|
|
if (tree.operator === '!=' && tree.valueAST.value) {
|
|
description += ' not';
|
|
}
|
|
description += ' set';
|
|
} else if (tree.valueAST.type === 1) {
|
|
if (tree.operator === 'ilike') {
|
|
description += ' contains ' + tree.valueAST.value;
|
|
} else if (tree.operator === 'not ilike') {
|
|
description += ' does not contain ' + tree.valueAST.value;
|
|
} else {
|
|
description += ' ' + tree.operator + ' ' + tree.valueAST.value;
|
|
}
|
|
} else if (tree.valueAST.type === 0) {
|
|
description += ' ' + tree.operator + ' ' + tree.valueAST.value;
|
|
}
|
|
return description;
|
|
},
|
|
|
|
DomainDescription(tree) {
|
|
// Returns a description for the domain to show in the search bar.
|
|
const getFieldString = (path) => {
|
|
if (path.includes(".")) {
|
|
const [mainField, subField] = path.split(".");
|
|
return `${this.searchViewFields[mainField].string} ${this.searchViewFields[subField].string}`;
|
|
} else {
|
|
return this.searchViewFields[path].string;
|
|
}
|
|
};
|
|
let description;
|
|
switch (tree.type) {
|
|
case 'condition':
|
|
description = this.FieldType(tree, getFieldString(tree.path));
|
|
break;
|
|
case 'connector':
|
|
const childDescriptions = tree.children.map((childTree) =>
|
|
this.FieldType(childTree, getFieldString(childTree.path)));
|
|
description = childDescriptions.join(" or ");
|
|
break;
|
|
}
|
|
return description;
|
|
},
|
|
|
|
async splitAndAddDomain(domain) {
|
|
// It will split domain based domain is branch or node and create filters
|
|
const tree = toTree(domain);
|
|
const trees = !tree.negate && tree.value === "&" ? tree.children : [tree];
|
|
const promises = trees.map(async (tree) => {
|
|
const description = await this.DomainDescription(tree);
|
|
const preFilter = {
|
|
description,
|
|
domain: domain,
|
|
invisible: true,
|
|
type: "filter",
|
|
};
|
|
return preFilter;
|
|
});
|
|
const preFilters = await Promise.all(promises);
|
|
for (const preFilter of preFilters) {
|
|
this.createNewFilters([preFilter]);
|
|
}
|
|
}
|
|
});
|
|
|