From 3aadcb86ff28dc475ad1a210b6d112ac12f5f5d6 Mon Sep 17 00:00:00 2001 From: Pier Francesco Ferrari Date: Tue, 4 Aug 2026 19:00:08 +0200 Subject: [PATCH] feat: enhance customer group filter in rule engine --- packages/app-elements/src/locales/en.ts | 2 +- packages/app-elements/src/locales/it.ts | 2 +- .../ui/forms/RuleEngine/Condition/hooks.tsx | 1 + .../RuleEngine/InputResourceSelector.tsx | 2 +- .../docs/src/mocks/data/customer_groups.js | 88 +++++++++++++++++++ packages/docs/src/mocks/handlers.js | 2 + 6 files changed, 94 insertions(+), 3 deletions(-) create mode 100644 packages/docs/src/mocks/data/customer_groups.js diff --git a/packages/app-elements/src/locales/en.ts b/packages/app-elements/src/locales/en.ts index 2410736ac..7cfec83e9 100644 --- a/packages/app-elements/src/locales/en.ts +++ b/packages/app-elements/src/locales/en.ts @@ -429,7 +429,7 @@ const en = { "order.country_code": "country code", "order.currency_code": "currency code", "order.customer_email": "customer email", - "order.customer.customer_group.id": "customer group id", + "order.customer.customer_group.id": "customer group", "order.customer.customer_group.name": "customer group name", "order.customer.email": "customer email", "order.customer.tags.id": "customer tag", diff --git a/packages/app-elements/src/locales/it.ts b/packages/app-elements/src/locales/it.ts index 21f3b1e0c..bb7654281 100644 --- a/packages/app-elements/src/locales/it.ts +++ b/packages/app-elements/src/locales/it.ts @@ -412,7 +412,7 @@ const it: typeof en = { "order.currency_code": "valuta (3 lettere)", "order.customer_email": "email del customer", "order.customer.email": "email del customer", - "order.customer.customer_group.id": "id del customer group", + "order.customer.customer_group.id": "customer group", "order.customer.customer_group.name": "nome del customer group", "order.customer.tags.id": "customer tag", "order.customer.tags.name": "nome del customer tag", diff --git a/packages/app-elements/src/ui/forms/RuleEngine/Condition/hooks.tsx b/packages/app-elements/src/ui/forms/RuleEngine/Condition/hooks.tsx index 90dcd4ce4..192c8db8f 100644 --- a/packages/app-elements/src/ui/forms/RuleEngine/Condition/hooks.tsx +++ b/packages/app-elements/src/ui/forms/RuleEngine/Condition/hooks.tsx @@ -13,6 +13,7 @@ const selectableResources = { sku: "skus", sku_list: "sku_lists", bundle: "bundles", + customer_group: "customer_groups", } as const satisfies Record export function getResourceType(resourceId: string | undefined) { diff --git a/packages/app-elements/src/ui/forms/RuleEngine/InputResourceSelector.tsx b/packages/app-elements/src/ui/forms/RuleEngine/InputResourceSelector.tsx index 5776cf773..ce921b2b7 100644 --- a/packages/app-elements/src/ui/forms/RuleEngine/InputResourceSelector.tsx +++ b/packages/app-elements/src/ui/forms/RuleEngine/InputResourceSelector.tsx @@ -18,7 +18,7 @@ export const InputResourceSelector: React.FC<{ value?: ItemWithValue["value"] resource: Extract< ListableResourceType, - "markets" | "tags" | "skus" | "sku_lists" | "bundles" + "markets" | "tags" | "skus" | "sku_lists" | "bundles" | "customer_groups" > resourceKey: string isMulti?: boolean diff --git a/packages/docs/src/mocks/data/customer_groups.js b/packages/docs/src/mocks/data/customer_groups.js new file mode 100644 index 000000000..f5b6e624d --- /dev/null +++ b/packages/docs/src/mocks/data/customer_groups.js @@ -0,0 +1,88 @@ +import { HttpResponse, http } from "msw" + +const mockedCustomerGroups = [ + { + id: "rlEPzheRgO", + type: "customer_groups", + links: { + self: "https://mock.localhost/api/customer_groups/rlEPzheRgO", + }, + attributes: { + name: "VIP", + created_at: "2022-08-23T09:59:25.940Z", + updated_at: "2022-08-23T09:59:25.940Z", + reference: "", + reference_origin: "", + metadata: {}, + }, + meta: { mode: "test", organization_id: "WXlEOFrjnr" }, + }, + { + id: "dlQbPhNNop", + type: "customer_groups", + links: { + self: "https://mock.localhost/api/customer_groups/dlQbPhNNop", + }, + attributes: { + name: "Wholesale", + created_at: "2022-03-11T09:40:49.000Z", + updated_at: "2023-03-13T13:30:32.184Z", + reference: "customer_group_1", + reference_origin: "CLI", + metadata: {}, + }, + meta: { mode: "test", organization_id: "WXlEOFrjnr" }, + }, + { + id: "AlRevhXQga", + type: "customer_groups", + links: { + self: "https://mock.localhost/api/customer_groups/AlRevhXQga", + }, + attributes: { + name: "Employees", + created_at: "2022-05-13T12:27:05.075Z", + updated_at: "2022-05-13T12:27:05.075Z", + reference: "", + reference_origin: "", + metadata: {}, + }, + meta: { mode: "test", organization_id: "WXlEOFrjnr" }, + }, +] + +const singleCustomerGroup = http.get( + `https://mock.localhost/api/customer_groups/:customerGroupId`, + async ({ params }) => { + const customerGroup = mockedCustomerGroups.find( + (item) => item.id === params.customerGroupId, + ) + return HttpResponse.json({ + data: customerGroup ?? mockedCustomerGroups[0], + }) + }, +) + +const organizationCustomerGroups = http.get( + `https://mock.localhost/api/customer_groups`, + async ({ request }) => { + const url = new URL(request.url) + const name = + url.searchParams.get("filter[q][name_i_cont]")?.toLowerCase() ?? "" + const idIn = url.searchParams.get("filter[q][id_in]") + + const filtered = mockedCustomerGroups.filter((customerGroup) => { + if (idIn != null) { + return idIn.split(",").includes(customerGroup.id) + } + return customerGroup.attributes.name.toLowerCase().includes(name) + }) + + return HttpResponse.json({ + data: filtered, + meta: { record_count: filtered.length, page_count: 1 }, + }) + }, +) + +export default [singleCustomerGroup, organizationCustomerGroups] diff --git a/packages/docs/src/mocks/handlers.js b/packages/docs/src/mocks/handlers.js index 2482a7761..9e67855bc 100644 --- a/packages/docs/src/mocks/handlers.js +++ b/packages/docs/src/mocks/handlers.js @@ -1,6 +1,7 @@ import addresses from "./data/addresses" import adjustments from "./data/adjustments" import bundles from "./data/bundles" +import customerGroups from "./data/customer_groups" import customers from "./data/customers" import lineItems from "./data/line_items" import markets from "./data/markets" @@ -14,6 +15,7 @@ export const handlers = [ ...addresses, ...adjustments, ...bundles, + ...customerGroups, ...customers, ...lineItems, ...markets,