diff --git a/addons/base/controllers/main.py b/addons/base/controllers/main.py index 1135feeb1a6..0684964256f 100644 --- a/addons/base/controllers/main.py +++ b/addons/base/controllers/main.py @@ -449,12 +449,6 @@ class DataSet(openerpweb.Controller): m = req.session.model(model) r = m.default_get(fields, context) return {'result': r} - - @openerpweb.jsonrequest - def name_search(self, req, model, search_str, domain=[], context={}, limit=False): - m = req.session.model(model) - r = m.name_search(search_str, domain, 'ilike', context, limit) - return {'result': r} class DataGroup(openerpweb.Controller): _cp_path = "/base/group" diff --git a/addons/base/static/src/css/base.css b/addons/base/static/src/css/base.css index 1c5ab90b073..99bad503a52 100644 --- a/addons/base/static/src/css/base.css +++ b/addons/base/static/src/css/base.css @@ -693,6 +693,9 @@ background: linear-gradient(top, #ffffff 0%,#d8d8d8 11%,#afafaf 86%,#333333 91%, .openerp table.oe_frame td { color: #4c4c4c; } +.openerp td.oe_form_frame_cell { + padding: 2px; +} .openerp .required.error { border: 1px solid #900; } @@ -709,6 +712,7 @@ background: linear-gradient(top, #ffffff 0%,#d8d8d8 11%,#afafaf 86%,#333333 91%, .openerp label.oe_form_label, .openerp label.oe_form_label_help { display: block; text-align: right; + margin-top: 3px; } .openerp label.oe_form_label_help span { font-size: 80%; diff --git a/addons/base/static/src/js/data.js b/addons/base/static/src/js/data.js index 57999513a54..cdbaa9e6f54 100644 --- a/addons/base/static/src/js/data.js +++ b/addons/base/static/src/js/data.js @@ -320,15 +320,14 @@ openerp.base.DataSet = openerp.base.Controller.extend( /** @lends openerp.base. args: args || [] }, callback, error_callback); }, - name_search: function (search_str, limit, callback) { - search_str = search_str || ''; - return this.rpc('/base/dataset/name_search', { - model: this.model, - search_str: search_str, - domain: this.domain || [], - context: this.context, - limit: limit || false - }, callback); + /** + * Arguments: + * name='', args=None, operator='ilike', context=None, limit=100 + */ + name_search: function (args, callback, error_callback) { + return this.call('name_search', + args, + callback, error_callback); }, exec_workflow: function (id, signal, callback) { return this.rpc('/base/dataset/exec_workflow', { diff --git a/addons/base/static/src/js/form.js b/addons/base/static/src/js/form.js index d2f23bdc262..209635fa89c 100644 --- a/addons/base/static/src/js/form.js +++ b/addons/base/static/src/js/form.js @@ -88,6 +88,9 @@ openerp.base.FormView = openerp.base.View.extend( /** @lends openerp.base.FormV var field = this.fields[f]; field.touched = false; field.set_value(this.datarecord[f] || false); + // TODO: here we should be able to alter the 'touched' state when setting value + // the following line will be removed by fme as soon as refactoring has been done + field.touched = false; field.validate(); } if (!record.id) { @@ -173,8 +176,7 @@ openerp.base.FormView = openerp.base.View.extend( /** @lends openerp.base.FormV return this.rpc(ajax, { model: this.dataset.model, method: method, - ids: (this.datarecord.id == null ? [] : [this.datarecord.id]), - args: args + args: [].concat([(this.datarecord.id == null ? [] : [this.datarecord.id])], args) }, function(response) { self.on_processed_onchange(response, processed); }); @@ -1123,7 +1125,7 @@ openerp.base.form.FieldMany2One = openerp.base.form.Field.extend({ var dataset = new openerp.base.DataSetStatic(this.session, this.field.relation, []); - dataset.name_search(search_val, this.limit + 1, function(data) { + dataset.name_search([search_val, false, 'ilike', {}, this.limit + 1], function(data) { self.last_search = data.result; // possible selections for the m2o var values = _.map(data.result, function(x) { @@ -1134,13 +1136,16 @@ openerp.base.form.FieldMany2One = openerp.base.form.Field.extend({ if (values.length > self.limit) { values = values.slice(0, self.limit); values.push({label: "   Search More...", action: function() { - dataset.name_search(search_val, false, function(data) { + dataset.name_search([search_val, false, 'ilike', {}, false], function(data) { self._change_int_value(null); self._search_create_popup("search", data.result); }); }}); } - if (self.value === undefined) { + var raw_result = _(data.result).map(function(x) {return x[1];}) + if (search_val.length > 0 && + !_.include(raw_result, search_val) && + (!self.value || search_val !== self.value[1])) { values.push({label: '   Create "' + $('').text(search_val).html() + '"', action: function() { self._quick_create(search_val); diff --git a/addons/base/static/src/js/m2o.js b/addons/base/static/src/js/m2o.js deleted file mode 100644 index dea7e7c3b2e..00000000000 --- a/addons/base/static/src/js/m2o.js +++ /dev/null @@ -1,282 +0,0 @@ -openerp.base.m2o = function(openerp){ - -/* - - - - */ - - openerp.base.m2o = openerp.base.Controller.extend({ - init: function(element_id, model, dataset, session){ - this._super(element_id, model, dataset, session); - - this.session = session; - this.element = element_id.find('input'); - this.button = element_id.find('span'); - this.dataset = dataset; - this.cache = {}; - var lastXhr; - this.$input; - this.relation = model; - this.result_ids = []; - this.create_option = jQuery('#'+this.element.attr('name')+ '_open'); - if (this.create_option) { - var defaults = [ - {'text': 'Go to..', 'action': "call_Actions()"}, - {'text': 'Choose..', 'action': "call_Actions()"} - ] - jQuery(this.create_option).click(jQuery.proxy(function(evt){ - on_context_menu(evt, this.element, defaults); - }, this)); - } - var self = this; - - this.$input = this.element.autocomplete ({ - source: function(request, response){ - self.getSearch_Result(request, response); - return; - }, - select: function(event, ui){ - ui.item.value = ui.item.orig_val? ui.item.orig_val : self.element.data( "autocomplete" ).term; - if (ui.item.id == 'more') { - self.dataset.ids = self.result_ids; - self.dataset.count = self.dataset.ids.length; - self.dataset.domain = self.result_ids.length ? [["id", "in", self.dataset.ids]] : [] - self.element.val(''); - var pop = new openerp.base.form.Many2XSelectPopup(null, self.session); - pop.select_element(self.relation, self.dataset); - return; - } - - if (ui.item.id == 'create') { - var val = self.element.val(); - self.dataset.create({'name': ui.item.value}, - function(r){}, function(r){ - var element_id = _.uniqueId("act_window_dialog"); - var dialog = jQuery('
', - {'id': element_id - }).dialog({ - modal: true, - minWidth: 800 - }); - self.element.val(''); - var event_form = new openerp.base.FormView(null, - self.session, element_id, self.dataset, false); - event_form.start(); - }); - $input.val(self.element.data( "autocomplete" ).term); - return true; - } - self.element.attr('m2o_id', ui.item.id); - }, - minLength: 0, - focus: function(event, ui) { - self.gotFocus(event, ui); - } - }); - - this.button.button({ - icons: { - primary: "ui-icon-triangle-1-s"}, - text: false - }) - .click(function() { - // close if already visible - if (self.$input.autocomplete("widget").is(":visible")) { - self.$input.autocomplete( "close" ); - return; - } - $(this).blur(); - self.$input.autocomplete("search", "" ); - self.$input.focus(); - }); - }, - - getSearch_Result: function(request, response) { - var search_val = request.term; - if (search_val in this.cache) { - response(this.cache[search_val]); - return; - } - var self = this; - //pass request to server - lastXhr = this.dataset.name_search(search_val, function(obj, status, xhr){ - var result = obj.result; - var values = []; - - $.each(result, function(i, val){ - values.push({ - value: val[1], - id: val[0], - orig_val: val[1] - }); - self.result_ids.push(result[i][0]); - }); - - if (values.length > 7) { - values = values.slice(0, 7); - } - values.push({'value': 'More...', id: 'more', orig_val:''}, - {'value': 'Create..'+search_val, id: 'create', orig_val: ''}); - self.cache[search_val] = values; - response(values); - }); - }, - - getSelected_Result: function(event, ui) { - ui.item.value = ui.item.orig_val? ui.item.orig_val : this.element.data( "autocomplete" ).term; - if (ui.item.id == 'more') { - this.dataset.ids = this.result_ids; - this.dataset.count = this.dataset.ids.length; - this.dataset.domain = this.result_ids.length ? [["id", "in", this.dataset.ids]] : []; - this.element.val(''); - var pop = new openerp.base.form.Many2XSelectPopup(null, this.session); - pop.select_element(this.relation, this.dataset); - return; - } - - if (ui.item.id == 'create') { - this.openRecords(event, ui); - } - this.element.attr('m2o_id', ui.item.id); - }, - - gotFocus: function(event, ui) { - if (ui.item.id == ('create')) { - return true; - } - ui.item.value = this.element.data("autocomplete").term.length ? - this.element.val() + '[' + ui.item.orig_val.substring(this.element.data("autocomplete").term.length) + ']' : this.lastSearch; - }, - - openRecords: function(event, ui) { - var val = this.element.val(); - var self = this; - this.dataset.create({'name': ui.item.value}, - function(r){}, function(r){ - var element_id = _.uniqueId("act_window_dialog"); - var dialog = jQuery('
', - {'id': element_id - }).dialog({ - modal: true, - minWidth: 800 - }); - self.element.val(''); - var event_form = new openerp.base.FormView(null, self.session, - element_id, self.dataset, false); - event_form.start(); - }); - self.$input.val(self.element.data( "autocomplete" ).term); - return true; - } - }); -} - -function call_Actions() { - -} - -function on_context_menu(evt, target, defaults){ - - var $target = jQuery(target || evt.target); - var kind = $target.attr('type'); - if (!(kind && $target.is(':input, :enabled'))) { - return; - } - var $menu = jQuery('#m2o_contextmenu').show(); - if (!$menu.length) { - $menu = jQuery('
') - .css({position: 'absolute'}) - .hover(showContextMenu, hideContextMenu) - .appendTo(document.body).show(); - - if (jQuery(document.documentElement).hasClass('ie')) { - jQuery('