summaryrefslogtreecommitdiff
path: root/addons/web/static/src/js
diff options
context:
space:
mode:
Diffstat (limited to 'addons/web/static/src/js')
-rw-r--r--addons/web/static/src/js/fields/relational_fields.js43
-rw-r--r--addons/web/static/src/js/views/basic/basic_controller.js1
-rw-r--r--addons/web/static/src/js/views/basic/basic_model.js94
-rw-r--r--addons/web/static/src/js/views/form/form_controller.js10
-rw-r--r--addons/web/static/src/js/views/kanban/kanban_column.js12
-rw-r--r--addons/web/static/src/js/views/kanban/kanban_model.js62
-rw-r--r--addons/web/static/src/js/views/kanban/kanban_renderer.js3
-rw-r--r--addons/web/static/src/js/views/pivot/pivot_controller.js34
-rw-r--r--addons/web/static/src/js/views/pivot/pivot_model.js7
-rw-r--r--addons/web/static/src/js/views/pivot/pivot_view.js11
-rw-r--r--addons/web/static/src/js/views/view_dialogs.js5
11 files changed, 215 insertions, 67 deletions
diff --git a/addons/web/static/src/js/fields/relational_fields.js b/addons/web/static/src/js/fields/relational_fields.js
index ae3b06d3a02..3b47b8c64b0 100644
--- a/addons/web/static/src/js/fields/relational_fields.js
+++ b/addons/web/static/src/js/fields/relational_fields.js
@@ -619,12 +619,15 @@ var FieldX2Many = AbstractField.extend({
* @returns {Deferred}
*/
commitChanges: function () {
+ var self = this;
var inEditionRecordID =
this.renderer
&& this.renderer.viewType === "list"
&& this.renderer.getEditableRecordID();
if (inEditionRecordID) {
- return this._saveLine(inEditionRecordID);
+ return this.renderer.commitChanges(inEditionRecordID).then(function () {
+ return self._saveLine(inEditionRecordID);
+ });
}
return this._super.apply(this, arguments);
},
@@ -767,21 +770,17 @@ var FieldX2Many = AbstractField.extend({
* did not agree to discard.
*/
_saveLine: function (recordID) {
- var self = this;
var def = $.Deferred();
- this.renderer.commitChanges(recordID).then(function () { // TODO wrong as no mutex protection
- var fieldNames = self.renderer.canBeSaved(recordID);
- if (fieldNames.length) {
- self.trigger_up('discard_changes', {
- recordID: recordID,
- onSuccess: def.resolve.bind(def),
- onFailure: def.reject.bind(def),
- });
- } else {
- self.renderer.setRowMode(recordID, 'readonly')
- .done(def.resolve.bind(def));
- }
- });
+ var fieldNames = this.renderer.canBeSaved(recordID);
+ if (fieldNames.length) {
+ this.trigger_up('discard_changes', {
+ recordID: recordID,
+ onSuccess: def.resolve.bind(def),
+ onFailure: def.reject.bind(def),
+ });
+ } else {
+ this.renderer.setRowMode(recordID, 'readonly').done(def.resolve.bind(def));
+ }
return def;
},
@@ -900,9 +899,15 @@ var FieldX2Many = AbstractField.extend({
ev.stopPropagation();
this.trigger_up('mutexify', {
action: function () {
- return self._saveLine(ev.data.recordID)
- .done(ev.data.onSuccess)
- .fail(ev.data.onFailure);
+ return self.renderer.commitChanges(ev.data.recordID).then(function () {
+ self.trigger_up('mutexify', {
+ action: function () {
+ return self._saveLine(ev.data.recordID)
+ .done(ev.data.onSuccess)
+ .fail(ev.data.onFailure);
+ },
+ });
+ });
},
});
},
@@ -922,7 +927,7 @@ var FieldX2Many = AbstractField.extend({
id: rowID,
data: data,
});
- })
+ });
},
/**
* Adds field name information to the event, so that the view upstream is
diff --git a/addons/web/static/src/js/views/basic/basic_controller.js b/addons/web/static/src/js/views/basic/basic_controller.js
index 16a066db495..af4ca7d7a08 100644
--- a/addons/web/static/src/js/views/basic/basic_controller.js
+++ b/addons/web/static/src/js/views/basic/basic_controller.js
@@ -419,6 +419,7 @@ var BasicController = AbstractController.extend(FieldManagerMixin, {
var saveDef = this.model.save(recordID, { // Save then leave edit mode
reload: options.reload,
savePoint: options.savePoint,
+ viewType: options.viewType,
});
if (!options.stayInEdit) {
saveDef = saveDef.then(function (fieldNames) {
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 61c285d6581..d897a74c696 100644
--- a/addons/web/static/src/js/views/basic/basic_model.js
+++ b/addons/web/static/src/js/views/basic/basic_model.js
@@ -208,6 +208,7 @@ var BasicModel = AbstractModel.extend({
delete self.localData[record.id];
} else {
record.res_ids.splice(record.offset, 1);
+ record.offset = Math.min(record.offset, record.res_ids.length - 1);
record.res_id = record.res_ids[record.offset];
record.count--;
}
@@ -704,6 +705,8 @@ var BasicModel = AbstractModel.extend({
* @param {boolean} [options.savePoint=false] if true, the record will only
* be 'locally' saved: its changes written in a _savePoint key that can
* be restored later by call discardChanges with option rollback to true
+ * @param {string} [options.viewType] current viewType. If not set, we will
+ * assume main viewType from the record
* @returns {Deferred}
* Resolved with the list of field names (whose value has been modified)
*/
@@ -718,6 +721,11 @@ var BasicModel = AbstractModel.extend({
if (newValue instanceof Array) {
rec._savePoint = newValue.slice(0);
} else {
+ // save the viewType of edition, so that the correct readonly modifiers
+ // can be evaluated when the record will be saved
+ for (var fieldName in (rec._changes || {})) {
+ rec._editionViewType[fieldName] = options.viewType;
+ }
rec._savePoint = _.extend({}, newValue);
}
});
@@ -728,7 +736,7 @@ var BasicModel = AbstractModel.extend({
// id never changes, and should not be written
delete record._changes.id;
}
- var changes = self._generateChanges(record);
+ var changes = self._generateChanges(record, {viewType: options.viewType});
if (method === 'create') {
var fieldNames = record.getFieldNames();
@@ -1869,12 +1877,36 @@ var BasicModel = AbstractModel.extend({
*
* @private
* @param {Object} record
+ * @param {Object} [options]
+ * @param {boolean} [options.changesOnly=true] if true, only generates
+ * commands for fields that have changed (concerns x2many fields only)
+ * @param {boolean} [options.withReadonly=false] if false, doesn't generate
+ * changes for readonly fields
+ * @param {string} [options.viewType] current viewType. If not set, we will
+ * assume main viewType from the record. Note that if an editionViewType is
+ * specified for a field, it will take the priority over the viewType arg.
* @returns {Object} a map from changed fields to their new value
*/
- _generateChanges: function (record) {
+ _generateChanges: function (record, options) {
+ options = options || {};
+ var viewType = options.viewType || record.viewType;
var changes = _.extend({}, record._changes);
- var commands = this._generateX2ManyCommands(record, true);
+ var withReadonly = options.withReadonly || false;
+ var commands = this._generateX2ManyCommands(record, {
+ changesOnly: 'changesOnly' in options ? options.changesOnly : true,
+ withReadonly: withReadonly,
+ });
for (var fieldName in record.fields) {
+ // remove readonly fields from the list of changes
+ if (!withReadonly && fieldName in changes || fieldName in commands) {
+ var editionViewType = record._editionViewType[fieldName] || viewType;
+ if (this._isFieldReadonly(record, fieldName, editionViewType)) {
+ delete changes[fieldName];
+ continue;
+ }
+ }
+
+ // process relational fields and handle the null case
var type = record.fields[fieldName].type;
if (type === 'one2many' || type === 'many2many') {
if (commands[fieldName].length) { // replace localId by commands
@@ -1901,7 +1933,7 @@ var BasicModel = AbstractModel.extend({
* @returns {Object} the data
*/
_generateOnChangeData: function (record) {
- var commands = this._generateX2ManyCommands(record, false);
+ var commands = this._generateX2ManyCommands(record, {withReadonly: true});
var data = _.extend(this.get(record.id, {raw: true}).data, commands);
// one2many records have a parentID
@@ -1924,12 +1956,16 @@ var BasicModel = AbstractModel.extend({
* or write them...
*
* @param {Object} record
+ * @param {Object} [options]
* @param {boolean} [changesOnly=false] if true, only generates commands for
* fields that have changed
+ * @param {boolean} [options.withReadonly=false] if false, doesn't generate
+ * changes for readonly fields in commands
* @returns {Object} a map from some field names to commands
*/
- _generateX2ManyCommands: function (record, changesOnly) {
+ _generateX2ManyCommands: function (record, options) {
var self = this;
+ options = options || {};
var commands = {};
var data = _.extend({}, record.data, record._changes);
var type;
@@ -1943,7 +1979,7 @@ var BasicModel = AbstractModel.extend({
continue;
}
var list = this.localData[data[fieldName]];
- if (changesOnly && !list._changes) {
+ if (options.changesOnly && !list._changes) {
// if only changes are requested, skip if there is no change
continue;
}
@@ -1961,7 +1997,7 @@ var BasicModel = AbstractModel.extend({
// generate update commands for records that have been
// updated (it may happen with editable lists)
_.each(relData, function (relRecord) {
- var changes = self._generateChanges(relRecord);
+ var changes = self._generateChanges(relRecord, options);
if (!_.isEmpty(changes)) {
var command = x2ManyCommands.update(relRecord.res_id, changes);
commands[fieldName].push(command);
@@ -1980,7 +2016,7 @@ var BasicModel = AbstractModel.extend({
if (_.contains(keptIds, relIds[i])) {
// this is an id that already existed
relRecord = _.findWhere(relData, {res_id: relIds[i]});
- changes = this._generateChanges(relRecord);
+ changes = this._generateChanges(relRecord, options);
if (!_.isEmpty(changes)) {
command = x2ManyCommands.update(relRecord.res_id, changes);
didChange = true;
@@ -1991,11 +2027,11 @@ var BasicModel = AbstractModel.extend({
} else if (_.contains(addedIds, relIds[i])) {
// this is a new id
relRecord = _.findWhere(relData, {res_id: relIds[i]});
- changes = this._generateChanges(relRecord);
+ changes = this._generateChanges(relRecord, options);
commands[fieldName].push(x2ManyCommands.create(changes));
}
}
- if (changesOnly && !didChange && addedIds.length === 0 && removedIds.length === 0) {
+ if (options.changesOnly && !didChange && addedIds.length === 0 && removedIds.length === 0) {
// in this situation, we have no changed ids, no added
// ids and no removed ids, so we can safely ignore the
// last changes
@@ -2155,7 +2191,7 @@ var BasicModel = AbstractModel.extend({
if (context[fieldName] === null) {
context[fieldName] = false;
}
- if (!field) {
+ if (!field || field.name === 'id') {
continue;
}
if (field.type === 'float' ||
@@ -2200,6 +2236,31 @@ var BasicModel = AbstractModel.extend({
return context;
},
/**
+ * Returns true if the field is readonly (checking first in the modifiers,
+ * and if there is no readonly modifier, checking the readonly attribute of
+ * the field).
+ *
+ * @private
+ * @param {Object} record an element from the localData
+ * @param {string} fieldName
+ * @param {string} [viewType] current viewType. If not set, we will assume
+ * main viewType from the record
+ * @returns {boolean}
+ */
+ _isFieldReadonly: function (record, fieldName, viewType) {
+ var fieldInfo = record.fieldsInfo[viewType || record.viewType][fieldName];
+ var modifiers;
+ if (fieldInfo) {
+ var rawModifiers = JSON.parse(fieldInfo.modifiers || "{}");
+ modifiers = this._evalModifiers(record, rawModifiers);
+ }
+ if (modifiers && 'readonly' in modifiers) {
+ return modifiers.readonly;
+ } else {
+ return record.fields[fieldName].readonly;
+ }
+ },
+ /**
* Returns true iff value is considered to be set for the given field's type.
*
* @private
@@ -2330,6 +2391,12 @@ var BasicModel = AbstractModel.extend({
viewType: params.viewType,
};
+ // _editionViewType is a dict whose keys are field names and which is populated when a field
+ // is edited with the viewType as value. This is useful for one2manys to determine whether
+ // or not a field is readonly (using the readonly modifiers of the view in which the field
+ // has been edited)
+ dataPoint._editionViewType = {};
+
dataPoint.evalModifiers = this._evalModifiers.bind(this, dataPoint);
dataPoint.getContext = this._getContext.bind(this, dataPoint);
dataPoint.getDomain = this._getDomain.bind(this, dataPoint);
@@ -2507,7 +2574,7 @@ var BasicModel = AbstractModel.extend({
.then(function () {
// save initial changes, so they can be restored later,
// if we need to discard.
- self.save(record.id, {savePoint: true})
+ self.save(record.id, {savePoint: true});
return record.id;
});
@@ -2582,8 +2649,7 @@ var BasicModel = AbstractModel.extend({
* @param {string[]} fields changed fields
* @param {string} [viewType] current viewType. If not set, we will assume
* main viewType from the record
- * @returns {Deferred} The returned deferred can fail, in which case the
- * fail value will be the warning message received from the server
+ * @returns {Deferred}
*/
_performOnChange: function (record, fields, viewType) {
var self = this;
diff --git a/addons/web/static/src/js/views/form/form_controller.js b/addons/web/static/src/js/views/form/form_controller.js
index 1f0247b732b..0b85ee8cf42 100644
--- a/addons/web/static/src/js/views/form/form_controller.js
+++ b/addons/web/static/src/js/views/form/form_controller.js
@@ -151,7 +151,7 @@ var FormController = BasicController.extend({
if (this.is_action_enabled('delete')) {
otherItems.push({
label: _t('Delete'),
- callback: this._deleteRecords.bind(this, [this.handle]),
+ callback: this._onDeleteRecord.bind(this),
});
}
if (this.is_action_enabled('create') && this.is_action_enabled('duplicate')) {
@@ -395,6 +395,14 @@ var FormController = BasicController.extend({
this.createRecord();
},
/**
+ * Deletes the current record
+ *
+ * @private
+ */
+ _onDeleteRecord: function () {
+ this._deleteRecords([this.handle]);
+ },
+ /**
* Called when the user wants to discard the changes made to the current
* record -> @see discardChanges
*
diff --git a/addons/web/static/src/js/views/kanban/kanban_column.js b/addons/web/static/src/js/views/kanban/kanban_column.js
index 80d48a78774..99c9500d210 100644
--- a/addons/web/static/src/js/views/kanban/kanban_column.js
+++ b/addons/web/static/src/js/views/kanban/kanban_column.js
@@ -45,7 +45,6 @@ var KanbanColumn = Widget.extend({
this.folded = !data.isOpen;
this.has_active_field = 'active' in data.fields;
this.size = data.count;
- this.values = data.values;
this.fields = data.fields;
this.records = [];
this.modelName = data.model;
@@ -63,13 +62,12 @@ var KanbanColumn = Widget.extend({
this.record_options = _.clone(recordOptions);
- if (data.options && data.options.group_by_tooltip) {
- var self = this;
- this.tooltip_info = _.map(data.options.group_by_tooltip, function (key, value) {
- return (self.values && self.values[value] && "<div>" +key + "<br>" + self.values[value] + "</div>") || '';
+ if (options.group_by_tooltip) {
+ this.tooltipInfo = _.map(options.group_by_tooltip, function (help, field) {
+ return (data.tooltipData && data.tooltipData[field] && "<div>" + help + "<br>" + data.tooltipData[field] + "</div>") || '';
}).join('');
} else {
- this.tooltip_info = "";
+ this.tooltipInfo = "";
}
},
/**
@@ -217,7 +215,7 @@ var KanbanColumn = Widget.extend({
this.$el.toggleClass('o_column_folded', this.folded);
var tooltip = this.size + _t(' records');
- tooltip = '<p>' + tooltip + '</p>' + this.tooltip_info;
+ tooltip = '<p>' + tooltip + '</p>' + this.tooltipInfo;
this.$header.tooltip({html: true}).attr('data-original-title', tooltip);
if (!this.remaining) {
this.$('.o_kanban_load_more').remove();
diff --git a/addons/web/static/src/js/views/kanban/kanban_model.js b/addons/web/static/src/js/views/kanban/kanban_model.js
index c606776ccc0..cd69889bda9 100644
--- a/addons/web/static/src/js/views/kanban/kanban_model.js
+++ b/addons/web/static/src/js/views/kanban/kanban_model.js
@@ -90,6 +90,21 @@ var KanbanModel = BasicModel.extend({
});
},
/**
+ * Add the key `tooltipData` (kanban specific) when performing a `geĊ§`.
+ *
+ * @override
+ * @see _readTooltipFields
+ * @returns {Object}
+ */
+ get: function () {
+ var result = this._super.apply(this, arguments);
+ var dp = result && this.localData[result.id];
+ if (dp && dp.tooltipData) {
+ result.tooltipData = $.extend(true, {}, dp.tooltipData);
+ }
+ return result;
+ },
+ /**
* @override
*/
load: function (params) {
@@ -203,10 +218,55 @@ var KanbanModel = BasicModel.extend({
* @param {Object} list valid resource object
*/
_readGroup: function (list) {
+ var self = this;
if (list.groupedBy.length > 1) {
list.groupedBy = [list.groupedBy[0]];
}
- return this._super.apply(this, arguments);
+ return this._super.apply(this, arguments).then(function (result) {
+ return self._readTooltipFields(list).then(_.constant(result));
+ });
+ },
+ /**
+ * Fetches tooltip specific fields on the group by relation and stores it in
+ * the column datapoint in a special key `tooltipData`.
+ * Data for the tooltips (group_by_tooltip) are fetched in batch for all
+ * groups, to avoid doing multiple calls.
+ * Data are stored in a special key `tooltipData` on the datapoint.
+ * Note that the option `group_by_tooltip` is only for m2o fields.
+ *
+ * @private
+ * @param {Object} list a list of groups
+ * @returns {Deferred}
+ */
+ _readTooltipFields: function (list) {
+ var self = this;
+ var groupedByField = list.fields[list.groupedBy[0]];
+ if (groupedByField.type !== 'many2one') {
+ return $.when();
+ }
+ var groupIds = _.map(list.data, function (id) {
+ return self.get(id, {raw: true}).res_id;
+ });
+ var tooltipFields = [];
+ var groupedByFieldInfo = list.fieldsInfo.kanban[list.groupedBy[0]];
+ if (groupedByFieldInfo && groupedByFieldInfo.options) {
+ tooltipFields = Object.keys(groupedByFieldInfo.options.group_by_tooltip || {});
+ }
+ if (groupIds.length && tooltipFields.length) {
+ var fieldNames = _.union(['display_name'], tooltipFields);
+ return this._rpc({
+ model: groupedByField.relation,
+ method: 'read',
+ args: [groupIds, fieldNames],
+ context: list.context,
+ }).then(function (result) {
+ _.each(list.data, function (id) {
+ var dp = self.localData[id];
+ dp.tooltipData = _.findWhere(result, {id: dp.res_id});
+ });
+ });
+ }
+ return $.when();
},
});
diff --git a/addons/web/static/src/js/views/kanban/kanban_renderer.js b/addons/web/static/src/js/views/kanban/kanban_renderer.js
index 7bfe21e66a9..87275260b01 100644
--- a/addons/web/static/src/js/views/kanban/kanban_renderer.js
+++ b/addons/web/static/src/js/views/kanban/kanban_renderer.js
@@ -188,6 +188,7 @@ var KanbanRenderer = BasicRenderer.extend({
_renderGrouped: function (fragment) {
var self = this;
var groupByFieldAttrs = this.state.fields[this.state.groupedBy[0]];
+ var groupByFieldInfo = this.state.fieldsInfo.kanban[this.state.groupedBy[0]];
// Deactivate the drag'n'drop if the groupedBy field:
// - is a date or datetime since we group by month or
// - is readonly
@@ -201,8 +202,10 @@ var KanbanRenderer = BasicRenderer.extend({
}
var groupedByM2O = groupByFieldAttrs && (groupByFieldAttrs.type === 'many2one');
var grouped_by_field = groupedByM2O && groupByFieldAttrs.relation;
+ var groupByTooltip = groupByFieldInfo && groupByFieldInfo.options.group_by_tooltip;
this.columnOptions = _.extend(this.columnOptions, {
draggable: draggable,
+ group_by_tooltip: groupByTooltip,
grouped_by_m2o: groupedByM2O,
relation: grouped_by_field,
});
diff --git a/addons/web/static/src/js/views/pivot/pivot_controller.js b/addons/web/static/src/js/views/pivot/pivot_controller.js
index fb175aa1934..78640a97124 100644
--- a/addons/web/static/src/js/views/pivot/pivot_controller.js
+++ b/addons/web/static/src/js/views/pivot/pivot_controller.js
@@ -45,13 +45,15 @@ var PivotController = AbstractController.extend({
this.groupableFields = params.groupableFields;
this.title = params.title;
this.enableLinking = params.enableLinking;
+ // views to use in the action triggered when a data cell is clicked
+ this.views = params.views;
this.lastHeaderSelected = null;
},
/**
* @override
*/
start: function () {
- this.$el.toggleClass('o_enableLinking', this.enableLinking);
+ this.$el.toggleClass('o_enable_linking', this.enableLinking);
this.$fieldSelection = this.$('.o_field_selection');
core.bus.on('click', this, function () {
this.$fieldSelection.empty();
@@ -253,33 +255,23 @@ var PivotController = AbstractController.extend({
!this.enableLinking) {
return;
}
- var row_id = $target.data('id');
- var col_id = $target.data('col_id');
var state = this.model.get(this.handle);
- var row_domain = state.data.headers[row_id].domain;
- var col_domain = state.data.headers[col_id].domain;
- var context = _.omit(_.clone(state.context), 'group_by');
-
- function _find_view_info (views, view_type) {
- return _.find(views, function (view) {
- return view[1] === view_type;
- }) || [false, view_type];
- }
- var views = [
- _find_view_info(this.options.action.views, "list"),
- _find_view_info(this.options.action.views, "form"),
- ];
+ var colDomain = this.model.getHeader($target.data('col_id')).domain;
+ var rowDomain = this.model.getHeader($target.data('id')).domain;
+ var context = _.omit(state.context, function (val, key) {
+ return key === 'group_by' || _.str.startsWith(key, 'search_default_');
+ });
this.do_action({
type: 'ir.actions.act_window',
name: this.title,
- res_model: this.model,
- views: views,
- view_type : "list",
- view_mode : "list",
+ res_model: this.modelName,
+ views: this.views,
+ view_type: 'list',
+ view_mode: 'list',
target: 'current',
context: context,
- domain: state.domain.concat(row_domain, col_domain),
+ domain: state.domain.concat(rowDomain, colDomain),
});
},
/**
diff --git a/addons/web/static/src/js/views/pivot/pivot_model.js b/addons/web/static/src/js/views/pivot/pivot_model.js
index 6bbadd56ed8..49c00663d47 100644
--- a/addons/web/static/src/js/views/pivot/pivot_model.js
+++ b/addons/web/static/src/js/views/pivot/pivot_model.js
@@ -16,9 +16,10 @@ odoo.define('web.PivotModel', function (require) {
* @todo add a full description/specification of the data layout
*/
+var AbstractModel = require('web.AbstractModel');
var core = require('web.core');
+var session = require('web.session');
var utils = require('web.utils');
-var AbstractModel = require('web.AbstractModel');
var _t = core._t;
@@ -189,6 +190,8 @@ var PivotModel = AbstractModel.extend({
}
return {
colGroupBys: this.data.main_col.groupbys,
+ context: this.data.context,
+ domain: this.data.domain,
fields: this.fields,
headers: !isRaw && this._computeHeaders(),
has_data: true,
@@ -225,7 +228,7 @@ var PivotModel = AbstractModel.extend({
this.modelName = params.modelName;
this.data = {
domain: params.domain,
- context: params.context,
+ context: _.extend({}, session.user_context, params.context),
groupedBy: params.rowGroupBys,
colGroupBys: params.colGroupBys,
measures: params.measures,
diff --git a/addons/web/static/src/js/views/pivot/pivot_view.js b/addons/web/static/src/js/views/pivot/pivot_view.js
index d90c0d21780..356672081d9 100644
--- a/addons/web/static/src/js/views/pivot/pivot_view.js
+++ b/addons/web/static/src/js/views/pivot/pivot_view.js
@@ -96,6 +96,17 @@ var PivotView = AbstractView.extend({
this.controllerParams.enableLinking = !arch.attrs.disable_linking;
this.controllerParams.measures = measures;
this.controllerParams.groupableFields = groupableFields;
+ // retrieve form and list view ids from the action to open those views
+ // when a data cell of the pivot view is clicked
+ this.controllerParams.views = [
+ _findView(params.action && params.action.views, 'list'),
+ _findView(params.action && params.action.views, 'form'),
+ ];
+ function _findView(views, viewType) {
+ return _.find(views, function (view) {
+ return view[1] === viewType;
+ }) || [false, viewType];
+ }
},
});
diff --git a/addons/web/static/src/js/views/view_dialogs.js b/addons/web/static/src/js/views/view_dialogs.js
index a19e440913e..d38400c2e84 100644
--- a/addons/web/static/src/js/views/view_dialogs.js
+++ b/addons/web/static/src/js/views/view_dialogs.js
@@ -222,6 +222,7 @@ var FormViewDialog = ViewDialog.extend({
stayInEdit: true,
reload: false,
savePoint: this.shouldSaveLocally,
+ viewType: 'form',
});
}
return $.when(def).then(function () {
@@ -326,7 +327,6 @@ var SelectCreateDialog = ViewDialog.extend({
var searchview = new SearchView(this, this.dataset, fields_views.search, options);
searchview.prependTo($header).done(function () {
var d = searchview.build_search_data();
- d.domains = d.domains.concat([self.domain]);
if (self.initial_ids) {
d.domains.push([["id", "in", self.initial_ids]]);
self.initial_ids = undefined;
@@ -387,8 +387,9 @@ var SelectCreateDialog = ViewDialog.extend({
contexts: [this.context].concat(contexts),
group_by_seq: groupbys || []
});
+ var context = _.omit(results.context, function (value, key) { return key.indexOf('search_default_') === 0; });
return {
- context: results.context,
+ context: context,
domain: results.domain,
groupBy: results.group_by,
};