diff options
| author | fwi-odoo <fwi@odoo.com> | 2017-09-15 10:19:16 +0200 |
|---|---|---|
| committer | fwi-odoo <fwi@odoo.com> | 2017-09-29 16:49:20 +0200 |
| commit | da136d83bb4cd952dc0e2417d67679cfc5068f34 (patch) | |
| tree | d149d19de2188ecd5f5aff05bea09c6201e78211 /addons/web/static/src/js/views | |
| parent | a7d1740e475c44b50d0cc6ce6f43e9f142e99334 (diff) | |
[IMP] web: x2m list: conditionnaly hide a column
This commit introduces a new way to hide a column in a x2m list view.
The attribute 'tree_invisible' can be add in the field attrs in the x2m
view definition. This attribute can use the 'parent' key to make a reference
to the parent record (e.g. 'parent.id').
Diffstat (limited to 'addons/web/static/src/js/views')
4 files changed, 46 insertions, 14 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 d85f55ddf36..6500fb43b85 100644 --- a/addons/web/static/src/js/views/basic/basic_model.js +++ b/addons/web/static/src/js/views/basic/basic_model.js @@ -1689,6 +1689,9 @@ var BasicModel = AbstractModel.extend({ if ('invisible' in modifiers) { result.invisible = evalModifier(modifiers.invisible); } + if ('column_invisible' in modifiers) { + result.column_invisible = evalModifier(modifiers.column_invisible); + } if ('readonly' in modifiers) { result.readonly = evalModifier(modifiers.readonly); } @@ -2847,7 +2850,7 @@ var BasicModel = AbstractModel.extend({ _isFieldProtected: function (record, fieldName, viewType) { var fieldInfo = record.fieldsInfo[viewType || record.viewType][fieldName]; if (fieldInfo) { - var rawModifiers = JSON.parse(fieldInfo.modifiers || "{}"); + var rawModifiers = fieldInfo.modifiers || {}; var modifiers = this._evalModifiers(record, rawModifiers); return modifiers.readonly && !fieldInfo.force_save; } else { @@ -2899,7 +2902,7 @@ var BasicModel = AbstractModel.extend({ _.each(element.getFieldNames(), function (fieldName) { var field = element.fields[fieldName]; var fieldInfo = element.fieldsInfo[element.viewType][fieldName]; - var rawModifiers = JSON.parse(fieldInfo.modifiers || "{}"); + var rawModifiers = fieldInfo.modifiers || {}; var modifiers = self._evalModifiers(record, rawModifiers); if (modifiers.required && !self._isFieldSet(recordData[fieldName], field.type)) { isValid = false; 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 93dd1f4fb73..d335999582e 100644 --- a/addons/web/static/src/js/views/basic/basic_renderer.js +++ b/addons/web/static/src/js/views/basic/basic_renderer.js @@ -101,8 +101,9 @@ var BasicRenderer = AbstractRenderer.extend({ // which are configured to always be reset on any change var resetWidgets = []; _.each(this.allFieldWidgets[id], function (widget) { - if (_.contains(fields, widget.name) || widget.resetOnAnyFieldChange) { - defs.push(widget.reset(record, ev)); + var fieldChanged = _.contains(fields, widget.name); + if (fieldChanged || widget.resetOnAnyFieldChange) { + defs.push(widget.reset(record, ev, fieldChanged)); resetWidgets.push(widget); } }); @@ -406,7 +407,7 @@ var BasicRenderer = AbstractRenderer.extend({ // If not, check the modifiers to see if it needs registration var modifiersData = this._getModifiersData(node); if (!modifiersData) { - var modifiers = JSON.parse(node.attrs.modifiers || "{}"); // FIXME parsed multiple times (record switching, no modifiers, ...) + var modifiers = node.attrs.modifiers || {}; modifiersData = { node: node, modifiers: modifiers, 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 b46d1f7c5fd..c9239d97d03 100644 --- a/addons/web/static/src/js/views/kanban/kanban_renderer.js +++ b/addons/web/static/src/js/views/kanban/kanban_renderer.js @@ -38,7 +38,7 @@ function qwebAddIf(node, condition) { function transformQwebTemplate(node, fields) { // Process modifiers if (node.tag && node.attrs.modifiers) { - var modifiers = JSON.parse(node.attrs.modifiers || "{}"); + var modifiers = node.attrs.modifiers || {}; if (modifiers.invisible) { qwebAddIf(node, _.str.sprintf("!kanban_compute_domain(%s)", JSON.stringify(modifiers.invisible))); } diff --git a/addons/web/static/src/js/views/list/list_renderer.js b/addons/web/static/src/js/views/list/list_renderer.js index 75633629e5e..3ba80210714 100644 --- a/addons/web/static/src/js/views/list/list_renderer.js +++ b/addons/web/static/src/js/views/list/list_renderer.js @@ -47,16 +47,9 @@ var ListRenderer = BasicRenderer.extend({ */ init: function (parent, state, params) { this._super.apply(this, arguments); - var self = this; this.hasHandle = false; this.handleField = 'sequence'; - this.columns = _.reject(this.arch.children, function (c) { - if (c.attrs.widget === 'handle') { - self.hasHandle = true; - self.handleField = c.attrs.name; - } - return !!JSON.parse(c.attrs.modifiers || "{}").tree_invisible; - }); + this._processColumns(params.columnInvisibleFields || {}); this.rowDecorations = _.chain(this.arch.attrs) .pick(function (value, key) { return DECORATIONS.indexOf(key) >= 0; @@ -69,6 +62,18 @@ var ListRenderer = BasicRenderer.extend({ }, //-------------------------------------------------------------------------- + // Public + //-------------------------------------------------------------------------- + + /** + * @override + */ + updateState: function (state, params) { + this._processColumns(params.columnInvisibleFields || {}); + return this._super.apply(this, arguments); + }, + + //-------------------------------------------------------------------------- // Private //-------------------------------------------------------------------------- @@ -161,6 +166,29 @@ var ListRenderer = BasicRenderer.extend({ return this.hasSelectors ? n+1 : n; }, /** + * Removes the columns which should be invisible. + * + * @param {Object} columnInvisibleFields contains the column invisible modifier values + */ + _processColumns: function (columnInvisibleFields) { + var self = this; + self.hasHandle = false; + self.handleField = null; + this.columns = _.reject(this.arch.children, function (c) { + var reject = c.attrs.modifiers.column_invisible; + // If there is an evaluated domain for the field we override the node + // attribute to have the evaluated modifier value. + if (c.attrs.name in columnInvisibleFields) { + reject = columnInvisibleFields[c.attrs.name]; + } + if (!reject && c.attrs.widget === 'handle') { + self.hasHandle = true; + self.handleField = c.attrs.name; + } + return reject; + }); + }, + /** * Render a list of <td>, with aggregates if available. It can be displayed * in the footer, or for each open groups. * |
