@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.
Files changed (171) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +59 -0
  3. package/dist/admin/components/ApplicationRuleBuilder.d.ts +24 -0
  4. package/dist/admin/components/ApplicationRuleBuilder.d.ts.map +1 -0
  5. package/dist/admin/components/ApplicationRuleBuilder.js +249 -0
  6. package/dist/admin/components/ApplicationRuleBuilder.js.map +1 -0
  7. package/dist/admin/components/BracketGrid.d.ts +29 -0
  8. package/dist/admin/components/BracketGrid.d.ts.map +1 -0
  9. package/dist/admin/components/BracketGrid.js +252 -0
  10. package/dist/admin/components/BracketGrid.js.map +1 -0
  11. package/dist/admin/components/DisplayModeOverrideRow.d.ts +46 -0
  12. package/dist/admin/components/DisplayModeOverrideRow.d.ts.map +1 -0
  13. package/dist/admin/components/DisplayModeOverrideRow.js +109 -0
  14. package/dist/admin/components/DisplayModeOverrideRow.js.map +1 -0
  15. package/dist/admin/components/LinkedPriceListsPanel.d.ts +55 -0
  16. package/dist/admin/components/LinkedPriceListsPanel.d.ts.map +1 -0
  17. package/dist/admin/components/LinkedPriceListsPanel.js +131 -0
  18. package/dist/admin/components/LinkedPriceListsPanel.js.map +1 -0
  19. package/dist/admin/index.d.ts +34 -0
  20. package/dist/admin/index.d.ts.map +1 -0
  21. package/dist/admin/index.js +119 -0
  22. package/dist/admin/index.js.map +1 -0
  23. package/dist/admin/pages/DisplayModeOverridesPage.d.ts +25 -0
  24. package/dist/admin/pages/DisplayModeOverridesPage.d.ts.map +1 -0
  25. package/dist/admin/pages/DisplayModeOverridesPage.js +266 -0
  26. package/dist/admin/pages/DisplayModeOverridesPage.js.map +1 -0
  27. package/dist/admin/pages/PriceListDetailPage.d.ts +23 -0
  28. package/dist/admin/pages/PriceListDetailPage.d.ts.map +1 -0
  29. package/dist/admin/pages/PriceListDetailPage.js +421 -0
  30. package/dist/admin/pages/PriceListDetailPage.js.map +1 -0
  31. package/dist/admin/pages/PriceListsPage.d.ts +17 -0
  32. package/dist/admin/pages/PriceListsPage.d.ts.map +1 -0
  33. package/dist/admin/pages/PriceListsPage.js +198 -0
  34. package/dist/admin/pages/PriceListsPage.js.map +1 -0
  35. package/dist/admin/zones/CategoryDisplayMode.d.ts +27 -0
  36. package/dist/admin/zones/CategoryDisplayMode.d.ts.map +1 -0
  37. package/dist/admin/zones/CategoryDisplayMode.js +11 -0
  38. package/dist/admin/zones/CategoryDisplayMode.js.map +1 -0
  39. package/dist/admin/zones/OrganizationDisplayMode.d.ts +36 -0
  40. package/dist/admin/zones/OrganizationDisplayMode.d.ts.map +1 -0
  41. package/dist/admin/zones/OrganizationDisplayMode.js +12 -0
  42. package/dist/admin/zones/OrganizationDisplayMode.js.map +1 -0
  43. package/dist/admin/zones/ProductLinkedPriceLists.d.ts +16 -0
  44. package/dist/admin/zones/ProductLinkedPriceLists.d.ts.map +1 -0
  45. package/dist/admin/zones/ProductLinkedPriceLists.js +7 -0
  46. package/dist/admin/zones/ProductLinkedPriceLists.js.map +1 -0
  47. package/dist/backend/entities/price-display-mode-override.entity.d.ts +23 -0
  48. package/dist/backend/entities/price-display-mode-override.entity.d.ts.map +1 -0
  49. package/dist/backend/entities/price-display-mode-override.entity.js +58 -0
  50. package/dist/backend/entities/price-display-mode-override.entity.js.map +1 -0
  51. package/dist/backend/entities/price-list-price-bracket.entity.d.ts +26 -0
  52. package/dist/backend/entities/price-list-price-bracket.entity.d.ts.map +1 -0
  53. package/dist/backend/entities/price-list-price-bracket.entity.js +73 -0
  54. package/dist/backend/entities/price-list-price-bracket.entity.js.map +1 -0
  55. package/dist/backend/entities/price-list-product.entity.d.ts +15 -0
  56. package/dist/backend/entities/price-list-product.entity.d.ts.map +1 -0
  57. package/dist/backend/entities/price-list-product.entity.js +43 -0
  58. package/dist/backend/entities/price-list-product.entity.js.map +1 -0
  59. package/dist/backend/entities/price-list.entity.d.ts +34 -0
  60. package/dist/backend/entities/price-list.entity.d.ts.map +1 -0
  61. package/dist/backend/entities/price-list.entity.js +115 -0
  62. package/dist/backend/entities/price-list.entity.js.map +1 -0
  63. package/dist/backend/index.d.ts +125 -0
  64. package/dist/backend/index.d.ts.map +1 -0
  65. package/dist/backend/index.js +179 -0
  66. package/dist/backend/index.js.map +1 -0
  67. package/dist/backend/plugin.d.ts +68 -0
  68. package/dist/backend/plugin.d.ts.map +1 -0
  69. package/dist/backend/plugin.js +88 -0
  70. package/dist/backend/plugin.js.map +1 -0
  71. package/dist/backend/routes.d.ts +40 -0
  72. package/dist/backend/routes.d.ts.map +1 -0
  73. package/dist/backend/routes.js +447 -0
  74. package/dist/backend/routes.js.map +1 -0
  75. package/dist/backend/routes.storefront.d.ts +47 -0
  76. package/dist/backend/routes.storefront.d.ts.map +1 -0
  77. package/dist/backend/routes.storefront.js +131 -0
  78. package/dist/backend/routes.storefront.js.map +1 -0
  79. package/dist/backend/services/application-rule-evaluator.d.ts +25 -0
  80. package/dist/backend/services/application-rule-evaluator.d.ts.map +1 -0
  81. package/dist/backend/services/application-rule-evaluator.js +2 -0
  82. package/dist/backend/services/application-rule-evaluator.js.map +1 -0
  83. package/dist/backend/services/audit-references.d.ts +11 -0
  84. package/dist/backend/services/audit-references.d.ts.map +1 -0
  85. package/dist/backend/services/audit-references.js +23 -0
  86. package/dist/backend/services/audit-references.js.map +1 -0
  87. package/dist/backend/services/default-price-list-migration.d.ts +70 -0
  88. package/dist/backend/services/default-price-list-migration.d.ts.map +1 -0
  89. package/dist/backend/services/default-price-list-migration.js +177 -0
  90. package/dist/backend/services/default-price-list-migration.js.map +1 -0
  91. package/dist/backend/services/display-mode-resolver.d.ts +78 -0
  92. package/dist/backend/services/display-mode-resolver.d.ts.map +1 -0
  93. package/dist/backend/services/display-mode-resolver.js +71 -0
  94. package/dist/backend/services/display-mode-resolver.js.map +1 -0
  95. package/dist/backend/services/listing-price-chain.d.ts +26 -0
  96. package/dist/backend/services/listing-price-chain.d.ts.map +1 -0
  97. package/dist/backend/services/listing-price-chain.js +55 -0
  98. package/dist/backend/services/listing-price-chain.js.map +1 -0
  99. package/dist/backend/services/price-bracket-resolver.d.ts +24 -0
  100. package/dist/backend/services/price-bracket-resolver.d.ts.map +1 -0
  101. package/dist/backend/services/price-bracket-resolver.js +16 -0
  102. package/dist/backend/services/price-bracket-resolver.js.map +1 -0
  103. package/dist/backend/services/price-list-candidate-vector.d.ts +116 -0
  104. package/dist/backend/services/price-list-candidate-vector.d.ts.map +1 -0
  105. package/dist/backend/services/price-list-candidate-vector.js +133 -0
  106. package/dist/backend/services/price-list-candidate-vector.js.map +1 -0
  107. package/dist/backend/services/price-list-currency-reference.d.ts +12 -0
  108. package/dist/backend/services/price-list-currency-reference.d.ts.map +1 -0
  109. package/dist/backend/services/price-list-currency-reference.js +24 -0
  110. package/dist/backend/services/price-list-currency-reference.js.map +1 -0
  111. package/dist/backend/services/price-list-read-port.d.ts +29 -0
  112. package/dist/backend/services/price-list-read-port.d.ts.map +1 -0
  113. package/dist/backend/services/price-list-read-port.js +64 -0
  114. package/dist/backend/services/price-list-read-port.js.map +1 -0
  115. package/dist/backend/services/price-list-resolver.d.ts +26 -0
  116. package/dist/backend/services/price-list-resolver.d.ts.map +1 -0
  117. package/dist/backend/services/price-list-resolver.js +37 -0
  118. package/dist/backend/services/price-list-resolver.js.map +1 -0
  119. package/dist/backend/services/price-list-service.d.ts +431 -0
  120. package/dist/backend/services/price-list-service.d.ts.map +1 -0
  121. package/dist/backend/services/price-list-service.js +1238 -0
  122. package/dist/backend/services/price-list-service.js.map +1 -0
  123. package/dist/backend/services/price-list-status-worker.d.ts +28 -0
  124. package/dist/backend/services/price-list-status-worker.d.ts.map +1 -0
  125. package/dist/backend/services/price-list-status-worker.js +38 -0
  126. package/dist/backend/services/price-list-status-worker.js.map +1 -0
  127. package/dist/backend/services/pricing-cache.d.ts +53 -0
  128. package/dist/backend/services/pricing-cache.d.ts.map +1 -0
  129. package/dist/backend/services/pricing-cache.js +88 -0
  130. package/dist/backend/services/pricing-cache.js.map +1 -0
  131. package/dist/backend/services/pricing-service.d.ts +304 -0
  132. package/dist/backend/services/pricing-service.d.ts.map +1 -0
  133. package/dist/backend/services/pricing-service.interface.d.ts +151 -0
  134. package/dist/backend/services/pricing-service.interface.d.ts.map +1 -0
  135. package/dist/backend/services/pricing-service.interface.js +10 -0
  136. package/dist/backend/services/pricing-service.interface.js.map +1 -0
  137. package/dist/backend/services/pricing-service.js +803 -0
  138. package/dist/backend/services/pricing-service.js.map +1 -0
  139. package/dist/backend/services/unit-price-ordering.d.ts +121 -0
  140. package/dist/backend/services/unit-price-ordering.d.ts.map +1 -0
  141. package/dist/backend/services/unit-price-ordering.js +164 -0
  142. package/dist/backend/services/unit-price-ordering.js.map +1 -0
  143. package/dist/manifest.d.ts +218 -0
  144. package/dist/manifest.d.ts.map +1 -0
  145. package/dist/manifest.js +228 -0
  146. package/dist/manifest.js.map +1 -0
  147. package/dist/migrations/20260426T075235_price_lists_pricing_init.d.ts +24 -0
  148. package/dist/migrations/20260426T075235_price_lists_pricing_init.d.ts.map +1 -0
  149. package/dist/migrations/20260426T075235_price_lists_pricing_init.js +89 -0
  150. package/dist/migrations/20260426T075235_price_lists_pricing_init.js.map +1 -0
  151. package/dist/migrations/20260504T125655_price_lists_engine.d.ts +6 -0
  152. package/dist/migrations/20260504T125655_price_lists_engine.d.ts.map +1 -0
  153. package/dist/migrations/20260504T125655_price_lists_engine.js +319 -0
  154. package/dist/migrations/20260504T125655_price_lists_engine.js.map +1 -0
  155. package/dist/migrations/20260817T055457_price_lists_single_system_price_list.d.ts +15 -0
  156. package/dist/migrations/20260817T055457_price_lists_single_system_price_list.d.ts.map +1 -0
  157. package/dist/migrations/20260817T055457_price_lists_single_system_price_list.js +58 -0
  158. package/dist/migrations/20260817T055457_price_lists_single_system_price_list.js.map +1 -0
  159. package/dist/migrations/20260821T135907_price_lists_unit_price_amount_index.d.ts +40 -0
  160. package/dist/migrations/20260821T135907_price_lists_unit_price_amount_index.d.ts.map +1 -0
  161. package/dist/migrations/20260821T135907_price_lists_unit_price_amount_index.js +46 -0
  162. package/dist/migrations/20260821T135907_price_lists_unit_price_amount_index.js.map +1 -0
  163. package/dist/migrations/index.d.ts +30 -0
  164. package/dist/migrations/index.d.ts.map +1 -0
  165. package/dist/migrations/index.js +35 -0
  166. package/dist/migrations/index.js.map +1 -0
  167. package/docs/price_lists.md +278 -0
  168. package/i18n/en.json +14 -0
  169. package/i18n/pl.json +14 -0
  170. package/package.json +99 -0
  171. 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"}