summaryrefslogtreecommitdiff
path: root/addons/web/static/src/js
diff options
context:
space:
mode:
authorChristophe Simonis <chs@odoo.com>2018-03-20 11:45:11 +0100
committerChristophe Simonis <chs@odoo.com>2018-03-20 11:45:11 +0100
commite0345a4a3f4cfa8f4de8723c6b72b741b06483a1 (patch)
tree5ad51dbebfd89cd7e56bf12df2da3ecf4d8e9509 /addons/web/static/src/js
parente9db6b6d9de1e0589e8871ca2e5e8dde8ec8cab7 (diff)
parent2835d299792ffa925d86ad3460057be713ac4fac (diff)
[MERGE] forward port branch 11.0 up to 2835d299792
Diffstat (limited to 'addons/web/static/src/js')
-rw-r--r--addons/web/static/src/js/chrome/menu.js17
-rw-r--r--addons/web/static/src/js/chrome/web_client.js4
-rw-r--r--addons/web/static/src/js/fields/basic_fields.js5
-rw-r--r--addons/web/static/src/js/fields/relational_fields.js29
-rw-r--r--addons/web/static/src/js/views/basic/basic_model.js19
-rw-r--r--addons/web/static/src/js/views/form/form_renderer.js4
-rw-r--r--addons/web/static/src/js/views/view_dialogs.js1
7 files changed, 65 insertions, 14 deletions
diff --git a/addons/web/static/src/js/chrome/menu.js b/addons/web/static/src/js/chrome/menu.js
index 1e5e2922186..1e253ba54f7 100644
--- a/addons/web/static/src/js/chrome/menu.js
+++ b/addons/web/static/src/js/chrome/menu.js
@@ -147,15 +147,22 @@ var Menu = Widget.extend({
});
},
/**
- * Call open_menu with the first menu_item matching an action_id
+ * Call open_menu on a menu_item that matches the action_id
+ *
+ * If `menuID` is a match on this action, open this menu_item.
+ * Otherwise open the first menu_item that matches the action_id.
*
* @param {Number} id the action_id to match
+ * @param {Number} [menuID] a menu ID that may match with provided action
*/
- open_action: function (id) {
+ open_action: function (id, menuID) {
var $menu = this.$el.add(this.$secondary_menus).find('a[data-action-id="' + id + '"]');
- var menu_id = $menu.data('menu');
- if (menu_id) {
- this.open_menu(menu_id);
+ if (!(menuID && $menu.filter("[data-menu='" + menuID + "']").length)) {
+ // menuID doesn't match action, so pick first menu_item
+ menuID = $menu.data('menu');
+ }
+ if (menuID) {
+ this.open_menu(menuID);
}
},
/**
diff --git a/addons/web/static/src/js/chrome/web_client.js b/addons/web/static/src/js/chrome/web_client.js
index 76aadf49463..db440cd742f 100644
--- a/addons/web/static/src/js/chrome/web_client.js
+++ b/addons/web/static/src/js/chrome/web_client.js
@@ -135,7 +135,7 @@ return AbstractWebClient.extend({
self.action_manager.loadState(state, !!self._current_state).then(function () {
var action = self.action_manager.getCurrentAction();
if (action) {
- self.menu.open_action(action.id);
+ self.menu.open_action(action.id, state.menu_id);
}
});
}
@@ -156,7 +156,7 @@ return AbstractWebClient.extend({
var completed = $.Deferred();
self.action_manager.doAction(result, {
clear_breadcrumbs: true,
- action_menu_id: self.menu.current_menu,
+ action_menu_id: options.id,
}).fail(function() {
self.menu.open_menu(options.previous_menu_id);
}).always(function() {
diff --git a/addons/web/static/src/js/fields/basic_fields.js b/addons/web/static/src/js/fields/basic_fields.js
index 75aa1acd164..4b46db8a8ff 100644
--- a/addons/web/static/src/js/fields/basic_fields.js
+++ b/addons/web/static/src/js/fields/basic_fields.js
@@ -2007,8 +2007,9 @@ var FieldToggleBoolean = AbstractField.extend({
* @private
*/
_render: function () {
- var className = this.value ? 'o_toggle_button_success' : 'text-muted';
- this.$('i').addClass('fa fa-circle ' + className);
+ this.$('i')
+ .toggleClass('o_toggle_button_success', !!this.value)
+ .toggleClass('text-muted', !this.value);
var title = this.value ? this.attrs.options.active : this.attrs.options.inactive;
this.$el.attr('title', title);
},
diff --git a/addons/web/static/src/js/fields/relational_fields.js b/addons/web/static/src/js/fields/relational_fields.js
index f81485a6b08..d5add00e38c 100644
--- a/addons/web/static/src/js/fields/relational_fields.js
+++ b/addons/web/static/src/js/fields/relational_fields.js
@@ -878,10 +878,15 @@ var FieldX2Many = AbstractField.extend({
this.pager = new Pager(this, this.value.count, this.value.offset + 1, this.value.limit, {
single_page_hidden: true,
withAccessKey: false,
+ validate: function () {
+ var isList = self.view.arch.tag === 'tree';
+ // TODO: we should have some common method in the basic renderer...
+ return isList ? self.renderer.unselectRow() : $.when();
+ },
});
this.pager.on('pager_changed', this, function (new_state) {
- this.trigger_up('load', {
- id: this.value.id,
+ self.trigger_up('load', {
+ id: self.value.id,
limit: new_state.limit,
offset: new_state.current_min - 1,
on_success: function (value) {
@@ -930,6 +935,7 @@ var FieldX2Many = AbstractField.extend({
* did not agree to discard.
*/
_saveLine: function (recordID) {
+ var self = this;
var def = $.Deferred();
var fieldNames = this.renderer.canBeSaved(recordID);
if (fieldNames.length) {
@@ -941,7 +947,9 @@ var FieldX2Many = AbstractField.extend({
} else {
this.renderer.setRowMode(recordID, 'readonly').done(def.resolve.bind(def));
}
- return def;
+ return def.then(function () {
+ self.pager.updateState({ size: self.value.count });
+ });
},
/**
* Parses the 'columnInvisibleFields' attribute to search for the domains
@@ -1178,7 +1186,20 @@ var FieldOne2Many = FieldX2Many.extend({
return this._super.apply(this, arguments).then(function () {
if (ev && ev.target === self && ev.data.changes && self.view.arch.tag === 'tree') {
if (ev.data.changes[self.name].operation === 'CREATE') {
- var index = self.editable === 'top' ? 0 : self.value.data.length - 1;
+ var index = 0;
+ if (self.editable !== 'top') {
+ index = self.value.data.length - 1;
+ // we consider that a new record, created in the bottom,
+ // does not count as a record worth mentioning in the
+ // pager, at least not until the line has been saved.
+ // We prevent the pager from increasing its size, which
+ // means that the pager is not displayed when we just
+ // reach the limit. For example, if limit is 3, if we
+ // have 3 records, and we click on add, we will see the
+ // 4 records on the same page, but we do not want a
+ // pager.
+ self.pager.updateState({ size: self.value.count - 1});
+ }
var newID = self.value.data[index].id;
self.renderer.editRecord(newID);
}
diff --git a/addons/web/static/src/js/views/basic/basic_model.js b/addons/web/static/src/js/views/basic/basic_model.js
index 21259671505..c6afa9c4921 100644
--- a/addons/web/static/src/js/views/basic/basic_model.js
+++ b/addons/web/static/src/js/views/basic/basic_model.js
@@ -359,6 +359,11 @@ var BasicModel = AbstractModel.extend({
elem._changes = null;
elem._isDirty = false;
}
+ elem.offset = 0;
+ if (elem.tempLimitIncrement) {
+ elem.limit -= elem.tempLimitIncrement;
+ delete elem.tempLimitIncrement;
+ }
});
},
/**
@@ -809,6 +814,7 @@ var BasicModel = AbstractModel.extend({
this.discardChanges(id, {rollback: false});
}
} else if (element._changes) {
+ delete element.tempLimitIncrement;
_.each(element._changes, function (change) {
delete change.isNew;
});
@@ -1640,6 +1646,12 @@ var BasicModel = AbstractModel.extend({
// handle multiple add: command[2] may be a dict of values (1
// record added) or an array of dict of values
var data = _.isArray(command.ids) ? command.ids : [command.ids];
+
+ // Ensure the local data repository (list) boundaries can handle incoming records (data)
+ if (data.length + list.res_ids.length > list.limit) {
+ list.limit = data.length + list.res_ids.length;
+ }
+
var list_records = {};
_.each(data, function (d) {
rec = self._makeDataPoint({
@@ -1684,6 +1696,10 @@ var BasicModel = AbstractModel.extend({
case 'CREATE':
var options = {position: command.position};
def = this._addX2ManyDefaultRecord(list, options).then(function (id) {
+ if (command.position === 'bottom' && list.orderedResIDs.length >= list.limit) {
+ list.tempLimitIncrement = (list.tempLimitIncrement || 0) + 1;
+ list.limit += 1;
+ }
// FIXME: hack for lunch widget, which does useless default_get and onchange
if (command.data) {
return self._applyChange(id, command.data);
@@ -3824,7 +3840,8 @@ var BasicModel = AbstractModel.extend({
// generate the current count and res_ids list by applying the changes
var currentCount = list.count;
var currentResIDs = list.res_ids;
- var upperBound = list.limit ? Math.min(list.offset + list.limit, currentCount) : currentCount;
+ var effectiveLimit = (list.limit || 0) - (list.tempLimitIncrement || 0);
+ var upperBound = effectiveLimit ? Math.min(list.offset + effectiveLimit, currentCount) : currentCount;
var fieldNames = list.getFieldNames();
for (var i = list.offset; i < upperBound; i++) {
var resId = currentResIDs[i];
diff --git a/addons/web/static/src/js/views/form/form_renderer.js b/addons/web/static/src/js/views/form/form_renderer.js
index b289663fb19..b328b88f5e5 100644
--- a/addons/web/static/src/js/views/form/form_renderer.js
+++ b/addons/web/static/src/js/views/form/form_renderer.js
@@ -610,6 +610,10 @@ var FormRenderer = BasicRenderer.extend({
var $result = $('<div/>', {class: 'o_group'});
var colSize = Math.max(1, Math.round(12 / (parseInt(node.attrs.col, 10) || 2)));
+ if (node.attrs.string) {
+ var $sep = $('<div/>', {class: 'o_horizontal_separator'}).text(node.attrs.string);
+ $result.append($sep);
+ }
$result.append(_.map(node.children, function (child) {
if (child.tag === 'newline') {
return $('<br/>');
diff --git a/addons/web/static/src/js/views/view_dialogs.js b/addons/web/static/src/js/views/view_dialogs.js
index 1b74068d44d..d4ae709008c 100644
--- a/addons/web/static/src/js/views/view_dialogs.js
+++ b/addons/web/static/src/js/views/view_dialogs.js
@@ -252,6 +252,7 @@ var SelectCreateDialog = ViewDialog.extend({
}
},
selection_changed: function (event) {
+ event.stopPropagation();
this.$footer.find(".o_select_button").prop('disabled', !event.data.selection.length);
},
search: function (event) {