diff options
| author | Jiten (OpenERP) <jra@tinyerp.com> | 2012-02-02 16:50:15 +0530 |
|---|---|---|
| committer | Jiten (OpenERP) <jra@tinyerp.com> | 2012-02-02 16:50:15 +0530 |
| commit | 8a5593dcc68df71c5f33a3624936efbddbe8ec34 (patch) | |
| tree | cb46eeea7852d4d5dd32b1425b8af3fc66d3bd93 /addons/web/static/src/js | |
| parent | 596b0bb4cbdb2ced6367f39226e1d69c9a2faccc (diff) | |
| parent | 7e2bb94661881e41aa98026410cbbe86e9064055 (diff) | |
[Merge] Merged from openerp-web.
bzr revid: jra@tinyerp.com-20120202112015-9f102yl1a9dukq6b
Diffstat (limited to 'addons/web/static/src/js')
| -rw-r--r-- | addons/web/static/src/js/chrome.js | 74 | ||||
| -rw-r--r-- | addons/web/static/src/js/core.js | 55 | ||||
| -rw-r--r-- | addons/web/static/src/js/data.js | 16 | ||||
| -rw-r--r-- | addons/web/static/src/js/dates.js | 26 | ||||
| -rw-r--r-- | addons/web/static/src/js/formats.js | 2 | ||||
| -rw-r--r-- | addons/web/static/src/js/search.js | 42 | ||||
| -rw-r--r-- | addons/web/static/src/js/view_editor.js | 41 | ||||
| -rw-r--r-- | addons/web/static/src/js/view_form.js | 88 | ||||
| -rw-r--r-- | addons/web/static/src/js/view_help.js | 15 | ||||
| -rw-r--r-- | addons/web/static/src/js/view_list.js | 9 | ||||
| -rw-r--r-- | addons/web/static/src/js/view_page.js | 1 | ||||
| -rw-r--r-- | addons/web/static/src/js/view_tree.js | 2 | ||||
| -rw-r--r-- | addons/web/static/src/js/views.js | 86 |
13 files changed, 259 insertions, 198 deletions
diff --git a/addons/web/static/src/js/chrome.js b/addons/web/static/src/js/chrome.js index b8ee62c3749..ae40c1affe7 100644 --- a/addons/web/static/src/js/chrome.js +++ b/addons/web/static/src/js/chrome.js @@ -5,9 +5,8 @@ openerp.web.chrome = function(openerp) { var QWeb = openerp.web.qweb, _t = openerp.web._t; -openerp.web.Notification = openerp.web.Widget.extend(/** @lends openerp.web.Notification# */{ +openerp.web.Notification = openerp.web.OldWidget.extend(/** @lends openerp.web.Notification# */{ template: 'Notification', - identifier_prefix: 'notification-', init: function() { this._super.apply(this, arguments); @@ -18,7 +17,7 @@ openerp.web.Notification = openerp.web.Widget.extend(/** @lends openerp.web.Not this._super.apply(this, arguments); this.$element.notify({ speed: 500, - expires: 1500 + expires: 2500 }); }, notify: function(title, text) { @@ -36,9 +35,8 @@ openerp.web.Notification = openerp.web.Widget.extend(/** @lends openerp.web.Not }); -openerp.web.Dialog = openerp.web.Widget.extend(/** @lends openerp.web.Dialog# */{ +openerp.web.Dialog = openerp.web.OldWidget.extend(/** @lends openerp.web.Dialog# */{ dialog_title: "", - identifier_prefix: 'dialog', /** * @constructs openerp.web.Dialog * @extends openerp.web.OldWidget @@ -208,11 +206,11 @@ openerp.web.CrashManager = openerp.web.CallbackEnabled.extend({ } }); -openerp.web.Loading = openerp.web.Widget.extend(/** @lends openerp.web.Loading# */{ +openerp.web.Loading = openerp.web.OldWidget.extend(/** @lends openerp.web.Loading# */{ template: 'Loading', /** * @constructs openerp.web.Loading - * @extends openerp.web.Widget + * @extends openerp.web.OldWidget * * @param parent * @param element_id @@ -267,11 +265,11 @@ openerp.web.Loading = openerp.web.Widget.extend(/** @lends openerp.web.Loading# } }); -openerp.web.Database = openerp.web.Widget.extend(/** @lends openerp.web.Database# */{ +openerp.web.Database = openerp.web.OldWidget.extend(/** @lends openerp.web.Database# */{ template: "DatabaseManager", /** * @constructs openerp.web.Database - * @extends openerp.web.Widget + * @extends openerp.web.OldWidget * * @param parent * @param element_id @@ -288,9 +286,9 @@ openerp.web.Database = openerp.web.Widget.extend(/** @lends openerp.web.Database this.$option_id = $("#oe_db_options"); var self = this; - var fetch_db = this.rpc("/web/database/get_list", {}, function(result) { - self.db_list = result.db_list; - }); + var fetch_db = this.rpc("/web/database/get_list", {}).pipe( + function(result) { self.db_list = result.db_list; }, + function (_, ev) { ev.preventDefault(); self.db_list = null; }); var fetch_langs = this.rpc("/web/session/get_lang_list", {}, function(result) { if (result.error) { self.display_error(result); @@ -425,9 +423,11 @@ openerp.web.Database = openerp.web.Widget.extend(/** @lends openerp.web.Database self.display_error(result); return; } - self.db_list.push(self.to_object(fields)['db_name']); - self.db_list.sort(); - self.widget_parent.set_db_list(self.db_list); + if (self.db_list) { + self.db_list.push(self.to_object(fields)['db_name']); + self.db_list.sort(); + self.widget_parent.set_db_list(self.db_list); + } var form_obj = self.to_object(fields); self.wait_for_newdb(result, { password: form_obj['super_admin_pwd'], @@ -456,8 +456,10 @@ openerp.web.Database = openerp.web.Widget.extend(/** @lends openerp.web.Database return; } $db_list.find(':selected').remove(); - self.db_list.splice(_.indexOf(self.db_list, db, true), 1); - self.widget_parent.set_db_list(self.db_list); + if (self.db_list) { + self.db_list.splice(_.indexOf(self.db_list, db, true), 1); + self.widget_parent.set_db_list(self.db_list); + } self.do_notify("Dropping database", "The database '" + db + "' has been dropped"); }); } @@ -551,14 +553,13 @@ openerp.web.Database = openerp.web.Widget.extend(/** @lends openerp.web.Database } }); -openerp.web.Login = openerp.web.Widget.extend(/** @lends openerp.web.Login# */{ +openerp.web.Login = openerp.web.OldWidget.extend(/** @lends openerp.web.Login# */{ remember_credentials: true, template: "Login", - identifier_prefix: 'oe-app-login-', /** * @constructs openerp.web.Login - * @extends openerp.web.Widget + * @extends openerp.web.OldWidget * * @param parent * @param element_id @@ -624,6 +625,7 @@ openerp.web.Login = openerp.web.Widget.extend(/** @lends openerp.web.Login# */{ */ do_login: function (db, login, password) { var self = this; + this.$element.removeClass('login_invalid'); this.session.on_session_invalid.add({ callback: function () { self.$element.addClass("login_invalid"); @@ -649,12 +651,11 @@ openerp.web.Login = openerp.web.Widget.extend(/** @lends openerp.web.Login# */{ } }); -openerp.web.Header = openerp.web.Widget.extend(/** @lends openerp.web.Header# */{ +openerp.web.Header = openerp.web.OldWidget.extend(/** @lends openerp.web.Header# */{ template: "Header", - identifier_prefix: 'oe-app-header-', /** * @constructs openerp.web.Header - * @extends openerp.web.Widget + * @extends openerp.web.OldWidget * * @param parent */ @@ -830,10 +831,10 @@ openerp.web.Header = openerp.web.Widget.extend(/** @lends openerp.web.Header# * } }); -openerp.web.Menu = openerp.web.Widget.extend(/** @lends openerp.web.Menu# */{ +openerp.web.Menu = openerp.web.OldWidget.extend(/** @lends openerp.web.Menu# */{ /** * @constructs openerp.web.Menu - * @extends openerp.web.Widget + * @extends openerp.web.OldWidget * * @param parent * @param element_id @@ -918,7 +919,7 @@ openerp.web.Menu = openerp.web.Widget.extend(/** @lends openerp.web.Menu# */{ } $primary_menu.addClass('active'); this.$secondary_menu.find( - 'div[data-menu-parent=' + $primary_menu.data('menu') + ']').show(); + 'div[data-menu-parent=' + $primary_menu.data('menu') + ']').addClass('active').toggle(!this.folded); }, on_menu_click: function(ev, id) { id = id || 0; @@ -1045,10 +1046,10 @@ openerp.web.Menu = openerp.web.Widget.extend(/** @lends openerp.web.Menu# */{ } }); -openerp.web.WebClient = openerp.web.Widget.extend(/** @lends openerp.web.WebClient */{ +openerp.web.WebClient = openerp.web.OldWidget.extend(/** @lends openerp.web.WebClient */{ /** * @constructs openerp.web.WebClient - * @extends openerp.web.Widget + * @extends openerp.web.OldWidget * * @param element_id */ @@ -1111,12 +1112,13 @@ openerp.web.WebClient = openerp.web.Widget.extend(/** @lends openerp.web.WebClie self.menu.start(); }, show_common: function() { - var self = this; - self.crashmanager = new openerp.web.CrashManager(); - self.notification = new openerp.web.Notification(self); - self.notification.appendTo(self.$element); - self.loading = new openerp.web.Loading(self); - self.loading.appendTo(self.$element); + if (!this.crashmanager) { + this.crashmanager = new openerp.web.CrashManager(); + } + this.notification = new openerp.web.Notification(this); + this.notification.appendTo(this.$element); + this.loading = new openerp.web.Loading(this); + this.loading.appendTo(this.$element); }, destroy_content: function() { _.each(_.clone(this.widget_children), function(el) { @@ -1160,7 +1162,7 @@ openerp.web.WebClient = openerp.web.Widget.extend(/** @lends openerp.web.WebClie on_hashchange: function(event) { var state = event.getState(true); if (!_.isEqual(this._current_state, state)) { - this.action_manager.do_load_state(state); + this.action_manager.do_load_state(state, !!this._current_state); } this._current_state = state; }, @@ -1183,7 +1185,7 @@ openerp.web.WebClient = openerp.web.Widget.extend(/** @lends openerp.web.WebClie } }); -openerp.web.EmbeddedClient = openerp.web.Widget.extend({ +openerp.web.EmbeddedClient = openerp.web.OldWidget.extend({ template: 'EmptyComponent', init: function(action_id, options) { this._super(); diff --git a/addons/web/static/src/js/core.js b/addons/web/static/src/js/core.js index 43bd8a0abf7..500cf58d05f 100644 --- a/addons/web/static/src/js/core.js +++ b/addons/web/static/src/js/core.js @@ -443,7 +443,9 @@ openerp.web.Connection = openerp.web.CallbackEnabled.extend( /** @lends openerp. }; var deferred = $.Deferred(); this.on_rpc_request(); - this.rpc_function(url, payload).then( + var aborter = params.aborter; + delete params.aborter; + var request = this.rpc_function(url, payload).then( function (response, textStatus, jqXHR) { self.on_rpc_response(); if (!response.error) { @@ -469,6 +471,16 @@ openerp.web.Connection = openerp.web.CallbackEnabled.extend( /** @lends openerp. }; deferred.reject(error, $.Event()); }); + if (aborter) { + aborter.abort_last = function () { + if (!(request.isResolved() || request.isRejected())) { + deferred.fail(function (error, event) { + event.preventDefault(); + }); + request.abort(); + } + }; + } // Allow deferred user to disable on_rpc_error in fail deferred.fail(function() { deferred.fail(function(error, event) { @@ -892,8 +904,6 @@ openerp.web.Connection = openerp.web.CallbackEnabled.extend( /** @lends openerp. * MyWidget = openerp.base.Widget.extend({ * // the name of the QWeb template to use for rendering * template: "MyQWebTemplate", - * // identifier prefix, it is useful to put an obvious one for debugging - * identifier_prefix: 'my-id-prefix-', * * init: function(parent) { * this._super(parent); @@ -933,13 +943,6 @@ openerp.web.Widget = openerp.web.CallbackEnabled.extend(/** @lends openerp.web.W */ template: null, /** - * The prefix used to generate an id automatically. Should be redefined in - * subclasses. If it is not defined, a generic identifier will be used. - * - * @type string - */ - identifier_prefix: 'generic-identifier-', - /** * Tag name when creating a default $element. * @type string */ @@ -958,15 +961,11 @@ openerp.web.Widget = openerp.web.CallbackEnabled.extend(/** @lends openerp.web.W * with the DOM insertion methods provided by the current implementation of Widget. So * for new components this argument should not be provided any more. */ - init: function(parent, /** @deprecated */ element_id) { + init: function(parent) { this._super(); this.session = openerp.connection; - // if given an element_id, try to get the associated DOM element and save - // a reference in this.$element. Else just generate a unique identifier. - this.element_id = element_id; - this.element_id = this.element_id || _.uniqueId(this.identifier_prefix); - var tmp = document.getElementById(this.element_id); - this.$element = tmp ? $(tmp) : $(document.createElement(this.tag_name)); + + this.$element = $(document.createElement(this.tag_name)); this.widget_parent = parent; this.widget_children = []; @@ -1129,15 +1128,15 @@ openerp.web.Widget = openerp.web.CallbackEnabled.extend(/** @lends openerp.web.W }); /** - * @class - * @extends openerp.web.Widget - * @deprecated - * For retro compatibility only, the only difference with is that render() uses - * directly ``this`` instead of context with a ``widget`` key. + * @deprecated use :class:`openerp.web.Widget` */ -openerp.web.OldWidget = openerp.web.Widget.extend(/** @lends openerp.web.OldWidget# */{ - render: function (additional) { - return openerp.web.qweb.render(this.template, _.extend(_.extend({}, this), additional || {})); +openerp.web.OldWidget = openerp.web.Widget.extend({ + init: function(parent, element_id) { + this._super(parent); + this.element_id = element_id; + this.element_id = this.element_id || _.uniqueId('widget-'); + var tmp = document.getElementById(this.element_id); + this.$element = tmp ? $(tmp) : $(document.createElement(this.tag_name)); } }); @@ -1224,7 +1223,7 @@ openerp.web.qweb.default_dict = { '_' : _, '_t' : openerp.web._t }; -openerp.web.qweb.format_text_node = function(s) { +openerp.web.qweb.format_text_node = function (s) { // Note that 'this' is the Qweb Node of the text var translation = this.node.parentNode.attributes['t-translation']; if (translation && translation.value === 'off') { @@ -1236,13 +1235,13 @@ openerp.web.qweb.format_text_node = function(s) { } var tr = openerp.web._t(ts); return tr === ts ? s : tr; -} +}; /** Jquery extentions */ $.Mutex = (function() { function Mutex() { this.def = $.Deferred().resolve(); - }; + } Mutex.prototype.exec = function(action) { var current = this.def; var next = this.def = $.Deferred(); diff --git a/addons/web/static/src/js/data.js b/addons/web/static/src/js/data.js index a4d9e9e4d71..b596b1eb250 100644 --- a/addons/web/static/src/js/data.js +++ b/addons/web/static/src/js/data.js @@ -18,7 +18,7 @@ openerp.web.serialize_sort = function (criterion) { }).join(', '); }; -openerp.web.DataGroup = openerp.web.Widget.extend( /** @lends openerp.web.DataGroup# */{ +openerp.web.DataGroup = openerp.web.OldWidget.extend( /** @lends openerp.web.DataGroup# */{ /** * Management interface between views and grouped collections of OpenERP * records. @@ -30,9 +30,9 @@ openerp.web.DataGroup = openerp.web.Widget.extend( /** @lends openerp.web.DataG * content of the current grouping level. * * @constructs openerp.web.DataGroup - * @extends openerp.web.Widget + * @extends openerp.web.OldWidget * - * @param {openerp.web.Widget} parent widget + * @param {openerp.web.OldWidget} parent widget * @param {String} model name of the model managed by this DataGroup * @param {Array} domain search domain for this DataGroup * @param {Object} context context of the DataGroup's searches @@ -233,14 +233,13 @@ openerp.web.StaticDataGroup = openerp.web.GrouplessDataGroup.extend( /** @lends } }); -openerp.web.DataSet = openerp.web.Widget.extend( /** @lends openerp.web.DataSet# */{ - identifier_prefix: "dataset", +openerp.web.DataSet = openerp.web.OldWidget.extend( /** @lends openerp.web.DataSet# */{ /** * DateaManagement interface between views and the collection of selected * OpenERP records (represents the view's state?) * * @constructs openerp.web.DataSet - * @extends openerp.web.Widget + * @extends openerp.web.OldWidget * * @param {String} model the OpenERP model this dataset will manage */ @@ -431,7 +430,9 @@ openerp.web.DataSet = openerp.web.Widget.extend( /** @lends openerp.web.DataSet method: method, domain_id: domain_index == undefined ? null : domain_index, context_id: context_index == undefined ? null : context_index, - args: args || [] + args: args || [], + // FIXME: API which does not suck for aborting requests in-flight + aborter: this }, callback, error_callback); }, /** @@ -506,7 +507,6 @@ openerp.web.DataSetStatic = openerp.web.DataSet.extend({ read_slice: function (fields, options) { options = options || {}; fields = fields || {}; - // TODO remove fields from options var offset = options.offset || 0, limit = options.limit || false; var end_pos = limit && limit !== -1 ? offset + limit : this.ids.length; diff --git a/addons/web/static/src/js/dates.js b/addons/web/static/src/js/dates.js index 907eaa39fcd..d61223113f8 100644 --- a/addons/web/static/src/js/dates.js +++ b/addons/web/static/src/js/dates.js @@ -5,8 +5,8 @@ openerp.web.dates = function(openerp) { * Converts a string to a Date javascript object using OpenERP's * datetime string format (exemple: '2011-12-01 15:12:35'). * - * The timezone is assumed to be UTC (standard for OpenERP 6.1) - * and will be converted to the browser's timezone. + * The time zone is assumed to be UTC (standard for OpenERP 6.1) + * and will be converted to the browser's time zone. * * @param {String} str A string representing a datetime. * @returns {Date} @@ -31,6 +31,10 @@ openerp.web.str_to_datetime = function(str) { * Converts a string to a Date javascript object using OpenERP's * date string format (exemple: '2011-12-01'). * + * As a date is not subject to time zones, we assume it should be + * represented as a Date javascript object at 00:00:00 in the + * time zone of the browser. + * * @param {String} str A string representing a date. * @returns {Date} */ @@ -43,7 +47,7 @@ openerp.web.str_to_date = function(str) { if ( !res ) { throw new Error("'" + str + "' is not a valid date"); } - var obj = Date.parseExact(str + ' UTC', 'yyyy-MM-dd zzz'); + var obj = Date.parseExact(str, 'yyyy-MM-dd'); if (! obj) { throw new Error("'" + str + "' is not a valid date"); } @@ -54,6 +58,10 @@ openerp.web.str_to_date = function(str) { * Converts a string to a Date javascript object using OpenERP's * time string format (exemple: '15:12:35'). * + * The OpenERP times are supposed to always be naive times. We assume it is + * represented using a javascript Date with a date 1 of January 1970 and a + * time corresponding to the meant time in the browser's time zone. + * * @param {String} str A string representing a time. * @returns {Date} */ @@ -66,7 +74,7 @@ openerp.web.str_to_time = function(str) { if ( !res ) { throw new Error("'" + str + "' is not a valid time"); } - var obj = Date.parseExact(res[1] + ' UTC', 'HH:mm:ss zzz'); + var obj = Date.parseExact("1970-01-01 " + res[1], 'yyyy-MM-dd HH:mm:ss'); if (! obj) { throw new Error("'" + str + "' is not a valid time"); } @@ -90,7 +98,7 @@ var zpad = function(str, size) { * Converts a Date javascript object to a string using OpenERP's * datetime string format (exemple: '2011-12-01 15:12:35'). * - * The timezone of the Date object is assumed to be the one of the + * The time zone of the Date object is assumed to be the one of the * browser and it will be converted to UTC (standard for OpenERP 6.1). * * @param {Date} obj @@ -109,6 +117,10 @@ openerp.web.datetime_to_str = function(obj) { * Converts a Date javascript object to a string using OpenERP's * date string format (exemple: '2011-12-01'). * + * As a date is not subject to time zones, we assume it should be + * represented as a Date javascript object at 00:00:00 in the + * time zone of the browser. + * * @param {Date} obj * @returns {String} A string representing a date. */ @@ -124,6 +136,10 @@ openerp.web.date_to_str = function(obj) { * Converts a Date javascript object to a string using OpenERP's * time string format (exemple: '15:12:35'). * + * The OpenERP times are supposed to always be naive times. We assume it is + * represented using a javascript Date with a date 1 of January 1970 and a + * time corresponding to the meant time in the browser's time zone. + * * @param {Date} obj * @returns {String} A string representing a time. */ diff --git a/addons/web/static/src/js/formats.js b/addons/web/static/src/js/formats.js index 7f220d0aa54..eb7d6c335ac 100644 --- a/addons/web/static/src/js/formats.js +++ b/addons/web/static/src/js/formats.js @@ -90,6 +90,8 @@ openerp.web.format_value = function (value, descriptor, value_if_empty) { } var l10n = _t.database.parameters; switch (descriptor.widget || descriptor.type) { + case 'id': + return value.toString(); case 'integer': return openerp.web.insert_thousand_seps( _.str.sprintf('%d', value)); diff --git a/addons/web/static/src/js/search.js b/addons/web/static/src/js/search.js index cf16843aed7..6cd05100de5 100644 --- a/addons/web/static/src/js/search.js +++ b/addons/web/static/src/js/search.js @@ -3,11 +3,11 @@ var QWeb = openerp.web.qweb, _t = openerp.web._t, _lt = openerp.web._lt; -openerp.web.SearchView = openerp.web.Widget.extend(/** @lends openerp.web.SearchView# */{ +openerp.web.SearchView = openerp.web.OldWidget.extend(/** @lends openerp.web.SearchView# */{ template: "EmptyComponent", /** * @constructs openerp.web.SearchView - * @extends openerp.web.Widget + * @extends openerp.web.OldWidget * * @param parent * @param element_id @@ -252,12 +252,15 @@ openerp.web.SearchView = openerp.web.Widget.extend(/** @lends openerp.web.Search ] }); break; + case '': + this.do_clear(); } if (val.slice(0, 4) == "get:") { val = val.slice(4); val = parseInt(val, 10); var filter = this.managed_filters[val]; - this.do_clear().then(_.bind(function() { + this.do_clear(false).then(_.bind(function() { + select.val('get:' + val); var groupbys = _.map(filter.context.group_by.split(","), function(el) { return {"group_by": el}; }); @@ -409,7 +412,10 @@ openerp.web.SearchView = openerp.web.Widget.extend(/** @lends openerp.web.Search on_invalid: function (errors) { this.do_notify(_t("Invalid Search"), _t("triggered from search view")); }, - do_clear: function () { + /** + * @param {Boolean} [reload_view=true] + */ + do_clear: function (reload_view) { this.$element.find('.filter_label, .filter_icon').removeClass('enabled'); this.enabled_filters.splice(0); var string = $('a.searchview_group_string'); @@ -424,7 +430,8 @@ openerp.web.SearchView = openerp.web.Widget.extend(/** @lends openerp.web.Search input.datewidget.set_value(false); } }); - return $.async_when().pipe(this.on_clear); + return $.async_when().pipe( + reload_view !== false ? this.on_clear : null); }, /** * Triggered when the search view gets cleared @@ -467,6 +474,7 @@ openerp.web.search.fields = new openerp.web.Registry({ 'text': 'openerp.web.search.CharField', 'boolean': 'openerp.web.search.BooleanField', 'integer': 'openerp.web.search.IntegerField', + 'id': 'openerp.web.search.IntegerField', 'float': 'openerp.web.search.FloatField', 'selection': 'openerp.web.search.SelectionField', 'datetime': 'openerp.web.search.DateTimeField', @@ -499,13 +507,13 @@ openerp.web.search.Invalid = openerp.web.Class.extend( /** @lends openerp.web.se ); } }); -openerp.web.search.Widget = openerp.web.Widget.extend( /** @lends openerp.web.search.Widget# */{ +openerp.web.search.Widget = openerp.web.OldWidget.extend( /** @lends openerp.web.search.Widget# */{ template: null, /** * Root class of all search widgets * * @constructs openerp.web.search.Widget - * @extends openerp.web.Widget + * @extends openerp.web.OldWidget * * @param view the ancestor view of this widget */ @@ -989,12 +997,17 @@ openerp.web.search.ManyToOneField = openerp.web.search.CharField.extend({ var self = this; this.$element.autocomplete({ source: function (req, resp) { + if (self.abort_last) { + self.abort_last(); + delete self.abort_last; + } self.dataset.name_search( req.term, self.attrs.domain, 'ilike', 8, function (data) { resp(_.map(data, function (result) { return {id: result[0], label: result[1]} })); }); + self.abort_last = self.dataset.abort_last; }, select: function (event, ui) { self.id = ui.item.id; @@ -1038,9 +1051,8 @@ openerp.web.search.ManyToOneField = openerp.web.search.CharField.extend({ } }); -openerp.web.search.ExtendedSearch = openerp.web.OldWidget.extend({ +openerp.web.search.ExtendedSearch = openerp.web.search.Widget.extend({ template: 'SearchView.extended_search', - identifier_prefix: 'extended-search', init: function (parent, model) { this._super(parent); this.model = model; @@ -1051,7 +1063,7 @@ openerp.web.search.ExtendedSearch = openerp.web.OldWidget.extend({ this.check_last_element(); }, start: function () { - this.$element = $("#" + this.element_id); + this._super(); this.$element.closest("table.oe-searchview-render-line").css("display", "none"); var self = this; this.rpc("/web/searchview/fields_get", @@ -1107,7 +1119,6 @@ openerp.web.search.ExtendedSearch = openerp.web.OldWidget.extend({ openerp.web.search.ExtendedSearchGroup = openerp.web.OldWidget.extend({ template: 'SearchView.extended_search.group', - identifier_prefix: 'extended-search-group', init: function (parent, fields) { this._super(parent); this.fields = fields; @@ -1119,7 +1130,6 @@ openerp.web.search.ExtendedSearchGroup = openerp.web.OldWidget.extend({ prop.start(); }, start: function () { - this.$element = $("#" + this.element_id); var _this = this; this.add_prop(); this.$element.find('.searchview_extended_add_proposition').click(function () { @@ -1153,7 +1163,6 @@ openerp.web.search.ExtendedSearchGroup = openerp.web.OldWidget.extend({ openerp.web.search.ExtendedSearchProposition = openerp.web.OldWidget.extend(/** @lends openerp.web.search.ExtendedSearchProposition# */{ template: 'SearchView.extended_search.proposition', - identifier_prefix: 'extended-search-proposition', /** * @constructs openerp.web.search.ExtendedSearchProposition * @extends openerp.web.OldWidget @@ -1254,7 +1263,6 @@ openerp.web.search.ExtendedSearchProposition.Field = openerp.web.OldWidget.exten }); openerp.web.search.ExtendedSearchProposition.Char = openerp.web.search.ExtendedSearchProposition.Field.extend({ template: 'SearchView.extended_search.proposition.char', - identifier_prefix: 'extended-search-proposition-char', operators: [ {value: "ilike", text: _lt("contains")}, {value: "not ilike", text: _lt("doesn't contain")}, @@ -1271,7 +1279,6 @@ openerp.web.search.ExtendedSearchProposition.Char = openerp.web.search.ExtendedS }); openerp.web.search.ExtendedSearchProposition.DateTime = openerp.web.search.ExtendedSearchProposition.Field.extend({ template: 'SearchView.extended_search.proposition.empty', - identifier_prefix: 'extended-search-proposition-datetime', operators: [ {value: "=", text: _lt("is equal to")}, {value: "!=", text: _lt("is not equal to")}, @@ -1291,7 +1298,6 @@ openerp.web.search.ExtendedSearchProposition.DateTime = openerp.web.search.Exten }); openerp.web.search.ExtendedSearchProposition.Date = openerp.web.search.ExtendedSearchProposition.Field.extend({ template: 'SearchView.extended_search.proposition.empty', - identifier_prefix: 'extended-search-proposition-date', operators: [ {value: "=", text: _lt("is equal to")}, {value: "!=", text: _lt("is not equal to")}, @@ -1311,7 +1317,6 @@ openerp.web.search.ExtendedSearchProposition.Date = openerp.web.search.ExtendedS }); openerp.web.search.ExtendedSearchProposition.Integer = openerp.web.search.ExtendedSearchProposition.Field.extend({ template: 'SearchView.extended_search.proposition.integer', - identifier_prefix: 'extended-search-proposition-integer', operators: [ {value: "=", text: _lt("is equal to")}, {value: "!=", text: _lt("is not equal to")}, @@ -1333,7 +1338,6 @@ openerp.web.search.ExtendedSearchProposition.Id = openerp.web.search.ExtendedSea }); openerp.web.search.ExtendedSearchProposition.Float = openerp.web.search.ExtendedSearchProposition.Field.extend({ template: 'SearchView.extended_search.proposition.float', - identifier_prefix: 'extended-search-proposition-float', operators: [ {value: "=", text: _lt("is equal to")}, {value: "!=", text: _lt("is not equal to")}, @@ -1352,7 +1356,6 @@ openerp.web.search.ExtendedSearchProposition.Float = openerp.web.search.Extended }); openerp.web.search.ExtendedSearchProposition.Selection = openerp.web.search.ExtendedSearchProposition.Field.extend({ template: 'SearchView.extended_search.proposition.selection', - identifier_prefix: 'extended-search-proposition-selection', operators: [ {value: "=", text: _lt("is")}, {value: "!=", text: _lt("is not")} @@ -1366,7 +1369,6 @@ openerp.web.search.ExtendedSearchProposition.Selection = openerp.web.search.Exte }); openerp.web.search.ExtendedSearchProposition.Boolean = openerp.web.search.ExtendedSearchProposition.Field.extend({ template: 'SearchView.extended_search.proposition.boolean', - identifier_prefix: 'extended-search-proposition-boolean', operators: [ {value: "=", text: _lt("is true")}, {value: "!=", text: _lt("is false")} diff --git a/addons/web/static/src/js/view_editor.js b/addons/web/static/src/js/view_editor.js index a2a927fa86d..97304bbb679 100644 --- a/addons/web/static/src/js/view_editor.js +++ b/addons/web/static/src/js/view_editor.js @@ -1,11 +1,11 @@ openerp.web.view_editor = function(openerp) { var _t = openerp.web._t; var QWeb = openerp.web.qweb; -openerp.web.ViewEditor = openerp.web.Widget.extend({ +openerp.web.ViewEditor = openerp.web.OldWidget.extend({ init: function(parent, element_id, dataset, view, options) { this._super(parent); - this.element_id = element_id - this.parent = parent + this.element_id = element_id; + this.parent = parent; this.dataset = new openerp.web.DataSetSearch(this, 'ir.ui.view', null, null), this.model = dataset.model; this.xml_element_id = 0; @@ -108,7 +108,7 @@ openerp.web.ViewEditor = openerp.web.Widget.extend({ type_widget.dirty = true; } type_widget.start(); - type_widget.set_value(value) + type_widget.set_value(value); self.create_view_widget.push(type_widget); }); }, @@ -178,7 +178,7 @@ openerp.web.ViewEditor = openerp.web.Widget.extend({ 'att_list': [], 'name': this.add_node_name(node), 'child_id': [] - } + }; ViewNode.att_list.push(node.tagName.toLowerCase()); _.each(node.attributes, function(att) { ViewNode.att_list.push([att.nodeName, att.nodeValue]); @@ -578,7 +578,7 @@ openerp.web.ViewEditor = openerp.web.Widget.extend({ var check = _.detect(one_object , function(obj) { return id == obj.id; }); - if (check) {result.push(check);}; + if (check) {result.push(check);} _.each(one_object, function(obj) { self.get_object_by_id(id,obj.child_id, result); }); @@ -819,7 +819,7 @@ openerp.web.ViewEditor = openerp.web.Widget.extend({ values.push(''); values.sort(); _PROPERTIES_ATTRIBUTES['widget']['selection'] = values; - var widgets = _.filter(_PROPERTIES_ATTRIBUTES, function(property){ return _.include(properties, property.name)}) + var widgets = _.filter(_PROPERTIES_ATTRIBUTES, function (property) { return _.include(properties, property.name)}); _.each(widgets, function(widget) { var type_widget = new (self.property.get_any([widget.type])) (self.edit_node_dialog, widget); var value = _.detect(arch_val[0]['att_list'],function(res) { @@ -845,24 +845,27 @@ openerp.web.ViewEditor = openerp.web.Widget.extend({ var group_ids = [], group_names = {}, groups = []; var res_groups = new openerp.web.DataSetSearch(this,'res.groups', null, null), model_data = new openerp.web.DataSetSearch(self,'ir.model.data', null, null); - res_groups - .read_slice([], {}) - .done(function(res_grp) { - _.each(res_grp,function(res){ + res_groups.read_slice([], {}).done(function (res_grp) { + _.each(res_grp, function (res) { var key = res.id; +<<<<<<< TREE group_names[key]=res.full_name; +======= + group_names[key] = res.name; +>>>>>>> MERGE-SOURCE group_ids.push(res.id); }); - model_data - .read_slice([],{domain:[['res_id', 'in', group_ids],['model','=','res.groups']]}) - .done(function(model_grp) { - _.each(model_grp, function(res_group) { - groups.push([res_group.module + "." + res_group.name,group_names[res_group.res_id]]); + model_data.read_slice([], {domain: [ + ['res_id', 'in', group_ids], + ['model', '=', 'res.groups'] + ]}).done(function (model_grp) { + _.each(model_grp, function (res_group) { + groups.push([res_group.module + "." + res_group.name, group_names[res_group.res_id]]); }); self.groups = groups; def.resolve(); }); - }) + }); return def.promise(); }, on_add_node: function(properties, fields){ @@ -925,7 +928,7 @@ openerp.web.ViewEditor = openerp.web.Widget.extend({ render_new_field :function(id){ var self = this; var action = { - context: {'default_model_id': id, 'manual':true}, + context: {'default_model_id': id, 'manual': true}, res_model: "ir.model.fields", views: [[false, 'form']], type: 'ir.actions.act_window', @@ -933,7 +936,7 @@ openerp.web.ViewEditor = openerp.web.Widget.extend({ flags: { action_buttons: true } - } + }; var action_manager = new openerp.web.ActionManager(self); $.when(action_manager.do_action(action)).then(function() { var controller = action_manager.dialog_viewmanager.views['form'].controller; diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js index 2172ae103b8..4010bab1f94 100644 --- a/addons/web/static/src/js/view_form.js +++ b/addons/web/static/src/js/view_form.js @@ -13,7 +13,6 @@ openerp.web.FormView = openerp.web.View.extend( /** @lends openerp.web.FormView# searchable: false, readonly : false, form_template: "FormView", - identifier_prefix: 'formview-', display_name: _lt('Form'), /** * @constructs openerp.web.FormView @@ -122,14 +121,15 @@ openerp.web.FormView = openerp.web.View.extend( /** @lends openerp.web.FormView# this.has_been_loaded.resolve(); }, - do_load_state: function(state) { + do_load_state: function(state, warm) { if (state.id && this.datarecord.id != state.id) { - var idx = this.dataset.get_id_index(state.id); - if (idx === null) { - this.dataset.ids.push(state.id) - this.dataset.index = this.dataset.ids.length - 1; + if (!this.dataset.get_id_index(state.id)) { + this.dataset.ids.push(state.id); + } + this.dataset.select_id(state.id); + if (warm) { + this.do_show(); } - this.do_show(); } }, @@ -234,7 +234,7 @@ openerp.web.FormView = openerp.web.View.extend( /** @lends openerp.web.FormView# do_update_pager: function(hide_index) { var $pager = this.$form_header.find('div.oe_form_pager'); var index = hide_index ? '-' : this.dataset.index + 1; - $pager.find('button').prop('disabled', this.dataset.ids.length < 2) + $pager.find('button').prop('disabled', this.dataset.ids.length < 2); $pager.find('span.oe_pager_index').html(index); $pager.find('span.oe_pager_count').html(this.dataset.ids.length); }, @@ -386,11 +386,11 @@ openerp.web.FormView = openerp.web.View.extend( /** @lends openerp.web.FormView# on_button_save: function() { var self = this; return this.do_save().then(function(result) { - self.do_prev_view(result.created); + self.do_prev_view({'created': result.created, 'default': 'page'}); }); }, on_button_cancel: function() { - return this.do_prev_view(); + return this.do_prev_view({'default': 'page'}); }, on_button_new: function() { var self = this; @@ -620,7 +620,7 @@ openerp.web.FormDialog = openerp.web.Dialog.extend({ /** @namespace */ openerp.web.form = {}; -openerp.web.form.SidebarAttachments = openerp.web.Widget.extend({ +openerp.web.form.SidebarAttachments = openerp.web.OldWidget.extend({ init: function(parent, form_view) { var $section = parent.add_section(_t('Attachments'), 'attachments'); this.$div = $('<div class="oe-sidebar-attachments"></div>'); @@ -737,12 +737,11 @@ openerp.web.form.compute_domain = function(expr, fields) { return _.all(stack, _.identity); }; -openerp.web.form.Widget = openerp.web.Widget.extend(/** @lends openerp.web.form.Widget# */{ +openerp.web.form.Widget = openerp.web.OldWidget.extend(/** @lends openerp.web.form.Widget# */{ template: 'Widget', - identifier_prefix: 'formview-widget-', /** * @constructs openerp.web.form.Widget - * @extends openerp.web.Widget + * @extends openerp.web.OldWidget * * @param view * @param node @@ -786,6 +785,10 @@ openerp.web.form.Widget = openerp.web.Widget.extend(/** @lends openerp.web.form. this.$element = this.view.$element.find( '.' + this.element_class.replace(/[^\r\n\f0-9A-Za-z_-]/g, "\\$&")); }, + stop: function() { + this._super.apply(this, arguments); + $('div.tipsy').stop().remove(); + }, process_modifiers: function() { var compute_domain = openerp.web.form.compute_domain; for (var a in this.modifiers) { @@ -800,17 +803,13 @@ openerp.web.form.Widget = openerp.web.Widget.extend(/** @lends openerp.web.form. return QWeb.render(template, { "widget": this }); }, do_attach_tooltip: function(widget, trigger, options) { - if ($.browser.mozilla) { - // Unknown bug in old version of firefox : - // input type=text onchange event not fired when tootip is shown - return; - } widget = widget || this; trigger = trigger || this.$element; options = _.extend({ - delay: 1000, - maxWidth: '500px', - content: function() { + delayIn: 500, + delayOut: 0, + fade: true, + title: function() { var template = widget.template + '.tooltip'; if (!QWeb.has_template(template)) { template = 'WidgetLabel.tooltip'; @@ -818,10 +817,13 @@ openerp.web.form.Widget = openerp.web.Widget.extend(/** @lends openerp.web.form. return QWeb.render(template, { debug: openerp.connection.debug, widget: widget - }); - } + })}, + gravity: $.fn.tipsy.autoBounds(50, 'n'), + html: true, + opacity: 0.85, + trigger: 'hover' }, options || {}); - trigger.tipTip(options); + trigger.tipsy(options); }, _build_view_fields_values: function(blacklist) { var a_dataset = this.view.dataset; @@ -1000,7 +1002,7 @@ openerp.web.form.WidgetNotebook = openerp.web.form.Widget.extend({ this.view.on_button_new.add_first(this.do_select_first_visible_tab); if (openerp.connection.debug) { this.do_attach_tooltip(this, this.$element.find('ul:first'), { - defaultPosition: 'top' + gravity: 's' }); } }, @@ -1220,9 +1222,7 @@ openerp.web.form.Field = openerp.web.form.Widget.extend(/** @lends openerp.web.f this.$element.find('.oe_field_translate').click(this.on_translate); } if (this.nolabel && openerp.connection.debug) { - this.do_attach_tooltip(this, this.$element, { - defaultPosition: 'top' - }); + this.do_attach_tooltip(this, this.$element); } }, set_value: function(value) { @@ -1335,6 +1335,13 @@ openerp.web.form.FieldChar = openerp.web.form.Field.extend({ } }); +openerp.web.form.FieldID = openerp.web.form.FieldChar.extend({ + update_dom: function() { + this._super.apply(this, arguments); + this.$element.find('input').prop('disabled', true); + } +}); + openerp.web.form.FieldEmail = openerp.web.form.FieldChar.extend({ template: 'FieldEmail', start: function() { @@ -1388,7 +1395,7 @@ openerp.web.form.FieldFloat = openerp.web.form.FieldChar.extend({ } }); -openerp.web.DateTimeWidget = openerp.web.Widget.extend({ +openerp.web.DateTimeWidget = openerp.web.OldWidget.extend({ template: "web.datetimepicker", jqueryui_object: 'datetimepicker', type_of_date: "datetime", @@ -1875,6 +1882,10 @@ openerp.web.form.FieldMany2One = openerp.web.form.Field.extend({ var search_val = request.term; var self = this; + if (this.abort_last) { + this.abort_last(); + delete this.abort_last; + } var dataset = new openerp.web.DataSetStatic(this, this.field.relation, self.build_context()); dataset.name_search(search_val, self.build_domain(), 'ilike', @@ -1882,7 +1893,12 @@ openerp.web.form.FieldMany2One = openerp.web.form.Field.extend({ self.last_search = data; // possible selections for the m2o var values = _.map(data, function(x) { - return {label: $('<span />').text(x[1]).html(), name:x[1], id:x[0]}; + return { + label: _.str.escapeHTML(x[1]), + value:x[1], + name:x[1], + id:x[0] + }; }); // search more... if more results that max @@ -1914,13 +1930,14 @@ openerp.web.form.FieldMany2One = openerp.web.form.Field.extend({ response(values); }); + this.abort_last = dataset.abort_last; }, _quick_create: function(name) { var self = this; - var slow_create = function() { + var slow_create = function () { self._change_int_value(null); self._search_create_popup("form", undefined, {"default_name": name}); - } + }; if (self.get_definition_options().quick_create === undefined || self.get_definition_options().quick_create) { var dataset = new openerp.web.DataSetStatic(this, this.field.relation, self.build_context()); dataset.name_create(name, function(data) { @@ -2593,7 +2610,6 @@ openerp.web.form.Many2ManyListView = openerp.web.ListView.extend(/** @lends open * @extends openerp.web.OldWidget */ openerp.web.form.SelectCreatePopup = openerp.web.OldWidget.extend(/** @lends openerp.web.form.SelectCreatePopup# */{ - identifier_prefix: "selectcreatepopup", template: "SelectCreatePopup", /** * options: @@ -2811,7 +2827,6 @@ openerp.web.form.SelectCreateListView = openerp.web.ListView.extend({ * @extends openerp.web.OldWidget */ openerp.web.form.FormOpenPopup = openerp.web.OldWidget.extend(/** @lends openerp.web.form.FormOpenPopup# */{ - identifier_prefix: "formopenpopup", template: "FormOpenPopup", /** * options: @@ -2917,6 +2932,7 @@ openerp.web.form.FieldReference = openerp.web.form.Field.extend({ } }; this.get_fields_values = view.get_fields_values; + this.get_selected_ids = view.get_selected_ids; this.do_onchange = this.on_form_changed = this.on_nop; this.dataset = this.view.dataset; this.widgets_counter = 0; @@ -2934,6 +2950,7 @@ openerp.web.form.FieldReference = openerp.web.form.Field.extend({ name: 'm2o', widget: 'many2one' }}); + this.m2o.on_ui_change.add_last(this.on_ui_change); }, on_nop: function() { }, @@ -3224,6 +3241,7 @@ openerp.web.form.widgets = new openerp.web.Registry({ 'label' : 'openerp.web.form.WidgetLabel', 'button' : 'openerp.web.form.WidgetButton', 'char' : 'openerp.web.form.FieldChar', + 'id' : 'openerp.web.form.FieldID', 'email' : 'openerp.web.form.FieldEmail', 'url' : 'openerp.web.form.FieldUrl', 'text' : 'openerp.web.form.FieldText', diff --git a/addons/web/static/src/js/view_help.js b/addons/web/static/src/js/view_help.js deleted file mode 100644 index f7e5f7c259e..00000000000 --- a/addons/web/static/src/js/view_help.js +++ /dev/null @@ -1,15 +0,0 @@ -/*--------------------------------------------------------- - * OpenERP web library - *---------------------------------------------------------*/ - -openerp.web.view_help = function(openerp) { - -openerp.web.ProcessView = openerp.web.Widget.extend({ -}); - -openerp.web.HelpView = openerp.web.Widget.extend({ -}); - -}; - -// vim:et fdc=0 fdl=0 foldnestmax=3 fdm=syntax: diff --git a/addons/web/static/src/js/view_list.js b/addons/web/static/src/js/view_list.js index 1f8a6020f46..f9d307e811b 100644 --- a/addons/web/static/src/js/view_list.js +++ b/addons/web/static/src/js/view_list.js @@ -97,7 +97,7 @@ openerp.web.ListView = openerp.web.View.extend( /** @lends openerp.web.ListView# this._limit = (this.options.limit || this.defaults.limit || (this.widget_parent.action || {}).limit - || null); + || 80); } return this._limit; }, @@ -158,7 +158,7 @@ openerp.web.ListView = openerp.web.View.extend( /** @lends openerp.web.ListView# var pair = this.colors[i], color = pair[0], expression = pair[1]; - if (py.evaluate(expression, context)) { + if (py.evaluate(expression, _.extend({bool: py.bool}, context))) { return 'color: ' + color + ';'; } // TODO: handle evaluation errors @@ -231,7 +231,7 @@ openerp.web.ListView = openerp.web.View.extend( /** @lends openerp.web.ListView# $this.find('span').toggleClass( 'ui-icon-triangle-1-s ui-icon-triangle-1-n'); } else { - $this.append('<span class="ui-icon ui-icon-triangle-1-s">') + $this.append('<span class="ui-icon ui-icon-triangle-1-n">') .siblings('.oe-sortable').find('span').remove(); } @@ -475,7 +475,7 @@ openerp.web.ListView = openerp.web.View.extend( /** @lends openerp.web.ListView# return this.reload_content(); }, - do_load_state: function(state) { + do_load_state: function(state, warm) { var reload = false; if (state.page && this.page !== state.page) { this.page = state.page; @@ -1355,6 +1355,7 @@ openerp.web.ListView.Groups = openerp.web.Class.extend( /** @lends openerp.web.L axis: 'y', items: '> tr[data-id]', containment: 'parent', + helper: 'clone', stop: function (event, ui) { var to_move = list.records.get(ui.item.data('id')), target_id = ui.item.prev().data('id'), diff --git a/addons/web/static/src/js/view_page.js b/addons/web/static/src/js/view_page.js index 7057a454bca..d5c37419764 100644 --- a/addons/web/static/src/js/view_page.js +++ b/addons/web/static/src/js/view_page.js @@ -245,6 +245,7 @@ openerp.web.page = function (openerp) { openerp.web.page.readonly = openerp.web.form.widgets.clone({ 'frame': 'openerp.web.page.WidgetFrameReadonly', 'char': 'openerp.web.page.FieldCharReadonly', + 'id': 'openerp.web.page.FieldCharReadonly', 'email': 'openerp.web.page.FieldEmailReadonly', 'url': 'openerp.web.page.FieldUrlReadonly', 'text': 'openerp.web.page.FieldCharReadonly', diff --git a/addons/web/static/src/js/view_tree.js b/addons/web/static/src/js/view_tree.js index 902b5a99526..dea53793ffb 100644 --- a/addons/web/static/src/js/view_tree.js +++ b/addons/web/static/src/js/view_tree.js @@ -146,7 +146,7 @@ openerp.web.TreeView = openerp.web.View.extend(/** @lends openerp.web.TreeView# var pair = this.colors[i], color = pair[0], expression = pair[1]; - if (py.evaluate(expression, context)) { + if (py.evaluate(expression, _.extend({bool: py.bool}, context))) { return 'color: ' + color + ';'; } // TODO: handle evaluation errors diff --git a/addons/web/static/src/js/views.js b/addons/web/static/src/js/views.js index 1aa76b9a6dd..7c1f7385927 100644 --- a/addons/web/static/src/js/views.js +++ b/addons/web/static/src/js/views.js @@ -16,8 +16,7 @@ session.web.client_actions = new session.web.Registry(); */ session.web.views = new session.web.Registry(); -session.web.ActionManager = session.web.Widget.extend({ - identifier_prefix: "actionmanager", +session.web.ActionManager = session.web.OldWidget.extend({ init: function(parent) { this._super(parent); this.inner_action = null; @@ -50,16 +49,15 @@ session.web.ActionManager = session.web.Widget.extend({ do_push_state: function(state) { if (this.widget_parent && this.widget_parent.do_push_state) { if (this.inner_action) { + state['model'] = this.inner_action.res_model; if (this.inner_action.id) { state['action_id'] = this.inner_action.id; - } else { - state['model'] = this.inner_action.res_model; } } this.widget_parent.do_push_state(state); } }, - do_load_state: function(state) { + do_load_state: function(state, warm) { var self = this, action_loaded; if (state.action_id) { @@ -68,8 +66,7 @@ session.web.ActionManager = session.web.Widget.extend({ this.null_action(); action_loaded = this.do_action(state.action_id); } - } - else if (state.model && state.id) { + } else if (state.model && state.id) { // TODO handle context & domain ? this.null_action(); var action = { @@ -79,15 +76,23 @@ session.web.ActionManager = session.web.Widget.extend({ views: [[false, 'page'], [false, 'form']] }; action_loaded = this.do_action(action); - } - else if (state.client_action) { + } else if (state.sa) { + // load session action + var self = this; + this.null_action(); + action_loaded = this.rpc('/web/session/get_session_action', {key: state.sa}).pipe(function(action) { + if (action) { + return self.do_action(action); + } + }); + } else if (state.client_action) { this.null_action(); this.ir_actions_client(state.client_action); } $.when(action_loaded || null).then(function() { if (self.inner_viewmanager) { - self.inner_viewmanager.do_load_state(state); + self.inner_viewmanager.do_load_state(state, warm); } }); }, @@ -208,12 +213,11 @@ session.web.ActionManager = session.web.Widget.extend({ } }); -session.web.ViewManager = session.web.Widget.extend(/** @lends session.web.ViewManager# */{ - identifier_prefix: "viewmanager", +session.web.ViewManager = session.web.OldWidget.extend(/** @lends session.web.ViewManager# */{ template: "ViewManager", /** * @constructs session.web.ViewManager - * @extends session.web.Widget + * @extends session.web.OldWidget * * @param parent * @param dataset @@ -312,13 +316,13 @@ session.web.ViewManager = session.web.Widget.extend(/** @lends session.web.View $.when(view_promise).then(function() { self.on_controller_inited(view_type, controller); if (self.searchview - && self.flags.auto_search !== false + && self.flags.auto_search && view.controller.searchable !== false) { self.searchview.ready.then(self.searchview.do_search); } }); } else if (this.searchview - && self.flags.auto_search !== false + && self.flags.auto_search && view.controller.searchable !== false) { this.searchview.ready.then(this.searchview.do_search); } @@ -354,17 +358,19 @@ session.web.ViewManager = session.web.Widget.extend(/** @lends session.web.View * navigation history (the navigation history is appended to via * on_mode_switch) * - * @param {Boolean} [created=false] returning from a creation + * @param {Object} [options] + * @param {Boolean} [options.created=false] resource was created + * @param {String} [options.default=null] view to switch to if no previous view * @returns {$.Deferred} switching end signal */ - on_prev_view: function (created) { + on_prev_view: function (options) { var current_view = this.views_history.pop(); - var previous_view = this.views_history[this.views_history.length - 1]; - if (created && current_view === 'form' && previous_view === 'list') { + var previous_view = this.views_history[this.views_history.length - 1] || options['default']; + if (options.created && current_view === 'form' && previous_view === 'list') { // APR special case: "If creation mode from list (and only from a list), // after saving, go to page view (don't come back in list)" return this.on_mode_switch('page'); - } else if (created && !previous_view && this.action && this.action.flags.default_view === 'form') { + } else if (options.created && !previous_view && this.action && this.action.flags.default_view === 'form') { // APR special case: "If creation from dashboard, we have no previous view return this.on_mode_switch('page'); } @@ -453,7 +459,9 @@ session.web.ViewManagerAction = session.web.ViewManager.extend(/** @lends oepner // do not have it yet (and we don't, because we've not called our own // ``_super()``) rpc requests will blow up. var flags = action.flags || {}; - flags.auto_search = !!action.auto_search; + if (!('auto_search' in flags)) { + flags.auto_search = action.auto_search !== false; + } if (action.res_model == 'board.board' && action.view_mode === 'form') { // Special case for Dashboards _.extend(flags, { @@ -557,6 +565,20 @@ session.web.ViewManagerAction = session.web.ViewManager.extend(/** @lends oepner var dialog = new session.web.Dialog(this, { title: _t("Fields View Get"), width: '95%' }).open(); $('<pre>').text(session.web.json_node_to_xml(current_view.fields_view.arch, true)).appendTo(dialog.$element); break; + case 'perm_read': + var ids = current_view.get_selected_ids(); + if (ids.length === 1) { + this.dataset.call('perm_read', [ids]).then(function(result) { + var dialog = new session.web.Dialog(this, { + title: _.str.sprintf(_t("View Log (%s)"), self.dataset.model), + width: 400 + }, QWeb.render('ViewManagerDebugViewLog', { + perm : result[0], + format : session.web.format_value + })).open(); + }); + } + break; case 'fields': this.dataset.call_and_eval( 'fields_get', [false, {}], null, 1).then(function (fields) { @@ -673,7 +695,7 @@ session.web.ViewManagerAction = session.web.ViewManager.extend(/** @lends oepner this.widget_parent.do_push_state(state); } }, - do_load_state: function(state) { + do_load_state: function(state, warm) { var self = this, defs = []; if (state.view_type && state.view_type !== this.active_view) { @@ -685,7 +707,7 @@ session.web.ViewManagerAction = session.web.ViewManager.extend(/** @lends oepner } $.when(defs).then(function() { - self.views[self.active_view].controller.do_load_state(state); + self.views[self.active_view].controller.do_load_state(state, warm); }); }, shortcut_check : function(view) { @@ -763,7 +785,7 @@ session.web.ViewManagerAction = session.web.ViewManager.extend(/** @lends oepner } }); -session.web.Sidebar = session.web.Widget.extend({ +session.web.Sidebar = session.web.OldWidget.extend({ init: function(parent, element_id) { this._super(parent, element_id); this.items = {}; @@ -1044,6 +1066,12 @@ session.web.View = session.web.Widget.extend(/** @lends session.web.View# */{ template: "EmptyComponent", // name displayed in view switchers display_name: '', + init: function(parent, dataset, view_id, options) { + this._super(parent); + this.dataset = dataset; + this.view_id = view_id; + this.set_default_options(options); + }, set_default_options: function(options) { this.options = options || {}; _.defaults(this.options, { @@ -1153,7 +1181,7 @@ session.web.View = session.web.Widget.extend(/** @lends session.web.View# */{ this.widget_parent.do_push_state(state); } }, - do_load_state: function(state) { + do_load_state: function(state, warm) { }, /** * Switches to a specific view type @@ -1164,8 +1192,12 @@ session.web.View = session.web.Widget.extend(/** @lends session.web.View# */{ }, /** * Cancels the switch to the current view, switches to the previous one + * + * @param {Object} [options] + * @param {Boolean} [options.created=false] resource was created + * @param {String} [options.default=null] view to switch to if no previous view */ - do_prev_view: function () { + do_prev_view: function (options) { }, do_search: function(view) { }, @@ -1206,7 +1238,7 @@ session.web.View = session.web.Widget.extend(/** @lends session.web.View# */{ session.web.json_node_to_xml = function(node, human_readable, indent) { // For debugging purpose, this function will convert a json node back to xml - // Maybe usefull for xml view editor + // Maybe useful for xml view editor indent = indent || 0; var sindent = (human_readable ? (new Array(indent + 1).join('\t')) : ''), r = sindent + '<' + node.tag, |
