diff options
| author | Aaron Bohy <aab@odoo.com> | 2021-03-05 12:55:33 +0000 |
|---|---|---|
| committer | Aaron Bohy <aab@odoo.com> | 2021-03-08 09:35:17 +0000 |
| commit | 6aaa1c07da5fc10004e278d14f9fa05720c96c79 (patch) | |
| tree | 8422a00b30e9689e8cea4d5d5ed4ed36f2a271e8 /addons/web/static/src | |
| parent | 8127bea147c093aa64ac7d31ebc69e4dcbef6eef (diff) | |
[FIX] web: FieldMany2Many: link/unlink options
Commit [1] altered the way the FieldMany2Many behaves with respect
to 'create' and 'delete' options. Indeed, for many2many fields,
adding or removing records doesn't mean "creating" or "deleting"
records, as it is only about adding/removing records to/from a
relation. This is completely fine and correct.
Unfortunately, a feature has been lost in the process: it is no
longer possible to state that a many2many field should be editable
but should not allow to add (or remove) record to the relation.
This commit fixes the issue by adding two new options: 'link' and
'unlink' for that purpose.
[1] https://github.com/odoo/odoo/commit/c98579d25af01c14df4baf57fb4652f3e7469096
opw~2466213
closes odoo/odoo#67358
Signed-off-by: Lucas Perais (lpe) <lpe@odoo.com>
Diffstat (limited to 'addons/web/static/src')
| -rw-r--r-- | addons/web/static/src/js/fields/relational_fields.js | 36 |
1 files changed, 31 insertions, 5 deletions
diff --git a/addons/web/static/src/js/fields/relational_fields.js b/addons/web/static/src/js/fields/relational_fields.js index 0ad11dba91a..ca98415762a 100644 --- a/addons/web/static/src/js/fields/relational_fields.js +++ b/addons/web/static/src/js/fields/relational_fields.js @@ -1182,8 +1182,14 @@ var FieldX2Many = AbstractField.extend(WidgetAdapterMixin, { // re-evaluate available actions const oldCanCreate = this.canCreate; const oldCanDelete = this.canDelete; + const oldCanLink = this.canLink; + const oldCanUnlink = this.canUnlink; this._computeAvailableActions(record); - const actionsChanged = this.canCreate !== oldCanCreate || this.canDelete !== oldCanDelete; + const actionsChanged = + this.canCreate !== oldCanCreate || + this.canDelete !== oldCanDelete || + this.canLink !== oldCanLink || + this.canUnlink !== oldCanUnlink; // If 'fieldChanged' is false, it means that the reset was triggered by // the 'resetOnAnyFieldChange' mechanism. If it is the case, if neither @@ -1260,6 +1266,12 @@ var FieldX2Many = AbstractField.extend(WidgetAdapterMixin, { this.canDelete = 'delete' in this.nodeOptions ? new Domain(this.nodeOptions.delete, evalContext).compute(evalContext) : true; + this.canLink = 'link' in this.nodeOptions ? + new Domain(this.nodeOptions.link, evalContext).compute(evalContext) : + true; + this.canUnlink = 'unlink' in this.nodeOptions ? + new Domain(this.nodeOptions.unlink, evalContext).compute(evalContext) : + true; }, /** * Evaluates the 'column_invisible' modifier for the parent record. @@ -1309,8 +1321,8 @@ var FieldX2Many = AbstractField.extend(WidgetAdapterMixin, { */ _hasCreateLine: function () { return !this.isReadonly && ( - (this.activeActions.create && this.canCreate) || - (this.isMany2Many) + (!this.isMany2Many && this.activeActions.create && this.canCreate) || + (this.isMany2Many && this.canLink) ); }, /** @@ -1319,8 +1331,8 @@ var FieldX2Many = AbstractField.extend(WidgetAdapterMixin, { */ _hasTrashIcon: function () { return !this.isReadonly && ( - (this.activeActions.delete && this.canDelete) || - (this.isMany2Many) + (!this.isMany2Many && this.activeActions.delete && this.canDelete) || + (this.isMany2Many && this.canUnlink) ); }, /** @@ -2066,6 +2078,20 @@ var FieldMany2Many = FieldX2Many.extend({ }, //-------------------------------------------------------------------------- + // Private + //-------------------------------------------------------------------------- + + /** + * @override + * @private + */ + _getButtonsRenderingContext() { + const renderingContext = this._super(...arguments); + renderingContext.noCreate = !this.canLink; + return renderingContext; + }, + + //-------------------------------------------------------------------------- // Handlers //-------------------------------------------------------------------------- |
