order-management 0.0.35 → 0.0.36
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/.medusa/server/src/admin/index.js +437 -437
- package/.medusa/server/src/admin/index.mjs +437 -437
- package/.medusa/server/src/config.js +5 -1
- package/.medusa/server/src/subscribers/order-status-change.js +56 -0
- package/.medusa/server/src/utils/notification-handler.js +191 -0
- package/README.md +272 -0
- package/package.json +1 -1
|
@@ -18,21 +18,21 @@ const getStatusBadgeClass$3 = (status) => {
|
|
|
18
18
|
if (statusLower === "requested") {
|
|
19
19
|
return "bg-ui-tag-orange-bg text-ui-tag-orange-text";
|
|
20
20
|
}
|
|
21
|
-
if (statusLower === "
|
|
21
|
+
if (statusLower === "received") {
|
|
22
22
|
return "bg-ui-tag-blue-bg text-ui-tag-blue-text";
|
|
23
23
|
}
|
|
24
|
-
if (statusLower === "
|
|
24
|
+
if (statusLower === "requires_action") {
|
|
25
25
|
return "bg-ui-tag-red-bg text-ui-tag-red-text";
|
|
26
26
|
}
|
|
27
27
|
if (statusLower === "completed") {
|
|
28
28
|
return "bg-ui-tag-green-bg text-ui-tag-green-text";
|
|
29
29
|
}
|
|
30
|
-
if (statusLower === "
|
|
30
|
+
if (statusLower === "canceled") {
|
|
31
31
|
return "bg-ui-tag-grey-bg text-ui-tag-grey-text";
|
|
32
32
|
}
|
|
33
33
|
return "bg-ui-tag-purple-bg text-ui-tag-purple-text";
|
|
34
34
|
};
|
|
35
|
-
const
|
|
35
|
+
const ReturnsPage = () => {
|
|
36
36
|
const navigate = reactRouterDom.useNavigate();
|
|
37
37
|
const [items, setItems] = react.useState([]);
|
|
38
38
|
const [statusFilter, setStatusFilter] = react.useState("all");
|
|
@@ -44,7 +44,7 @@ const SwapsPage = () => {
|
|
|
44
44
|
const [offset, setOffset] = react.useState(0);
|
|
45
45
|
const [count, setCount] = react.useState(0);
|
|
46
46
|
const limit = 50;
|
|
47
|
-
const
|
|
47
|
+
const loadReturns = react.useCallback(
|
|
48
48
|
async (nextOffset, replace = false) => {
|
|
49
49
|
var _a;
|
|
50
50
|
try {
|
|
@@ -61,24 +61,25 @@ const SwapsPage = () => {
|
|
|
61
61
|
params.set("status", statusFilter);
|
|
62
62
|
}
|
|
63
63
|
if (debouncedSearchQuery.trim()) {
|
|
64
|
-
params.set("
|
|
64
|
+
params.set("q", debouncedSearchQuery.trim());
|
|
65
65
|
}
|
|
66
|
+
params.set("order", "created_at");
|
|
66
67
|
const response = await fetch(
|
|
67
|
-
`/admin/
|
|
68
|
+
`/admin/returns?${params.toString()}`,
|
|
68
69
|
{ credentials: "include" }
|
|
69
70
|
);
|
|
70
71
|
if (!response.ok) {
|
|
71
72
|
const message = await response.text();
|
|
72
|
-
throw new Error(message || "Unable to load
|
|
73
|
+
throw new Error(message || "Unable to load return orders");
|
|
73
74
|
}
|
|
74
75
|
const payload = await response.json();
|
|
75
76
|
setCount(payload.count ?? 0);
|
|
76
|
-
setOffset(nextOffset + (((_a = payload.
|
|
77
|
+
setOffset(nextOffset + (((_a = payload.returns) == null ? void 0 : _a.length) ?? 0));
|
|
77
78
|
setItems(
|
|
78
|
-
(prev) => replace ? payload.
|
|
79
|
+
(prev) => replace ? payload.returns ?? [] : [...prev, ...payload.returns ?? []]
|
|
79
80
|
);
|
|
80
81
|
} catch (loadError) {
|
|
81
|
-
const message = loadError instanceof Error ? loadError.message : "Unable to load
|
|
82
|
+
const message = loadError instanceof Error ? loadError.message : "Unable to load return orders";
|
|
82
83
|
setError(message);
|
|
83
84
|
} finally {
|
|
84
85
|
setIsLoading(false);
|
|
@@ -88,8 +89,8 @@ const SwapsPage = () => {
|
|
|
88
89
|
[statusFilter, debouncedSearchQuery]
|
|
89
90
|
);
|
|
90
91
|
react.useEffect(() => {
|
|
91
|
-
void
|
|
92
|
-
}, [statusFilter, debouncedSearchQuery,
|
|
92
|
+
void loadReturns(0, true);
|
|
93
|
+
}, [statusFilter, debouncedSearchQuery, loadReturns]);
|
|
93
94
|
const hasMore = react.useMemo(() => offset < count, [offset, count]);
|
|
94
95
|
const availableStatuses = react.useMemo(() => {
|
|
95
96
|
const statuses = /* @__PURE__ */ new Set();
|
|
@@ -99,16 +100,16 @@ const SwapsPage = () => {
|
|
|
99
100
|
return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-full p-6", children: /* @__PURE__ */ jsxRuntime.jsxs(ui.Container, { className: "mx-auto flex w-full max-w-7xl flex-col gap-6 p-6", children: [
|
|
100
101
|
/* @__PURE__ */ jsxRuntime.jsxs("header", { className: "flex flex-col gap-3 md:flex-row md:items-center md:justify-between", children: [
|
|
101
102
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-1", children: [
|
|
102
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.Heading, { level: "h1", children: "
|
|
103
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", className: "text-ui-fg-subtle", children: "View and manage all customer
|
|
103
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Heading, { level: "h1", children: "Return Orders" }),
|
|
104
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", className: "text-ui-fg-subtle", children: "View and manage all customer return orders" })
|
|
104
105
|
] }),
|
|
105
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.Button, { variant: "primary", onClick: () =>
|
|
106
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Button, { variant: "primary", onClick: () => loadReturns(0, true), children: "Refresh" })
|
|
106
107
|
] }),
|
|
107
108
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-3 md:flex-row md:items-center md:justify-between", children: [
|
|
108
109
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
109
110
|
ui.Input,
|
|
110
111
|
{
|
|
111
|
-
placeholder: "Search by
|
|
112
|
+
placeholder: "Search by return ID, order ID, or customer email",
|
|
112
113
|
value: searchQuery,
|
|
113
114
|
onChange: (event) => setSearchQuery(event.target.value),
|
|
114
115
|
className: "md:max-w-sm"
|
|
@@ -133,50 +134,51 @@ const SwapsPage = () => {
|
|
|
133
134
|
ui.Button,
|
|
134
135
|
{
|
|
135
136
|
variant: "secondary",
|
|
136
|
-
onClick: () =>
|
|
137
|
+
onClick: () => loadReturns(0, true),
|
|
137
138
|
children: "Try again"
|
|
138
139
|
}
|
|
139
140
|
) })
|
|
140
141
|
] }) : null,
|
|
141
|
-
isLoading ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex justify-center py-16", children: /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { children: "Loading
|
|
142
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.Heading, { level: "h3", className: "text-xl", children: "No
|
|
143
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", className: "mt-2 text-ui-fg-subtle", children: "
|
|
142
|
+
isLoading ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex justify-center py-16", children: /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { children: "Loading return orders..." }) }) : items.length === 0 ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "rounded-lg border border-dashed border-ui-border-strong p-10 text-center", children: [
|
|
143
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Heading, { level: "h3", className: "text-xl", children: "No return orders yet" }),
|
|
144
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", className: "mt-2 text-ui-fg-subtle", children: "Return orders created by customers will appear here." })
|
|
144
145
|
] }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "overflow-hidden rounded-xl border border-ui-border-base", children: /* @__PURE__ */ jsxRuntime.jsxs("table", { className: "min-w-full divide-y divide-ui-border-base", children: [
|
|
145
146
|
/* @__PURE__ */ jsxRuntime.jsx("thead", { className: "bg-ui-bg-subtle", children: /* @__PURE__ */ jsxRuntime.jsxs("tr", { children: [
|
|
146
|
-
/* @__PURE__ */ jsxRuntime.jsx("th", { className: "px-4 py-3 text-left text-xs font-semibold uppercase tracking-wide text-ui-fg-muted", children: "
|
|
147
|
+
/* @__PURE__ */ jsxRuntime.jsx("th", { className: "px-4 py-3 text-left text-xs font-semibold uppercase tracking-wide text-ui-fg-muted", children: "Return ID" }),
|
|
147
148
|
/* @__PURE__ */ jsxRuntime.jsx("th", { className: "px-4 py-3 text-left text-xs font-semibold uppercase tracking-wide text-ui-fg-muted", children: "Order ID" }),
|
|
149
|
+
/* @__PURE__ */ jsxRuntime.jsx("th", { className: "px-4 py-3 text-left text-xs font-semibold uppercase tracking-wide text-ui-fg-muted", children: "Customer" }),
|
|
148
150
|
/* @__PURE__ */ jsxRuntime.jsx("th", { className: "px-4 py-3 text-left text-xs font-semibold uppercase tracking-wide text-ui-fg-muted", children: "Status" }),
|
|
149
|
-
/* @__PURE__ */ jsxRuntime.jsx("th", { className: "px-4 py-3 text-left text-xs font-semibold uppercase tracking-wide text-ui-fg-muted", children: "
|
|
151
|
+
/* @__PURE__ */ jsxRuntime.jsx("th", { className: "px-4 py-3 text-left text-xs font-semibold uppercase tracking-wide text-ui-fg-muted", children: "Refund Amount" }),
|
|
150
152
|
/* @__PURE__ */ jsxRuntime.jsx("th", { className: "px-4 py-3 text-left text-xs font-semibold uppercase tracking-wide text-ui-fg-muted", children: "Created" }),
|
|
151
153
|
/* @__PURE__ */ jsxRuntime.jsx("th", { className: "px-4 py-3 text-left text-xs font-semibold uppercase tracking-wide text-ui-fg-muted", children: "Actions" })
|
|
152
154
|
] }) }),
|
|
153
|
-
/* @__PURE__ */ jsxRuntime.jsx("tbody", { className: "divide-y divide-ui-border-subtle", children: items.map((
|
|
155
|
+
/* @__PURE__ */ jsxRuntime.jsx("tbody", { className: "divide-y divide-ui-border-subtle", children: items.map((returnOrder) => /* @__PURE__ */ jsxRuntime.jsxs(
|
|
154
156
|
"tr",
|
|
155
157
|
{
|
|
156
158
|
className: "hover:bg-ui-bg-subtle/60 cursor-pointer",
|
|
157
|
-
onClick: () => navigate(`/
|
|
159
|
+
onClick: () => navigate(`/returns/${returnOrder.id}`),
|
|
158
160
|
children: [
|
|
159
|
-
/* @__PURE__ */ jsxRuntime.jsx("td", { className: "px-4 py-4 font-medium text-ui-fg-base", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-col gap-0.5", children: /* @__PURE__ */ jsxRuntime.jsx("span", { children:
|
|
160
|
-
/* @__PURE__ */ jsxRuntime.jsx("td", { className: "px-4 py-4 text-ui-fg-subtle", children:
|
|
161
|
+
/* @__PURE__ */ jsxRuntime.jsx("td", { className: "px-4 py-4 font-medium text-ui-fg-base", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-col gap-0.5", children: /* @__PURE__ */ jsxRuntime.jsx("span", { children: returnOrder.id }) }) }),
|
|
162
|
+
/* @__PURE__ */ jsxRuntime.jsx("td", { className: "px-4 py-4 text-ui-fg-subtle", children: returnOrder.order_id }),
|
|
163
|
+
/* @__PURE__ */ jsxRuntime.jsx("td", { className: "px-4 py-4 text-ui-fg-subtle", children: returnOrder.customer_email || returnOrder.order_email || "—" }),
|
|
161
164
|
/* @__PURE__ */ jsxRuntime.jsx("td", { className: "px-4 py-4", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
162
165
|
ui.Badge,
|
|
163
166
|
{
|
|
164
167
|
size: "2xsmall",
|
|
165
|
-
className: `uppercase ${getStatusBadgeClass$3(
|
|
166
|
-
children:
|
|
168
|
+
className: `uppercase ${getStatusBadgeClass$3(returnOrder.status)}`,
|
|
169
|
+
children: returnOrder.status.replace(/_/g, " ")
|
|
167
170
|
}
|
|
168
171
|
) }),
|
|
169
172
|
/* @__PURE__ */ jsxRuntime.jsx("td", { className: "px-4 py-4 text-ui-fg-subtle", children: (() => {
|
|
170
|
-
const amount =
|
|
173
|
+
const amount = returnOrder.refund_amount;
|
|
171
174
|
if (amount == null || amount === void 0) {
|
|
172
175
|
return "—";
|
|
173
176
|
}
|
|
174
177
|
const displayAmount = Number(amount) / 100;
|
|
175
|
-
const currency =
|
|
176
|
-
|
|
177
|
-
return `${sign}${currency}${displayAmount.toFixed(2)}`;
|
|
178
|
+
const currency = returnOrder.currency_code || "$";
|
|
179
|
+
return `${currency}${displayAmount.toFixed(2)}`;
|
|
178
180
|
})() }),
|
|
179
|
-
/* @__PURE__ */ jsxRuntime.jsx("td", { className: "px-4 py-4 text-ui-fg-subtle", children: new Date(
|
|
181
|
+
/* @__PURE__ */ jsxRuntime.jsx("td", { className: "px-4 py-4 text-ui-fg-subtle", children: new Date(returnOrder.created_at).toLocaleDateString("en-US", {
|
|
180
182
|
year: "numeric",
|
|
181
183
|
month: "short",
|
|
182
184
|
day: "numeric",
|
|
@@ -191,14 +193,14 @@ const SwapsPage = () => {
|
|
|
191
193
|
size: "small",
|
|
192
194
|
onClick: (e) => {
|
|
193
195
|
e.stopPropagation();
|
|
194
|
-
navigate(`/
|
|
196
|
+
navigate(`/returns/${returnOrder.id}`);
|
|
195
197
|
},
|
|
196
198
|
children: "View"
|
|
197
199
|
}
|
|
198
200
|
) })
|
|
199
201
|
]
|
|
200
202
|
},
|
|
201
|
-
|
|
203
|
+
returnOrder.id
|
|
202
204
|
)) })
|
|
203
205
|
] }) }),
|
|
204
206
|
hasMore ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex justify-center", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
@@ -206,14 +208,14 @@ const SwapsPage = () => {
|
|
|
206
208
|
{
|
|
207
209
|
variant: "secondary",
|
|
208
210
|
isLoading: isFetchingMore,
|
|
209
|
-
onClick: () =>
|
|
211
|
+
onClick: () => loadReturns(offset, false),
|
|
210
212
|
children: "Load more"
|
|
211
213
|
}
|
|
212
214
|
) }) : null
|
|
213
215
|
] }) });
|
|
214
216
|
};
|
|
215
217
|
const config$3 = adminSdk.defineRouteConfig({
|
|
216
|
-
label: "
|
|
218
|
+
label: "Return Orders",
|
|
217
219
|
icon: icons.ArrowPath
|
|
218
220
|
});
|
|
219
221
|
const useDebounce = (value, delay) => {
|
|
@@ -229,21 +231,21 @@ const getStatusBadgeClass$2 = (status) => {
|
|
|
229
231
|
if (statusLower === "requested") {
|
|
230
232
|
return "bg-ui-tag-orange-bg text-ui-tag-orange-text";
|
|
231
233
|
}
|
|
232
|
-
if (statusLower === "
|
|
234
|
+
if (statusLower === "approved") {
|
|
233
235
|
return "bg-ui-tag-blue-bg text-ui-tag-blue-text";
|
|
234
236
|
}
|
|
235
|
-
if (statusLower === "
|
|
237
|
+
if (statusLower === "rejected") {
|
|
236
238
|
return "bg-ui-tag-red-bg text-ui-tag-red-text";
|
|
237
239
|
}
|
|
238
240
|
if (statusLower === "completed") {
|
|
239
241
|
return "bg-ui-tag-green-bg text-ui-tag-green-text";
|
|
240
242
|
}
|
|
241
|
-
if (statusLower === "
|
|
243
|
+
if (statusLower === "cancelled") {
|
|
242
244
|
return "bg-ui-tag-grey-bg text-ui-tag-grey-text";
|
|
243
245
|
}
|
|
244
246
|
return "bg-ui-tag-purple-bg text-ui-tag-purple-text";
|
|
245
247
|
};
|
|
246
|
-
const
|
|
248
|
+
const SwapsPage = () => {
|
|
247
249
|
const navigate = reactRouterDom.useNavigate();
|
|
248
250
|
const [items, setItems] = react.useState([]);
|
|
249
251
|
const [statusFilter, setStatusFilter] = react.useState("all");
|
|
@@ -255,7 +257,7 @@ const ReturnsPage = () => {
|
|
|
255
257
|
const [offset, setOffset] = react.useState(0);
|
|
256
258
|
const [count, setCount] = react.useState(0);
|
|
257
259
|
const limit = 50;
|
|
258
|
-
const
|
|
260
|
+
const loadSwaps = react.useCallback(
|
|
259
261
|
async (nextOffset, replace = false) => {
|
|
260
262
|
var _a;
|
|
261
263
|
try {
|
|
@@ -272,25 +274,24 @@ const ReturnsPage = () => {
|
|
|
272
274
|
params.set("status", statusFilter);
|
|
273
275
|
}
|
|
274
276
|
if (debouncedSearchQuery.trim()) {
|
|
275
|
-
params.set("
|
|
277
|
+
params.set("order_id", debouncedSearchQuery.trim());
|
|
276
278
|
}
|
|
277
|
-
params.set("order", "created_at");
|
|
278
279
|
const response = await fetch(
|
|
279
|
-
`/admin/
|
|
280
|
+
`/admin/swaps?${params.toString()}`,
|
|
280
281
|
{ credentials: "include" }
|
|
281
282
|
);
|
|
282
283
|
if (!response.ok) {
|
|
283
284
|
const message = await response.text();
|
|
284
|
-
throw new Error(message || "Unable to load
|
|
285
|
+
throw new Error(message || "Unable to load swaps");
|
|
285
286
|
}
|
|
286
287
|
const payload = await response.json();
|
|
287
288
|
setCount(payload.count ?? 0);
|
|
288
|
-
setOffset(nextOffset + (((_a = payload.
|
|
289
|
+
setOffset(nextOffset + (((_a = payload.swaps) == null ? void 0 : _a.length) ?? 0));
|
|
289
290
|
setItems(
|
|
290
|
-
(prev) => replace ? payload.
|
|
291
|
+
(prev) => replace ? payload.swaps ?? [] : [...prev, ...payload.swaps ?? []]
|
|
291
292
|
);
|
|
292
293
|
} catch (loadError) {
|
|
293
|
-
const message = loadError instanceof Error ? loadError.message : "Unable to load
|
|
294
|
+
const message = loadError instanceof Error ? loadError.message : "Unable to load swaps";
|
|
294
295
|
setError(message);
|
|
295
296
|
} finally {
|
|
296
297
|
setIsLoading(false);
|
|
@@ -300,8 +301,8 @@ const ReturnsPage = () => {
|
|
|
300
301
|
[statusFilter, debouncedSearchQuery]
|
|
301
302
|
);
|
|
302
303
|
react.useEffect(() => {
|
|
303
|
-
void
|
|
304
|
-
}, [statusFilter, debouncedSearchQuery,
|
|
304
|
+
void loadSwaps(0, true);
|
|
305
|
+
}, [statusFilter, debouncedSearchQuery, loadSwaps]);
|
|
305
306
|
const hasMore = react.useMemo(() => offset < count, [offset, count]);
|
|
306
307
|
const availableStatuses = react.useMemo(() => {
|
|
307
308
|
const statuses = /* @__PURE__ */ new Set();
|
|
@@ -311,16 +312,16 @@ const ReturnsPage = () => {
|
|
|
311
312
|
return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-full p-6", children: /* @__PURE__ */ jsxRuntime.jsxs(ui.Container, { className: "mx-auto flex w-full max-w-7xl flex-col gap-6 p-6", children: [
|
|
312
313
|
/* @__PURE__ */ jsxRuntime.jsxs("header", { className: "flex flex-col gap-3 md:flex-row md:items-center md:justify-between", children: [
|
|
313
314
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-1", children: [
|
|
314
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.Heading, { level: "h1", children: "
|
|
315
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", className: "text-ui-fg-subtle", children: "View and manage all customer
|
|
315
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Heading, { level: "h1", children: "Swaps" }),
|
|
316
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", className: "text-ui-fg-subtle", children: "View and manage all customer swap requests" })
|
|
316
317
|
] }),
|
|
317
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.Button, { variant: "primary", onClick: () =>
|
|
318
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Button, { variant: "primary", onClick: () => loadSwaps(0, true), children: "Refresh" })
|
|
318
319
|
] }),
|
|
319
320
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-3 md:flex-row md:items-center md:justify-between", children: [
|
|
320
321
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
321
322
|
ui.Input,
|
|
322
323
|
{
|
|
323
|
-
placeholder: "Search by
|
|
324
|
+
placeholder: "Search by swap ID or order ID",
|
|
324
325
|
value: searchQuery,
|
|
325
326
|
onChange: (event) => setSearchQuery(event.target.value),
|
|
326
327
|
className: "md:max-w-sm"
|
|
@@ -345,51 +346,50 @@ const ReturnsPage = () => {
|
|
|
345
346
|
ui.Button,
|
|
346
347
|
{
|
|
347
348
|
variant: "secondary",
|
|
348
|
-
onClick: () =>
|
|
349
|
+
onClick: () => loadSwaps(0, true),
|
|
349
350
|
children: "Try again"
|
|
350
351
|
}
|
|
351
352
|
) })
|
|
352
353
|
] }) : null,
|
|
353
|
-
isLoading ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex justify-center py-16", children: /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { children: "Loading
|
|
354
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.Heading, { level: "h3", className: "text-xl", children: "No
|
|
355
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", className: "mt-2 text-ui-fg-subtle", children: "
|
|
354
|
+
isLoading ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex justify-center py-16", children: /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { children: "Loading swaps..." }) }) : items.length === 0 ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "rounded-lg border border-dashed border-ui-border-strong p-10 text-center", children: [
|
|
355
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Heading, { level: "h3", className: "text-xl", children: "No swaps yet" }),
|
|
356
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", className: "mt-2 text-ui-fg-subtle", children: "Swap requests created by customers will appear here." })
|
|
356
357
|
] }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "overflow-hidden rounded-xl border border-ui-border-base", children: /* @__PURE__ */ jsxRuntime.jsxs("table", { className: "min-w-full divide-y divide-ui-border-base", children: [
|
|
357
358
|
/* @__PURE__ */ jsxRuntime.jsx("thead", { className: "bg-ui-bg-subtle", children: /* @__PURE__ */ jsxRuntime.jsxs("tr", { children: [
|
|
358
|
-
/* @__PURE__ */ jsxRuntime.jsx("th", { className: "px-4 py-3 text-left text-xs font-semibold uppercase tracking-wide text-ui-fg-muted", children: "
|
|
359
|
+
/* @__PURE__ */ jsxRuntime.jsx("th", { className: "px-4 py-3 text-left text-xs font-semibold uppercase tracking-wide text-ui-fg-muted", children: "Swap ID" }),
|
|
359
360
|
/* @__PURE__ */ jsxRuntime.jsx("th", { className: "px-4 py-3 text-left text-xs font-semibold uppercase tracking-wide text-ui-fg-muted", children: "Order ID" }),
|
|
360
|
-
/* @__PURE__ */ jsxRuntime.jsx("th", { className: "px-4 py-3 text-left text-xs font-semibold uppercase tracking-wide text-ui-fg-muted", children: "Customer" }),
|
|
361
361
|
/* @__PURE__ */ jsxRuntime.jsx("th", { className: "px-4 py-3 text-left text-xs font-semibold uppercase tracking-wide text-ui-fg-muted", children: "Status" }),
|
|
362
|
-
/* @__PURE__ */ jsxRuntime.jsx("th", { className: "px-4 py-3 text-left text-xs font-semibold uppercase tracking-wide text-ui-fg-muted", children: "
|
|
362
|
+
/* @__PURE__ */ jsxRuntime.jsx("th", { className: "px-4 py-3 text-left text-xs font-semibold uppercase tracking-wide text-ui-fg-muted", children: "Difference Due" }),
|
|
363
363
|
/* @__PURE__ */ jsxRuntime.jsx("th", { className: "px-4 py-3 text-left text-xs font-semibold uppercase tracking-wide text-ui-fg-muted", children: "Created" }),
|
|
364
364
|
/* @__PURE__ */ jsxRuntime.jsx("th", { className: "px-4 py-3 text-left text-xs font-semibold uppercase tracking-wide text-ui-fg-muted", children: "Actions" })
|
|
365
365
|
] }) }),
|
|
366
|
-
/* @__PURE__ */ jsxRuntime.jsx("tbody", { className: "divide-y divide-ui-border-subtle", children: items.map((
|
|
366
|
+
/* @__PURE__ */ jsxRuntime.jsx("tbody", { className: "divide-y divide-ui-border-subtle", children: items.map((swap) => /* @__PURE__ */ jsxRuntime.jsxs(
|
|
367
367
|
"tr",
|
|
368
368
|
{
|
|
369
369
|
className: "hover:bg-ui-bg-subtle/60 cursor-pointer",
|
|
370
|
-
onClick: () => navigate(`/
|
|
370
|
+
onClick: () => navigate(`/swaps/${swap.id}`),
|
|
371
371
|
children: [
|
|
372
|
-
/* @__PURE__ */ jsxRuntime.jsx("td", { className: "px-4 py-4 font-medium text-ui-fg-base", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-col gap-0.5", children: /* @__PURE__ */ jsxRuntime.jsx("span", { children:
|
|
373
|
-
/* @__PURE__ */ jsxRuntime.jsx("td", { className: "px-4 py-4 text-ui-fg-subtle", children:
|
|
374
|
-
/* @__PURE__ */ jsxRuntime.jsx("td", { className: "px-4 py-4 text-ui-fg-subtle", children: returnOrder.customer_email || returnOrder.order_email || "—" }),
|
|
372
|
+
/* @__PURE__ */ jsxRuntime.jsx("td", { className: "px-4 py-4 font-medium text-ui-fg-base", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-col gap-0.5", children: /* @__PURE__ */ jsxRuntime.jsx("span", { children: swap.id }) }) }),
|
|
373
|
+
/* @__PURE__ */ jsxRuntime.jsx("td", { className: "px-4 py-4 text-ui-fg-subtle", children: swap.order_id }),
|
|
375
374
|
/* @__PURE__ */ jsxRuntime.jsx("td", { className: "px-4 py-4", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
376
375
|
ui.Badge,
|
|
377
376
|
{
|
|
378
377
|
size: "2xsmall",
|
|
379
|
-
className: `uppercase ${getStatusBadgeClass$2(
|
|
380
|
-
children:
|
|
378
|
+
className: `uppercase ${getStatusBadgeClass$2(swap.status)}`,
|
|
379
|
+
children: swap.status.replace(/_/g, " ")
|
|
381
380
|
}
|
|
382
381
|
) }),
|
|
383
382
|
/* @__PURE__ */ jsxRuntime.jsx("td", { className: "px-4 py-4 text-ui-fg-subtle", children: (() => {
|
|
384
|
-
const amount =
|
|
383
|
+
const amount = swap.difference_due;
|
|
385
384
|
if (amount == null || amount === void 0) {
|
|
386
385
|
return "—";
|
|
387
386
|
}
|
|
388
387
|
const displayAmount = Number(amount) / 100;
|
|
389
|
-
const currency =
|
|
390
|
-
|
|
388
|
+
const currency = swap.currency_code || "$";
|
|
389
|
+
const sign = displayAmount >= 0 ? "+" : "";
|
|
390
|
+
return `${sign}${currency}${displayAmount.toFixed(2)}`;
|
|
391
391
|
})() }),
|
|
392
|
-
/* @__PURE__ */ jsxRuntime.jsx("td", { className: "px-4 py-4 text-ui-fg-subtle", children: new Date(
|
|
392
|
+
/* @__PURE__ */ jsxRuntime.jsx("td", { className: "px-4 py-4 text-ui-fg-subtle", children: new Date(swap.created_at).toLocaleDateString("en-US", {
|
|
393
393
|
year: "numeric",
|
|
394
394
|
month: "short",
|
|
395
395
|
day: "numeric",
|
|
@@ -404,14 +404,14 @@ const ReturnsPage = () => {
|
|
|
404
404
|
size: "small",
|
|
405
405
|
onClick: (e) => {
|
|
406
406
|
e.stopPropagation();
|
|
407
|
-
navigate(`/
|
|
407
|
+
navigate(`/swaps/${swap.id}`);
|
|
408
408
|
},
|
|
409
409
|
children: "View"
|
|
410
410
|
}
|
|
411
411
|
) })
|
|
412
412
|
]
|
|
413
413
|
},
|
|
414
|
-
|
|
414
|
+
swap.id
|
|
415
415
|
)) })
|
|
416
416
|
] }) }),
|
|
417
417
|
hasMore ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex justify-center", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
@@ -419,14 +419,14 @@ const ReturnsPage = () => {
|
|
|
419
419
|
{
|
|
420
420
|
variant: "secondary",
|
|
421
421
|
isLoading: isFetchingMore,
|
|
422
|
-
onClick: () =>
|
|
422
|
+
onClick: () => loadSwaps(offset, false),
|
|
423
423
|
children: "Load more"
|
|
424
424
|
}
|
|
425
425
|
) }) : null
|
|
426
426
|
] }) });
|
|
427
427
|
};
|
|
428
428
|
const config$2 = adminSdk.defineRouteConfig({
|
|
429
|
-
label: "
|
|
429
|
+
label: "Swaps",
|
|
430
430
|
icon: icons.ArrowPath
|
|
431
431
|
});
|
|
432
432
|
const getStatusBadgeClass$1 = (status) => {
|
|
@@ -434,63 +434,65 @@ const getStatusBadgeClass$1 = (status) => {
|
|
|
434
434
|
if (statusLower === "requested") {
|
|
435
435
|
return "bg-ui-tag-orange-bg text-ui-tag-orange-text";
|
|
436
436
|
}
|
|
437
|
-
if (statusLower === "
|
|
437
|
+
if (statusLower === "received") {
|
|
438
438
|
return "bg-ui-tag-blue-bg text-ui-tag-blue-text";
|
|
439
439
|
}
|
|
440
|
-
if (statusLower === "
|
|
440
|
+
if (statusLower === "requires_action") {
|
|
441
441
|
return "bg-ui-tag-red-bg text-ui-tag-red-text";
|
|
442
442
|
}
|
|
443
443
|
if (statusLower === "completed") {
|
|
444
444
|
return "bg-ui-tag-green-bg text-ui-tag-green-text";
|
|
445
445
|
}
|
|
446
|
-
if (statusLower === "
|
|
446
|
+
if (statusLower === "canceled") {
|
|
447
447
|
return "bg-ui-tag-grey-bg text-ui-tag-grey-text";
|
|
448
448
|
}
|
|
449
449
|
return "bg-ui-tag-purple-bg text-ui-tag-purple-text";
|
|
450
450
|
};
|
|
451
|
-
const
|
|
452
|
-
var _a, _b;
|
|
451
|
+
const ReturnDetailPage = () => {
|
|
452
|
+
var _a, _b, _c;
|
|
453
453
|
const navigate = reactRouterDom.useNavigate();
|
|
454
454
|
const { id } = reactRouterDom.useParams();
|
|
455
|
-
const [
|
|
456
|
-
const [order, setOrder] = react.useState(null);
|
|
455
|
+
const [returnOrder, setReturnOrder] = react.useState(null);
|
|
457
456
|
const [selectedStatus, setSelectedStatus] = react.useState("");
|
|
458
457
|
const [isLoading, setIsLoading] = react.useState(true);
|
|
459
458
|
const [isUpdating, setIsUpdating] = react.useState(false);
|
|
460
|
-
const [isApproving, setIsApproving] = react.useState(false);
|
|
461
|
-
const [isRejecting, setIsRejecting] = react.useState(false);
|
|
462
459
|
const [error, setError] = react.useState(null);
|
|
463
460
|
const [updateError, setUpdateError] = react.useState(null);
|
|
464
461
|
const [updateSuccess, setUpdateSuccess] = react.useState(false);
|
|
465
|
-
const availableStatuses = [
|
|
462
|
+
const availableStatuses = [
|
|
463
|
+
"requested",
|
|
464
|
+
"received",
|
|
465
|
+
"requires_action",
|
|
466
|
+
"completed",
|
|
467
|
+
"canceled"
|
|
468
|
+
];
|
|
466
469
|
react.useEffect(() => {
|
|
467
470
|
if (!id) {
|
|
468
|
-
navigate("/
|
|
471
|
+
navigate("/returns");
|
|
469
472
|
return;
|
|
470
473
|
}
|
|
471
|
-
const
|
|
474
|
+
const loadReturn = async () => {
|
|
472
475
|
try {
|
|
473
476
|
setIsLoading(true);
|
|
474
477
|
setError(null);
|
|
475
|
-
const response = await fetch(`/admin/
|
|
478
|
+
const response = await fetch(`/admin/returns/${id}`, {
|
|
476
479
|
credentials: "include"
|
|
477
480
|
});
|
|
478
481
|
if (!response.ok) {
|
|
479
482
|
const message = await response.text();
|
|
480
|
-
throw new Error(message || "Unable to load
|
|
483
|
+
throw new Error(message || "Unable to load return order");
|
|
481
484
|
}
|
|
482
485
|
const payload = await response.json();
|
|
483
|
-
|
|
484
|
-
setOrder(payload.order || null);
|
|
486
|
+
setReturnOrder(payload.return);
|
|
485
487
|
setSelectedStatus("");
|
|
486
488
|
} catch (loadError) {
|
|
487
|
-
const message = loadError instanceof Error ? loadError.message : "Unable to load
|
|
489
|
+
const message = loadError instanceof Error ? loadError.message : "Unable to load return order";
|
|
488
490
|
setError(message);
|
|
489
491
|
} finally {
|
|
490
492
|
setIsLoading(false);
|
|
491
493
|
}
|
|
492
494
|
};
|
|
493
|
-
void
|
|
495
|
+
void loadReturn();
|
|
494
496
|
}, [id, navigate]);
|
|
495
497
|
const handleStatusUpdate = async () => {
|
|
496
498
|
if (!id || !selectedStatus) {
|
|
@@ -500,7 +502,7 @@ const SwapDetailPage = () => {
|
|
|
500
502
|
setIsUpdating(true);
|
|
501
503
|
setUpdateError(null);
|
|
502
504
|
setUpdateSuccess(false);
|
|
503
|
-
const response = await fetch(`/admin/
|
|
505
|
+
const response = await fetch(`/admin/returns/${id}/status`, {
|
|
504
506
|
method: "POST",
|
|
505
507
|
headers: {
|
|
506
508
|
"Content-Type": "application/json"
|
|
@@ -513,17 +515,16 @@ const SwapDetailPage = () => {
|
|
|
513
515
|
throw new Error(message || "Unable to update status");
|
|
514
516
|
}
|
|
515
517
|
const payload = await response.json();
|
|
516
|
-
|
|
518
|
+
setReturnOrder(payload.return);
|
|
517
519
|
setSelectedStatus("");
|
|
518
520
|
setUpdateSuccess(true);
|
|
519
521
|
setTimeout(() => setUpdateSuccess(false), 3e3);
|
|
520
|
-
const detailResponse = await fetch(`/admin/
|
|
522
|
+
const detailResponse = await fetch(`/admin/returns/${id}`, {
|
|
521
523
|
credentials: "include"
|
|
522
524
|
});
|
|
523
525
|
if (detailResponse.ok) {
|
|
524
526
|
const detailPayload = await detailResponse.json();
|
|
525
|
-
|
|
526
|
-
setOrder(detailPayload.order || null);
|
|
527
|
+
setReturnOrder(detailPayload.return);
|
|
527
528
|
}
|
|
528
529
|
} catch (updateErr) {
|
|
529
530
|
const message = updateErr instanceof Error ? updateErr.message : "Unable to update status";
|
|
@@ -532,93 +533,16 @@ const SwapDetailPage = () => {
|
|
|
532
533
|
setIsUpdating(false);
|
|
533
534
|
}
|
|
534
535
|
};
|
|
535
|
-
const handleAutoCreateExchange = async () => {
|
|
536
|
-
if (!id) {
|
|
537
|
-
return;
|
|
538
|
-
}
|
|
539
|
-
try {
|
|
540
|
-
setIsApproving(true);
|
|
541
|
-
setUpdateError(null);
|
|
542
|
-
setUpdateSuccess(false);
|
|
543
|
-
const response = await fetch(`/admin/swaps/${id}/create-exchange`, {
|
|
544
|
-
method: "POST",
|
|
545
|
-
headers: {
|
|
546
|
-
"Content-Type": "application/json"
|
|
547
|
-
},
|
|
548
|
-
credentials: "include"
|
|
549
|
-
});
|
|
550
|
-
if (!response.ok) {
|
|
551
|
-
const message = await response.text();
|
|
552
|
-
throw new Error(message || "Unable to create exchange from swap");
|
|
553
|
-
}
|
|
554
|
-
const payload = await response.json();
|
|
555
|
-
setSwap(payload.swap);
|
|
556
|
-
setUpdateSuccess(true);
|
|
557
|
-
setTimeout(() => setUpdateSuccess(false), 3e3);
|
|
558
|
-
const detailResponse = await fetch(`/admin/swaps/${id}`, {
|
|
559
|
-
credentials: "include"
|
|
560
|
-
});
|
|
561
|
-
if (detailResponse.ok) {
|
|
562
|
-
const detailPayload = await detailResponse.json();
|
|
563
|
-
setSwap(detailPayload.swap);
|
|
564
|
-
setOrder(detailPayload.order || null);
|
|
565
|
-
}
|
|
566
|
-
} catch (approveErr) {
|
|
567
|
-
const message = approveErr instanceof Error ? approveErr.message : "Unable to create exchange from swap";
|
|
568
|
-
setUpdateError(message);
|
|
569
|
-
} finally {
|
|
570
|
-
setIsApproving(false);
|
|
571
|
-
}
|
|
572
|
-
};
|
|
573
|
-
const handleReject = async () => {
|
|
574
|
-
if (!id) {
|
|
575
|
-
return;
|
|
576
|
-
}
|
|
577
|
-
try {
|
|
578
|
-
setIsRejecting(true);
|
|
579
|
-
setUpdateError(null);
|
|
580
|
-
setUpdateSuccess(false);
|
|
581
|
-
const response = await fetch(`/admin/swaps/${id}/reject`, {
|
|
582
|
-
method: "POST",
|
|
583
|
-
headers: {
|
|
584
|
-
"Content-Type": "application/json"
|
|
585
|
-
},
|
|
586
|
-
credentials: "include",
|
|
587
|
-
body: JSON.stringify({ reason: "Rejected by admin" })
|
|
588
|
-
});
|
|
589
|
-
if (!response.ok) {
|
|
590
|
-
const message = await response.text();
|
|
591
|
-
throw new Error(message || "Unable to reject swap");
|
|
592
|
-
}
|
|
593
|
-
const payload = await response.json();
|
|
594
|
-
setSwap(payload.swap);
|
|
595
|
-
setUpdateSuccess(true);
|
|
596
|
-
setTimeout(() => setUpdateSuccess(false), 3e3);
|
|
597
|
-
const detailResponse = await fetch(`/admin/swaps/${id}`, {
|
|
598
|
-
credentials: "include"
|
|
599
|
-
});
|
|
600
|
-
if (detailResponse.ok) {
|
|
601
|
-
const detailPayload = await response.json();
|
|
602
|
-
setSwap(detailPayload.swap);
|
|
603
|
-
setOrder(detailPayload.order || null);
|
|
604
|
-
}
|
|
605
|
-
} catch (updateErr) {
|
|
606
|
-
const message = updateErr instanceof Error ? updateErr.message : "Unable to reject swap";
|
|
607
|
-
setUpdateError(message);
|
|
608
|
-
} finally {
|
|
609
|
-
setIsRejecting(false);
|
|
610
|
-
}
|
|
611
|
-
};
|
|
612
536
|
if (isLoading) {
|
|
613
|
-
return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-full p-6", children: /* @__PURE__ */ jsxRuntime.jsx(ui.Container, { className: "mx-auto flex w-full max-w-5xl flex-col gap-6 p-6", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex justify-center py-16", children: /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { children: "Loading
|
|
537
|
+
return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-full p-6", children: /* @__PURE__ */ jsxRuntime.jsx(ui.Container, { className: "mx-auto flex w-full max-w-5xl flex-col gap-6 p-6", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex justify-center py-16", children: /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { children: "Loading return order..." }) }) }) });
|
|
614
538
|
}
|
|
615
|
-
if (error || !
|
|
539
|
+
if (error || !returnOrder) {
|
|
616
540
|
return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-full p-6", children: /* @__PURE__ */ jsxRuntime.jsx(ui.Container, { className: "mx-auto flex w-full max-w-5xl flex-col gap-6 p-6", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "rounded-lg border border-ui-border-strong p-6 text-center", children: [
|
|
617
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { weight: "plus", className: "text-ui-fg-error", children: error || "
|
|
618
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-4 flex justify-center", children: /* @__PURE__ */ jsxRuntime.jsx(ui.Button, { variant: "secondary", onClick: () => navigate("/
|
|
541
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { weight: "plus", className: "text-ui-fg-error", children: error || "Return order not found" }),
|
|
542
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-4 flex justify-center", children: /* @__PURE__ */ jsxRuntime.jsx(ui.Button, { variant: "secondary", onClick: () => navigate("/returns"), children: "Back to list" }) })
|
|
619
543
|
] }) }) });
|
|
620
544
|
}
|
|
621
|
-
const statusHistory = ((_a =
|
|
545
|
+
const statusHistory = ((_a = returnOrder.metadata) == null ? void 0 : _a.status_history) || [];
|
|
622
546
|
return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-full p-6", children: /* @__PURE__ */ jsxRuntime.jsxs(ui.Container, { className: "mx-auto flex w-full max-w-5xl flex-col gap-6 p-6", children: [
|
|
623
547
|
/* @__PURE__ */ jsxRuntime.jsxs("header", { className: "flex flex-col gap-3", children: [
|
|
624
548
|
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
@@ -626,7 +550,7 @@ const SwapDetailPage = () => {
|
|
|
626
550
|
{
|
|
627
551
|
variant: "transparent",
|
|
628
552
|
size: "small",
|
|
629
|
-
onClick: () => navigate("/
|
|
553
|
+
onClick: () => navigate("/returns"),
|
|
630
554
|
className: "w-fit",
|
|
631
555
|
children: [
|
|
632
556
|
/* @__PURE__ */ jsxRuntime.jsx(icons.ArrowLeft, { className: "mr-2" }),
|
|
@@ -636,45 +560,20 @@ const SwapDetailPage = () => {
|
|
|
636
560
|
),
|
|
637
561
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-1 md:flex-row md:items-center md:justify-between", children: [
|
|
638
562
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-1", children: [
|
|
639
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.Heading, { level: "h1", children: "
|
|
640
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", className: "text-ui-fg-subtle", children:
|
|
563
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Heading, { level: "h1", children: "Return Order Details" }),
|
|
564
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", className: "text-ui-fg-subtle", children: returnOrder.id })
|
|
641
565
|
] }),
|
|
642
566
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
643
567
|
ui.Badge,
|
|
644
568
|
{
|
|
645
569
|
size: "small",
|
|
646
|
-
className: `uppercase ${getStatusBadgeClass$1(
|
|
647
|
-
children:
|
|
570
|
+
className: `uppercase ${getStatusBadgeClass$1(returnOrder.status)}`,
|
|
571
|
+
children: returnOrder.status.replace("_", " ")
|
|
648
572
|
}
|
|
649
573
|
)
|
|
650
574
|
] })
|
|
651
575
|
] }),
|
|
652
|
-
|
|
653
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex gap-3", children: [
|
|
654
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
655
|
-
ui.Button,
|
|
656
|
-
{
|
|
657
|
-
variant: "primary",
|
|
658
|
-
onClick: handleAutoCreateExchange,
|
|
659
|
-
disabled: isApproving || isRejecting,
|
|
660
|
-
isLoading: isApproving,
|
|
661
|
-
children: "Approve & Create Exchange"
|
|
662
|
-
}
|
|
663
|
-
),
|
|
664
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
665
|
-
ui.Button,
|
|
666
|
-
{
|
|
667
|
-
variant: "danger",
|
|
668
|
-
onClick: handleReject,
|
|
669
|
-
disabled: isApproving || isRejecting,
|
|
670
|
-
isLoading: isRejecting,
|
|
671
|
-
children: "Reject Swap"
|
|
672
|
-
}
|
|
673
|
-
)
|
|
674
|
-
] }),
|
|
675
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", className: "text-ui-fg-subtle", children: "Approving will automatically create an exchange with return items and new items from the swap request" })
|
|
676
|
-
] }),
|
|
677
|
-
swap.status === "requested" && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "rounded-lg border border-ui-border-base bg-ui-bg-base p-6", children: [
|
|
576
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "rounded-lg border border-ui-border-base bg-ui-bg-base p-6", children: [
|
|
678
577
|
/* @__PURE__ */ jsxRuntime.jsx(ui.Heading, { level: "h2", className: "mb-4 text-lg", children: "Update Status" }),
|
|
679
578
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-3 md:flex-row md:items-end", children: [
|
|
680
579
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex-1", children: [
|
|
@@ -687,7 +586,7 @@ const SwapDetailPage = () => {
|
|
|
687
586
|
className: "h-9 w-full rounded-md border border-ui-border-base bg-transparent px-3 text-sm text-ui-fg-base outline-none transition focus:ring-2 focus:ring-ui-fg-interactive",
|
|
688
587
|
children: [
|
|
689
588
|
/* @__PURE__ */ jsxRuntime.jsx("option", { value: "", children: "Select new status" }),
|
|
690
|
-
availableStatuses.filter((status) => status !==
|
|
589
|
+
availableStatuses.filter((status) => status !== returnOrder.status).map((status) => /* @__PURE__ */ jsxRuntime.jsx("option", { value: status, children: status.replace("_", " ").toUpperCase() }, status))
|
|
691
590
|
]
|
|
692
591
|
}
|
|
693
592
|
)
|
|
@@ -706,60 +605,37 @@ const SwapDetailPage = () => {
|
|
|
706
605
|
updateError && /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", className: "mt-2 text-ui-fg-error", children: updateError }),
|
|
707
606
|
updateSuccess && /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", className: "mt-2 text-ui-fg-success", children: "Status updated successfully" })
|
|
708
607
|
] }),
|
|
709
|
-
swap.status === "approved" && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "rounded-lg border border-ui-border-base bg-ui-bg-base p-6", children: [
|
|
710
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.Heading, { level: "h2", className: "mb-4 text-lg", children: "Exchange Information" }),
|
|
711
|
-
swap.exchange_id ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-3", children: [
|
|
712
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
713
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", className: "text-ui-fg-subtle", children: "Exchange ID" }),
|
|
714
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { className: "font-medium", children: swap.exchange_id })
|
|
715
|
-
] }),
|
|
716
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
717
|
-
ui.Button,
|
|
718
|
-
{
|
|
719
|
-
variant: "secondary",
|
|
720
|
-
onClick: () => {
|
|
721
|
-
window.open(`/app/orders/${swap.order_id}/exchanges/${swap.exchange_id}`, "_blank");
|
|
722
|
-
},
|
|
723
|
-
children: "View Exchange"
|
|
724
|
-
}
|
|
725
|
-
) })
|
|
726
|
-
] }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "space-y-3", children: /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", className: "text-ui-fg-subtle", children: "Exchange is being created. Please refresh the page to see the exchange details." }) })
|
|
727
|
-
] }),
|
|
728
608
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid gap-6 md:grid-cols-2", children: [
|
|
729
609
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "rounded-lg border border-ui-border-base bg-ui-bg-base p-6", children: [
|
|
730
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.Heading, { level: "h2", className: "mb-4 text-lg", children: "
|
|
610
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Heading, { level: "h2", className: "mb-4 text-lg", children: "Return Information" }),
|
|
731
611
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-3", children: [
|
|
732
612
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
733
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", className: "text-ui-fg-subtle", children: "
|
|
734
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { className: "font-medium", children:
|
|
613
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", className: "text-ui-fg-subtle", children: "Return ID" }),
|
|
614
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { className: "font-medium", children: returnOrder.id })
|
|
735
615
|
] }),
|
|
736
616
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
737
617
|
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", className: "text-ui-fg-subtle", children: "Status" }),
|
|
738
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { className: "font-medium", children:
|
|
618
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { className: "font-medium", children: returnOrder.status })
|
|
739
619
|
] }),
|
|
740
620
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
741
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", className: "text-ui-fg-subtle", children: "
|
|
742
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { className: "font-medium", children:
|
|
621
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", className: "text-ui-fg-subtle", children: "Refund Amount" }),
|
|
622
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { className: "font-medium", children: returnOrder.refund_amount ? `${((_b = returnOrder.order) == null ? void 0 : _b.currency_code) || "$"}${Number(returnOrder.refund_amount).toFixed(2)}` : "—" })
|
|
743
623
|
] }),
|
|
744
|
-
|
|
624
|
+
returnOrder.reason && /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
745
625
|
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", className: "text-ui-fg-subtle", children: "Reason" }),
|
|
746
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { className: "font-medium", children:
|
|
626
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { className: "font-medium", children: returnOrder.reason })
|
|
747
627
|
] }),
|
|
748
|
-
|
|
628
|
+
returnOrder.note && /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
749
629
|
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", className: "text-ui-fg-subtle", children: "Note" }),
|
|
750
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { className: "font-medium", children:
|
|
630
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { className: "font-medium", children: returnOrder.note })
|
|
751
631
|
] }),
|
|
752
632
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
753
633
|
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", className: "text-ui-fg-subtle", children: "Created" }),
|
|
754
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { className: "font-medium", children: new Date(
|
|
634
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { className: "font-medium", children: new Date(returnOrder.created_at).toLocaleString() })
|
|
755
635
|
] }),
|
|
756
636
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
757
637
|
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", className: "text-ui-fg-subtle", children: "Last Updated" }),
|
|
758
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { className: "font-medium", children: new Date(
|
|
759
|
-
] }),
|
|
760
|
-
swap.exchange_id && /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
761
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", className: "text-ui-fg-subtle", children: "Exchange ID" }),
|
|
762
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { className: "font-medium", children: swap.exchange_id })
|
|
638
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { className: "font-medium", children: new Date(returnOrder.updated_at).toLocaleString() })
|
|
763
639
|
] })
|
|
764
640
|
] })
|
|
765
641
|
] }),
|
|
@@ -770,18 +646,23 @@ const SwapDetailPage = () => {
|
|
|
770
646
|
{
|
|
771
647
|
className: "flex items-center justify-between border-b border-ui-border-subtle pb-2 last:border-0",
|
|
772
648
|
children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-1", children: [
|
|
773
|
-
/* @__PURE__ */ jsxRuntime.
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
|
|
649
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
|
|
650
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
651
|
+
ui.Badge,
|
|
652
|
+
{
|
|
653
|
+
size: "2xsmall",
|
|
654
|
+
className: `uppercase ${getStatusBadgeClass$1(entry.to)}`,
|
|
655
|
+
children: entry.to.replace("_", " ")
|
|
656
|
+
}
|
|
657
|
+
),
|
|
658
|
+
entry.from && /* @__PURE__ */ jsxRuntime.jsxs(ui.Text, { size: "small", className: "text-ui-fg-subtle", children: [
|
|
659
|
+
"from ",
|
|
660
|
+
entry.from.replace("_", " ")
|
|
661
|
+
] })
|
|
662
|
+
] }),
|
|
781
663
|
/* @__PURE__ */ jsxRuntime.jsxs(ui.Text, { size: "small", className: "text-ui-fg-subtle", children: [
|
|
782
|
-
new Date(entry.
|
|
783
|
-
entry.
|
|
784
|
-
entry.reason && ` - ${entry.reason}`
|
|
664
|
+
new Date(entry.changed_at).toLocaleString(),
|
|
665
|
+
entry.changed_by && ` by ${entry.changed_by}`
|
|
785
666
|
] })
|
|
786
667
|
] })
|
|
787
668
|
},
|
|
@@ -789,62 +670,76 @@ const SwapDetailPage = () => {
|
|
|
789
670
|
)) }) : /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", className: "text-ui-fg-subtle", children: "No status history available" })
|
|
790
671
|
] })
|
|
791
672
|
] }),
|
|
792
|
-
order && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "rounded-lg border border-ui-border-base bg-ui-bg-base p-6", children: [
|
|
673
|
+
returnOrder.order && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "rounded-lg border border-ui-border-base bg-ui-bg-base p-6", children: [
|
|
793
674
|
/* @__PURE__ */ jsxRuntime.jsx(ui.Heading, { level: "h2", className: "mb-4 text-lg", children: "Related Order Information" }),
|
|
794
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "
|
|
795
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
796
|
-
/* @__PURE__ */ jsxRuntime.
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
|
|
800
|
-
/* @__PURE__ */ jsxRuntime.
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
/* @__PURE__ */ jsxRuntime.
|
|
805
|
-
|
|
675
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid gap-6 md:grid-cols-2", children: [
|
|
676
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-3", children: [
|
|
677
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
678
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", className: "text-ui-fg-subtle", children: "Order ID" }),
|
|
679
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { className: "font-medium", children: returnOrder.order.id })
|
|
680
|
+
] }),
|
|
681
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
682
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", className: "text-ui-fg-subtle", children: "Order Status" }),
|
|
683
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { className: "font-medium", children: returnOrder.order.status || "—" })
|
|
684
|
+
] }),
|
|
685
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
686
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", className: "text-ui-fg-subtle", children: "Customer" }),
|
|
687
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { className: "font-medium", children: ((_c = returnOrder.order.customer) == null ? void 0 : _c.email) || returnOrder.order.email || "—" })
|
|
688
|
+
] }),
|
|
689
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
690
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", className: "text-ui-fg-subtle", children: "Order Total" }),
|
|
691
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { className: "font-medium", children: returnOrder.order.total ? `${returnOrder.order.currency_code || "$"}${Number(returnOrder.order.total).toFixed(2)}` : "—" })
|
|
692
|
+
] })
|
|
806
693
|
] }),
|
|
807
|
-
|
|
808
|
-
/* @__PURE__ */ jsxRuntime.
|
|
809
|
-
|
|
810
|
-
order.currency_code || "$"
|
|
811
|
-
|
|
694
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-3", children: [
|
|
695
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
696
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", className: "text-ui-fg-subtle", children: "Subtotal" }),
|
|
697
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { className: "font-medium", children: returnOrder.order.subtotal ? `${returnOrder.order.currency_code || "$"}${Number(returnOrder.order.subtotal).toFixed(2)}` : "—" })
|
|
698
|
+
] }),
|
|
699
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
700
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", className: "text-ui-fg-subtle", children: "Tax Total" }),
|
|
701
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { className: "font-medium", children: returnOrder.order.tax_total ? `${returnOrder.order.currency_code || "$"}${Number(returnOrder.order.tax_total).toFixed(2)}` : "—" })
|
|
702
|
+
] }),
|
|
703
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
704
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", className: "text-ui-fg-subtle", children: "Shipping Total" }),
|
|
705
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { className: "font-medium", children: returnOrder.order.shipping_total ? `${returnOrder.order.currency_code || "$"}${Number(returnOrder.order.shipping_total).toFixed(2)}` : "—" })
|
|
706
|
+
] }),
|
|
707
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
708
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", className: "text-ui-fg-subtle", children: "Order Created" }),
|
|
709
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { className: "font-medium", children: returnOrder.order.created_at ? new Date(returnOrder.order.created_at).toLocaleString() : "—" })
|
|
812
710
|
] })
|
|
813
711
|
] })
|
|
814
712
|
] })
|
|
815
713
|
] }),
|
|
816
|
-
|
|
714
|
+
returnOrder.items && returnOrder.items.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "rounded-lg border border-ui-border-base bg-ui-bg-base p-6", children: [
|
|
817
715
|
/* @__PURE__ */ jsxRuntime.jsx(ui.Heading, { level: "h2", className: "mb-4 text-lg", children: "Return Items" }),
|
|
818
716
|
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "overflow-hidden rounded-xl border border-ui-border-base", children: /* @__PURE__ */ jsxRuntime.jsxs("table", { className: "min-w-full divide-y divide-ui-border-base", children: [
|
|
819
717
|
/* @__PURE__ */ jsxRuntime.jsx("thead", { className: "bg-ui-bg-subtle", children: /* @__PURE__ */ jsxRuntime.jsxs("tr", { children: [
|
|
820
|
-
/* @__PURE__ */ jsxRuntime.jsx("th", { className: "px-4 py-3 text-left text-xs font-semibold uppercase tracking-wide text-ui-fg-muted", children: "Item
|
|
821
|
-
/* @__PURE__ */ jsxRuntime.jsx("th", { className: "px-4 py-3 text-left text-xs font-semibold uppercase tracking-wide text-ui-fg-muted", children: "Quantity" }),
|
|
822
|
-
/* @__PURE__ */ jsxRuntime.jsx("th", { className: "px-4 py-3 text-left text-xs font-semibold uppercase tracking-wide text-ui-fg-muted", children: "Reason" })
|
|
823
|
-
] }) }),
|
|
824
|
-
/* @__PURE__ */ jsxRuntime.jsx("tbody", { className: "divide-y divide-ui-border-subtle", children: swap.return_items.map((item, index) => /* @__PURE__ */ jsxRuntime.jsxs("tr", { children: [
|
|
825
|
-
/* @__PURE__ */ jsxRuntime.jsx("td", { className: "px-4 py-4 font-medium text-ui-fg-base", children: item.id }),
|
|
826
|
-
/* @__PURE__ */ jsxRuntime.jsx("td", { className: "px-4 py-4 text-ui-fg-subtle", children: item.quantity }),
|
|
827
|
-
/* @__PURE__ */ jsxRuntime.jsx("td", { className: "px-4 py-4 text-ui-fg-subtle", children: item.reason || "—" })
|
|
828
|
-
] }, item.id || index)) })
|
|
829
|
-
] }) })
|
|
830
|
-
] }),
|
|
831
|
-
swap.new_items && swap.new_items.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "rounded-lg border border-ui-border-base bg-ui-bg-base p-6", children: [
|
|
832
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.Heading, { level: "h2", className: "mb-4 text-lg", children: "New Items" }),
|
|
833
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "overflow-hidden rounded-xl border border-ui-border-base", children: /* @__PURE__ */ jsxRuntime.jsxs("table", { className: "min-w-full divide-y divide-ui-border-base", children: [
|
|
834
|
-
/* @__PURE__ */ jsxRuntime.jsx("thead", { className: "bg-ui-bg-subtle", children: /* @__PURE__ */ jsxRuntime.jsxs("tr", { children: [
|
|
835
|
-
/* @__PURE__ */ jsxRuntime.jsx("th", { className: "px-4 py-3 text-left text-xs font-semibold uppercase tracking-wide text-ui-fg-muted", children: "Variant ID" }),
|
|
718
|
+
/* @__PURE__ */ jsxRuntime.jsx("th", { className: "px-4 py-3 text-left text-xs font-semibold uppercase tracking-wide text-ui-fg-muted", children: "Item" }),
|
|
836
719
|
/* @__PURE__ */ jsxRuntime.jsx("th", { className: "px-4 py-3 text-left text-xs font-semibold uppercase tracking-wide text-ui-fg-muted", children: "Quantity" })
|
|
837
720
|
] }) }),
|
|
838
|
-
/* @__PURE__ */ jsxRuntime.jsx("tbody", { className: "divide-y divide-ui-border-subtle", children:
|
|
839
|
-
|
|
840
|
-
/* @__PURE__ */ jsxRuntime.
|
|
841
|
-
|
|
721
|
+
/* @__PURE__ */ jsxRuntime.jsx("tbody", { className: "divide-y divide-ui-border-subtle", children: returnOrder.items.map((item) => {
|
|
722
|
+
var _a2, _b2;
|
|
723
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("tr", { children: [
|
|
724
|
+
/* @__PURE__ */ jsxRuntime.jsx("td", { className: "px-4 py-4 font-medium text-ui-fg-base", children: ((_a2 = item.item) == null ? void 0 : _a2.title) || ((_b2 = item.item) == null ? void 0 : _b2.id) || item.id }),
|
|
725
|
+
/* @__PURE__ */ jsxRuntime.jsx("td", { className: "px-4 py-4 text-ui-fg-subtle", children: item.quantity })
|
|
726
|
+
] }, item.id);
|
|
727
|
+
}) })
|
|
842
728
|
] }) })
|
|
729
|
+
] }),
|
|
730
|
+
returnOrder.metadata && Object.keys(returnOrder.metadata).filter(
|
|
731
|
+
(key) => key !== "status_history"
|
|
732
|
+
).length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "rounded-lg border border-ui-border-base bg-ui-bg-base p-6", children: [
|
|
733
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Heading, { level: "h2", className: "mb-4 text-lg", children: "Metadata" }),
|
|
734
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "space-y-2", children: Object.entries(returnOrder.metadata).filter(([key]) => key !== "status_history").map(([key, value]) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex justify-between", children: [
|
|
735
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", className: "text-ui-fg-subtle", children: key }),
|
|
736
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", className: "font-medium", children: typeof value === "string" ? value : JSON.stringify(value) })
|
|
737
|
+
] }, key)) })
|
|
843
738
|
] })
|
|
844
739
|
] }) });
|
|
845
740
|
};
|
|
846
741
|
const config$1 = adminSdk.defineRouteConfig({
|
|
847
|
-
label: "
|
|
742
|
+
label: "Return Order Details",
|
|
848
743
|
icon: icons.ArrowPath
|
|
849
744
|
});
|
|
850
745
|
const getStatusBadgeClass = (status) => {
|
|
@@ -852,65 +747,63 @@ const getStatusBadgeClass = (status) => {
|
|
|
852
747
|
if (statusLower === "requested") {
|
|
853
748
|
return "bg-ui-tag-orange-bg text-ui-tag-orange-text";
|
|
854
749
|
}
|
|
855
|
-
if (statusLower === "
|
|
750
|
+
if (statusLower === "approved") {
|
|
856
751
|
return "bg-ui-tag-blue-bg text-ui-tag-blue-text";
|
|
857
752
|
}
|
|
858
|
-
if (statusLower === "
|
|
753
|
+
if (statusLower === "rejected") {
|
|
859
754
|
return "bg-ui-tag-red-bg text-ui-tag-red-text";
|
|
860
755
|
}
|
|
861
756
|
if (statusLower === "completed") {
|
|
862
757
|
return "bg-ui-tag-green-bg text-ui-tag-green-text";
|
|
863
758
|
}
|
|
864
|
-
if (statusLower === "
|
|
759
|
+
if (statusLower === "cancelled") {
|
|
865
760
|
return "bg-ui-tag-grey-bg text-ui-tag-grey-text";
|
|
866
761
|
}
|
|
867
762
|
return "bg-ui-tag-purple-bg text-ui-tag-purple-text";
|
|
868
763
|
};
|
|
869
|
-
const
|
|
870
|
-
var _a, _b
|
|
764
|
+
const SwapDetailPage = () => {
|
|
765
|
+
var _a, _b;
|
|
871
766
|
const navigate = reactRouterDom.useNavigate();
|
|
872
767
|
const { id } = reactRouterDom.useParams();
|
|
873
|
-
const [
|
|
768
|
+
const [swap, setSwap] = react.useState(null);
|
|
769
|
+
const [order, setOrder] = react.useState(null);
|
|
874
770
|
const [selectedStatus, setSelectedStatus] = react.useState("");
|
|
875
771
|
const [isLoading, setIsLoading] = react.useState(true);
|
|
876
772
|
const [isUpdating, setIsUpdating] = react.useState(false);
|
|
773
|
+
const [isApproving, setIsApproving] = react.useState(false);
|
|
774
|
+
const [isRejecting, setIsRejecting] = react.useState(false);
|
|
877
775
|
const [error, setError] = react.useState(null);
|
|
878
776
|
const [updateError, setUpdateError] = react.useState(null);
|
|
879
777
|
const [updateSuccess, setUpdateSuccess] = react.useState(false);
|
|
880
|
-
const availableStatuses = [
|
|
881
|
-
"requested",
|
|
882
|
-
"received",
|
|
883
|
-
"requires_action",
|
|
884
|
-
"completed",
|
|
885
|
-
"canceled"
|
|
886
|
-
];
|
|
778
|
+
const availableStatuses = ["requested", "approved", "rejected"];
|
|
887
779
|
react.useEffect(() => {
|
|
888
780
|
if (!id) {
|
|
889
|
-
navigate("/
|
|
781
|
+
navigate("/swaps");
|
|
890
782
|
return;
|
|
891
783
|
}
|
|
892
|
-
const
|
|
784
|
+
const loadSwap = async () => {
|
|
893
785
|
try {
|
|
894
786
|
setIsLoading(true);
|
|
895
787
|
setError(null);
|
|
896
|
-
const response = await fetch(`/admin/
|
|
788
|
+
const response = await fetch(`/admin/swaps/${id}`, {
|
|
897
789
|
credentials: "include"
|
|
898
790
|
});
|
|
899
791
|
if (!response.ok) {
|
|
900
792
|
const message = await response.text();
|
|
901
|
-
throw new Error(message || "Unable to load
|
|
793
|
+
throw new Error(message || "Unable to load swap");
|
|
902
794
|
}
|
|
903
795
|
const payload = await response.json();
|
|
904
|
-
|
|
796
|
+
setSwap(payload.swap);
|
|
797
|
+
setOrder(payload.order || null);
|
|
905
798
|
setSelectedStatus("");
|
|
906
799
|
} catch (loadError) {
|
|
907
|
-
const message = loadError instanceof Error ? loadError.message : "Unable to load
|
|
800
|
+
const message = loadError instanceof Error ? loadError.message : "Unable to load swap";
|
|
908
801
|
setError(message);
|
|
909
802
|
} finally {
|
|
910
803
|
setIsLoading(false);
|
|
911
804
|
}
|
|
912
805
|
};
|
|
913
|
-
void
|
|
806
|
+
void loadSwap();
|
|
914
807
|
}, [id, navigate]);
|
|
915
808
|
const handleStatusUpdate = async () => {
|
|
916
809
|
if (!id || !selectedStatus) {
|
|
@@ -920,7 +813,7 @@ const ReturnDetailPage = () => {
|
|
|
920
813
|
setIsUpdating(true);
|
|
921
814
|
setUpdateError(null);
|
|
922
815
|
setUpdateSuccess(false);
|
|
923
|
-
const response = await fetch(`/admin/
|
|
816
|
+
const response = await fetch(`/admin/swaps/${id}/status`, {
|
|
924
817
|
method: "POST",
|
|
925
818
|
headers: {
|
|
926
819
|
"Content-Type": "application/json"
|
|
@@ -933,34 +826,112 @@ const ReturnDetailPage = () => {
|
|
|
933
826
|
throw new Error(message || "Unable to update status");
|
|
934
827
|
}
|
|
935
828
|
const payload = await response.json();
|
|
936
|
-
|
|
937
|
-
setSelectedStatus("");
|
|
829
|
+
setSwap(payload.swap);
|
|
830
|
+
setSelectedStatus("");
|
|
831
|
+
setUpdateSuccess(true);
|
|
832
|
+
setTimeout(() => setUpdateSuccess(false), 3e3);
|
|
833
|
+
const detailResponse = await fetch(`/admin/swaps/${id}`, {
|
|
834
|
+
credentials: "include"
|
|
835
|
+
});
|
|
836
|
+
if (detailResponse.ok) {
|
|
837
|
+
const detailPayload = await detailResponse.json();
|
|
838
|
+
setSwap(detailPayload.swap);
|
|
839
|
+
setOrder(detailPayload.order || null);
|
|
840
|
+
}
|
|
841
|
+
} catch (updateErr) {
|
|
842
|
+
const message = updateErr instanceof Error ? updateErr.message : "Unable to update status";
|
|
843
|
+
setUpdateError(message);
|
|
844
|
+
} finally {
|
|
845
|
+
setIsUpdating(false);
|
|
846
|
+
}
|
|
847
|
+
};
|
|
848
|
+
const handleAutoCreateExchange = async () => {
|
|
849
|
+
if (!id) {
|
|
850
|
+
return;
|
|
851
|
+
}
|
|
852
|
+
try {
|
|
853
|
+
setIsApproving(true);
|
|
854
|
+
setUpdateError(null);
|
|
855
|
+
setUpdateSuccess(false);
|
|
856
|
+
const response = await fetch(`/admin/swaps/${id}/create-exchange`, {
|
|
857
|
+
method: "POST",
|
|
858
|
+
headers: {
|
|
859
|
+
"Content-Type": "application/json"
|
|
860
|
+
},
|
|
861
|
+
credentials: "include"
|
|
862
|
+
});
|
|
863
|
+
if (!response.ok) {
|
|
864
|
+
const message = await response.text();
|
|
865
|
+
throw new Error(message || "Unable to create exchange from swap");
|
|
866
|
+
}
|
|
867
|
+
const payload = await response.json();
|
|
868
|
+
setSwap(payload.swap);
|
|
869
|
+
setUpdateSuccess(true);
|
|
870
|
+
setTimeout(() => setUpdateSuccess(false), 3e3);
|
|
871
|
+
const detailResponse = await fetch(`/admin/swaps/${id}`, {
|
|
872
|
+
credentials: "include"
|
|
873
|
+
});
|
|
874
|
+
if (detailResponse.ok) {
|
|
875
|
+
const detailPayload = await detailResponse.json();
|
|
876
|
+
setSwap(detailPayload.swap);
|
|
877
|
+
setOrder(detailPayload.order || null);
|
|
878
|
+
}
|
|
879
|
+
} catch (approveErr) {
|
|
880
|
+
const message = approveErr instanceof Error ? approveErr.message : "Unable to create exchange from swap";
|
|
881
|
+
setUpdateError(message);
|
|
882
|
+
} finally {
|
|
883
|
+
setIsApproving(false);
|
|
884
|
+
}
|
|
885
|
+
};
|
|
886
|
+
const handleReject = async () => {
|
|
887
|
+
if (!id) {
|
|
888
|
+
return;
|
|
889
|
+
}
|
|
890
|
+
try {
|
|
891
|
+
setIsRejecting(true);
|
|
892
|
+
setUpdateError(null);
|
|
893
|
+
setUpdateSuccess(false);
|
|
894
|
+
const response = await fetch(`/admin/swaps/${id}/reject`, {
|
|
895
|
+
method: "POST",
|
|
896
|
+
headers: {
|
|
897
|
+
"Content-Type": "application/json"
|
|
898
|
+
},
|
|
899
|
+
credentials: "include",
|
|
900
|
+
body: JSON.stringify({ reason: "Rejected by admin" })
|
|
901
|
+
});
|
|
902
|
+
if (!response.ok) {
|
|
903
|
+
const message = await response.text();
|
|
904
|
+
throw new Error(message || "Unable to reject swap");
|
|
905
|
+
}
|
|
906
|
+
const payload = await response.json();
|
|
907
|
+
setSwap(payload.swap);
|
|
938
908
|
setUpdateSuccess(true);
|
|
939
909
|
setTimeout(() => setUpdateSuccess(false), 3e3);
|
|
940
|
-
const detailResponse = await fetch(`/admin/
|
|
910
|
+
const detailResponse = await fetch(`/admin/swaps/${id}`, {
|
|
941
911
|
credentials: "include"
|
|
942
912
|
});
|
|
943
913
|
if (detailResponse.ok) {
|
|
944
|
-
const detailPayload = await
|
|
945
|
-
|
|
914
|
+
const detailPayload = await response.json();
|
|
915
|
+
setSwap(detailPayload.swap);
|
|
916
|
+
setOrder(detailPayload.order || null);
|
|
946
917
|
}
|
|
947
918
|
} catch (updateErr) {
|
|
948
|
-
const message = updateErr instanceof Error ? updateErr.message : "Unable to
|
|
919
|
+
const message = updateErr instanceof Error ? updateErr.message : "Unable to reject swap";
|
|
949
920
|
setUpdateError(message);
|
|
950
921
|
} finally {
|
|
951
|
-
|
|
922
|
+
setIsRejecting(false);
|
|
952
923
|
}
|
|
953
924
|
};
|
|
954
925
|
if (isLoading) {
|
|
955
|
-
return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-full p-6", children: /* @__PURE__ */ jsxRuntime.jsx(ui.Container, { className: "mx-auto flex w-full max-w-5xl flex-col gap-6 p-6", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex justify-center py-16", children: /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { children: "Loading
|
|
926
|
+
return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-full p-6", children: /* @__PURE__ */ jsxRuntime.jsx(ui.Container, { className: "mx-auto flex w-full max-w-5xl flex-col gap-6 p-6", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex justify-center py-16", children: /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { children: "Loading swap..." }) }) }) });
|
|
956
927
|
}
|
|
957
|
-
if (error || !
|
|
928
|
+
if (error || !swap) {
|
|
958
929
|
return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-full p-6", children: /* @__PURE__ */ jsxRuntime.jsx(ui.Container, { className: "mx-auto flex w-full max-w-5xl flex-col gap-6 p-6", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "rounded-lg border border-ui-border-strong p-6 text-center", children: [
|
|
959
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { weight: "plus", className: "text-ui-fg-error", children: error || "
|
|
960
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-4 flex justify-center", children: /* @__PURE__ */ jsxRuntime.jsx(ui.Button, { variant: "secondary", onClick: () => navigate("/
|
|
930
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { weight: "plus", className: "text-ui-fg-error", children: error || "Swap not found" }),
|
|
931
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-4 flex justify-center", children: /* @__PURE__ */ jsxRuntime.jsx(ui.Button, { variant: "secondary", onClick: () => navigate("/swaps"), children: "Back to list" }) })
|
|
961
932
|
] }) }) });
|
|
962
933
|
}
|
|
963
|
-
const statusHistory = ((_a =
|
|
934
|
+
const statusHistory = ((_a = swap.metadata) == null ? void 0 : _a.status_history) || [];
|
|
964
935
|
return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-full p-6", children: /* @__PURE__ */ jsxRuntime.jsxs(ui.Container, { className: "mx-auto flex w-full max-w-5xl flex-col gap-6 p-6", children: [
|
|
965
936
|
/* @__PURE__ */ jsxRuntime.jsxs("header", { className: "flex flex-col gap-3", children: [
|
|
966
937
|
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
@@ -968,7 +939,7 @@ const ReturnDetailPage = () => {
|
|
|
968
939
|
{
|
|
969
940
|
variant: "transparent",
|
|
970
941
|
size: "small",
|
|
971
|
-
onClick: () => navigate("/
|
|
942
|
+
onClick: () => navigate("/swaps"),
|
|
972
943
|
className: "w-fit",
|
|
973
944
|
children: [
|
|
974
945
|
/* @__PURE__ */ jsxRuntime.jsx(icons.ArrowLeft, { className: "mr-2" }),
|
|
@@ -978,20 +949,45 @@ const ReturnDetailPage = () => {
|
|
|
978
949
|
),
|
|
979
950
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-1 md:flex-row md:items-center md:justify-between", children: [
|
|
980
951
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-1", children: [
|
|
981
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.Heading, { level: "h1", children: "
|
|
982
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", className: "text-ui-fg-subtle", children:
|
|
952
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Heading, { level: "h1", children: "Swap Details" }),
|
|
953
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", className: "text-ui-fg-subtle", children: swap.id })
|
|
983
954
|
] }),
|
|
984
955
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
985
956
|
ui.Badge,
|
|
986
957
|
{
|
|
987
958
|
size: "small",
|
|
988
|
-
className: `uppercase ${getStatusBadgeClass(
|
|
989
|
-
children:
|
|
959
|
+
className: `uppercase ${getStatusBadgeClass(swap.status)}`,
|
|
960
|
+
children: swap.status.replace(/_/g, " ")
|
|
990
961
|
}
|
|
991
962
|
)
|
|
992
963
|
] })
|
|
993
964
|
] }),
|
|
994
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "
|
|
965
|
+
swap.status === "requested" && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-3", children: [
|
|
966
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex gap-3", children: [
|
|
967
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
968
|
+
ui.Button,
|
|
969
|
+
{
|
|
970
|
+
variant: "primary",
|
|
971
|
+
onClick: handleAutoCreateExchange,
|
|
972
|
+
disabled: isApproving || isRejecting,
|
|
973
|
+
isLoading: isApproving,
|
|
974
|
+
children: "Approve & Create Exchange"
|
|
975
|
+
}
|
|
976
|
+
),
|
|
977
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
978
|
+
ui.Button,
|
|
979
|
+
{
|
|
980
|
+
variant: "danger",
|
|
981
|
+
onClick: handleReject,
|
|
982
|
+
disabled: isApproving || isRejecting,
|
|
983
|
+
isLoading: isRejecting,
|
|
984
|
+
children: "Reject Swap"
|
|
985
|
+
}
|
|
986
|
+
)
|
|
987
|
+
] }),
|
|
988
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", className: "text-ui-fg-subtle", children: "Approving will automatically create an exchange with return items and new items from the swap request" })
|
|
989
|
+
] }),
|
|
990
|
+
swap.status === "requested" && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "rounded-lg border border-ui-border-base bg-ui-bg-base p-6", children: [
|
|
995
991
|
/* @__PURE__ */ jsxRuntime.jsx(ui.Heading, { level: "h2", className: "mb-4 text-lg", children: "Update Status" }),
|
|
996
992
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-3 md:flex-row md:items-end", children: [
|
|
997
993
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex-1", children: [
|
|
@@ -1004,7 +1000,7 @@ const ReturnDetailPage = () => {
|
|
|
1004
1000
|
className: "h-9 w-full rounded-md border border-ui-border-base bg-transparent px-3 text-sm text-ui-fg-base outline-none transition focus:ring-2 focus:ring-ui-fg-interactive",
|
|
1005
1001
|
children: [
|
|
1006
1002
|
/* @__PURE__ */ jsxRuntime.jsx("option", { value: "", children: "Select new status" }),
|
|
1007
|
-
availableStatuses.filter((status) => status !==
|
|
1003
|
+
availableStatuses.filter((status) => status !== swap.status).map((status) => /* @__PURE__ */ jsxRuntime.jsx("option", { value: status, children: status.replace(/_/g, " ").toUpperCase() }, status))
|
|
1008
1004
|
]
|
|
1009
1005
|
}
|
|
1010
1006
|
)
|
|
@@ -1023,37 +1019,60 @@ const ReturnDetailPage = () => {
|
|
|
1023
1019
|
updateError && /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", className: "mt-2 text-ui-fg-error", children: updateError }),
|
|
1024
1020
|
updateSuccess && /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", className: "mt-2 text-ui-fg-success", children: "Status updated successfully" })
|
|
1025
1021
|
] }),
|
|
1022
|
+
swap.status === "approved" && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "rounded-lg border border-ui-border-base bg-ui-bg-base p-6", children: [
|
|
1023
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Heading, { level: "h2", className: "mb-4 text-lg", children: "Exchange Information" }),
|
|
1024
|
+
swap.exchange_id ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-3", children: [
|
|
1025
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
1026
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", className: "text-ui-fg-subtle", children: "Exchange ID" }),
|
|
1027
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { className: "font-medium", children: swap.exchange_id })
|
|
1028
|
+
] }),
|
|
1029
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
1030
|
+
ui.Button,
|
|
1031
|
+
{
|
|
1032
|
+
variant: "secondary",
|
|
1033
|
+
onClick: () => {
|
|
1034
|
+
window.open(`/app/orders/${swap.order_id}/exchanges/${swap.exchange_id}`, "_blank");
|
|
1035
|
+
},
|
|
1036
|
+
children: "View Exchange"
|
|
1037
|
+
}
|
|
1038
|
+
) })
|
|
1039
|
+
] }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "space-y-3", children: /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", className: "text-ui-fg-subtle", children: "Exchange is being created. Please refresh the page to see the exchange details." }) })
|
|
1040
|
+
] }),
|
|
1026
1041
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid gap-6 md:grid-cols-2", children: [
|
|
1027
1042
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "rounded-lg border border-ui-border-base bg-ui-bg-base p-6", children: [
|
|
1028
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.Heading, { level: "h2", className: "mb-4 text-lg", children: "
|
|
1043
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Heading, { level: "h2", className: "mb-4 text-lg", children: "Swap Information" }),
|
|
1029
1044
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-3", children: [
|
|
1030
1045
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
1031
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", className: "text-ui-fg-subtle", children: "
|
|
1032
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { className: "font-medium", children:
|
|
1046
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", className: "text-ui-fg-subtle", children: "Swap ID" }),
|
|
1047
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { className: "font-medium", children: swap.id })
|
|
1033
1048
|
] }),
|
|
1034
1049
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
1035
1050
|
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", className: "text-ui-fg-subtle", children: "Status" }),
|
|
1036
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { className: "font-medium", children:
|
|
1051
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { className: "font-medium", children: swap.status })
|
|
1037
1052
|
] }),
|
|
1038
1053
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
1039
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", className: "text-ui-fg-subtle", children: "
|
|
1040
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { className: "font-medium", children:
|
|
1054
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", className: "text-ui-fg-subtle", children: "Difference Due" }),
|
|
1055
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { className: "font-medium", children: swap.difference_due != null ? `${swap.currency_code || "$"}${(Number(swap.difference_due) / 100).toFixed(2)}` : "—" })
|
|
1041
1056
|
] }),
|
|
1042
|
-
|
|
1057
|
+
swap.reason && /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
1043
1058
|
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", className: "text-ui-fg-subtle", children: "Reason" }),
|
|
1044
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { className: "font-medium", children:
|
|
1059
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { className: "font-medium", children: swap.reason })
|
|
1045
1060
|
] }),
|
|
1046
|
-
|
|
1061
|
+
swap.note && /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
1047
1062
|
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", className: "text-ui-fg-subtle", children: "Note" }),
|
|
1048
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { className: "font-medium", children:
|
|
1063
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { className: "font-medium", children: swap.note })
|
|
1049
1064
|
] }),
|
|
1050
1065
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
1051
1066
|
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", className: "text-ui-fg-subtle", children: "Created" }),
|
|
1052
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { className: "font-medium", children: new Date(
|
|
1067
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { className: "font-medium", children: new Date(swap.created_at).toLocaleString() })
|
|
1053
1068
|
] }),
|
|
1054
1069
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
1055
1070
|
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", className: "text-ui-fg-subtle", children: "Last Updated" }),
|
|
1056
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { className: "font-medium", children: new Date(
|
|
1071
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { className: "font-medium", children: new Date(swap.updated_at).toLocaleString() })
|
|
1072
|
+
] }),
|
|
1073
|
+
swap.exchange_id && /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
1074
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", className: "text-ui-fg-subtle", children: "Exchange ID" }),
|
|
1075
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { className: "font-medium", children: swap.exchange_id })
|
|
1057
1076
|
] })
|
|
1058
1077
|
] })
|
|
1059
1078
|
] }),
|
|
@@ -1064,23 +1083,18 @@ const ReturnDetailPage = () => {
|
|
|
1064
1083
|
{
|
|
1065
1084
|
className: "flex items-center justify-between border-b border-ui-border-subtle pb-2 last:border-0",
|
|
1066
1085
|
children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-1", children: [
|
|
1067
|
-
/* @__PURE__ */ jsxRuntime.
|
|
1068
|
-
|
|
1069
|
-
|
|
1070
|
-
|
|
1071
|
-
|
|
1072
|
-
|
|
1073
|
-
|
|
1074
|
-
|
|
1075
|
-
),
|
|
1076
|
-
entry.from && /* @__PURE__ */ jsxRuntime.jsxs(ui.Text, { size: "small", className: "text-ui-fg-subtle", children: [
|
|
1077
|
-
"from ",
|
|
1078
|
-
entry.from.replace("_", " ")
|
|
1079
|
-
] })
|
|
1080
|
-
] }),
|
|
1086
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center gap-2", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
1087
|
+
ui.Badge,
|
|
1088
|
+
{
|
|
1089
|
+
size: "2xsmall",
|
|
1090
|
+
className: `uppercase ${getStatusBadgeClass(entry.status)}`,
|
|
1091
|
+
children: entry.status.replace(/_/g, " ")
|
|
1092
|
+
}
|
|
1093
|
+
) }),
|
|
1081
1094
|
/* @__PURE__ */ jsxRuntime.jsxs(ui.Text, { size: "small", className: "text-ui-fg-subtle", children: [
|
|
1082
|
-
new Date(entry.
|
|
1083
|
-
entry.
|
|
1095
|
+
new Date(entry.timestamp).toLocaleString(),
|
|
1096
|
+
entry.admin_id && ` by ${entry.admin_id}`,
|
|
1097
|
+
entry.reason && ` - ${entry.reason}`
|
|
1084
1098
|
] })
|
|
1085
1099
|
] })
|
|
1086
1100
|
},
|
|
@@ -1088,123 +1102,109 @@ const ReturnDetailPage = () => {
|
|
|
1088
1102
|
)) }) : /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", className: "text-ui-fg-subtle", children: "No status history available" })
|
|
1089
1103
|
] })
|
|
1090
1104
|
] }),
|
|
1091
|
-
|
|
1105
|
+
order && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "rounded-lg border border-ui-border-base bg-ui-bg-base p-6", children: [
|
|
1092
1106
|
/* @__PURE__ */ jsxRuntime.jsx(ui.Heading, { level: "h2", className: "mb-4 text-lg", children: "Related Order Information" }),
|
|
1093
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "
|
|
1094
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", {
|
|
1095
|
-
/* @__PURE__ */ jsxRuntime.
|
|
1096
|
-
|
|
1097
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { className: "font-medium", children: returnOrder.order.id })
|
|
1098
|
-
] }),
|
|
1099
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
1100
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", className: "text-ui-fg-subtle", children: "Order Status" }),
|
|
1101
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { className: "font-medium", children: returnOrder.order.status || "—" })
|
|
1102
|
-
] }),
|
|
1103
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
1104
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", className: "text-ui-fg-subtle", children: "Customer" }),
|
|
1105
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { className: "font-medium", children: ((_c = returnOrder.order.customer) == null ? void 0 : _c.email) || returnOrder.order.email || "—" })
|
|
1106
|
-
] }),
|
|
1107
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
1108
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", className: "text-ui-fg-subtle", children: "Order Total" }),
|
|
1109
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { className: "font-medium", children: returnOrder.order.total ? `${returnOrder.order.currency_code || "$"}${Number(returnOrder.order.total).toFixed(2)}` : "—" })
|
|
1110
|
-
] })
|
|
1107
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-3", children: [
|
|
1108
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
1109
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", className: "text-ui-fg-subtle", children: "Order ID" }),
|
|
1110
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { className: "font-medium", children: order.id })
|
|
1111
1111
|
] }),
|
|
1112
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", {
|
|
1113
|
-
/* @__PURE__ */ jsxRuntime.
|
|
1114
|
-
|
|
1115
|
-
|
|
1116
|
-
|
|
1117
|
-
/* @__PURE__ */ jsxRuntime.
|
|
1118
|
-
|
|
1119
|
-
|
|
1120
|
-
|
|
1121
|
-
/* @__PURE__ */ jsxRuntime.
|
|
1122
|
-
|
|
1123
|
-
|
|
1124
|
-
|
|
1125
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
1126
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", className: "text-ui-fg-subtle", children: "Order Created" }),
|
|
1127
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { className: "font-medium", children: returnOrder.order.created_at ? new Date(returnOrder.order.created_at).toLocaleString() : "—" })
|
|
1112
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
1113
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", className: "text-ui-fg-subtle", children: "Order Status" }),
|
|
1114
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { className: "font-medium", children: order.status || "—" })
|
|
1115
|
+
] }),
|
|
1116
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
1117
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", className: "text-ui-fg-subtle", children: "Customer" }),
|
|
1118
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { className: "font-medium", children: ((_b = order.customer) == null ? void 0 : _b.email) || order.email || "—" })
|
|
1119
|
+
] }),
|
|
1120
|
+
order.total && /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
1121
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", className: "text-ui-fg-subtle", children: "Order Total" }),
|
|
1122
|
+
/* @__PURE__ */ jsxRuntime.jsxs(ui.Text, { className: "font-medium", children: [
|
|
1123
|
+
order.currency_code || "$",
|
|
1124
|
+
(Number(order.total) / 100).toFixed(2)
|
|
1128
1125
|
] })
|
|
1129
1126
|
] })
|
|
1130
1127
|
] })
|
|
1131
1128
|
] }),
|
|
1132
|
-
|
|
1129
|
+
swap.return_items && swap.return_items.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "rounded-lg border border-ui-border-base bg-ui-bg-base p-6", children: [
|
|
1133
1130
|
/* @__PURE__ */ jsxRuntime.jsx(ui.Heading, { level: "h2", className: "mb-4 text-lg", children: "Return Items" }),
|
|
1134
1131
|
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "overflow-hidden rounded-xl border border-ui-border-base", children: /* @__PURE__ */ jsxRuntime.jsxs("table", { className: "min-w-full divide-y divide-ui-border-base", children: [
|
|
1135
1132
|
/* @__PURE__ */ jsxRuntime.jsx("thead", { className: "bg-ui-bg-subtle", children: /* @__PURE__ */ jsxRuntime.jsxs("tr", { children: [
|
|
1136
|
-
/* @__PURE__ */ jsxRuntime.jsx("th", { className: "px-4 py-3 text-left text-xs font-semibold uppercase tracking-wide text-ui-fg-muted", children: "Item" }),
|
|
1137
|
-
/* @__PURE__ */ jsxRuntime.jsx("th", { className: "px-4 py-3 text-left text-xs font-semibold uppercase tracking-wide text-ui-fg-muted", children: "Quantity" })
|
|
1133
|
+
/* @__PURE__ */ jsxRuntime.jsx("th", { className: "px-4 py-3 text-left text-xs font-semibold uppercase tracking-wide text-ui-fg-muted", children: "Item ID" }),
|
|
1134
|
+
/* @__PURE__ */ jsxRuntime.jsx("th", { className: "px-4 py-3 text-left text-xs font-semibold uppercase tracking-wide text-ui-fg-muted", children: "Quantity" }),
|
|
1135
|
+
/* @__PURE__ */ jsxRuntime.jsx("th", { className: "px-4 py-3 text-left text-xs font-semibold uppercase tracking-wide text-ui-fg-muted", children: "Reason" })
|
|
1138
1136
|
] }) }),
|
|
1139
|
-
/* @__PURE__ */ jsxRuntime.jsx("tbody", { className: "divide-y divide-ui-border-subtle", children:
|
|
1140
|
-
|
|
1141
|
-
|
|
1142
|
-
|
|
1143
|
-
|
|
1144
|
-
] }, item.id);
|
|
1145
|
-
}) })
|
|
1137
|
+
/* @__PURE__ */ jsxRuntime.jsx("tbody", { className: "divide-y divide-ui-border-subtle", children: swap.return_items.map((item, index) => /* @__PURE__ */ jsxRuntime.jsxs("tr", { children: [
|
|
1138
|
+
/* @__PURE__ */ jsxRuntime.jsx("td", { className: "px-4 py-4 font-medium text-ui-fg-base", children: item.id }),
|
|
1139
|
+
/* @__PURE__ */ jsxRuntime.jsx("td", { className: "px-4 py-4 text-ui-fg-subtle", children: item.quantity }),
|
|
1140
|
+
/* @__PURE__ */ jsxRuntime.jsx("td", { className: "px-4 py-4 text-ui-fg-subtle", children: item.reason || "—" })
|
|
1141
|
+
] }, item.id || index)) })
|
|
1146
1142
|
] }) })
|
|
1147
1143
|
] }),
|
|
1148
|
-
|
|
1149
|
-
(
|
|
1150
|
-
|
|
1151
|
-
|
|
1152
|
-
|
|
1153
|
-
|
|
1154
|
-
|
|
1155
|
-
|
|
1144
|
+
swap.new_items && swap.new_items.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "rounded-lg border border-ui-border-base bg-ui-bg-base p-6", children: [
|
|
1145
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Heading, { level: "h2", className: "mb-4 text-lg", children: "New Items" }),
|
|
1146
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "overflow-hidden rounded-xl border border-ui-border-base", children: /* @__PURE__ */ jsxRuntime.jsxs("table", { className: "min-w-full divide-y divide-ui-border-base", children: [
|
|
1147
|
+
/* @__PURE__ */ jsxRuntime.jsx("thead", { className: "bg-ui-bg-subtle", children: /* @__PURE__ */ jsxRuntime.jsxs("tr", { children: [
|
|
1148
|
+
/* @__PURE__ */ jsxRuntime.jsx("th", { className: "px-4 py-3 text-left text-xs font-semibold uppercase tracking-wide text-ui-fg-muted", children: "Variant ID" }),
|
|
1149
|
+
/* @__PURE__ */ jsxRuntime.jsx("th", { className: "px-4 py-3 text-left text-xs font-semibold uppercase tracking-wide text-ui-fg-muted", children: "Quantity" })
|
|
1150
|
+
] }) }),
|
|
1151
|
+
/* @__PURE__ */ jsxRuntime.jsx("tbody", { className: "divide-y divide-ui-border-subtle", children: swap.new_items.map((item, index) => /* @__PURE__ */ jsxRuntime.jsxs("tr", { children: [
|
|
1152
|
+
/* @__PURE__ */ jsxRuntime.jsx("td", { className: "px-4 py-4 font-medium text-ui-fg-base", children: item.variant_id }),
|
|
1153
|
+
/* @__PURE__ */ jsxRuntime.jsx("td", { className: "px-4 py-4 text-ui-fg-subtle", children: item.quantity })
|
|
1154
|
+
] }, item.variant_id || index)) })
|
|
1155
|
+
] }) })
|
|
1156
1156
|
] })
|
|
1157
1157
|
] }) });
|
|
1158
1158
|
};
|
|
1159
1159
|
const config = adminSdk.defineRouteConfig({
|
|
1160
|
-
label: "
|
|
1160
|
+
label: "Swap Details",
|
|
1161
1161
|
icon: icons.ArrowPath
|
|
1162
1162
|
});
|
|
1163
1163
|
const i18nTranslations0 = {};
|
|
1164
1164
|
const widgetModule = { widgets: [] };
|
|
1165
1165
|
const routeModule = {
|
|
1166
1166
|
routes: [
|
|
1167
|
-
{
|
|
1168
|
-
Component: SwapsPage,
|
|
1169
|
-
path: "/swaps"
|
|
1170
|
-
},
|
|
1171
1167
|
{
|
|
1172
1168
|
Component: ReturnsPage,
|
|
1173
1169
|
path: "/returns"
|
|
1174
1170
|
},
|
|
1175
1171
|
{
|
|
1176
|
-
Component:
|
|
1177
|
-
path: "/swaps
|
|
1172
|
+
Component: SwapsPage,
|
|
1173
|
+
path: "/swaps"
|
|
1178
1174
|
},
|
|
1179
1175
|
{
|
|
1180
1176
|
Component: ReturnDetailPage,
|
|
1181
1177
|
path: "/returns/:id"
|
|
1178
|
+
},
|
|
1179
|
+
{
|
|
1180
|
+
Component: SwapDetailPage,
|
|
1181
|
+
path: "/swaps/:id"
|
|
1182
1182
|
}
|
|
1183
1183
|
]
|
|
1184
1184
|
};
|
|
1185
1185
|
const menuItemModule = {
|
|
1186
1186
|
menuItems: [
|
|
1187
1187
|
{
|
|
1188
|
-
label: config$
|
|
1189
|
-
icon: config$
|
|
1188
|
+
label: config$3.label,
|
|
1189
|
+
icon: config$3.icon,
|
|
1190
1190
|
path: "/returns",
|
|
1191
1191
|
nested: void 0
|
|
1192
1192
|
},
|
|
1193
1193
|
{
|
|
1194
|
-
label: config$
|
|
1195
|
-
icon: config$
|
|
1194
|
+
label: config$2.label,
|
|
1195
|
+
icon: config$2.icon,
|
|
1196
1196
|
path: "/swaps",
|
|
1197
1197
|
nested: void 0
|
|
1198
1198
|
},
|
|
1199
1199
|
{
|
|
1200
|
-
label: config.label,
|
|
1201
|
-
icon: config.icon,
|
|
1200
|
+
label: config$1.label,
|
|
1201
|
+
icon: config$1.icon,
|
|
1202
1202
|
path: "/returns/:id",
|
|
1203
1203
|
nested: void 0
|
|
1204
1204
|
},
|
|
1205
1205
|
{
|
|
1206
|
-
label: config
|
|
1207
|
-
icon: config
|
|
1206
|
+
label: config.label,
|
|
1207
|
+
icon: config.icon,
|
|
1208
1208
|
path: "/swaps/:id",
|
|
1209
1209
|
nested: void 0
|
|
1210
1210
|
}
|