diff --git a/web_m2x_options/README.rst b/web_m2x_options/README.rst new file mode 100644 index 00000000..2b1fafdb --- /dev/null +++ b/web_m2x_options/README.rst @@ -0,0 +1,63 @@ +================================== +Add new options for many2one field +================================== + + +Description +----------- + +This modules modifies "many2one" form fields so as to add some new display +control options. + +** New: support many2manytags widget ! ** + +Options provided includes possibility to remove "Create..." and/or "Create and +Edit..." entries from many2one drop down. You can also change default number of +proposition appearing in the drop-down. Or prevent the dialog box poping in +case of validation error. + +If not specified, the module will avoid proposing any of the create options +if the current user have no permission rights to create the related object. + + +Requirements +------------ + +Was tested on openerp v7.0 + + +New option +---------- + +``create`` *boolean* (Default: depends if user have create rights) + + Whether to display the "Create..." entry in dropdown panel. + +``create_edit`` *boolean* (Default: depends if user have create rights) + + Whether to display "Create and Edit..." entry in dropdown panel + +``m2o_dialog`` *boolean* (Default: depends if user have create rights) + + Whether to display the many2one dialog in case of validation error. + +``limit`` *int* (Default: openerp default value is ``7``) + + Number of displayed record in drop-down panel + + +Example +------- + +Your XML form view definition could contain:: + + ... + + ... + +Note +---- + +Double check that you have no inherited view that remote ``options`` you set on a field ! +If nothing work, add a debugger in the first ligne of ``get_search_result method`` and enable debug mode in OpenERP. When you write something in a many2one field, javascript debugger should pause. If not verify your installation. + diff --git a/web_m2x_options/__init__.py b/web_m2x_options/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/web_m2x_options/__openerp__.py b/web_m2x_options/__openerp__.py new file mode 100644 index 00000000..f428885e --- /dev/null +++ b/web_m2x_options/__openerp__.py @@ -0,0 +1,46 @@ +# -*- coding: utf-8 -*- + +{ + "name": 'web_m2x_options', + "version": "0.1", + "description": +""" +===================================================== +Add new options for many2one and many2manytags field: +===================================================== + +- create: true/false -> disable "create" entry in dropdown panel +- create_edit: true/false -> disable "create and edit" entry in dropdown panel +- limit: 10 (int) -> change number of selected record return in dropdown panel +- m2o_dialog: true/false -> disable quick create M20Dialog triggered on error. + +Example: +-------- + + + +Note: +----- + +if one of those options are not set, many2one field use default many2one field options. + +Thanks to: +---------- + +- Nicolas JEUDY +- Valentin LAB + +""", + "depends": [ + 'base', + 'web', + ], + "js": [ + 'static/src/js/form.js', + ], + "author": "Tuxservices", + "installable" : True, + "active" : False, +} + + diff --git a/web_m2x_options/static/description/index.html b/web_m2x_options/static/description/index.html new file mode 100644 index 00000000..30abedb7 --- /dev/null +++ b/web_m2x_options/static/description/index.html @@ -0,0 +1,391 @@ + + + + + + +Add new options for many2one field + + + +
+

Add new options for many2one field

+ +
+

Description

+

This modules modifies "many2one" form fields so as to add some new display +control options.

+

** New: support many2manytags widget ! **

+

Options provided includes possibility to remove "Create..." and/or "Create and +Edit..." entries from many2one drop down. You can also change default number of +proposition appearing in the drop-down. Or prevent the dialog box poping in +case of validation error.

+

If not specified, the module will avoid proposing any of the create options +if the current user have no permission rights to create the related object.

+
+
+

Requirements

+

Was tested on openerp v7.0

+
+
+

New option

+

create boolean (Default: depends if user have create rights)

+
+Whether to display the "Create..." entry in dropdown panel.
+

create_edit boolean (Default: depends if user have create rights)

+
+Whether to display "Create and Edit..." entry in dropdown panel
+

m2o_dialog boolean (Default: depends if user have create rights)

+
+Whether to display the many2one dialog in case of validation error.
+

limit int (Default: openerp default value is 7)

+
+Number of displayed record in drop-down panel
+
+
+

Example

+

Your XML form view definition could contain:

+
+...
+<field name="partner_id" options="{'limit': 10, 'create': false, 'create_edit': false}"/>
+...
+
+
+
+

Note

+

Double check that you have no inherited view that remote options you set on a field ! +If nothing work, add a debugger in the first ligne of get_search_result method and enable debug mode in OpenERP. When you write something in a many2one field, javascript debugger should pause. If not verify your installation.

+
+
+ + diff --git a/web_m2x_options/static/src/js/form.js b/web_m2x_options/static/src/js/form.js new file mode 100644 index 00000000..00885a09 --- /dev/null +++ b/web_m2x_options/static/src/js/form.js @@ -0,0 +1,224 @@ +/*global openerp, _, $ */ + +openerp.web_m2x_options = function (instance) { + + "use strict"; + + var QWeb = instance.web.qweb, + _t = instance.web._t, + _lt = instance.web._lt; + + instance.web.form.FieldMany2One.include({ + + show_error_displayer: function () { + if ((typeof this.options.m2o_dialog === 'undefined' && this.can_create) || + this.options.m2o_dialog) { + new instance.web.form.M2ODialog(this).open(); + } + }, + + get_search_result: function (search_val) { + + var def = $.Deferred(); + var self = this; + // add options limit used to change number of selections record + // returned. + + if (typeof this.options.limit === 'number') { + this.limit = this.options.limit; + } + + var dataset = new instance.web.DataSet(this, this.field.relation, + self.build_context()); + var blacklist = this.get_search_blacklist(); + this.last_query = search_val; + + var search_result = this.orderer.add(dataset.name_search( + search_val, + new instance.web.CompoundDomain( + self.build_domain(), [["id", "not in", blacklist]]), + 'ilike', this.limit + 1, + self.build_context())); + + var create_rights; + if (typeof this.options.create === "undefined" || + typeof this.options.create_edit === "undefined") { + create_rights = new instance.web.Model(this.field.relation).call( + "check_access_rights", ["create", false]); + } + + $.when(search_result, create_rights).then(function (_data, _can_create) { + var data = _data[0]; + + var can_create = _can_create ? _can_create[0] : null; + + self.can_create = can_create; // for ``.show_error_displayer()`` + self.last_search = data; + // possible selections for the m2o + var values = _.map(data, function (x) { + x[1] = x[1].split("\n")[0]; + return { + label: _.str.escapeHTML(x[1]), + value: x[1], + name: x[1], + id: x[0], + }; + }); + + // search more... if more results that max + + if (values.length > self.limit) { + values = values.slice(0, self.limit); + values.push({ + label: _t("Search More..."), + action: function () { + dataset.name_search( + search_val, self.build_domain(), + 'ilike', false).done(function (data) { + self._search_create_popup("search", data); + }); + }, + classname: 'oe_m2o_dropdown_option' + }); + } + + // quick create + + var raw_result = _(data.result).map(function (x) { + return x[1]; + }); + + if ((typeof self.options.create === 'undefined' && can_create) || + self.options.create) { + + if (search_val.length > 0 && + !_.include(raw_result, search_val)) { + + values.push({ + label: _.str.sprintf( + _t('Create "%s"'), + $('').text(search_val).html()), + action: function () { + self._quick_create(search_val); + }, + classname: 'oe_m2o_dropdown_option' + }); + } + } + + // create... + + if ((typeof self.options.create_edit === 'undefined' && can_create) || + self.options.create_edit) { + + values.push({ + label: _t("Create and Edit..."), + action: function () { + self._search_create_popup( + "form", undefined, + self._create_context(search_val)); + }, + classname: 'oe_m2o_dropdown_option' + }); + } + + def.resolve(values); + }); + + return def; + } + }); + + instance.web.form.FieldMany2ManyTags.include({ + + show_error_displayer: function () { + if ((typeof this.options.m2o_dialog === 'undefined' && this.can_create) || + this.options.m2o_dialog) { + new instance.web.form.M2ODialog(this).open(); + } + }, + + /** + * Call this method to search using a string. + */ + + get_search_result: function(search_val) { + var self = this; + + // add options limit used to change number of selections record + // returned. + + if (typeof this.options.limit === 'number') { + this.limit = this.options.limit; + } + + var dataset = new instance.web.DataSet(this, this.field.relation, self.build_context()); + var blacklist = this.get_search_blacklist(); + this.last_query = search_val; + + return this.orderer.add(dataset.name_search( + search_val, new instance.web.CompoundDomain(self.build_domain(), [["id", "not in", blacklist]]), + 'ilike', this.limit + 1, self.build_context())).then(function(data) { + self.last_search = data; + // possible selections for the m2o + var values = _.map(data, function(x) { + x[1] = x[1].split("\n")[0]; + return { + label: _.str.escapeHTML(x[1]), + value: x[1], + name: x[1], + id: x[0], + }; + }); + + // search more... if more results that max + if (values.length > self.limit) { + values = values.slice(0, self.limit); + values.push({ + label: _t("Search More..."), + action: function() { + dataset.name_search(search_val, self.build_domain(), 'ilike', false).done(function(data) { + self._search_create_popup("search", data); + }); + }, + classname: 'oe_m2o_dropdown_option' + }); + } + // quick create + + if ((typeof self.options.create === 'undefined') || + self.options.create) { + + var raw_result = _(data.result).map(function(x) {return x[1];}); + if (search_val.length > 0 && !_.include(raw_result, search_val)) { + values.push({ + label: _.str.sprintf(_t('Create "%s"'), + $('').text(search_val).html()), + action: function() { + self._quick_create(search_val); + }, + classname: 'oe_m2o_dropdown_option' + }); + } + } + + // create... + + if ((typeof self.options.create_edit === 'undefined') || + self.options.create_edit) { + + values.push({ + label: _t("Create and Edit..."), + action: function() { + self._search_create_popup("form", undefined, self._create_context(search_val)); + }, + classname: 'oe_m2o_dropdown_option' + }); + } + + return values; + }) + }, + }); +}; +