From da8f1d44c93aa8d632011c88a5dead74b4b948fe Mon Sep 17 00:00:00 2001 From: "Michael (mcm)" Date: Mon, 11 Jul 2022 06:40:22 +0000 Subject: [PATCH] [IMP] web: add `in_dialog` option to domain field In legacy, the domain field had an `in_dialog` option that was used to display a button that opens a dialog to edit the value. This commit reimplements the `DomainSelectorDialog` in owl and adds the option the new domain field. closes odoo/odoo#95768 Signed-off-by: Aaron Bohy (aab) --- .../domain_selector_dialog.js | 62 +++++++++++++++++++ .../domain_selector_dialog.xml | 19 ++++++ .../src/views/fields/domain/domain_field.js | 22 ++++++- .../src/views/fields/domain/domain_field.xml | 8 ++- .../tests/views/fields/domain_field_tests.js | 20 ++++++ 5 files changed, 126 insertions(+), 5 deletions(-) create mode 100644 addons/web/static/src/core/domain_selector_dialog/domain_selector_dialog.js create mode 100644 addons/web/static/src/core/domain_selector_dialog/domain_selector_dialog.xml diff --git a/addons/web/static/src/core/domain_selector_dialog/domain_selector_dialog.js b/addons/web/static/src/core/domain_selector_dialog/domain_selector_dialog.js new file mode 100644 index 00000000000..020bb36bc21 --- /dev/null +++ b/addons/web/static/src/core/domain_selector_dialog/domain_selector_dialog.js @@ -0,0 +1,62 @@ +/** @odoo-module **/ + +import { Dialog } from "../dialog/dialog"; +import { DomainSelector } from "../domain_selector/domain_selector"; +import { _t } from "../l10n/translation"; + +const { Component, useState } = owl; + +export class DomainSelectorDialog extends Component { + setup() { + this.state = useState({ + value: this.props.initialValue, + }); + } + + get dialogTitle() { + return _t("Domain"); + } + + get domainSelectorProps() { + return { + className: this.props.className, + resModel: this.props.resModel, + readonly: this.props.readonly, + isDebugMode: this.props.isDebugMode, + defaultLeafValue: this.props.defaultLeafValue, + value: this.state.value, + update: (value) => { + this.state.value = value; + }, + }; + } + + async onSave() { + await this.props.onSelected(this.state.value); + this.props.close(); + } + onDiscard() { + this.props.close(); + } +} +DomainSelectorDialog.template = "web.DomainSelectorDialog"; +DomainSelectorDialog.components = { + Dialog, + DomainSelector, +}; +DomainSelectorDialog.props = { + close: Function, + className: { type: String, optional: true }, + resModel: String, + readonly: { type: Boolean, optional: true }, + isDebugMode: { type: Boolean, optional: true }, + defaultLeafValue: { type: Array, optional: true }, + initialValue: { type: String, optional: true }, + onSelected: { type: Function, optional: true }, +}; +DomainSelectorDialog.defaultProps = { + initialValue: "", + onSelected: () => {}, + readonly: true, + isDebugMode: false, +}; diff --git a/addons/web/static/src/core/domain_selector_dialog/domain_selector_dialog.xml b/addons/web/static/src/core/domain_selector_dialog/domain_selector_dialog.xml new file mode 100644 index 00000000000..74ab5939996 --- /dev/null +++ b/addons/web/static/src/core/domain_selector_dialog/domain_selector_dialog.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/addons/web/static/src/views/fields/domain/domain_field.js b/addons/web/static/src/views/fields/domain/domain_field.js index 7bcf9d166c9..da8c6a84c26 100644 --- a/addons/web/static/src/views/fields/domain/domain_field.js +++ b/addons/web/static/src/views/fields/domain/domain_field.js @@ -1,9 +1,10 @@ /** @odoo-module **/ import { DomainSelector } from "@web/core/domain_selector/domain_selector"; +import { DomainSelectorDialog } from "@web/core/domain_selector_dialog/domain_selector_dialog"; import { _lt } from "@web/core/l10n/translation"; import { registry } from "@web/core/registry"; -import { useBus, useService } from "@web/core/utils/hooks"; +import { useBus, useService, useOwnedDialogs } from "@web/core/utils/hooks"; import { Domain } from "@web/core/domain"; import { SelectCreateDialog } from "@web/views/view_dialogs/select_create_dialog"; import { standardFieldProps } from "../standard_field_props"; @@ -17,7 +18,7 @@ export class DomainField extends Component { recordCount: null, isValid: true, }); - this.dialog = useService("dialog"); + this.addDialog = useOwnedDialogs(); this.displayedDomain = null; this.isDebugEdited = false; @@ -58,7 +59,7 @@ export class DomainField extends Component { } onButtonClick() { - this.dialog.add(SelectCreateDialog, { + this.addDialog(SelectCreateDialog, { title: this.env._t("Selected records"), noCreate: true, multiSelect: false, @@ -106,6 +107,16 @@ export class DomainField extends Component { this.isDebugEdited = isDebugEdited; return this.props.update(domain); } + + onEditDialogBtnClick() { + this.addDialog(DomainSelectorDialog, { + resModel: this.getResModel(this.props), + initialValue: this.props.value || "[]", + readonly: this.props.readonly, + isDebugMode: !!this.env.debug, + onSelected: this.props.update, + }); + } } DomainField.template = "web.DomainField"; @@ -114,8 +125,12 @@ DomainField.components = { }; DomainField.props = { ...standardFieldProps, + editInDialog: { type: Boolean, optional: true }, resModel: { type: String, optional: true }, }; +DomainField.defaultProps = { + editInDialog: false, +}; DomainField.displayName = _lt("Domain"); DomainField.supportedTypes = ["char"]; @@ -123,6 +138,7 @@ DomainField.supportedTypes = ["char"]; DomainField.isEmpty = () => false; DomainField.extractProps = ({ attrs }) => { return { + editInDialog: attrs.options.in_dialog, resModel: attrs.options.model, }; }; diff --git a/addons/web/static/src/views/fields/domain/domain_field.xml b/addons/web/static/src/views/fields/domain/domain_field.xml index f7670b6c9dd..ab2165908c2 100644 --- a/addons/web/static/src/views/fields/domain/domain_field.xml +++ b/addons/web/static/src/views/fields/domain/domain_field.xml @@ -2,12 +2,12 @@ -
+
+ + + +
diff --git a/addons/web/static/tests/views/fields/domain_field_tests.js b/addons/web/static/tests/views/fields/domain_field_tests.js index ab26535126a..f82963a818e 100644 --- a/addons/web/static/tests/views/fields/domain_field_tests.js +++ b/addons/web/static/tests/views/fields/domain_field_tests.js @@ -806,4 +806,24 @@ QUnit.module("Fields", (hooks) => { "record should not open when clicked on the 'N record(s)' button" ); }); + + QUnit.test("domain field with 'inDialog' options", async function (assert) { + await makeView({ + type: "form", + resModel: "partner", + serverData, + arch: ` +
+ + `, + }); + assert.containsNone(target, ".o_domain_leaf"); + assert.containsNone(target, ".modal"); + await click(target, ".o_field_domain_dialog_button"); + assert.containsOnce(target, ".modal"); + await click(target, ".modal .o_domain_add_first_node_button"); + await click(target, ".modal-footer .btn-primary"); + assert.containsOnce(target, ".o_domain_leaf"); + assert.strictEqual(target.querySelector(".o_domain_leaf").textContent, "ID = 1"); + }); });