summaryrefslogtreecommitdiff
path: root/addons/web/static/src/js
diff options
context:
space:
mode:
authorJiten (OpenERP) <jra@tinyerp.com>2012-02-02 16:50:15 +0530
committerJiten (OpenERP) <jra@tinyerp.com>2012-02-02 16:50:15 +0530
commit8a5593dcc68df71c5f33a3624936efbddbe8ec34 (patch)
treecb46eeea7852d4d5dd32b1425b8af3fc66d3bd93 /addons/web/static/src/js
parent596b0bb4cbdb2ced6367f39226e1d69c9a2faccc (diff)
parent7e2bb94661881e41aa98026410cbbe86e9064055 (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.js74
-rw-r--r--addons/web/static/src/js/core.js55
-rw-r--r--addons/web/static/src/js/data.js16
-rw-r--r--addons/web/static/src/js/dates.js26
-rw-r--r--addons/web/static/src/js/formats.js2
-rw-r--r--addons/web/static/src/js/search.js42
-rw-r--r--addons/web/static/src/js/view_editor.js41
-rw-r--r--addons/web/static/src/js/view_form.js88
-rw-r--r--addons/web/static/src/js/view_help.js15
-rw-r--r--addons/web/static/src/js/view_list.js9
-rw-r--r--addons/web/static/src/js/view_page.js1
-rw-r--r--addons/web/static/src/js/view_tree.js2
-rw-r--r--addons/web/static/src/js/views.js86
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,