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 498146a74d1..43e386e1c3d 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
@@ -10,6 +10,7 @@ import { useService } from "../utils/hooks";
export class DomainSelectorDialog extends Component {
setup() {
this.notification = useService("notification");
+ this.rpc = useService("rpc");
this.orm = useService("orm");
this.user = useService("user");
this.state = useState({ domain: this.props.domain });
@@ -50,13 +51,23 @@ export class DomainSelectorDialog extends Component {
};
}
- onConfirm() {
+ async onConfirm() {
this.confirmButtonRef.el.disabled = true;
- const evalContext = { ...this.user.context, ...this.props.context };
+ let domain;
+ let isValid;
try {
- const domain = new Domain(this.state.domain);
- domain.toList(evalContext);
+ const evalContext = { ...this.user.context, ...this.props.context };
+ domain = new Domain(this.state.domain).toList(evalContext);
} catch {
+ isValid = false;
+ }
+ if (isValid === undefined) {
+ isValid = await this.rpc("/web/domain/validate", {
+ model: this.props.resModel,
+ domain,
+ });
+ }
+ if (!isValid) {
if (this.confirmButtonRef.el) {
this.confirmButtonRef.el.disabled = false;
}
diff --git a/addons/web/static/tests/core/domain_selector_dialog_tests.js b/addons/web/static/tests/core/domain_selector_dialog_tests.js
index d7229e14ebf..ea5a1242544 100644
--- a/addons/web/static/tests/core/domain_selector_dialog_tests.js
+++ b/addons/web/static/tests/core/domain_selector_dialog_tests.js
@@ -109,15 +109,16 @@ QUnit.module("Components", (hooks) => {
assert.strictEqual(domain, "[('foo', '=', uid)]");
assert.step("confirmed");
},
- mockRPC(_, args) {
- if (args.method === "search_count") {
- assert.step("rpc validation");
+ mockRPC(route) {
+ if (route === "/web/domain/validate") {
+ assert.step("validation");
+ return true;
}
},
});
const confirmButton = fixture.querySelector(".o_dialog footer button");
await click(confirmButton);
- assert.verifySteps(["confirmed"]);
+ assert.verifySteps(["validation", "confirmed"]);
});
QUnit.test("can extend eval context", async (assert) => {
@@ -129,15 +130,16 @@ QUnit.module("Components", (hooks) => {
assert.step("confirmed");
},
- mockRPC(_, args) {
- if (args.method === "search_count") {
- assert.step("rpc validation");
+ mockRPC(route) {
+ if (route === "/web/domain/validate") {
+ assert.step("validation");
+ return true;
}
},
});
const confirmButton = fixture.querySelector(".o_dialog footer button");
await click(confirmButton);
- assert.verifySteps(["confirmed"]);
+ assert.verifySteps(["validation", "confirmed"]);
});
QUnit.test("a domain with an unknown expression is not valid", async (assert) => {
@@ -146,9 +148,9 @@ QUnit.module("Components", (hooks) => {
onConfirm() {
assert.step("confirmed");
},
- mockRPC(_, args) {
- if (args.method === "search_count") {
- assert.step("rpc validation");
+ mockRPC(route) {
+ if (route === "/web/domain/validate") {
+ assert.step("validation");
}
},
});
diff --git a/addons/web/static/tests/search/search_bar_menu_tests.js b/addons/web/static/tests/search/search_bar_menu_tests.js
index f5271dd25d3..86259b9fa94 100644
--- a/addons/web/static/tests/search/search_bar_menu_tests.js
+++ b/addons/web/static/tests/search/search_bar_menu_tests.js
@@ -1612,6 +1612,11 @@ QUnit.module("Search", (hooks) => {
context: {
search_default_filter: true,
},
+ mockRPC(route) {
+ if (route === "/web/domain/validate") {
+ return true;
+ }
+ },
});
assert.deepEqual(getFacetTexts(target), ["Filter"]);
assert.deepEqual(getDomain(controlPanel), [["foo", "=", "abc"]]);
@@ -1669,6 +1674,11 @@ QUnit.module("Search", (hooks) => {
searchMenuTypes: ["filter"],
searchViewId: false,
searchViewArch: `