From f9edba09a929ab3a32a2f9345dcc135a46770b3d Mon Sep 17 00:00:00 2001 From: Jose Maria Bernet Date: Sun, 8 Jul 2018 22:51:12 +0200 Subject: [PATCH] [MIG] web_advanced_search_x2x: Migration to 11.0 [FIX] StopPropagation when clicking in domain selector. --- web_advanced_search/README.rst | 1 + web_advanced_search/__openerp__.py | 7 +- .../src/css/web_advanced_search_x2x.less | 35 ++-- .../static/src/js/web_advanced_search_x2x.js | 197 +++++------------- 4 files changed, 73 insertions(+), 167 deletions(-) diff --git a/web_advanced_search/README.rst b/web_advanced_search/README.rst index 26615be6..2b566350 100644 --- a/web_advanced_search/README.rst +++ b/web_advanced_search/README.rst @@ -51,6 +51,7 @@ Contributors * Vicent Cubells * Jairo Llopis * Rami Alwafaie +* Jose Mª Bernet Maintainer ---------- diff --git a/web_advanced_search/__openerp__.py b/web_advanced_search/__openerp__.py index ff4e5a3e..e0bfb898 100644 --- a/web_advanced_search/__openerp__.py +++ b/web_advanced_search/__openerp__.py @@ -1,20 +1,17 @@ -# -*- coding: utf-8 -*- # Copyright 2015 Therp BV # Copyright 2017 Tecnativa - Vicent Cubells # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). { "name": "Search x2x fields", - "version": "10.0.2.0.3", + "version": "11.0.1.0.0", "author": "Therp BV, " "Tecnativa, " "Odoo Community Association (OCA)", "license": "AGPL-3", "category": "Usability", "summary": "Use a search widget in advanced search for x2x fields", - "depends": [ - 'web_widget_domain_v11', - ], + "depends": [], "data": [ 'views/templates.xml', ], diff --git a/web_advanced_search/static/src/css/web_advanced_search_x2x.less b/web_advanced_search/static/src/css/web_advanced_search_x2x.less index b41fa4a2..57a0906c 100644 --- a/web_advanced_search/static/src/css/web_advanced_search_x2x.less +++ b/web_advanced_search/static/src/css/web_advanced_search_x2x.less @@ -1,22 +1,27 @@ .o_search_options { - .o_filters_menu { - .o_filter_condition { - max-width: inherit; - .o_searchview_extended_prop_value { - .ui-autocomplete-input { - .form-control(); - } + .o_filters_menu { + .o_filter_condition { + max-width: inherit; - .oe_m2o_drop_down_button { - top: 6px; - right: 2px; - } + .o_searchview_extended_prop_value { + .ui-autocomplete-input { + .form-control(); + } + + .oe_m2o_drop_down_button { + top: 6px; + right: 2px; + } - .o_form_field_domain { - min-width: 400px; - } - } + .o_form_field_domain { + min-width: 400px; } + } } + } +} + +.x2x_container { + min-width: 60ex; } diff --git a/web_advanced_search/static/src/js/web_advanced_search_x2x.js b/web_advanced_search/static/src/js/web_advanced_search_x2x.js index 06cc0eea..7f78dc7b 100644 --- a/web_advanced_search/static/src/js/web_advanced_search_x2x.js +++ b/web_advanced_search/static/src/js/web_advanced_search_x2x.js @@ -1,30 +1,45 @@ /* Copyright 2015 Therp BV * Copyright 2017 Jairo Llopis + * Copyright 2018 Jose Mª Bernet * License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). */ -odoo.define('web_advanced_search_x2x.search_filters', function (require) { +odoo.define('web_advanced_search_x2x', function (require) { "use strict"; - require('web.form_relational'); - require('web.form_widgets'); - var search_filters = require('web.search_filters'); - var form_common = require('web.form_common'); - var SearchView = require('web.SearchView'); - var data = require('web.data'); var core = require('web.core'); - var pyeval = require('web.pyeval'); + var DomainSelector = require('web.DomainSelector'); + var Domain = require("web.Domain"); + var FieldManagerMixin = require('web.FieldManagerMixin'); + var Char = core.search_filters_registry.get("char"); var X2XAdvancedSearchPropositionMixin = { template: "web_advanced_search_x2x.proposition", + events: { + // If click on the node add or delete button, notify the parent and let + // it handle the addition/removal + "click .o_domain_tree_operator_caret": "_openCaret" + }, + + _openCaret: function (e) { + var selectorClass = $('.o_domain_tree_operator_selector'); + if (selectorClass.hasClass('open')) { + selectorClass.removeClass('open'); + } else { + selectorClass.addClass('open'); + } + }, - init: function () { + init: function (parent, options) { // Make equal and not equal appear 1st and 2nd + this.relation = options.relation; + this.type = options.type; + this.field_name = options.name; + this.name = parent.name; + this.operators = _.sortBy( this.operators, - function(op) - { - switch(op.value) - { + function (op) { + switch (op.value) { case '=': return -2; case '!=': @@ -33,6 +48,7 @@ odoo.define('web_advanced_search_x2x.search_filters', function (require) { return 0; } }); + // Append domain operator this.operators.push({ 'value': 'domain', 'text': core._lt('is in selection'), @@ -41,27 +57,22 @@ odoo.define('web_advanced_search_x2x.search_filters', function (require) { this.events = $.extend({}, this.events, { click: function (event) { event.stopPropagation(); - }, + } }); return this._super.apply(this, arguments); }, - get_field_desc: function() - { + get_field_desc: function () { return this.field; }, /** * Add x2x widget after rendering. */ - renderElement: function() { + renderElement: function () { var result = this._super.apply(this, arguments); if (this.x2x_widget_name()) { this.x2x_field().appendTo(this.$el); - this._x2x_field.$el.on( - "autocompleteopen", - this.proxy('x2x_autocomplete_open') - ); } return result; }, @@ -86,44 +97,12 @@ odoo.define('web_advanced_search_x2x.search_filters', function (require) { } var widget = this.x2x_widget(); if (!widget) return; - - var field_domain = this.field.domain; - if (typeof field_domain === 'string') { - try { - pyeval.eval('domain', field_domain); - } catch(e) { - this.field.domain = "[]"; - } - } - - this._x2x_field = new widget( - this, - this.x2x_field_create_options() - ); - this._x2x_field.on( - "domain_selected", - this, - this.proxy("x2x_value_changed") - ); + this._x2x_field = new DomainSelector(this, this.relation, [], {readonly: false}); return this._x2x_field; }, - - x2x_field_create_options: function () { - return { - attrs: { - name: this.field.name, - options: JSON.stringify({ - no_create: true, - no_open: true, - model: this.field.relation, - }), - }, - }; - }, - x2x_value_changed: function () { switch (this.x2x_widget_name()) { - case "char_domain": + case "char": // Apply domain when selected this.getParent().getParent().commit_search(); break; @@ -132,7 +111,7 @@ odoo.define('web_advanced_search_x2x.search_filters', function (require) { x2x_widget: function () { var name = this.x2x_widget_name(); - return name && core.form_widget_registry.get(name); + return name && core.search_filters_registry.get(name); }, /** @@ -141,41 +120,29 @@ odoo.define('web_advanced_search_x2x.search_filters', function (require) { * If it returns `undefined`, it means you should use a simple * ``. */ + x2x_widget_name: function () { switch (this.get_operator()) { case "=": case "!=": - return "many2one"; + return undefined; case "domain": - return "char_domain"; + return "many2one"; } }, - x2x_autocomplete_open: function() - { - var widget = this._x2x_field.$input.autocomplete("widget"); - widget.on('click', 'li', function(event) { - event.stopPropagation(); - }); - }, - get_domain: function () { // Special way to get domain if user chose "domain" filter if (this.get_operator() == "domain") { - var value = this._x2x_field.get_value(); - var domain = new data.CompoundDomain(), - name = this.field.name; - $.map(value, function (el) { - var leaf = el; - if (typeof el !== "string") { - leaf = [ - _.str.sprintf("%s.%s", name, el[0]), - el[1], - el[2], - ]; + var domain = this._x2x_field.getDomain(); + var field_name = this.field_name; + + $.each(domain, function (index, value) { + if (domain[index].constructor == Array) { + domain[index][0] = field_name + '.' + domain[index][0] } - domain.add([leaf]); }); + return domain; } else { return this._super.apply(this, arguments); @@ -192,37 +159,17 @@ odoo.define('web_advanced_search_x2x.search_filters', function (require) { if (!this.x2x_widget_name()) { throw "No x2x widget, fallback to default"; } - return this._x2x_field.get_value(); + var domain = this._x2x_field.getDomain(); + return Domain.prototype.arrayToString(domain) } catch (error) { return this._super.apply(this, arguments); } - }, - - format_label: function (format, field, operator) { - if (this.x2x_widget()) { - var value = String(this._x2x_field.get_value()); - if (this._x2x_field.display_value) { - value = this._x2x_field.display_value[value]; - } - return _.str.sprintf( - format, - { - field: field.string, - operator: operator.label || operator.text, - value: value, - } - ); - } else { - return this._super.apply(this, arguments); - } - }, + } }; - var ExtendedSearchProposition = search_filters.ExtendedSearchProposition, - Char = ExtendedSearchProposition.Char, - affected_types = ["one2many", "many2one", "many2many"], + var affected_types = ["one2many", "many2one", "many2many"], X2XAdvancedSearchProposition = Char.extend( - form_common.FieldManagerMixin, + FieldManagerMixin, X2XAdvancedSearchPropositionMixin ); @@ -231,50 +178,6 @@ odoo.define('web_advanced_search_x2x.search_filters', function (require) { core.search_filters_registry.add(value, X2XAdvancedSearchProposition); }); - SearchView.include({ - build_search_data: function() - { - //Advanced.commit_search can only cope with propositions - //(=domain leaves), - //so we need to rebuild the domain if one of our CompoundDomains - //is involved - var result = this._super.apply(this, arguments); - _.each(result.domains, function(domain, index) - { - if(!_.isArray(domain)) - { - return; - } - var compound_domains = [], leaves = []; - _.each(domain, function(leaf) - { - if(leaf instanceof data.CompoundDomain) - { - compound_domains.push(leaf); - } - if(_.isArray(leaf)) - { - leaves.push(leaf); - } - }); - if(compound_domains.length) - { - var combined = new data.CompoundDomain(); - _.each(compound_domains, function(domain) - { - combined.add(domain.eval()); - }); - _.each(leaves, function(leaf) - { - combined.add([leaf]); - }); - result.domains[index] = combined; - } - }); - return result; - }, - }); - return { X2XAdvancedSearchPropositionMixin: X2XAdvancedSearchPropositionMixin, X2XAdvancedSearchProposition: X2XAdvancedSearchProposition,