summaryrefslogtreecommitdiff
path: root/addons/web/static/src/js/views
diff options
context:
space:
mode:
authorfwi-odoo <fwi@odoo.com>2017-09-15 10:19:16 +0200
committerfwi-odoo <fwi@odoo.com>2017-09-29 16:49:20 +0200
commitda136d83bb4cd952dc0e2417d67679cfc5068f34 (patch)
treed149d19de2188ecd5f5aff05bea09c6201e78211 /addons/web/static/src/js/views
parenta7d1740e475c44b50d0cc6ce6f43e9f142e99334 (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')
-rw-r--r--addons/web/static/src/js/views/basic/basic_model.js7
-rw-r--r--addons/web/static/src/js/views/basic/basic_renderer.js7
-rw-r--r--addons/web/static/src/js/views/kanban/kanban_renderer.js2
-rw-r--r--addons/web/static/src/js/views/list/list_renderer.js44
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.
*