Browse Source

new: add web_m2o_enhanced module that add fiew options for many2one and many2many tags widget.

pull/4/head
Nicolas JEUDY 11 years ago
committed by Valentin Lab
parent
commit
49e43d9b38
  1. 63
      web_m2o_enhanced/README.rst
  2. 0
      web_m2o_enhanced/__init__.py
  3. 46
      web_m2o_enhanced/__openerp__.py
  4. 224
      web_m2o_enhanced/static/src/js/form.js

63
web_m2o_enhanced/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::
...
<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.

0
web_m2o_enhanced/__init__.py

46
web_m2o_enhanced/__openerp__.py

@ -0,0 +1,46 @@
# -*- coding: utf-8 -*-
{
"name": 'web_m2o_enhanced',
"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:
--------
<field name="partner_id" options="{'limit': 10, 'create': false, 'create_edit': false}"/>
Note:
-----
if one of those options are not set, many2one field use default many2one field options.
Thanks to:
----------
- Nicolas JEUDY <njeudy@tuxservices.com>
- Valentin LAB <valentin.lab@kalysto.org>
""",
"depends": [
'base',
'web',
],
"js": [
'static/src/js/form.js',
],
"author": "Tuxservices",
"installable" : True,
"active" : False,
}

224
web_m2o_enhanced/static/src/js/form.js

@ -0,0 +1,224 @@
/*global openerp, _, $ */
openerp.web_m2o_enhanced = function (instance) {
"use strict";
var QWeb = instance.web.qweb,
_t = instance.web._t,
_lt = instance.web._lt;
instance.web.form.FieldMany2One = instance.web.form.FieldMany2One.extend({
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 "<strong>%s</strong>"'),
$('<span />').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 = instance.web.form.FieldMany2ManyTags.extend({
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' && can_create) ||
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 "<strong>%s</strong>"'),
$('<span />').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'
});
}
return values;
})
},
});
};
Loading…
Cancel
Save