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.
86 lines
2.8 KiB
86 lines
2.8 KiB
/* Copyright 2018 Tecnativa - Jairo Llopis
|
|
* License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). */
|
|
|
|
odoo.define("web_advanced_search.human_domain", function (require) {
|
|
"use strict";
|
|
|
|
var DomainSelector = require("web.DomainSelector");
|
|
|
|
var join_mapping = {
|
|
"&": _(" and "),
|
|
"|": _(" or "),
|
|
"!": _(" is not "),
|
|
};
|
|
|
|
// HACK I should extend classes, but they are not exposed
|
|
// TODO Remove file when merged https://github.com/odoo/odoo/pull/25922
|
|
var human_domain_methods = {
|
|
DomainTree: function () {
|
|
var human_domains = [];
|
|
_.each(this.children, function (child) {
|
|
human_domains.push(
|
|
human_domain_methods[child.template].apply(child)
|
|
);
|
|
});
|
|
return _.str.sprintf(
|
|
"(%s)",
|
|
human_domains.join(join_mapping[this.operator])
|
|
);
|
|
},
|
|
|
|
DomainSelector: function () {
|
|
var result = human_domain_methods.DomainTree.apply(this, arguments);
|
|
// Remove surrounding parenthesis
|
|
return result.slice(1, -1);
|
|
},
|
|
|
|
DomainLeaf: function () {
|
|
var chain = [],
|
|
operator = this.operator_mapping[this.operator],
|
|
value = _.str.sprintf('"%s"', this.value);
|
|
// Humanize chain
|
|
this.chain.split(".").forEach(function (element, index) {
|
|
chain.push(
|
|
_.findWhere(
|
|
this.fieldSelector.pages[index],
|
|
{name: element}
|
|
).string || element
|
|
);
|
|
}, this);
|
|
// Special beautiness for some values
|
|
if (this.operator === "=" && _.isBoolean(this.value)) {
|
|
operator = this.operator_mapping[this.value ? "set" : "not set"];
|
|
value = "";
|
|
} else if (_.isArray(this.value)) {
|
|
value = _.str.sprintf('["%s"]', this.value.join('", "'));
|
|
}
|
|
return _.str.sprintf(
|
|
"%s %s %s",
|
|
chain.join("→"),
|
|
operator || this.operator,
|
|
value
|
|
).trim();
|
|
},
|
|
};
|
|
|
|
function getHumanDomain (parent, model, domain, options) {
|
|
var domain_selector = new DomainSelector(
|
|
parent,
|
|
model,
|
|
domain,
|
|
options
|
|
);
|
|
var dummy_parent = $("<div>");
|
|
domain_selector.appendTo(dummy_parent);
|
|
var result = human_domain_methods.DomainSelector.apply(
|
|
domain_selector
|
|
);
|
|
domain_selector.destroy();
|
|
dummy_parent.destroy();
|
|
return result;
|
|
}
|
|
|
|
return {
|
|
getHumanDomain: getHumanDomain,
|
|
};
|
|
});
|