summaryrefslogtreecommitdiff
path: root/addons/web/static/src
diff options
context:
space:
mode:
authorJiten (OpenERP) <jra@tinyerp.com>2011-10-12 14:39:58 +0530
committerJiten (OpenERP) <jra@tinyerp.com>2011-10-12 14:39:58 +0530
commitd7933e221113110f6e2cf97041f711c7a3cede1d (patch)
treeb45e46d834307bab66ad4ad0381407556793afea /addons/web/static/src
parent77ad674798fbb82c364a82341763614aaede686d (diff)
parent048cfa7804759c6b3fb952983451165fb319bc80 (diff)
[Merge] merge from openerp-web.
bzr revid: jra@tinyerp.com-20111012090958-3c5xp3e8viplb84f
Diffstat (limited to 'addons/web/static/src')
-rw-r--r--addons/web/static/src/css/base.css16
-rw-r--r--addons/web/static/src/img/box-a-header-a.gifbin0 -> 91 bytes
-rw-r--r--addons/web/static/src/js/core.js1
-rw-r--r--addons/web/static/src/js/data.js48
-rw-r--r--addons/web/static/src/js/search.js14
-rw-r--r--addons/web/static/src/js/view_form.js190
-rw-r--r--addons/web/static/src/js/view_list.js6
-rw-r--r--addons/web/static/src/js/view_list_editable.js1
-rw-r--r--addons/web/static/src/js/view_tree.js42
-rw-r--r--addons/web/static/src/js/views.js12
-rw-r--r--addons/web/static/src/xml/base.xml8
11 files changed, 237 insertions, 101 deletions
diff --git a/addons/web/static/src/css/base.css b/addons/web/static/src/css/base.css
index 7bcf65ec3da..6e38d16d26e 100644
--- a/addons/web/static/src/css/base.css
+++ b/addons/web/static/src/css/base.css
@@ -300,7 +300,7 @@ label.error {
text-shadow: 0 1px 0 #333;
text-align: center;
font-size: 18px;
- line-height: 14px;
+ line-height: 18px;
right: 0;
}
.openerp .secondary_menu.oe_folded .oe_toggle_secondary_menu {
@@ -325,6 +325,7 @@ label.error {
background: #5A5858;
vertical-align: top;
height: 100%;
+ display: block;
position: relative;
}
.openerp .secondary_menu.oe_folded {
@@ -721,11 +722,15 @@ label.error {
.openerp .oe-listview .oe-field-cell {
cursor: pointer;
}
+.openerp .oe-listview .oe-field-cell progress {
+ width: 100%;
+}
.openerp .oe-listview .oe-field-cell button {
+ margin: 0;
padding: 0;
border: none;
background: none;
- width: 100%;
+ width: 16px;
}
.openerp .oe-listview .oe-field-cell button:active {
opacity: 0.5;
@@ -767,6 +772,10 @@ label.error {
.openerp .oe-listview .oe-list-footer span {
margin: 0 1em;
}
+.openerp .oe-listview .oe-list-footer progress {
+ vertical-align:-10% !important;
+ width: 100%;
+}
/** list rounded corners
@@ -828,6 +837,9 @@ label.error {
}
/* Form */
+.openerp .oe_frame.oe_forms {
+ clear: both;
+}
.openerp table.oe_frame td {
color: #4c4c4c;
}
diff --git a/addons/web/static/src/img/box-a-header-a.gif b/addons/web/static/src/img/box-a-header-a.gif
new file mode 100644
index 00000000000..6b461b42bfe
--- /dev/null
+++ b/addons/web/static/src/img/box-a-header-a.gif
Binary files differ
diff --git a/addons/web/static/src/js/core.js b/addons/web/static/src/js/core.js
index da9c21bf551..0d5b95ef669 100644
--- a/addons/web/static/src/js/core.js
+++ b/addons/web/static/src/js/core.js
@@ -74,6 +74,7 @@ openerp.web.qweb.debug = (window.location.search.indexOf('?debug') !== -1);
}
return this;
}
+ // This should NOT be used, like callbackenable it's too hackish not enough javasish
Class.include = function (properties) {
for (var name in properties) {
if (typeof properties[name] !== 'function'
diff --git a/addons/web/static/src/js/data.js b/addons/web/static/src/js/data.js
index fcf6a65dcf5..ea0824fb1df 100644
--- a/addons/web/static/src/js/data.js
+++ b/addons/web/static/src/js/data.js
@@ -613,11 +613,11 @@ openerp.web.BufferedDataSet = openerp.web.DataSetStatic.extend({
create: function(data, callback, error_callback) {
var cached = {id:_.uniqueId(this.virtual_id_prefix), values: data,
defaults: this.last_default_get};
- this.to_create.push(cached);
+ this.to_create.push(_.extend(_.clone(cached), {values: _.clone(cached.values)}));
this.cache.push(cached);
this.on_change();
var prom = $.Deferred().then(callback);
- setTimeout(function() {prom.resolve({result: cached.id});}, 0);
+ prom.resolve({result: cached.id});
return prom.promise();
},
write: function (id, data, options, callback) {
@@ -639,6 +639,10 @@ openerp.web.BufferedDataSet = openerp.web.DataSetStatic.extend({
self.to_write.push(record);
}
var cached = _.detect(this.cache, function(x) {return x.id === id;});
+ if (!cached) {
+ cached = {id: id, values: {}};
+ this.cache.push(cached);
+ }
$.extend(cached.values, record.values);
if (dirty)
this.on_change();
@@ -695,7 +699,7 @@ openerp.web.BufferedDataSet = openerp.web.DataSetStatic.extend({
throw "Record not correctly loaded";
}
}
- setTimeout(function () {completion.resolve(records);}, 0);
+ completion.resolve(records);
};
if(to_get.length > 0) {
var rpc_promise = this._super(to_get, fields, function(records) {
@@ -720,27 +724,51 @@ openerp.web.BufferedDataSet = openerp.web.DataSetStatic.extend({
});
openerp.web.BufferedDataSet.virtual_id_regex = /^one2many_v_id_.*$/;
-openerp.web.ReadOnlyDataSetSearch = openerp.web.DataSetSearch.extend({
+openerp.web.ProxyDataSet = openerp.web.DataSetSearch.extend({
+ init: function() {
+ this._super.apply(this, arguments);
+ this.create_function = null;
+ this.write_function = null;
+ this.read_function = null;
+ },
+ read_ids: function () {
+ if (this.read_function) {
+ return this.read_function.apply(null, arguments);
+ } else {
+ return this._super.apply(this, arguments);
+ }
+ },
default_get: function(fields, callback) {
return this._super(fields, callback).then(this.on_default_get);
},
on_default_get: function(result) {},
create: function(data, callback, error_callback) {
this.on_create(data);
- var to_return = $.Deferred().then(callback);
- setTimeout(function () {to_return.resolve({"result": undefined});}, 0);
- return to_return.promise();
+ if (this.create_function) {
+ return this.create_function(data, callback, error_callback);
+ } else {
+ console.warn("trying to create a record using default proxy dataset behavior");
+ var to_return = $.Deferred().then(callback);
+ setTimeout(function () {to_return.resolve({"result": undefined});}, 0);
+ return to_return.promise();
+ }
},
on_create: function(data) {},
write: function (id, data, options, callback) {
this.on_write(id, data);
- var to_return = $.Deferred().then(callback);
- setTimeout(function () {to_return.resolve({"result": true});}, 0);
- return to_return.promise();
+ if (this.write_function) {
+ return this.write_function(id, data, options, callback);
+ } else {
+ console.warn("trying to write a record using default proxy dataset behavior");
+ var to_return = $.Deferred().then(callback);
+ setTimeout(function () {to_return.resolve({"result": true});}, 0);
+ return to_return.promise();
+ }
},
on_write: function(id, data) {},
unlink: function(ids, callback, error_callback) {
this.on_unlink(ids);
+ console.warn("trying to unlink a record using default proxy dataset behavior");
var to_return = $.Deferred().then(callback);
setTimeout(function () {to_return.resolve({"result": true});}, 0);
return to_return.promise();
diff --git a/addons/web/static/src/js/search.js b/addons/web/static/src/js/search.js
index 5f88b9a1512..9cab0ade9d0 100644
--- a/addons/web/static/src/js/search.js
+++ b/addons/web/static/src/js/search.js
@@ -784,6 +784,20 @@ openerp.web.search.SelectionField = openerp.web.search.Field.extend(/** @lends o
var value = this.attrs.selection[index][0];
if (value === false) { return null; }
return value;
+ },
+ /**
+ * The selection field needs a default ``false`` value in case none is
+ * provided, so that selector options with a ``false`` value (convention
+ * for explicitly empty options) get selected by default rather than the
+ * first (value-holding) option in the selection.
+ *
+ * @param {Object} defaults search default values
+ */
+ render: function (defaults) {
+ if (!defaults[this.attrs.name]) {
+ defaults[this.attrs.name] = false;
+ }
+ return this._super(defaults);
}
});
openerp.web.search.BooleanField = openerp.web.search.SelectionField.extend(/** @lends openerp.web.search.BooleanField# */{
diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js
index b4eba509018..c940f4909e9 100644
--- a/addons/web/static/src/js/view_form.js
+++ b/addons/web/static/src/js/view_form.js
@@ -11,6 +11,7 @@ openerp.web.FormView = openerp.web.View.extend( /** @lends openerp.web.FormView#
*/
searchable: false,
form_template: "FormView",
+ identifier_prefix: 'formview-',
/**
* @constructs openerp.web.FormView
* @extends openerp.web.View
@@ -43,6 +44,7 @@ openerp.web.FormView = openerp.web.View.extend( /** @lends openerp.web.FormView#
this.translatable_fields = [];
_.defaults(this.options, {"always_show_new_button": true,
"not_interactible_on_create": false});
+ this.save_lock = $.Deferred().resolve();
},
start: function() {
this._super();
@@ -364,42 +366,45 @@ openerp.web.FormView = openerp.web.View.extend( /** @lends openerp.web.FormView#
*/
do_save: function(success, prepend_on_create) {
var self = this;
- if (!this.ready) {
- return $.Deferred().reject();
- }
- var form_dirty = false,
- form_invalid = false,
- values = {},
- first_invalid_field = null;
- for (var f in this.fields) {
- f = this.fields[f];
- if (!f.is_valid()) {
- form_invalid = true;
- f.update_dom();
- if (!first_invalid_field) {
- first_invalid_field = f;
+ var action = function() {
+ if (!self.ready) {
+ return $.Deferred().reject();
+ }
+ var form_dirty = false,
+ form_invalid = false,
+ values = {},
+ first_invalid_field = null;
+ for (var f in self.fields) {
+ f = self.fields[f];
+ if (!f.is_valid()) {
+ form_invalid = true;
+ f.update_dom();
+ if (!first_invalid_field) {
+ first_invalid_field = f;
+ }
+ } else if (f.is_dirty()) {
+ form_dirty = true;
+ values[f.name] = f.get_value();
}
- } else if (f.is_dirty()) {
- form_dirty = true;
- values[f.name] = f.get_value();
}
- }
- if (form_invalid) {
- first_invalid_field.focus();
- this.on_invalid();
- return $.Deferred().reject();
- } else {
- console.log("About to save", values);
- if (!this.datarecord.id) {
- return this.dataset.create(values).pipe(function(r) {
- return self.on_created(r, undefined, prepend_on_create);
- }).then(success);
+ if (form_invalid) {
+ first_invalid_field.focus();
+ self.on_invalid();
+ return $.Deferred().reject();
} else {
- return this.dataset.write(this.datarecord.id, values, {}).pipe(function(r) {
- return self.on_saved(r);
- }).then(success);
+ console.log("About to save", values);
+ if (!self.datarecord.id) {
+ return self.dataset.create(values).pipe(function(r) {
+ return self.on_created(r, undefined, prepend_on_create);
+ }).then(success);
+ } else {
+ return self.dataset.write(self.datarecord.id, values, {}).pipe(function(r) {
+ return self.on_saved(r);
+ }).then(success);
+ }
}
- }
+ };
+ this.save_lock = this.save_lock.pipe(action, action);
},
do_save_edit: function() {
this.do_save();
@@ -424,8 +429,7 @@ openerp.web.FormView = openerp.web.View.extend( /** @lends openerp.web.FormView#
// should not happen in the server, but may happen for internal purpose
return $.Deferred().reject();
} else {
- this.reload();
- return $.Deferred().then(success).resolve(r);
+ return this.reload().then(success);
}
},
/**
@@ -459,8 +463,9 @@ openerp.web.FormView = openerp.web.View.extend( /** @lends openerp.web.FormView#
this.sidebar.attachments.do_update();
}
console.debug("The record has been created with id #" + this.datarecord.id);
- this.reload();
- return $.Deferred().then(success).resolve(_.extend(r, {created: true}));
+ return this.reload().pipe(function() {
+ return _.extend(r, {created: true});
+ }).then(success);
}
},
on_action: function (action) {
@@ -471,9 +476,9 @@ openerp.web.FormView = openerp.web.View.extend( /** @lends openerp.web.FormView#
},
reload: function() {
if (this.dataset.index == null || this.dataset.index < 0) {
- this.on_button_new();
+ return $.when(this.on_button_new());
} else {
- this.dataset.read_index(_.keys(this.fields_view.fields), this.on_record_loaded);
+ return this.dataset.read_index(_.keys(this.fields_view.fields), this.on_record_loaded);
}
},
get_fields_values: function() {
@@ -755,6 +760,10 @@ openerp.web.form.WidgetFrame = openerp.web.form.Widget.extend({
var type = {};
if (node.tag == 'field') {
type = this.view.fields_view.fields[node.attrs.name] || {};
+ if (node.attrs.widget == 'statusbar') {
+ // This way we can retain backward compatibility between addons and old clients
+ node.attrs.nolabel = '1';
+ }
}
var widget = new (this.view.registry.get_any(
[node.attrs.widget, type.type, node.tag])) (this.view, node);
@@ -809,7 +818,7 @@ openerp.web.form.WidgetNotebook = openerp.web.form.Widget.extend({
page.id = self.pages[index].element_id;
});
this.$element.tabs();
- this.view.on_button_new.add_last(this.do_select_first_visible_tab);
+ this.view.on_button_new.add_first(this.do_select_first_visible_tab);
},
do_select_first_visible_tab: function() {
for (var i = 0; i < this.pages.length; i++) {
@@ -1083,7 +1092,11 @@ openerp.web.form.Field = openerp.web.form.Widget.extend(/** @lends openerp.web.f
* the fields'context with the action's context.
*/
build_context: function() {
- var f_context = this.field.context || null;
+ var f_context = this.field.context || {};
+ if (!!f_context.__ref) {
+ var fields_values = this._build_eval_context();
+ f_context = new openerp.web.CompoundDomain(f_context).set_eval_context(fields_values);
+ }
// maybe the default_get should only be used when we do a default_get?
var v_contexts = _.compact([this.node.attrs.default_get || null,
this.node.attrs.context || null]);
@@ -1098,14 +1111,15 @@ openerp.web.form.Field = openerp.web.form.Widget.extend(/** @lends openerp.web.f
return ctx;
},
build_domain: function() {
- var f_domain = this.field.domain || null;
- var v_domain = this.node.attrs.domain || [];
- if (!(v_domain instanceof Array) || true) { //TODO niv: remove || true
+ var f_domain = this.field.domain || [];
+ var n_domain = this.node.attrs.domain || null;
+ // if there is a domain on the node, overrides the model's domain
+ var final_domain = n_domain !== null ? n_domain : f_domain;
+ if (!(final_domain instanceof Array)) {
var fields_values = this._build_eval_context();
- v_domain = new openerp.web.CompoundDomain(v_domain).set_eval_context(fields_values);
+ final_domain = new openerp.web.CompoundDomain(final_domain).set_eval_context(fields_values);
}
- // if there is a domain on the node, overrides the model's domain
- return f_domain || v_domain;
+ return final_domain;
}
});
@@ -1897,6 +1911,8 @@ openerp.web.form.FieldOne2Many = openerp.web.form.Field.extend({
self.save_form_view();
});
controller.$element.find(".oe_form_button_save_edit").hide();
+ } else if (view_type == "graph") {
+ self.reload_current_view()
}
self.is_started.resolve();
});
@@ -1919,6 +1935,8 @@ openerp.web.form.FieldOne2Many = openerp.web.form.Field.extend({
this.form_last_update.then(function() {
this.form_last_update = view.do_show();
});
+ } else if (self.viewmanager.active_view === "graph") {
+ view.do_search(this.build_domain(), this.dataset.get_context(), []);
}
},
set_value: function(value) {
@@ -2063,11 +2081,14 @@ openerp.web.form.One2ManyListView = openerp.web.ListView.extend({
pop.select_element(self.o2m.field.relation,{
initial_view: "form",
alternative_form_view: self.o2m.field.views ? self.o2m.field.views["form"] : undefined,
- create_function: function(data) {
- return self.o2m.dataset.create(data, function(r) {
+ create_function: function(data, callback, error_callback) {
+ return self.o2m.dataset.create(data).then(function(r) {
self.o2m.dataset.set_ids(self.o2m.dataset.ids.concat([r.result]));
self.o2m.dataset.on_change();
- });
+ }).then(callback, error_callback);
+ },
+ read_function: function() {
+ return self.o2m.dataset.read_ids.apply(self.o2m.dataset, arguments);
},
parent_view: self.o2m.view,
form_view_options: {'not_interactible_on_create':true}
@@ -2204,6 +2225,7 @@ openerp.web.form.SelectCreatePopup = openerp.web.OldWidget.extend(/** @lends ope
* - parent_view
* - form_view_options
* - list_view_options
+ * - read_function
*/
select_element: function(model, options, domain, context) {
var self = this;
@@ -2212,7 +2234,7 @@ openerp.web.form.SelectCreatePopup = openerp.web.OldWidget.extend(/** @lends ope
this.context = context || {};
this.options = _.defaults(options || {}, {"initial_view": "search", "create_function": function() {
return self.create_row.apply(self, arguments);
- }});
+ }, read_function: null});
this.initial_ids = this.options.initial_ids;
this.created_elements = [];
openerp.web.form.dialog(this.render(), {close:function() {
@@ -2222,8 +2244,18 @@ openerp.web.form.SelectCreatePopup = openerp.web.OldWidget.extend(/** @lends ope
},
start: function() {
this._super();
- this.dataset = new openerp.web.ReadOnlyDataSetSearch(this, this.model,
+ var self = this;
+ this.dataset = new openerp.web.ProxyDataSet(this, this.model,
this.context);
+ this.dataset.create_function = function() {
+ return self.options.create_function.apply(null, arguments).then(function(r) {
+ self.created_elements.push(r.result);
+ });
+ };
+ this.dataset.write_function = function() {
+ return self.write_row.apply(self, arguments);
+ };
+ this.dataset.read_function = this.options.read_function;
this.dataset.parent_view = this.options.parent_view;
this.dataset.on_default_get.add(this.on_default_get);
if (this.options.initial_view == "search") {
@@ -2288,11 +2320,17 @@ openerp.web.form.SelectCreatePopup = openerp.web.OldWidget.extend(/** @lends ope
self.view_list.do_search(results.domain, results.context, results.group_by);
});
},
- create_row: function(data) {
+ create_row: function() {
+ var self = this;
+ var wdataset = new openerp.web.DataSetSearch(this, this.model, this.context, this.domain);
+ wdataset.parent_view = this.options.parent_view;
+ return wdataset.create.apply(wdataset, arguments);
+ },
+ write_row: function() {
var self = this;
var wdataset = new openerp.web.DataSetSearch(this, this.model, this.context, this.domain);
wdataset.parent_view = this.options.parent_view;
- return wdataset.create(data);
+ return wdataset.write.apply(wdataset, arguments);
},
on_select_elements: function(element_ids) {
},
@@ -2323,33 +2361,21 @@ openerp.web.form.SelectCreatePopup = openerp.web.OldWidget.extend(/** @lends ope
$buttons.html(QWeb.render("SelectCreatePopup.form.buttons", {widget:self}));
var $nbutton = $buttons.find(".oe_selectcreatepopup-form-save-new");
$nbutton.click(function() {
- self._created = $.Deferred().then(function() {
- self._created = undefined;
+ $.when(self.view_form.do_save()).then(function() {
self.view_form.on_button_new();
});
- self.view_form.do_save();
});
var $nbutton = $buttons.find(".oe_selectcreatepopup-form-save");
$nbutton.click(function() {
- self._created = $.Deferred().then(function() {
- self._created = undefined;
+ $.when(self.view_form.do_save()).then(function() {
self.check_exit();
});
- self.view_form.do_save();
});
var $cbutton = $buttons.find(".oe_selectcreatepopup-form-close");
$cbutton.click(function() {
self.check_exit();
});
});
- this.dataset.on_create.add(function(data) {
- self.options.create_function(data).then(function(r) {
- self.created_elements.push(r.result);
- if (self._created) {
- self._created.resolve();
- }
- });
- });
this.view_form.do_show();
},
check_exit: function() {
@@ -2446,7 +2472,7 @@ openerp.web.form.FormOpenPopup = openerp.web.OldWidget.extend(/** @lends openerp
}
});
-openerp.web.form.FormOpenDataset = openerp.web.ReadOnlyDataSetSearch.extend({
+openerp.web.form.FormOpenDataset = openerp.web.ProxyDataSet.extend({
read_ids: function() {
if (this.fop.options.read_function) {
return this.fop.options.read_function.apply(null, arguments);
@@ -2472,6 +2498,9 @@ openerp.web.form.FieldReference = openerp.web.form.Field.extend({
};
this.get_fields_values = view.get_fields_values;
this.do_onchange = this.on_form_changed = this.on_nop;
+ this.dataset = this.view.dataset;
+ this.widgets_counter = 0;
+ this.view_id = 'reference_' + _.uniqueId();
this.widgets = {};
this.fields = {};
this.selection = new openerp.web.form.FieldSelection(this, { attrs: {
@@ -2487,8 +2516,10 @@ openerp.web.form.FieldReference = openerp.web.form.Field.extend({
on_nop: function() {
},
on_selection_changed: function() {
- this.m2o.field.relation = this.selection.get_value();
+ var sel = this.selection.get_value();
+ this.m2o.field.relation = sel;
this.m2o.set_value(null);
+ this.m2o.$element.toggle(sel !== false);
},
start: function() {
this._super();
@@ -2532,10 +2563,6 @@ openerp.web.form.FieldBinary = openerp.web.form.Field.extend({
this.$element.find('button.oe-binary-file-save').click(this.on_save_as);
this.$element.find('.oe-binary-file-clear').click(this.on_clear);
},
- update_dom: function() {
- this._super.apply(this, arguments);
- this.$element.find('.oe-binary').toggle(!this.readonly);
- },
human_filesize : function(size) {
var units = ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];
var i = 0;
@@ -2553,12 +2580,10 @@ openerp.web.form.FieldBinary = openerp.web.form.Field.extend({
if ($(e.target).val() != '') {
this.$element.find('form.oe-binary-form input[name=session_id]').val(this.session.session_id);
this.$element.find('form.oe-binary-form').submit();
- this.toggle_progress();
+ this.$element.find('.oe-binary-progress').show();
+ this.$element.find('.oe-binary').hide();
}
},
- toggle_progress: function() {
- this.$element.find('.oe-binary-progress, .oe-binary').toggle();
- },
on_file_uploaded: function(size, name, content_type, file_base64) {
delete(window[this.iframe]);
if (size === false) {
@@ -2569,7 +2594,8 @@ openerp.web.form.FieldBinary = openerp.web.form.Field.extend({
this.on_file_uploaded_and_valid.apply(this, arguments);
this.on_ui_change();
}
- this.toggle_progress();
+ this.$element.find('.oe-binary-progress').hide();
+ this.$element.find('.oe-binary').show();
},
on_file_uploaded_and_valid: function(size, name, content_type, file_base64) {
},
@@ -2595,6 +2621,10 @@ openerp.web.form.FieldBinary = openerp.web.form.Field.extend({
openerp.web.form.FieldBinaryFile = openerp.web.form.FieldBinary.extend({
template: 'FieldBinaryFile',
+ update_dom: function() {
+ this._super.apply(this, arguments);
+ this.$element.find('.oe-binary-file-set, .oe-binary-file-clear').toggle(!this.readonly);
+ },
set_value: function(value) {
this._super.apply(this, arguments);
var show_value = (value != null && value !== false) ? value : '';
@@ -2627,6 +2657,10 @@ openerp.web.form.FieldBinaryImage = openerp.web.form.FieldBinary.extend({
this._super.apply(this, arguments);
this.$image = this.$element.find('img.oe-binary-image');
},
+ update_dom: function() {
+ this._super.apply(this, arguments);
+ this.$element.find('.oe-binary').toggle(!this.readonly);
+ },
set_value: function(value) {
this._super.apply(this, arguments);
this.set_image_maxwidth();
diff --git a/addons/web/static/src/js/view_list.js b/addons/web/static/src/js/view_list.js
index bb7b50244d8..0ea1f7ec944 100644
--- a/addons/web/static/src/js/view_list.js
+++ b/addons/web/static/src/js/view_list.js
@@ -471,6 +471,7 @@ openerp.web.ListView = openerp.web.View.extend( /** @lends openerp.web.ListView#
_(ids).each(function (id) {
self.records.remove(self.records.get(id));
});
+ self.configure_pager(self.dataset);
self.compute_aggregates();
});
},
@@ -1150,7 +1151,8 @@ openerp.web.ListView.Groups = openerp.web.Class.extend( /** @lends openerp.web.L
var fields = _.pluck(_.select(this.columns, function(x) {return x.tag == "field"}), 'name');
var options = { offset: page * limit, limit: limit };
- dataset.read_slice(fields, options , function (records) {
+ //TODO xmo: investigate why we need to put the setTimeout
+ setTimeout(function() {dataset.read_slice(fields, options , function (records) {
if (!self.datagroup.openable) {
view.configure_pager(dataset);
} else {
@@ -1169,7 +1171,7 @@ openerp.web.ListView.Groups = openerp.web.Class.extend( /** @lends openerp.web.L
self.records.add(records, {silent: true});
list.render();
d.resolve(list);
- });
+ });}, 0);
return d.promise();
},
setup_resequence_rows: function (list, dataset) {
diff --git a/addons/web/static/src/js/view_list_editable.js b/addons/web/static/src/js/view_list_editable.js
index dc49c20209c..826508eaa27 100644
--- a/addons/web/static/src/js/view_list_editable.js
+++ b/addons/web/static/src/js/view_list_editable.js
@@ -22,6 +22,7 @@ openerp.web.list_editable = function (openerp) {
if (self.groups.get_selection().length) {
return;
}
+ self.configure_pager(self.dataset);
self.compute_aggregates();
}
})
diff --git a/addons/web/static/src/js/view_tree.js b/addons/web/static/src/js/view_tree.js
index 7988d65805c..78818c069c0 100644
--- a/addons/web/static/src/js/view_tree.js
+++ b/addons/web/static/src/js/view_tree.js
@@ -32,6 +32,8 @@ openerp.web.TreeView = openerp.web.View.extend(/** @lends openerp.web.TreeView#
this.records = {};
this.options = _.extend({}, this.defaults, options || {});
+
+ _.bindAll(this, 'color_for');
},
start: function () {
@@ -107,6 +109,43 @@ openerp.web.TreeView = openerp.web.View.extend(/** @lends openerp.web.TreeView#
$select.change();
}
});
+
+ if (this.fields_view.arch.attrs.colors) {
+ return;
+ }
+ this.colors = _(this.fields_view.arch.attrs.colors.split(';')).chain()
+ .compact()
+ .map(function(color_pair) {
+ var pair = color_pair.split(':'),
+ color = pair[0],
+ expr = pair[1];
+ return [color, py.parse(py.tokenize(expr)), expr];
+ }).value();
+ },
+ /**
+ * Returns the color for the provided record in the current view (from the
+ * ``@colors`` attribute)
+ *
+ * @param {Object} record record for the current row
+ * @returns {String} CSS color declaration
+ */
+ color_for: function (record) {
+ if (!this.colors) { return ''; }
+ var context = _.extend({}, record, {
+ uid: this.session.uid,
+ current_date: new Date().toString('yyyy-MM-dd')
+ // TODO: time, datetime, relativedelta
+ });
+ for(var i=0, len=this.colors.length; i<len; ++i) {
+ var pair = this.colors[i],
+ color = pair[0],
+ expression = pair[1];
+ if (py.evaluate(expression, context)) {
+ return 'color: ' + color + ';';
+ }
+ // TODO: handle evaluation errors
+ }
+ return '';
},
/**
* Sets up opening a row
@@ -159,7 +198,8 @@ openerp.web.TreeView = openerp.web.View.extend(/** @lends openerp.web.TreeView#
'fields_view': self.fields_view.arch.children,
'fields': self.fields,
'level': $curr_node.data('level') || 0,
- 'render': openerp.web.format_value
+ 'render': openerp.web.format_value,
+ 'color_for': self.color_for
});
if ($curr_node.length) {
diff --git a/addons/web/static/src/js/views.js b/addons/web/static/src/js/views.js
index 46091fa91b7..f996b4149ed 100644
--- a/addons/web/static/src/js/views.js
+++ b/addons/web/static/src/js/views.js
@@ -68,9 +68,11 @@ db.web.ActionManager = db.web.Widget.extend({
},
on_url_hashchange: function(url) {
var self = this;
- self.rpc("/web/action/load", { action_id: url.action_id }, function(result) {
- self.do_action(result.result);
- });
+ if(url && url.action_id) {
+ self.rpc("/web/action/load", { action_id: url.action_id }, function(result) {
+ self.do_action(result.result);
+ });
+ }
},
do_action: function(action, on_close) {
var type = action.type.replace(/\./g,'_');
@@ -771,7 +773,9 @@ db.web.View = db.web.Widget.extend(/** @lends db.web.View# */{
var self = this;
var result_handler = function () {
if (on_closed) { on_closed.apply(null, arguments); }
- return self.widget_parent.on_action_executed.apply(null, arguments);
+ if (self.widget_parent && self.widget_parent.on_action_executed) {
+ return self.widget_parent.on_action_executed.apply(null, arguments);
+ }
};
var handler = function (r) {
var action = r.result;
diff --git a/addons/web/static/src/xml/base.xml b/addons/web/static/src/xml/base.xml
index 0e5c97c4707..c58e08474c8 100644
--- a/addons/web/static/src/xml/base.xml
+++ b/addons/web/static/src/xml/base.xml
@@ -447,8 +447,8 @@
</blockquote>
<a class="oe-shortcut-toggle" title="Add / Remove Shortcut..."
href="javascript: void(0)"> </a>
- <h2 class="oe_view_title">
- <t t-esc="self.action.name"/>
+ <h2 class="oe_view_title" t-if="self.session.debug || self.flags.display_title !==false">
+ <t t-if="self.flags.display_title !==false" t-esc="self.action.name"/>
<button t-if="self.session.debug" class="oe_get_xml_view">
View#<span></span>
</button>
@@ -539,7 +539,7 @@
<td t-foreach="fields_view" t-as="field"
t-if="!field.attrs.modifiers.tree_invisible"
t-att-data-id="record.id"
- t-att-style="!field_index ? 'background-position: ' + 19*level + 'px; padding-left: ' + 19*level + 'px' : undefined"
+ t-att-style="color_for(record) + (!field_index ? 'background-position: ' + 19*level + 'px; padding-left: ' + 19*level + 'px;' : '')"
t-att-class="!field_index and has_children ? 'treeview-tr' : 'treeview-td'">
<span t-if="!field.attrs.modifiers.invisible">
<t t-esc="render(record[field.attrs.name], fields[field.attrs.name])" />
@@ -878,7 +878,7 @@
<td t-attf-class="oe_form_frame_cell oe_form_selection #{widget.selection.element_class}">
<t t-raw="widget.selection.render()"/>
</td>
- <td class="oe_form_frame_cell oe_form_many2one #{widget.selection.element_class}" nowrap="true">
+ <td t-attf-class="oe_form_frame_cell oe_form_many2one #{widget.m2o.element_class}" nowrap="true" style="display: none">
<t t-raw="widget.m2o.render()"/>
</td>
</tr>