summaryrefslogtreecommitdiff
path: root/addons/web/static/src/js
diff options
context:
space:
mode:
authorChristophe Matthieu <chm@odoo.com>2017-03-08 15:49:52 +0100
committerAaron Bohy <aab@odoo.com>2017-04-11 19:44:38 +0200
commit454b21538917558cfb71c0b98bf49a1d8efa7eee (patch)
tree02b148d7ba24e551530ba43d427aba57b8503402 /addons/web/static/src/js
parent53d8d38f93d59ae5ca23046d20d1b33bfd1e8838 (diff)
[FIX] web: properly transfer field properties
Before this commit, the field properties (attrs, fieldNames, fields) were not correctly given to sub views in many case expected: * use widget many2many on one2many field * create record when click on save in formDialog * do not send create command to the server * use the fields defined in the field node (instead of tree view fields) * use the fieldNames instead of the record to get field values
Diffstat (limited to 'addons/web/static/src/js')
-rw-r--r--addons/web/static/src/js/views/basic/basic_model.js32
-rw-r--r--addons/web/static/src/js/views/basic/basic_renderer.js16
-rw-r--r--addons/web/static/src/js/views/view_dialogs.js9
3 files changed, 42 insertions, 15 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 8239692711e..992af62387e 100644
--- a/addons/web/static/src/js/views/basic/basic_model.js
+++ b/addons/web/static/src/js/views/basic/basic_model.js
@@ -302,6 +302,9 @@ var BasicModel = AbstractModel.extend({
for (var fieldName in element.data) {
field = element.fields[fieldName];
+ if (!field) {
+ continue;
+ }
// get relational datapoint
if (field.type === 'many2one') {
@@ -842,18 +845,32 @@ var BasicModel = AbstractModel.extend({
});
},
/**
- * Set and return the fieldattrs on a record element.
+ * Set fieldNames.
+ * Set fields on a record element (current fields as defaults)
+ * Set fieldattrs.
* It is mostly useful for the cases where a record element is shared
* between various views, such as a one2many with a tree and a form view.
*
* @param {string} recordID a valid element ID
- * @param {Object} attrs the new field attrs
- * @return {Object} the previous field attrs
+ * @param {Object} props
+ * @param {Object} props.fieldNames
+ * @param {Object} props.fields
+ * @param {Object} props.fieldAttrs
+ * @return {Object}
+ * @return {Object} result.fieldNames the previous field names
+ * @return {Object} result.fields the previous description fields
+ * @return {Object} result.fieldattrs the previous field attrs
*/
- setFieldAttrs: function (recordID, attrs) {
+ setFieldProps: function (recordID, props) {
var record = this.localData[recordID];
- var result = record.fieldAttrs;
- record.fieldAttrs = attrs;
+ var result = {
+ fieldNames: record.fieldNames,
+ fields: record.fields,
+ fieldAttrs: record.fieldAttrs,
+ };
+ record.fieldNames = props.fieldNames;
+ record.fields = _.defaults(props.fields, record.fields);
+ record.fieldAttrs = props.fieldAttrs;
return result;
},
/**
@@ -2100,6 +2117,9 @@ var BasicModel = AbstractModel.extend({
if (element.type === 'record') {
for (var fieldName in element.data) {
var field = element.fields[fieldName];
+ if (!field) {
+ continue;
+ }
if (_.contains(['one2many', 'many2one', 'many2many'], field.type)) {
var relationalElement = this.localData[element.data[fieldName]];
diff --git a/addons/web/static/src/js/views/basic/basic_renderer.js b/addons/web/static/src/js/views/basic/basic_renderer.js
index 22ec34f714b..e581b222417 100644
--- a/addons/web/static/src/js/views/basic/basic_renderer.js
+++ b/addons/web/static/src/js/views/basic/basic_renderer.js
@@ -63,24 +63,28 @@ return AbstractRenderer.extend({
* @returns {Object}
*/
_getFieldValues: function (record) {
- return _.mapObject(record.data, function (value, name) {
+ var result = {};
+ _.each(record.fieldNames, function (name) {
var field = record.fields[name];
+ var value = record.data[name];
+ result[name] = value;
if (field.type === 'many2one') {
- return value.data ? value.data.id || false : false;
+ result[name] = value.data ? value.data.id || false : false;
}
if (field.type === 'one2many' || field.type === 'many2many') {
if (value) {
- return _.pluck(value.data, 'res_id');
+ result[name] = _.pluck(value.data, 'res_id');
} else {
- return [];
+ result[name] = [];
}
}
if (field.type === 'boolean') {
// we want an explicit false value, not null if it is unset
- return value || false;
+ result[name] = value || false;
}
- return value;
});
+ result.id = record.data.id;
+ return result;
},
/**
* Render the view
diff --git a/addons/web/static/src/js/views/view_dialogs.js b/addons/web/static/src/js/views/view_dialogs.js
index ab9588dc740..5ca2cd5c14e 100644
--- a/addons/web/static/src/js/views/view_dialogs.js
+++ b/addons/web/static/src/js/views/view_dialogs.js
@@ -141,7 +141,7 @@ var FormViewDialog = ViewDialog.extend({
*/
destroy: function () {
if (this.recordID && this.fieldAttrs) {
- this.model.setFieldAttrs(this.recordID, this.fieldAttrs);
+ this.setFieldProps(this.recordID, this.previousFieldProps);
}
this._super.apply(this, arguments);
},
@@ -168,8 +168,11 @@ var FormViewDialog = ViewDialog.extend({
fields_view_def.then(function (fields_view) {
if (self.recordID) {
- self.fieldAttrs =
- self.model.setFieldAttrs(self.recordID, fields_view.fieldAttrs);
+ self.previousFieldProps = self.model.setFieldProps(self.recordID, {
+ fieldNames: Object.keys(fields_view.fields),
+ fields: fields_view.fields,
+ fieldAttrs: fields_view.fieldAttrs
+ });
}
var formview = new FormView(fields_view.arch, fields_view.fields, {
modelName: self.res_model,