From 15bbf69a769990db2db90ad4d82c5c76717472da Mon Sep 17 00:00:00 2001 From: Mathieu Duckerts-Antoine Date: Fri, 7 Jul 2023 08:03:44 +0000 Subject: [PATCH] [FIX] web: domain selector dialog: disable confirm button on click On confirmation of a domain created in the domain selector dialog, a validation check involving the server is done. That validation based on a search_count can be rather/too costly (see PR message). Since the search_count is done in silent mode and the confirmation button is not disabled on click, if the validation takes too much time, the user is lead to think that the first click did not work and clicks again, and so on... Here we disable the button on appropriate time to avoid that situation. Part-of: odoo/odoo#127832 --- .../core/domain_selector_dialog/domain_selector_dialog.js | 7 ++++++- .../core/domain_selector_dialog/domain_selector_dialog.xml | 2 +- 2 files changed, 7 insertions(+), 2 deletions(-) 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 index bfef855dab1..78c767ea3d6 100644 --- 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 @@ -1,7 +1,7 @@ /** @odoo-module **/ import { _t } from "../l10n/translation"; -import { Component, useState } from "@odoo/owl"; +import { Component, useRef, useState } from "@odoo/owl"; import { Dialog } from "../dialog/dialog"; import { Domain } from "@web/core/domain"; import { DomainSelector } from "../domain_selector/domain_selector"; @@ -13,6 +13,7 @@ export class DomainSelectorDialog extends Component { this.orm = useService("orm"); this.user = useService("user"); this.state = useState({ domain: this.props.domain }); + this.confirmButtonRef = useRef("confirm"); } get confirmButtonText() { @@ -50,12 +51,16 @@ export class DomainSelectorDialog extends Component { } async onConfirm() { + this.confirmButtonRef.el.disabled = true; try { let domain = new Domain(this.state.domain); const evalContext = { ...this.user.context, ...this.props.context }; domain = domain.toList(evalContext); await this.orm.silent.searchCount(this.props.resModel, domain, { limit: 1 }); } catch { + if (this.confirmButtonRef.el) { + this.confirmButtonRef.el.disabled = false; + } this.notification.add(this.env._t("Domain is invalid. Please correct it"), { type: "danger", }); 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 index 7630d65e94d..98f4d6f12e7 100644 --- 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 @@ -10,7 +10,7 @@ - +