@burdenoff/microfe-billing 2026.614.1 → 2026.623.2
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/dist/billing/BillingAdminRoutes.js +7 -6
- package/dist/billing/BillingAdminRoutes.js.map +1 -1
- package/dist/billing/BillingRoot.js +1 -1
- package/dist/billing/BillingRoot.js.map +1 -1
- package/dist/billing/modules/addons/components/FloatingCartDrawer.js +22 -22
- package/dist/billing/modules/addons/components/FloatingCartDrawer.js.map +1 -1
- package/dist/billing/modules/addons/pages/AddonCreatePage.js +31 -31
- package/dist/billing/modules/addons/pages/AddonCreatePage.js.map +1 -1
- package/dist/billing/modules/addons/pages/AddonDetailPage.js +39 -39
- package/dist/billing/modules/addons/pages/AddonDetailPage.js.map +1 -1
- package/dist/billing/modules/addons/pages/AddonEditPage.js +29 -29
- package/dist/billing/modules/addons/pages/AddonEditPage.js.map +1 -1
- package/dist/billing/modules/addons/pages/AddonsListPage.js +91 -91
- package/dist/billing/modules/addons/pages/AddonsListPage.js.map +1 -1
- package/dist/billing/modules/analytics/pages/AnalyticsPage.js +40 -40
- package/dist/billing/modules/analytics/pages/AnalyticsPage.js.map +1 -1
- package/dist/billing/modules/billing/pages/InvoiceDetailPage.js +115 -115
- package/dist/billing/modules/billing/pages/InvoiceDetailPage.js.map +1 -1
- package/dist/billing/modules/billing/pages/InvoicesListPage.js +75 -72
- package/dist/billing/modules/billing/pages/InvoicesListPage.js.map +1 -1
- package/dist/billing/modules/billing/pages/RefundsPage.js +126 -126
- package/dist/billing/modules/billing/pages/RefundsPage.js.map +1 -1
- package/dist/billing/modules/billing/pages/UserRefundsPage.js +45 -45
- package/dist/billing/modules/billing/pages/UserRefundsPage.js.map +1 -1
- package/dist/billing/modules/checkout/components/BillingAccountSelector.js +25 -25
- package/dist/billing/modules/checkout/components/BillingAccountSelector.js.map +1 -1
- package/dist/billing/modules/checkout/components/CompleteBillingAccountModal.js +31 -35
- package/dist/billing/modules/checkout/components/CompleteBillingAccountModal.js.map +1 -1
- package/dist/billing/modules/checkout/components/CreditsAmountInput.js +9 -9
- package/dist/billing/modules/checkout/components/CreditsAmountInput.js.map +1 -1
- package/dist/billing/modules/checkout/components/OrderSummary.js +31 -31
- package/dist/billing/modules/checkout/components/OrderSummary.js.map +1 -1
- package/dist/billing/modules/checkout/components/PromoCodeInput.js +8 -8
- package/dist/billing/modules/checkout/components/PromoCodeInput.js.map +1 -1
- package/dist/billing/modules/checkout/components/RazorpayPaymentButton.js +5 -5
- package/dist/billing/modules/checkout/components/RazorpayPaymentButton.js.map +1 -1
- package/dist/billing/modules/checkout/components/SimpleAutoPayToggle.js +9 -9
- package/dist/billing/modules/checkout/components/SimpleAutoPayToggle.js.map +1 -1
- package/dist/billing/modules/checkout/components/StripePaymentForm.js +21 -21
- package/dist/billing/modules/checkout/components/StripePaymentForm.js.map +1 -1
- package/dist/billing/modules/checkout/components/SubscriptionSelector.js +11 -11
- package/dist/billing/modules/checkout/components/SubscriptionSelector.js.map +1 -1
- package/dist/billing/modules/checkout/components/UnifiedPaymentMethodSelector.js +31 -31
- package/dist/billing/modules/checkout/components/UnifiedPaymentMethodSelector.js.map +1 -1
- package/dist/billing/modules/checkout/components/WorkspaceQuotaAssignmentModal.js +23 -23
- package/dist/billing/modules/checkout/components/WorkspaceQuotaAssignmentModal.js.map +1 -1
- package/dist/billing/modules/checkout/pages/CheckoutPage.js +91 -91
- package/dist/billing/modules/checkout/pages/CheckoutPage.js.map +1 -1
- package/dist/billing/modules/coupons/pages/CouponDetailPage.js +62 -62
- package/dist/billing/modules/coupons/pages/CouponDetailPage.js.map +1 -1
- package/dist/billing/modules/coupons/pages/CouponsListPage.js +72 -60
- package/dist/billing/modules/coupons/pages/CouponsListPage.js.map +1 -1
- package/dist/billing/modules/coupons/pages/CreateCouponPage.js +66 -66
- package/dist/billing/modules/coupons/pages/CreateCouponPage.js.map +1 -1
- package/dist/billing/modules/coupons/pages/EditCouponPage.js +46 -46
- package/dist/billing/modules/coupons/pages/EditCouponPage.js.map +1 -1
- package/dist/billing/modules/credits/pages/AdminCreditsPage.js +19 -19
- package/dist/billing/modules/credits/pages/AdminCreditsPage.js.map +1 -1
- package/dist/billing/modules/credits/pages/CreditTransactionsPage.js +37 -37
- package/dist/billing/modules/credits/pages/CreditTransactionsPage.js.map +1 -1
- package/dist/billing/modules/credits/pages/CreditWithdrawalPage.js +90 -90
- package/dist/billing/modules/credits/pages/CreditWithdrawalPage.js.map +1 -1
- package/dist/billing/modules/credits/pages/CreditsPage.js +41 -41
- package/dist/billing/modules/credits/pages/CreditsPage.js.map +1 -1
- package/dist/billing/modules/dashboard/components/ActiveSubscriptionCard.js +31 -31
- package/dist/billing/modules/dashboard/components/ActiveSubscriptionCard.js.map +1 -1
- package/dist/billing/modules/dashboard/components/AddPaymentMethodModal.js +35 -35
- package/dist/billing/modules/dashboard/components/AddPaymentMethodModal.js.map +1 -1
- package/dist/billing/modules/dashboard/components/BillingAccountCard.js +24 -24
- package/dist/billing/modules/dashboard/components/BillingAccountCard.js.map +1 -1
- package/dist/billing/modules/dashboard/components/CreateBillingAccountModal.js +99 -99
- package/dist/billing/modules/dashboard/components/CreateBillingAccountModal.js.map +1 -1
- package/dist/billing/modules/dashboard/components/PaymentMethodsSection.js +23 -23
- package/dist/billing/modules/dashboard/components/PaymentMethodsSection.js.map +1 -1
- package/dist/billing/modules/dashboard/components/RecommendedAddonsSection.js +22 -22
- package/dist/billing/modules/dashboard/components/RecommendedAddonsSection.js.map +1 -1
- package/dist/billing/modules/dashboard/pages/OverviewPage.js +58 -58
- package/dist/billing/modules/dashboard/pages/OverviewPage.js.map +1 -1
- package/dist/billing/modules/discounts/pages/DiscountsListPage.js +126 -126
- package/dist/billing/modules/discounts/pages/DiscountsListPage.js.map +1 -1
- package/dist/billing/modules/earnings/pages/PayoutAdminPage.js +83 -79
- package/dist/billing/modules/earnings/pages/PayoutAdminPage.js.map +1 -1
- package/dist/billing/modules/plans/pages/PlanAssignFreePage.js +16 -16
- package/dist/billing/modules/plans/pages/PlanAssignFreePage.js.map +1 -1
- package/dist/billing/modules/plans/pages/PlanBrowseDetailPage.js +40 -40
- package/dist/billing/modules/plans/pages/PlanBrowseDetailPage.js.map +1 -1
- package/dist/billing/modules/plans/pages/PlanCreatePage.js +35 -35
- package/dist/billing/modules/plans/pages/PlanCreatePage.js.map +1 -1
- package/dist/billing/modules/plans/pages/PlanDetailPage.js +57 -57
- package/dist/billing/modules/plans/pages/PlanDetailPage.js.map +1 -1
- package/dist/billing/modules/plans/pages/PlanEditPage.js +35 -35
- package/dist/billing/modules/plans/pages/PlanEditPage.js.map +1 -1
- package/dist/billing/modules/plans/pages/PlansBrowsePage.js +57 -57
- package/dist/billing/modules/plans/pages/PlansBrowsePage.js.map +1 -1
- package/dist/billing/modules/plans/pages/PlansListPage.js +52 -52
- package/dist/billing/modules/plans/pages/PlansListPage.js.map +1 -1
- package/dist/billing/modules/promotions/pages/CreatePromotionPage.js +40 -39
- package/dist/billing/modules/promotions/pages/CreatePromotionPage.js.map +1 -1
- package/dist/billing/modules/promotions/pages/PromotionsListPage.js +22 -19
- package/dist/billing/modules/promotions/pages/PromotionsListPage.js.map +1 -1
- package/dist/billing/modules/quota/pages/QuotaTemplateCreatePage.js +34 -34
- package/dist/billing/modules/quota/pages/QuotaTemplateCreatePage.js.map +1 -1
- package/dist/billing/modules/quota/pages/QuotaTemplateDetailPage.js +47 -47
- package/dist/billing/modules/quota/pages/QuotaTemplateDetailPage.js.map +1 -1
- package/dist/billing/modules/quota/pages/QuotaTemplateEditPage.js +39 -39
- package/dist/billing/modules/quota/pages/QuotaTemplateEditPage.js.map +1 -1
- package/dist/billing/modules/quota/pages/QuotaTemplatesListPage.js +52 -52
- package/dist/billing/modules/quota/pages/QuotaTemplatesListPage.js.map +1 -1
- package/dist/billing/modules/subscriptions/components/ManageSeatsModal.js +23 -23
- package/dist/billing/modules/subscriptions/components/ManageSeatsModal.js.map +1 -1
- package/dist/billing/modules/subscriptions/pages/SubscriptionDetailPage.js +259 -246
- package/dist/billing/modules/subscriptions/pages/SubscriptionDetailPage.js.map +1 -1
- package/dist/billing/modules/subscriptions/pages/SubscriptionsListPage.js +88 -85
- package/dist/billing/modules/subscriptions/pages/SubscriptionsListPage.js.map +1 -1
- package/dist/billing/modules/subscriptions/pages/UpgradeSubscriptionPage.js +51 -51
- package/dist/billing/modules/subscriptions/pages/UpgradeSubscriptionPage.js.map +1 -1
- package/dist/billing/modules/usage/pages/UsagePage.js +206 -196
- package/dist/billing/modules/usage/pages/UsagePage.js.map +1 -1
- package/dist/billing/shared/components/ServerError.js +4 -4
- package/dist/billing/shared/components/ServerError.js.map +1 -1
- package/dist/billing/shared/components/StatCard.js +11 -33
- package/dist/billing/shared/components/StatCard.js.map +1 -1
- package/dist/billing/shared/ui/Card.js +15 -0
- package/dist/billing/shared/ui/Card.js.map +1 -0
- package/dist/billing/shared/ui/MetricCard.js +44 -0
- package/dist/billing/shared/ui/MetricCard.js.map +1 -0
- package/dist/billing/shared/ui/ProgressBar.js +30 -0
- package/dist/billing/shared/ui/ProgressBar.js.map +1 -0
- package/dist/billing/shared/ui/SectionHeader.js +2 -0
- package/dist/billing/shared/ui/StatusPill.js +28 -0
- package/dist/billing/shared/ui/StatusPill.js.map +1 -0
- package/dist/billing/shared/ui/index.js +5 -0
- package/dist/billing/shared/utils/tokens.js +13 -30
- package/dist/billing/shared/utils/tokens.js.map +1 -1
- package/package.json +1 -1
|
@@ -18,7 +18,7 @@ function C({ status: e }) {
|
|
|
18
18
|
},
|
|
19
19
|
[o.Inactive]: {
|
|
20
20
|
label: "Inactive",
|
|
21
|
-
className: "bg-
|
|
21
|
+
className: "bg-bg-sunken text-text-muted border-border-subtle"
|
|
22
22
|
},
|
|
23
23
|
[o.Expired]: {
|
|
24
24
|
label: "Expired",
|
|
@@ -26,11 +26,11 @@ function C({ status: e }) {
|
|
|
26
26
|
},
|
|
27
27
|
[o.Depleted]: {
|
|
28
28
|
label: "Depleted",
|
|
29
|
-
className: "bg-
|
|
29
|
+
className: "bg-status-error-bg-subtle text-status-error-text border-status-error-border"
|
|
30
30
|
}
|
|
31
31
|
}[e] ?? {
|
|
32
32
|
label: e,
|
|
33
|
-
className: "bg-
|
|
33
|
+
className: "bg-bg-sunken text-text-muted"
|
|
34
34
|
};
|
|
35
35
|
return /* @__PURE__ */ b("span", {
|
|
36
36
|
className: `inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium border ${n}`,
|
|
@@ -39,12 +39,12 @@ function C({ status: e }) {
|
|
|
39
39
|
}
|
|
40
40
|
function w({ label: e, value: t }) {
|
|
41
41
|
return /* @__PURE__ */ x("div", {
|
|
42
|
-
className: "flex items-start gap-2 py-3 border-b border-border last:border-0",
|
|
42
|
+
className: "flex items-start gap-2 py-3 border-b border-border-subtle last:border-0",
|
|
43
43
|
children: [/* @__PURE__ */ b("span", {
|
|
44
|
-
className: "text-sm text-muted
|
|
44
|
+
className: "text-sm text-text-muted w-44 shrink-0",
|
|
45
45
|
children: e
|
|
46
46
|
}), /* @__PURE__ */ b("span", {
|
|
47
|
-
className: "text-sm text-
|
|
47
|
+
className: "text-sm text-text-primary font-medium flex-1",
|
|
48
48
|
children: t ?? "—"
|
|
49
49
|
})]
|
|
50
50
|
});
|
|
@@ -72,12 +72,12 @@ var T = () => {
|
|
|
72
72
|
actions: /* @__PURE__ */ x("button", {
|
|
73
73
|
type: "button",
|
|
74
74
|
onClick: () => E("/coupons"),
|
|
75
|
-
className: "px-4 py-2 rounded-lg border border-border text-
|
|
75
|
+
className: "px-4 py-2 rounded-lg border border-border-subtle text-text-primary hover:bg-bg-sunken flex items-center gap-2",
|
|
76
76
|
children: [/* @__PURE__ */ b(l, { className: "size-4" }), "Back"]
|
|
77
77
|
})
|
|
78
78
|
}), /* @__PURE__ */ b("div", {
|
|
79
79
|
className: "flex items-center justify-center h-64",
|
|
80
|
-
children: /* @__PURE__ */ b("div", { className: "size-8 animate-spin rounded-full border-4 border-primary border-t-transparent" })
|
|
80
|
+
children: /* @__PURE__ */ b("div", { className: "size-8 animate-spin rounded-full border-4 border-action-primary-bg border-t-transparent" })
|
|
81
81
|
})]
|
|
82
82
|
});
|
|
83
83
|
if (I || !P?.getCoupon) return /* @__PURE__ */ x("div", {
|
|
@@ -88,11 +88,11 @@ var T = () => {
|
|
|
88
88
|
actions: /* @__PURE__ */ x("button", {
|
|
89
89
|
type: "button",
|
|
90
90
|
onClick: () => E("/coupons"),
|
|
91
|
-
className: "px-4 py-2 rounded-lg border border-border text-
|
|
91
|
+
className: "px-4 py-2 rounded-lg border border-border-subtle text-text-primary hover:bg-bg-sunken flex items-center gap-2",
|
|
92
92
|
children: [/* @__PURE__ */ b(l, { className: "size-4" }), "Back"]
|
|
93
93
|
})
|
|
94
94
|
}), /* @__PURE__ */ b("div", {
|
|
95
|
-
className: "flex items-center justify-center h-64 text-
|
|
95
|
+
className: "flex items-center justify-center h-64 text-status-error-text text-sm",
|
|
96
96
|
children: I ? `Error: ${I.message}` : "Coupon not found"
|
|
97
97
|
})]
|
|
98
98
|
});
|
|
@@ -112,90 +112,90 @@ var T = () => {
|
|
|
112
112
|
children: [/* @__PURE__ */ x("button", {
|
|
113
113
|
type: "button",
|
|
114
114
|
onClick: () => E("/coupons"),
|
|
115
|
-
className: "px-4 py-2 rounded-lg border border-border text-
|
|
115
|
+
className: "px-4 py-2 rounded-lg border border-border-subtle text-text-primary hover:bg-bg-sunken flex items-center gap-2",
|
|
116
116
|
children: [/* @__PURE__ */ b(l, { className: "size-4" }), "Back"]
|
|
117
117
|
}), /* @__PURE__ */ x("button", {
|
|
118
118
|
type: "button",
|
|
119
119
|
onClick: () => E(`/coupons/${z.id}/edit`),
|
|
120
|
-
className: "px-4 py-2 rounded-lg bg-primary text-primary-
|
|
120
|
+
className: "px-4 py-2 rounded-lg bg-action-primary-bg text-action-primary-text hover:bg-action-primary-bgHover flex items-center gap-2",
|
|
121
121
|
children: [/* @__PURE__ */ b(m, { className: "size-4" }), "Edit"]
|
|
122
122
|
})]
|
|
123
123
|
})
|
|
124
124
|
}),
|
|
125
125
|
/* @__PURE__ */ b("div", {
|
|
126
|
-
className: "mt-6 border-b border-border flex gap-1",
|
|
126
|
+
className: "mt-6 border-b border-border-subtle flex gap-1",
|
|
127
127
|
children: ["details", "usage"].map((e) => /* @__PURE__ */ x("button", {
|
|
128
128
|
type: "button",
|
|
129
129
|
onClick: () => A(e),
|
|
130
|
-
className: `flex items-center gap-2 px-4 py-2.5 text-sm font-medium border-b-2 -mb-px transition-colors ${k === e ? "border-primary text-
|
|
130
|
+
className: `flex items-center gap-2 px-4 py-2.5 text-sm font-medium border-b-2 -mb-px transition-colors ${k === e ? "border-action-primary-bg text-text-primary" : "border-transparent text-text-muted hover:text-text-primary"}`,
|
|
131
131
|
children: [b(e === "details" ? _ : h, { className: "size-4" }), e === "details" ? "Details" : `Usage History${L ? ` (${L.getCouponUsageHistory.total})` : ""}`]
|
|
132
132
|
}, e))
|
|
133
133
|
}),
|
|
134
134
|
k === "usage" && /* @__PURE__ */ b("div", {
|
|
135
|
-
className: "mt-6 bg-
|
|
135
|
+
className: "mt-6 bg-bg-surface border border-border-subtle rounded-lg overflow-hidden",
|
|
136
136
|
children: R ? /* @__PURE__ */ b("div", {
|
|
137
137
|
className: "flex items-center justify-center h-40",
|
|
138
|
-
children: /* @__PURE__ */ b("div", { className: "size-6 animate-spin rounded-full border-4 border-primary border-t-transparent" })
|
|
138
|
+
children: /* @__PURE__ */ b("div", { className: "size-6 animate-spin rounded-full border-4 border-action-primary-bg border-t-transparent" })
|
|
139
139
|
}) : L?.getCouponUsageHistory.usages.length ? /* @__PURE__ */ x(y, { children: [/* @__PURE__ */ b("div", {
|
|
140
140
|
className: "overflow-x-auto",
|
|
141
141
|
children: /* @__PURE__ */ x("table", {
|
|
142
142
|
className: "w-full",
|
|
143
143
|
children: [/* @__PURE__ */ b("thead", {
|
|
144
|
-
className: "bg-
|
|
144
|
+
className: "bg-bg-sunken/50 border-b border-border-subtle",
|
|
145
145
|
children: /* @__PURE__ */ x("tr", { children: [
|
|
146
146
|
/* @__PURE__ */ b("th", {
|
|
147
|
-
className: "text-left p-4 text-xs font-medium text-muted
|
|
147
|
+
className: "text-left p-4 text-xs font-medium text-text-muted uppercase tracking-wide",
|
|
148
148
|
children: "User ID"
|
|
149
149
|
}),
|
|
150
150
|
/* @__PURE__ */ b("th", {
|
|
151
|
-
className: "text-left p-4 text-xs font-medium text-muted
|
|
151
|
+
className: "text-left p-4 text-xs font-medium text-text-muted uppercase tracking-wide",
|
|
152
152
|
children: "Transaction"
|
|
153
153
|
}),
|
|
154
154
|
/* @__PURE__ */ b("th", {
|
|
155
|
-
className: "text-left p-4 text-xs font-medium text-muted
|
|
155
|
+
className: "text-left p-4 text-xs font-medium text-text-muted uppercase tracking-wide",
|
|
156
156
|
children: "Original"
|
|
157
157
|
}),
|
|
158
158
|
/* @__PURE__ */ b("th", {
|
|
159
|
-
className: "text-left p-4 text-xs font-medium text-muted
|
|
159
|
+
className: "text-left p-4 text-xs font-medium text-text-muted uppercase tracking-wide",
|
|
160
160
|
children: "Discount"
|
|
161
161
|
}),
|
|
162
162
|
/* @__PURE__ */ b("th", {
|
|
163
|
-
className: "text-left p-4 text-xs font-medium text-muted
|
|
163
|
+
className: "text-left p-4 text-xs font-medium text-text-muted uppercase tracking-wide",
|
|
164
164
|
children: "Final"
|
|
165
165
|
}),
|
|
166
166
|
/* @__PURE__ */ b("th", {
|
|
167
|
-
className: "text-left p-4 text-xs font-medium text-muted
|
|
167
|
+
className: "text-left p-4 text-xs font-medium text-text-muted uppercase tracking-wide",
|
|
168
168
|
children: "Used At"
|
|
169
169
|
})
|
|
170
170
|
] })
|
|
171
171
|
}), /* @__PURE__ */ b("tbody", {
|
|
172
|
-
className: "divide-y divide-border",
|
|
172
|
+
className: "divide-y divide-border-subtle",
|
|
173
173
|
children: L.getCouponUsageHistory.usages.map((e) => /* @__PURE__ */ x("tr", {
|
|
174
|
-
className: "hover:bg-
|
|
174
|
+
className: "hover:bg-bg-sunken/30",
|
|
175
175
|
children: [
|
|
176
176
|
/* @__PURE__ */ x("td", {
|
|
177
|
-
className: "p-4 text-sm text-
|
|
177
|
+
className: "p-4 text-sm text-text-primary font-mono",
|
|
178
178
|
children: [e.userId.slice(0, 12), "…"]
|
|
179
179
|
}),
|
|
180
180
|
/* @__PURE__ */ b("td", {
|
|
181
181
|
className: "p-4 text-sm",
|
|
182
182
|
children: e.transactionId ? /* @__PURE__ */ x("span", {
|
|
183
|
-
className: "font-mono text-xs text-
|
|
183
|
+
className: "font-mono text-xs text-text-link",
|
|
184
184
|
children: [e.transactionId.slice(0, 12), "…"]
|
|
185
185
|
}) : e.orderId ? /* @__PURE__ */ x("span", {
|
|
186
|
-
className: "text-xs text-muted
|
|
186
|
+
className: "text-xs text-text-muted",
|
|
187
187
|
children: [
|
|
188
188
|
"Order: ",
|
|
189
189
|
e.orderId.slice(0, 12),
|
|
190
190
|
"…"
|
|
191
191
|
]
|
|
192
192
|
}) : /* @__PURE__ */ b("span", {
|
|
193
|
-
className: "text-muted
|
|
193
|
+
className: "text-text-muted",
|
|
194
194
|
children: ", "
|
|
195
195
|
})
|
|
196
196
|
}),
|
|
197
197
|
/* @__PURE__ */ x("td", {
|
|
198
|
-
className: "p-4 text-sm text-
|
|
198
|
+
className: "p-4 text-sm text-text-primary",
|
|
199
199
|
children: [
|
|
200
200
|
e.originalAmount.toFixed(2),
|
|
201
201
|
" ",
|
|
@@ -212,7 +212,7 @@ var T = () => {
|
|
|
212
212
|
]
|
|
213
213
|
}),
|
|
214
214
|
/* @__PURE__ */ x("td", {
|
|
215
|
-
className: "p-4 text-sm text-
|
|
215
|
+
className: "p-4 text-sm text-text-primary font-medium",
|
|
216
216
|
children: [
|
|
217
217
|
e.finalAmount.toFixed(2),
|
|
218
218
|
" ",
|
|
@@ -220,7 +220,7 @@ var T = () => {
|
|
|
220
220
|
]
|
|
221
221
|
}),
|
|
222
222
|
/* @__PURE__ */ b("td", {
|
|
223
|
-
className: "p-4 text-sm text-muted
|
|
223
|
+
className: "p-4 text-sm text-text-muted",
|
|
224
224
|
children: new Date(e.usedAt).toLocaleString()
|
|
225
225
|
})
|
|
226
226
|
]
|
|
@@ -228,9 +228,9 @@ var T = () => {
|
|
|
228
228
|
})]
|
|
229
229
|
})
|
|
230
230
|
}), (L.getCouponUsageHistory.total ?? 0) > 20 && /* @__PURE__ */ x("div", {
|
|
231
|
-
className: "flex items-center justify-between p-4 border-t border-border",
|
|
231
|
+
className: "flex items-center justify-between p-4 border-t border-border-subtle",
|
|
232
232
|
children: [/* @__PURE__ */ x("p", {
|
|
233
|
-
className: "text-sm text-muted
|
|
233
|
+
className: "text-sm text-text-muted",
|
|
234
234
|
children: [
|
|
235
235
|
j * 20 + 1,
|
|
236
236
|
"–",
|
|
@@ -245,18 +245,18 @@ var T = () => {
|
|
|
245
245
|
type: "button",
|
|
246
246
|
onClick: () => M((e) => Math.max(0, e - 1)),
|
|
247
247
|
disabled: j === 0,
|
|
248
|
-
className: "p-1.5 rounded border border-border hover:bg-
|
|
248
|
+
className: "p-1.5 rounded border border-border-subtle hover:bg-bg-sunken disabled:opacity-40",
|
|
249
249
|
children: /* @__PURE__ */ b(f, { className: "size-4" })
|
|
250
250
|
}), /* @__PURE__ */ b("button", {
|
|
251
251
|
type: "button",
|
|
252
252
|
onClick: () => M((e) => e + 1),
|
|
253
253
|
disabled: !L.getCouponUsageHistory.hasMore,
|
|
254
|
-
className: "p-1.5 rounded border border-border hover:bg-
|
|
254
|
+
className: "p-1.5 rounded border border-border-subtle hover:bg-bg-sunken disabled:opacity-40",
|
|
255
255
|
children: /* @__PURE__ */ b(p, { className: "size-4" })
|
|
256
256
|
})]
|
|
257
257
|
})]
|
|
258
258
|
})] }) : /* @__PURE__ */ b("div", {
|
|
259
|
-
className: "p-8 text-center text-sm text-muted
|
|
259
|
+
className: "p-8 text-center text-sm text-text-muted",
|
|
260
260
|
children: "No usage recorded for this coupon yet."
|
|
261
261
|
})
|
|
262
262
|
}),
|
|
@@ -267,66 +267,66 @@ var T = () => {
|
|
|
267
267
|
className: "lg:col-span-3 grid grid-cols-2 sm:grid-cols-4 gap-4",
|
|
268
268
|
children: [
|
|
269
269
|
/* @__PURE__ */ x("div", {
|
|
270
|
-
className: "bg-
|
|
270
|
+
className: "bg-bg-surface border border-border-subtle rounded-lg p-4",
|
|
271
271
|
children: [/* @__PURE__ */ x("div", {
|
|
272
|
-
className: "flex items-center gap-2 text-muted
|
|
272
|
+
className: "flex items-center gap-2 text-text-muted mb-1",
|
|
273
273
|
children: [/* @__PURE__ */ b(_, { className: "size-4" }), /* @__PURE__ */ b("span", {
|
|
274
274
|
className: "text-xs font-medium uppercase tracking-wide",
|
|
275
275
|
children: "Code"
|
|
276
276
|
})]
|
|
277
277
|
}), /* @__PURE__ */ b("p", {
|
|
278
|
-
className: "text-lg font-mono font-bold text-
|
|
278
|
+
className: "text-lg font-mono font-bold text-text-primary",
|
|
279
279
|
children: z.code
|
|
280
280
|
})]
|
|
281
281
|
}),
|
|
282
282
|
/* @__PURE__ */ x("div", {
|
|
283
|
-
className: "bg-
|
|
283
|
+
className: "bg-bg-surface border border-border-subtle rounded-lg p-4",
|
|
284
284
|
children: [
|
|
285
285
|
/* @__PURE__ */ x("div", {
|
|
286
|
-
className: "flex items-center gap-2 text-muted
|
|
286
|
+
className: "flex items-center gap-2 text-text-muted mb-1",
|
|
287
287
|
children: [/* @__PURE__ */ b(u, { className: "size-4" }), /* @__PURE__ */ b("span", {
|
|
288
288
|
className: "text-xs font-medium uppercase tracking-wide",
|
|
289
289
|
children: "Discount"
|
|
290
290
|
})]
|
|
291
291
|
}),
|
|
292
292
|
/* @__PURE__ */ b("p", {
|
|
293
|
-
className: "text-lg font-bold text-
|
|
293
|
+
className: "text-lg font-bold text-text-primary",
|
|
294
294
|
children: H()
|
|
295
295
|
}),
|
|
296
296
|
/* @__PURE__ */ b("p", {
|
|
297
|
-
className: "text-xs text-muted
|
|
297
|
+
className: "text-xs text-text-muted capitalize",
|
|
298
298
|
children: z.type.replace("_", " ").toLowerCase()
|
|
299
299
|
})
|
|
300
300
|
]
|
|
301
301
|
}),
|
|
302
302
|
/* @__PURE__ */ x("div", {
|
|
303
|
-
className: "bg-
|
|
303
|
+
className: "bg-bg-surface border border-border-subtle rounded-lg p-4",
|
|
304
304
|
children: [
|
|
305
305
|
/* @__PURE__ */ x("div", {
|
|
306
|
-
className: "flex items-center gap-2 text-muted
|
|
306
|
+
className: "flex items-center gap-2 text-text-muted mb-1",
|
|
307
307
|
children: [/* @__PURE__ */ b(v, { className: "size-4" }), /* @__PURE__ */ b("span", {
|
|
308
308
|
className: "text-xs font-medium uppercase tracking-wide",
|
|
309
309
|
children: "Usage"
|
|
310
310
|
})]
|
|
311
311
|
}),
|
|
312
312
|
/* @__PURE__ */ x("p", {
|
|
313
|
-
className: "text-lg font-bold text-
|
|
313
|
+
className: "text-lg font-bold text-text-primary",
|
|
314
314
|
children: [z.currentUses, z.maxTotalUses ? ` / ${z.maxTotalUses}` : ""]
|
|
315
315
|
}),
|
|
316
316
|
B !== null && /* @__PURE__ */ b("div", {
|
|
317
|
-
className: "mt-1.5 h-1.5 w-full bg-
|
|
317
|
+
className: "mt-1.5 h-1.5 w-full bg-bg-sunken rounded-full overflow-hidden",
|
|
318
318
|
children: /* @__PURE__ */ b("div", {
|
|
319
|
-
className: "h-full bg-primary rounded-full",
|
|
319
|
+
className: "h-full bg-action-primary-bg rounded-full",
|
|
320
320
|
style: { width: `${Math.min(B, 100)}%` }
|
|
321
321
|
})
|
|
322
322
|
})
|
|
323
323
|
]
|
|
324
324
|
}),
|
|
325
325
|
/* @__PURE__ */ x("div", {
|
|
326
|
-
className: "bg-
|
|
326
|
+
className: "bg-bg-surface border border-border-subtle rounded-lg p-4",
|
|
327
327
|
children: [
|
|
328
328
|
/* @__PURE__ */ x("div", {
|
|
329
|
-
className: "flex items-center gap-2 text-muted
|
|
329
|
+
className: "flex items-center gap-2 text-text-muted mb-1",
|
|
330
330
|
children: [/* @__PURE__ */ b(d, { className: "size-4" }), /* @__PURE__ */ b("span", {
|
|
331
331
|
className: "text-xs font-medium uppercase tracking-wide",
|
|
332
332
|
children: "Status"
|
|
@@ -337,7 +337,7 @@ var T = () => {
|
|
|
337
337
|
children: /* @__PURE__ */ b(C, { status: z.status })
|
|
338
338
|
}),
|
|
339
339
|
z.validUntil && /* @__PURE__ */ x("p", {
|
|
340
|
-
className: "text-xs text-muted
|
|
340
|
+
className: "text-xs text-text-muted mt-1",
|
|
341
341
|
children: ["Expires ", V(z.validUntil)]
|
|
342
342
|
})
|
|
343
343
|
]
|
|
@@ -347,10 +347,10 @@ var T = () => {
|
|
|
347
347
|
/* @__PURE__ */ x("div", {
|
|
348
348
|
className: "lg:col-span-2 space-y-4",
|
|
349
349
|
children: [/* @__PURE__ */ x("div", {
|
|
350
|
-
className: "bg-
|
|
350
|
+
className: "bg-bg-surface border border-border-subtle rounded-lg p-6",
|
|
351
351
|
children: [
|
|
352
352
|
/* @__PURE__ */ b("h3", {
|
|
353
|
-
className: "text-sm font-semibold text-
|
|
353
|
+
className: "text-sm font-semibold text-text-primary uppercase tracking-wide mb-2",
|
|
354
354
|
children: "Coupon Details"
|
|
355
355
|
}),
|
|
356
356
|
/* @__PURE__ */ b(w, {
|
|
@@ -386,10 +386,10 @@ var T = () => {
|
|
|
386
386
|
})
|
|
387
387
|
]
|
|
388
388
|
}), /* @__PURE__ */ x("div", {
|
|
389
|
-
className: "bg-
|
|
389
|
+
className: "bg-bg-surface border border-border-subtle rounded-lg p-6",
|
|
390
390
|
children: [
|
|
391
391
|
/* @__PURE__ */ b("h3", {
|
|
392
|
-
className: "text-sm font-semibold text-
|
|
392
|
+
className: "text-sm font-semibold text-text-primary uppercase tracking-wide mb-2",
|
|
393
393
|
children: "Restrictions"
|
|
394
394
|
}),
|
|
395
395
|
/* @__PURE__ */ b(w, {
|
|
@@ -426,10 +426,10 @@ var T = () => {
|
|
|
426
426
|
className: "space-y-4",
|
|
427
427
|
children: [
|
|
428
428
|
/* @__PURE__ */ x("div", {
|
|
429
|
-
className: "bg-
|
|
429
|
+
className: "bg-bg-surface border border-border-subtle rounded-lg p-6",
|
|
430
430
|
children: [
|
|
431
431
|
/* @__PURE__ */ b("h3", {
|
|
432
|
-
className: "text-sm font-semibold text-
|
|
432
|
+
className: "text-sm font-semibold text-text-primary uppercase tracking-wide mb-2",
|
|
433
433
|
children: "Validity"
|
|
434
434
|
}),
|
|
435
435
|
/* @__PURE__ */ b(w, {
|
|
@@ -443,10 +443,10 @@ var T = () => {
|
|
|
443
443
|
]
|
|
444
444
|
}),
|
|
445
445
|
z.campaignId && /* @__PURE__ */ x("div", {
|
|
446
|
-
className: "bg-
|
|
446
|
+
className: "bg-bg-surface border border-border-subtle rounded-lg p-6",
|
|
447
447
|
children: [
|
|
448
448
|
/* @__PURE__ */ b("h3", {
|
|
449
|
-
className: "text-sm font-semibold text-
|
|
449
|
+
className: "text-sm font-semibold text-text-primary uppercase tracking-wide mb-2",
|
|
450
450
|
children: "Campaign"
|
|
451
451
|
}),
|
|
452
452
|
/* @__PURE__ */ b(w, {
|
|
@@ -463,10 +463,10 @@ var T = () => {
|
|
|
463
463
|
]
|
|
464
464
|
}),
|
|
465
465
|
/* @__PURE__ */ x("div", {
|
|
466
|
-
className: "bg-
|
|
466
|
+
className: "bg-bg-surface border border-border-subtle rounded-lg p-6",
|
|
467
467
|
children: [
|
|
468
468
|
/* @__PURE__ */ x("h3", {
|
|
469
|
-
className: "text-sm font-semibold text-
|
|
469
|
+
className: "text-sm font-semibold text-text-primary uppercase tracking-wide mb-2",
|
|
470
470
|
children: [/* @__PURE__ */ b(g, { className: "size-4 inline mr-1" }), "Audit"]
|
|
471
471
|
}),
|
|
472
472
|
/* @__PURE__ */ b(w, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CouponDetailPage.js","names":[],"sources":["../../../../../src/billing/modules/coupons/pages/CouponDetailPage.tsx"],"sourcesContent":["import { type FC, useEffect, useState } from 'react';\nimport { useBillingNavigate } from '../../../hooks/useBillingNavigate';\nimport {\n ArrowLeft,\n Edit,\n Tag,\n Calendar,\n Users,\n Package,\n BarChart2,\n History,\n ChevronLeft,\n ChevronRight,\n} from 'lucide-react';\nimport { useBillingPermissions } from '../../../hooks/useBillingPermissions';\nimport { AccessDenied, PageHeader } from '../../../shared/components';\nimport {\n useGetCouponLazyQuery,\n useGetCouponUsageHistoryQuery,\n} from '../../../../generated/global-operations';\nimport { Coupon, CouponStatus, CouponUsage } from '../../../../generated/global-types';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\n\nfunction StatusBadge({ status }: { status: CouponStatus }) {\n const map: Record<CouponStatus, { label: string; className: string }> = {\n [CouponStatus.Active]: {\n label: 'Active',\n className:\n 'bg-status-success-bg-subtle text-status-success-text border-status-success-bg-subtle',\n },\n [CouponStatus.Inactive]: {\n label: 'Inactive',\n className: 'bg-muted text-muted-foreground border-border',\n },\n [CouponStatus.Expired]: {\n label: 'Expired',\n className:\n 'bg-status-warning-bg-subtle text-status-warning-text border-status-warning-bg-subtle',\n },\n [CouponStatus.Depleted]: {\n label: 'Depleted',\n className: 'bg-destructive/10 text-destructive border-destructive/20',\n },\n };\n const { label, className } = map[status] ?? {\n label: status,\n className: 'bg-muted text-muted-foreground',\n };\n return (\n <span\n className={`inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium border ${className}`}\n >\n {label}\n </span>\n );\n}\n\nfunction DetailRow({ label, value }: { label: string; value: React.ReactNode }) {\n return (\n <div className=\"flex items-start gap-2 py-3 border-b border-border last:border-0\">\n <span className=\"text-sm text-muted-foreground w-44 shrink-0\">{label}</span>\n <span className=\"text-sm text-foreground font-medium flex-1\">{value ?? '—'}</span>\n </div>\n );\n}\n\nexport const CouponDetailPage: FC = () => {\n const { t } = useI18n();\n const tr = (key: string, fallback: string): string => {\n const translated = t(key);\n return translated === key ? fallback : translated;\n };\n const navigateTo = useBillingNavigate();\n const permissions = useBillingPermissions();\n\n const couponId = window.location.pathname.split('/').filter(Boolean).slice(-1)[0];\n const [activeTab, setActiveTab] = useState<'details' | 'usage'>('details');\n const [usagePage, setUsagePage] = useState(0);\n const USAGE_PAGE_SIZE = 20;\n\n const [getCoupon, { data, loading, error }] = useGetCouponLazyQuery();\n\n const { data: usageData, loading: usageLoading } = useGetCouponUsageHistoryQuery({\n variables: { couponId, limit: USAGE_PAGE_SIZE, offset: usagePage * USAGE_PAGE_SIZE },\n skip: !couponId || activeTab !== 'usage',\n });\n\n useEffect(() => {\n if (couponId) {\n getCoupon({ variables: { id: couponId } });\n }\n }, [couponId, getCoupon]);\n\n if (!permissions.canManageDiscounts) {\n return <AccessDenied message=\"You don't have permission to view coupon details.\" />;\n }\n\n if (loading) {\n return (\n <div className=\"p-8\">\n <PageHeader\n title={tr('billing.coupons.detailTitle', 'Coupon Details')}\n description=\"Loading...\"\n actions={\n <button\n type=\"button\"\n onClick={() => navigateTo('/coupons')}\n className=\"px-4 py-2 rounded-lg border border-border text-foreground hover:bg-muted flex items-center gap-2\"\n >\n <ArrowLeft className=\"size-4\" />\n Back\n </button>\n }\n />\n <div className=\"flex items-center justify-center h-64\">\n <div className=\"size-8 animate-spin rounded-full border-4 border-primary border-t-transparent\" />\n </div>\n </div>\n );\n }\n\n if (error || !data?.getCoupon) {\n return (\n <div className=\"p-8\">\n <PageHeader\n title=\"Coupon Details\"\n description=\"Coupon not found\"\n actions={\n <button\n type=\"button\"\n onClick={() => navigateTo('/coupons')}\n className=\"px-4 py-2 rounded-lg border border-border text-foreground hover:bg-muted flex items-center gap-2\"\n >\n <ArrowLeft className=\"size-4\" />\n Back\n </button>\n }\n />\n <div className=\"flex items-center justify-center h-64 text-destructive text-sm\">\n {error ? `Error: ${error.message}` : 'Coupon not found'}\n </div>\n </div>\n );\n }\n\n const coupon = data.getCoupon as Coupon;\n const usagePercent =\n coupon.maxTotalUses && coupon.maxTotalUses > 0\n ? Math.round((coupon.currentUses / coupon.maxTotalUses) * 100)\n : null;\n\n const formatDate = (d: string | null | undefined) =>\n d\n ? new Date(d).toLocaleDateString(undefined, {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n })\n : null;\n\n const formatValue = () =>\n coupon.type === 'PERCENTAGE'\n ? `${coupon.value}%`\n : `${coupon.value}${coupon.currency ? ` ${coupon.currency}` : ''}`;\n\n return (\n <div className=\"p-8\">\n <PageHeader\n title={coupon.name || coupon.code}\n description={coupon.description || `Coupon code: ${coupon.code}`}\n actions={\n <div className=\"flex items-center gap-3\">\n <button\n type=\"button\"\n onClick={() => navigateTo('/coupons')}\n className=\"px-4 py-2 rounded-lg border border-border text-foreground hover:bg-muted flex items-center gap-2\"\n >\n <ArrowLeft className=\"size-4\" />\n Back\n </button>\n <button\n type=\"button\"\n onClick={() => navigateTo(`/coupons/${coupon.id}/edit`)}\n className=\"px-4 py-2 rounded-lg bg-primary text-primary-foreground hover:bg-primary/90 flex items-center gap-2\"\n >\n <Edit className=\"size-4\" />\n Edit\n </button>\n </div>\n }\n />\n\n {/* Tabs */}\n <div className=\"mt-6 border-b border-border flex gap-1\">\n {(['details', 'usage'] as const).map((tab) => (\n <button\n type=\"button\"\n key={tab}\n onClick={() => setActiveTab(tab)}\n className={`flex items-center gap-2 px-4 py-2.5 text-sm font-medium border-b-2 -mb-px transition-colors ${\n activeTab === tab\n ? 'border-primary text-foreground'\n : 'border-transparent text-muted-foreground hover:text-foreground'\n }`}\n >\n {tab === 'details' ? <Tag className=\"size-4\" /> : <History className=\"size-4\" />}\n {tab === 'details'\n ? 'Details'\n : `Usage History${usageData ? ` (${usageData.getCouponUsageHistory.total})` : ''}`}\n </button>\n ))}\n </div>\n\n {activeTab === 'usage' && (\n <div className=\"mt-6 bg-card border border-border rounded-lg overflow-hidden\">\n {usageLoading ? (\n <div className=\"flex items-center justify-center h-40\">\n <div className=\"size-6 animate-spin rounded-full border-4 border-primary border-t-transparent\" />\n </div>\n ) : !usageData?.getCouponUsageHistory.usages.length ? (\n <div className=\"p-8 text-center text-sm text-muted-foreground\">\n No usage recorded for this coupon yet.\n </div>\n ) : (\n <>\n <div className=\"overflow-x-auto\">\n <table className=\"w-full\">\n <thead className=\"bg-muted/50 border-b border-border\">\n <tr>\n <th className=\"text-left p-4 text-xs font-medium text-muted-foreground uppercase tracking-wide\">\n User ID\n </th>\n <th className=\"text-left p-4 text-xs font-medium text-muted-foreground uppercase tracking-wide\">\n Transaction\n </th>\n <th className=\"text-left p-4 text-xs font-medium text-muted-foreground uppercase tracking-wide\">\n Original\n </th>\n <th className=\"text-left p-4 text-xs font-medium text-muted-foreground uppercase tracking-wide\">\n Discount\n </th>\n <th className=\"text-left p-4 text-xs font-medium text-muted-foreground uppercase tracking-wide\">\n Final\n </th>\n <th className=\"text-left p-4 text-xs font-medium text-muted-foreground uppercase tracking-wide\">\n Used At\n </th>\n </tr>\n </thead>\n <tbody className=\"divide-y divide-border\">\n {usageData.getCouponUsageHistory.usages.map((u: CouponUsage) => (\n <tr key={u.id} className=\"hover:bg-muted/30\">\n <td className=\"p-4 text-sm text-foreground font-mono\">\n {u.userId.slice(0, 12)}…\n </td>\n <td className=\"p-4 text-sm\">\n {u.transactionId ? (\n <span className=\"font-mono text-xs text-primary\">\n {u.transactionId.slice(0, 12)}…\n </span>\n ) : u.orderId ? (\n <span className=\"text-xs text-muted-foreground\">\n Order: {u.orderId.slice(0, 12)}…\n </span>\n ) : (\n <span className=\"text-muted-foreground\">, </span>\n )}\n </td>\n <td className=\"p-4 text-sm text-foreground\">\n {u.originalAmount.toFixed(2)} {u.currency}\n </td>\n <td className=\"p-4 text-sm text-status-success-text font-medium\">\n -{u.discountValue.toFixed(2)} {u.currency}\n </td>\n <td className=\"p-4 text-sm text-foreground font-medium\">\n {u.finalAmount.toFixed(2)} {u.currency}\n </td>\n <td className=\"p-4 text-sm text-muted-foreground\">\n {new Date(u.usedAt).toLocaleString()}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n {(usageData.getCouponUsageHistory.total ?? 0) > USAGE_PAGE_SIZE && (\n <div className=\"flex items-center justify-between p-4 border-t border-border\">\n <p className=\"text-sm text-muted-foreground\">\n {usagePage * USAGE_PAGE_SIZE + 1}–\n {Math.min(\n (usagePage + 1) * USAGE_PAGE_SIZE,\n usageData.getCouponUsageHistory.total\n )}{' '}\n of {usageData.getCouponUsageHistory.total}\n </p>\n <div className=\"flex items-center gap-2\">\n <button\n type=\"button\"\n onClick={() => setUsagePage((p) => Math.max(0, p - 1))}\n disabled={usagePage === 0}\n className=\"p-1.5 rounded border border-border hover:bg-muted disabled:opacity-40\"\n >\n <ChevronLeft className=\"size-4\" />\n </button>\n <button\n type=\"button\"\n onClick={() => setUsagePage((p) => p + 1)}\n disabled={!usageData.getCouponUsageHistory.hasMore}\n className=\"p-1.5 rounded border border-border hover:bg-muted disabled:opacity-40\"\n >\n <ChevronRight className=\"size-4\" />\n </button>\n </div>\n </div>\n )}\n </>\n )}\n </div>\n )}\n\n {activeTab === 'details' && (\n <div className=\"mt-8 grid grid-cols-1 lg:grid-cols-3 gap-6\">\n {/* Summary cards */}\n <div className=\"lg:col-span-3 grid grid-cols-2 sm:grid-cols-4 gap-4\">\n <div className=\"bg-card border border-border rounded-lg p-4\">\n <div className=\"flex items-center gap-2 text-muted-foreground mb-1\">\n <Tag className=\"size-4\" />\n <span className=\"text-xs font-medium uppercase tracking-wide\">Code</span>\n </div>\n <p className=\"text-lg font-mono font-bold text-foreground\">{coupon.code}</p>\n </div>\n\n <div className=\"bg-card border border-border rounded-lg p-4\">\n <div className=\"flex items-center gap-2 text-muted-foreground mb-1\">\n <BarChart2 className=\"size-4\" />\n <span className=\"text-xs font-medium uppercase tracking-wide\">Discount</span>\n </div>\n <p className=\"text-lg font-bold text-foreground\">{formatValue()}</p>\n <p className=\"text-xs text-muted-foreground capitalize\">\n {coupon.type.replace('_', ' ').toLowerCase()}\n </p>\n </div>\n\n <div className=\"bg-card border border-border rounded-lg p-4\">\n <div className=\"flex items-center gap-2 text-muted-foreground mb-1\">\n <Users className=\"size-4\" />\n <span className=\"text-xs font-medium uppercase tracking-wide\">Usage</span>\n </div>\n <p className=\"text-lg font-bold text-foreground\">\n {coupon.currentUses}\n {coupon.maxTotalUses ? ` / ${coupon.maxTotalUses}` : ''}\n </p>\n {usagePercent !== null && (\n <div className=\"mt-1.5 h-1.5 w-full bg-muted rounded-full overflow-hidden\">\n <div\n className=\"h-full bg-primary rounded-full\"\n style={{ width: `${Math.min(usagePercent, 100)}%` }}\n />\n </div>\n )}\n </div>\n\n <div className=\"bg-card border border-border rounded-lg p-4\">\n <div className=\"flex items-center gap-2 text-muted-foreground mb-1\">\n <Calendar className=\"size-4\" />\n <span className=\"text-xs font-medium uppercase tracking-wide\">Status</span>\n </div>\n <div className=\"mt-1\">\n <StatusBadge status={coupon.status} />\n </div>\n {coupon.validUntil && (\n <p className=\"text-xs text-muted-foreground mt-1\">\n Expires {formatDate(coupon.validUntil)}\n </p>\n )}\n </div>\n </div>\n\n {/* Main details */}\n <div className=\"lg:col-span-2 space-y-4\">\n <div className=\"bg-card border border-border rounded-lg p-6\">\n <h3 className=\"text-sm font-semibold text-foreground uppercase tracking-wide mb-2\">\n Coupon Details\n </h3>\n <DetailRow label=\"Code\" value={<span className=\"font-mono\">{coupon.code}</span>} />\n <DetailRow label=\"Name\" value={coupon.name} />\n <DetailRow label=\"Description\" value={coupon.description} />\n <DetailRow label=\"Type\" value={coupon.type.replace('_', ' ').toLowerCase()} />\n <DetailRow label=\"Value\" value={formatValue()} />\n <DetailRow label=\"Scope\" value={coupon.scope} />\n <DetailRow label=\"Status\" value={<StatusBadge status={coupon.status} />} />\n </div>\n\n <div className=\"bg-card border border-border rounded-lg p-6\">\n <h3 className=\"text-sm font-semibold text-foreground uppercase tracking-wide mb-2\">\n Restrictions\n </h3>\n <DetailRow\n label=\"Min Purchase Amount\"\n value={\n coupon.minPurchaseAmount != null\n ? `${coupon.minPurchaseAmount}${coupon.currency ? ` ${coupon.currency}` : ''}`\n : null\n }\n />\n <DetailRow\n label=\"Max Discount Amount\"\n value={\n coupon.maxDiscountAmount != null\n ? `${coupon.maxDiscountAmount}${coupon.currency ? ` ${coupon.currency}` : ''}`\n : null\n }\n />\n <DetailRow label=\"Max Uses Per User\" value={coupon.maxUsesPerUser} />\n <DetailRow\n label=\"Restricted Users\"\n value={\n coupon.restrictedToUserIds?.length ? (\n <span className=\"font-mono text-xs break-all\">\n {(coupon.restrictedToUserIds as string[]).join(', ')}\n </span>\n ) : (\n 'No restrictions'\n )\n }\n />\n <DetailRow\n label=\"Applicable Products\"\n value={\n coupon.applicableProducts?.length\n ? (coupon.applicableProducts as string[]).join(', ')\n : 'All products'\n }\n />\n <DetailRow\n label=\"Excluded Products\"\n value={\n coupon.excludedProducts?.length\n ? (coupon.excludedProducts as string[]).join(', ')\n : 'None'\n }\n />\n </div>\n </div>\n\n {/* Sidebar */}\n <div className=\"space-y-4\">\n <div className=\"bg-card border border-border rounded-lg p-6\">\n <h3 className=\"text-sm font-semibold text-foreground uppercase tracking-wide mb-2\">\n Validity\n </h3>\n <DetailRow label=\"Valid From\" value={formatDate(coupon.validFrom)} />\n <DetailRow label=\"Valid Until\" value={formatDate(coupon.validUntil) ?? 'No expiry'} />\n </div>\n\n {coupon.campaignId && (\n <div className=\"bg-card border border-border rounded-lg p-6\">\n <h3 className=\"text-sm font-semibold text-foreground uppercase tracking-wide mb-2\">\n Campaign\n </h3>\n <DetailRow\n label=\"Campaign ID\"\n value={<span className=\"font-mono text-xs\">{coupon.campaignId}</span>}\n />\n <DetailRow label=\"Campaign Name\" value={coupon.campaignName} />\n </div>\n )}\n\n <div className=\"bg-card border border-border rounded-lg p-6\">\n <h3 className=\"text-sm font-semibold text-foreground uppercase tracking-wide mb-2\">\n <Package className=\"size-4 inline mr-1\" />\n Audit\n </h3>\n <DetailRow label=\"Created\" value={formatDate(coupon.createdAt)} />\n <DetailRow label=\"Last Updated\" value={formatDate(coupon.updatedAt)} />\n <DetailRow label=\"Created By\" value={coupon.createdBy ?? null} />\n </div>\n </div>\n </div>\n )}\n </div>\n );\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"CouponDetailPage.js","names":[],"sources":["../../../../../src/billing/modules/coupons/pages/CouponDetailPage.tsx"],"sourcesContent":["import { type FC, useEffect, useState } from 'react';\nimport { useBillingNavigate } from '../../../hooks/useBillingNavigate';\nimport {\n ArrowLeft,\n Edit,\n Tag,\n Calendar,\n Users,\n Package,\n BarChart2,\n History,\n ChevronLeft,\n ChevronRight,\n} from 'lucide-react';\nimport { useBillingPermissions } from '../../../hooks/useBillingPermissions';\nimport { AccessDenied, PageHeader } from '../../../shared/components';\nimport {\n useGetCouponLazyQuery,\n useGetCouponUsageHistoryQuery,\n} from '../../../../generated/global-operations';\nimport { Coupon, CouponStatus, CouponUsage } from '../../../../generated/global-types';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\n\nfunction StatusBadge({ status }: { status: CouponStatus }) {\n const map: Record<CouponStatus, { label: string; className: string }> = {\n [CouponStatus.Active]: {\n label: 'Active',\n className:\n 'bg-status-success-bg-subtle text-status-success-text border-status-success-bg-subtle',\n },\n [CouponStatus.Inactive]: {\n label: 'Inactive',\n className: 'bg-bg-sunken text-text-muted border-border-subtle',\n },\n [CouponStatus.Expired]: {\n label: 'Expired',\n className:\n 'bg-status-warning-bg-subtle text-status-warning-text border-status-warning-bg-subtle',\n },\n [CouponStatus.Depleted]: {\n label: 'Depleted',\n className: 'bg-status-error-bg-subtle text-status-error-text border-status-error-border',\n },\n };\n const { label, className } = map[status] ?? {\n label: status,\n className: 'bg-bg-sunken text-text-muted',\n };\n return (\n <span\n className={`inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium border ${className}`}\n >\n {label}\n </span>\n );\n}\n\nfunction DetailRow({ label, value }: { label: string; value: React.ReactNode }) {\n return (\n <div className=\"flex items-start gap-2 py-3 border-b border-border-subtle last:border-0\">\n <span className=\"text-sm text-text-muted w-44 shrink-0\">{label}</span>\n <span className=\"text-sm text-text-primary font-medium flex-1\">{value ?? '—'}</span>\n </div>\n );\n}\n\nexport const CouponDetailPage: FC = () => {\n const { t } = useI18n();\n const tr = (key: string, fallback: string): string => {\n const translated = t(key);\n return translated === key ? fallback : translated;\n };\n const navigateTo = useBillingNavigate();\n const permissions = useBillingPermissions();\n\n const couponId = window.location.pathname.split('/').filter(Boolean).slice(-1)[0];\n const [activeTab, setActiveTab] = useState<'details' | 'usage'>('details');\n const [usagePage, setUsagePage] = useState(0);\n const USAGE_PAGE_SIZE = 20;\n\n const [getCoupon, { data, loading, error }] = useGetCouponLazyQuery();\n\n const { data: usageData, loading: usageLoading } = useGetCouponUsageHistoryQuery({\n variables: { couponId, limit: USAGE_PAGE_SIZE, offset: usagePage * USAGE_PAGE_SIZE },\n skip: !couponId || activeTab !== 'usage',\n });\n\n useEffect(() => {\n if (couponId) {\n getCoupon({ variables: { id: couponId } });\n }\n }, [couponId, getCoupon]);\n\n if (!permissions.canManageDiscounts) {\n return <AccessDenied message=\"You don't have permission to view coupon details.\" />;\n }\n\n if (loading) {\n return (\n <div className=\"p-8\">\n <PageHeader\n title={tr('billing.coupons.detailTitle', 'Coupon Details')}\n description=\"Loading...\"\n actions={\n <button\n type=\"button\"\n onClick={() => navigateTo('/coupons')}\n className=\"px-4 py-2 rounded-lg border border-border-subtle text-text-primary hover:bg-bg-sunken flex items-center gap-2\"\n >\n <ArrowLeft className=\"size-4\" />\n Back\n </button>\n }\n />\n <div className=\"flex items-center justify-center h-64\">\n <div className=\"size-8 animate-spin rounded-full border-4 border-action-primary-bg border-t-transparent\" />\n </div>\n </div>\n );\n }\n\n if (error || !data?.getCoupon) {\n return (\n <div className=\"p-8\">\n <PageHeader\n title=\"Coupon Details\"\n description=\"Coupon not found\"\n actions={\n <button\n type=\"button\"\n onClick={() => navigateTo('/coupons')}\n className=\"px-4 py-2 rounded-lg border border-border-subtle text-text-primary hover:bg-bg-sunken flex items-center gap-2\"\n >\n <ArrowLeft className=\"size-4\" />\n Back\n </button>\n }\n />\n <div className=\"flex items-center justify-center h-64 text-status-error-text text-sm\">\n {error ? `Error: ${error.message}` : 'Coupon not found'}\n </div>\n </div>\n );\n }\n\n const coupon = data.getCoupon as Coupon;\n const usagePercent =\n coupon.maxTotalUses && coupon.maxTotalUses > 0\n ? Math.round((coupon.currentUses / coupon.maxTotalUses) * 100)\n : null;\n\n const formatDate = (d: string | null | undefined) =>\n d\n ? new Date(d).toLocaleDateString(undefined, {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n })\n : null;\n\n const formatValue = () =>\n coupon.type === 'PERCENTAGE'\n ? `${coupon.value}%`\n : `${coupon.value}${coupon.currency ? ` ${coupon.currency}` : ''}`;\n\n return (\n <div className=\"p-8\">\n <PageHeader\n title={coupon.name || coupon.code}\n description={coupon.description || `Coupon code: ${coupon.code}`}\n actions={\n <div className=\"flex items-center gap-3\">\n <button\n type=\"button\"\n onClick={() => navigateTo('/coupons')}\n className=\"px-4 py-2 rounded-lg border border-border-subtle text-text-primary hover:bg-bg-sunken flex items-center gap-2\"\n >\n <ArrowLeft className=\"size-4\" />\n Back\n </button>\n <button\n type=\"button\"\n onClick={() => navigateTo(`/coupons/${coupon.id}/edit`)}\n className=\"px-4 py-2 rounded-lg bg-action-primary-bg text-action-primary-text hover:bg-action-primary-bgHover flex items-center gap-2\"\n >\n <Edit className=\"size-4\" />\n Edit\n </button>\n </div>\n }\n />\n\n {/* Tabs */}\n <div className=\"mt-6 border-b border-border-subtle flex gap-1\">\n {(['details', 'usage'] as const).map((tab) => (\n <button\n type=\"button\"\n key={tab}\n onClick={() => setActiveTab(tab)}\n className={`flex items-center gap-2 px-4 py-2.5 text-sm font-medium border-b-2 -mb-px transition-colors ${\n activeTab === tab\n ? 'border-action-primary-bg text-text-primary'\n : 'border-transparent text-text-muted hover:text-text-primary'\n }`}\n >\n {tab === 'details' ? <Tag className=\"size-4\" /> : <History className=\"size-4\" />}\n {tab === 'details'\n ? 'Details'\n : `Usage History${usageData ? ` (${usageData.getCouponUsageHistory.total})` : ''}`}\n </button>\n ))}\n </div>\n\n {activeTab === 'usage' && (\n <div className=\"mt-6 bg-bg-surface border border-border-subtle rounded-lg overflow-hidden\">\n {usageLoading ? (\n <div className=\"flex items-center justify-center h-40\">\n <div className=\"size-6 animate-spin rounded-full border-4 border-action-primary-bg border-t-transparent\" />\n </div>\n ) : !usageData?.getCouponUsageHistory.usages.length ? (\n <div className=\"p-8 text-center text-sm text-text-muted\">\n No usage recorded for this coupon yet.\n </div>\n ) : (\n <>\n <div className=\"overflow-x-auto\">\n <table className=\"w-full\">\n <thead className=\"bg-bg-sunken/50 border-b border-border-subtle\">\n <tr>\n <th className=\"text-left p-4 text-xs font-medium text-text-muted uppercase tracking-wide\">\n User ID\n </th>\n <th className=\"text-left p-4 text-xs font-medium text-text-muted uppercase tracking-wide\">\n Transaction\n </th>\n <th className=\"text-left p-4 text-xs font-medium text-text-muted uppercase tracking-wide\">\n Original\n </th>\n <th className=\"text-left p-4 text-xs font-medium text-text-muted uppercase tracking-wide\">\n Discount\n </th>\n <th className=\"text-left p-4 text-xs font-medium text-text-muted uppercase tracking-wide\">\n Final\n </th>\n <th className=\"text-left p-4 text-xs font-medium text-text-muted uppercase tracking-wide\">\n Used At\n </th>\n </tr>\n </thead>\n <tbody className=\"divide-y divide-border-subtle\">\n {usageData.getCouponUsageHistory.usages.map((u: CouponUsage) => (\n <tr key={u.id} className=\"hover:bg-bg-sunken/30\">\n <td className=\"p-4 text-sm text-text-primary font-mono\">\n {u.userId.slice(0, 12)}…\n </td>\n <td className=\"p-4 text-sm\">\n {u.transactionId ? (\n <span className=\"font-mono text-xs text-text-link\">\n {u.transactionId.slice(0, 12)}…\n </span>\n ) : u.orderId ? (\n <span className=\"text-xs text-text-muted\">\n Order: {u.orderId.slice(0, 12)}…\n </span>\n ) : (\n <span className=\"text-text-muted\">, </span>\n )}\n </td>\n <td className=\"p-4 text-sm text-text-primary\">\n {u.originalAmount.toFixed(2)} {u.currency}\n </td>\n <td className=\"p-4 text-sm text-status-success-text font-medium\">\n -{u.discountValue.toFixed(2)} {u.currency}\n </td>\n <td className=\"p-4 text-sm text-text-primary font-medium\">\n {u.finalAmount.toFixed(2)} {u.currency}\n </td>\n <td className=\"p-4 text-sm text-text-muted\">\n {new Date(u.usedAt).toLocaleString()}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n {(usageData.getCouponUsageHistory.total ?? 0) > USAGE_PAGE_SIZE && (\n <div className=\"flex items-center justify-between p-4 border-t border-border-subtle\">\n <p className=\"text-sm text-text-muted\">\n {usagePage * USAGE_PAGE_SIZE + 1}–\n {Math.min(\n (usagePage + 1) * USAGE_PAGE_SIZE,\n usageData.getCouponUsageHistory.total\n )}{' '}\n of {usageData.getCouponUsageHistory.total}\n </p>\n <div className=\"flex items-center gap-2\">\n <button\n type=\"button\"\n onClick={() => setUsagePage((p) => Math.max(0, p - 1))}\n disabled={usagePage === 0}\n className=\"p-1.5 rounded border border-border-subtle hover:bg-bg-sunken disabled:opacity-40\"\n >\n <ChevronLeft className=\"size-4\" />\n </button>\n <button\n type=\"button\"\n onClick={() => setUsagePage((p) => p + 1)}\n disabled={!usageData.getCouponUsageHistory.hasMore}\n className=\"p-1.5 rounded border border-border-subtle hover:bg-bg-sunken disabled:opacity-40\"\n >\n <ChevronRight className=\"size-4\" />\n </button>\n </div>\n </div>\n )}\n </>\n )}\n </div>\n )}\n\n {activeTab === 'details' && (\n <div className=\"mt-8 grid grid-cols-1 lg:grid-cols-3 gap-6\">\n {/* Summary cards */}\n <div className=\"lg:col-span-3 grid grid-cols-2 sm:grid-cols-4 gap-4\">\n <div className=\"bg-bg-surface border border-border-subtle rounded-lg p-4\">\n <div className=\"flex items-center gap-2 text-text-muted mb-1\">\n <Tag className=\"size-4\" />\n <span className=\"text-xs font-medium uppercase tracking-wide\">Code</span>\n </div>\n <p className=\"text-lg font-mono font-bold text-text-primary\">{coupon.code}</p>\n </div>\n\n <div className=\"bg-bg-surface border border-border-subtle rounded-lg p-4\">\n <div className=\"flex items-center gap-2 text-text-muted mb-1\">\n <BarChart2 className=\"size-4\" />\n <span className=\"text-xs font-medium uppercase tracking-wide\">Discount</span>\n </div>\n <p className=\"text-lg font-bold text-text-primary\">{formatValue()}</p>\n <p className=\"text-xs text-text-muted capitalize\">\n {coupon.type.replace('_', ' ').toLowerCase()}\n </p>\n </div>\n\n <div className=\"bg-bg-surface border border-border-subtle rounded-lg p-4\">\n <div className=\"flex items-center gap-2 text-text-muted mb-1\">\n <Users className=\"size-4\" />\n <span className=\"text-xs font-medium uppercase tracking-wide\">Usage</span>\n </div>\n <p className=\"text-lg font-bold text-text-primary\">\n {coupon.currentUses}\n {coupon.maxTotalUses ? ` / ${coupon.maxTotalUses}` : ''}\n </p>\n {usagePercent !== null && (\n <div className=\"mt-1.5 h-1.5 w-full bg-bg-sunken rounded-full overflow-hidden\">\n <div\n className=\"h-full bg-action-primary-bg rounded-full\"\n style={{ width: `${Math.min(usagePercent, 100)}%` }}\n />\n </div>\n )}\n </div>\n\n <div className=\"bg-bg-surface border border-border-subtle rounded-lg p-4\">\n <div className=\"flex items-center gap-2 text-text-muted mb-1\">\n <Calendar className=\"size-4\" />\n <span className=\"text-xs font-medium uppercase tracking-wide\">Status</span>\n </div>\n <div className=\"mt-1\">\n <StatusBadge status={coupon.status} />\n </div>\n {coupon.validUntil && (\n <p className=\"text-xs text-text-muted mt-1\">\n Expires {formatDate(coupon.validUntil)}\n </p>\n )}\n </div>\n </div>\n\n {/* Main details */}\n <div className=\"lg:col-span-2 space-y-4\">\n <div className=\"bg-bg-surface border border-border-subtle rounded-lg p-6\">\n <h3 className=\"text-sm font-semibold text-text-primary uppercase tracking-wide mb-2\">\n Coupon Details\n </h3>\n <DetailRow label=\"Code\" value={<span className=\"font-mono\">{coupon.code}</span>} />\n <DetailRow label=\"Name\" value={coupon.name} />\n <DetailRow label=\"Description\" value={coupon.description} />\n <DetailRow label=\"Type\" value={coupon.type.replace('_', ' ').toLowerCase()} />\n <DetailRow label=\"Value\" value={formatValue()} />\n <DetailRow label=\"Scope\" value={coupon.scope} />\n <DetailRow label=\"Status\" value={<StatusBadge status={coupon.status} />} />\n </div>\n\n <div className=\"bg-bg-surface border border-border-subtle rounded-lg p-6\">\n <h3 className=\"text-sm font-semibold text-text-primary uppercase tracking-wide mb-2\">\n Restrictions\n </h3>\n <DetailRow\n label=\"Min Purchase Amount\"\n value={\n coupon.minPurchaseAmount != null\n ? `${coupon.minPurchaseAmount}${coupon.currency ? ` ${coupon.currency}` : ''}`\n : null\n }\n />\n <DetailRow\n label=\"Max Discount Amount\"\n value={\n coupon.maxDiscountAmount != null\n ? `${coupon.maxDiscountAmount}${coupon.currency ? ` ${coupon.currency}` : ''}`\n : null\n }\n />\n <DetailRow label=\"Max Uses Per User\" value={coupon.maxUsesPerUser} />\n <DetailRow\n label=\"Restricted Users\"\n value={\n coupon.restrictedToUserIds?.length ? (\n <span className=\"font-mono text-xs break-all\">\n {(coupon.restrictedToUserIds as string[]).join(', ')}\n </span>\n ) : (\n 'No restrictions'\n )\n }\n />\n <DetailRow\n label=\"Applicable Products\"\n value={\n coupon.applicableProducts?.length\n ? (coupon.applicableProducts as string[]).join(', ')\n : 'All products'\n }\n />\n <DetailRow\n label=\"Excluded Products\"\n value={\n coupon.excludedProducts?.length\n ? (coupon.excludedProducts as string[]).join(', ')\n : 'None'\n }\n />\n </div>\n </div>\n\n {/* Sidebar */}\n <div className=\"space-y-4\">\n <div className=\"bg-bg-surface border border-border-subtle rounded-lg p-6\">\n <h3 className=\"text-sm font-semibold text-text-primary uppercase tracking-wide mb-2\">\n Validity\n </h3>\n <DetailRow label=\"Valid From\" value={formatDate(coupon.validFrom)} />\n <DetailRow label=\"Valid Until\" value={formatDate(coupon.validUntil) ?? 'No expiry'} />\n </div>\n\n {coupon.campaignId && (\n <div className=\"bg-bg-surface border border-border-subtle rounded-lg p-6\">\n <h3 className=\"text-sm font-semibold text-text-primary uppercase tracking-wide mb-2\">\n Campaign\n </h3>\n <DetailRow\n label=\"Campaign ID\"\n value={<span className=\"font-mono text-xs\">{coupon.campaignId}</span>}\n />\n <DetailRow label=\"Campaign Name\" value={coupon.campaignName} />\n </div>\n )}\n\n <div className=\"bg-bg-surface border border-border-subtle rounded-lg p-6\">\n <h3 className=\"text-sm font-semibold text-text-primary uppercase tracking-wide mb-2\">\n <Package className=\"size-4 inline mr-1\" />\n Audit\n </h3>\n <DetailRow label=\"Created\" value={formatDate(coupon.createdAt)} />\n <DetailRow label=\"Last Updated\" value={formatDate(coupon.updatedAt)} />\n <DetailRow label=\"Created By\" value={coupon.createdBy ?? null} />\n </div>\n </div>\n </div>\n )}\n </div>\n );\n};\n"],"mappings":"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"}
|