@endora-commerce/mod-price-lists 0.100.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +59 -0
- package/dist/admin/components/ApplicationRuleBuilder.d.ts +24 -0
- package/dist/admin/components/ApplicationRuleBuilder.d.ts.map +1 -0
- package/dist/admin/components/ApplicationRuleBuilder.js +249 -0
- package/dist/admin/components/ApplicationRuleBuilder.js.map +1 -0
- package/dist/admin/components/BracketGrid.d.ts +29 -0
- package/dist/admin/components/BracketGrid.d.ts.map +1 -0
- package/dist/admin/components/BracketGrid.js +252 -0
- package/dist/admin/components/BracketGrid.js.map +1 -0
- package/dist/admin/components/DisplayModeOverrideRow.d.ts +46 -0
- package/dist/admin/components/DisplayModeOverrideRow.d.ts.map +1 -0
- package/dist/admin/components/DisplayModeOverrideRow.js +109 -0
- package/dist/admin/components/DisplayModeOverrideRow.js.map +1 -0
- package/dist/admin/components/LinkedPriceListsPanel.d.ts +55 -0
- package/dist/admin/components/LinkedPriceListsPanel.d.ts.map +1 -0
- package/dist/admin/components/LinkedPriceListsPanel.js +131 -0
- package/dist/admin/components/LinkedPriceListsPanel.js.map +1 -0
- package/dist/admin/index.d.ts +34 -0
- package/dist/admin/index.d.ts.map +1 -0
- package/dist/admin/index.js +119 -0
- package/dist/admin/index.js.map +1 -0
- package/dist/admin/pages/DisplayModeOverridesPage.d.ts +25 -0
- package/dist/admin/pages/DisplayModeOverridesPage.d.ts.map +1 -0
- package/dist/admin/pages/DisplayModeOverridesPage.js +266 -0
- package/dist/admin/pages/DisplayModeOverridesPage.js.map +1 -0
- package/dist/admin/pages/PriceListDetailPage.d.ts +23 -0
- package/dist/admin/pages/PriceListDetailPage.d.ts.map +1 -0
- package/dist/admin/pages/PriceListDetailPage.js +421 -0
- package/dist/admin/pages/PriceListDetailPage.js.map +1 -0
- package/dist/admin/pages/PriceListsPage.d.ts +17 -0
- package/dist/admin/pages/PriceListsPage.d.ts.map +1 -0
- package/dist/admin/pages/PriceListsPage.js +198 -0
- package/dist/admin/pages/PriceListsPage.js.map +1 -0
- package/dist/admin/zones/CategoryDisplayMode.d.ts +27 -0
- package/dist/admin/zones/CategoryDisplayMode.d.ts.map +1 -0
- package/dist/admin/zones/CategoryDisplayMode.js +11 -0
- package/dist/admin/zones/CategoryDisplayMode.js.map +1 -0
- package/dist/admin/zones/OrganizationDisplayMode.d.ts +36 -0
- package/dist/admin/zones/OrganizationDisplayMode.d.ts.map +1 -0
- package/dist/admin/zones/OrganizationDisplayMode.js +12 -0
- package/dist/admin/zones/OrganizationDisplayMode.js.map +1 -0
- package/dist/admin/zones/ProductLinkedPriceLists.d.ts +16 -0
- package/dist/admin/zones/ProductLinkedPriceLists.d.ts.map +1 -0
- package/dist/admin/zones/ProductLinkedPriceLists.js +7 -0
- package/dist/admin/zones/ProductLinkedPriceLists.js.map +1 -0
- package/dist/backend/entities/price-display-mode-override.entity.d.ts +23 -0
- package/dist/backend/entities/price-display-mode-override.entity.d.ts.map +1 -0
- package/dist/backend/entities/price-display-mode-override.entity.js +58 -0
- package/dist/backend/entities/price-display-mode-override.entity.js.map +1 -0
- package/dist/backend/entities/price-list-price-bracket.entity.d.ts +26 -0
- package/dist/backend/entities/price-list-price-bracket.entity.d.ts.map +1 -0
- package/dist/backend/entities/price-list-price-bracket.entity.js +73 -0
- package/dist/backend/entities/price-list-price-bracket.entity.js.map +1 -0
- package/dist/backend/entities/price-list-product.entity.d.ts +15 -0
- package/dist/backend/entities/price-list-product.entity.d.ts.map +1 -0
- package/dist/backend/entities/price-list-product.entity.js +43 -0
- package/dist/backend/entities/price-list-product.entity.js.map +1 -0
- package/dist/backend/entities/price-list.entity.d.ts +34 -0
- package/dist/backend/entities/price-list.entity.d.ts.map +1 -0
- package/dist/backend/entities/price-list.entity.js +115 -0
- package/dist/backend/entities/price-list.entity.js.map +1 -0
- package/dist/backend/index.d.ts +125 -0
- package/dist/backend/index.d.ts.map +1 -0
- package/dist/backend/index.js +179 -0
- package/dist/backend/index.js.map +1 -0
- package/dist/backend/plugin.d.ts +68 -0
- package/dist/backend/plugin.d.ts.map +1 -0
- package/dist/backend/plugin.js +88 -0
- package/dist/backend/plugin.js.map +1 -0
- package/dist/backend/routes.d.ts +40 -0
- package/dist/backend/routes.d.ts.map +1 -0
- package/dist/backend/routes.js +447 -0
- package/dist/backend/routes.js.map +1 -0
- package/dist/backend/routes.storefront.d.ts +47 -0
- package/dist/backend/routes.storefront.d.ts.map +1 -0
- package/dist/backend/routes.storefront.js +131 -0
- package/dist/backend/routes.storefront.js.map +1 -0
- package/dist/backend/services/application-rule-evaluator.d.ts +25 -0
- package/dist/backend/services/application-rule-evaluator.d.ts.map +1 -0
- package/dist/backend/services/application-rule-evaluator.js +2 -0
- package/dist/backend/services/application-rule-evaluator.js.map +1 -0
- package/dist/backend/services/audit-references.d.ts +11 -0
- package/dist/backend/services/audit-references.d.ts.map +1 -0
- package/dist/backend/services/audit-references.js +23 -0
- package/dist/backend/services/audit-references.js.map +1 -0
- package/dist/backend/services/default-price-list-migration.d.ts +70 -0
- package/dist/backend/services/default-price-list-migration.d.ts.map +1 -0
- package/dist/backend/services/default-price-list-migration.js +177 -0
- package/dist/backend/services/default-price-list-migration.js.map +1 -0
- package/dist/backend/services/display-mode-resolver.d.ts +78 -0
- package/dist/backend/services/display-mode-resolver.d.ts.map +1 -0
- package/dist/backend/services/display-mode-resolver.js +71 -0
- package/dist/backend/services/display-mode-resolver.js.map +1 -0
- package/dist/backend/services/listing-price-chain.d.ts +26 -0
- package/dist/backend/services/listing-price-chain.d.ts.map +1 -0
- package/dist/backend/services/listing-price-chain.js +55 -0
- package/dist/backend/services/listing-price-chain.js.map +1 -0
- package/dist/backend/services/price-bracket-resolver.d.ts +24 -0
- package/dist/backend/services/price-bracket-resolver.d.ts.map +1 -0
- package/dist/backend/services/price-bracket-resolver.js +16 -0
- package/dist/backend/services/price-bracket-resolver.js.map +1 -0
- package/dist/backend/services/price-list-candidate-vector.d.ts +116 -0
- package/dist/backend/services/price-list-candidate-vector.d.ts.map +1 -0
- package/dist/backend/services/price-list-candidate-vector.js +133 -0
- package/dist/backend/services/price-list-candidate-vector.js.map +1 -0
- package/dist/backend/services/price-list-currency-reference.d.ts +12 -0
- package/dist/backend/services/price-list-currency-reference.d.ts.map +1 -0
- package/dist/backend/services/price-list-currency-reference.js +24 -0
- package/dist/backend/services/price-list-currency-reference.js.map +1 -0
- package/dist/backend/services/price-list-read-port.d.ts +29 -0
- package/dist/backend/services/price-list-read-port.d.ts.map +1 -0
- package/dist/backend/services/price-list-read-port.js +64 -0
- package/dist/backend/services/price-list-read-port.js.map +1 -0
- package/dist/backend/services/price-list-resolver.d.ts +26 -0
- package/dist/backend/services/price-list-resolver.d.ts.map +1 -0
- package/dist/backend/services/price-list-resolver.js +37 -0
- package/dist/backend/services/price-list-resolver.js.map +1 -0
- package/dist/backend/services/price-list-service.d.ts +431 -0
- package/dist/backend/services/price-list-service.d.ts.map +1 -0
- package/dist/backend/services/price-list-service.js +1238 -0
- package/dist/backend/services/price-list-service.js.map +1 -0
- package/dist/backend/services/price-list-status-worker.d.ts +28 -0
- package/dist/backend/services/price-list-status-worker.d.ts.map +1 -0
- package/dist/backend/services/price-list-status-worker.js +38 -0
- package/dist/backend/services/price-list-status-worker.js.map +1 -0
- package/dist/backend/services/pricing-cache.d.ts +53 -0
- package/dist/backend/services/pricing-cache.d.ts.map +1 -0
- package/dist/backend/services/pricing-cache.js +88 -0
- package/dist/backend/services/pricing-cache.js.map +1 -0
- package/dist/backend/services/pricing-service.d.ts +304 -0
- package/dist/backend/services/pricing-service.d.ts.map +1 -0
- package/dist/backend/services/pricing-service.interface.d.ts +151 -0
- package/dist/backend/services/pricing-service.interface.d.ts.map +1 -0
- package/dist/backend/services/pricing-service.interface.js +10 -0
- package/dist/backend/services/pricing-service.interface.js.map +1 -0
- package/dist/backend/services/pricing-service.js +803 -0
- package/dist/backend/services/pricing-service.js.map +1 -0
- package/dist/backend/services/unit-price-ordering.d.ts +121 -0
- package/dist/backend/services/unit-price-ordering.d.ts.map +1 -0
- package/dist/backend/services/unit-price-ordering.js +164 -0
- package/dist/backend/services/unit-price-ordering.js.map +1 -0
- package/dist/manifest.d.ts +218 -0
- package/dist/manifest.d.ts.map +1 -0
- package/dist/manifest.js +228 -0
- package/dist/manifest.js.map +1 -0
- package/dist/migrations/20260426T075235_price_lists_pricing_init.d.ts +24 -0
- package/dist/migrations/20260426T075235_price_lists_pricing_init.d.ts.map +1 -0
- package/dist/migrations/20260426T075235_price_lists_pricing_init.js +89 -0
- package/dist/migrations/20260426T075235_price_lists_pricing_init.js.map +1 -0
- package/dist/migrations/20260504T125655_price_lists_engine.d.ts +6 -0
- package/dist/migrations/20260504T125655_price_lists_engine.d.ts.map +1 -0
- package/dist/migrations/20260504T125655_price_lists_engine.js +319 -0
- package/dist/migrations/20260504T125655_price_lists_engine.js.map +1 -0
- package/dist/migrations/20260817T055457_price_lists_single_system_price_list.d.ts +15 -0
- package/dist/migrations/20260817T055457_price_lists_single_system_price_list.d.ts.map +1 -0
- package/dist/migrations/20260817T055457_price_lists_single_system_price_list.js +58 -0
- package/dist/migrations/20260817T055457_price_lists_single_system_price_list.js.map +1 -0
- package/dist/migrations/20260821T135907_price_lists_unit_price_amount_index.d.ts +40 -0
- package/dist/migrations/20260821T135907_price_lists_unit_price_amount_index.d.ts.map +1 -0
- package/dist/migrations/20260821T135907_price_lists_unit_price_amount_index.js +46 -0
- package/dist/migrations/20260821T135907_price_lists_unit_price_amount_index.js.map +1 -0
- package/dist/migrations/index.d.ts +30 -0
- package/dist/migrations/index.d.ts.map +1 -0
- package/dist/migrations/index.js +35 -0
- package/dist/migrations/index.js.map +1 -0
- package/docs/price_lists.md +278 -0
- package/i18n/en.json +14 -0
- package/i18n/pl.json +14 -0
- package/package.json +99 -0
- package/tailwind.css +14 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Endora sp. z o.o. and the Endora Commerce contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
<!-- Generated by `pnpm --filter backend run manifests:generate`. Delete this line to take the file over; a README without it is never regenerated. -->
|
|
2
|
+
|
|
3
|
+
# @endora-commerce/mod-price-lists
|
|
4
|
+
|
|
5
|
+
Customer-group pricing, brackets, display modes, and rule-based engine.
|
|
6
|
+
|
|
7
|
+
## What this is
|
|
8
|
+
|
|
9
|
+
An **Endora Commerce module package**. Its module id is `price_lists` — the identity of record in the platform's registries, in its migrations and in its setting, permission and translation codes.
|
|
10
|
+
|
|
11
|
+
A module is not imported by application code. The platform discovers the extension packages an instance has installed, reads the manifest on the root subpath and composes the module from it, so installing this package and starting the instance is the whole integration.
|
|
12
|
+
|
|
13
|
+
## Entry points
|
|
14
|
+
|
|
15
|
+
| Import | Contents |
|
|
16
|
+
| --- | --- |
|
|
17
|
+
| `@endora-commerce/mod-price-lists` | the module manifest — its id, version, dependencies, settings and activation |
|
|
18
|
+
| `@endora-commerce/mod-price-lists/admin` | the Admin UI contribution: the screens, navigation and palette actions it adds |
|
|
19
|
+
| `@endora-commerce/mod-price-lists/backend` | the composition root the platform calls, with the entities, services, routes and workers it registers |
|
|
20
|
+
| `@endora-commerce/mod-price-lists/migrations` | the module’s own schema migrations, in the order the platform runs them |
|
|
21
|
+
| `@endora-commerce/mod-price-lists/tailwind.css` | the Tailwind source declaration for the admin code above |
|
|
22
|
+
|
|
23
|
+
## Depends on
|
|
24
|
+
|
|
25
|
+
Everything below is a **peer** dependency, so the application resolves exactly one copy of each — two copies of a host or of React are a runtime failure rather than a type error. An entry marked *optional* is needed only by the layers that use it.
|
|
26
|
+
|
|
27
|
+
**Endora packages**
|
|
28
|
+
|
|
29
|
+
- `@endora-commerce/admin-kit` — *optional*
|
|
30
|
+
- `@endora-commerce/contracts`
|
|
31
|
+
- `@endora-commerce/platform`
|
|
32
|
+
|
|
33
|
+
**Third-party**
|
|
34
|
+
|
|
35
|
+
- `@mikro-orm/core` ^6
|
|
36
|
+
- `@mikro-orm/migrations` ^6
|
|
37
|
+
- `@mikro-orm/postgresql` ^6
|
|
38
|
+
- `fastify` ^5
|
|
39
|
+
- `lucide-react` ^1 — *optional*
|
|
40
|
+
- `react` ^19 — *optional*
|
|
41
|
+
- `react-router-dom` ^7 — *optional*
|
|
42
|
+
- `zod` ^4
|
|
43
|
+
|
|
44
|
+
## What the tarball carries
|
|
45
|
+
|
|
46
|
+
- `dist/` — the compiled JavaScript and its type declarations
|
|
47
|
+
- `i18n/` — the translation bundles this package ships (`en`, `pl`), loaded by the platform
|
|
48
|
+
- `docs/` — the package’s own pages in the Endora Commerce documentation site
|
|
49
|
+
- `tailwind.css` — the Tailwind source declaration
|
|
50
|
+
|
|
51
|
+
## Install
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
pnpm add @endora-commerce/mod-price-lists
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
## Licence
|
|
58
|
+
|
|
59
|
+
MIT — the text is in `LICENSE`, beside this file.
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { type ReactNode } from 'react';
|
|
2
|
+
import type { ApplicationRule } from '@endora-commerce/contracts';
|
|
3
|
+
/**
|
|
4
|
+
* ApplicationRuleBuilder (US4 / T055).
|
|
5
|
+
*
|
|
6
|
+
* Recursive editor over the AST defined in
|
|
7
|
+
* `@endora-commerce/contracts/price-lists#ApplicationRule`. The contract caps depth
|
|
8
|
+
* at 5 nested groups; the UI disables "add subgroup" once that limit is
|
|
9
|
+
* reached so the validator never sees a tree it has to reject.
|
|
10
|
+
*
|
|
11
|
+
* Pickers are loaded lazily on first use from
|
|
12
|
+
* `/api/v1/admin/pricing/rule-targets/*`. Currency values are
|
|
13
|
+
* uppercased; every other criterion stores the target row ID.
|
|
14
|
+
*
|
|
15
|
+
* The component is fully controlled — the parent owns the AST and
|
|
16
|
+
* receives a new tree on every edit.
|
|
17
|
+
*/
|
|
18
|
+
export declare function ApplicationRuleBuilder(props: {
|
|
19
|
+
value: ApplicationRule;
|
|
20
|
+
onChange: (next: ApplicationRule) => void;
|
|
21
|
+
/** When true, every interactive control is disabled. */
|
|
22
|
+
disabled?: boolean;
|
|
23
|
+
}): ReactNode;
|
|
24
|
+
//# sourceMappingURL=ApplicationRuleBuilder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ApplicationRuleBuilder.d.ts","sourceRoot":"","sources":["../../../src/admin/components/ApplicationRuleBuilder.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAqD,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAY1F,OAAO,KAAK,EACV,eAAe,EAIhB,MAAM,4BAA4B,CAAC;AAmBpC;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE;IAC5C,KAAK,EAAE,eAAe,CAAC;IACvB,QAAQ,EAAE,CAAC,IAAI,EAAE,eAAe,KAAK,IAAI,CAAC;IAC1C,wDAAwD;IACxD,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,GAAG,SAAS,CAmDZ"}
|
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
|
|
3
|
+
import { ChevronDown, ChevronRight, Plus, Trash2, ArrowDown, ArrowUp, CheckSquare, Square, Search, } from 'lucide-react';
|
|
4
|
+
import { ApiError, apiClient, normalize } from '@endora-commerce/admin-kit/lib';
|
|
5
|
+
import { useTranslation } from '@endora-commerce/admin-kit/i18n';
|
|
6
|
+
const DEPTH_CAP = 5;
|
|
7
|
+
const CRITERION_TYPES = ['salesChannel', 'customerGroup', 'organization', 'category', 'currency'];
|
|
8
|
+
/**
|
|
9
|
+
* ApplicationRuleBuilder (US4 / T055).
|
|
10
|
+
*
|
|
11
|
+
* Recursive editor over the AST defined in
|
|
12
|
+
* `@endora-commerce/contracts/price-lists#ApplicationRule`. The contract caps depth
|
|
13
|
+
* at 5 nested groups; the UI disables "add subgroup" once that limit is
|
|
14
|
+
* reached so the validator never sees a tree it has to reject.
|
|
15
|
+
*
|
|
16
|
+
* Pickers are loaded lazily on first use from
|
|
17
|
+
* `/api/v1/admin/pricing/rule-targets/*`. Currency values are
|
|
18
|
+
* uppercased; every other criterion stores the target row ID.
|
|
19
|
+
*
|
|
20
|
+
* The component is fully controlled — the parent owns the AST and
|
|
21
|
+
* receives a new tree on every edit.
|
|
22
|
+
*/
|
|
23
|
+
export function ApplicationRuleBuilder(props) {
|
|
24
|
+
const t = useTranslation('core');
|
|
25
|
+
const { value, onChange, disabled } = props;
|
|
26
|
+
const [pickers, setPickers] = useState(() => ({
|
|
27
|
+
salesChannel: { loading: false, options: [], error: null },
|
|
28
|
+
customerGroup: { loading: false, options: [], error: null },
|
|
29
|
+
organization: { loading: false, options: [], error: null },
|
|
30
|
+
category: { loading: false, options: [], error: null },
|
|
31
|
+
currency: { loading: false, options: [], error: null },
|
|
32
|
+
}));
|
|
33
|
+
const attemptedRef = useRef(new Set());
|
|
34
|
+
const ensurePicker = useCallback(async (type) => {
|
|
35
|
+
if (attemptedRef.current.has(type))
|
|
36
|
+
return;
|
|
37
|
+
attemptedRef.current.add(type);
|
|
38
|
+
setPickers((prev) => ({ ...prev, [type]: { ...prev[type], loading: true } }));
|
|
39
|
+
try {
|
|
40
|
+
const options = await loadPicker(type);
|
|
41
|
+
setPickers((prev) => ({ ...prev, [type]: { loading: false, options, error: null } }));
|
|
42
|
+
}
|
|
43
|
+
catch (err) {
|
|
44
|
+
const message = err instanceof ApiError ? err.envelope.error.message : t('priceLists.rule.error.load');
|
|
45
|
+
setPickers((prev) => ({ ...prev, [type]: { ...prev[type], loading: false, error: message } }));
|
|
46
|
+
}
|
|
47
|
+
}, [t]);
|
|
48
|
+
return (_jsxs("div", { className: "b2b-col", style: { gap: 12 }, children: [_jsx("div", { className: "b2b-help", children: t('priceLists.rule.intro') }), _jsx(RuleNodeView, { node: value, path: [], depth: 0, disabled: disabled ?? false, pickers: pickers, ensurePicker: ensurePicker, onReplace: (next) => onChange(next ?? { kind: 'all' }) }), _jsxs("div", { className: "b2b-help", style: { display: 'flex', alignItems: 'center', gap: 8, marginTop: 4 }, children: [_jsx("span", { children: t('priceLists.rule.depthLimit', { cap: DEPTH_CAP }) }), _jsx("span", { children: t('priceLists.rule.currencyHint') })] })] }));
|
|
49
|
+
}
|
|
50
|
+
function RuleNodeView(props) {
|
|
51
|
+
const t = useTranslation('core');
|
|
52
|
+
const { node, depth, disabled, pickers, ensurePicker, onReplace } = props;
|
|
53
|
+
if (node.kind === 'all') {
|
|
54
|
+
return (_jsx("div", { className: "b2b-card", style: {
|
|
55
|
+
padding: 12,
|
|
56
|
+
border: '1px dashed var(--border-color)',
|
|
57
|
+
background: 'var(--surface-muted)',
|
|
58
|
+
}, children: _jsxs("div", { className: "b2b-row", style: { alignItems: 'center', gap: 8 }, children: [_jsxs("div", { className: "b2b-grow", style: { fontSize: 13 }, children: [_jsx("strong", { children: t('priceLists.rule.alwaysMatch') }), " ", t('priceLists.rule.alwaysMatchHint')] }), _jsxs("button", { type: "button", className: "b2b-btn b2b-btn--default b2b-btn--sm", disabled: disabled, onClick: () => onReplace({ kind: 'group', op: 'AND', children: [emptyCriterion()] }), children: [_jsx(Plus, { size: 12 }), " ", t('priceLists.rule.addCriterion')] })] }) }));
|
|
59
|
+
}
|
|
60
|
+
if (node.kind === 'criterion') {
|
|
61
|
+
return (_jsx(CriterionView, { node: node, disabled: disabled, pickers: pickers, ensurePicker: ensurePicker, onChange: (next) => onReplace(next), onDelete: () => onReplace(null) }));
|
|
62
|
+
}
|
|
63
|
+
return (_jsx(GroupView, { node: node, depth: depth, disabled: disabled, pickers: pickers, ensurePicker: ensurePicker, onChange: (next) => onReplace(next) }));
|
|
64
|
+
}
|
|
65
|
+
function GroupView(props) {
|
|
66
|
+
const t = useTranslation('core');
|
|
67
|
+
const { node, depth, disabled, pickers, ensurePicker, onChange } = props;
|
|
68
|
+
const [collapsed, setCollapsed] = useState(false);
|
|
69
|
+
const updateChild = (idx, next) => {
|
|
70
|
+
const children = [...node.children];
|
|
71
|
+
if (next === null)
|
|
72
|
+
children.splice(idx, 1);
|
|
73
|
+
else
|
|
74
|
+
children[idx] = next;
|
|
75
|
+
if (children.length === 0) {
|
|
76
|
+
onChange(depth === 0 ? { kind: 'all' } : null);
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
onChange({ ...node, children });
|
|
80
|
+
};
|
|
81
|
+
const moveChild = (idx, direction) => {
|
|
82
|
+
const newIdx = idx + direction;
|
|
83
|
+
if (newIdx < 0 || newIdx >= node.children.length)
|
|
84
|
+
return;
|
|
85
|
+
const children = [...node.children];
|
|
86
|
+
const [moved] = children.splice(idx, 1);
|
|
87
|
+
children.splice(newIdx, 0, moved);
|
|
88
|
+
onChange({ ...node, children });
|
|
89
|
+
};
|
|
90
|
+
const addCriterion = () => {
|
|
91
|
+
onChange({ ...node, children: [...node.children, emptyCriterion()] });
|
|
92
|
+
};
|
|
93
|
+
const addGroup = () => {
|
|
94
|
+
if (depth + 1 >= DEPTH_CAP)
|
|
95
|
+
return;
|
|
96
|
+
onChange({
|
|
97
|
+
...node,
|
|
98
|
+
children: [...node.children, { kind: 'group', op: 'AND', children: [emptyCriterion()] }],
|
|
99
|
+
});
|
|
100
|
+
};
|
|
101
|
+
const subgroupBlocked = depth + 1 >= DEPTH_CAP;
|
|
102
|
+
const childIsLastInTree = node.children.length <= 1;
|
|
103
|
+
return (_jsxs("div", { className: "b2b-card", style: {
|
|
104
|
+
padding: 0,
|
|
105
|
+
border: depth === 0 ? '1px solid var(--border-color)' : '1px solid var(--border-color)',
|
|
106
|
+
background: depth === 0 ? 'var(--surface-color)' : 'var(--surface-muted)',
|
|
107
|
+
}, children: [_jsxs("div", { className: "b2b-row", style: {
|
|
108
|
+
padding: '8px 10px',
|
|
109
|
+
alignItems: 'center',
|
|
110
|
+
gap: 8,
|
|
111
|
+
borderBottom: collapsed ? 'none' : '1px solid var(--border-color)',
|
|
112
|
+
}, children: [_jsx("button", { type: "button", className: "b2b-btn b2b-btn--ghost b2b-btn--icon b2b-btn--sm", onClick: () => setCollapsed((v) => !v), children: collapsed ? _jsx(ChevronRight, { size: 13 }) : _jsx(ChevronDown, { size: 13 }) }), _jsx("div", { className: "b2b-row", style: { gap: 4 }, children: ['AND', 'OR'].map((op) => (_jsx("button", { type: "button", className: "b2b-btn b2b-btn--sm", disabled: disabled, onClick: () => onChange({ ...node, op }), style: {
|
|
113
|
+
background: node.op === op ? 'var(--primary-color)' : 'var(--surface-color)',
|
|
114
|
+
color: node.op === op ? '#fff' : 'var(--fg-default)',
|
|
115
|
+
border: `1px solid ${node.op === op ? 'var(--primary-color)' : 'var(--border-color)'}`,
|
|
116
|
+
fontWeight: node.op === op ? 600 : 400,
|
|
117
|
+
}, children: op }, op))) }), _jsx("div", { className: "b2b-grow b2b-help", children: t('priceLists.rule.groupSummary', {
|
|
118
|
+
count: node.children.length,
|
|
119
|
+
label: node.children.length === 1 ? t('priceLists.rule.child') : t('priceLists.rule.children'),
|
|
120
|
+
depth: depth + 1,
|
|
121
|
+
cap: DEPTH_CAP,
|
|
122
|
+
}) }), depth > 0 ? (_jsx("button", { type: "button", className: "b2b-btn b2b-btn--ghost b2b-btn--icon b2b-btn--sm", disabled: disabled, onClick: () => onChange(null), title: t('priceLists.rule.removeGroup'), style: { color: 'hsl(8 80% 50%)' }, children: _jsx(Trash2, { size: 13 }) })) : null] }), !collapsed ? (_jsxs("div", { style: { padding: 10, display: 'flex', flexDirection: 'column', gap: 8 }, children: [node.children.map((child, idx) => (_jsxs("div", { className: "b2b-row", style: { alignItems: 'flex-start', gap: 6 }, children: [_jsxs("div", { className: "b2b-col", style: { gap: 2 }, children: [_jsx("button", { type: "button", className: "b2b-btn b2b-btn--ghost b2b-btn--icon b2b-btn--sm", disabled: disabled || idx === 0, onClick: () => moveChild(idx, -1), title: t('priceLists.rule.moveUp'), children: _jsx(ArrowUp, { size: 12 }) }), _jsx("button", { type: "button", className: "b2b-btn b2b-btn--ghost b2b-btn--icon b2b-btn--sm", disabled: disabled || idx === node.children.length - 1, onClick: () => moveChild(idx, 1), title: t('priceLists.rule.moveDown'), children: _jsx(ArrowDown, { size: 12 }) })] }), _jsx("div", { className: "b2b-grow", children: _jsx(RuleNodeView, { node: child, path: [idx], depth: depth + 1, disabled: disabled, pickers: pickers, ensurePicker: ensurePicker, onReplace: (next) => updateChild(idx, next) }) })] }, idx))), node.children.length === 0 && childIsLastInTree ? (_jsx("div", { className: "b2b-help", children: t('priceLists.rule.emptyGroupHint') })) : null, _jsxs("div", { className: "b2b-row", style: { gap: 6, marginTop: 4 }, children: [_jsxs("button", { type: "button", className: "b2b-btn b2b-btn--default b2b-btn--sm", disabled: disabled, onClick: addCriterion, children: [_jsx(Plus, { size: 12 }), " ", t('priceLists.rule.addCriterion')] }), _jsxs("button", { type: "button", className: "b2b-btn b2b-btn--default b2b-btn--sm", disabled: disabled || subgroupBlocked, title: subgroupBlocked ? t('priceLists.rule.depthCapReached', { cap: DEPTH_CAP }) : undefined, onClick: addGroup, children: [_jsx(Plus, { size: 12 }), " ", t('priceLists.rule.addSubgroup')] })] })] })) : null] }));
|
|
123
|
+
}
|
|
124
|
+
function CriterionView(props) {
|
|
125
|
+
const t = useTranslation('core');
|
|
126
|
+
const CRITERION_LABEL = {
|
|
127
|
+
salesChannel: t('priceLists.rule.criterion.salesChannel'),
|
|
128
|
+
customerGroup: t('priceLists.rule.criterion.customerGroup'),
|
|
129
|
+
organization: t('priceLists.rule.criterion.organization'),
|
|
130
|
+
category: t('priceLists.rule.criterion.category'),
|
|
131
|
+
currency: t('priceLists.rule.criterion.currency'),
|
|
132
|
+
};
|
|
133
|
+
const { node, disabled, pickers, ensurePicker, onChange, onDelete } = props;
|
|
134
|
+
const [open, setOpen] = useState(false);
|
|
135
|
+
useEffect(() => {
|
|
136
|
+
void ensurePicker(node.type);
|
|
137
|
+
}, [node.type, ensurePicker]);
|
|
138
|
+
const handleType = (type) => {
|
|
139
|
+
onChange({ kind: 'criterion', type, values: [] });
|
|
140
|
+
void ensurePicker(type);
|
|
141
|
+
};
|
|
142
|
+
const cache = pickers[node.type];
|
|
143
|
+
const labelMap = useMemo(() => {
|
|
144
|
+
const m = new Map();
|
|
145
|
+
for (const opt of cache.options)
|
|
146
|
+
m.set(opt.value, opt.label);
|
|
147
|
+
return m;
|
|
148
|
+
}, [cache.options]);
|
|
149
|
+
return (_jsxs("div", { className: "b2b-card", style: {
|
|
150
|
+
padding: 8,
|
|
151
|
+
border: '1px solid var(--border-color)',
|
|
152
|
+
background: 'var(--surface-color)',
|
|
153
|
+
}, children: [_jsxs("div", { className: "b2b-row", style: { gap: 8, alignItems: 'center' }, children: [_jsx("select", { className: "b2b-field", style: { width: 150 }, value: node.type, disabled: disabled, onChange: (e) => handleType(e.target.value), children: CRITERION_TYPES.map((ct) => (_jsx("option", { value: ct, children: CRITERION_LABEL[ct] }, ct))) }), _jsx("span", { className: "b2b-help", children: "\u2208" }), _jsx("button", { type: "button", className: "b2b-btn b2b-btn--default b2b-btn--sm b2b-grow", style: { justifyContent: 'flex-start', textAlign: 'left' }, disabled: disabled, onClick: () => {
|
|
154
|
+
setOpen((v) => !v);
|
|
155
|
+
void ensurePicker(node.type);
|
|
156
|
+
}, children: node.values.length === 0 ? (_jsx("span", { className: "b2b-help", children: t('priceLists.rule.pickPlaceholder', { label: CRITERION_LABEL[node.type].toLowerCase() }) })) : (_jsxs("span", { style: { fontSize: 12 }, children: [node.values
|
|
157
|
+
.slice(0, 3)
|
|
158
|
+
.map((v) => labelMap.get(v) ?? v)
|
|
159
|
+
.join(', '), node.values.length > 3 ? t('priceLists.rule.moreSuffix', { count: node.values.length - 3 }) : ''] })) }), _jsx("button", { type: "button", className: "b2b-btn b2b-btn--ghost b2b-btn--icon b2b-btn--sm", disabled: disabled, onClick: onDelete, title: t('priceLists.rule.removeCriterion'), style: { color: 'hsl(8 80% 50%)' }, children: _jsx(Trash2, { size: 13 }) })] }), open ? (_jsx(ValuePicker, { type: node.type, values: node.values, cache: cache, onClose: () => setOpen(false), onChange: (values) => onChange({ ...node, values }) })) : null] }));
|
|
160
|
+
}
|
|
161
|
+
function ValuePicker(props) {
|
|
162
|
+
const t = useTranslation('core');
|
|
163
|
+
const { type, values, cache, onChange } = props;
|
|
164
|
+
const [search, setSearch] = useState('');
|
|
165
|
+
const [draft, setDraft] = useState(new Set(values));
|
|
166
|
+
// For currency we also let the user type a code freely (e.g. an unconfigured currency).
|
|
167
|
+
const [customInput, setCustomInput] = useState('');
|
|
168
|
+
const toggle = (v) => {
|
|
169
|
+
setDraft((prev) => {
|
|
170
|
+
const next = new Set(prev);
|
|
171
|
+
if (next.has(v))
|
|
172
|
+
next.delete(v);
|
|
173
|
+
else
|
|
174
|
+
next.add(v);
|
|
175
|
+
return next;
|
|
176
|
+
});
|
|
177
|
+
};
|
|
178
|
+
const filtered = cache.options.filter((opt) => {
|
|
179
|
+
const q = normalize(search);
|
|
180
|
+
if (q === '')
|
|
181
|
+
return true;
|
|
182
|
+
return normalize(opt.label).includes(q) || normalize(opt.value).includes(q);
|
|
183
|
+
});
|
|
184
|
+
const apply = () => {
|
|
185
|
+
onChange(Array.from(draft));
|
|
186
|
+
props.onClose();
|
|
187
|
+
};
|
|
188
|
+
return (_jsxs("div", { style: {
|
|
189
|
+
marginTop: 8,
|
|
190
|
+
padding: 8,
|
|
191
|
+
border: '1px solid var(--border-color)',
|
|
192
|
+
borderRadius: 6,
|
|
193
|
+
background: 'var(--surface-muted)',
|
|
194
|
+
}, children: [_jsxs("div", { className: "b2b-input-wrap", style: { marginBottom: 6 }, children: [_jsx(Search, { size: 13, className: "lead" }), _jsx("input", { autoFocus: true, className: "b2b-field b2b-field--addon", placeholder: t('priceLists.rule.searchPlaceholder'), value: search, onChange: (e) => setSearch(e.target.value) })] }), cache.error ? (_jsx("div", { className: "b2b-help", style: { color: 'hsl(8 80% 40%)' }, children: cache.error })) : cache.loading ? (_jsx("div", { className: "b2b-help", children: t('priceLists.rule.searchLoading') })) : filtered.length === 0 ? (_jsx("div", { className: "b2b-help", children: t('priceLists.rule.noOptions') })) : (_jsx("ul", { style: { margin: 0, padding: 0, listStyle: 'none', maxHeight: 220, overflow: 'auto' }, children: filtered.slice(0, 200).map((opt) => {
|
|
195
|
+
const isOn = draft.has(opt.value);
|
|
196
|
+
return (_jsxs("li", { onClick: () => toggle(opt.value), style: {
|
|
197
|
+
padding: '4px 6px',
|
|
198
|
+
cursor: 'pointer',
|
|
199
|
+
display: 'flex',
|
|
200
|
+
alignItems: 'center',
|
|
201
|
+
gap: 6,
|
|
202
|
+
fontSize: 12,
|
|
203
|
+
}, children: [isOn ? _jsx(CheckSquare, { size: 13 }) : _jsx(Square, { size: 13 }), _jsx("span", { children: opt.label }), opt.hint ? _jsxs("span", { className: "b2b-help", children: ["\u00B7 ", opt.hint] }) : null] }, opt.value));
|
|
204
|
+
}) })), type === 'currency' ? (_jsxs("div", { className: "b2b-row", style: { marginTop: 6, gap: 4 }, children: [_jsx("input", { className: "b2b-field b2b-field--mono b2b-field--sm", placeholder: t('priceLists.rule.addCodePlaceholder'), value: customInput, onChange: (e) => setCustomInput(e.target.value.toUpperCase()), maxLength: 3 }), _jsx("button", { type: "button", className: "b2b-btn b2b-btn--default b2b-btn--sm", disabled: customInput.length !== 3, onClick: () => {
|
|
205
|
+
setDraft((prev) => {
|
|
206
|
+
const next = new Set(prev);
|
|
207
|
+
next.add(customInput);
|
|
208
|
+
return next;
|
|
209
|
+
});
|
|
210
|
+
setCustomInput('');
|
|
211
|
+
}, children: t('priceLists.rule.add') })] })) : null, _jsxs("div", { className: "b2b-row", style: { marginTop: 8, gap: 6, justifyContent: 'flex-end' }, children: [_jsx("button", { type: "button", className: "b2b-btn b2b-btn--ghost b2b-btn--sm", onClick: props.onClose, children: t('priceLists.rule.cancel') }), _jsx("button", { type: "button", className: "b2b-btn b2b-btn--primary b2b-btn--sm", onClick: apply, children: t('priceLists.rule.apply', { count: draft.size }) })] })] }));
|
|
212
|
+
}
|
|
213
|
+
function emptyCriterion() {
|
|
214
|
+
return { kind: 'criterion', type: 'salesChannel', values: [] };
|
|
215
|
+
}
|
|
216
|
+
function flattenName(name, fallback) {
|
|
217
|
+
if (typeof name === 'string')
|
|
218
|
+
return name || fallback;
|
|
219
|
+
return name['en-US'] ?? name['pl-PL'] ?? Object.values(name)[0] ?? fallback;
|
|
220
|
+
}
|
|
221
|
+
async function loadPicker(type) {
|
|
222
|
+
switch (type) {
|
|
223
|
+
case 'salesChannel': {
|
|
224
|
+
const res = await apiClient.get('/api/v1/admin/pricing/rule-targets/sales-channels');
|
|
225
|
+
return res.data.items.map((i) => ({ value: i.id, label: flattenName(i.name, i.code), hint: i.code }));
|
|
226
|
+
}
|
|
227
|
+
case 'customerGroup': {
|
|
228
|
+
const res = await apiClient.get('/api/v1/admin/pricing/rule-targets/customer-groups');
|
|
229
|
+
return res.data.items.map((i) => ({ value: i.id, label: flattenName(i.name, i.code), hint: i.code }));
|
|
230
|
+
}
|
|
231
|
+
case 'organization': {
|
|
232
|
+
const res = await apiClient.get('/api/v1/admin/pricing/rule-targets/organizations?limit=200');
|
|
233
|
+
return res.data.items.map((i) => ({ value: i.id, label: flattenName(i.name, i.taxId), hint: i.taxId }));
|
|
234
|
+
}
|
|
235
|
+
case 'category': {
|
|
236
|
+
const res = await apiClient.get('/api/v1/admin/pricing/rule-targets/categories');
|
|
237
|
+
return res.data.items.map((i) => ({ value: i.id, label: flattenName(i.name, i.slug), hint: i.slug }));
|
|
238
|
+
}
|
|
239
|
+
case 'currency': {
|
|
240
|
+
const res = await apiClient.get('/api/v1/admin/pricing/rule-targets/currencies');
|
|
241
|
+
return res.data.items.map((i) => ({
|
|
242
|
+
value: i.code,
|
|
243
|
+
label: i.code,
|
|
244
|
+
hint: i.exposedByChannels.join(', '),
|
|
245
|
+
}));
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
//# sourceMappingURL=ApplicationRuleBuilder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ApplicationRuleBuilder.js","sourceRoot":"","sources":["../../../src/admin/components/ApplicationRuleBuilder.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { type ReactNode } from 'react';
|
|
2
|
+
export interface Bracket {
|
|
3
|
+
minQuantity: number;
|
|
4
|
+
maxQuantity: number | null;
|
|
5
|
+
/** Decimal amount as a string (matches the wire shape on bracket endpoints). */
|
|
6
|
+
amount: string;
|
|
7
|
+
}
|
|
8
|
+
export type BracketsByCurrency = Record<string, Bracket[]>;
|
|
9
|
+
/**
|
|
10
|
+
* Per-product per-currency multi-bracket editor (US3 / T047).
|
|
11
|
+
*
|
|
12
|
+
* Surfaces every currency the price list already carries on this
|
|
13
|
+
* product as a tab, plus an "Add currency" picker fed by the
|
|
14
|
+
* `/admin/pricing/rule-targets/currencies` endpoint. Inline overlap
|
|
15
|
+
* + open-end + decimal-format validation runs client-side; the same
|
|
16
|
+
* rules are enforced by the service layer so the save call surfaces
|
|
17
|
+
* a structured `400 bracket_overlap` / `400 invalid_bracket` error
|
|
18
|
+
* if a slip-through reaches the backend.
|
|
19
|
+
*/
|
|
20
|
+
export declare function BracketGrid(props: {
|
|
21
|
+
priceListId: string;
|
|
22
|
+
productId: string;
|
|
23
|
+
productName: string;
|
|
24
|
+
initial: BracketsByCurrency;
|
|
25
|
+
/** Whether the parent list is the system Default — disables saving. */
|
|
26
|
+
systemList: boolean;
|
|
27
|
+
onSaved: (next: BracketsByCurrency) => void;
|
|
28
|
+
}): ReactNode;
|
|
29
|
+
//# sourceMappingURL=BracketGrid.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BracketGrid.d.ts","sourceRoot":"","sources":["../../../src/admin/components/BracketGrid.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAgC,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAIrE,MAAM,WAAW,OAAO;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,gFAAgF;IAChF,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,MAAM,kBAAkB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;AAE3D;;;;;;;;;;GAUG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,kBAAkB,CAAC;IAC5B,uEAAuE;IACvE,UAAU,EAAE,OAAO,CAAC;IACpB,OAAO,EAAE,CAAC,IAAI,EAAE,kBAAkB,KAAK,IAAI,CAAC;CAC7C,GAAG,SAAS,CAmWZ"}
|