diff options
| author | Jiten (OpenERP) <jra@tinyerp.com> | 2011-10-07 10:41:13 +0530 |
|---|---|---|
| committer | Jiten (OpenERP) <jra@tinyerp.com> | 2011-10-07 10:41:13 +0530 |
| commit | 2adffb46e5952945f2b22197afab65b00b5d38cb (patch) | |
| tree | 6cfe89b7666032e3540528c1e7d7aad6cdc32168 /addons/web/static/src | |
| parent | e1e04341bc9c256701abcf1f1544d03f25bd5c50 (diff) | |
| parent | a12c082d55dfdc759483e224b658180cc0151379 (diff) | |
[Merge] Merge from openerp-web.
bzr revid: jra@tinyerp.com-20111007051113-w33l3jffcxlgz811
Diffstat (limited to 'addons/web/static/src')
| -rw-r--r-- | addons/web/static/src/css/base.css | 4 | ||||
| -rw-r--r-- | addons/web/static/src/js/core.js | 4 | ||||
| -rw-r--r-- | addons/web/static/src/js/formats.js | 8 | ||||
| -rw-r--r-- | addons/web/static/src/js/search.js | 55 | ||||
| -rw-r--r-- | addons/web/static/src/js/view_form.js | 33 | ||||
| -rw-r--r-- | addons/web/static/src/js/view_list.js | 57 | ||||
| -rw-r--r-- | addons/web/static/src/js/view_list_editable.js | 33 | ||||
| -rw-r--r-- | addons/web/static/src/js/views.js | 105 | ||||
| -rw-r--r-- | addons/web/static/src/xml/base.xml | 30 |
9 files changed, 187 insertions, 142 deletions
diff --git a/addons/web/static/src/css/base.css b/addons/web/static/src/css/base.css index 8c99823434c..7bcf65ec3da 100644 --- a/addons/web/static/src/css/base.css +++ b/addons/web/static/src/css/base.css @@ -855,7 +855,7 @@ label.error { cursor: help; } -.openerp .oe_form_field label.oe_label, .openerp .oe_form_field label.oe_label_help { +.openerp .oe_forms label.oe_label, .openerp .oe_forms label.oe_label_help { text-align: right; margin: 3px 0 0 10px; } @@ -943,7 +943,7 @@ label.error { position: relative; } .openerp input.oe-binary-file { - z-index: 2; + z-index: 0; line-height: 0; font-size: 50px; position: absolute; diff --git a/addons/web/static/src/js/core.js b/addons/web/static/src/js/core.js index 2e9294ded12..da9c21bf551 100644 --- a/addons/web/static/src/js/core.js +++ b/addons/web/static/src/js/core.js @@ -480,14 +480,12 @@ openerp.web.Session = openerp.web.CallbackEnabled.extend( /** @lends openerp.web session_login: function(db, login, password, success_callback) { var self = this; var params = { db: db, login: login, password: password }; - this.rpc("/web/session/login", params, function(result) { + return this.rpc("/web/session/login", params, function(result) { self.session_id = result.session_id; self.uid = result.uid; self.user_context = result.context; self.db = result.db; self.session_save(); - if (self.uid) - self.on_session_valid(); return true; }).then(success_callback); }, diff --git a/addons/web/static/src/js/formats.js b/addons/web/static/src/js/formats.js index e7feedf26a5..d3d88bc3731 100644 --- a/addons/web/static/src/js/formats.js +++ b/addons/web/static/src/js/formats.js @@ -179,9 +179,13 @@ openerp.web.auto_date_to_str = function(value, type) { * @param {String} [column.string] button label * @param {String} [column.icon] button icon * @param {String} [value_if_empty=''] what to display if the field's value is ``false`` + * @param {Boolean} [process_modifiers=true] should the modifiers be computed ? */ -openerp.web.format_cell = function (row_data, column, value_if_empty) { - var attrs = column.modifiers_for(row_data); +openerp.web.format_cell = function (row_data, column, value_if_empty, process_modifiers) { + var attrs = {}; + if (process_modifiers !== false) { + attrs = column.modifiers_for(row_data); + } if (attrs.invisible) { return ''; } if (column.tag === 'button') { return [ diff --git a/addons/web/static/src/js/search.js b/addons/web/static/src/js/search.js index db91d6bfd27..5f88b9a1512 100644 --- a/addons/web/static/src/js/search.js +++ b/addons/web/static/src/js/search.js @@ -13,24 +13,35 @@ openerp.web.SearchView = openerp.web.Widget.extend(/** @lends openerp.web.Search * @param view_id * @param defaults */ - init: function(parent, dataset, view_id, defaults) { + init: function(parent, dataset, view_id, defaults, hidden) { this._super(parent); this.dataset = dataset; this.model = dataset.model; this.view_id = view_id; this.defaults = defaults || {}; + this.has_defaults = !_.isEmpty(this.defaults); this.inputs = []; this.enabled_filters = []; this.has_focus = false; + this.hidden = !!hidden; + this.headless = this.hidden && !this.has_defaults; + this.ready = $.Deferred(); }, start: function() { this._super(); - this.rpc("/web/searchview/load", {"model": this.model, "view_id":this.view_id}, this.on_loaded); + if (this.hidden) { + this.$element.hide(); + } + if (this.headless) { + this.ready.resolve(); + } else { + this.rpc("/web/searchview/load", {"model": this.model, "view_id":this.view_id}, this.on_loaded); + } return this.ready.promise(); }, show: function () { @@ -105,8 +116,9 @@ openerp.web.SearchView = openerp.web.Widget.extend(/** @lends openerp.web.Search */ make_field: function (item, field) { try { - return new (openerp.web.search.fields.get_object(field.type)) - (item, field, this); + return new (openerp.web.search.fields.get_any( + [item.attrs.widget, field.type])) + (item, field, this); } catch (e) { if (! e instanceof openerp.web.KeyNotFound) { throw e; @@ -137,10 +149,7 @@ openerp.web.SearchView = openerp.web.Widget.extend(/** @lends openerp.web.Search 'defaults': this.defaults }); - // We don't understand why the following commented line does not work in Chrome but - // the non-commented line does. As far as we investigated, only God knows. - //this.$element.html(render); - jQuery(render).appendTo(this.$element); + this.$element.html(render); this.$element.find(".oe_search-view-custom-filter-btn").click(ext.on_activate); var f = this.$element.find('form'); @@ -246,10 +255,13 @@ openerp.web.SearchView = openerp.web.Widget.extend(/** @lends openerp.web.Search * @param e jQuery event object coming from the "Search" button */ do_search: function (e) { + if (this.headless && !this.has_defaults) { + return this.on_search([], [], []); + } // reset filters management var select = this.$element.find(".oe_search-view-filters-management"); select.val("_filters"); - + if (e && e.preventDefault) { e.preventDefault(); } var data = this.build_search_data(); @@ -327,7 +339,7 @@ openerp.web.SearchView = openerp.web.Widget.extend(/** @lends openerp.web.Search this.notification.notify("Invalid Search", "triggered from search view"); }, do_clear: function () { - this.$element.find('.filter_label').removeClass('enabled'); + this.$element.find('.filter_label, .filter_icon').removeClass('enabled'); this.enabled_filters.splice(0); var string = $('a.searchview_group_string'); _.each(string, function(str){ @@ -748,9 +760,30 @@ openerp.web.search.FloatField = openerp.web.search.NumberField.extend(/** @lends * @extends openerp.web.search.Field */ openerp.web.search.SelectionField = openerp.web.search.Field.extend(/** @lends openerp.web.search.SelectionField# */{ + // This implementation is a basic <select> field, but it may have to be + // altered to be more in line with the GTK client, which uses a combo box + // (~ jquery.autocomplete): + // * If an option was selected in the list, behave as currently + // * If something which is not in the list was entered (via the text input), + // the default domain should become (`ilike` string_value) but **any + // ``context`` or ``filter_domain`` becomes falsy, idem if ``@operator`` + // is specified. So at least get_domain needs to be quite a bit + // overridden (if there's no @value and there is no filter_domain and + // there is no @operator, return [[name, 'ilike', str_val]] template: 'SearchView.field.selection', + init: function () { + this._super.apply(this, arguments); + // prepend empty option if there is no empty option in the selection list + this.prepend_empty = !_(this.attrs.selection).detect(function (item) { + return !item[1]; + }); + }, get_value: function () { - return this.$element.val(); + var index = parseInt(this.$element.val(), 10); + if (isNaN(index)) { return null; } + var value = this.attrs.selection[index][0]; + if (value === false) { return null; } + return value; } }); openerp.web.search.BooleanField = openerp.web.search.SelectionField.extend(/** @lends openerp.web.search.BooleanField# */{ diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js index 11ebad8d093..b4eba509018 100644 --- a/addons/web/static/src/js/view_form.js +++ b/addons/web/static/src/js/view_form.js @@ -463,9 +463,6 @@ openerp.web.FormView = openerp.web.View.extend( /** @lends openerp.web.FormView# return $.Deferred().then(success).resolve(_.extend(r, {created: true})); } }, - do_search: function (domains, contexts, groupbys) { - console.debug("Searching form"); - }, on_action: function (action) { console.debug('Executing action', action); }, @@ -688,7 +685,8 @@ openerp.web.form.Widget = openerp.web.Widget.extend(/** @lends openerp.web.form. this.width = this.node.attrs.width; }, start: function() { - this.$element = this.view.$element.find('.' + this.element_class); + this.$element = this.view.$element.find( + '.' + this.element_class.replace(/[^\r\n\f0-9A-Za-z_-]/g, "\\$&")); }, process_modifiers: function() { var compute_domain = openerp.web.form.compute_domain; @@ -792,7 +790,7 @@ openerp.web.form.WidgetNotebook = openerp.web.form.Widget.extend({ for (var i = 0; i < node.children.length; i++) { var n = node.children[i]; if (n.tag == "page") { - var page = new openerp.web.form.WidgetNotebookPage( + var page = new (this.view.registry.get_object('notebookpage'))( this.view, n, this, this.pages.length); this.pages.push(page); } @@ -898,11 +896,11 @@ openerp.web.form.WidgetButton = openerp.web.form.Widget.extend({ self.on_confirmed().then(function() { def.resolve(); }); - $(self).dialog("close"); + $(this).dialog("close"); }, Cancel: function() { def.resolve(); - $(self).dialog("close"); + $(this).dialog("close"); } } }); @@ -911,7 +909,7 @@ openerp.web.form.WidgetButton = openerp.web.form.Widget.extend({ return self.on_confirmed(); } }; - if ((!this.node.attrs.special && this.view.dirty_for_user) || !this.view.datarecord.id) { + if (!this.node.attrs.special && (this.view.dirty_for_user || !this.view.datarecord.id)) { return this.view.recursive_save().pipe(exec_action); } else { return exec_action(); @@ -1787,6 +1785,9 @@ openerp.web.form.FieldMany2One = openerp.web.form.Field.extend({ result.result.context = _.extend(result.result.context || {}, additional_context); self.do_action(result.result); }); + }, + focus: function () { + this.$input.focus(); } }); @@ -2243,11 +2244,11 @@ openerp.web.form.SelectCreatePopup = openerp.web.OldWidget.extend(/** @lends ope }); this.searchview.on_search.add(function(domains, contexts, groupbys) { if (self.initial_ids) { - self.view_list.do_search.call(self, domains.concat([[["id", "in", self.initial_ids]], self.domain]), + self.do_search(domains.concat([[["id", "in", self.initial_ids]], self.domain]), contexts, groupbys); self.initial_ids = undefined; } else { - self.view_list.do_search.call(self, domains.concat([self.domain]), contexts, groupbys); + self.do_search(domains.concat([self.domain]), contexts, groupbys); } }); this.searchview.on_loaded.add_last(function () { @@ -2274,10 +2275,19 @@ openerp.web.form.SelectCreatePopup = openerp.web.OldWidget.extend(/** @lends ope }).pipe(function() { self.searchview.do_search(); }); - }); this.searchview.appendTo($("#" + this.element_id + "_search")); }, + do_search: function(domains, contexts, groupbys) { + var self = this; + this.rpc('/web/session/eval_domain_and_context', { + domains: domains || [], + contexts: contexts || [], + group_by_seq: groupbys || [] + }, function (results) { + self.view_list.do_search(results.domain, results.context, results.group_by); + }); + }, create_row: function(data) { var self = this; var wdataset = new openerp.web.DataSetSearch(this, this.model, this.context, this.domain); @@ -2781,6 +2791,7 @@ openerp.web.form.widgets = new openerp.web.Registry({ 'frame' : 'openerp.web.form.WidgetFrame', 'group' : 'openerp.web.form.WidgetFrame', 'notebook' : 'openerp.web.form.WidgetNotebook', + 'notebookpage' : 'openerp.web.form.WidgetNotebookPage', 'separator' : 'openerp.web.form.WidgetSeparator', 'label' : 'openerp.web.form.WidgetLabel', 'button' : 'openerp.web.form.WidgetButton', diff --git a/addons/web/static/src/js/view_list.js b/addons/web/static/src/js/view_list.js index 8a9deaab228..bb7b50244d8 100644 --- a/addons/web/static/src/js/view_list.js +++ b/addons/web/static/src/js/view_list.js @@ -391,9 +391,6 @@ openerp.web.ListView = openerp.web.View.extend( /** @lends openerp.web.ListView# if (this.sidebar) { this.sidebar.$element.show(); } - if (!_(this.dataset.ids).isEmpty()) { - this.reload_content(); - } }, do_hide: function () { this.$element.hide(); @@ -443,40 +440,21 @@ openerp.web.ListView = openerp.web.View.extend( /** @lends openerp.web.ListView# })); }, /** - * Event handler for a search, asks for the computation/folding of domains - * and contexts (and group-by), then reloads the view's content. - * - * @param {Array} domains a sequence of literal and non-literal domains - * @param {Array} contexts a sequence of literal and non-literal contexts - * @param {Array} groupbys a sequence of literal and non-literal group-by contexts - * @returns {$.Deferred} fold request evaluation promise - */ - do_search: function (domains, contexts, groupbys) { - return this.rpc('/web/session/eval_domain_and_context', { - domains: _([this.dataset.get_domain()].concat(domains)).compact(), - contexts: _([this.dataset.get_context()].concat(contexts)).compact(), - group_by_seq: groupbys - }, $.proxy(this, 'do_actual_search')); - }, - /** * Handler for the result of eval_domain_and_context, actually perform the * searching * * @param {Object} results results of evaluating domain and process for a search */ - do_actual_search: function (results) { + do_search: function (domain, context, group_by) { this.groups.datagroup = new openerp.web.DataGroup( - this, this.model, - results.domain, - results.context, - results.group_by); + this, this.model, domain, context, group_by); this.groups.datagroup.sort = this.dataset._sort; - if (_.isEmpty(results.group_by) && !results.context['group_by_no_leaf']) { - results.group_by = null; + if (_.isEmpty(group_by) && !context['group_by_no_leaf']) { + group_by = null; } - this.reload_view(!!results.group_by, results.context).then( + this.reload_view(!!group_by, context).then( $.proxy(this, 'reload_content')); }, /** @@ -505,7 +483,13 @@ openerp.web.ListView = openerp.web.View.extend( /** @lends openerp.web.ListView# do_select: function (ids, records) { this.$element.find('.oe-list-delete') .attr('disabled', !ids.length); - + if (this.sidebar) { + if (ids.length) { + this.sidebar.do_unfold(); + } else { + this.sidebar.do_fold(); + } + } if (!records.length) { this.compute_aggregates(); return; @@ -536,14 +520,8 @@ openerp.web.ListView = openerp.web.View.extend( /** @lends openerp.web.ListView# * @param {openerp.web.DataSet} dataset dataset in which the record is available (may not be the listview's dataset in case of nested groups) */ do_activate_record: function (index, id, dataset) { - var self = this; - // TODO is it needed ? - this.dataset.read_slice([],{ - context: dataset.get_context(), - domain: dataset.get_domain() - }, function () { - self.select_record(index); - }); + this.dataset.ids = dataset.ids; + this.select_record(index); }, /** * Handles signal for the addition of a new record (can be a creation, @@ -642,7 +620,7 @@ openerp.web.ListView = openerp.web.View.extend( /** @lends openerp.web.ListView# } $footer_cells.filter(_.sprintf('[data-field=%s]', column.id)) - .html(openerp.web.format_cell(aggregation, column)); + .html(openerp.web.format_cell(aggregation, column, undefined, false)); }); }, get_selected_ids: function() { @@ -837,7 +815,9 @@ openerp.web.ListView.List = openerp.web.Class.extend( /** @lends openerp.web.Lis cells.push('</tr>'); var row = cells.join(''); - this.$current.append(new Array(count - this.records.length + 1).join(row)); + this.$current + .children('tr:not([data-id])').remove().end() + .append(new Array(count - this.records.length + 1).join(row)); this.refresh_zebra(this.records.length); }, /** @@ -918,6 +898,7 @@ openerp.web.ListView.List = openerp.web.Class.extend( /** @lends openerp.web.Lis options: this.options, record: record, row_parity: (index % 2 === 0) ? 'even' : 'odd', + view: this.view, render_cell: openerp.web.format_cell }); }, diff --git a/addons/web/static/src/js/view_list_editable.js b/addons/web/static/src/js/view_list_editable.js index beb2c3ac0a9..dc49c20209c 100644 --- a/addons/web/static/src/js/view_list_editable.js +++ b/addons/web/static/src/js/view_list_editable.js @@ -56,11 +56,11 @@ openerp.web.list_editable = function (openerp) { || this.defaults.editable); }, /** - * Replace do_actual_search to handle editability process + * Replace do_search to handle editability process */ - do_actual_search: function (results) { - this.set_editable(results.context['set_editable']); - this._super(results); + do_search: function(domain, context, group_by) { + this.set_editable(context['set_editable']); + this._super.apply(this, arguments); }, /** * Replace do_add_record to handle editability (and adding new record @@ -120,6 +120,7 @@ openerp.web.list_editable = function (openerp) { delete self.edition_id; delete self.edition; }); + this.pad_table_to(5); return cancelled.promise(); }, /** @@ -147,7 +148,7 @@ openerp.web.list_editable = function (openerp) { var $new_row = $('<tr>', { id: _.uniqueId('oe-editable-row-'), 'data-id': record_id, - 'class': $(row).attr('class') + ' oe_forms', + 'class': row ? $(row).attr('class') : '' + ' oe_forms', click: function (e) {e.stopPropagation();} }) .delegate('button.oe-edit-row-save', 'click', function () { @@ -173,10 +174,22 @@ openerp.web.list_editable = function (openerp) { }); if (row) { $new_row.replaceAll(row); - } else if (self.options.editable === 'top') { - self.$current.prepend($new_row); } else if (self.options.editable) { - self.$current.append($new_row); + var $last_child = self.$current.children('tr:last'); + if (self.records.length) { + if (self.options.editable === 'top') { + $new_row.insertBefore( + self.$current.children('[data-id]:first')); + } else { + $new_row.insertAfter( + self.$current.children('[data-id]:last')); + } + } else { + $new_row.prependTo(self.$current); + } + if ($last_child.is(':not([data-id])')) { + $last_child.remove(); + } } self.edition = true; self.edition_id = record_id; @@ -325,11 +338,13 @@ openerp.web.list_editable = function (openerp) { this.$element.children().css('visibility', ''); if (this.modifiers.tree_invisible) { var old_invisible = this.invisible; - this.invisible = !!this.modifiers.tree_invisible; + this.invisible = true; this._super(); this.invisible = old_invisible; } else if (this.invisible) { this.$element.children().css('visibility', 'hidden'); + } else { + this._super(); } } }); diff --git a/addons/web/static/src/js/views.js b/addons/web/static/src/js/views.js index 4a9e57ebd1d..46091fa91b7 100644 --- a/addons/web/static/src/js/views.js +++ b/addons/web/static/src/js/views.js @@ -116,6 +116,9 @@ db.web.ActionManager = db.web.Widget.extend({ */ }, ir_actions_act_window_close: function (action, on_closed) { + if (!this.dialog && on_closed) { + on_closed(); + } this.dialog_stop(); }, ir_actions_server: function (action, on_closed) { @@ -166,6 +169,7 @@ db.web.ViewManager = db.web.Widget.extend(/** @lends db.web.ViewManager# */{ this.model = dataset ? dataset.model : undefined; this.dataset = dataset; this.searchview = null; + this.last_search = false; this.active_view = null; this.views_src = _.map(views, function(x) {return x instanceof Array? {view_id: x[0], view_type: x[1]} : x;}); this.views = {}; @@ -224,35 +228,21 @@ db.web.ViewManager = db.web.Widget.extend(/** @lends db.web.ViewManager# */{ controller.set_embedded_view(view.embedded_view); } controller.do_switch_view.add_last(this.on_mode_switch); - if (view_type === 'list' && this.flags.search_view === false && this.action && this.action['auto_search']) { - // In case the search view is not instantiated: manually call ListView#search - var domains = !_(self.action.domain).isEmpty() - ? [self.action.domain] : [], - contexts = !_(self.action.context).isEmpty() - ? [self.action.context] : []; - controller.on_loaded.add({ - callback: function () { - controller.do_search(domains, contexts, []); - }, - position: 'last', - unique: true - }); - } var container = $("#" + this.element_id + '_view_' + view_type); view_promise = controller.appendTo(container); + this.views[view_type].controller = controller; $.when(view_promise).then(function() { self.on_controller_inited(view_type, controller); + if (self.searchview && view.controller.searchable !== false) { + self.do_searchview_search(); + } }); - this.views[view_type].controller = controller; + } else if (this.searchview && view.controller.searchable !== false) { + self.do_searchview_search(); } - if (this.searchview) { - if (view.controller.searchable === false) { - this.searchview.hide(); - } else { - this.searchview.show(); - } + this.searchview[(view.controller.searchable === false || this.searchview.hidden) ? 'hide' : 'show'](); } this.$element @@ -273,14 +263,6 @@ db.web.ViewManager = db.web.Widget.extend(/** @lends db.web.ViewManager# */{ return view_promise; }, /** - * Event launched when a controller has been inited. - * - * @param {String} view_type type of view - * @param {String} view the inited controller - */ - on_controller_inited: function(view_type, view) { - }, - /** * Sets up the current viewmanager's search view. * * @param {Number|false} view_id the view to use or false for a default one @@ -293,14 +275,37 @@ db.web.ViewManager = db.web.Widget.extend(/** @lends db.web.ViewManager# */{ } this.searchview = new db.web.SearchView( this, this.dataset, - view_id, search_defaults); + view_id, search_defaults, this.flags.search_view === false); - this.searchview.on_search.add(function(domains, contexts, groupbys) { - var controller = self.views[self.active_view].controller; - controller.do_search.call(controller, domains, contexts, groupbys); - }); + this.searchview.on_search.add(this.do_searchview_search); return this.searchview.appendTo($("#" + this.element_id + "_search")); }, + do_searchview_search: function(domains, contexts, groupbys) { + var self = this, + controller = this.views[this.active_view].controller; + if (domains || contexts) { + this.rpc('/web/session/eval_domain_and_context', { + domains: [this.action.domain || []].concat(domains || []), + contexts: [this.action.context || {}].concat(contexts || []), + group_by_seq: groupbys || [] + }, function (results) { + self.dataset.context = results.context; + self.dataset.domain = results.domain; + self.last_search = [results.domain, results.context, results.group_by]; + controller.do_search(results.domain, results.context, results.group_by); + }); + } else if (this.last_search) { + controller.do_search.apply(controller, this.last_search); + } + }, + /** + * Event launched when a controller has been inited. + * + * @param {String} view_type type of view + * @param {String} view the inited controller + */ + on_controller_inited: function(view_type, view) { + }, /** * Called when one of the view want to execute an action */ @@ -360,28 +365,24 @@ db.web.ViewManagerAction = db.web.ViewManager.extend(/** @lends oepnerp.web.View * launches an initial search after both views are done rendering. */ start: function() { - var self = this; - - var searchview_loaded; - if (this.flags.search_view !== false) { - var search_defaults = {}; - _.each(this.action.context, function (value, key) { - var match = /^search_default_(.*)$/.exec(key); - if (match) { - search_defaults[match[1]] = value; - } - }); - // init search view - var searchview_id = this.action['search_view_id'] && this.action['search_view_id'][0]; + var self = this, + searchview_loaded, + search_defaults = {}; + _.each(this.action.context, function (value, key) { + var match = /^search_default_(.*)$/.exec(key); + if (match) { + search_defaults[match[1]] = value; + } + }); + // init search view + var searchview_id = this.action['search_view_id'] && this.action['search_view_id'][0]; - searchview_loaded = this.setup_search_view( - searchview_id || false, search_defaults); - } + searchview_loaded = this.setup_search_view(searchview_id || false, search_defaults); var main_view_loaded = this._super(); var manager_ready = $.when(searchview_loaded, main_view_loaded); - if (searchview_loaded && this.action['auto_search']) { + if (searchview_loaded && this.action['auto_search'] !== false) { // schedule auto_search manager_ready.then(this.searchview.do_search); } @@ -816,6 +817,8 @@ db.web.View = db.web.Widget.extend(/** @lends db.web.View# */{ }, do_switch_view: function(view) { }, + do_search: function(view) { + }, set_common_sidebar_sections: function(sidebar) { sidebar.add_section('customize', "Customize", [ { diff --git a/addons/web/static/src/xml/base.xml b/addons/web/static/src/xml/base.xml index f8519c1dfaf..0e5c97c4707 100644 --- a/addons/web/static/src/xml/base.xml +++ b/addons/web/static/src/xml/base.xml @@ -767,7 +767,7 @@ <input type="text" size="1" t-att-name="widget.name" t-att-id="widget.element_id" - t-attf-class="field_#{widget.type} #{widget.element_class}" + t-attf-class="field_#{widget.type}" t-attf-style="width: #{widget.field.translate ? '99' : '100'}%" /> <img class="oe_field_translate" t-if="widget.field.translate" src="/web/static/src/img/icons/terp-translate.png" width="16" height="16" border="0"/> @@ -775,7 +775,7 @@ <t t-name="FieldChar.readonly"> <div t-att-id="widget.element_id" - t-attf-class="field_#{widget.type} #{widget.element_class}" + t-attf-class="field_#{widget.type}" t-attf-style="width: #{widget.field.translate ? '99' : '100'}%"> </div> </t> @@ -814,7 +814,7 @@ <textarea rows="6" t-att-name="widget.name" t-att-id="widget.element_id" - t-attf-class="field_#{widget.type} #{widget.element_class}" + t-attf-class="field_#{widget.type}" t-attf-style="width: #{widget.field.translate ? '99' : '100'}%" ></textarea> <img class="oe_field_translate" t-if="widget.field.translate" src="/web/static/src/img/icons/terp-translate.png" width="16" height="16" border="0"/> @@ -833,8 +833,8 @@ <t t-name="FieldSelection"> <select t-att-name="widget.name" - t-att-id="widget.element_id + '_field'" - t-attf-class="field_#{widget.type} #{widget.element_class}" + t-att-id="widget.element_id" + t-attf-class="field_#{widget.type}" style="width: 100%"> <t t-foreach="widget.values" t-as="option"> <option><t t-esc="option[1]"/></option> @@ -842,8 +842,9 @@ </select> </t> <t t-name="FieldMany2One"> - <div t-att-class="widget.element_class" class="oe-m2o"> - <input type="text" size="1" style="width: 100%;"/> + <div class="oe-m2o"> + <input type="text" size="1" style="width: 100%;" + t-att-id="widget.element_id"/> <span class="oe-m2o-drop-down-button"> <img src="/web/static/src/img/down-arrow.png" /></span> <span class="oe-m2o-cm-button" t-att-id="widget.name + '_open'"> @@ -886,8 +887,8 @@ <t t-name="FieldBoolean"> <input type="checkbox" t-att-name="widget.name" - t-att-id="widget.element_id + '_field'" - t-attf-class="field_#{widget.type} #{widget.element_class}"/> + t-att-id="widget.element_id" + t-attf-class="field_#{widget.type}"/> </t> <t t-name="FieldProgressBar"> <div t-opentag="true" class="oe-progressbar"> @@ -902,7 +903,7 @@ t-att-border="widget.readonly ? 0 : 1" t-att-id="widget.element_id + '_field'" t-att-name="widget.name" - t-attf-class="field_#{widget.type} #{widget.element_class}" + t-attf-class="field_#{widget.type}" t-att-width="widget.node.attrs.img_width || widget.node.attrs.width" t-att-height="widget.node.attrs.img_height || widget.node.attrs.height" /> @@ -950,7 +951,7 @@ <input type="text" size="1" t-att-name="widget.name" t-att-id="widget.element_id + '_field'" - t-attf-class="field_#{widget.type} #{widget.element_class}" style="width: 100%" + t-attf-class="field_#{widget.type}" style="width: 100%" /> </td> <td class="oe-binary" nowrap="true"> @@ -995,7 +996,6 @@ </t> <t t-name="WidgetButton"> <button type="button" - t-attf-class="#{widget.element_class}" t-att-title="widget.help" style="width: 100%" class="button"> <img t-if="widget.node.attrs.icon" t-att-src="'/web/static/src/img/icons/' + widget.node.attrs.icon + '.png'" width="16" height="16"/> @@ -1092,14 +1092,14 @@ <div style="white-space: nowrap;"> <select t-att-name="attrs.name" t-att-id="element_id" t-att-autofocus="attrs.default_focus === '1' || undefined"> - <option/> + <option t-if="prepend_empty"/> <t t-foreach="attrs.selection" t-as="option"> <t t-set="selected" t-value="defaults[attrs.name] === option[0]"/> <option t-if="selected" - t-att-value="option[0]" selected="selected"> + t-att-value="option_index" selected="selected"> <t t-esc="option[1]"/> </option> - <option t-if="!selected" t-att-value="option[0]"> + <option t-if="!selected" t-att-value="option_index"> <t t-esc="option[1]"/> </option> </t> |
