summaryrefslogtreecommitdiff
path: root/addons/web/static/src/js/views/basic/basic_model.js
diff options
context:
space:
mode:
authorLucas Perais (lpe) <lpe@odoo.com>2018-04-20 14:43:19 +0200
committerLucas Perais (lpe) <lpe@odoo.com>2018-05-02 11:09:50 +0200
commit27c9f838d35f36f6fe8d68068ed96c5c58d9d186 (patch)
treeba48e5904db2594d855e5446851f0332d9ca8f89 /addons/web/static/src/js/views/basic/basic_model.js
parente0424b960315b8328f7da96f9d5bc58f2628cd47 (diff)
[FIX] web: inline views should share their fields
Have a One2Many The views of that o2m define two inline views: the list and the form in the list view, put a field that isn't in the form and used in a domain Try to add an item to the list The form pops up Fill in the data and save & close Before this commit: It crashed when evaluating the domain on a field using the field that is not in the form After this commit: Subviews share their fields in a special object on the parent record In our case, the form view checks in that shared resource if the fields it is supposed to initialize are there. Hence, this flow doesn't crash anymore OPW 1837511 closes #24350
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.js38
1 files changed, 26 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 9d4dc877473..9d95f893bc7 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]) {
@@ -2495,6 +2511,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];
@@ -2517,6 +2534,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) {
@@ -3221,6 +3239,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) {
@@ -3280,6 +3300,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
@@ -3323,22 +3344,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]);
@@ -3363,7 +3377,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 () {