summaryrefslogtreecommitdiff
path: root/addons/web/static/src
diff options
context:
space:
mode:
authorJiten (OpenERP) <jra@tinyerp.com>2011-10-07 10:41:13 +0530
committerJiten (OpenERP) <jra@tinyerp.com>2011-10-07 10:41:13 +0530
commit2adffb46e5952945f2b22197afab65b00b5d38cb (patch)
tree6cfe89b7666032e3540528c1e7d7aad6cdc32168 /addons/web/static/src
parente1e04341bc9c256701abcf1f1544d03f25bd5c50 (diff)
parenta12c082d55dfdc759483e224b658180cc0151379 (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.css4
-rw-r--r--addons/web/static/src/js/core.js4
-rw-r--r--addons/web/static/src/js/formats.js8
-rw-r--r--addons/web/static/src/js/search.js55
-rw-r--r--addons/web/static/src/js/view_form.js33
-rw-r--r--addons/web/static/src/js/view_list.js57
-rw-r--r--addons/web/static/src/js/view_list_editable.js33
-rw-r--r--addons/web/static/src/js/views.js105
-rw-r--r--addons/web/static/src/xml/base.xml30
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>