diff --git a/web_advanced_search_x2x/__manifest__.py b/web_advanced_search_x2x/__manifest__.py index 72ee66f5..14bc54a4 100644 --- a/web_advanced_search_x2x/__manifest__.py +++ b/web_advanced_search_x2x/__manifest__.py @@ -5,7 +5,7 @@ { "name": "Search x2x fields", - "version": "10.0.1.0.0", + "version": "10.0.2.0.0", "author": "Therp BV, " "Tecnativa, " "Odoo Community Association (OCA)", @@ -13,7 +13,7 @@ "category": "Usability", "summary": "Use a search widget in advanced search for x2x fields", "depends": [ - 'web', + 'web_widget_domain_v11', ], "data": [ 'views/templates.xml', diff --git a/web_advanced_search_x2x/static/src/css/web_advanced_search_x2x.less b/web_advanced_search_x2x/static/src/css/web_advanced_search_x2x.less index 008e4b56..b41fa4a2 100644 --- a/web_advanced_search_x2x/static/src/css/web_advanced_search_x2x.less +++ b/web_advanced_search_x2x/static/src/css/web_advanced_search_x2x.less @@ -1,7 +1,9 @@ -.openerp { - .oe-search-options { - .searchview_extended_prop_value { - .oe_form { +.o_search_options { + .o_filters_menu { + .o_filter_condition { + max-width: inherit; + + .o_searchview_extended_prop_value { .ui-autocomplete-input { .form-control(); } @@ -10,6 +12,10 @@ top: 6px; right: 2px; } + + .o_form_field_domain { + min-width: 400px; + } } } } diff --git a/web_advanced_search_x2x/static/src/js/web_advanced_search_x2x.js b/web_advanced_search_x2x/static/src/js/web_advanced_search_x2x.js index 69fa621c..36937962 100644 --- a/web_advanced_search_x2x/static/src/js/web_advanced_search_x2x.js +++ b/web_advanced_search_x2x/static/src/js/web_advanced_search_x2x.js @@ -15,8 +15,8 @@ odoo.define('web_advanced_search_x2x.search_filters', function (require) { var X2XAdvancedSearchPropositionMixin = { template: "web_advanced_search_x2x.proposition", - init: function() - { + + init: function () { // Make equal and not equal appear 1st and 2nd this.operators = _.sortBy( this.operators, @@ -38,28 +38,35 @@ odoo.define('web_advanced_search_x2x.search_filters', function (require) { }); return this._super.apply(this, arguments); }, + get_field_desc: function() { return this.field; }, + /** - * Add the right relational field to the template. + * Add x2x widget after rendering. */ - renderElement: function () { - try { - this._x2x_field.destroy(); - } catch (error) {} - this.relational = this.x2x_widget_name(); - this._super.apply(this, arguments); - if (this.relational) { + 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') ); } - delete this.relational; + return result; }, + + /** + * Re-render widget when operator changes. + */ + show_inputs: function () { + this.renderElement(); + return this._super.apply(this, arguments); + }, + /** * Create a relational field for the user. * @@ -77,12 +84,13 @@ odoo.define('web_advanced_search_x2x.search_filters', function (require) { this.x2x_field_create_options() ); this._x2x_field.on( - "change:value", + "domain_selected", this, this.proxy("x2x_value_changed") ); return this._x2x_field; }, + x2x_field_create_options: function () { return { attrs: { @@ -95,6 +103,7 @@ odoo.define('web_advanced_search_x2x.search_filters', function (require) { }, }; }, + x2x_value_changed: function () { switch (this.x2x_widget_name()) { case "char_domain": @@ -103,10 +112,18 @@ odoo.define('web_advanced_search_x2x.search_filters', function (require) { break; } }, + x2x_widget: function () { var name = this.x2x_widget_name(); return name && core.form_widget_registry.get(name); }, + + /** + * Return the widget that should be used to render this proposition. + * + * If it returns `undefined`, it means you should use a simple + * ``. + */ x2x_widget_name: function () { switch (this.get_operator()) { case "=": @@ -116,6 +133,7 @@ odoo.define('web_advanced_search_x2x.search_filters', function (require) { return "char_domain"; } }, + x2x_autocomplete_open: function() { var widget = this._x2x_field.$input.autocomplete("widget"); @@ -123,6 +141,7 @@ odoo.define('web_advanced_search_x2x.search_filters', function (require) { event.stopPropagation(); }); }, + get_domain: function () { // Special way to get domain if user chose "domain" filter if (this.get_operator() == "domain") { @@ -141,10 +160,12 @@ odoo.define('web_advanced_search_x2x.search_filters', function (require) { return this._super.apply(this, arguments); } }, + get_operator: function () { return !this.isDestroyed() && this.getParent().$('.o_searchview_extended_prop_op').val(); }, + get_value: function () { try { return this._x2x_field.get_value(); @@ -152,6 +173,7 @@ odoo.define('web_advanced_search_x2x.search_filters', function (require) { return this._super.apply(this, arguments); } }, + format_label: function (format, field, operator) { if (this.x2x_widget()) { var value = String(this._x2x_field.get_value()); @@ -180,30 +202,6 @@ odoo.define('web_advanced_search_x2x.search_filters', function (require) { X2XAdvancedSearchPropositionMixin ); - ExtendedSearchProposition.include({ - /** - * Force re-rendering the value widget if needed. - */ - operator_changed: function (event) { - if (this.value instanceof X2XAdvancedSearchProposition) { - this.value_rerender(); - } - return this._super.apply(this, arguments); - }, - /** - * Re-render proposition's value widget. - * - * @return {jQuery.Deferred} - */ - value_rerender: function () { - this.value._x2x_field && this.value._x2x_field.destroy(); - delete this.value._x2x_field; - return this.value.appendTo( - this.$(".o_searchview_extended_prop_value").show().empty() - ); - }, - }); - // Register this search proposition for relational fields $.each(affected_types, function (index, value) { core.search_filters_registry.add(value, X2XAdvancedSearchProposition); diff --git a/web_advanced_search_x2x/static/src/xml/web_advanced_search_x2x.xml b/web_advanced_search_x2x/static/src/xml/web_advanced_search_x2x.xml index 1440acf2..78a79a1d 100644 --- a/web_advanced_search_x2x/static/src/xml/web_advanced_search_x2x.xml +++ b/web_advanced_search_x2x/static/src/xml/web_advanced_search_x2x.xml @@ -3,12 +3,11 @@ License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). --> - - -
+ +
- - + + diff --git a/web_widget_domain_v11/README.rst b/web_widget_domain_v11/README.rst index 4de2c7fd..73d14663 100644 --- a/web_widget_domain_v11/README.rst +++ b/web_widget_domain_v11/README.rst @@ -14,9 +14,14 @@ Usage To use this module, you need to: -#. Install any addon that makes use of the domain widget (i.e. - ``mass_mailing``). -#. You will be able to use the updated version. +#. Enable the developer mode. +#ยท Go to *Settings > Technical > User interface > User-defined Filters* and + choose or create one. +#. Choose a model if there is none. +#. You will be able to choose the domain using the updated domain widget. + +Install any addon that makes use of the domain widget (i.e. ``mass_mailing``) +and you will be also able to use the new widget there. .. image:: https://odoo-community.org/website/image/ir.attachment/5784_f2813bd/datas :alt: Try me on Runbot @@ -26,7 +31,7 @@ Known issues / Roadmap ====================== * This addon replaces the built-in ``char_domain`` widget, so it can break - compatibility with other addons that use it. + compatibility with other addons that use or extend it. Bug Tracker =========== diff --git a/web_widget_domain_v11/__manifest__.py b/web_widget_domain_v11/__manifest__.py index f2d63c72..8e9702dc 100644 --- a/web_widget_domain_v11/__manifest__.py +++ b/web_widget_domain_v11/__manifest__.py @@ -16,6 +16,7 @@ ], "data": [ "templates/assets.xml", + "views/ir_filters.xml", ], "qweb": [ "static/src/copied-xml/templates.xml", diff --git a/web_widget_domain_v11/static/description/icon.png b/web_widget_domain_v11/static/description/icon.png index 3a0328b5..815b58f4 100644 Binary files a/web_widget_domain_v11/static/description/icon.png and b/web_widget_domain_v11/static/description/icon.png differ diff --git a/web_widget_domain_v11/static/src/copied-js/model_field_selector.js b/web_widget_domain_v11/static/src/copied-js/model_field_selector.js index 90736892..d1d6702f 100644 --- a/web_widget_domain_v11/static/src/copied-js/model_field_selector.js +++ b/web_widget_domain_v11/static/src/copied-js/model_field_selector.js @@ -28,6 +28,7 @@ var ModelFieldSelector = Widget.extend({ this.goToNextPage(this._getLastPageField($(e.currentTarget).data("name"))); }, "click li.o_field_selector_select_button": function (e) { + e.stopPropagation(); this.selectField(this._getLastPageField($(e.currentTarget).data("name"))); }, diff --git a/web_widget_domain_v11/static/src/js/domain_field.js b/web_widget_domain_v11/static/src/js/domain_field.js index 33668a19..8e2258d0 100644 --- a/web_widget_domain_v11/static/src/js/domain_field.js +++ b/web_widget_domain_v11/static/src/js/domain_field.js @@ -49,9 +49,6 @@ var FieldDomain = common.AbstractField.extend(common.ReinitializeFieldMixin).ext model: undefined, // this option is mandatory ! fs_filters: {}, // Field selector filters (to only show a subset of available fields @see FieldSelector) }); - if (this.options.model_field && !this.options.model) { - this.options.model = this.options.model_field; - } }, start: function() { this.model = _get_model.call(this); // TODO get the model another way ? @@ -66,10 +63,12 @@ var FieldDomain = common.AbstractField.extend(common.ReinitializeFieldMixin).ext return this._super.apply(this, arguments); function _get_model() { - if (this.field_manager.fields[this.options.model]) { - return this.field_manager.get_field_value(this.options.model); + if (this.options.model) { + return this.options.model; + } + if (this.field_manager.fields[this.options.model_field]) { + return this.field_manager.get_field_value(this.options.model_field); } - return this.options.model; } }, initialize_content: function () { diff --git a/web_widget_domain_v11/views/ir_filters.xml b/web_widget_domain_v11/views/ir_filters.xml new file mode 100644 index 00000000..604064bf --- /dev/null +++ b/web_widget_domain_v11/views/ir_filters.xml @@ -0,0 +1,19 @@ + + + + + + + Use domain widget + ir.filters + + + + char_domain + {'model_field': 'model_id'} + + + + +