@burdenoff/microfe-movethewheels 2026.930.4 → 2026.930.5
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.
|
@@ -14,7 +14,18 @@ var o = "\n query ListInventoryItems($filter: InventoryFilterInput, $pagination
|
|
|
14
14
|
${y}
|
|
15
15
|
}
|
|
16
16
|
}
|
|
17
|
-
`, S = "\n mutation AdjustInventoryStock($input: AdjustInventoryStockInput!) {\n adjustInventoryStock(input: $input) {\n id\n cargoItemId\n warehouseId\n onHand\n available\n allocated\n damaged\n reorderPoint\n createdAt\n updatedAt\n }\n }\n", C =
|
|
17
|
+
`, S = "\n mutation AdjustInventoryStock($input: AdjustInventoryStockInput!) {\n adjustInventoryStock(input: $input) {\n id\n cargoItemId\n warehouseId\n onHand\n available\n allocated\n damaged\n reorderPoint\n createdAt\n updatedAt\n }\n }\n", C = `
|
|
18
|
+
mutation TransferInventoryStock($input: TransferInventoryStockInput!) {
|
|
19
|
+
transferInventoryStock(input: $input) {
|
|
20
|
+
source {
|
|
21
|
+
${y}
|
|
22
|
+
}
|
|
23
|
+
destination {
|
|
24
|
+
${y}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
`;
|
|
18
29
|
function w(e) {
|
|
19
30
|
if (!e) return;
|
|
20
31
|
let t = {};
|
|
@@ -13,8 +13,8 @@ import { SlidersHorizontal as ie } from "../node_modules/lucide-react/dist/esm/i
|
|
|
13
13
|
import { TriangleAlert as s } from "../node_modules/lucide-react/dist/esm/icons/triangle-alert.js";
|
|
14
14
|
import { Warehouse as ae } from "../node_modules/lucide-react/dist/esm/icons/warehouse.js";
|
|
15
15
|
import { joinPath as c } from "../utils/navigation.js";
|
|
16
|
-
import { useMoveTheWheels as
|
|
17
|
-
import { useInventory as
|
|
16
|
+
import { useMoveTheWheels as l } from "../providers/MoveTheWheelsProvider.js";
|
|
17
|
+
import { useInventory as oe, useInventoryStats as se, useInventoryTransactions as ce } from "../hooks/useInventory.js";
|
|
18
18
|
import { Badge as u, Button as d, Card as f, CardContent as p, CardHeader as le, CardTitle as ue, Progress as de } from "../components/ui.js";
|
|
19
19
|
import { PageLayout as fe, PageSection as m } from "../components/PageLayout.js";
|
|
20
20
|
import { MetricCard as h, MetricCardSkeleton as g, MetricGrid as _ } from "../components/MetricCard.js";
|
|
@@ -55,15 +55,19 @@ var w = {
|
|
|
55
55
|
TRANSFER: "Transfer",
|
|
56
56
|
ADJUSTMENT: "Adjustment"
|
|
57
57
|
};
|
|
58
|
-
function D() {
|
|
59
|
-
let
|
|
60
|
-
|
|
58
|
+
function D(e, t) {
|
|
59
|
+
let n = Math.abs(t).toLocaleString();
|
|
60
|
+
return e === "in" ? `+${n}` : e === "out" ? `−${n}` : t > 0 ? `+${n}` : t < 0 ? `−${n}` : n;
|
|
61
|
+
}
|
|
62
|
+
function O() {
|
|
63
|
+
let { t: O } = we(), k = (e, t) => {
|
|
64
|
+
let n = O(e);
|
|
61
65
|
return n === e ? t : n;
|
|
62
|
-
}, { basePath:
|
|
66
|
+
}, { basePath: Te, navigate: Ee } = l(), [A, De] = v(""), [j, M] = v(0), [N, Oe] = v(10), { inventory: P, lowStockItems: F, products: I, warehouses: ke, totalItems: Ae, hasMore: je, isLoading: L, error: R, refetch: z } = oe({
|
|
63
67
|
search: ye(A),
|
|
64
68
|
limit: N,
|
|
65
69
|
offset: j * N
|
|
66
|
-
}), { stats: B, refetch:
|
|
70
|
+
}), { stats: B, refetch: Me } = se(), { transactions: V, isLoading: Ne, error: H, refetch: Pe } = ce({ limit: 8 }), { message: U, notify: Fe } = ge(6e3), [Ie, W] = v(!1), [G, K] = v(null), [q, J] = v(null), Y = (e) => ({
|
|
67
71
|
id: e.id,
|
|
68
72
|
productName: e.productName,
|
|
69
73
|
sku: e.sku,
|
|
@@ -72,10 +76,10 @@ function D() {
|
|
|
72
76
|
onHand: e.onHand,
|
|
73
77
|
available: e.available
|
|
74
78
|
}), X = (e) => {
|
|
75
|
-
|
|
76
|
-
}, Z = (e) =>
|
|
79
|
+
Fe(e), z(), Me(), Pe();
|
|
80
|
+
}, Z = (e) => Ee?.(c(Te, e)), Q = (e, t) => {
|
|
77
81
|
(e.key === "Enter" || e.key === " ") && (e.preventDefault(), t());
|
|
78
|
-
}, $ =
|
|
82
|
+
}, $ = k("movethewheels.inventory.lowStock.unknownProduct", "Unknown Product"), Le = Ce(() => P.map((e) => ({
|
|
79
83
|
id: e.id,
|
|
80
84
|
productId: e.productId,
|
|
81
85
|
productName: e.productName ?? $,
|
|
@@ -87,10 +91,10 @@ function D() {
|
|
|
87
91
|
available: e.availableQuantity,
|
|
88
92
|
reorderLevel: e.reorderLevel,
|
|
89
93
|
stockState: e.quantity === 0 ? "out_of_stock" : e.reorderLevel !== void 0 && e.availableQuantity <= e.reorderLevel ? "low" : "in_stock"
|
|
90
|
-
})), [P, $]),
|
|
94
|
+
})), [P, $]), Re = [
|
|
91
95
|
{
|
|
92
96
|
id: "product",
|
|
93
|
-
header:
|
|
97
|
+
header: k("movethewheels.inventory.stock.product", "Product"),
|
|
94
98
|
accessorKey: "productName",
|
|
95
99
|
sortable: !0,
|
|
96
100
|
cell: (e) => /* @__PURE__ */ y("span", {
|
|
@@ -100,7 +104,7 @@ function D() {
|
|
|
100
104
|
},
|
|
101
105
|
{
|
|
102
106
|
id: "sku",
|
|
103
|
-
header:
|
|
107
|
+
header: k("movethewheels.inventory.stock.sku", "SKU"),
|
|
104
108
|
accessorKey: "sku",
|
|
105
109
|
sortable: !0,
|
|
106
110
|
cell: (e) => /* @__PURE__ */ y("span", {
|
|
@@ -110,13 +114,13 @@ function D() {
|
|
|
110
114
|
},
|
|
111
115
|
{
|
|
112
116
|
id: "warehouse",
|
|
113
|
-
header:
|
|
117
|
+
header: k("movethewheels.inventory.stock.warehouse", "Warehouse"),
|
|
114
118
|
accessorKey: "warehouseName",
|
|
115
119
|
sortable: !0
|
|
116
120
|
},
|
|
117
121
|
{
|
|
118
122
|
id: "onHand",
|
|
119
|
-
header:
|
|
123
|
+
header: k("movethewheels.inventory.stock.onHand", "On hand"),
|
|
120
124
|
accessorKey: "onHand",
|
|
121
125
|
sortable: !0,
|
|
122
126
|
cell: (e) => /* @__PURE__ */ y("span", {
|
|
@@ -126,14 +130,14 @@ function D() {
|
|
|
126
130
|
},
|
|
127
131
|
{
|
|
128
132
|
id: "allocated",
|
|
129
|
-
header:
|
|
133
|
+
header: k("movethewheels.inventory.stock.allocated", "Allocated"),
|
|
130
134
|
accessorKey: "allocated",
|
|
131
135
|
sortable: !0,
|
|
132
136
|
cell: (e) => e.allocated.toLocaleString()
|
|
133
137
|
},
|
|
134
138
|
{
|
|
135
139
|
id: "available",
|
|
136
|
-
header:
|
|
140
|
+
header: k("movethewheels.inventory.stock.available", "Available"),
|
|
137
141
|
accessorKey: "available",
|
|
138
142
|
sortable: !0,
|
|
139
143
|
cell: (e) => /* @__PURE__ */ y("span", {
|
|
@@ -143,23 +147,23 @@ function D() {
|
|
|
143
147
|
},
|
|
144
148
|
{
|
|
145
149
|
id: "reorderPoint",
|
|
146
|
-
header:
|
|
150
|
+
header: k("movethewheels.inventory.stock.reorderPoint", "Reorder point"),
|
|
147
151
|
accessorKey: "reorderLevel",
|
|
148
152
|
sortable: !0,
|
|
149
153
|
cell: (e) => e.reorderLevel === void 0 ? "—" : e.reorderLevel.toLocaleString()
|
|
150
154
|
},
|
|
151
155
|
{
|
|
152
156
|
id: "state",
|
|
153
|
-
header:
|
|
157
|
+
header: k("movethewheels.inventory.stock.status", "Status"),
|
|
154
158
|
cell: (e) => /* @__PURE__ */ y(pe, {
|
|
155
|
-
status: e.stockState === "out_of_stock" ?
|
|
159
|
+
status: e.stockState === "out_of_stock" ? k("movethewheels.inventory.stock.outOfStock", "Out of stock") : e.stockState === "low" ? k("movethewheels.inventory.stock.low", "Low") : k("movethewheels.inventory.stock.inStock", "In stock"),
|
|
156
160
|
customColors: w[e.stockState],
|
|
157
161
|
size: "sm"
|
|
158
162
|
})
|
|
159
163
|
},
|
|
160
164
|
{
|
|
161
165
|
id: "actions",
|
|
162
|
-
header:
|
|
166
|
+
header: k("movethewheels.inventory.stock.actions", "Actions"),
|
|
163
167
|
cell: (e) => /* @__PURE__ */ b("div", {
|
|
164
168
|
className: "flex flex-wrap gap-2",
|
|
165
169
|
onClick: (e) => e.stopPropagation(),
|
|
@@ -172,7 +176,7 @@ function D() {
|
|
|
172
176
|
children: [
|
|
173
177
|
/* @__PURE__ */ y(ie, { size: 14 }),
|
|
174
178
|
" ",
|
|
175
|
-
|
|
179
|
+
k("movethewheels.inventory.stock.adjust", "Adjust")
|
|
176
180
|
]
|
|
177
181
|
}), /* @__PURE__ */ b(d, {
|
|
178
182
|
type: "button",
|
|
@@ -183,34 +187,34 @@ function D() {
|
|
|
183
187
|
children: [
|
|
184
188
|
/* @__PURE__ */ y(t, { size: 14 }),
|
|
185
189
|
" ",
|
|
186
|
-
|
|
190
|
+
k("movethewheels.inventory.stock.transfer", "Transfer")
|
|
187
191
|
]
|
|
188
192
|
})]
|
|
189
193
|
})
|
|
190
194
|
}
|
|
191
195
|
];
|
|
192
196
|
return /* @__PURE__ */ b(fe, {
|
|
193
|
-
title:
|
|
194
|
-
subtitle:
|
|
197
|
+
title: k("movethewheels.inventory.title", "Inventory"),
|
|
198
|
+
subtitle: k("movethewheels.inventory.subtitle", "Manage your products and warehouses"),
|
|
195
199
|
icon: /* @__PURE__ */ y(o, { size: 24 }),
|
|
196
200
|
headerActions: /* @__PURE__ */ y(x, {
|
|
197
201
|
primary: {
|
|
198
|
-
label:
|
|
202
|
+
label: k("movethewheels.inventory.actions.addProduct", "Add Product"),
|
|
199
203
|
icon: /* @__PURE__ */ y(re, { size: 16 }),
|
|
200
204
|
onSelect: () => Z("inventory/products/new")
|
|
201
205
|
},
|
|
202
206
|
actions: [
|
|
203
207
|
{
|
|
204
|
-
label:
|
|
208
|
+
label: k("movethewheels.inventory.actions.receiveStock", "Receive stock"),
|
|
205
209
|
icon: /* @__PURE__ */ y(ne, { size: 16 }),
|
|
206
210
|
onSelect: () => W(!0)
|
|
207
211
|
},
|
|
208
212
|
{
|
|
209
|
-
label:
|
|
213
|
+
label: k("movethewheels.inventory.actions.products", "Products"),
|
|
210
214
|
onSelect: () => Z("inventory/products")
|
|
211
215
|
},
|
|
212
216
|
{
|
|
213
|
-
label:
|
|
217
|
+
label: k("movethewheels.inventory.actions.warehouses", "Warehouses"),
|
|
214
218
|
onSelect: () => Z("inventory/warehouses")
|
|
215
219
|
}
|
|
216
220
|
]
|
|
@@ -218,7 +222,7 @@ function D() {
|
|
|
218
222
|
children: [
|
|
219
223
|
/* @__PURE__ */ y(C, {
|
|
220
224
|
icon: /* @__PURE__ */ y(o, { size: 18 }),
|
|
221
|
-
children:
|
|
225
|
+
children: k("movethewheels.inventory.purpose", "A real-time view of what you have and where. Track on-hand, allocated and free-to-promise quantities across warehouses, follow every stock movement, catch low-stock items before they run out, and drill into products or warehouses to manage what you can promise on an order.")
|
|
222
226
|
}),
|
|
223
227
|
U && /* @__PURE__ */ y("div", {
|
|
224
228
|
className: "mb-2",
|
|
@@ -231,7 +235,7 @@ function D() {
|
|
|
231
235
|
children: [
|
|
232
236
|
/* @__PURE__ */ y("p", {
|
|
233
237
|
className: "text-status-error-text font-medium",
|
|
234
|
-
children:
|
|
238
|
+
children: k("movethewheels.inventory.error.title", "Couldn't load inventory")
|
|
235
239
|
}),
|
|
236
240
|
/* @__PURE__ */ y("p", {
|
|
237
241
|
className: "text-sm text-text-secondary",
|
|
@@ -240,7 +244,7 @@ function D() {
|
|
|
240
244
|
/* @__PURE__ */ y(d, {
|
|
241
245
|
variant: "outline",
|
|
242
246
|
onClick: z,
|
|
243
|
-
children:
|
|
247
|
+
children: k("movethewheels.inventory.error.retry", "Retry")
|
|
244
248
|
})
|
|
245
249
|
]
|
|
246
250
|
})
|
|
@@ -251,42 +255,42 @@ function D() {
|
|
|
251
255
|
columns: 6,
|
|
252
256
|
children: [
|
|
253
257
|
/* @__PURE__ */ y(h, {
|
|
254
|
-
label:
|
|
258
|
+
label: k("movethewheels.inventory.metrics.totalOnHand", "Total on-hand"),
|
|
255
259
|
value: B.totalOnHand.toLocaleString(),
|
|
256
260
|
icon: /* @__PURE__ */ y(r, { size: 20 }),
|
|
257
261
|
accent: "brand",
|
|
258
|
-
subtitle:
|
|
262
|
+
subtitle: k("movethewheels.inventory.metrics.onHandHint", "Units in the network")
|
|
259
263
|
}),
|
|
260
264
|
/* @__PURE__ */ y(h, {
|
|
261
|
-
label:
|
|
265
|
+
label: k("movethewheels.inventory.metrics.available", "Available"),
|
|
262
266
|
value: B.totalAvailable.toLocaleString(),
|
|
263
267
|
icon: /* @__PURE__ */ y(a, { size: 20 }),
|
|
264
268
|
accent: "success",
|
|
265
|
-
subtitle:
|
|
269
|
+
subtitle: k("movethewheels.inventory.metrics.availableHint", "Free to promise")
|
|
266
270
|
}),
|
|
267
271
|
/* @__PURE__ */ y(h, {
|
|
268
|
-
label:
|
|
272
|
+
label: k("movethewheels.inventory.metrics.allocated", "Allocated"),
|
|
269
273
|
value: B.totalAllocated.toLocaleString(),
|
|
270
274
|
icon: /* @__PURE__ */ y(te, { size: 20 }),
|
|
271
275
|
accent: "blue",
|
|
272
|
-
subtitle:
|
|
276
|
+
subtitle: k("movethewheels.inventory.metrics.allocatedHint", "Committed to orders")
|
|
273
277
|
}),
|
|
274
278
|
/* @__PURE__ */ y(h, {
|
|
275
|
-
label:
|
|
279
|
+
label: k("movethewheels.inventory.metrics.lowStock", "Low-stock items"),
|
|
276
280
|
value: B.lowStockCount.toLocaleString(),
|
|
277
281
|
icon: /* @__PURE__ */ y(s, { size: 20 }),
|
|
278
282
|
accent: "warning",
|
|
279
|
-
subtitle:
|
|
283
|
+
subtitle: k("movethewheels.inventory.metrics.lowStockHint", "At or under reorder point")
|
|
280
284
|
}),
|
|
281
285
|
/* @__PURE__ */ y(h, {
|
|
282
|
-
label:
|
|
286
|
+
label: k("movethewheels.inventory.metrics.totalProducts", "Catalog items"),
|
|
283
287
|
value: B.totalProducts.toLocaleString(),
|
|
284
288
|
icon: /* @__PURE__ */ y(o, { size: 20 }),
|
|
285
289
|
accent: "neutral",
|
|
286
290
|
onClick: () => Z("inventory/products")
|
|
287
291
|
}),
|
|
288
292
|
/* @__PURE__ */ y(h, {
|
|
289
|
-
label:
|
|
293
|
+
label: k("movethewheels.inventory.metrics.warehouses", "Warehouses"),
|
|
290
294
|
value: B.totalWarehouses.toLocaleString(),
|
|
291
295
|
icon: /* @__PURE__ */ y(ae, { size: 20 }),
|
|
292
296
|
accent: "neutral",
|
|
@@ -300,11 +304,11 @@ function D() {
|
|
|
300
304
|
className: "flex items-center gap-2 text-base font-semibold text-status-warning-text",
|
|
301
305
|
children: [
|
|
302
306
|
/* @__PURE__ */ y(s, { size: 18 }),
|
|
303
|
-
|
|
307
|
+
k("movethewheels.inventory.lowStock.title", "Low Stock Alert"),
|
|
304
308
|
" (",
|
|
305
309
|
B.lowStockCount,
|
|
306
310
|
" ",
|
|
307
|
-
|
|
311
|
+
k("movethewheels.inventory.lowStock.items", "items"),
|
|
308
312
|
")"
|
|
309
313
|
]
|
|
310
314
|
}), /* @__PURE__ */ y("div", { children: /* @__PURE__ */ y("div", {
|
|
@@ -313,11 +317,11 @@ function D() {
|
|
|
313
317
|
className: "flex items-center justify-between p-3 bg-status-warning-bg/10 rounded-lg",
|
|
314
318
|
children: [/* @__PURE__ */ b("div", { children: [/* @__PURE__ */ y("p", {
|
|
315
319
|
className: "font-medium",
|
|
316
|
-
children: e.productName ??
|
|
320
|
+
children: e.productName ?? k("movethewheels.inventory.lowStock.unknownProduct", "Unknown Product")
|
|
317
321
|
}), /* @__PURE__ */ b("p", {
|
|
318
322
|
className: "text-sm text-text-secondary",
|
|
319
323
|
children: [
|
|
320
|
-
|
|
324
|
+
k("movethewheels.inventory.lowStock.sku", "SKU:"),
|
|
321
325
|
" ",
|
|
322
326
|
e.productSku ?? "—"
|
|
323
327
|
]
|
|
@@ -328,12 +332,12 @@ function D() {
|
|
|
328
332
|
children: [
|
|
329
333
|
e.availableQuantity,
|
|
330
334
|
" ",
|
|
331
|
-
|
|
335
|
+
k("movethewheels.inventory.lowStock.left", "left")
|
|
332
336
|
]
|
|
333
337
|
}), /* @__PURE__ */ b("p", {
|
|
334
338
|
className: "text-sm text-text-secondary",
|
|
335
339
|
children: [
|
|
336
|
-
|
|
340
|
+
k("movethewheels.inventory.lowStock.reorderAt", "Reorder at:"),
|
|
337
341
|
" ",
|
|
338
342
|
e.reorderLevel
|
|
339
343
|
]
|
|
@@ -347,15 +351,15 @@ function D() {
|
|
|
347
351
|
children: [/* @__PURE__ */ y("div", {
|
|
348
352
|
className: "xl:col-span-2",
|
|
349
353
|
children: /* @__PURE__ */ y(m, {
|
|
350
|
-
title:
|
|
354
|
+
title: k("movethewheels.inventory.stock.title", "Stock position"),
|
|
351
355
|
children: /* @__PURE__ */ y(me, {
|
|
352
|
-
columns:
|
|
353
|
-
data:
|
|
356
|
+
columns: Re,
|
|
357
|
+
data: Le,
|
|
354
358
|
isLoading: L,
|
|
355
359
|
error: R,
|
|
356
360
|
onRetry: z,
|
|
357
361
|
searchable: !0,
|
|
358
|
-
searchPlaceholder:
|
|
362
|
+
searchPlaceholder: k("movethewheels.inventory.stock.search", "Search product, SKU or warehouse..."),
|
|
359
363
|
searchFields: [
|
|
360
364
|
"productName",
|
|
361
365
|
"sku",
|
|
@@ -363,39 +367,39 @@ function D() {
|
|
|
363
367
|
],
|
|
364
368
|
searchQuery: A,
|
|
365
369
|
onSearchQueryChange: (e) => {
|
|
366
|
-
|
|
370
|
+
De(e), M(0);
|
|
367
371
|
},
|
|
368
372
|
pageIndex: j,
|
|
369
373
|
pageSize: N,
|
|
370
374
|
onPageChange: M,
|
|
371
375
|
onPageSizeChange: (e) => {
|
|
372
|
-
|
|
376
|
+
Oe(e), M(0);
|
|
373
377
|
},
|
|
374
|
-
totalItems:
|
|
375
|
-
hasNextPage:
|
|
378
|
+
totalItems: Ae,
|
|
379
|
+
hasNextPage: je,
|
|
376
380
|
onRowClick: (e) => Z(`inventory/products/${e.productId}`),
|
|
377
381
|
getRowId: (e) => e.id,
|
|
378
382
|
emptyIllustration: "empty-data",
|
|
379
|
-
emptyTitle:
|
|
380
|
-
emptyDescription:
|
|
383
|
+
emptyTitle: k("movethewheels.inventory.stock.emptyTitle", "No stock recorded yet"),
|
|
384
|
+
emptyDescription: k("movethewheels.inventory.stock.emptyDescription", "Stock lines appear here once a product is received into a warehouse.")
|
|
381
385
|
})
|
|
382
386
|
})
|
|
383
387
|
}), /* @__PURE__ */ b(f, {
|
|
384
388
|
className: "h-fit",
|
|
385
389
|
children: [/* @__PURE__ */ y(le, { children: /* @__PURE__ */ b(ue, {
|
|
386
390
|
className: "flex items-center gap-2",
|
|
387
|
-
children: [/* @__PURE__ */ y(ee, { size: 18 }),
|
|
391
|
+
children: [/* @__PURE__ */ y(ee, { size: 18 }), k("movethewheels.inventory.transactions.title", "Recent transactions")]
|
|
388
392
|
}) }), /* @__PURE__ */ y(p, {
|
|
389
393
|
className: "p-0",
|
|
390
394
|
children: H ? /* @__PURE__ */ y("p", {
|
|
391
395
|
className: "p-6 text-sm text-status-error-text",
|
|
392
396
|
children: H.message
|
|
393
|
-
}) :
|
|
397
|
+
}) : Ne ? /* @__PURE__ */ y("p", {
|
|
394
398
|
className: "p-6 text-sm text-text-secondary",
|
|
395
|
-
children:
|
|
399
|
+
children: k("movethewheels.inventory.transactions.loading", "Loading movements…")
|
|
396
400
|
}) : V.length === 0 ? /* @__PURE__ */ y("p", {
|
|
397
401
|
className: "p-6 text-sm text-text-secondary",
|
|
398
|
-
children:
|
|
402
|
+
children: k("movethewheels.inventory.transactions.empty", "No stock movements recorded yet. Receipts, issues and adjustments show up here as they happen.")
|
|
399
403
|
}) : /* @__PURE__ */ y("ul", {
|
|
400
404
|
className: "divide-y",
|
|
401
405
|
children: V.map((r) => {
|
|
@@ -427,9 +431,9 @@ function D() {
|
|
|
427
431
|
children: ve(r.createdAt, "short")
|
|
428
432
|
})
|
|
429
433
|
]
|
|
430
|
-
}), /* @__PURE__ */
|
|
434
|
+
}), /* @__PURE__ */ y("span", {
|
|
431
435
|
className: i === "in" ? "font-medium text-status-success-text" : i === "out" ? "font-medium text-status-warning-text" : "font-medium text-text-primary",
|
|
432
|
-
children:
|
|
436
|
+
children: D(i, r.quantity)
|
|
433
437
|
})]
|
|
434
438
|
}, r.id);
|
|
435
439
|
})
|
|
@@ -440,13 +444,13 @@ function D() {
|
|
|
440
444
|
/* @__PURE__ */ b("div", {
|
|
441
445
|
className: "grid grid-cols-1 lg:grid-cols-2 gap-6",
|
|
442
446
|
children: [/* @__PURE__ */ y(m, {
|
|
443
|
-
title:
|
|
447
|
+
title: k("movethewheels.inventory.warehouses.title", "Warehouses"),
|
|
444
448
|
actions: /* @__PURE__ */ b(d, {
|
|
445
449
|
variant: "ghost",
|
|
446
450
|
size: "sm",
|
|
447
451
|
onClick: () => Z("inventory/warehouses"),
|
|
448
452
|
children: [
|
|
449
|
-
|
|
453
|
+
k("movethewheels.inventory.common.viewAll", "View all"),
|
|
450
454
|
" ",
|
|
451
455
|
/* @__PURE__ */ y(i, { size: 16 })
|
|
452
456
|
]
|
|
@@ -455,7 +459,7 @@ function D() {
|
|
|
455
459
|
className: "p-0",
|
|
456
460
|
children: /* @__PURE__ */ y("div", {
|
|
457
461
|
className: "divide-y",
|
|
458
|
-
children:
|
|
462
|
+
children: ke.map((e) => /* @__PURE__ */ y("div", {
|
|
459
463
|
role: "button",
|
|
460
464
|
tabIndex: 0,
|
|
461
465
|
"aria-label": `View warehouse ${e.name}`,
|
|
@@ -474,12 +478,12 @@ function D() {
|
|
|
474
478
|
className: "text-right",
|
|
475
479
|
children: [/* @__PURE__ */ y(u, {
|
|
476
480
|
variant: e.status?.toUpperCase() === "ACTIVE" ? "default" : "secondary",
|
|
477
|
-
children: e.status ? e.status.toUpperCase() === "ACTIVE" ?
|
|
481
|
+
children: e.status ? e.status.toUpperCase() === "ACTIVE" ? k("movethewheels.inventory.warehouses.active", "Active") : k("movethewheels.inventory.warehouses.inactive", "Inactive") : "Not provided"
|
|
478
482
|
}), /* @__PURE__ */ b("div", {
|
|
479
483
|
className: "mt-2",
|
|
480
484
|
children: [/* @__PURE__ */ y("p", {
|
|
481
485
|
className: "text-xs text-text-secondary",
|
|
482
|
-
children:
|
|
486
|
+
children: k("movethewheels.inventory.warehouses.utilization", "Utilization")
|
|
483
487
|
}), e.utilization === void 0 ? /* @__PURE__ */ y("p", {
|
|
484
488
|
className: "text-xs text-text-tertiary",
|
|
485
489
|
children: "Not provided"
|
|
@@ -494,13 +498,13 @@ function D() {
|
|
|
494
498
|
})
|
|
495
499
|
}) })
|
|
496
500
|
}), /* @__PURE__ */ y(m, {
|
|
497
|
-
title:
|
|
501
|
+
title: k("movethewheels.inventory.products.title", "Recent Products"),
|
|
498
502
|
actions: /* @__PURE__ */ b(d, {
|
|
499
503
|
variant: "ghost",
|
|
500
504
|
size: "sm",
|
|
501
505
|
onClick: () => Z("inventory/products"),
|
|
502
506
|
children: [
|
|
503
|
-
|
|
507
|
+
k("movethewheels.inventory.common.viewAll", "View all"),
|
|
504
508
|
" ",
|
|
505
509
|
/* @__PURE__ */ y(i, { size: 16 })
|
|
506
510
|
]
|
|
@@ -541,7 +545,7 @@ function D() {
|
|
|
541
545
|
})]
|
|
542
546
|
}),
|
|
543
547
|
/* @__PURE__ */ y(xe, {
|
|
544
|
-
open:
|
|
548
|
+
open: Ie,
|
|
545
549
|
onOpenChange: W,
|
|
546
550
|
onDone: X
|
|
547
551
|
}),
|
|
@@ -565,4 +569,4 @@ function D() {
|
|
|
565
569
|
});
|
|
566
570
|
}
|
|
567
571
|
//#endregion
|
|
568
|
-
export {
|
|
572
|
+
export { O as default };
|
package/package.json
CHANGED
|
@@ -407,28 +407,10 @@ const TRANSFER_INVENTORY_STOCK_MUTATION = `
|
|
|
407
407
|
mutation TransferInventoryStock($input: TransferInventoryStockInput!) {
|
|
408
408
|
transferInventoryStock(input: $input) {
|
|
409
409
|
source {
|
|
410
|
-
|
|
411
|
-
cargoItemId
|
|
412
|
-
warehouseId
|
|
413
|
-
onHand
|
|
414
|
-
available
|
|
415
|
-
allocated
|
|
416
|
-
damaged
|
|
417
|
-
reorderPoint
|
|
418
|
-
createdAt
|
|
419
|
-
updatedAt
|
|
410
|
+
${INVENTORY_LINE_FIELDS}
|
|
420
411
|
}
|
|
421
412
|
destination {
|
|
422
|
-
|
|
423
|
-
cargoItemId
|
|
424
|
-
warehouseId
|
|
425
|
-
onHand
|
|
426
|
-
available
|
|
427
|
-
allocated
|
|
428
|
-
damaged
|
|
429
|
-
reorderPoint
|
|
430
|
-
createdAt
|
|
431
|
-
updatedAt
|
|
413
|
+
${INVENTORY_LINE_FIELDS}
|
|
432
414
|
}
|
|
433
415
|
}
|
|
434
416
|
}
|
|
@@ -94,6 +94,21 @@ const TRANSACTION_LABELS: Record<InventoryTransactionType, string> = {
|
|
|
94
94
|
ADJUSTMENT: 'Adjustment',
|
|
95
95
|
};
|
|
96
96
|
|
|
97
|
+
/**
|
|
98
|
+
* Ledger quantity with its sign. RECEIPT/RETURN/ISSUE have a fixed direction, so
|
|
99
|
+
* the magnitude is shown with that sign. TRANSFER and ADJUSTMENT are neutral —
|
|
100
|
+
* the sign stored on the row is the only thing that says whether stock came in
|
|
101
|
+
* or went out (a transfer writes one row of each), so it must never be dropped.
|
|
102
|
+
*/
|
|
103
|
+
function formatLedgerQuantity(direction: 'in' | 'out' | 'neutral', quantity: number): string {
|
|
104
|
+
const magnitude = Math.abs(quantity).toLocaleString();
|
|
105
|
+
if (direction === 'in') return `+${magnitude}`;
|
|
106
|
+
if (direction === 'out') return `−${magnitude}`;
|
|
107
|
+
if (quantity > 0) return `+${magnitude}`;
|
|
108
|
+
if (quantity < 0) return `−${magnitude}`;
|
|
109
|
+
return magnitude;
|
|
110
|
+
}
|
|
111
|
+
|
|
97
112
|
export default function InventoryPage() {
|
|
98
113
|
const { t: translate } = useI18n();
|
|
99
114
|
const t = (key: string, fallback: string): string => {
|
|
@@ -537,8 +552,7 @@ export default function InventoryPage() {
|
|
|
537
552
|
: 'font-medium text-text-primary'
|
|
538
553
|
}
|
|
539
554
|
>
|
|
540
|
-
{direction
|
|
541
|
-
{Math.abs(transaction.quantity).toLocaleString()}
|
|
555
|
+
{formatLedgerQuantity(direction, transaction.quantity)}
|
|
542
556
|
</span>
|
|
543
557
|
</li>
|
|
544
558
|
);
|