summaryrefslogtreecommitdiff
path: root/addons/web/static/src/js/views/basic/basic_model.js
diff options
context:
space:
mode:
Diffstat (limited to 'addons/web/static/src/js/views/basic/basic_model.js')
-rw-r--r--addons/web/static/src/js/views/basic/basic_model.js42
1 files changed, 30 insertions, 12 deletions
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 e02f51259ef..42eea2ccfd6 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,8 @@ var BasicModel = AbstractModel.extend({
* assume main viewType from the record
* @param {Array} [options.fieldNames] list of field names for which a
* default value must be generated (used to complete the values dict)
+ * @param {record} [options.parentRecord] The parent record of the current one
+ * usefull to get all the fields from all the views the model can be displayed on.
* @returns {Deferred}
*/
applyDefaultValues: function (recordID, values, options) {
@@ -219,6 +221,20 @@ var BasicModel = AbstractModel.extend({
var fieldName;
record._changes = record._changes || {};
+ /* Get the field's definition in the parent record if it is
+ * not present in the current one.
+ *
+ * @param {string} fieldName The name of the field we try to get the definition for
+ * in the parent record
+ * @returns {Object} the field's definition
+ */
+ function getFieldsFromOtherViews(fieldName) {
+ return options.parentRecord
+ && options.parentRecord.mergedViewsFields[viewType]
+ && options.parentRecord.mergedViewsFields[viewType][fieldName]
+ || {};
+ }
+
// ignore values for non requested fields (for instance, fields that are
// not in the view)
values = _.pick(values, fieldNames);
@@ -227,7 +243,7 @@ var BasicModel = AbstractModel.extend({
for (var i = 0; i < fieldNames.length; i++) {
fieldName = fieldNames[i];
if (!(fieldName in values) && !(fieldName in record._changes)) {
- field = record.fields[fieldName];
+ field = record.fields[fieldName] || getFieldsFromOtherViews(fieldName);
if (field.type === 'float' ||
field.type === 'integer' ||
field.type === 'monetary') {
@@ -243,7 +259,7 @@ var BasicModel = AbstractModel.extend({
// parse each value and create dataPoints for relational fields
var defs = [];
for (fieldName in values) {
- field = record.fields[fieldName];
+ field = record.fields[fieldName] || getFieldsFromOtherViews(fieldName);
record.data[fieldName] = null;
var dp;
if (field.type === 'many2one' && values[fieldName]) {
@@ -2496,6 +2512,7 @@ var BasicModel = AbstractModel.extend({
var fieldNames = options && options.fieldNames || record.getFieldNames();
var viewType = options && options.viewType || record.viewType;
_.each(fieldNames, function (fieldName) {
+ var mergedViewsFields = record.fieldsInfo[viewType] && record.fieldsInfo[viewType][fieldName].mergeViewsFields || {};
var field = record.fields[fieldName];
if (field.type === 'one2many' || field.type === 'many2many') {
var fieldInfo = record.fieldsInfo[viewType][fieldName];
@@ -2518,6 +2535,7 @@ var BasicModel = AbstractModel.extend({
rawContext: rawContext,
relationField: field.relation_field,
viewType: view ? view.type : fieldInfo.viewType,
+ mergedViewsFields: mergedViewsFields,
});
record.data[fieldName] = list.id;
if (!fieldInfo.__no_fetch) {
@@ -3222,6 +3240,8 @@ var BasicModel = AbstractModel.extend({
* @param {string} [params.type='record'|'list']
* @param {[type]} [params.value]
* @param {string} [params.viewType] the type of the view, e.g. 'list' or 'form'
+ * @param {Object} [params.mergedViewsFields] Contains for each viewType
+ * all the other viewTypes' fields plus its own to allow switching views more smoothly
* @returns {Object} the resource created
*/
_makeDataPoint: function (params) {
@@ -3281,6 +3301,7 @@ var BasicModel = AbstractModel.extend({
type: type, // 'record' | 'list'
value: value,
viewType: params.viewType,
+ mergedViewsFields: params.mergedViewsFields || {},
};
// _editionViewType is a dict whose keys are field names and which is populated when a field
@@ -3324,22 +3345,15 @@ var BasicModel = AbstractModel.extend({
*/
_makeDefaultRecord: function (modelName, params) {
var self = this;
-
+ var parentRecord = self.localData[params.parentID];
var determineExtraFields = function() {
// Fields that are present in the originating view, that need to be initialized
// Hence preventing their value to crash when getting back to the originating view
- var parentRecord = self.localData[params.parentID];
-
var originView = parentRecord && parentRecord.fieldsInfo;
if (!originView || !originView[parentRecord.viewType])
return [];
- var fieldsFromOrigin = _.filter(Object.keys(originView[parentRecord.viewType]),
- function(fieldname) {
- return params.fields[fieldname] !== undefined;
- });
-
- return fieldsFromOrigin;
+ return Object.keys(originView[parentRecord.viewType]);
}
var fieldNames = Object.keys(params.fieldsInfo[params.viewType]);
@@ -3364,7 +3378,7 @@ var BasicModel = AbstractModel.extend({
viewType: params.viewType,
});
- return self.applyDefaultValues(record.id, result, {fieldNames: _.union(fieldNames, extraFields)})
+ return self.applyDefaultValues(record.id, result, {fieldNames: _.union(fieldNames, extraFields), parentRecord: parentRecord})
.then(function () {
var def = $.Deferred();
self._performOnChange(record, fields_key).always(function () {
@@ -3847,6 +3861,10 @@ var BasicModel = AbstractModel.extend({
var emptyGroupsIDs = _.difference(_.pluck(previousGroups, 'id'), list.data);
_.each(emptyGroupsIDs, function (groupID) {
list.data.push(groupID);
+ var emptyGroup = self.localData[groupID];
+ // this attribute hasn't been updated in the previous
+ // loop for empty groups
+ emptyGroup.aggregateValues = {};
});
}
return $.when.apply($, defs).then(function () {