@dainamite/cpq 0.6.0 → 0.7.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/CHANGELOG.md +16 -0
- package/dist/modules/cpq/backend/cpq/inventory/AssetsTable.js +3 -9
- package/dist/modules/cpq/backend/cpq/inventory/AssetsTable.js.map +2 -2
- package/dist/modules/cpq/backend/cpq/inventory/SubscriptionsTable.js +21 -25
- package/dist/modules/cpq/backend/cpq/inventory/SubscriptionsTable.js.map +2 -2
- package/dist/modules/cpq/backend/cpq/inventory/assets/[id]/page.js +48 -47
- package/dist/modules/cpq/backend/cpq/inventory/assets/[id]/page.js.map +2 -2
- package/dist/modules/cpq/backend/cpq/inventory/assets/[id]/page.meta.js +1 -1
- package/dist/modules/cpq/backend/cpq/inventory/assets/[id]/page.meta.js.map +2 -2
- package/dist/modules/cpq/backend/cpq/inventory/page.meta.js +2 -2
- package/dist/modules/cpq/backend/cpq/inventory/page.meta.js.map +2 -2
- package/dist/modules/cpq/backend/cpq/inventory/shared.js +37 -2
- package/dist/modules/cpq/backend/cpq/inventory/shared.js.map +2 -2
- package/dist/modules/cpq/backend/cpq/inventory/subscriptions/[id]/page.js +154 -178
- package/dist/modules/cpq/backend/cpq/inventory/subscriptions/[id]/page.js.map +2 -2
- package/dist/modules/cpq/backend/cpq/inventory/subscriptions/[id]/page.meta.js +1 -1
- package/dist/modules/cpq/backend/cpq/inventory/subscriptions/[id]/page.meta.js.map +2 -2
- package/dist/modules/cpq/backend/cpq/offerings/[id]/page.js +168 -143
- package/dist/modules/cpq/backend/cpq/offerings/[id]/page.js.map +2 -2
- package/dist/modules/cpq/backend/cpq/offerings/page.js +36 -34
- package/dist/modules/cpq/backend/cpq/offerings/page.js.map +2 -2
- package/dist/modules/cpq/backend/cpq/orders/[id]/page.js +69 -66
- package/dist/modules/cpq/backend/cpq/orders/[id]/page.js.map +2 -2
- package/dist/modules/cpq/backend/cpq/orders/page.js +6 -6
- package/dist/modules/cpq/backend/cpq/orders/page.js.map +2 -2
- package/dist/modules/cpq/backend/cpq/price-rules/PriceRuleForm.js +41 -36
- package/dist/modules/cpq/backend/cpq/price-rules/PriceRuleForm.js.map +2 -2
- package/dist/modules/cpq/backend/cpq/price-rules/[id]/page.js +76 -72
- package/dist/modules/cpq/backend/cpq/price-rules/[id]/page.js.map +2 -2
- package/dist/modules/cpq/backend/cpq/price-rules/[id]/page.meta.js +1 -1
- package/dist/modules/cpq/backend/cpq/price-rules/[id]/page.meta.js.map +2 -2
- package/dist/modules/cpq/backend/cpq/price-rules/page.js +18 -15
- package/dist/modules/cpq/backend/cpq/price-rules/page.js.map +2 -2
- package/dist/modules/cpq/backend/cpq/pricing/[id]/EntriesEditor.js +23 -21
- package/dist/modules/cpq/backend/cpq/pricing/[id]/EntriesEditor.js.map +2 -2
- package/dist/modules/cpq/backend/cpq/pricing/[id]/ImportPreview.js +22 -50
- package/dist/modules/cpq/backend/cpq/pricing/[id]/ImportPreview.js.map +2 -2
- package/dist/modules/cpq/backend/cpq/pricing/[id]/page.js +74 -52
- package/dist/modules/cpq/backend/cpq/pricing/[id]/page.js.map +2 -2
- package/dist/modules/cpq/backend/cpq/pricing/[id]/xlsxImport.js +20 -17
- package/dist/modules/cpq/backend/cpq/pricing/[id]/xlsxImport.js.map +2 -2
- package/dist/modules/cpq/backend/cpq/pricing/page.js +1 -1
- package/dist/modules/cpq/backend/cpq/pricing/page.js.map +2 -2
- package/dist/modules/cpq/backend/cpq/quotes/[id]/_components/ArcQuoteConfigurator.js +115 -123
- package/dist/modules/cpq/backend/cpq/quotes/[id]/_components/ArcQuoteConfigurator.js.map +2 -2
- package/dist/modules/cpq/backend/cpq/quotes/[id]/_components/PriceAdjustmentDialog.js +6 -3
- package/dist/modules/cpq/backend/cpq/quotes/[id]/_components/PriceAdjustmentDialog.js.map +2 -2
- package/dist/modules/cpq/backend/cpq/quotes/[id]/page.js +129 -94
- package/dist/modules/cpq/backend/cpq/quotes/[id]/page.js.map +2 -2
- package/dist/modules/cpq/backend/cpq/quotes/page.js +23 -19
- package/dist/modules/cpq/backend/cpq/quotes/page.js.map +2 -2
- package/dist/modules/cpq/backend/cpq/specifications/[id]/DependsOnRulesEditor.js +19 -15
- package/dist/modules/cpq/backend/cpq/specifications/[id]/DependsOnRulesEditor.js.map +2 -2
- package/dist/modules/cpq/backend/cpq/specifications/[id]/page.js +171 -178
- package/dist/modules/cpq/backend/cpq/specifications/[id]/page.js.map +2 -2
- package/dist/modules/cpq/backend/cpq/specifications/page.js +2 -2
- package/dist/modules/cpq/backend/cpq/specifications/page.js.map +2 -2
- package/dist/modules/cpq/backend/cpq/wizards/[definitionCode]/detail/page.js +60 -50
- package/dist/modules/cpq/backend/cpq/wizards/[definitionCode]/detail/page.js.map +2 -2
- package/dist/modules/cpq/backend/cpq/wizards/[definitionCode]/page.js +22 -18
- package/dist/modules/cpq/backend/cpq/wizards/[definitionCode]/page.js.map +2 -2
- package/dist/modules/cpq/backend/cpq/wizards/page.js +1 -1
- package/dist/modules/cpq/backend/cpq/wizards/page.js.map +2 -2
- package/dist/modules/cpq/components/ArcLineDiff.js +2 -2
- package/dist/modules/cpq/components/ArcLineDiff.js.map +2 -2
- package/dist/modules/cpq/components/ChargeBreakdownTable.js +4 -10
- package/dist/modules/cpq/components/ChargeBreakdownTable.js.map +2 -2
- package/dist/modules/cpq/components/PriceWaterfall.js +3 -1
- package/dist/modules/cpq/components/PriceWaterfall.js.map +2 -2
- package/dist/modules/cpq/components/PricingSummaryCard.js +1 -6
- package/dist/modules/cpq/components/PricingSummaryCard.js.map +2 -2
- package/dist/modules/cpq/components/StatusPath.js +5 -3
- package/dist/modules/cpq/components/StatusPath.js.map +2 -2
- package/dist/modules/cpq/components/useCpqRowActions.js +10 -22
- package/dist/modules/cpq/components/useCpqRowActions.js.map +2 -2
- package/dist/modules/cpq/i18n/de.json +1220 -0
- package/dist/modules/cpq/i18n/en.json +1220 -0
- package/dist/modules/cpq/i18n/es.json +1220 -0
- package/dist/modules/cpq/i18n/pl.json +1220 -0
- package/dist/modules/cpq/widgets/injection/customer-inventory/widget.client.js +39 -31
- package/dist/modules/cpq/widgets/injection/customer-inventory/widget.client.js.map +2 -2
- package/dist/modules/cpq/widgets/injection/order-cpq-tab/widget.client.js +13 -5
- package/dist/modules/cpq/widgets/injection/order-cpq-tab/widget.client.js.map +2 -2
- package/dist/modules/cpq/widgets/injection/quote-configurator/widget.client.js +41 -21
- package/dist/modules/cpq/widgets/injection/quote-configurator/widget.client.js.map +2 -2
- package/dist/modules/cpq/widgets/injection-table.js +2 -2
- package/dist/modules/cpq/widgets/injection-table.js.map +2 -2
- package/dist/modules/cpq/workflows/WizardRunner.js +10 -8
- package/dist/modules/cpq/workflows/WizardRunner.js.map +2 -2
- package/dist/modules/cpq/workflows/WizardTrigger.js +15 -9
- package/dist/modules/cpq/workflows/WizardTrigger.js.map +2 -2
- package/dist/modules/cpq/workflows/steps/CustomerSelectStep.js +9 -7
- package/dist/modules/cpq/workflows/steps/CustomerSelectStep.js.map +2 -2
- package/dist/modules/cpq/workflows/steps/InventorySelectStep.js +9 -4
- package/dist/modules/cpq/workflows/steps/InventorySelectStep.js.map +2 -2
- package/dist/modules/cpq/workflows/steps/ItemListStep.js +16 -19
- package/dist/modules/cpq/workflows/steps/ItemListStep.js.map +2 -2
- package/dist/modules/cpq/workflows/steps/OfferingSelectStep.js +19 -32
- package/dist/modules/cpq/workflows/steps/OfferingSelectStep.js.map +2 -2
- package/dist/modules/cpq/workflows/steps/ProductConfigureStep.js +8 -6
- package/dist/modules/cpq/workflows/steps/ProductConfigureStep.js.map +2 -2
- package/dist/modules/cpq/workflows/steps/ReviewStep.js +32 -30
- package/dist/modules/cpq/workflows/steps/ReviewStep.js.map +2 -2
- package/dist/modules/cpq/workflows/steps/index.js +12 -0
- package/dist/modules/cpq/workflows/steps/index.js.map +2 -2
- package/package.json +1 -1
- package/src/modules/cpq/__tests__/i18n/dictionaries.test.ts +62 -0
- package/src/modules/cpq/__tests__/i18n/hardcodedStrings.test.ts +35 -0
- package/src/modules/cpq/__tests__/i18n/sourceScan.ts +109 -0
- package/src/modules/cpq/backend/cpq/inventory/AssetsTable.tsx +3 -9
- package/src/modules/cpq/backend/cpq/inventory/SubscriptionsTable.tsx +22 -26
- package/src/modules/cpq/backend/cpq/inventory/assets/[id]/page.meta.ts +1 -1
- package/src/modules/cpq/backend/cpq/inventory/assets/[id]/page.tsx +43 -46
- package/src/modules/cpq/backend/cpq/inventory/page.meta.ts +2 -2
- package/src/modules/cpq/backend/cpq/inventory/shared.tsx +37 -1
- package/src/modules/cpq/backend/cpq/inventory/subscriptions/[id]/page.meta.ts +1 -1
- package/src/modules/cpq/backend/cpq/inventory/subscriptions/[id]/page.tsx +134 -112
- package/src/modules/cpq/backend/cpq/offerings/[id]/page.tsx +169 -130
- package/src/modules/cpq/backend/cpq/offerings/page.tsx +34 -24
- package/src/modules/cpq/backend/cpq/orders/[id]/page.tsx +66 -43
- package/src/modules/cpq/backend/cpq/orders/page.tsx +6 -6
- package/src/modules/cpq/backend/cpq/price-rules/PriceRuleForm.tsx +48 -34
- package/src/modules/cpq/backend/cpq/price-rules/[id]/page.meta.ts +1 -1
- package/src/modules/cpq/backend/cpq/price-rules/[id]/page.tsx +76 -70
- package/src/modules/cpq/backend/cpq/price-rules/page.tsx +25 -16
- package/src/modules/cpq/backend/cpq/pricing/[id]/EntriesEditor.tsx +24 -18
- package/src/modules/cpq/backend/cpq/pricing/[id]/ImportPreview.tsx +29 -19
- package/src/modules/cpq/backend/cpq/pricing/[id]/page.tsx +95 -47
- package/src/modules/cpq/backend/cpq/pricing/[id]/xlsxImport.ts +23 -15
- package/src/modules/cpq/backend/cpq/pricing/page.tsx +1 -1
- package/src/modules/cpq/backend/cpq/quotes/[id]/_components/ArcQuoteConfigurator.tsx +111 -88
- package/src/modules/cpq/backend/cpq/quotes/[id]/_components/PriceAdjustmentDialog.tsx +3 -3
- package/src/modules/cpq/backend/cpq/quotes/[id]/page.tsx +134 -89
- package/src/modules/cpq/backend/cpq/quotes/page.tsx +29 -21
- package/src/modules/cpq/backend/cpq/specifications/[id]/DependsOnRulesEditor.tsx +19 -15
- package/src/modules/cpq/backend/cpq/specifications/[id]/page.tsx +171 -171
- package/src/modules/cpq/backend/cpq/specifications/page.tsx +2 -2
- package/src/modules/cpq/backend/cpq/wizards/[definitionCode]/detail/page.tsx +51 -41
- package/src/modules/cpq/backend/cpq/wizards/[definitionCode]/page.tsx +17 -13
- package/src/modules/cpq/backend/cpq/wizards/page.tsx +1 -1
- package/src/modules/cpq/components/ArcLineDiff.tsx +2 -2
- package/src/modules/cpq/components/ChargeBreakdownTable.tsx +4 -2
- package/src/modules/cpq/components/PriceWaterfall.tsx +4 -2
- package/src/modules/cpq/components/PricingSummaryCard.tsx +1 -1
- package/src/modules/cpq/components/StatusPath.tsx +7 -4
- package/src/modules/cpq/components/useCpqRowActions.tsx +17 -25
- package/src/modules/cpq/i18n/de.json +1220 -0
- package/src/modules/cpq/i18n/en.json +1220 -0
- package/src/modules/cpq/i18n/es.json +1220 -0
- package/src/modules/cpq/i18n/pl.json +1220 -0
- package/src/modules/cpq/widgets/injection/customer-inventory/widget.client.tsx +38 -31
- package/src/modules/cpq/widgets/injection/order-cpq-tab/widget.client.tsx +7 -5
- package/src/modules/cpq/widgets/injection/quote-configurator/widget.client.tsx +36 -21
- package/src/modules/cpq/widgets/injection-table.ts +8 -2
- package/src/modules/cpq/workflows/WizardRunner.tsx +8 -5
- package/src/modules/cpq/workflows/WizardTrigger.tsx +15 -9
- package/src/modules/cpq/workflows/steps/CustomerSelectStep.tsx +11 -7
- package/src/modules/cpq/workflows/steps/InventorySelectStep.tsx +9 -5
- package/src/modules/cpq/workflows/steps/ItemListStep.tsx +18 -12
- package/src/modules/cpq/workflows/steps/OfferingSelectStep.tsx +20 -16
- package/src/modules/cpq/workflows/steps/ProductConfigureStep.tsx +8 -6
- package/src/modules/cpq/workflows/steps/ReviewStep.tsx +33 -18
- package/src/modules/cpq/workflows/steps/index.ts +12 -0
- package/src/modules/cpq/workflows/types.ts +4 -0
|
@@ -4,14 +4,9 @@ import * as React from "react";
|
|
|
4
4
|
import { useRouter, useParams } from "next/navigation";
|
|
5
5
|
import { Button } from "@open-mercato/ui/primitives/button";
|
|
6
6
|
import { Tag } from "@open-mercato/ui/primitives/tag";
|
|
7
|
+
import { useT } from "@open-mercato/shared/lib/i18n/context";
|
|
7
8
|
import { NumberInput } from "../../../../components/NumberInput.js";
|
|
8
|
-
|
|
9
|
-
discount_percent: "Discount %",
|
|
10
|
-
discount_absolute: "Discount $",
|
|
11
|
-
surcharge_percent: "Surcharge %",
|
|
12
|
-
surcharge_absolute: "Surcharge $",
|
|
13
|
-
price_override: "Override"
|
|
14
|
-
};
|
|
9
|
+
import { buildRuleTypeLabels } from "../PriceRuleForm.js";
|
|
15
10
|
function ruleToForm(rule) {
|
|
16
11
|
const cond = rule.applicabilityCondition;
|
|
17
12
|
return {
|
|
@@ -30,6 +25,8 @@ function ruleToForm(rule) {
|
|
|
30
25
|
};
|
|
31
26
|
}
|
|
32
27
|
function PriceRuleDetailPage(props) {
|
|
28
|
+
const t = useT();
|
|
29
|
+
const ruleTypeLabels = React.useMemo(() => buildRuleTypeLabels(t), [t]);
|
|
33
30
|
const router = useRouter();
|
|
34
31
|
const urlParams = useParams();
|
|
35
32
|
const ruleId = props.params?.id ?? urlParams?.id;
|
|
@@ -56,12 +53,12 @@ function PriceRuleDetailPage(props) {
|
|
|
56
53
|
setLoading(true);
|
|
57
54
|
setError(null);
|
|
58
55
|
fetch(`/api/cpq/price-rules?id=${ruleId}`).then(async (r) => {
|
|
59
|
-
if (!r.ok) throw new Error("Not found");
|
|
56
|
+
if (!r.ok) throw new Error(t("cpq.priceRules.detail.notFound", "Not found"));
|
|
60
57
|
return r.json();
|
|
61
58
|
}).then((data) => {
|
|
62
59
|
setRule(data);
|
|
63
60
|
}).catch((err) => setError(err.message)).finally(() => setLoading(false));
|
|
64
|
-
}, [ruleId]);
|
|
61
|
+
}, [ruleId, t]);
|
|
65
62
|
React.useEffect(() => {
|
|
66
63
|
loadRule();
|
|
67
64
|
}, [loadRule]);
|
|
@@ -112,14 +109,14 @@ function PriceRuleDetailPage(props) {
|
|
|
112
109
|
});
|
|
113
110
|
if (!res.ok) {
|
|
114
111
|
const err = await res.json();
|
|
115
|
-
throw new Error(err.error ?? "Failed to update");
|
|
112
|
+
throw new Error(err.error ?? t("cpq.priceRules.errors.updateFailed", "Failed to update"));
|
|
116
113
|
}
|
|
117
114
|
const updated = await res.json();
|
|
118
115
|
setRule(updated);
|
|
119
116
|
setEditing(false);
|
|
120
117
|
setForm(null);
|
|
121
118
|
} catch (err) {
|
|
122
|
-
setSaveError(err instanceof Error ? err.message : "Unknown error");
|
|
119
|
+
setSaveError(err instanceof Error ? err.message : t("cpq.priceRules.errors.unknown", "Unknown error"));
|
|
123
120
|
} finally {
|
|
124
121
|
setSaving(false);
|
|
125
122
|
}
|
|
@@ -150,45 +147,52 @@ function PriceRuleDetailPage(props) {
|
|
|
150
147
|
}
|
|
151
148
|
}
|
|
152
149
|
if (loading) {
|
|
153
|
-
return /* @__PURE__ */ jsx("div", { className: "text-sm text-muted-foreground py-12 text-center", children: "Loading..." });
|
|
150
|
+
return /* @__PURE__ */ jsx("div", { className: "text-sm text-muted-foreground py-12 text-center", children: t("cpq.common.loading", "Loading...") });
|
|
154
151
|
}
|
|
155
152
|
if (error || !rule) {
|
|
156
153
|
return /* @__PURE__ */ jsxs("div", { className: "space-y-4 py-12 text-center", children: [
|
|
157
|
-
/* @__PURE__ */ jsx("div", { className: "text-sm text-destructive", children: error ?? "Rule not found" }),
|
|
158
|
-
/* @__PURE__ */
|
|
154
|
+
/* @__PURE__ */ jsx("div", { className: "text-sm text-destructive", children: error ?? t("cpq.priceRules.detail.ruleNotFound", "Rule not found") }),
|
|
155
|
+
/* @__PURE__ */ jsxs(
|
|
159
156
|
"button",
|
|
160
157
|
{
|
|
161
158
|
onClick: () => router.push("/backend/cpq/price-rules"),
|
|
162
159
|
className: "text-sm text-primary hover:underline",
|
|
163
|
-
children:
|
|
160
|
+
children: [
|
|
161
|
+
"\u2190 ",
|
|
162
|
+
t("cpq.priceRules.detail.backToList", "Back to Price Rules")
|
|
163
|
+
]
|
|
164
164
|
}
|
|
165
165
|
)
|
|
166
166
|
] });
|
|
167
167
|
}
|
|
168
168
|
const cond = rule.applicabilityCondition;
|
|
169
169
|
const offering = rule.productOfferingId ? offeringLookup.get(rule.productOfferingId) : null;
|
|
170
|
+
const deleteConfirmParts = t("cpq.priceRules.detail.deleteConfirm", "Are you sure you want to delete {name}?").split("{name}");
|
|
170
171
|
return /* @__PURE__ */ jsxs("div", { className: "space-y-6", children: [
|
|
171
172
|
/* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between", children: [
|
|
172
173
|
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3", children: [
|
|
173
|
-
/* @__PURE__ */
|
|
174
|
+
/* @__PURE__ */ jsxs(
|
|
174
175
|
"button",
|
|
175
176
|
{
|
|
176
177
|
onClick: () => router.push("/backend/cpq/price-rules"),
|
|
177
178
|
className: "text-sm text-muted-foreground hover:text-foreground transition-colors",
|
|
178
|
-
children:
|
|
179
|
+
children: [
|
|
180
|
+
"\u2190 ",
|
|
181
|
+
t("cpq.common.back", "Back")
|
|
182
|
+
]
|
|
179
183
|
}
|
|
180
184
|
),
|
|
181
185
|
/* @__PURE__ */ jsx("h1", { className: "text-2xl font-bold", children: rule.name }),
|
|
182
|
-
/* @__PURE__ */ jsx(Tag, { variant: rule.isActive ? "success" : "neutral", dot: true, children: rule.isActive ? "Active" : "Inactive" })
|
|
186
|
+
/* @__PURE__ */ jsx(Tag, { variant: rule.isActive ? "success" : "neutral", dot: true, children: rule.isActive ? t("cpq.common.active", "Active") : t("cpq.common.inactive", "Inactive") })
|
|
183
187
|
] }),
|
|
184
188
|
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
|
|
185
|
-
/* @__PURE__ */ jsx(Button, { type: "button", variant: "outline", onClick: handleToggleActive, children: rule.isActive ? "Deactivate" : "Activate" }),
|
|
189
|
+
/* @__PURE__ */ jsx(Button, { type: "button", variant: "outline", onClick: handleToggleActive, children: rule.isActive ? t("cpq.priceRules.detail.deactivate", "Deactivate") : t("cpq.priceRules.detail.activate", "Activate") }),
|
|
186
190
|
!editing && /* @__PURE__ */ jsx(
|
|
187
191
|
"button",
|
|
188
192
|
{
|
|
189
193
|
onClick: startEdit,
|
|
190
194
|
className: "rounded-md bg-primary px-4 py-1.5 text-sm font-medium text-primary-foreground hover:bg-primary/90",
|
|
191
|
-
children: "Edit"
|
|
195
|
+
children: t("cpq.common.edit", "Edit")
|
|
192
196
|
}
|
|
193
197
|
),
|
|
194
198
|
/* @__PURE__ */ jsx(
|
|
@@ -196,16 +200,16 @@ function PriceRuleDetailPage(props) {
|
|
|
196
200
|
{
|
|
197
201
|
onClick: () => setShowDeleteConfirm(true),
|
|
198
202
|
className: "rounded-md border border-destructive/30 px-3 py-1.5 text-sm font-medium text-destructive hover:bg-destructive/10 transition-colors",
|
|
199
|
-
children: "Delete"
|
|
203
|
+
children: t("cpq.common.delete", "Delete")
|
|
200
204
|
}
|
|
201
205
|
)
|
|
202
206
|
] })
|
|
203
207
|
] }),
|
|
204
208
|
showDeleteConfirm && /* @__PURE__ */ jsxs("div", { className: "rounded-lg border border-destructive/30 bg-destructive/5 p-4 flex items-center justify-between", children: [
|
|
205
209
|
/* @__PURE__ */ jsxs("span", { className: "text-sm", children: [
|
|
206
|
-
|
|
210
|
+
deleteConfirmParts[0],
|
|
207
211
|
/* @__PURE__ */ jsx("strong", { children: rule.name }),
|
|
208
|
-
|
|
212
|
+
deleteConfirmParts[1]
|
|
209
213
|
] }),
|
|
210
214
|
/* @__PURE__ */ jsxs("div", { className: "flex gap-2", children: [
|
|
211
215
|
/* @__PURE__ */ jsx(
|
|
@@ -214,7 +218,7 @@ function PriceRuleDetailPage(props) {
|
|
|
214
218
|
onClick: handleDelete,
|
|
215
219
|
disabled: deleting,
|
|
216
220
|
className: "rounded-md bg-destructive px-3 py-1.5 text-sm font-medium text-destructive-foreground hover:bg-destructive/90 disabled:opacity-50",
|
|
217
|
-
children: deleting ? "Deleting..." : "Yes, Delete"
|
|
221
|
+
children: deleting ? t("cpq.priceRules.detail.deleting", "Deleting...") : t("cpq.priceRules.detail.confirmDelete", "Yes, Delete")
|
|
218
222
|
}
|
|
219
223
|
),
|
|
220
224
|
/* @__PURE__ */ jsx(
|
|
@@ -222,29 +226,29 @@ function PriceRuleDetailPage(props) {
|
|
|
222
226
|
{
|
|
223
227
|
onClick: () => setShowDeleteConfirm(false),
|
|
224
228
|
className: "rounded-md border px-3 py-1.5 text-sm font-medium hover:bg-muted/50",
|
|
225
|
-
children: "Cancel"
|
|
229
|
+
children: t("cpq.common.cancel", "Cancel")
|
|
226
230
|
}
|
|
227
231
|
)
|
|
228
232
|
] })
|
|
229
233
|
] }),
|
|
230
234
|
editing && form ? /* @__PURE__ */ jsxs("div", { className: "rounded-lg border bg-card p-6 space-y-4", children: [
|
|
231
|
-
/* @__PURE__ */ jsx("h2", { className: "text-lg font-semibold", children: "Edit Rule" }),
|
|
235
|
+
/* @__PURE__ */ jsx("h2", { className: "text-lg font-semibold", children: t("cpq.priceRules.form.editTitle", "Edit Rule") }),
|
|
232
236
|
saveError && /* @__PURE__ */ jsx("div", { className: "rounded-md bg-destructive/10 p-3 text-sm text-destructive", children: saveError }),
|
|
233
237
|
/* @__PURE__ */ jsxs("div", { className: "grid grid-cols-2 gap-4", children: [
|
|
234
238
|
/* @__PURE__ */ jsxs("label", { className: "space-y-1", children: [
|
|
235
|
-
/* @__PURE__ */ jsx("span", { className: "text-sm font-medium", children: "Code" }),
|
|
239
|
+
/* @__PURE__ */ jsx("span", { className: "text-sm font-medium", children: t("cpq.priceRules.form.code", "Code") }),
|
|
236
240
|
/* @__PURE__ */ jsx("input", { className: "w-full rounded-md border bg-muted/30 px-3 py-2 text-sm", value: rule.code, disabled: true })
|
|
237
241
|
] }),
|
|
238
242
|
/* @__PURE__ */ jsxs("label", { className: "space-y-1", children: [
|
|
239
|
-
/* @__PURE__ */ jsx("span", { className: "text-sm font-medium", children: "Name" }),
|
|
243
|
+
/* @__PURE__ */ jsx("span", { className: "text-sm font-medium", children: t("cpq.priceRules.form.name", "Name") }),
|
|
240
244
|
/* @__PURE__ */ jsx("input", { className: "w-full rounded-md border px-3 py-2 text-sm", value: form.name, onChange: (e) => setForm({ ...form, name: e.target.value }) })
|
|
241
245
|
] }),
|
|
242
246
|
/* @__PURE__ */ jsxs("label", { className: "space-y-1", children: [
|
|
243
|
-
/* @__PURE__ */ jsx("span", { className: "text-sm font-medium", children: "Rule Type" }),
|
|
244
|
-
/* @__PURE__ */ jsx("select", { className: "w-full rounded-md border px-3 py-2 text-sm", value: form.ruleType, onChange: (e) => setForm({ ...form, ruleType: e.target.value }), children: Object.entries(
|
|
247
|
+
/* @__PURE__ */ jsx("span", { className: "text-sm font-medium", children: t("cpq.priceRules.form.ruleType", "Rule Type") }),
|
|
248
|
+
/* @__PURE__ */ jsx("select", { className: "w-full rounded-md border px-3 py-2 text-sm", value: form.ruleType, onChange: (e) => setForm({ ...form, ruleType: e.target.value }), children: Object.entries(ruleTypeLabels).map(([k, v]) => /* @__PURE__ */ jsx("option", { value: k, children: v }, k)) })
|
|
245
249
|
] }),
|
|
246
250
|
/* @__PURE__ */ jsxs("label", { className: "space-y-1", children: [
|
|
247
|
-
/* @__PURE__ */ jsx("span", { className: "text-sm font-medium", children: "Value" }),
|
|
251
|
+
/* @__PURE__ */ jsx("span", { className: "text-sm font-medium", children: t("cpq.priceRules.form.value", "Value") }),
|
|
248
252
|
/* @__PURE__ */ jsx(
|
|
249
253
|
NumberInput,
|
|
250
254
|
{
|
|
@@ -254,7 +258,7 @@ function PriceRuleDetailPage(props) {
|
|
|
254
258
|
)
|
|
255
259
|
] }),
|
|
256
260
|
/* @__PURE__ */ jsxs("label", { className: "space-y-1", children: [
|
|
257
|
-
/* @__PURE__ */ jsx("span", { className: "text-sm font-medium", children: "Sort Order" }),
|
|
261
|
+
/* @__PURE__ */ jsx("span", { className: "text-sm font-medium", children: t("cpq.priceRules.form.sortOrder", "Sort Order") }),
|
|
258
262
|
/* @__PURE__ */ jsx(
|
|
259
263
|
NumberInput,
|
|
260
264
|
{
|
|
@@ -265,26 +269,26 @@ function PriceRuleDetailPage(props) {
|
|
|
265
269
|
)
|
|
266
270
|
] }),
|
|
267
271
|
/* @__PURE__ */ jsxs("label", { className: "space-y-1", children: [
|
|
268
|
-
/* @__PURE__ */ jsx("span", { className: "text-sm font-medium", children: "Description" }),
|
|
269
|
-
/* @__PURE__ */ jsx("input", { className: "w-full rounded-md border px-3 py-2 text-sm", placeholder: "Optional", value: form.description, onChange: (e) => setForm({ ...form, description: e.target.value }) })
|
|
272
|
+
/* @__PURE__ */ jsx("span", { className: "text-sm font-medium", children: t("cpq.priceRules.form.description", "Description") }),
|
|
273
|
+
/* @__PURE__ */ jsx("input", { className: "w-full rounded-md border px-3 py-2 text-sm", placeholder: t("cpq.priceRules.form.descriptionPlaceholder", "Optional"), value: form.description, onChange: (e) => setForm({ ...form, description: e.target.value }) })
|
|
270
274
|
] }),
|
|
271
275
|
/* @__PURE__ */ jsxs("label", { className: "space-y-1", children: [
|
|
272
|
-
/* @__PURE__ */ jsx("span", { className: "text-sm font-medium", children: "Charge Type Filter" }),
|
|
276
|
+
/* @__PURE__ */ jsx("span", { className: "text-sm font-medium", children: t("cpq.priceRules.form.chargeTypeFilter", "Charge Type Filter") }),
|
|
273
277
|
/* @__PURE__ */ jsxs("select", { className: "w-full rounded-md border px-3 py-2 text-sm", value: form.chargeTypeFilter, onChange: (e) => setForm({ ...form, chargeTypeFilter: e.target.value }), children: [
|
|
274
|
-
/* @__PURE__ */ jsx("option", { value: "", children: "All charge types" }),
|
|
275
|
-
/* @__PURE__ */ jsx("option", { value: "nrc", children: "NRC only" }),
|
|
276
|
-
/* @__PURE__ */ jsx("option", { value: "mrc", children: "MRC only" }),
|
|
277
|
-
/* @__PURE__ */ jsx("option", { value: "usage", children: "Usage only" })
|
|
278
|
+
/* @__PURE__ */ jsx("option", { value: "", children: t("cpq.priceRules.form.allChargeTypes", "All charge types") }),
|
|
279
|
+
/* @__PURE__ */ jsx("option", { value: "nrc", children: t("cpq.priceRules.form.nrcOnly", "NRC only") }),
|
|
280
|
+
/* @__PURE__ */ jsx("option", { value: "mrc", children: t("cpq.priceRules.form.mrcOnly", "MRC only") }),
|
|
281
|
+
/* @__PURE__ */ jsx("option", { value: "usage", children: t("cpq.priceRules.form.usageOnly", "Usage only") })
|
|
278
282
|
] })
|
|
279
283
|
] }),
|
|
280
284
|
/* @__PURE__ */ jsxs("label", { className: "space-y-1", children: [
|
|
281
|
-
/* @__PURE__ */ jsx("span", { className: "text-sm font-medium", children: "Charge Code Filter" }),
|
|
282
|
-
/* @__PURE__ */ jsx("input", { className: "w-full rounded-md border px-3 py-2 text-sm", placeholder: "e.g. setup_fee (leave empty for all)", value: form.chargeCodeFilter, onChange: (e) => setForm({ ...form, chargeCodeFilter: e.target.value }) })
|
|
285
|
+
/* @__PURE__ */ jsx("span", { className: "text-sm font-medium", children: t("cpq.priceRules.form.chargeCodeFilter", "Charge Code Filter") }),
|
|
286
|
+
/* @__PURE__ */ jsx("input", { className: "w-full rounded-md border px-3 py-2 text-sm", placeholder: t("cpq.priceRules.form.chargeCodeFilterPlaceholder", "e.g. setup_fee (leave empty for all)"), value: form.chargeCodeFilter, onChange: (e) => setForm({ ...form, chargeCodeFilter: e.target.value }) })
|
|
283
287
|
] }),
|
|
284
288
|
/* @__PURE__ */ jsxs("label", { className: "space-y-1 col-span-2", children: [
|
|
285
|
-
/* @__PURE__ */ jsx("span", { className: "text-sm font-medium", children: "Product Offering" }),
|
|
289
|
+
/* @__PURE__ */ jsx("span", { className: "text-sm font-medium", children: t("cpq.priceRules.form.productOffering", "Product Offering") }),
|
|
286
290
|
/* @__PURE__ */ jsxs("select", { className: "w-full rounded-md border px-3 py-2 text-sm", value: form.productOfferingId, onChange: (e) => setForm({ ...form, productOfferingId: e.target.value }), children: [
|
|
287
|
-
/* @__PURE__ */ jsx("option", { value: "", children: "Global (all products)" }),
|
|
291
|
+
/* @__PURE__ */ jsx("option", { value: "", children: t("cpq.priceRules.form.globalAllProducts", "Global (all products)") }),
|
|
288
292
|
offerings.map((o) => /* @__PURE__ */ jsxs("option", { value: o.id, children: [
|
|
289
293
|
o.name,
|
|
290
294
|
" (",
|
|
@@ -294,59 +298,59 @@ function PriceRuleDetailPage(props) {
|
|
|
294
298
|
] })
|
|
295
299
|
] }),
|
|
296
300
|
/* @__PURE__ */ jsxs("div", { className: "col-span-2 space-y-1", children: [
|
|
297
|
-
/* @__PURE__ */ jsx("span", { className: "text-sm font-medium", children: "Applicability Condition" }),
|
|
298
|
-
/* @__PURE__ */ jsx("span", { className: "ml-2 text-xs text-muted-foreground", children: "(optional)" }),
|
|
301
|
+
/* @__PURE__ */ jsx("span", { className: "text-sm font-medium", children: t("cpq.priceRules.form.applicabilityCondition", "Applicability Condition") }),
|
|
302
|
+
/* @__PURE__ */ jsx("span", { className: "ml-2 text-xs text-muted-foreground", children: t("cpq.priceRules.form.optionalHint", "(optional)") }),
|
|
299
303
|
/* @__PURE__ */ jsxs("div", { className: "grid grid-cols-3 gap-2", children: [
|
|
300
|
-
/* @__PURE__ */ jsx("input", { className: "w-full rounded-md border px-3 py-2 text-sm", placeholder: "Attribute (e.g. port_size)", value: form.conditionAttribute, onChange: (e) => setForm({ ...form, conditionAttribute: e.target.value }) }),
|
|
304
|
+
/* @__PURE__ */ jsx("input", { className: "w-full rounded-md border px-3 py-2 text-sm", placeholder: t("cpq.priceRules.form.conditionAttributePlaceholder", "Attribute (e.g. port_size)"), value: form.conditionAttribute, onChange: (e) => setForm({ ...form, conditionAttribute: e.target.value }) }),
|
|
301
305
|
/* @__PURE__ */ jsxs("select", { className: "w-full rounded-md border px-3 py-2 text-sm", value: form.conditionOperator, onChange: (e) => setForm({ ...form, conditionOperator: e.target.value }), children: [
|
|
302
|
-
/* @__PURE__ */ jsx("option", { value: "eq", children: "equals (=)" }),
|
|
303
|
-
/* @__PURE__ */ jsx("option", { value: "neq", children: "not equals (\u2260)" })
|
|
306
|
+
/* @__PURE__ */ jsx("option", { value: "eq", children: t("cpq.priceRules.form.operatorEq", "equals (=)") }),
|
|
307
|
+
/* @__PURE__ */ jsx("option", { value: "neq", children: t("cpq.priceRules.form.operatorNeq", "not equals (\u2260)") })
|
|
304
308
|
] }),
|
|
305
|
-
/* @__PURE__ */ jsx("input", { className: "w-full rounded-md border px-3 py-2 text-sm", placeholder: "Value", value: form.conditionValue, onChange: (e) => setForm({ ...form, conditionValue: e.target.value }) })
|
|
309
|
+
/* @__PURE__ */ jsx("input", { className: "w-full rounded-md border px-3 py-2 text-sm", placeholder: t("cpq.priceRules.form.conditionValuePlaceholderShort", "Value"), value: form.conditionValue, onChange: (e) => setForm({ ...form, conditionValue: e.target.value }) })
|
|
306
310
|
] })
|
|
307
311
|
] })
|
|
308
312
|
] }),
|
|
309
313
|
/* @__PURE__ */ jsxs("label", { className: "flex items-center gap-2 text-sm", children: [
|
|
310
314
|
/* @__PURE__ */ jsx("input", { type: "checkbox", checked: form.isActive, onChange: (e) => setForm({ ...form, isActive: e.target.checked }) }),
|
|
311
|
-
"Active"
|
|
315
|
+
t("cpq.common.active", "Active")
|
|
312
316
|
] }),
|
|
313
317
|
/* @__PURE__ */ jsxs("div", { className: "flex gap-2", children: [
|
|
314
|
-
/* @__PURE__ */ jsx("button", { onClick: handleSave, disabled: saving, className: "rounded-md bg-primary px-4 py-2 text-sm font-medium text-primary-foreground hover:bg-primary/90 disabled:opacity-50", children: saving ? "Saving..." : "Save Changes" }),
|
|
315
|
-
/* @__PURE__ */ jsx("button", { onClick: cancelEdit, className: "rounded-md border px-4 py-2 text-sm font-medium hover:bg-muted/50", children: "Cancel" })
|
|
318
|
+
/* @__PURE__ */ jsx("button", { onClick: handleSave, disabled: saving, className: "rounded-md bg-primary px-4 py-2 text-sm font-medium text-primary-foreground hover:bg-primary/90 disabled:opacity-50", children: saving ? t("cpq.common.saving", "Saving...") : t("cpq.priceRules.detail.saveChanges", "Save Changes") }),
|
|
319
|
+
/* @__PURE__ */ jsx("button", { onClick: cancelEdit, className: "rounded-md border px-4 py-2 text-sm font-medium hover:bg-muted/50", children: t("cpq.common.cancel", "Cancel") })
|
|
316
320
|
] })
|
|
317
321
|
] }) : (
|
|
318
322
|
/* Read-only view */
|
|
319
323
|
/* @__PURE__ */ jsxs("div", { className: "grid grid-cols-1 lg:grid-cols-2 gap-6", children: [
|
|
320
324
|
/* @__PURE__ */ jsxs("div", { className: "rounded-lg border bg-card p-6 space-y-4", children: [
|
|
321
|
-
/* @__PURE__ */ jsx("h2", { className: "text-sm font-semibold text-muted-foreground uppercase tracking-wider", children: "Rule Configuration" }),
|
|
325
|
+
/* @__PURE__ */ jsx("h2", { className: "text-sm font-semibold text-muted-foreground uppercase tracking-wider", children: t("cpq.priceRules.detail.ruleConfiguration", "Rule Configuration") }),
|
|
322
326
|
/* @__PURE__ */ jsxs("dl", { className: "space-y-3", children: [
|
|
323
327
|
/* @__PURE__ */ jsxs("div", { className: "flex justify-between", children: [
|
|
324
|
-
/* @__PURE__ */ jsx("dt", { className: "text-sm text-muted-foreground", children: "Code" }),
|
|
328
|
+
/* @__PURE__ */ jsx("dt", { className: "text-sm text-muted-foreground", children: t("cpq.priceRules.detail.code", "Code") }),
|
|
325
329
|
/* @__PURE__ */ jsx("dd", { className: "text-sm font-mono", children: rule.code })
|
|
326
330
|
] }),
|
|
327
331
|
/* @__PURE__ */ jsxs("div", { className: "flex justify-between border-t pt-3", children: [
|
|
328
|
-
/* @__PURE__ */ jsx("dt", { className: "text-sm text-muted-foreground", children: "Rule Type" }),
|
|
329
|
-
/* @__PURE__ */ jsx("dd", { className: "text-sm font-medium", children:
|
|
332
|
+
/* @__PURE__ */ jsx("dt", { className: "text-sm text-muted-foreground", children: t("cpq.priceRules.detail.ruleType", "Rule Type") }),
|
|
333
|
+
/* @__PURE__ */ jsx("dd", { className: "text-sm font-medium", children: ruleTypeLabels[rule.ruleType] ?? rule.ruleType })
|
|
330
334
|
] }),
|
|
331
335
|
/* @__PURE__ */ jsxs("div", { className: "flex justify-between border-t pt-3", children: [
|
|
332
|
-
/* @__PURE__ */ jsx("dt", { className: "text-sm text-muted-foreground", children: "Value" }),
|
|
336
|
+
/* @__PURE__ */ jsx("dt", { className: "text-sm text-muted-foreground", children: t("cpq.priceRules.detail.value", "Value") }),
|
|
333
337
|
/* @__PURE__ */ jsx("dd", { className: "text-sm font-mono font-medium", children: rule.ruleType.includes("percent") ? `${rule.value}%` : rule.ruleType === "price_override" ? `= $${rule.value}` : `$${rule.value}` })
|
|
334
338
|
] }),
|
|
335
339
|
/* @__PURE__ */ jsxs("div", { className: "flex justify-between border-t pt-3", children: [
|
|
336
|
-
/* @__PURE__ */ jsx("dt", { className: "text-sm text-muted-foreground", children: "Sort Order" }),
|
|
340
|
+
/* @__PURE__ */ jsx("dt", { className: "text-sm text-muted-foreground", children: t("cpq.priceRules.detail.sortOrder", "Sort Order") }),
|
|
337
341
|
/* @__PURE__ */ jsx("dd", { className: "text-sm font-mono", children: rule.sortOrder })
|
|
338
342
|
] }),
|
|
339
343
|
rule.description && /* @__PURE__ */ jsxs("div", { className: "border-t pt-3", children: [
|
|
340
|
-
/* @__PURE__ */ jsx("dt", { className: "text-sm text-muted-foreground mb-1", children: "Description" }),
|
|
344
|
+
/* @__PURE__ */ jsx("dt", { className: "text-sm text-muted-foreground mb-1", children: t("cpq.priceRules.detail.description", "Description") }),
|
|
341
345
|
/* @__PURE__ */ jsx("dd", { className: "text-sm", children: rule.description })
|
|
342
346
|
] })
|
|
343
347
|
] })
|
|
344
348
|
] }),
|
|
345
349
|
/* @__PURE__ */ jsxs("div", { className: "rounded-lg border bg-card p-6 space-y-4", children: [
|
|
346
|
-
/* @__PURE__ */ jsx("h2", { className: "text-sm font-semibold text-muted-foreground uppercase tracking-wider", children: "Scope & Filters" }),
|
|
350
|
+
/* @__PURE__ */ jsx("h2", { className: "text-sm font-semibold text-muted-foreground uppercase tracking-wider", children: t("cpq.priceRules.detail.scopeAndFilters", "Scope & Filters") }),
|
|
347
351
|
/* @__PURE__ */ jsxs("dl", { className: "space-y-3", children: [
|
|
348
352
|
/* @__PURE__ */ jsxs("div", { className: "flex justify-between", children: [
|
|
349
|
-
/* @__PURE__ */ jsx("dt", { className: "text-sm text-muted-foreground", children: "Scope" }),
|
|
353
|
+
/* @__PURE__ */ jsx("dt", { className: "text-sm text-muted-foreground", children: t("cpq.priceRules.detail.scope", "Scope") }),
|
|
350
354
|
/* @__PURE__ */ jsx("dd", { className: "text-sm", children: offering ? /* @__PURE__ */ jsxs("span", { className: "inline-flex items-center gap-1.5", children: [
|
|
351
355
|
/* @__PURE__ */ jsx("span", { className: "inline-block w-2 h-2 rounded-full bg-status-info-icon" }),
|
|
352
356
|
offering.name,
|
|
@@ -357,42 +361,42 @@ function PriceRuleDetailPage(props) {
|
|
|
357
361
|
] })
|
|
358
362
|
] }) : /* @__PURE__ */ jsxs("span", { className: "inline-flex items-center gap-1.5", children: [
|
|
359
363
|
/* @__PURE__ */ jsx("span", { className: "inline-block w-2 h-2 rounded-full bg-muted-foreground" }),
|
|
360
|
-
"Global (all offerings)"
|
|
364
|
+
t("cpq.priceRules.detail.globalAllOfferings", "Global (all offerings)")
|
|
361
365
|
] }) })
|
|
362
366
|
] }),
|
|
363
367
|
/* @__PURE__ */ jsxs("div", { className: "flex justify-between border-t pt-3", children: [
|
|
364
|
-
/* @__PURE__ */ jsx("dt", { className: "text-sm text-muted-foreground", children: "Charge Type" }),
|
|
365
|
-
/* @__PURE__ */ jsx("dd", { className: "text-sm", children: rule.chargeTypeFilter ? rule.chargeTypeFilter.toUpperCase() : "All types" })
|
|
368
|
+
/* @__PURE__ */ jsx("dt", { className: "text-sm text-muted-foreground", children: t("cpq.priceRules.detail.chargeType", "Charge Type") }),
|
|
369
|
+
/* @__PURE__ */ jsx("dd", { className: "text-sm", children: rule.chargeTypeFilter ? rule.chargeTypeFilter.toUpperCase() : t("cpq.priceRules.detail.allTypes", "All types") })
|
|
366
370
|
] }),
|
|
367
371
|
/* @__PURE__ */ jsxs("div", { className: "flex justify-between border-t pt-3", children: [
|
|
368
|
-
/* @__PURE__ */ jsx("dt", { className: "text-sm text-muted-foreground", children: "Charge Code" }),
|
|
369
|
-
/* @__PURE__ */ jsx("dd", { className: "text-sm font-mono", children: rule.chargeCodeFilter ?? "All charges" })
|
|
372
|
+
/* @__PURE__ */ jsx("dt", { className: "text-sm text-muted-foreground", children: t("cpq.priceRules.detail.chargeCode", "Charge Code") }),
|
|
373
|
+
/* @__PURE__ */ jsx("dd", { className: "text-sm font-mono", children: rule.chargeCodeFilter ?? t("cpq.priceRules.detail.allCharges", "All charges") })
|
|
370
374
|
] }),
|
|
371
375
|
/* @__PURE__ */ jsxs("div", { className: "border-t pt-3", children: [
|
|
372
|
-
/* @__PURE__ */ jsx("dt", { className: "text-sm text-muted-foreground mb-1", children: "Applicability Condition" }),
|
|
376
|
+
/* @__PURE__ */ jsx("dt", { className: "text-sm text-muted-foreground mb-1", children: t("cpq.priceRules.detail.applicabilityCondition", "Applicability Condition") }),
|
|
373
377
|
/* @__PURE__ */ jsx("dd", { className: "text-sm", children: cond?.attribute ? /* @__PURE__ */ jsxs("code", { className: "rounded bg-muted px-2 py-0.5 text-xs", children: [
|
|
374
378
|
cond.attribute,
|
|
375
379
|
" ",
|
|
376
380
|
cond.operator === "neq" ? "\u2260" : "=",
|
|
377
381
|
" ",
|
|
378
382
|
cond.value ?? '""'
|
|
379
|
-
] }) : /* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: "No condition (always applies)" }) })
|
|
383
|
+
] }) : /* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: t("cpq.priceRules.detail.noCondition", "No condition (always applies)") }) })
|
|
380
384
|
] })
|
|
381
385
|
] })
|
|
382
386
|
] }),
|
|
383
387
|
/* @__PURE__ */ jsxs("div", { className: "rounded-lg border bg-card p-6 space-y-4 lg:col-span-2", children: [
|
|
384
|
-
/* @__PURE__ */ jsx("h2", { className: "text-sm font-semibold text-muted-foreground uppercase tracking-wider", children: "Metadata" }),
|
|
388
|
+
/* @__PURE__ */ jsx("h2", { className: "text-sm font-semibold text-muted-foreground uppercase tracking-wider", children: t("cpq.priceRules.detail.metadata", "Metadata") }),
|
|
385
389
|
/* @__PURE__ */ jsxs("dl", { className: "flex gap-8 text-sm", children: [
|
|
386
390
|
/* @__PURE__ */ jsxs("div", { children: [
|
|
387
|
-
/* @__PURE__ */ jsx("dt", { className: "text-muted-foreground", children: "Created" }),
|
|
391
|
+
/* @__PURE__ */ jsx("dt", { className: "text-muted-foreground", children: t("cpq.priceRules.detail.created", "Created") }),
|
|
388
392
|
/* @__PURE__ */ jsx("dd", { children: new Date(rule.createdAt).toLocaleString() })
|
|
389
393
|
] }),
|
|
390
394
|
/* @__PURE__ */ jsxs("div", { children: [
|
|
391
|
-
/* @__PURE__ */ jsx("dt", { className: "text-muted-foreground", children: "Updated" }),
|
|
395
|
+
/* @__PURE__ */ jsx("dt", { className: "text-muted-foreground", children: t("cpq.priceRules.detail.updated", "Updated") }),
|
|
392
396
|
/* @__PURE__ */ jsx("dd", { children: new Date(rule.updatedAt).toLocaleString() })
|
|
393
397
|
] }),
|
|
394
398
|
/* @__PURE__ */ jsxs("div", { children: [
|
|
395
|
-
/* @__PURE__ */ jsx("dt", { className: "text-muted-foreground", children: "ID" }),
|
|
399
|
+
/* @__PURE__ */ jsx("dt", { className: "text-muted-foreground", children: t("cpq.priceRules.detail.id", "ID") }),
|
|
396
400
|
/* @__PURE__ */ jsx("dd", { className: "font-mono text-xs", children: rule.id })
|
|
397
401
|
] })
|
|
398
402
|
] })
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../../../src/modules/cpq/backend/cpq/price-rules/%5Bid%5D/page.tsx"],
|
|
4
|
-
"sourcesContent": ["\"use client\"\nimport * as React from 'react'\nimport { useRouter, useParams } from 'next/navigation'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { Tag } from '@open-mercato/ui/primitives/tag'\nimport { NumberInput } from '../../../../components/NumberInput'\n\nconst RULE_TYPE_LABELS: Record<string, string> = {\n discount_percent: 'Discount %',\n discount_absolute: 'Discount $',\n surcharge_percent: 'Surcharge %',\n surcharge_absolute: 'Surcharge $',\n price_override: 'Override',\n}\n\ntype PriceRule = {\n id: string\n code: string\n name: string\n description: string | null\n productOfferingId: string | null\n ruleType: string\n value: number\n chargeCodeFilter: string | null\n chargeTypeFilter: string | null\n applicabilityCondition: Record<string, unknown> | null\n sortOrder: number\n isActive: boolean\n createdAt: string\n updatedAt: string\n}\n\ntype ProductOffering = { id: string; code: string; name: string }\n\ntype FormData = {\n name: string\n description: string\n productOfferingId: string\n ruleType: string\n value: string\n chargeCodeFilter: string\n chargeTypeFilter: string\n conditionAttribute: string\n conditionOperator: string\n conditionValue: string\n sortOrder: string\n isActive: boolean\n}\n\nfunction ruleToForm(rule: PriceRule): FormData {\n const cond = rule.applicabilityCondition as { attribute?: string; operator?: string; value?: string } | null\n return {\n name: rule.name,\n description: rule.description ?? '',\n productOfferingId: rule.productOfferingId ?? '',\n ruleType: rule.ruleType,\n value: String(rule.value),\n chargeCodeFilter: rule.chargeCodeFilter ?? '',\n chargeTypeFilter: rule.chargeTypeFilter ?? '',\n conditionAttribute: cond?.attribute ?? '',\n conditionOperator: cond?.operator ?? 'eq',\n conditionValue: cond?.value ?? '',\n sortOrder: String(rule.sortOrder),\n isActive: rule.isActive,\n }\n}\n\nexport default function PriceRuleDetailPage(props: { params?: { id?: string } }) {\n const router = useRouter()\n const urlParams = useParams()\n const ruleId = (props.params?.id ?? urlParams?.id) as string\n\n const [rule, setRule] = React.useState<PriceRule | null>(null)\n const [loading, setLoading] = React.useState(true)\n const [error, setError] = React.useState<string | null>(null)\n\n const [editing, setEditing] = React.useState(false)\n const [form, setForm] = React.useState<FormData | null>(null)\n const [saving, setSaving] = React.useState(false)\n const [saveError, setSaveError] = React.useState<string | null>(null)\n\n const [deleting, setDeleting] = React.useState(false)\n const [showDeleteConfirm, setShowDeleteConfirm] = React.useState(false)\n\n const [offerings, setOfferings] = React.useState<ProductOffering[]>([])\n\n React.useEffect(() => {\n fetch('/api/cpq/product-offerings?pageSize=100')\n .then((r) => r.json())\n .then((data) => setOfferings(data.items ?? []))\n .catch(() => {})\n }, [])\n\n const offeringLookup = React.useMemo(() => {\n const map = new Map<string, ProductOffering>()\n for (const o of offerings) map.set(o.id, o)\n return map\n }, [offerings])\n\n const loadRule = React.useCallback(() => {\n setLoading(true)\n setError(null)\n fetch(`/api/cpq/price-rules?id=${ruleId}`)\n .then(async (r) => {\n if (!r.ok) throw new Error('Not found')\n return r.json()\n })\n .then((data: PriceRule) => {\n setRule(data)\n })\n .catch((err) => setError(err.message))\n .finally(() => setLoading(false))\n }, [ruleId])\n\n React.useEffect(() => { loadRule() }, [loadRule])\n\n function startEdit() {\n if (!rule) return\n setForm(ruleToForm(rule))\n setSaveError(null)\n setEditing(true)\n }\n\n function cancelEdit() {\n setEditing(false)\n setForm(null)\n setSaveError(null)\n }\n\n async function handleSave() {\n if (!form || !rule) return\n setSaving(true)\n setSaveError(null)\n try {\n const payload: Record<string, unknown> = {\n id: rule.id,\n name: form.name,\n ruleType: form.ruleType,\n value: Number(form.value),\n sortOrder: Number(form.sortOrder),\n isActive: form.isActive,\n productOfferingId: form.productOfferingId || null,\n }\n if (form.description) payload.description = form.description\n else payload.description = null\n if (form.chargeCodeFilter) payload.chargeCodeFilter = form.chargeCodeFilter\n else payload.chargeCodeFilter = null\n if (form.chargeTypeFilter) payload.chargeTypeFilter = form.chargeTypeFilter\n else payload.chargeTypeFilter = null\n if (form.conditionAttribute) {\n payload.applicabilityCondition = {\n attribute: form.conditionAttribute,\n operator: form.conditionOperator || 'eq',\n value: form.conditionValue,\n }\n } else {\n payload.applicabilityCondition = null\n }\n\n const res = await fetch('/api/cpq/price-rules', {\n method: 'PUT',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(payload),\n })\n if (!res.ok) {\n const err = await res.json()\n throw new Error(err.error ?? 'Failed to update')\n }\n const updated = await res.json()\n setRule(updated)\n setEditing(false)\n setForm(null)\n } catch (err: unknown) {\n setSaveError(err instanceof Error ? err.message : 'Unknown error')\n } finally {\n setSaving(false)\n }\n }\n\n async function handleDelete() {\n setDeleting(true)\n try {\n await fetch('/api/cpq/price-rules', {\n method: 'DELETE',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ id: ruleId }),\n })\n router.push('/backend/cpq/price-rules')\n } catch {\n setDeleting(false)\n }\n }\n\n async function handleToggleActive() {\n if (!rule) return\n const res = await fetch('/api/cpq/price-rules', {\n method: 'PUT',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ id: rule.id, isActive: !rule.isActive }),\n })\n if (res.ok) {\n const updated = await res.json()\n setRule(updated)\n }\n }\n\n if (loading) {\n return <div className=\"text-sm text-muted-foreground py-12 text-center\">Loading...</div>\n }\n\n if (error || !rule) {\n return (\n <div className=\"space-y-4 py-12 text-center\">\n <div className=\"text-sm text-destructive\">{error ?? 'Rule not found'}</div>\n <button\n onClick={() => router.push('/backend/cpq/price-rules')}\n className=\"text-sm text-primary hover:underline\"\n >\n ← Back to Price Rules\n </button>\n </div>\n )\n }\n\n const cond = rule.applicabilityCondition as { attribute?: string; operator?: string; value?: string } | null\n const offering = rule.productOfferingId ? offeringLookup.get(rule.productOfferingId) : null\n\n return (\n <div className=\"space-y-6\">\n {/* Header */}\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-3\">\n <button\n onClick={() => router.push('/backend/cpq/price-rules')}\n className=\"text-sm text-muted-foreground hover:text-foreground transition-colors\"\n >\n ← Back\n </button>\n <h1 className=\"text-2xl font-bold\">{rule.name}</h1>\n <Tag variant={rule.isActive ? 'success' : 'neutral'} dot>\n {rule.isActive ? 'Active' : 'Inactive'}\n </Tag>\n </div>\n <div className=\"flex items-center gap-2\">\n <Button type=\"button\" variant=\"outline\" onClick={handleToggleActive}>\n {rule.isActive ? 'Deactivate' : 'Activate'}\n </Button>\n {!editing && (\n <button\n onClick={startEdit}\n className=\"rounded-md bg-primary px-4 py-1.5 text-sm font-medium text-primary-foreground hover:bg-primary/90\"\n >\n Edit\n </button>\n )}\n <button\n onClick={() => setShowDeleteConfirm(true)}\n className=\"rounded-md border border-destructive/30 px-3 py-1.5 text-sm font-medium text-destructive hover:bg-destructive/10 transition-colors\"\n >\n Delete\n </button>\n </div>\n </div>\n\n {/* Delete confirmation */}\n {showDeleteConfirm && (\n <div className=\"rounded-lg border border-destructive/30 bg-destructive/5 p-4 flex items-center justify-between\">\n <span className=\"text-sm\">Are you sure you want to delete <strong>{rule.name}</strong>?</span>\n <div className=\"flex gap-2\">\n <button\n onClick={handleDelete}\n disabled={deleting}\n className=\"rounded-md bg-destructive px-3 py-1.5 text-sm font-medium text-destructive-foreground hover:bg-destructive/90 disabled:opacity-50\"\n >\n {deleting ? 'Deleting...' : 'Yes, Delete'}\n </button>\n <button\n onClick={() => setShowDeleteConfirm(false)}\n className=\"rounded-md border px-3 py-1.5 text-sm font-medium hover:bg-muted/50\"\n >\n Cancel\n </button>\n </div>\n </div>\n )}\n\n {/* Edit mode */}\n {editing && form ? (\n <div className=\"rounded-lg border bg-card p-6 space-y-4\">\n <h2 className=\"text-lg font-semibold\">Edit Rule</h2>\n {saveError && <div className=\"rounded-md bg-destructive/10 p-3 text-sm text-destructive\">{saveError}</div>}\n <div className=\"grid grid-cols-2 gap-4\">\n <label className=\"space-y-1\">\n <span className=\"text-sm font-medium\">Code</span>\n <input className=\"w-full rounded-md border bg-muted/30 px-3 py-2 text-sm\" value={rule.code} disabled />\n </label>\n <label className=\"space-y-1\">\n <span className=\"text-sm font-medium\">Name</span>\n <input className=\"w-full rounded-md border px-3 py-2 text-sm\" value={form.name} onChange={(e) => setForm({ ...form, name: e.target.value })} />\n </label>\n <label className=\"space-y-1\">\n <span className=\"text-sm font-medium\">Rule Type</span>\n <select className=\"w-full rounded-md border px-3 py-2 text-sm\" value={form.ruleType} onChange={(e) => setForm({ ...form, ruleType: e.target.value })}>\n {Object.entries(RULE_TYPE_LABELS).map(([k, v]) => <option key={k} value={k}>{v}</option>)}\n </select>\n </label>\n <label className=\"space-y-1\">\n <span className=\"text-sm font-medium\">Value</span>\n <NumberInput\n value={form.value === '' ? null : Number(form.value)}\n onChange={(n) => setForm({ ...form, value: n == null ? '' : String(n) })}\n />\n </label>\n <label className=\"space-y-1\">\n <span className=\"text-sm font-medium\">Sort Order</span>\n <NumberInput\n integer\n value={form.sortOrder === '' ? null : Number(form.sortOrder)}\n onChange={(n) => setForm({ ...form, sortOrder: n == null ? '' : String(n) })}\n />\n </label>\n <label className=\"space-y-1\">\n <span className=\"text-sm font-medium\">Description</span>\n <input className=\"w-full rounded-md border px-3 py-2 text-sm\" placeholder=\"Optional\" value={form.description} onChange={(e) => setForm({ ...form, description: e.target.value })} />\n </label>\n <label className=\"space-y-1\">\n <span className=\"text-sm font-medium\">Charge Type Filter</span>\n <select className=\"w-full rounded-md border px-3 py-2 text-sm\" value={form.chargeTypeFilter} onChange={(e) => setForm({ ...form, chargeTypeFilter: e.target.value })}>\n <option value=\"\">All charge types</option>\n <option value=\"nrc\">NRC only</option>\n <option value=\"mrc\">MRC only</option>\n <option value=\"usage\">Usage only</option>\n </select>\n </label>\n <label className=\"space-y-1\">\n <span className=\"text-sm font-medium\">Charge Code Filter</span>\n <input className=\"w-full rounded-md border px-3 py-2 text-sm\" placeholder=\"e.g. setup_fee (leave empty for all)\" value={form.chargeCodeFilter} onChange={(e) => setForm({ ...form, chargeCodeFilter: e.target.value })} />\n </label>\n <label className=\"space-y-1 col-span-2\">\n <span className=\"text-sm font-medium\">Product Offering</span>\n <select className=\"w-full rounded-md border px-3 py-2 text-sm\" value={form.productOfferingId} onChange={(e) => setForm({ ...form, productOfferingId: e.target.value })}>\n <option value=\"\">Global (all products)</option>\n {offerings.map((o) => <option key={o.id} value={o.id}>{o.name} ({o.code})</option>)}\n </select>\n </label>\n <div className=\"col-span-2 space-y-1\">\n <span className=\"text-sm font-medium\">Applicability Condition</span>\n <span className=\"ml-2 text-xs text-muted-foreground\">(optional)</span>\n <div className=\"grid grid-cols-3 gap-2\">\n <input className=\"w-full rounded-md border px-3 py-2 text-sm\" placeholder=\"Attribute (e.g. port_size)\" value={form.conditionAttribute} onChange={(e) => setForm({ ...form, conditionAttribute: e.target.value })} />\n <select className=\"w-full rounded-md border px-3 py-2 text-sm\" value={form.conditionOperator} onChange={(e) => setForm({ ...form, conditionOperator: e.target.value })}>\n <option value=\"eq\">equals (=)</option>\n <option value=\"neq\">not equals (≠)</option>\n </select>\n <input className=\"w-full rounded-md border px-3 py-2 text-sm\" placeholder=\"Value\" value={form.conditionValue} onChange={(e) => setForm({ ...form, conditionValue: e.target.value })} />\n </div>\n </div>\n </div>\n <label className=\"flex items-center gap-2 text-sm\">\n <input type=\"checkbox\" checked={form.isActive} onChange={(e) => setForm({ ...form, isActive: e.target.checked })} />\n Active\n </label>\n <div className=\"flex gap-2\">\n <button onClick={handleSave} disabled={saving} className=\"rounded-md bg-primary px-4 py-2 text-sm font-medium text-primary-foreground hover:bg-primary/90 disabled:opacity-50\">\n {saving ? 'Saving...' : 'Save Changes'}\n </button>\n <button onClick={cancelEdit} className=\"rounded-md border px-4 py-2 text-sm font-medium hover:bg-muted/50\">\n Cancel\n </button>\n </div>\n </div>\n ) : (\n /* Read-only view */\n <div className=\"grid grid-cols-1 lg:grid-cols-2 gap-6\">\n {/* Main info */}\n <div className=\"rounded-lg border bg-card p-6 space-y-4\">\n <h2 className=\"text-sm font-semibold text-muted-foreground uppercase tracking-wider\">Rule Configuration</h2>\n <dl className=\"space-y-3\">\n <div className=\"flex justify-between\">\n <dt className=\"text-sm text-muted-foreground\">Code</dt>\n <dd className=\"text-sm font-mono\">{rule.code}</dd>\n </div>\n <div className=\"flex justify-between border-t pt-3\">\n <dt className=\"text-sm text-muted-foreground\">Rule Type</dt>\n <dd className=\"text-sm font-medium\">{RULE_TYPE_LABELS[rule.ruleType] ?? rule.ruleType}</dd>\n </div>\n <div className=\"flex justify-between border-t pt-3\">\n <dt className=\"text-sm text-muted-foreground\">Value</dt>\n <dd className=\"text-sm font-mono font-medium\">\n {rule.ruleType.includes('percent') ? `${rule.value}%` : rule.ruleType === 'price_override' ? `= $${rule.value}` : `$${rule.value}`}\n </dd>\n </div>\n <div className=\"flex justify-between border-t pt-3\">\n <dt className=\"text-sm text-muted-foreground\">Sort Order</dt>\n <dd className=\"text-sm font-mono\">{rule.sortOrder}</dd>\n </div>\n {rule.description && (\n <div className=\"border-t pt-3\">\n <dt className=\"text-sm text-muted-foreground mb-1\">Description</dt>\n <dd className=\"text-sm\">{rule.description}</dd>\n </div>\n )}\n </dl>\n </div>\n\n {/* Scope & Filters */}\n <div className=\"rounded-lg border bg-card p-6 space-y-4\">\n <h2 className=\"text-sm font-semibold text-muted-foreground uppercase tracking-wider\">Scope & Filters</h2>\n <dl className=\"space-y-3\">\n <div className=\"flex justify-between\">\n <dt className=\"text-sm text-muted-foreground\">Scope</dt>\n <dd className=\"text-sm\">\n {offering ? (\n <span className=\"inline-flex items-center gap-1.5\">\n <span className=\"inline-block w-2 h-2 rounded-full bg-status-info-icon\" />\n {offering.name}\n <span className=\"text-muted-foreground font-mono text-xs\">({offering.code})</span>\n </span>\n ) : (\n <span className=\"inline-flex items-center gap-1.5\">\n <span className=\"inline-block w-2 h-2 rounded-full bg-muted-foreground\" />\n Global (all offerings)\n </span>\n )}\n </dd>\n </div>\n <div className=\"flex justify-between border-t pt-3\">\n <dt className=\"text-sm text-muted-foreground\">Charge Type</dt>\n <dd className=\"text-sm\">{rule.chargeTypeFilter ? rule.chargeTypeFilter.toUpperCase() : 'All types'}</dd>\n </div>\n <div className=\"flex justify-between border-t pt-3\">\n <dt className=\"text-sm text-muted-foreground\">Charge Code</dt>\n <dd className=\"text-sm font-mono\">{rule.chargeCodeFilter ?? 'All charges'}</dd>\n </div>\n <div className=\"border-t pt-3\">\n <dt className=\"text-sm text-muted-foreground mb-1\">Applicability Condition</dt>\n <dd className=\"text-sm\">\n {cond?.attribute ? (\n <code className=\"rounded bg-muted px-2 py-0.5 text-xs\">\n {cond.attribute} {cond.operator === 'neq' ? '\u2260' : '='} {cond.value ?? '\"\"'}\n </code>\n ) : (\n <span className=\"text-muted-foreground\">No condition (always applies)</span>\n )}\n </dd>\n </div>\n </dl>\n </div>\n\n {/* Metadata */}\n <div className=\"rounded-lg border bg-card p-6 space-y-4 lg:col-span-2\">\n <h2 className=\"text-sm font-semibold text-muted-foreground uppercase tracking-wider\">Metadata</h2>\n <dl className=\"flex gap-8 text-sm\">\n <div>\n <dt className=\"text-muted-foreground\">Created</dt>\n <dd>{new Date(rule.createdAt).toLocaleString()}</dd>\n </div>\n <div>\n <dt className=\"text-muted-foreground\">Updated</dt>\n <dd>{new Date(rule.updatedAt).toLocaleString()}</dd>\n </div>\n <div>\n <dt className=\"text-muted-foreground\">ID</dt>\n <dd className=\"font-mono text-xs\">{rule.id}</dd>\n </div>\n </dl>\n </div>\n </div>\n )}\n </div>\n )\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["\"use client\"\nimport * as React from 'react'\nimport { useRouter, useParams } from 'next/navigation'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { Tag } from '@open-mercato/ui/primitives/tag'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport { NumberInput } from '../../../../components/NumberInput'\nimport { buildRuleTypeLabels } from '../PriceRuleForm'\n\ntype PriceRule = {\n id: string\n code: string\n name: string\n description: string | null\n productOfferingId: string | null\n ruleType: string\n value: number\n chargeCodeFilter: string | null\n chargeTypeFilter: string | null\n applicabilityCondition: Record<string, unknown> | null\n sortOrder: number\n isActive: boolean\n createdAt: string\n updatedAt: string\n}\n\ntype ProductOffering = { id: string; code: string; name: string }\n\ntype FormData = {\n name: string\n description: string\n productOfferingId: string\n ruleType: string\n value: string\n chargeCodeFilter: string\n chargeTypeFilter: string\n conditionAttribute: string\n conditionOperator: string\n conditionValue: string\n sortOrder: string\n isActive: boolean\n}\n\nfunction ruleToForm(rule: PriceRule): FormData {\n const cond = rule.applicabilityCondition as { attribute?: string; operator?: string; value?: string } | null\n return {\n name: rule.name,\n description: rule.description ?? '',\n productOfferingId: rule.productOfferingId ?? '',\n ruleType: rule.ruleType,\n value: String(rule.value),\n chargeCodeFilter: rule.chargeCodeFilter ?? '',\n chargeTypeFilter: rule.chargeTypeFilter ?? '',\n conditionAttribute: cond?.attribute ?? '',\n conditionOperator: cond?.operator ?? 'eq',\n conditionValue: cond?.value ?? '',\n sortOrder: String(rule.sortOrder),\n isActive: rule.isActive,\n }\n}\n\nexport default function PriceRuleDetailPage(props: { params?: { id?: string } }) {\n const t = useT()\n const ruleTypeLabels = React.useMemo(() => buildRuleTypeLabels(t), [t])\n const router = useRouter()\n const urlParams = useParams()\n const ruleId = (props.params?.id ?? urlParams?.id) as string\n\n const [rule, setRule] = React.useState<PriceRule | null>(null)\n const [loading, setLoading] = React.useState(true)\n const [error, setError] = React.useState<string | null>(null)\n\n const [editing, setEditing] = React.useState(false)\n const [form, setForm] = React.useState<FormData | null>(null)\n const [saving, setSaving] = React.useState(false)\n const [saveError, setSaveError] = React.useState<string | null>(null)\n\n const [deleting, setDeleting] = React.useState(false)\n const [showDeleteConfirm, setShowDeleteConfirm] = React.useState(false)\n\n const [offerings, setOfferings] = React.useState<ProductOffering[]>([])\n\n React.useEffect(() => {\n fetch('/api/cpq/product-offerings?pageSize=100')\n .then((r) => r.json())\n .then((data) => setOfferings(data.items ?? []))\n .catch(() => {})\n }, [])\n\n const offeringLookup = React.useMemo(() => {\n const map = new Map<string, ProductOffering>()\n for (const o of offerings) map.set(o.id, o)\n return map\n }, [offerings])\n\n const loadRule = React.useCallback(() => {\n setLoading(true)\n setError(null)\n fetch(`/api/cpq/price-rules?id=${ruleId}`)\n .then(async (r) => {\n if (!r.ok) throw new Error(t('cpq.priceRules.detail.notFound', 'Not found'))\n return r.json()\n })\n .then((data: PriceRule) => {\n setRule(data)\n })\n .catch((err) => setError(err.message))\n .finally(() => setLoading(false))\n }, [ruleId, t])\n\n React.useEffect(() => { loadRule() }, [loadRule])\n\n function startEdit() {\n if (!rule) return\n setForm(ruleToForm(rule))\n setSaveError(null)\n setEditing(true)\n }\n\n function cancelEdit() {\n setEditing(false)\n setForm(null)\n setSaveError(null)\n }\n\n async function handleSave() {\n if (!form || !rule) return\n setSaving(true)\n setSaveError(null)\n try {\n const payload: Record<string, unknown> = {\n id: rule.id,\n name: form.name,\n ruleType: form.ruleType,\n value: Number(form.value),\n sortOrder: Number(form.sortOrder),\n isActive: form.isActive,\n productOfferingId: form.productOfferingId || null,\n }\n if (form.description) payload.description = form.description\n else payload.description = null\n if (form.chargeCodeFilter) payload.chargeCodeFilter = form.chargeCodeFilter\n else payload.chargeCodeFilter = null\n if (form.chargeTypeFilter) payload.chargeTypeFilter = form.chargeTypeFilter\n else payload.chargeTypeFilter = null\n if (form.conditionAttribute) {\n payload.applicabilityCondition = {\n attribute: form.conditionAttribute,\n operator: form.conditionOperator || 'eq',\n value: form.conditionValue,\n }\n } else {\n payload.applicabilityCondition = null\n }\n\n const res = await fetch('/api/cpq/price-rules', {\n method: 'PUT',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(payload),\n })\n if (!res.ok) {\n const err = await res.json()\n throw new Error(err.error ?? t('cpq.priceRules.errors.updateFailed', 'Failed to update'))\n }\n const updated = await res.json()\n setRule(updated)\n setEditing(false)\n setForm(null)\n } catch (err: unknown) {\n setSaveError(err instanceof Error ? err.message : t('cpq.priceRules.errors.unknown', 'Unknown error'))\n } finally {\n setSaving(false)\n }\n }\n\n async function handleDelete() {\n setDeleting(true)\n try {\n await fetch('/api/cpq/price-rules', {\n method: 'DELETE',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ id: ruleId }),\n })\n router.push('/backend/cpq/price-rules')\n } catch {\n setDeleting(false)\n }\n }\n\n async function handleToggleActive() {\n if (!rule) return\n const res = await fetch('/api/cpq/price-rules', {\n method: 'PUT',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ id: rule.id, isActive: !rule.isActive }),\n })\n if (res.ok) {\n const updated = await res.json()\n setRule(updated)\n }\n }\n\n if (loading) {\n return <div className=\"text-sm text-muted-foreground py-12 text-center\">{t('cpq.common.loading', 'Loading...')}</div>\n }\n\n if (error || !rule) {\n return (\n <div className=\"space-y-4 py-12 text-center\">\n <div className=\"text-sm text-destructive\">{error ?? t('cpq.priceRules.detail.ruleNotFound', 'Rule not found')}</div>\n <button\n onClick={() => router.push('/backend/cpq/price-rules')}\n className=\"text-sm text-primary hover:underline\"\n >\n \u2190 {t('cpq.priceRules.detail.backToList', 'Back to Price Rules')}\n </button>\n </div>\n )\n }\n\n const cond = rule.applicabilityCondition as { attribute?: string; operator?: string; value?: string } | null\n const offering = rule.productOfferingId ? offeringLookup.get(rule.productOfferingId) : null\n // `{name}` is left unresolved so the rule name can be rendered in <strong>.\n const deleteConfirmParts = t('cpq.priceRules.detail.deleteConfirm', 'Are you sure you want to delete {name}?').split('{name}')\n\n return (\n <div className=\"space-y-6\">\n {/* Header */}\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-3\">\n <button\n onClick={() => router.push('/backend/cpq/price-rules')}\n className=\"text-sm text-muted-foreground hover:text-foreground transition-colors\"\n >\n \u2190 {t('cpq.common.back', 'Back')}\n </button>\n <h1 className=\"text-2xl font-bold\">{rule.name}</h1>\n <Tag variant={rule.isActive ? 'success' : 'neutral'} dot>\n {rule.isActive ? t('cpq.common.active', 'Active') : t('cpq.common.inactive', 'Inactive')}\n </Tag>\n </div>\n <div className=\"flex items-center gap-2\">\n <Button type=\"button\" variant=\"outline\" onClick={handleToggleActive}>\n {rule.isActive\n ? t('cpq.priceRules.detail.deactivate', 'Deactivate')\n : t('cpq.priceRules.detail.activate', 'Activate')}\n </Button>\n {!editing && (\n <button\n onClick={startEdit}\n className=\"rounded-md bg-primary px-4 py-1.5 text-sm font-medium text-primary-foreground hover:bg-primary/90\"\n >\n {t('cpq.common.edit', 'Edit')}\n </button>\n )}\n <button\n onClick={() => setShowDeleteConfirm(true)}\n className=\"rounded-md border border-destructive/30 px-3 py-1.5 text-sm font-medium text-destructive hover:bg-destructive/10 transition-colors\"\n >\n {t('cpq.common.delete', 'Delete')}\n </button>\n </div>\n </div>\n\n {/* Delete confirmation */}\n {showDeleteConfirm && (\n <div className=\"rounded-lg border border-destructive/30 bg-destructive/5 p-4 flex items-center justify-between\">\n <span className=\"text-sm\">\n {deleteConfirmParts[0]}\n <strong>{rule.name}</strong>\n {deleteConfirmParts[1]}\n </span>\n <div className=\"flex gap-2\">\n <button\n onClick={handleDelete}\n disabled={deleting}\n className=\"rounded-md bg-destructive px-3 py-1.5 text-sm font-medium text-destructive-foreground hover:bg-destructive/90 disabled:opacity-50\"\n >\n {deleting\n ? t('cpq.priceRules.detail.deleting', 'Deleting...')\n : t('cpq.priceRules.detail.confirmDelete', 'Yes, Delete')}\n </button>\n <button\n onClick={() => setShowDeleteConfirm(false)}\n className=\"rounded-md border px-3 py-1.5 text-sm font-medium hover:bg-muted/50\"\n >\n {t('cpq.common.cancel', 'Cancel')}\n </button>\n </div>\n </div>\n )}\n\n {/* Edit mode */}\n {editing && form ? (\n <div className=\"rounded-lg border bg-card p-6 space-y-4\">\n <h2 className=\"text-lg font-semibold\">{t('cpq.priceRules.form.editTitle', 'Edit Rule')}</h2>\n {saveError && <div className=\"rounded-md bg-destructive/10 p-3 text-sm text-destructive\">{saveError}</div>}\n <div className=\"grid grid-cols-2 gap-4\">\n <label className=\"space-y-1\">\n <span className=\"text-sm font-medium\">{t('cpq.priceRules.form.code', 'Code')}</span>\n <input className=\"w-full rounded-md border bg-muted/30 px-3 py-2 text-sm\" value={rule.code} disabled />\n </label>\n <label className=\"space-y-1\">\n <span className=\"text-sm font-medium\">{t('cpq.priceRules.form.name', 'Name')}</span>\n <input className=\"w-full rounded-md border px-3 py-2 text-sm\" value={form.name} onChange={(e) => setForm({ ...form, name: e.target.value })} />\n </label>\n <label className=\"space-y-1\">\n <span className=\"text-sm font-medium\">{t('cpq.priceRules.form.ruleType', 'Rule Type')}</span>\n <select className=\"w-full rounded-md border px-3 py-2 text-sm\" value={form.ruleType} onChange={(e) => setForm({ ...form, ruleType: e.target.value })}>\n {Object.entries(ruleTypeLabels).map(([k, v]) => <option key={k} value={k}>{v}</option>)}\n </select>\n </label>\n <label className=\"space-y-1\">\n <span className=\"text-sm font-medium\">{t('cpq.priceRules.form.value', 'Value')}</span>\n <NumberInput\n value={form.value === '' ? null : Number(form.value)}\n onChange={(n) => setForm({ ...form, value: n == null ? '' : String(n) })}\n />\n </label>\n <label className=\"space-y-1\">\n <span className=\"text-sm font-medium\">{t('cpq.priceRules.form.sortOrder', 'Sort Order')}</span>\n <NumberInput\n integer\n value={form.sortOrder === '' ? null : Number(form.sortOrder)}\n onChange={(n) => setForm({ ...form, sortOrder: n == null ? '' : String(n) })}\n />\n </label>\n <label className=\"space-y-1\">\n <span className=\"text-sm font-medium\">{t('cpq.priceRules.form.description', 'Description')}</span>\n <input className=\"w-full rounded-md border px-3 py-2 text-sm\" placeholder={t('cpq.priceRules.form.descriptionPlaceholder', 'Optional')} value={form.description} onChange={(e) => setForm({ ...form, description: e.target.value })} />\n </label>\n <label className=\"space-y-1\">\n <span className=\"text-sm font-medium\">{t('cpq.priceRules.form.chargeTypeFilter', 'Charge Type Filter')}</span>\n <select className=\"w-full rounded-md border px-3 py-2 text-sm\" value={form.chargeTypeFilter} onChange={(e) => setForm({ ...form, chargeTypeFilter: e.target.value })}>\n <option value=\"\">{t('cpq.priceRules.form.allChargeTypes', 'All charge types')}</option>\n <option value=\"nrc\">{t('cpq.priceRules.form.nrcOnly', 'NRC only')}</option>\n <option value=\"mrc\">{t('cpq.priceRules.form.mrcOnly', 'MRC only')}</option>\n <option value=\"usage\">{t('cpq.priceRules.form.usageOnly', 'Usage only')}</option>\n </select>\n </label>\n <label className=\"space-y-1\">\n <span className=\"text-sm font-medium\">{t('cpq.priceRules.form.chargeCodeFilter', 'Charge Code Filter')}</span>\n <input className=\"w-full rounded-md border px-3 py-2 text-sm\" placeholder={t('cpq.priceRules.form.chargeCodeFilterPlaceholder', 'e.g. setup_fee (leave empty for all)')} value={form.chargeCodeFilter} onChange={(e) => setForm({ ...form, chargeCodeFilter: e.target.value })} />\n </label>\n <label className=\"space-y-1 col-span-2\">\n <span className=\"text-sm font-medium\">{t('cpq.priceRules.form.productOffering', 'Product Offering')}</span>\n <select className=\"w-full rounded-md border px-3 py-2 text-sm\" value={form.productOfferingId} onChange={(e) => setForm({ ...form, productOfferingId: e.target.value })}>\n <option value=\"\">{t('cpq.priceRules.form.globalAllProducts', 'Global (all products)')}</option>\n {offerings.map((o) => <option key={o.id} value={o.id}>{o.name} ({o.code})</option>)}\n </select>\n </label>\n <div className=\"col-span-2 space-y-1\">\n <span className=\"text-sm font-medium\">{t('cpq.priceRules.form.applicabilityCondition', 'Applicability Condition')}</span>\n <span className=\"ml-2 text-xs text-muted-foreground\">{t('cpq.priceRules.form.optionalHint', '(optional)')}</span>\n <div className=\"grid grid-cols-3 gap-2\">\n <input className=\"w-full rounded-md border px-3 py-2 text-sm\" placeholder={t('cpq.priceRules.form.conditionAttributePlaceholder', 'Attribute (e.g. port_size)')} value={form.conditionAttribute} onChange={(e) => setForm({ ...form, conditionAttribute: e.target.value })} />\n <select className=\"w-full rounded-md border px-3 py-2 text-sm\" value={form.conditionOperator} onChange={(e) => setForm({ ...form, conditionOperator: e.target.value })}>\n <option value=\"eq\">{t('cpq.priceRules.form.operatorEq', 'equals (=)')}</option>\n <option value=\"neq\">{t('cpq.priceRules.form.operatorNeq', 'not equals (\u2260)')}</option>\n </select>\n <input className=\"w-full rounded-md border px-3 py-2 text-sm\" placeholder={t('cpq.priceRules.form.conditionValuePlaceholderShort', 'Value')} value={form.conditionValue} onChange={(e) => setForm({ ...form, conditionValue: e.target.value })} />\n </div>\n </div>\n </div>\n <label className=\"flex items-center gap-2 text-sm\">\n <input type=\"checkbox\" checked={form.isActive} onChange={(e) => setForm({ ...form, isActive: e.target.checked })} />\n {t('cpq.common.active', 'Active')}\n </label>\n <div className=\"flex gap-2\">\n <button onClick={handleSave} disabled={saving} className=\"rounded-md bg-primary px-4 py-2 text-sm font-medium text-primary-foreground hover:bg-primary/90 disabled:opacity-50\">\n {saving ? t('cpq.common.saving', 'Saving...') : t('cpq.priceRules.detail.saveChanges', 'Save Changes')}\n </button>\n <button onClick={cancelEdit} className=\"rounded-md border px-4 py-2 text-sm font-medium hover:bg-muted/50\">\n {t('cpq.common.cancel', 'Cancel')}\n </button>\n </div>\n </div>\n ) : (\n /* Read-only view */\n <div className=\"grid grid-cols-1 lg:grid-cols-2 gap-6\">\n {/* Main info */}\n <div className=\"rounded-lg border bg-card p-6 space-y-4\">\n <h2 className=\"text-sm font-semibold text-muted-foreground uppercase tracking-wider\">{t('cpq.priceRules.detail.ruleConfiguration', 'Rule Configuration')}</h2>\n <dl className=\"space-y-3\">\n <div className=\"flex justify-between\">\n <dt className=\"text-sm text-muted-foreground\">{t('cpq.priceRules.detail.code', 'Code')}</dt>\n <dd className=\"text-sm font-mono\">{rule.code}</dd>\n </div>\n <div className=\"flex justify-between border-t pt-3\">\n <dt className=\"text-sm text-muted-foreground\">{t('cpq.priceRules.detail.ruleType', 'Rule Type')}</dt>\n <dd className=\"text-sm font-medium\">{ruleTypeLabels[rule.ruleType] ?? rule.ruleType}</dd>\n </div>\n <div className=\"flex justify-between border-t pt-3\">\n <dt className=\"text-sm text-muted-foreground\">{t('cpq.priceRules.detail.value', 'Value')}</dt>\n <dd className=\"text-sm font-mono font-medium\">\n {rule.ruleType.includes('percent') ? `${rule.value}%` : rule.ruleType === 'price_override' ? `= $${rule.value}` : `$${rule.value}`}\n </dd>\n </div>\n <div className=\"flex justify-between border-t pt-3\">\n <dt className=\"text-sm text-muted-foreground\">{t('cpq.priceRules.detail.sortOrder', 'Sort Order')}</dt>\n <dd className=\"text-sm font-mono\">{rule.sortOrder}</dd>\n </div>\n {rule.description && (\n <div className=\"border-t pt-3\">\n <dt className=\"text-sm text-muted-foreground mb-1\">{t('cpq.priceRules.detail.description', 'Description')}</dt>\n <dd className=\"text-sm\">{rule.description}</dd>\n </div>\n )}\n </dl>\n </div>\n\n {/* Scope & Filters */}\n <div className=\"rounded-lg border bg-card p-6 space-y-4\">\n <h2 className=\"text-sm font-semibold text-muted-foreground uppercase tracking-wider\">{t('cpq.priceRules.detail.scopeAndFilters', 'Scope & Filters')}</h2>\n <dl className=\"space-y-3\">\n <div className=\"flex justify-between\">\n <dt className=\"text-sm text-muted-foreground\">{t('cpq.priceRules.detail.scope', 'Scope')}</dt>\n <dd className=\"text-sm\">\n {offering ? (\n <span className=\"inline-flex items-center gap-1.5\">\n <span className=\"inline-block w-2 h-2 rounded-full bg-status-info-icon\" />\n {offering.name}\n <span className=\"text-muted-foreground font-mono text-xs\">({offering.code})</span>\n </span>\n ) : (\n <span className=\"inline-flex items-center gap-1.5\">\n <span className=\"inline-block w-2 h-2 rounded-full bg-muted-foreground\" />\n {t('cpq.priceRules.detail.globalAllOfferings', 'Global (all offerings)')}\n </span>\n )}\n </dd>\n </div>\n <div className=\"flex justify-between border-t pt-3\">\n <dt className=\"text-sm text-muted-foreground\">{t('cpq.priceRules.detail.chargeType', 'Charge Type')}</dt>\n <dd className=\"text-sm\">{rule.chargeTypeFilter ? rule.chargeTypeFilter.toUpperCase() : t('cpq.priceRules.detail.allTypes', 'All types')}</dd>\n </div>\n <div className=\"flex justify-between border-t pt-3\">\n <dt className=\"text-sm text-muted-foreground\">{t('cpq.priceRules.detail.chargeCode', 'Charge Code')}</dt>\n <dd className=\"text-sm font-mono\">{rule.chargeCodeFilter ?? t('cpq.priceRules.detail.allCharges', 'All charges')}</dd>\n </div>\n <div className=\"border-t pt-3\">\n <dt className=\"text-sm text-muted-foreground mb-1\">{t('cpq.priceRules.detail.applicabilityCondition', 'Applicability Condition')}</dt>\n <dd className=\"text-sm\">\n {cond?.attribute ? (\n <code className=\"rounded bg-muted px-2 py-0.5 text-xs\">\n {cond.attribute} {cond.operator === 'neq' ? '\u2260' : '='} {cond.value ?? '\"\"'}\n </code>\n ) : (\n <span className=\"text-muted-foreground\">{t('cpq.priceRules.detail.noCondition', 'No condition (always applies)')}</span>\n )}\n </dd>\n </div>\n </dl>\n </div>\n\n {/* Metadata */}\n <div className=\"rounded-lg border bg-card p-6 space-y-4 lg:col-span-2\">\n <h2 className=\"text-sm font-semibold text-muted-foreground uppercase tracking-wider\">{t('cpq.priceRules.detail.metadata', 'Metadata')}</h2>\n <dl className=\"flex gap-8 text-sm\">\n <div>\n <dt className=\"text-muted-foreground\">{t('cpq.priceRules.detail.created', 'Created')}</dt>\n <dd>{new Date(rule.createdAt).toLocaleString()}</dd>\n </div>\n <div>\n <dt className=\"text-muted-foreground\">{t('cpq.priceRules.detail.updated', 'Updated')}</dt>\n <dd>{new Date(rule.updatedAt).toLocaleString()}</dd>\n </div>\n <div>\n <dt className=\"text-muted-foreground\">{t('cpq.priceRules.detail.id', 'ID')}</dt>\n <dd className=\"font-mono text-xs\">{rule.id}</dd>\n </div>\n </dl>\n </div>\n </div>\n )}\n </div>\n )\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -4,7 +4,7 @@ const metadata = {
|
|
|
4
4
|
navHidden: true,
|
|
5
5
|
breadcrumb: [
|
|
6
6
|
{ label: "Price Rules", labelKey: "cpq.priceRules.list.title", href: "/backend/cpq/price-rules" },
|
|
7
|
-
{ label: "Rule Detail" }
|
|
7
|
+
{ label: "Rule Detail", labelKey: "cpq.priceRules.detail.breadcrumb" }
|
|
8
8
|
]
|
|
9
9
|
};
|
|
10
10
|
export {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../../../src/modules/cpq/backend/cpq/price-rules/%5Bid%5D/page.meta.ts"],
|
|
4
|
-
"sourcesContent": ["export const metadata = {\n requireAuth: true,\n requireFeatures: ['cpq.pricing.view'],\n navHidden: true,\n breadcrumb: [\n { label: 'Price Rules', labelKey: 'cpq.priceRules.list.title', href: '/backend/cpq/price-rules' },\n { label: 'Rule Detail' },\n ],\n} as const\n"],
|
|
5
|
-
"mappings": "AAAO,MAAM,WAAW;AAAA,EACtB,aAAa;AAAA,EACb,iBAAiB,CAAC,kBAAkB;AAAA,EACpC,WAAW;AAAA,EACX,YAAY;AAAA,IACV,EAAE,OAAO,eAAe,UAAU,6BAA6B,MAAM,2BAA2B;AAAA,IAChG,EAAE,OAAO,
|
|
4
|
+
"sourcesContent": ["export const metadata = {\n requireAuth: true,\n requireFeatures: ['cpq.pricing.view'],\n navHidden: true,\n breadcrumb: [\n { label: 'Price Rules', labelKey: 'cpq.priceRules.list.title', href: '/backend/cpq/price-rules' },\n { label: 'Rule Detail', labelKey: 'cpq.priceRules.detail.breadcrumb' },\n ],\n} as const\n"],
|
|
5
|
+
"mappings": "AAAO,MAAM,WAAW;AAAA,EACtB,aAAa;AAAA,EACb,iBAAiB,CAAC,kBAAkB;AAAA,EACpC,WAAW;AAAA,EACX,YAAY;AAAA,IACV,EAAE,OAAO,eAAe,UAAU,6BAA6B,MAAM,2BAA2B;AAAA,IAChG,EAAE,OAAO,eAAe,UAAU,mCAAmC;AAAA,EACvE;AACF;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|