diff options
| author | oco-odoo <oco@odoo.com> | 2018-06-08 15:20:49 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2018-06-08 15:20:49 +0200 |
| commit | d4cd8be48f83a7775c667bc6c968a4b9e14679be (patch) | |
| tree | 9185c59636525a98292e31112ca00152c0db4fb3 /addons/web/static/src/js/fields | |
| parent | a8aa0bcbbe48babe877e08d81e5bdcc9e5779fdc (diff) | |
[IMP] web: add decoration support for all field widgets (#25160)
It is sometimes useful to be able to customize slightly the color of a
field depending on some conditions on the current record.
For example, imagine that we want to show a VAT number field in green/red, if
it was validated or not. To do that, we can add a field with an
onchange, and simply add decoration-danger and decoration-success
attributes to the field.
Diffstat (limited to 'addons/web/static/src/js/fields')
| -rw-r--r-- | addons/web/static/src/js/fields/abstract_field.js | 24 | ||||
| -rw-r--r-- | addons/web/static/src/js/fields/basic_fields.js | 7 |
2 files changed, 31 insertions, 0 deletions
diff --git a/addons/web/static/src/js/fields/abstract_field.js b/addons/web/static/src/js/fields/abstract_field.js index 735e12a3861..9bb61475b83 100644 --- a/addons/web/static/src/js/fields/abstract_field.js +++ b/addons/web/static/src/js/fields/abstract_field.js @@ -172,6 +172,12 @@ var AbstractField = Widget.extend({ // calls to the format (resp. parse) function. this.formatOptions = {}; this.parseOptions = {}; + + // if we add decorations, we need to reevaluate the field whenever any + // value from the record is changed + if (this.attrs.decorations) { + this.resetOnAnyFieldChange = true; + } }, /** * Loads the libraries listed in this.jsLibs and this.cssLibs @@ -332,6 +338,21 @@ var AbstractField = Widget.extend({ //-------------------------------------------------------------------------- /** + * Apply field decorations (only if field-specific decorations have been + * defined in an attribute). + * + * @private + */ + _applyDecorations: function () { + var self = this; + this.attrs.decorations.forEach(function (dec) { + var isToggled = py.PY_isTrue( + py.evaluate(dec.expression, self.record.evalContext) + ); + self.$el.toggleClass(dec.className, isToggled); + }); + }, + /** * Converts the value from the field to a string representation. * * @private @@ -377,6 +398,9 @@ var AbstractField = Widget.extend({ * @returns {Deferred|undefined} */ _render: function () { + if (this.attrs.decorations) { + this._applyDecorations(); + } if (this.mode === 'edit') { return this._renderEdit(); } else if (this.mode === 'readonly') { diff --git a/addons/web/static/src/js/fields/basic_fields.js b/addons/web/static/src/js/fields/basic_fields.js index 31b0c53dd64..01b4cb4371d 100644 --- a/addons/web/static/src/js/fields/basic_fields.js +++ b/addons/web/static/src/js/fields/basic_fields.js @@ -206,6 +206,13 @@ var InputField = DebouncedField.extend({ this.isDirty = false; } if (this.isDirty || (event && event.target === this && event.data.changes[this.name] === this.value)) { + if (this.attrs.decorations) { + // if a field is modified, then it could have triggered an onchange + // which changed some of its decorations. Since we bypass the + // render function, we need to apply decorations here to make + // sure they are recomputed. + this._applyDecorations(); + } return $.when(); } else { return this._render(); |
