summaryrefslogtreecommitdiff
path: root/addons/base/static/src
diff options
context:
space:
mode:
authorFabien Meghazi <fme@openerp.com>2011-07-28 18:16:38 +0200
committerFabien Meghazi <fme@openerp.com>2011-07-28 18:16:38 +0200
commite71bb13c01986f1b2422fa05f418ea3f76375f3c (patch)
treef47ca3408e521266181e316dac3c76b7d6cc9060 /addons/base/static/src
parent8b095a3b1ea0a740388a31d5f3f89701ff7130d3 (diff)
parent64922add3a525df525b1b8258e5f9f3a7919118a (diff)
[MERGE] Merge with trunk
bzr revid: fme@openerp.com-20110728161638-mfqq72naijtd21fg
Diffstat (limited to 'addons/base/static/src')
-rw-r--r--addons/base/static/src/css/base.css3
-rw-r--r--addons/base/static/src/js/chrome.js26
-rw-r--r--addons/base/static/src/js/controller.js354
-rw-r--r--addons/base/static/src/js/data.js8
-rw-r--r--addons/base/static/src/js/form.js13
-rw-r--r--addons/base/static/src/js/list.js1
-rw-r--r--addons/base/static/src/js/search.js51
-rw-r--r--addons/base/static/src/js/view_help.js4
-rw-r--r--addons/base/static/src/js/view_tree.js2
-rw-r--r--addons/base/static/src/js/views.js50
-rw-r--r--addons/base/static/src/xml/base.xml4
11 files changed, 156 insertions, 360 deletions
diff --git a/addons/base/static/src/css/base.css b/addons/base/static/src/css/base.css
index bbf8cba0fe7..b173386e234 100644
--- a/addons/base/static/src/css/base.css
+++ b/addons/base/static/src/css/base.css
@@ -30,6 +30,9 @@ body.openerp {
.openerp .oe-number {
text-align: right !important;
}
+.openerp .oe_hide {
+ display: none !important;
+}
/* STATES */
.openerp .on_logged {
diff --git a/addons/base/static/src/js/chrome.js b/addons/base/static/src/js/chrome.js
index 996642385ef..41a17d37d94 100644
--- a/addons/base/static/src/js/chrome.js
+++ b/addons/base/static/src/js/chrome.js
@@ -137,7 +137,7 @@ openerp.base.Registry = openerp.base.Class.extend( /** @lends openerp.base.Regis
});
-openerp.base.Session = openerp.base.Controller.extend( /** @lends openerp.base.Session# */{
+openerp.base.Session = openerp.base.Widget.extend( /** @lends openerp.base.Session# */{
/**
* @constructs
* @param element_id to use for exception reporting
@@ -405,7 +405,7 @@ openerp.base.Session = openerp.base.Controller.extend( /** @lends openerp.base.S
}
});
-openerp.base.Notification = openerp.base.Controller.extend({
+openerp.base.Notification = openerp.base.Widget.extend({
init: function(parent, element_id) {
this._super(parent, element_id);
this.$element.notify({
@@ -427,7 +427,7 @@ openerp.base.Notification = openerp.base.Controller.extend({
}
});
-openerp.base.Dialog = openerp.base.BaseWidget.extend({
+openerp.base.Dialog = openerp.base.OldWidget.extend({
dialog_title: "",
identifier_prefix: 'dialog',
init: function (parent, options) {
@@ -557,7 +557,7 @@ openerp.base.CrashManager = openerp.base.Dialog.extend({
}
});
-openerp.base.Loading = openerp.base.Controller.extend({
+openerp.base.Loading = openerp.base.Widget.extend({
init: function(parent, element_id) {
this._super(parent, element_id);
this.count = 0;
@@ -576,10 +576,10 @@ openerp.base.Loading = openerp.base.Controller.extend({
}
});
-openerp.base.Database = openerp.base.Controller.extend({
+openerp.base.Database = openerp.base.Widget.extend({
});
-openerp.base.Login = openerp.base.Controller.extend({
+openerp.base.Login = openerp.base.Widget.extend({
remember_creditentials: true,
init: function(parent, element_id) {
this._super(parent, element_id);
@@ -657,7 +657,7 @@ openerp.base.Login = openerp.base.Controller.extend({
}
});
-openerp.base.Header = openerp.base.Controller.extend({
+openerp.base.Header = openerp.base.Widget.extend({
init: function(parent, element_id) {
this._super(parent, element_id);
},
@@ -671,7 +671,7 @@ openerp.base.Header = openerp.base.Controller.extend({
on_logout: function() {}
});
-openerp.base.Menu = openerp.base.Controller.extend({
+openerp.base.Menu = openerp.base.Widget.extend({
init: function(parent, element_id, secondary_menu_id) {
this._super(parent, element_id);
this.secondary_menu_id = secondary_menu_id;
@@ -752,16 +752,16 @@ openerp.base.Menu = openerp.base.Controller.extend({
}
});
-openerp.base.Homepage = openerp.base.Controller.extend({
+openerp.base.Homepage = openerp.base.Widget.extend({
});
-openerp.base.Preferences = openerp.base.Controller.extend({
+openerp.base.Preferences = openerp.base.Widget.extend({
});
-openerp.base.ImportExport = openerp.base.Controller.extend({
+openerp.base.ImportExport = openerp.base.Widget.extend({
});
-openerp.base.WebClient = openerp.base.Controller.extend({
+openerp.base.WebClient = openerp.base.Widget.extend({
init: function(element_id) {
this._super(null, element_id);
@@ -778,7 +778,7 @@ openerp.base.WebClient = openerp.base.Controller.extend({
this.crashmanager.start(false);
// Do you autorize this ? will be replaced by notify() in controller
- openerp.base.Controller.prototype.notification = new openerp.base.Notification(this, "oe_notification");
+ openerp.base.Widget.prototype.notification = new openerp.base.Notification(this, "oe_notification");
this.header = new openerp.base.Header(this, "oe_header");
this.login = new openerp.base.Login(this, "oe_login");
diff --git a/addons/base/static/src/js/controller.js b/addons/base/static/src/js/controller.js
index 1a13ab18607..2ed00f29ff9 100644
--- a/addons/base/static/src/js/controller.js
+++ b/addons/base/static/src/js/controller.js
@@ -140,7 +140,7 @@ instance.base.generate_null_object_class = function(claz, add) {
copy_proto(prototype.prototype);
};
copy_proto(claz.prototype);
- newer.init = instance.base.Controller.prototype.init;
+ newer.init = instance.base.Widget.prototype.init;
var tmpclass = claz.extend(newer);
return tmpclass.extend(add || {});
};
@@ -148,33 +148,14 @@ instance.base.generate_null_object_class = function(claz, add) {
// --------------------------------------------------------
// OLD
// --------------------------------------------------------
-
/**
- * OpenERP Controller
- * TODO merge BaseWidget with Controller
+ * Class for OpenERP session aware classes to extend. Also provides callback mechanism and logging
+ * facility.
*/
-instance.base.Controller = instance.base.Class.extend( /** @lends instance.base.Controller# */{
- /**
- * @constructs
- * rpc operations, event binding and callback calling should be done in
- * start() instead of init so that events can be hooked in between.
- */
- init: function(parent, element_id) {
- this.element_id = element_id;
- this.$element = $('#' + element_id);
- if (element_id) {
- instance.screen[element_id] = this;
- }
- // save the parent children relationship
- this.controller_parent = parent;
- this.controller_children = [];
- if(parent && parent.controller_children) {
- parent.controller_children.push(this);
- }
- // backward compatibility
- this.parent = this.controller_parent;
- this.children = this.controller_children;
-
+instance.base.SessionAware = instance.base.Class.extend({
+ init: function(session) {
+ this.session = session;
+
// Transform on_* method into openerp.base.callbacks
for (var name in this) {
if(typeof(this[name]) == "function") {
@@ -187,78 +168,6 @@ instance.base.Controller = instance.base.Class.extend( /** @lends instance.base.
}
},
/**
- * Event binding, rpc and callback calling required to initialize the
- * object should happen here
- *
- * Returns a promise object letting callers (subclasses and direct callers)
- * know when this component is done starting
- *
- * @returns {jQuery.Deferred}
- */
- start: function() {
- // returns an already fulfilled promise. Maybe we could return nothing?
- // $.when can take non-deferred and in that case it simply considers
- // them all as fulfilled promises.
- // But in thise case we *have* to ensure callers use $.when and don't
- // try to call deferred methods on this return value.
- return $.Deferred().done().promise();
- },
- stop: function() {
- if (this.parent && this.parent.children) {
- this.parent.children = _.without(this.parent.children, this);
- this.parent.controller_children = this.parent.children;
- }
- this.parent = null;
- this.controller_parent = null;
- },
- log: function() {
- var args = Array.prototype.slice.call(arguments);
- var caller = arguments.callee.caller;
- // TODO add support for line number using
- // https://github.com/emwendelin/javascript-stacktrace/blob/master/stacktrace.js
- // args.unshift("" + caller.debug_name);
- this.on_log.apply(this,args);
- },
- on_log: function() {
- if(window.openerp.debug || (window.location.search.indexOf('?debug') !== -1)) {
- var notify = false;
- var body = false;
- if(window.console) {
- console.log(arguments);
- } else {
- body = true;
- }
- var a = Array.prototype.slice.call(arguments, 0);
- for(var i = 0; i < a.length; i++) {
- var v = a[i]==null ? "null" : a[i].toString();
- if(i==0) {
- notify = v.match(/^not/);
- body = v.match(/^bod/);
- }
- if(body) {
- $('<pre></pre>').text(v).appendTo($('body'));
- }
- if(notify && this.notification) {
- this.notification.notify("Logging:",v);
- }
- }
- }
-
- }
-});
-
-/**
- * OpenERP session aware controller
- * a controller takes an already existing dom element and manage it
- */
-instance.base.Controller = instance.base.Controller.extend( /** @lends openerp.base.Controller# */{
- init: function(parent, element_id) {
- this._super(parent, element_id);
- if(this.controller_parent && this.controller_parent.session) {
- this.session = this.controller_parent.session;
- }
- },
- /**
* Performs a JSON-RPC call
*
* @param {String} url endpoint url
@@ -270,126 +179,6 @@ instance.base.Controller = instance.base.Controller.extend( /** @lends openerp.b
rpc: function(url, data, success, error) {
return this.session.rpc(url, data, success, error);
},
- do_action: function(action, on_finished) {
- return this.parent.do_action(action, on_finished);
- }
-});
-
-/**
- * OpenERP session aware widget
- * A widget is a controller that doesnt take an element_id
- * it render its own html render() that you should insert into the dom
- * and bind it at start()
- */
-instance.base.BaseWidget = instance.base.Controller.extend({
- /**
- * The name of the QWeb template that will be used for rendering. Must be
- * redefined in subclasses or the render() method can not be used.
- *
- * @type string
- */
- template: null,
- /**
- * The prefix used to generate an id automatically. Should be redefined in
- * subclasses. If it is not defined, a default identifier will be used.
- *
- * @type string
- */
- identifier_prefix: 'generic-identifier',
- /**
- * Base class for widgets. Handle rendering (based on a QWeb template),
- * identifier generation, parenting and destruction of the widget.
- * Also initialize the identifier.
- *
- * @constructs
- * @params {openerp.base.search.BaseWidget} parent The parent widget.
- */
- init: function (parent) {
- this._super(parent);
- this.make_id(this.identifier_prefix);
- },
- /**
- * Sets and returns a globally unique identifier for the widget.
- *
- * If a prefix is appended, the identifier will be appended to it.
- *
- * @params sections prefix sections, empty/falsy sections will be removed
- */
- make_id: function () {
- this.element_id = _.uniqueId(_.toArray(arguments).join('_'));
- return this.element_id;
- },
- /**
- * Render the widget. This.template must be defined.
- * The content of the current object is passed as context to the template.
- *
- * @param {object} additional Additional context arguments to pass to the template.
- */
- render: function (additional) {
- return QWeb.render(this.template, _.extend({}, this, additional != null ? additional : {}));
- },
- /**
- * "Starts" the widgets. Called at the end of the rendering, this allows
- * to get a jQuery object referring to the DOM ($element attribute).
- */
- start: function () {
- this._super();
- var tmp = document.getElementById(this.element_id);
- this.$element = tmp ? $(tmp) : null;
- },
- /**
- * "Stops" the widgets. Called when the view destroys itself, this
- * lets the widgets clean up after themselves.
- */
- stop: function () {
- if(this.$element != null) {
- this.$element.remove();
- }
- this._super();
- }
-});
-
-// --------------------------------------------------------
-// N-style aka New-Style or Niv-Style
-// --------------------------------------------------------
-
-instance.base.NivController = instance.base.Class.extend({
- init: function(parent) {
- this.controller_parent = parent;
- // Take the session of the parent if defined
- if(this.controller_parent && this.controller_parent.session) {
- this.session = this.controller_parent.session;
- }
- // Transform on_* method into openerp.base.callbacks
- for (var name in this) {
- if(typeof(this[name]) == "function") {
- this[name].debug_name = name;
- // bind ALL function to this not only on_and _do ?
- if((/^on_|^do_/).test(name)) {
- this[name] = instance.base.callback(this, this[name]);
- }
- }
- }
- },
- /**
- * Event binding, rpc and callback calling required to initialize the
- * object should happen here
- *
- * Returns a promise object letting callers (subclasses and direct callers)
- * know when this component is done starting
- *
- * @returns {jQuery.Deferred}
- */
- start: function() {
- // returns an already fulfilled promise. Maybe we could return nothing?
- // $.when can take non-deferred and in that case it simply considers
- // them all as fulfilled promises.
- // But in thise case we *have* to ensure callers use $.when and don't
- // try to call deferred methods on this return value.
- return $.Deferred().done().promise();
- },
- stop: function() {
- },
log: function() {
var args = Array.prototype.slice.call(arguments);
var caller = arguments.callee.caller;
@@ -422,65 +211,54 @@ instance.base.NivController = instance.base.Class.extend({
}
}
}
-
- },
- /**
- * Performs a JSON-RPC call
- *
- * @param {String} url endpoint url
- * @param {Object} data RPC parameters
- * @param {Function} success RPC call success callback
- * @param {Function} error RPC call error callback
- * @returns {jQuery.Deferred} deferred object for the RPC call
- */
- rpc: function(url, data, success, error) {
- return this.session.rpc(url, data, success, error);
- },
- do_action: function(action, on_finished) {
- return this.controller_parent.do_action(action, on_finished);
}
});
-instance.base.NivWidget = instance.base.Controller.extend({
+instance.base.Widget = instance.base.SessionAware.extend({
/**
* The name of the QWeb template that will be used for rendering. Must be
- * redefined in subclasses or the render() method can not be used.
+ * redefined in subclasses or the default render() method can not be used.
*
* @type string
*/
template: null,
/**
* The prefix used to generate an id automatically. Should be redefined in
- * subclasses. If it is not defined, a default identifier will be used.
+ * subclasses. If it is not defined, a generic identifier will be used.
*
* @type string
*/
identifier_prefix: 'generic-identifier',
/**
- * Base class for widgets. Handle rendering (based on a QWeb template),
- * identifier generation, parenting and destruction of the widget.
- * Also initialize the identifier.
- *
* @constructs
- * @params {openerp.base.search.BaseWidget} parent The parent widget.
+ * rpc operations, event binding and callback calling should be done in
+ * start() instead of init so that events can be hooked in between.
*/
init: function(parent, element_id) {
- this._super(parent);
- this.make_id(this.identifier_prefix);
- // this.element_id = element_id;
- // this.$element = $('#' + element_id);
- // if (element_id) {
- // instance.screen[element_id] = this;
- // }
+ this._super((parent || {}).session);
+ //TODO niv: get away the possibility to specify an id
+ this.element_id = element_id;
+ this.element_id = this.element_id || _.uniqueId(this.identifier_prefix);
+
+ this.$element = $('#' + element_id);
+ if (element_id) {
+ instance.screen[element_id] = this;
+ }
// save the parent children relationship
- this.controller_children = [];
- if(parent && parent.controller_children) {
- parent.controller_children.push(this);
+ this.widget_parent = parent;
+ this.widget_children = [];
+ if(parent && parent.widget_children) {
+ parent.widget_children.push(this);
}
- // backward compatibility
- this.parent = this.controller_parent;
- this.children = this.controller_children;
-
+ },
+ /**
+ * Render the widget. This.template must be defined.
+ * The content of the current object is passed as context to the template.
+ *
+ * @param {object} additional Additional context arguments to pass to the template.
+ */
+ render: function (additional) {
+ return QWeb.render(this.template, _.extend({widget: this}, additional || {}));
},
/**
* Event binding, rpc and callback calling required to initialize the
@@ -491,59 +269,37 @@ instance.base.NivWidget = instance.base.Controller.extend({
*
* @returns {jQuery.Deferred}
*/
- /**
- * "Starts" the widgets. Called at the end of the rendering, this allows
- * to get a jQuery object referring to the DOM ($element attribute).
- */
- start: function () {
- this._super();
+ start: function() {
var tmp = document.getElementById(this.element_id);
this.$element = tmp ? $(tmp) : null;
+ return $.Deferred().done().promise();
},
stop: function() {
+ _.each(_.clone(this.widget_children), function(el) {
+ el.stop();
+ });
if(this.$element != null) {
this.$element.remove();
}
- if (this.parent && this.parent.children) {
- this.parent.children = _.without(this.parent.children, this);
- this.parent.controller_children = this.parent.children;
+ if (this.widget_parent && this.widget_parent.widget_children) {
+ this.widget_parent.widget_children = _.without(this.widget_parent.widget_children, this);
}
- this.parent = null;
- this.controller_parent = null;
- },
- /**
- * Sets and returns a globally unique identifier for the widget.
- *
- * If a prefix is appended, the identifier will be appended to it.
- *
- * @params sections prefix sections, empty/falsy sections will be removed
- */
- make_id: function () {
- this.element_id = _.uniqueId(_.toArray(arguments).join('_'));
- return this.element_id;
- },
- /**
- * Render the widget. This.template must be defined.
- * The content of the current object is passed as context to the template.
- *
- * @param {object} additional Additional context arguments to pass to the template.
- */
- render: function (additional) {
- return QWeb.render(this.template, _.extend({}, this, additional != null ? additional : {}));
- },
- widget_add: function(element, addfunc) {
- },
- widget_append: function(element) {
- },
- widget_prepend: function(element) {
- },
- widget_append2: function(element) {
- },
- widget_prepend2: function(element) {
+ this.widget_parent = null;
},
+ do_action: function(action, on_finished) {
+ return this.widget_parent.do_action(action, on_finished);
+ }
});
+/*
+ * For retro compatibility only, the only difference with is that render takes
+ * directly this instead of
+ */
+instance.base.OldWidget = instance.base.Widget.extend({
+ render: function (additional) {
+ return QWeb.render(this.template, _.extend(_.extend({}, this), additional || {}));
+ }
+});
-};
-
+}
// vim:et fdc=0 fdl=0 foldnestmax=3 fdm=syntax:
diff --git a/addons/base/static/src/js/data.js b/addons/base/static/src/js/data.js
index 9eb08cf0fde..5545e32df17 100644
--- a/addons/base/static/src/js/data.js
+++ b/addons/base/static/src/js/data.js
@@ -18,7 +18,7 @@ openerp.base.serialize_sort = function (criterion) {
}).join(', ');
};
-openerp.base.DataGroup = openerp.base.Controller.extend( /** @lends openerp.base.DataGroup# */{
+openerp.base.DataGroup = openerp.base.Widget.extend( /** @lends openerp.base.DataGroup# */{
/**
* Management interface between views and grouped collections of OpenERP
* records.
@@ -30,7 +30,7 @@ openerp.base.DataGroup = openerp.base.Controller.extend( /** @lends openerp.bas
* content of the current grouping level.
*
* @constructs
- * @extends openerp.base.Controller
+ * @extends openerp.base.Widget
*
* @param {openerp.base.Session} session Current OpenERP session
* @param {String} model name of the model managed by this DataGroup
@@ -232,13 +232,13 @@ openerp.base.StaticDataGroup = openerp.base.GrouplessDataGroup.extend( /** @lend
}
});
-openerp.base.DataSet = openerp.base.Controller.extend( /** @lends openerp.base.DataSet# */{
+openerp.base.DataSet = openerp.base.Widget.extend( /** @lends openerp.base.DataSet# */{
/**
* DateaManagement interface between views and the collection of selected
* OpenERP records (represents the view's state?)
*
* @constructs
- * @extends openerp.base.Controller
+ * @extends openerp.base.Widget
*
* @param {String} model the OpenERP model this dataset will manage
*/
diff --git a/addons/base/static/src/js/form.js b/addons/base/static/src/js/form.js
index 80ef7efe96d..f8e2e91667d 100644
--- a/addons/base/static/src/js/form.js
+++ b/addons/base/static/src/js/form.js
@@ -88,9 +88,10 @@ openerp.base.FormView = openerp.base.View.extend( /** @lends openerp.base.FormVi
if (this.options.sidebar && this.options.sidebar_id) {
this.sidebar = new openerp.base.Sidebar(this, this.options.sidebar_id);
this.sidebar.start();
- this.sidebar.attachments = new openerp.base.form.SidebarAttachments(this.sidebar, this.sidebar.add_section("Attachments"), this);
- this.sidebar.add_toolbar(data.fields_view.toolbar);
this.sidebar.do_unfold();
+ this.sidebar.attachments = new openerp.base.form.SidebarAttachments(this.sidebar, this.sidebar.add_section('attachments', "Attachments"), this);
+ this.sidebar.add_toolbar(data.fields_view.toolbar);
+ this.set_common_sidebar_sections(this.sidebar);
}
this.has_been_loaded.resolve();
},
@@ -441,7 +442,7 @@ openerp.base.FormView = openerp.base.View.extend( /** @lends openerp.base.FormVi
/** @namespace */
openerp.base.form = {};
-openerp.base.form.SidebarAttachments = openerp.base.Controller.extend({
+openerp.base.form.SidebarAttachments = openerp.base.Widget.extend({
init: function(parent, element_id, form_view) {
this._super(parent, element_id);
this.view = form_view;
@@ -548,7 +549,7 @@ openerp.base.form.compute_domain = function(expr, fields) {
return _.all(stack);
};
-openerp.base.form.Widget = openerp.base.Controller.extend({
+openerp.base.form.Widget = openerp.base.Widget.extend({
template: 'Widget',
init: function(view, node) {
this.view = view;
@@ -1934,7 +1935,7 @@ openerp.base.form.Many2ManyListView = openerp.base.ListView.extend({
}
});
-openerp.base.form.SelectCreatePopup = openerp.base.BaseWidget.extend({
+openerp.base.form.SelectCreatePopup = openerp.base.OldWidget.extend({
identifier_prefix: "selectcreatepopup",
template: "SelectCreatePopup",
/**
@@ -2074,7 +2075,7 @@ openerp.base.form.SelectCreateListView = openerp.base.ListView.extend({
}
});
-openerp.base.form.FormOpenPopup = openerp.base.BaseWidget.extend({
+openerp.base.form.FormOpenPopup = openerp.base.OldWidget.extend({
identifier_prefix: "formopenpopup",
template: "FormOpenPopup",
/**
diff --git a/addons/base/static/src/js/list.js b/addons/base/static/src/js/list.js
index 0c595bed22d..d64d83329c0 100644
--- a/addons/base/static/src/js/list.js
+++ b/addons/base/static/src/js/list.js
@@ -271,6 +271,7 @@ openerp.base.ListView = openerp.base.View.extend( /** @lends openerp.base.ListVi
this.sidebar = new openerp.base.Sidebar(this, this.options.sidebar_id);
this.sidebar.start();
this.sidebar.add_toolbar(data.fields_view.toolbar);
+ this.set_common_sidebar_sections(this.sidebar);
}
},
/**
diff --git a/addons/base/static/src/js/search.js b/addons/base/static/src/js/search.js
index 8a51abe1335..a63ba79355c 100644
--- a/addons/base/static/src/js/search.js
+++ b/addons/base/static/src/js/search.js
@@ -1,6 +1,6 @@
openerp.base.search = function(openerp) {
-openerp.base.SearchView = openerp.base.Controller.extend({
+openerp.base.SearchView = openerp.base.Widget.extend({
init: function(parent, element_id, dataset, view_id, defaults) {
this._super(parent, element_id);
this.view_manager = parent || new openerp.base.NullViewManager();
@@ -386,13 +386,13 @@ openerp.base.search.Invalid = openerp.base.Class.extend( /** @lends openerp.base
': [' + this.value + '] is ' + this.message);
}
});
-openerp.base.search.Widget = openerp.base.Controller.extend( /** @lends openerp.base.search.Widget# */{
+openerp.base.search.Widget = openerp.base.Widget.extend( /** @lends openerp.base.search.Widget# */{
template: null,
/**
* Root class of all search widgets
*
* @constructs
- * @extends openerp.base.Controller
+ * @extends openerp.base.Widget
*
* @param view the ancestor view of this widget
*/
@@ -851,7 +851,7 @@ openerp.base.search.ManyToManyField = openerp.base.search.CharField.extend({
// TODO: .related_columns (Array), .context, .domain
});
-openerp.base.search.ExtendedSearch = openerp.base.BaseWidget.extend({
+openerp.base.search.ExtendedSearch = openerp.base.OldWidget.extend({
template: 'SearchView.extended_search',
identifier_prefix: 'extended-search',
init: function (parent, model) {
@@ -891,7 +891,7 @@ openerp.base.search.ExtendedSearch = openerp.base.BaseWidget.extend({
if(this.$element.closest("table.oe-searchview-render-line").css("display") == "none") {
return null;
}
- return _.reduce(this.children,
+ return _.reduce(this.widget_children,
function(mem, x) { return mem.concat(x.get_domain());}, []);
},
on_activate: function() {
@@ -910,14 +910,14 @@ openerp.base.search.ExtendedSearch = openerp.base.BaseWidget.extend({
}
},
check_last_element: function() {
- _.each(this.children, function(x) {x.set_last_group(false);});
- if (this.children.length >= 1) {
- this.children[this.children.length - 1].set_last_group(true);
+ _.each(this.widget_children, function(x) {x.set_last_group(false);});
+ if (this.widget_children.length >= 1) {
+ this.widget_children[this.widget_children.length - 1].set_last_group(true);
}
}
});
-openerp.base.search.ExtendedSearchGroup = openerp.base.BaseWidget.extend({
+openerp.base.search.ExtendedSearchGroup = openerp.base.OldWidget.extend({
template: 'SearchView.extended_search.group',
identifier_prefix: 'extended-search-group',
init: function (parent, fields) {
@@ -926,7 +926,7 @@ openerp.base.search.ExtendedSearchGroup = openerp.base.BaseWidget.extend({
},
add_prop: function() {
var prop = new openerp.base.search.ExtendedSearchProposition(this, this.fields);
- var render = prop.render({'index': this.children.length - 1});
+ var render = prop.render({'index': this.widget_children.length - 1});
this.$element.find('.searchview_extended_propositions_list').append(render);
prop.start();
},
@@ -943,7 +943,7 @@ openerp.base.search.ExtendedSearchGroup = openerp.base.BaseWidget.extend({
});
},
get_domain: function() {
- var props = _(this.children).chain().map(function(x) {
+ var props = _(this.widget_children).chain().map(function(x) {
return x.get_proposition();
}).compact().value();
var choice = this.$element.find(".searchview_extended_group_choice").val();
@@ -953,9 +953,9 @@ openerp.base.search.ExtendedSearchGroup = openerp.base.BaseWidget.extend({
props);
},
stop: function() {
- var parent = this.parent;
- if (this.parent.children.length == 1)
- this.parent.hide();
+ var parent = this.widget_parent;
+ if (this.widget_parent.widget_children.length == 1)
+ this.widget_parent.hide();
this._super();
parent.check_last_element();
},
@@ -967,7 +967,7 @@ openerp.base.search.ExtendedSearchGroup = openerp.base.BaseWidget.extend({
}
});
-openerp.base.search.ExtendedSearchProposition = openerp.base.BaseWidget.extend({
+openerp.base.search.ExtendedSearchProposition = openerp.base.OldWidget.extend({
template: 'SearchView.extended_search.proposition',
identifier_prefix: 'extended-search-proposition',
init: function (parent, fields) {
@@ -992,9 +992,12 @@ openerp.base.search.ExtendedSearchProposition = openerp.base.BaseWidget.extend({
});
},
stop: function() {
- if (this.parent.children.length == 1)
- this.parent.stop();
+ var parent;
+ if (this.widget_parent.widget_children.length == 1)
+ parent = this.widget_parent;
this._super();
+ if (parent)
+ parent.stop();
},
changed: function() {
var nval = this.$element.find(".searchview_extended_prop_field").val();
@@ -1054,7 +1057,7 @@ openerp.base.search.ExtendedSearchProposition = openerp.base.BaseWidget.extend({
}
});
-openerp.base.search.ExtendedSearchProposition.Char = openerp.base.BaseWidget.extend({
+openerp.base.search.ExtendedSearchProposition.Char = openerp.base.OldWidget.extend({
template: 'SearchView.extended_search.proposition.char',
identifier_prefix: 'extended-search-proposition-char',
operators: [
@@ -1071,7 +1074,7 @@ openerp.base.search.ExtendedSearchProposition.Char = openerp.base.BaseWidget.ext
return this.$element.val();
}
});
-openerp.base.search.ExtendedSearchProposition.DateTime = openerp.base.BaseWidget.extend({
+openerp.base.search.ExtendedSearchProposition.DateTime = openerp.base.OldWidget.extend({
template: 'SearchView.extended_search.proposition.datetime',
identifier_prefix: 'extended-search-proposition-datetime',
operators: [
@@ -1093,7 +1096,7 @@ openerp.base.search.ExtendedSearchProposition.DateTime = openerp.base.BaseWidget
});
}
});
-openerp.base.search.ExtendedSearchProposition.Date = openerp.base.BaseWidget.extend({
+openerp.base.search.ExtendedSearchProposition.Date = openerp.base.OldWidget.extend({
template: 'SearchView.extended_search.proposition.date',
identifier_prefix: 'extended-search-proposition-date',
operators: [
@@ -1115,7 +1118,7 @@ openerp.base.search.ExtendedSearchProposition.Date = openerp.base.BaseWidget.ext
});
}
});
-openerp.base.search.ExtendedSearchProposition.Integer = openerp.base.BaseWidget.extend({
+openerp.base.search.ExtendedSearchProposition.Integer = openerp.base.OldWidget.extend({
template: 'SearchView.extended_search.proposition.integer',
identifier_prefix: 'extended-search-proposition-integer',
operators: [
@@ -1134,7 +1137,7 @@ openerp.base.search.ExtendedSearchProposition.Integer = openerp.base.BaseWidget.
return Math.round(value);
}
});
-openerp.base.search.ExtendedSearchProposition.Float = openerp.base.BaseWidget.extend({
+openerp.base.search.ExtendedSearchProposition.Float = openerp.base.OldWidget.extend({
template: 'SearchView.extended_search.proposition.float',
identifier_prefix: 'extended-search-proposition-float',
operators: [
@@ -1153,7 +1156,7 @@ openerp.base.search.ExtendedSearchProposition.Float = openerp.base.BaseWidget.ex
return value;
}
});
-openerp.base.search.ExtendedSearchProposition.Selection = openerp.base.BaseWidget.extend({
+openerp.base.search.ExtendedSearchProposition.Selection = openerp.base.OldWidget.extend({
template: 'SearchView.extended_search.proposition.selection',
identifier_prefix: 'extended-search-proposition-selection',
operators: [
@@ -1167,7 +1170,7 @@ openerp.base.search.ExtendedSearchProposition.Selection = openerp.base.BaseWidge
return this.$element.val();
}
});
-openerp.base.search.ExtendedSearchProposition.Boolean = openerp.base.BaseWidget.extend({
+openerp.base.search.ExtendedSearchProposition.Boolean = openerp.base.OldWidget.extend({
template: 'SearchView.extended_search.proposition.boolean',
identifier_prefix: 'extended-search-proposition-boolean',
operators: [
diff --git a/addons/base/static/src/js/view_help.js b/addons/base/static/src/js/view_help.js
index 704c982eb3a..aa98f59c3ab 100644
--- a/addons/base/static/src/js/view_help.js
+++ b/addons/base/static/src/js/view_help.js
@@ -4,10 +4,10 @@
openerp.base.view_help = function(openerp) {
-openerp.base.ProcessView = openerp.base.Controller.extend({
+openerp.base.ProcessView = openerp.base.Widget.extend({
});
-openerp.base.HelpView = openerp.base.Controller.extend({
+openerp.base.HelpView = openerp.base.Widget.extend({
});
};
diff --git a/addons/base/static/src/js/view_tree.js b/addons/base/static/src/js/view_tree.js
index ceb5478a4a7..90972f84973 100644
--- a/addons/base/static/src/js/view_tree.js
+++ b/addons/base/static/src/js/view_tree.js
@@ -5,7 +5,7 @@
openerp.base.view_tree = function(openerp) {
openerp.base.views.add('tree', 'openerp.base.TreeView');
-openerp.base.TreeView = openerp.base.Controller.extend({
+openerp.base.TreeView = openerp.base.Widget.extend({
/**
* Genuine tree view (the one displayed as a tree, not the list)
*/
diff --git a/addons/base/static/src/js/views.js b/addons/base/static/src/js/views.js
index 36fce76d40c..00182874c8c 100644
--- a/addons/base/static/src/js/views.js
+++ b/addons/base/static/src/js/views.js
@@ -4,7 +4,7 @@
openerp.base.views = function(openerp) {
-openerp.base.ActionManager = openerp.base.Controller.extend({
+openerp.base.ActionManager = openerp.base.Widget.extend({
// process all kind of actions
init: function(parent, element_id) {
this._super(parent, element_id);
@@ -112,7 +112,7 @@ openerp.base.ActionDialog = openerp.base.Dialog.extend({
}
});
-openerp.base.ViewManager = openerp.base.Controller.extend({
+openerp.base.ViewManager = openerp.base.Widget.extend({
init: function(parent, element_id, dataset, views) {
this._super(parent, element_id);
this.model = dataset.model;
@@ -346,7 +346,7 @@ openerp.base.ViewManagerAction = openerp.base.ViewManager.extend({
}
},
stop: function() {
- // should be replaced by automatic destruction implemented in BaseWidget
+ // should be replaced by automatic destruction implemented in Widget
this._super();
},
/**
@@ -373,10 +373,11 @@ openerp.base.ViewManagerAction = openerp.base.ViewManager.extend({
}
});
-openerp.base.Sidebar = openerp.base.Controller.extend({
+openerp.base.Sidebar = openerp.base.Widget.extend({
init: function(parent, element_id) {
this._super(parent, element_id);
this.items = {};
+ this.sections = {};
},
start: function() {
var self = this;
@@ -398,11 +399,11 @@ openerp.base.Sidebar = openerp.base.Controller.extend({
classname: 'oe_sidebar_' + type[0]
}
}
- self.add_section(type[1], items);
+ self.add_section(type[0], type[1], items);
}
});
},
- add_section: function(name, items) {
+ add_section: function(code, name, items) {
// For each section, we pass a name/label and optionally an array of items.
// If no items are passed, then the section will be created as a custom section
// returning back an element_id to be used by a custom controller.
@@ -411,11 +412,12 @@ openerp.base.Sidebar = openerp.base.Controller.extend({
// label: label to be displayed for the link,
// action: action to be launch when the link is clicked,
// callback: a function to be executed when the link is clicked,
- // classname: optionnal dom class name for the line,
+ // classname: optional dom class name for the line,
+ // title: optional title for the link
// }
// Note: The item should have one action or/and a callback
var self = this,
- section_id = _.uniqueId(this.element_id + '_section_');
+ section_id = _.uniqueId(this.element_id + '_section_' + code + '_');
if (items) {
for (var i = 0; i < items.length; i++) {
items[i].element_id = _.uniqueId(section_id + '_item_');
@@ -425,6 +427,7 @@ openerp.base.Sidebar = openerp.base.Controller.extend({
var $section = $(QWeb.render("Sidebar.section", {
section_id: section_id,
name: name,
+ classname: 'oe_sidebar_' + code,
items: items
}));
if (items) {
@@ -442,6 +445,7 @@ openerp.base.Sidebar = openerp.base.Controller.extend({
});
}
$section.appendTo(this.$element.find('div.sidebar-actions'));
+ this.sections[code] = $section;
return section_id;
},
do_fold: function() {
@@ -455,7 +459,7 @@ openerp.base.Sidebar = openerp.base.Controller.extend({
}
});
-openerp.base.View = openerp.base.Controller.extend({
+openerp.base.View = openerp.base.Widget.extend({
set_default_options: function(options) {
this.options = options || {};
_.defaults(this.options, {
@@ -524,6 +528,34 @@ openerp.base.View = openerp.base.Controller.extend({
*/
set_embedded_view: function(embedded_view) {
this.embedded_view = embedded_view;
+ },
+ set_common_sidebar_sections: function(sidebar) {
+ var items = [];
+ sidebar.add_section('customize', "Customize", [
+ {
+ label: "Manage Views",
+ callback: this.on_sidebar_manage_view,
+ title: "Manage views of the current object"
+ }, {
+ label: "Edit Workflow",
+ callback: this.on_sidebar_edit_workflow,
+ title: "Manage views of the current object",
+ classname: 'oe_hide oe_sidebar_edit_workflow'
+ }, {
+ label: "Customize Object",
+ callback: this.on_sidebar_customize_object,
+ title: "Manage views of the current object"
+ }
+ ]);
+ },
+ on_sidebar_manage_view: function() {
+ console.log('Todo');
+ },
+ on_sidebar_edit_workflow: function() {
+ console.log('Todo');
+ },
+ on_sidebar_customize_object: function() {
+ console.log('Todo');
}
});
diff --git a/addons/base/static/src/xml/base.xml b/addons/base/static/src/xml/base.xml
index 1c35ce9a06d..c51284ad63a 100644
--- a/addons/base/static/src/xml/base.xml
+++ b/addons/base/static/src/xml/base.xml
@@ -248,10 +248,10 @@
</t>
<t t-name="Sidebar.section">
<h2><t t-esc="name"/></h2>
- <div t-att-id="section_id">
+ <div t-att-id="section_id" t-att-class="classname">
<ul t-if="items">
<li t-foreach="items" t-as="item" t-att-class="item.classname">
- <a class="oe_sidebar_action_a" t-att-id="item.element_id" href="#">
+ <a class="oe_sidebar_action_a" t-att-id="item.element_id" t-att-title="item.title" href="#">
<t t-esc="item.label"/>
</a>
</li>