summaryrefslogtreecommitdiff
path: root/addons/base/static/src
diff options
context:
space:
mode:
authornoz (OpenERP) <noz@tinyerp.com>2011-06-29 11:51:03 +0530
committernoz (OpenERP) <noz@tinyerp.com>2011-06-29 11:51:03 +0530
commit5c45403ad2258a2b4d52b80e1cdf8773dba1e417 (patch)
treea88af4bb949b6ca1f624b57094f4cee0d7688185 /addons/base/static/src
parent4e6655c1cbdd93e6507599bd1d3107f9af4e63c1 (diff)
parent7b91cbdab898c7561740277a3365443a1f1a622c (diff)
[Merge] Merged with latest main branch (upto rev. 529).
bzr revid: noz@tinyerp.com-20110629062103-hnq5d3266fr7jyd6
Diffstat (limited to 'addons/base/static/src')
-rw-r--r--addons/base/static/src/css/base.css14
-rw-r--r--addons/base/static/src/js/chrome.js38
-rw-r--r--addons/base/static/src/js/data.js71
-rw-r--r--addons/base/static/src/js/form.js209
-rw-r--r--addons/base/static/src/js/search.js1
-rw-r--r--addons/base/static/src/js/views.js86
-rw-r--r--addons/base/static/src/xml/base.xml3
7 files changed, 299 insertions, 123 deletions
diff --git a/addons/base/static/src/css/base.css b/addons/base/static/src/css/base.css
index 7488e4c8c71..39ff577b356 100644
--- a/addons/base/static/src/css/base.css
+++ b/addons/base/static/src/css/base.css
@@ -505,9 +505,10 @@ background: linear-gradient(top, #ffffff 0%,#d8d8d8 11%,#afafaf 86%,#333333 91%,
background: #AAAAAA;
}
.openerp .filter_icon {
+ height: 22px;
padding: 1px 2px 0 2px;
- margin-left: 0;
- margin-right: 0;
+ margin: 0;
+ vertical-align: bottom;
}
.openerp .filter_label {
font-weight: bold;
@@ -568,14 +569,6 @@ background: linear-gradient(top, #ffffff 0%,#d8d8d8 11%,#afafaf 86%,#333333 91%,
.openerp .searchview_group_content {
padding-left: 10px;
}
-.openerp .searchview_group_content .oe-searchview-render-line {
- width:0;
-}
-
-
-.openerp .oe-searchview-render-line {
- width:100%;
-}
.openerp .searchview_extended_group {
padding: 3px;
@@ -1086,6 +1079,7 @@ background: linear-gradient(top, #ffffff 0%,#ebe9e9 100%); /* W3C */
.openerp .oe-m2o-drop-down-button img,
.openerp .oe-m2o-cm-button img {
margin-bottom: -4px;
+ cursor: pointer;
}
.openerp .oe-m2o-disabled-cm {
color: grey;
diff --git a/addons/base/static/src/js/chrome.js b/addons/base/static/src/js/chrome.js
index 3c15fcb1e68..0087720adde 100644
--- a/addons/base/static/src/js/chrome.js
+++ b/addons/base/static/src/js/chrome.js
@@ -11,8 +11,8 @@ openerp.base.callback = function(obj, method) {
for(var i = 0; i < callback.callback_chain.length; i++) {
var c = callback.callback_chain[i];
if(c.unique) {
- // al: obscure but shortening C-style hack, sorry
- callback.callback_chain.pop(i--);
+ callback.callback_chain.splice(i, 1);
+ i -= 1;
}
r = c.callback.apply(c.self, c.args.concat(args));
// TODO special value to stop the chain
@@ -138,6 +138,29 @@ openerp.base.Registry = Class.extend( /** @lends openerp.base.Registry# */ {
return object_match;
},
/**
+ * Tries a number of keys, and returns the first object matching one of
+ * the keys.
+ *
+ * @param {Array} keys a sequence of keys to fetch the object for
+ * @returns {Class} the first class found matching an object
+ *
+ * @throws {openerp.base.KeyNotFound} if none of the keys was in the mapping
+ * @trows {openerp.base.ObjectNotFound} if a found object path was invalid
+ */
+ get_any: function (keys) {
+ for (var i=0; i<keys.length; ++i) {
+ try {
+ return this.get_object(keys[i]);
+ } catch (e) {
+ if (e instanceof openerp.base.KeyNotFound) {
+ continue;
+ }
+ throw e;
+ }
+ }
+ throw new openerp.base.KeyNotFound(keys.join(','));
+ },
+ /**
* Adds a new key and value to the registry.
*
* This method can be chained.
@@ -261,13 +284,12 @@ openerp.base.generate_null_object_class = function(claz, add) {
}
if (prototype.prototype)
copy_proto(prototype.prototype);
- }
+ };
copy_proto(claz.prototype);
- var init = openerp.base.BasicController.prototype.init;
- newer.init = init;
+ newer.init = openerp.base.BasicController.prototype.init;
var tmpclass = claz.extend(newer);
return tmpclass.extend(add || {});
-}
+};
openerp.base.Notification = openerp.base.BasicController.extend({
init: function(element_id) {
@@ -557,7 +579,7 @@ openerp.base.Controller = openerp.base.BasicController.extend( /** @lends opener
*/
controller_get: function(key) {
return this.controller_registry[key];
- // OR should contrustct it ? setting parent correctly ?
+ // OR should build it ? setting parent correctly ?
// function construct(constructor, args) {
// function F() {
// return constructor.apply(this, args);
@@ -617,7 +639,7 @@ openerp.base.Controller = openerp.base.BasicController.extend( /** @lends opener
}
// TODO if post prefix
//this.element_id = _.uniqueId(_.toArray(arguments).join('_'));
- };
+ }
},
/**
* Performs a JSON-RPC call
diff --git a/addons/base/static/src/js/data.js b/addons/base/static/src/js/data.js
index b3ddd7750c8..e8886009dd9 100644
--- a/addons/base/static/src/js/data.js
+++ b/addons/base/static/src/js/data.js
@@ -196,9 +196,7 @@ openerp.base.GrouplessDataGroup = openerp.base.DataGroup.extend(
this._super(session, model, domain, context, null, level);
},
list: function (ifGroups, ifRecords) {
- ifRecords(_.extend(
- new openerp.base.DataSetSearch(this.session, this.model),
- {domain: this.domain, context: this.context}));
+ ifRecords(new openerp.base.DataSetSearch(this.session, this.model, this.context, this.domain));
}
});
@@ -287,12 +285,11 @@ openerp.base.DataSet = openerp.base.Controller.extend( /** @lends openerp.base.
});
}
},
- default_get: function(fields, context, callback) {
- context = context || this.context;
+ default_get: function(fields, callback) {
return this.rpc('/base/dataset/default_get', {
model: this.model,
fields: fields,
- context: context
+ context: this.context
}, callback);
},
create: function(data, callback, error_callback) {
@@ -331,14 +328,28 @@ openerp.base.DataSet = openerp.base.Controller.extend( /** @lends openerp.base.
args: args || []
}, callback, error_callback);
},
- /**
- * Arguments:
- * name='', args=[], operator='ilike', context=None, limit=100
+ call_button: function (method, args, callback, error_callback) {
+ return this.rpc('/base/dataset/call_button', {
+ model: this.model,
+ method: method,
+ domain_id: null,
+ context_id: 1,
+ args: args || []
+ }, callback, error_callback);
+ },
+ name_get: function(ids, callback) {
+ return this.call_and_eval('name_get', [ids, this.context], null, 1, callback);
+ },
+ /*
+ * args = domain
*/
- name_search: function (args, callback, error_callback) {
+ name_search: function (name, args, operator, limit, callback) {
return this.call_and_eval('name_search',
- args, 1, 3,
- callback, error_callback);
+ [name || '', args || false, operator || 'ilike', this.context, limit || 100],
+ 1, 3, callback);
+ },
+ name_create: function(name, callback) {
+ return this.call_and_eval('name_create', [name, this.context], null, 1, callback);
},
exec_workflow: function (id, signal, callback) {
return this.rpc('/base/dataset/exec_workflow', {
@@ -350,11 +361,14 @@ openerp.base.DataSet = openerp.base.Controller.extend( /** @lends openerp.base.
});
openerp.base.DataSetStatic = openerp.base.DataSet.extend({
- init: function(session, model, ids) {
- this._super(session, model);
+ init: function(session, model, context, ids) {
+ this._super(session, model, context);
// all local records
this.ids = ids || [];
this.count = this.ids.length;
+ if (this.ids.length) {
+ this.index = 0;
+ }
},
read_slice: function (fields, offset, limit, callback) {
var self = this;
@@ -560,7 +574,7 @@ openerp.base.BufferedDataSet = openerp.base.DataSetStatic.extend({
return_records();
}
return completion.promise();
- },
+ }
});
openerp.base.ReadOnlyDataSetSearch = openerp.base.DataSetSearch.extend({
@@ -590,33 +604,44 @@ openerp.base.ReadOnlyDataSetSearch = openerp.base.DataSetSearch.extend({
openerp.base.CompoundContext = function() {
this.__ref = "compound_context";
this.__contexts = [];
+ this.__eval_context = null;
var self = this;
_.each(arguments, function(x) {
self.add(x);
});
};
openerp.base.CompoundContext.prototype.add = function(context) {
- if (context.__ref === "compound_context")
- this.__contexts = this.__contexts.concat(context.__contexts);
- else
- this.__contexts.push(context);
+ this.__contexts.push(context);
+ return this;
+};
+openerp.base.CompoundContext.prototype.set_eval_context = function(eval_context) {
+ this.__eval_context = eval_context;
return this;
};
+openerp.base.CompoundContext.prototype.get_eval_context = function() {
+ return this.__eval_context;
+};
openerp.base.CompoundDomain = function() {
this.__ref = "compound_domain";
this.__domains = [];
+ this.__eval_context = null;
+ var self = this;
_.each(arguments, function(x) {
self.add(x);
});
};
openerp.base.CompoundDomain.prototype.add = function(domain) {
- if (domain.__ref === "compound_domain")
- this.__domains = this.__domains.concat(domain.__domains);
- else
- this.__domains.push(domain);
+ this.__domains.push(domain);
return this;
};
+openerp.base.CompoundDomain.prototype.set_eval_context = function(eval_context) {
+ this.__eval_context = eval_context;
+ return this;
+};
+openerp.base.CompoundDomain.prototype.get_eval_context = function() {
+ return this.__eval_context;
+};
};
diff --git a/addons/base/static/src/js/form.js b/addons/base/static/src/js/form.js
index aa69c539c00..d279eb5d3aa 100644
--- a/addons/base/static/src/js/form.js
+++ b/addons/base/static/src/js/form.js
@@ -241,12 +241,8 @@ openerp.base.FormView = openerp.base.View.extend( /** @lends openerp.base.FormV
},
on_button_new: function() {
var self = this;
- var context = new openerp.base.CompoundContext(this.dataset.context);
- if (this.view_manager.action && this.view_manager.action.context) {
- context.add(this.view_manager.action.context);
- }
$.when(this.has_been_loaded).then(function() {
- self.dataset.default_get(_.keys(self.fields_view.fields), context, function(result) {
+ self.dataset.default_get(_.keys(self.fields_view.fields), function(result) {
self.on_record_loaded(result.result);
});
});
@@ -421,6 +417,13 @@ openerp.base.FormView = openerp.base.View.extend( /** @lends openerp.base.FormV
} else {
this.on_button_new();
}
+ },
+ get_fields_values: function() {
+ var values = {};
+ _.each(this.fields, function(value, key) {
+ values[key] = value.get_value();
+ });
+ return values;
}
});
@@ -448,7 +451,7 @@ openerp.base.form.compute_domain = function(expr, fields) {
}
}
- var field = fields[ex[0]].value;
+ var field = fields[ex[0]].get_value ? fields[ex[0]].get_value() : fields[ex[0]].value;
var op = ex[1];
var val = ex[2];
@@ -568,8 +571,8 @@ openerp.base.form.WidgetFrame = openerp.base.form.Widget.extend({
},
handle_node: function(node) {
var type = this.view.fields_view.fields[node.attrs.name] || {};
- var widget_type = node.attrs.widget || type.type || node.tag;
- var widget = new (this.view.registry.get_object(widget_type)) (this.view, node);
+ var widget = new (this.view.registry.get_any(
+ [node.attrs.widget, type.type, node.tag])) (this.view, node);
if (node.tag == 'field') {
if (!this.view.default_focus_field || node.attrs.default_focus == '1') {
this.view.default_focus_field = widget;
@@ -666,18 +669,26 @@ openerp.base.form.WidgetButton = openerp.base.form.Widget.extend({
this.view.datarecord.id, function (result) {
self.log("Button returned", result);
self.view.reload();
+ }, function() {
+ self.view.reload();
});
}
});
openerp.base.form.WidgetLabel = openerp.base.form.Widget.extend({
init: function(view, node) {
- this.is_field_label = true;
this.element_name = 'label_' + node.attrs.name;
this._super(view, node);
- this.template = "WidgetLabel";
+ // TODO fme: support for attrs.align
+ if (this.node.tag == 'label' && this.node.attrs.colspan) {
+ this.is_field_label = false;
+ this.template = "WidgetParagraph";
+ } else {
+ this.is_field_label = true;
+ this.template = "WidgetLabel";
+ }
this.colspan = 1;
},
render: function () {
@@ -1078,12 +1089,26 @@ openerp.base.form.FieldSelection = openerp.base.form.Field.extend({
* the fields'context with the action's context.
*/
var build_relation_context = function(relation_field) {
- var action = relation_field.view.view_manager.action || {};
- var a_context = action.context || {};
- var f_context = relation_field.field.context || {};
- var ctx = new openerp.base.CompoundContext(a_context).add(f_context);
+ var a_context = relation_field.view.dataset.context || {};
+ var fields_values = relation_field.view.get_fields_values();
+ var parent_values = a_context.get_eval_context ? a_context.get_eval_context() || {} : {};
+ parent_values = _.clone(parent_values);
+ delete parent_values.parent;
+ fields_values.parent = parent_values;
+ var f_context = new openerp.base.CompoundContext(relation_field.field.context || {}).set_eval_context(fields_values);
+ var ctx = new openerp.base.CompoundContext(a_context, f_context);
return ctx;
}
+var build_relation_domain = function(relation_field) {
+ var a_context = relation_field.view.dataset.context || {};
+ var fields_values = relation_field.view.get_fields_values();
+ var parent_values = a_context.get_eval_context ? a_context.get_eval_context() || {} : {};
+ parent_values = _.clone(parent_values);
+ delete parent_values.parent;
+ fields_values.parent = parent_values;
+ var f_domain = new openerp.base.CompoundDomain(relation_field.field.domain || []).set_eval_context(fields_values);
+ return f_domain;
+}
openerp.base.form.FieldMany2One = openerp.base.form.Field.extend({
init: function(view, node) {
@@ -1197,10 +1222,10 @@ openerp.base.form.FieldMany2One = openerp.base.form.Field.extend({
var search_val = request.term;
var self = this;
- var dataset = new openerp.base.DataSetStatic(this.session, this.field.relation, []);
+ var dataset = new openerp.base.DataSetStatic(this.session, this.field.relation, build_relation_context(self));
- dataset.name_search([search_val, self.field.domain || [], 'ilike',
- build_relation_context(self), this.limit + 1], function(data) {
+ dataset.name_search(search_val, build_relation_domain(self), 'ilike',
+ this.limit + 1, function(data) {
self.last_search = data.result;
// possible selections for the m2o
var values = _.map(data.result, function(x) {
@@ -1211,8 +1236,8 @@ openerp.base.form.FieldMany2One = openerp.base.form.Field.extend({
if (values.length > self.limit) {
values = values.slice(0, self.limit);
values.push({label: "<em>   Search More...</em>", action: function() {
- dataset.name_search([search_val, self.field.domain || [], 'ilike',
- build_relation_context(self), false], function(data) {
+ dataset.name_search(search_val, build_relation_domain(self), 'ilike'
+ , false, function(data) {
self._change_int_value(null);
self._search_create_popup("search", data.result);
});
@@ -1239,27 +1264,27 @@ openerp.base.form.FieldMany2One = openerp.base.form.Field.extend({
},
_quick_create: function(name) {
var self = this;
- var dataset = new openerp.base.DataSetStatic(this.session, this.field.relation, []);
- dataset.call("name_create", [name, build_relation_context(self)], function(data) {
+ var dataset = new openerp.base.DataSetStatic(this.session, this.field.relation, build_relation_context(self));
+ dataset.name_create(name, function(data) {
self._change_int_ext_value(data.result);
- }, function(a, b) {
+ }).fail(function() {
self._change_int_value(null);
self._search_create_popup("form", undefined, {"default_name": name});
});
},
// all search/create popup handling
_search_create_popup: function(view, ids, context) {
- var dataset = new openerp.base.DataSetStatic(this.session, this.field.relation, []);
var self = this;
var pop = new openerp.base.form.SelectCreatePopup(null, self.view.session);
pop.select_element(self.field.relation,{
initial_ids: ids ? _.map(ids, function(x) {return x[0]}) : undefined,
initial_view: view,
disable_multiple_selection: true
- }, self.view.domain || [],
- new openerp.base.CompoundContext(build_relation_context(self)).add(context || {}));
+ }, build_relation_domain(self),
+ new openerp.base.CompoundContext(build_relation_context(self), context || {}));
pop.on_select_elements.add(function(element_ids) {
- dataset.call("name_get", [element_ids[0]], function(data) {
+ var dataset = new openerp.base.DataSetStatic(this.session, this.field.relation, build_relation_context(self));
+ dataset.name_get([element_ids[0]], function(data) {
self._change_int_ext_value(data.result[0]);
pop.stop();
});
@@ -1271,9 +1296,15 @@ openerp.base.form.FieldMany2One = openerp.base.form.Field.extend({
},
_change_int_value: function(value) {
this.value = value;
- if (this.original_value === undefined || (this.value !== undefined &&
- ((this.original_value ? this.original_value[0] : null) !== (this.value ? this.value[0] : null)))) {
- this.original_value = undefined;
+ var back_orig_value = this.original_value;
+ if (this.value === null || this.value) {
+ this.original_value = this.value;
+ }
+ if (back_orig_value === undefined) { // first use after a set_value()
+ return;
+ }
+ if (this.value !== undefined && ((back_orig_value ? back_orig_value[0] : null)
+ !== (this.value ? this.value[0] : null))) {
this.on_ui_change();
}
},
@@ -1284,14 +1315,14 @@ openerp.base.form.FieldMany2One = openerp.base.form.Field.extend({
var _super = this._super;
this.tmp_value = value;
var real_set_value = function(rval) {
- this.tmp_value = undefined;
+ self.tmp_value = undefined;
_super.apply(self, rval);
- self.original_value = rval;
+ self.original_value = undefined;
self._change_int_ext_value(rval);
};
if(typeof(value) === "number") {
- var dataset = new openerp.base.DataSetStatic(this.session, this.field.relation, []);
- dataset.call("name_get", [value], function(data) {
+ var dataset = new openerp.base.DataSetStatic(this.session, this.field.relation, build_relation_context(self));
+ dataset.name_get([value], function(data) {
real_set_value(data.result[0]);
}).fail(function() {self.tmp_value = undefined;});
} else {
@@ -1303,10 +1334,10 @@ openerp.base.form.FieldMany2One = openerp.base.form.Field.extend({
if (this.tmp_value instanceof Array) {
return this.tmp_value[0];
}
- return this.tmp_value;
+ return this.tmp_value ? this.tmp_value : false;
}
if (this.value === undefined)
- throw "theorically unreachable state";
+ return this.original_value ? this.original_value[0] : false;
return this.value ? this.value[0] : false;
},
validate: function() {
@@ -1325,7 +1356,43 @@ openerp.base.form.FieldMany2One = openerp.base.form.Field.extend({
# (4, ID) link
# (5) unlink all (only valid for one2many)
*/
-
+var commands = {
+ // (0, _, {values})
+ CREATE: 0,
+ 'create': function (values) {
+ return [commands.CREATE, false, values];
+ },
+ // (1, id, {values})
+ UPDATE: 1,
+ 'update': function (id, values) {
+ return [commands.UPDATE, id, values];
+ },
+ // (2, id[, _])
+ DELETE: 2,
+ 'delete': function (id) {
+ return [commands.DELETE, id, false];
+ },
+ // (3, id[, _]) removes relation, but not linked record itself
+ FORGET: 3,
+ 'forget': function (id) {
+ return [commands.FORGET, id, false];
+ },
+ // (4, id[, _])
+ LINK_TO: 4,
+ 'link_to': function (id) {
+ return [commands.LINK_TO, id, false];
+ },
+ // (5[, _[, _]])
+ FORGET_ALL: 5,
+ 'forget_all': function () {
+ return [5, false, false];
+ },
+ // (6, _, ids) replaces all linked records with provided ids
+ REPLACE_WITH: 6,
+ 'replace_with': function (ids) {
+ return [6, false, ids];
+ }
+};
openerp.base.form.FieldOne2Many = openerp.base.form.Field.extend({
init: function(view, node) {
this._super(view, node);
@@ -1360,11 +1427,9 @@ openerp.base.form.FieldOne2Many = openerp.base.form.Field.extend({
this.viewmanager = new openerp.base.ViewManager(this.view.session,
this.element_id, this.dataset, views);
- var reg = new openerp.base.Registry();
- reg.add("form", openerp.base.views.map["form"]);
- reg.add("graph", openerp.base.views.map["graph"]);
- reg.add("list", "openerp.base.form.One2ManyListView");
- this.viewmanager.registry = reg;
+ this.viewmanager.registry = openerp.base.views.clone({
+ list: 'openerp.base.form.One2ManyListView'
+ });
this.viewmanager.on_controller_inited.add_last(function(view_type, controller) {
if (view_type == "list") {
@@ -1387,20 +1452,59 @@ openerp.base.form.FieldOne2Many = openerp.base.form.Field.extend({
},
set_value_from_ui: function() {},
set_value: function(value) {
- value = value || []
- this._super(value);
- this.dataset.reset_ids(value);
+ value = value || [];
var self = this;
+ if(value.length >= 1 && value[0] instanceof Array) {
+ var ids = [];
+ _.each(value, function(command) {
+ var obj = {values: command[2]};
+ switch (command[0]) {
+ case commands.CREATE:
+ obj['id'] = _.uniqueId(self.dataset.virtual_id_prefix);
+ self.dataset.to_create.push(obj);
+ self.dataset.cache.push(_.clone(obj));
+ ids.push(obj.id);
+ return;
+ case commands.UPDATE:
+ obj['id'] = command[1];
+ self.dataset.to_write.push(obj);
+ self.dataset.cache.push(_.clone(obj));
+ ids.push(obj.id);
+ return;
+ case commands.DELETE:
+ self.dataset.to_delete.push({id: command[1]});
+ return;
+ case commands.LINK_TO:
+ ids.push(command[1]);
+ return;
+ }
+ });
+ this._super(ids);
+ this.dataset.set_ids(ids);
+ } else {
+ this._super(value);
+ this.dataset.reset_ids(value);
+ }
$.when(this.is_started).then(function() {
self.reload_current_view();
});
},
get_value: function() {
- var val = _.map(this.dataset.to_delete, function(v, k) {return [2, x.id];});
- val = val.concat(_.map(this.dataset.to_create, function(x) {return [0, 0, x.values];}));
- val = val.concat(_.map(this.dataset.to_write, function(x) {return [1, x.id, x.values];}));
- debugger;
- return val;
+ var self = this;
+ var val = _.map(this.dataset.ids, function(id) {
+ var alter_order = _.detect(self.dataset.to_create, function(x) {return x.id === id;});
+ if (alter_order) {
+ return commands.create(alter_order.values);
+ }
+ alter_order = _.detect(self.dataset.to_write, function(x) {return x.id === id;});
+ if (alter_order) {
+ return commands.update(alter_order.id, alter_order.values);
+ }
+ return commands.link_to(id);
+ });
+ return val.concat(_.map(
+ this.dataset.to_delete, function(x) {
+ return commands['delete'](x.id);}));
},
validate: function() {
this.invalid = false;
@@ -1458,6 +1562,9 @@ openerp.base.form.FieldMany2Many = openerp.base.form.Field.extend({
},
set_value: function(value) {
value = value || [];
+ if (value.length >= 1 && value[0] instanceof Array) {
+ value = value[0][2];
+ }
this._super(value);
this.dataset.set_ids(value);
var self = this;
@@ -1466,7 +1573,7 @@ openerp.base.form.FieldMany2Many = openerp.base.form.Field.extend({
});
},
get_value: function() {
- return [[6,false,this.dataset.ids]];
+ return [commands.replace_with(this.dataset.ids)];
}
});
@@ -1543,7 +1650,7 @@ openerp.base.form.SelectCreatePopup = openerp.base.BaseWidget.extend({
});
this.searchview.on_search.add(function(domains, contexts, groupbys) {
if (self.initial_ids) {
- self.view_list.do_search.call(self,[[["id", "in", self.initial_ids]]],
+ self.view_list.do_search.call(self, domains.concat([[["id", "in", self.initial_ids]]]),
contexts, groupbys);
self.initial_ids = undefined;
} else {
diff --git a/addons/base/static/src/js/search.js b/addons/base/static/src/js/search.js
index cd69ec4f0e8..6efa6988fe8 100644
--- a/addons/base/static/src/js/search.js
+++ b/addons/base/static/src/js/search.js
@@ -377,6 +377,7 @@ openerp.base.search.FilterGroup = openerp.base.search.Widget.extend({
init: function (filters, view) {
this._super(view);
this.filters = filters;
+ this.length = filters.length;
},
start: function () {
this._super();
diff --git a/addons/base/static/src/js/views.js b/addons/base/static/src/js/views.js
index 8b87d9cbdbe..ee4388c8971 100644
--- a/addons/base/static/src/js/views.js
+++ b/addons/base/static/src/js/views.js
@@ -18,7 +18,7 @@ openerp.base.ActionManager = openerp.base.Controller.extend({
* Process an action
* Supported actions: act_window
*/
- do_action: function(action) {
+ do_action: function(action, on_closed) {
var self = this;
action.flags = _.extend({
sidebar : action.target != 'new',
@@ -31,6 +31,9 @@ openerp.base.ActionManager = openerp.base.Controller.extend({
// instantiate the right controllers by understanding the action
switch (action.type) {
case 'ir.actions.act_window':
+ if (!action.target && this.dialog_stack.length) {
+ action.flags.new_window = true;
+ }
if (action.target == 'new') {
var element_id = _.uniqueId("act_window_dialog");
$('<div>', {id: element_id}).dialog({
@@ -44,6 +47,8 @@ openerp.base.ActionManager = openerp.base.Controller.extend({
});
var viewmanager = new openerp.base.ViewManagerAction(this.session, element_id, action);
viewmanager.start();
+ viewmanager.on_act_window_closed.add(on_closed);
+ viewmanager.is_dialog = true;
this.dialog_stack.push(viewmanager);
} else if (action.flags.new_window) {
action.flags.new_window = false;
@@ -62,6 +67,9 @@ openerp.base.ActionManager = openerp.base.Controller.extend({
break;
case 'ir.actions.act_window_close':
var dialog = this.dialog_stack.pop();
+ if (!action.special) {
+ dialog.on_act_window_closed();
+ }
dialog.$element.dialog('destroy');
dialog.stop();
break;
@@ -84,6 +92,7 @@ openerp.base.ViewManager = openerp.base.Controller.extend({
this.flags = this.flags || {};
this.sidebar = new openerp.base.NullSidebar();
this.registry = openerp.base.views;
+ this.is_dialog = false;
},
/**
* @returns {jQuery.Deferred} initial view loading promise
@@ -126,17 +135,20 @@ openerp.base.ViewManager = openerp.base.Controller.extend({
controller.set_embedded_view(view.embedded_view);
}
if (view_type === 'list' && this.flags.search_view === false && this.action && this.action['auto_search']) {
- // In case the search view is not instanciated: manually call ListView#search
+ // In case the search view is not instantiated: manually call ListView#search
+ var domains = !_(self.action.domain).isEmpty()
+ ? [self.action.domain] : [],
+ contexts = !_(self.action.context).isEmpty()
+ ? [self.action.context] : [];
controller.on_loaded.add({
callback: function () {
- controller.do_search([self.action.domain], [self.action.context], []);
+ controller.do_search(domains, contexts, []);
},
position: 'last',
unique: true
});
}
view_promise = controller.start();
- var self = this;
$.when(view_promise).then(function() {
self.on_controller_inited(view_type, controller);
});
@@ -157,12 +169,13 @@ openerp.base.ViewManager = openerp.base.Controller.extend({
.filter('[data-view-type="' + view_type + '"]')
.attr('disabled', true);
- for (var i in this.views) {
- if (this.views[i].controller) {
- if (i === view_type) {
- $.when(view_promise).then(this.views[i].controller.do_show);
+ for (var view_name in this.views) {
+ if (!this.views.hasOwnProperty(view_name)) { continue; }
+ if (this.views[view_name].controller) {
+ if (view_name === view_type) {
+ $.when(view_promise).then(this.views[view_name].controller.do_show);
} else {
- this.views[i].controller.do_hide();
+ this.views[view_name].controller.do_hide();
}
}
}
@@ -198,6 +211,11 @@ openerp.base.ViewManager = openerp.base.Controller.extend({
return this.searchview.start();
},
/**
+ * Called when this view manager has been created by an action 'act_window@target=new' is closed
+ */
+ on_act_window_closed : function() {
+ },
+ /**
* Called when one of the view want to execute an action
*/
on_action: function(action) {
@@ -238,12 +256,14 @@ openerp.base.NullViewManager = openerp.base.generate_null_object_class(openerp.b
openerp.base.ViewManagerAction = openerp.base.ViewManager.extend({
init: function(session, element_id, action) {
var dataset;
- if(!action.res_id) {
- dataset = new openerp.base.DataSetSearch(session, action.res_model);
+ if (!action.res_id) {
+ dataset = new openerp.base.DataSetSearch(session, action.res_model, action.context || null);
} else {
- dataset = new openerp.base.DataSetStatic(session, action.res_model);
- dataset.ids = [action.res_id];
- dataset.count = 1;
+ dataset = new openerp.base.DataSetStatic(session, action.res_model, {}, [action.res_id]);
+ if (action.context) {
+ // TODO fme: should normalize all DataSets constructors to (session, model, context, ...)
+ dataset.context = action.context;
+ }
}
this._super(session, element_id, dataset, action.views);
this.action = action;
@@ -336,16 +356,12 @@ openerp.base.Sidebar = openerp.base.BaseWidget.extend({
},
do_refresh: function(new_view) {
var view = this.view_manager.active_view;
- the_condition = this.sections.length > 0 && _.detect(this.sections,
+ var the_condition = this.sections.length > 0 && _.detect(this.sections,
function(x) {return x.elements.length > 0;}) != undefined
&& (!new_view || view != 'list');
- if (!the_condition) {
- this.$element.addClass('closed-sidebar');
- this.$element.removeClass('open-sidebar');
- } else {
- this.$element.addClass('open-sidebar');
- this.$element.removeClass('closed-sidebar');
- }
+
+ this.$element.toggleClass('open-sidebar', the_condition)
+ .toggleClass('closed-sidebar', !the_condition);
this.$element.html(QWeb.render("ViewManager.sidebar.internal", { sidebar: this, view: view }));
@@ -409,14 +425,17 @@ openerp.base.View = openerp.base.Controller.extend({
* @param {Object} [record_id] the identifier of the object on which the action is to be applied
* @param {Function} on_no_action callback to execute if the action does not generate any result (no new action)
*/
- execute_action: function (action_data, dataset, action_manager, record_id, on_no_action) {
+ execute_action: function (action_data, dataset, action_manager, record_id, on_no_action, on_closed) {
+ var self = this;
var handler = function (r) {
var action = r.result;
if (action && action.constructor == Object) {
action.context = action.context || {};
- action.context['active_id'] = dataset.ids[dataset.index];
- action.context['active_ids'] = [dataset.ids[dataset.index]];
- action.context['active_model'] = dataset.model;
+ _.extend(action.context, {
+ active_id: record_id || false,
+ active_ids: [record_id || false],
+ active_model: dataset.model
+ });
action.flags = {
sidebar : false,
search_view : false,
@@ -424,7 +443,12 @@ openerp.base.View = openerp.base.Controller.extend({
action_buttons : false,
pager : false
};
- action_manager.do_action(action);
+ action_manager.do_action(action, on_closed);
+ if (self.view_manager.is_dialog && action.type != 'ir.actions.act_window_close') {
+ handler({
+ result : { type: 'ir.actions.act_window_close' }
+ });
+ }
} else {
on_no_action(action);
}
@@ -432,13 +456,13 @@ openerp.base.View = openerp.base.Controller.extend({
if (action_data.special) {
handler({
- result : { type: 'ir.actions.act_window_close' }
+ result : { type: 'ir.actions.act_window_close', special: action_data.special }
});
} else {
- var context = new openerp.base.CompoundContext(dataset.context).add(action_data.context || {});
+ var context = new openerp.base.CompoundContext(dataset.context, action_data.context || {});
switch(action_data.type) {
case 'object':
- return dataset.call_and_eval(action_data.name, [[record_id], context], null, 1, handler);
+ return dataset.call_button(action_data.name, [[record_id], context], handler);
case 'action':
return this.rpc('/base/action/load', { action_id: parseInt(action_data.name, 10), context: context }, handler);
default:
@@ -476,7 +500,7 @@ openerp.base.json_node_to_xml = function(node, single_quote, indent) {
throw("Node a json node");
}
indent = indent || 0;
- var sindent = Array(indent + 1).join('\t'),
+ var sindent = new Array(indent + 1).join('\t'),
r = sindent + '<' + node.tag;
for (var attr in node.attrs) {
var vattr = node.attrs[attr];
diff --git a/addons/base/static/src/xml/base.xml b/addons/base/static/src/xml/base.xml
index f703f4fcea9..6e1be85491f 100644
--- a/addons/base/static/src/xml/base.xml
+++ b/addons/base/static/src/xml/base.xml
@@ -499,6 +499,9 @@
<t t-if="widget.string and widget.node.tag != 'label'">:</t>
</label>
</t>
+<t t-name="WidgetParagraph">
+ <p class="oe_form_paragraph"><t t-esc="widget.string"/></p>
+</t>
<t t-name="FieldChar">
<input type="text"
t-att-name="widget.name"