diff --git a/web_m2x_options/README.rst b/web_m2x_options/README.rst index ed857f9ce..ab6953eee 100644 --- a/web_m2x_options/README.rst +++ b/web_m2x_options/README.rst @@ -23,7 +23,7 @@ web_m2x_options :target: https://runbot.odoo-community.org/runbot/162/15.0 :alt: Try me on Runbot -|badge1| |badge2| |badge3| |badge4| |badge5| +|badge1| |badge2| |badge3| |badge4| |badge5| This modules modifies "many2one" and "many2manytags" form widgets so as to add some new display control options. @@ -178,6 +178,7 @@ Contributors * Jairo Llopis * David Vidal * Ernesto Tejeda + * Carlos Roca * Bhavesh Odedra * Dhara Solanki (http://www.initos.com) diff --git a/web_m2x_options/__manifest__.py b/web_m2x_options/__manifest__.py index 0b3c94410..d865feb56 100644 --- a/web_m2x_options/__manifest__.py +++ b/web_m2x_options/__manifest__.py @@ -17,7 +17,10 @@ "license": "AGPL-3", "depends": ["web"], "assets": { - "web.assets_backend": ["web_m2x_options/static/src/js/form.js"], + "web.assets_backend": [ + "web_m2x_options/static/src/js/form.js", + "web_m2x_options/static/src/js/ir_options.js", + ], "web.assets_qweb": ["web_m2x_options/static/src/xml/base.xml"], }, "installable": True, diff --git a/web_m2x_options/models/ir_config_parameter.py b/web_m2x_options/models/ir_config_parameter.py index 8e7228f08..26638d038 100644 --- a/web_m2x_options/models/ir_config_parameter.py +++ b/web_m2x_options/models/ir_config_parameter.py @@ -13,4 +13,7 @@ class IrConfigParameter(models.Model): "web_m2x_options.search_more", "web_m2x_options.m2o_dialog", ] - return self.sudo().search_read([["key", "in", opts]], ["key", "value"]) + return { + res["key"]: res["value"] + for res in self.sudo().search_read([["key", "in", opts]], ["key", "value"]) + } diff --git a/web_m2x_options/readme/CONTRIBUTORS.rst b/web_m2x_options/readme/CONTRIBUTORS.rst index 9838a8c21..c42c7afe7 100644 --- a/web_m2x_options/readme/CONTRIBUTORS.rst +++ b/web_m2x_options/readme/CONTRIBUTORS.rst @@ -9,5 +9,6 @@ * Jairo Llopis * David Vidal * Ernesto Tejeda + * Carlos Roca * Bhavesh Odedra * Dhara Solanki (http://www.initos.com) diff --git a/web_m2x_options/static/src/js/form.js b/web_m2x_options/static/src/js/form.js index 2ca088fe8..9f67758d2 100644 --- a/web_m2x_options/static/src/js/form.js +++ b/web_m2x_options/static/src/js/form.js @@ -6,9 +6,10 @@ odoo.define("web_m2x_options.web_m2x_options", function (require) { var core = require("web.core"), data = require("web.data"), Dialog = require("web.Dialog"), + FormView = require("web.FormView"), view_dialogs = require("web.view_dialogs"), relational_fields = require("web.relational_fields"), - rpc = require("web.rpc"); + ir_options = require("web_m2x_options.ir_options"); var _t = core._t, FieldMany2ManyTags = relational_fields.FieldMany2ManyTags, @@ -16,10 +17,12 @@ odoo.define("web_m2x_options.web_m2x_options", function (require) { FieldOne2Many = relational_fields.FieldOne2Many, FormFieldMany2ManyTags = relational_fields.FormFieldMany2ManyTags; - var web_m2x_options = rpc.query({ - model: "ir.config_parameter", - method: "get_web_m2x_options", - }); + function is_option_set(option) { + if (_.isUndefined(option)) return false; + if (typeof option === "string") return option === "true" || option === "True"; + if (typeof option === "boolean") return option; + return false; + } var M2ODialog = Dialog.extend({ template: "M2ODialog", @@ -93,43 +96,13 @@ odoo.define("web_m2x_options.web_m2x_options", function (require) { }); FieldMany2One.include({ - start: function () { - this._super.apply(this, arguments); - return this.get_options(); - }, - - get_options: function () { - var self = this; - if (_.isUndefined(this.ir_options_loaded)) { - this.ir_options_loaded = $.Deferred(); - this.ir_options = {}; - web_m2x_options.then(function (records) { - _(records).each(function (record) { - self.ir_options[record.key] = record.value; - }); - self.ir_options_loaded.resolve(); - }); - } - return $.when(); - }, - - is_option_set: function (option) { - if (_.isUndefined(option)) return false; - if (typeof option === "string") - return option === "true" || option === "True"; - if (typeof option === "boolean") return option; - return false; - }, - _onInputFocusout: function () { var m2o_dialog_opt = - this.is_option_set(this.nodeOptions.m2o_dialog) || + is_option_set(this.nodeOptions.m2o_dialog) || (_.isUndefined(this.nodeOptions.m2o_dialog) && - this.is_option_set( - this.ir_options["web_m2x_options.m2o_dialog"] - )) || + is_option_set(ir_options["web_m2x_options.m2o_dialog"])) || (_.isUndefined(this.nodeOptions.m2o_dialog) && - _.isUndefined(this.ir_options["web_m2x_options.m2o_dialog"])); + _.isUndefined(ir_options["web_m2x_options.m2o_dialog"])); if (this.can_create && this.floating && m2o_dialog_opt) { new M2ODialog(this, this.string, this.$input.val()).open(); } @@ -137,14 +110,12 @@ odoo.define("web_m2x_options.web_m2x_options", function (require) { _search: function (search_val) { var self = this; - if (search_val === undefined) { - return this._super.apply(this, arguments); - } + var def = new Promise((resolve) => { // Add options limit used to change number of selections record // returned. - if (!_.isUndefined(self.ir_options["web_m2x_options.limit"])) { - this.limit = parseInt(self.ir_options["web_m2x_options.limit"], 10); + if (!_.isUndefined(ir_options["web_m2x_options.limit"])) { + this.limit = parseInt(ir_options["web_m2x_options.limit"], 10); } if (typeof self.nodeOptions.limit === "number") { @@ -230,14 +201,12 @@ odoo.define("web_m2x_options.web_m2x_options", function (require) { // 4- if set globally, apply its value // 5- if not set globally either, check if returned values are more than node's limit if (!_.isUndefined(self.nodeOptions.search_more)) { - var search_more = self.is_option_set( - self.nodeOptions.search_more - ); + var search_more = is_option_set(self.nodeOptions.search_more); } else if ( - !_.isUndefined(self.ir_options["web_m2x_options.search_more"]) + !_.isUndefined(ir_options["web_m2x_options.search_more"]) ) { - var search_more = self.is_option_set( - self.ir_options["web_m2x_options.search_more"] + var search_more = is_option_set( + ir_options["web_m2x_options.search_more"] ); } else { var search_more = values.length > self.limit; @@ -299,13 +268,13 @@ odoo.define("web_m2x_options.web_m2x_options", function (require) { var raw_result = _.map(result, function (x) { return x[1]; }); - var quick_create = self.is_option_set(self.nodeOptions.create), + var quick_create = is_option_set(self.nodeOptions.create), quick_create_undef = _.isUndefined(self.nodeOptions.create), m2x_create_undef = _.isUndefined( - self.ir_options["web_m2x_options.create"] + ir_options["web_m2x_options.create"] ), - m2x_create = self.is_option_set( - self.ir_options["web_m2x_options.create"] + m2x_create = is_option_set( + ir_options["web_m2x_options.create"] ); var show_create = (!self.nodeOptions && (m2x_create_undef || m2x_create)) || @@ -332,16 +301,16 @@ odoo.define("web_m2x_options.web_m2x_options", function (require) { // Create and edit ... var create_edit = - self.is_option_set(self.nodeOptions.create) || - self.is_option_set(self.nodeOptions.create_edit), + is_option_set(self.nodeOptions.create) || + is_option_set(self.nodeOptions.create_edit), create_edit_undef = _.isUndefined(self.nodeOptions.create) && _.isUndefined(self.nodeOptions.create_edit), m2x_create_edit_undef = _.isUndefined( - self.ir_options["web_m2x_options.create_edit"] + ir_options["web_m2x_options.create_edit"] ), - m2x_create_edit = self.is_option_set( - self.ir_options["web_m2x_options.create_edit"] + m2x_create_edit = is_option_set( + ir_options["web_m2x_options.create_edit"] ); var show_create_edit = (!self.nodeOptions && @@ -381,6 +350,17 @@ odoo.define("web_m2x_options.web_m2x_options", function (require) { }); }); this.orderer.add(def); + + // Add options limit used to change number of selections record + // returned. + if (!_.isUndefined(ir_options["web_m2x_options.limit"])) { + this.limit = parseInt(ir_options["web_m2x_options.limit"], 10); + } + + if (typeof this.nodeOptions.limit === "number") { + this.limit = this.nodeOptions.limit; + } + return def; }, }); @@ -396,17 +376,9 @@ odoo.define("web_m2x_options.web_m2x_options", function (require) { return result; }, - is_option_set: function (option) { - if (_.isUndefined(option)) return false; - if (typeof option === "string") - return option === "true" || option === "True"; - if (typeof option === "boolean") return option; - return false; - }, - _onOpenBadge: function (event) { var self = this; - var open = self.nodeOptions && self.is_option_set(self.nodeOptions.open); + var open = self.nodeOptions && is_option_set(self.nodeOptions.open); if (open) { var context = self.record.getContext(self.recordParams); var id = parseInt($(event.currentTarget).data("id"), 10); @@ -491,8 +463,8 @@ odoo.define("web_m2x_options.web_m2x_options", function (require) { }), _onOpenBadge: function (event) { - var open = this.is_option_set(this.nodeOptions.open); - var no_color_picker = this.is_option_set(this.nodeOptions.no_color_picker); + var open = is_option_set(this.nodeOptions.open); + var no_color_picker = is_option_set(this.nodeOptions.no_color_picker); this._super.apply(this, arguments); if (!open && !no_color_picker) { this._onOpenColorPicker(event); diff --git a/web_m2x_options/static/src/js/ir_options.js b/web_m2x_options/static/src/js/ir_options.js new file mode 100644 index 000000000..293c66c51 --- /dev/null +++ b/web_m2x_options/static/src/js/ir_options.js @@ -0,0 +1,12 @@ +/* Copyright 2020 Tecnativa - Carlos Roca + * * License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). */ +odoo.define("web_m2x_options.ir_options", function (require) { + "use strict"; + + var rpc = require("web.rpc"); + + return rpc.query({ + model: "ir.config_parameter", + method: "get_web_m2x_options", + }); +});