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

  1. /* Copyright 2018 Tecnativa - Jairo Llopis
  2. * License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). */
  3. odoo.define("web_advanced_search.human_domain", function (require) {
  4. "use strict";
  5. var DomainSelector = require("web.DomainSelector");
  6. var join_mapping = {
  7. "&": _(" and "),
  8. "|": _(" or "),
  9. "!": _(" is not "),
  10. };
  11. // HACK I should extend classes, but they are not exposed
  12. // TODO Remove file when merged https://github.com/odoo/odoo/pull/25922
  13. var human_domain_methods = {
  14. DomainTree: function () {
  15. var human_domains = [];
  16. _.each(this.children, function (child) {
  17. human_domains.push(
  18. human_domain_methods[child.template].apply(child)
  19. );
  20. });
  21. return _.str.sprintf(
  22. "(%s)",
  23. human_domains.join(join_mapping[this.operator])
  24. );
  25. },
  26. DomainSelector: function () {
  27. var result = human_domain_methods.DomainTree.apply(this, arguments);
  28. // Remove surrounding parenthesis
  29. return result.slice(1, -1);
  30. },
  31. DomainLeaf: function () {
  32. var chain = [],
  33. operator = this.operator_mapping[this.operator],
  34. value = _.str.sprintf('"%s"', this.value);
  35. // Humanize chain
  36. this.chain.split(".").forEach(function (element, index) {
  37. chain.push(
  38. _.findWhere(
  39. this.fieldSelector.pages[index],
  40. {name: element}
  41. ).string || element
  42. );
  43. }, this);
  44. // Special beautiness for some values
  45. if (this.operator === "=" && _.isBoolean(this.value)) {
  46. operator = this.operator_mapping[this.value ? "set" : "not set"];
  47. value = "";
  48. } else if (_.isArray(this.value)) {
  49. value = _.str.sprintf('["%s"]', this.value.join('", "'));
  50. }
  51. return _.str.sprintf(
  52. "%s %s %s",
  53. chain.join("→"),
  54. operator || this.operator,
  55. value
  56. ).trim();
  57. },
  58. };
  59. function getHumanDomain (parent, model, domain, options) {
  60. var domain_selector = new DomainSelector(
  61. parent,
  62. model,
  63. domain,
  64. options
  65. );
  66. var dummy_parent = $("<div>");
  67. domain_selector.appendTo(dummy_parent);
  68. var result = human_domain_methods.DomainSelector.apply(
  69. domain_selector
  70. );
  71. domain_selector.destroy();
  72. dummy_parent.destroy();
  73. return result;
  74. }
  75. return {
  76. getHumanDomain: getHumanDomain,
  77. };
  78. });