@burdenoff/microfe-movethewheels 2026.703.8 → 2026.704.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/dist/{CreateOrderPage-V8aXfcpN.js → CreateOrderPage-CXbhJLLz.js} +163 -138
  2. package/dist/{DashboardPage-DiD-cWwD.js → DashboardPage-BoswH3ec.js} +2 -2
  3. package/dist/DriverDetailsPage-CPO0G8Ki.js +518 -0
  4. package/dist/{DriversPage-DW-FGPFW.js → DriversPage-6Z61dpDI.js} +1 -1
  5. package/dist/{FleetPage-P9k4zZqP.js → FleetPage-qWRj7WFO.js} +1 -1
  6. package/dist/{InventoryPage-BWikjZMW.js → InventoryPage-DbR4Z--d.js} +1 -1
  7. package/dist/{LiveTrackingPage-UQBWlthJ.js → LiveTrackingPage-5U68u3oA.js} +1 -1
  8. package/dist/{OrderDetailsPage-2J4ua0wd.js → OrderDetailsPage-DRYifXm9.js} +1 -1
  9. package/dist/ProductDetailsPage-CWgcRqGR.js +375 -0
  10. package/dist/{ProductsPage-Bn1U2jTj.js → ProductsPage-CokwDOR2.js} +1 -1
  11. package/dist/{RouteDetailsPage-CgSY1CTd.js → RouteDetailsPage-sRRVY5UM.js} +243 -211
  12. package/dist/{RoutesPage-Dqd5Don6.js → RoutesPage-hec06HnD.js} +1 -1
  13. package/dist/{SettingsPage-2a05Sq2k.js → SettingsPage-_6SIlcBX.js} +1 -1
  14. package/dist/{TrackingPage-SnjW6qeD.js → TrackingPage-Cg0tYGJe.js} +1 -1
  15. package/dist/{VehicleDetailsPage-CvRMJ2zC.js → VehicleDetailsPage-BbZlCFPo.js} +159 -135
  16. package/dist/{VehiclesPage-qxf-1C1B.js → VehiclesPage-BfBEyXGs.js} +1 -1
  17. package/dist/WarehouseDetailsPage-DxNhiaoI.js +515 -0
  18. package/dist/{WarehousesPage-44Wj7AGT.js → WarehousesPage-M3NaBT0z.js} +1 -1
  19. package/dist/index.js +26 -6
  20. package/dist/{useFleet-BXSocBD_.js → useFleet-BfA_-VUW.js} +100 -71
  21. package/dist/{useInventory-DmZficcp.js → useInventory-BO7TSgq_.js} +98 -72
  22. package/dist/{useRoutes-C_ZCYJ_h.js → useRoutes-DAdy2BGv.js} +8 -8
  23. package/dist/{useSettings-CteNasBE.js → useSettings-BNNzQs_B.js} +1 -1
  24. package/dist/{useTracking-B7ttexRe.js → useTracking-7nd_XOSL.js} +1 -1
  25. package/package.json +1 -1
  26. package/src/movethewheels/MoveTheWheelsRoutes.tsx +5 -0
  27. package/src/movethewheels/hooks/useFleet.ts +113 -0
  28. package/src/movethewheels/hooks/useInventory.ts +86 -0
  29. package/src/movethewheels/hooks/useRoutes.ts +17 -7
  30. package/src/movethewheels/hooks/useSettings.ts +8 -1
  31. package/src/movethewheels/pages/CreateOrderPage.tsx +48 -6
  32. package/src/movethewheels/pages/DriverDetailsPage.tsx +56 -18
  33. package/src/movethewheels/pages/ProductDetailsPage.tsx +51 -15
  34. package/src/movethewheels/pages/RouteDetailsPage.tsx +51 -7
  35. package/src/movethewheels/pages/VehicleDetailsPage.tsx +51 -15
  36. package/src/movethewheels/pages/WarehouseDetailsPage.tsx +46 -10
  37. package/src/movethewheels/types/index.ts +3 -0
  38. package/dist/DriverDetailsPage-DjaXaATQ.js +0 -490
  39. package/dist/ProductDetailsPage-BSjWLrty.js +0 -350
  40. package/dist/WarehouseDetailsPage-D0Wyyj1Y.js +0 -493
@@ -0,0 +1,375 @@
1
+ import { A as e, d as t, f as n, g as r, h as i, i as a, j as o, l as s, lt as c, n as l, r as u, st as d, u as f, ut as p } from "./PageLayout-j9Zw3wBN.js";
2
+ import { t as m } from "./arrow-left-1dVWv2dg.js";
3
+ import { t as h } from "./box-DW1KNP8j.js";
4
+ import { t as g } from "./dollar-sign-CYGHy2oS.js";
5
+ import { t as _ } from "./package-UyaWiALC.js";
6
+ import { t as v } from "./save-CcfoIn2J.js";
7
+ import { t as y } from "./square-pen-Dr1X-P2s.js";
8
+ import { r as b, t as x } from "./useInventory-BO7TSgq_.js";
9
+ import { t as S } from "./FormError-D4T5FWZA.js";
10
+ import { n as C } from "./formatters-FWJDwTFv.js";
11
+ import { useEffect as w, useState as T } from "react";
12
+ import { useLocation as E, useParams as D } from "react-router-dom";
13
+ import { jsx as O, jsxs as k } from "react/jsx-runtime";
14
+ import { EmphasisPanel as A, NextSteps as j, PagePurpose as M } from "@burdenoff/fe-libs/ui";
15
+ //#region node_modules/lucide-react/dist/esm/icons/tag.js
16
+ var N = p("Tag", [["path", {
17
+ d: "M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z",
18
+ key: "vktsd0"
19
+ }], ["circle", {
20
+ cx: "7.5",
21
+ cy: "7.5",
22
+ r: ".5",
23
+ fill: "currentColor",
24
+ key: "kqv944"
25
+ }]]);
26
+ //#endregion
27
+ //#region src/movethewheels/pages/ProductDetailsPage.tsx
28
+ function P({ editId: t }) {
29
+ let { basePath: n, navigate: r } = d(), { createProduct: i, updateProduct: s } = x(), { product: l } = b(t), u = !!t, [p, h] = T({
30
+ name: "",
31
+ sku: "",
32
+ category: "",
33
+ brand: "",
34
+ weight: ""
35
+ }), [g, y] = T(!1), [C, E] = T(null);
36
+ w(() => {
37
+ t && l && h({
38
+ name: l.name ?? "",
39
+ sku: l.sku ?? "",
40
+ category: l.category ?? "",
41
+ brand: l.brand ?? "",
42
+ weight: l.weight == null ? "" : String(l.weight)
43
+ });
44
+ }, [t, l]);
45
+ let D = () => r?.(c(n, "inventory/products")), j = async (e) => {
46
+ if (e.preventDefault(), !p.name.trim() || !p.sku.trim()) {
47
+ E("Product name and SKU are required.");
48
+ return;
49
+ }
50
+ y(!0), E(null);
51
+ try {
52
+ let e = p.weight.trim() ? Number(p.weight) : void 0;
53
+ if (u && t) {
54
+ let i = await s(t, {
55
+ name: p.name.trim(),
56
+ sku: p.sku.trim(),
57
+ category: p.category.trim() || void 0,
58
+ brand: p.brand.trim() || void 0,
59
+ weight: e !== void 0 && !Number.isNaN(e) ? e : void 0
60
+ });
61
+ r?.(c(n, `inventory/products/${i.id}`));
62
+ } else {
63
+ let t = await i({
64
+ name: p.name.trim(),
65
+ sku: p.sku.trim(),
66
+ category: p.category.trim() || void 0,
67
+ brand: p.brand.trim() || void 0,
68
+ weight: e !== void 0 && !Number.isNaN(e) ? e : void 0
69
+ });
70
+ r?.(c(n, `inventory/products/${t.id}`));
71
+ }
72
+ } catch (e) {
73
+ console.error("Failed to create product:", e), E(e instanceof Error ? e.message : "Failed to create product. Please try again."), y(!1);
74
+ }
75
+ };
76
+ return /* @__PURE__ */ k(a, {
77
+ title: u ? "Edit Product" : "Add Product",
78
+ subtitle: "Add an item to your catalog",
79
+ icon: /* @__PURE__ */ O(_, { size: 24 }),
80
+ headerActions: /* @__PURE__ */ k("div", {
81
+ className: "flex gap-2",
82
+ children: [/* @__PURE__ */ k(f, {
83
+ variant: "outline",
84
+ onClick: D,
85
+ disabled: g,
86
+ children: [/* @__PURE__ */ O(m, { size: 16 }), " Cancel"]
87
+ }), /* @__PURE__ */ k(f, {
88
+ onClick: j,
89
+ disabled: g,
90
+ children: [
91
+ /* @__PURE__ */ O(v, { size: 16 }),
92
+ " ",
93
+ u ? g ? "Saving..." : "Save Changes" : g ? "Saving..." : "Add Product"
94
+ ]
95
+ })]
96
+ }),
97
+ children: [/* @__PURE__ */ O(M, {
98
+ icon: /* @__PURE__ */ O(_, { size: 18 }),
99
+ children: "Add a product so it can be added to orders and stocked in warehouses. A name and SKU are all it takes to start — category, brand and weight help with picking, pricing and routing."
100
+ }), /* @__PURE__ */ k("form", {
101
+ onSubmit: j,
102
+ className: "max-w-2xl space-y-6",
103
+ children: [/* @__PURE__ */ O(S, { message: C }), /* @__PURE__ */ k(A, { children: [/* @__PURE__ */ O("h2", {
104
+ className: "text-base font-semibold text-text-primary mb-4",
105
+ children: "Product Details"
106
+ }), /* @__PURE__ */ k("div", {
107
+ className: "space-y-4",
108
+ children: [/* @__PURE__ */ k("div", {
109
+ className: "grid grid-cols-1 md:grid-cols-2 gap-4",
110
+ children: [/* @__PURE__ */ k("div", {
111
+ className: "space-y-2",
112
+ children: [/* @__PURE__ */ k(o, {
113
+ htmlFor: "name",
114
+ children: ["Name ", /* @__PURE__ */ O("span", {
115
+ className: "text-status-error-text",
116
+ children: "*"
117
+ })]
118
+ }), /* @__PURE__ */ O(e, {
119
+ id: "name",
120
+ value: p.name,
121
+ onChange: (e) => h((t) => ({
122
+ ...t,
123
+ name: e.target.value
124
+ })),
125
+ placeholder: "Wireless Headphones",
126
+ required: !0
127
+ })]
128
+ }), /* @__PURE__ */ k("div", {
129
+ className: "space-y-2",
130
+ children: [/* @__PURE__ */ k(o, {
131
+ htmlFor: "sku",
132
+ children: ["SKU ", /* @__PURE__ */ O("span", {
133
+ className: "text-status-error-text",
134
+ children: "*"
135
+ })]
136
+ }), /* @__PURE__ */ O(e, {
137
+ id: "sku",
138
+ value: p.sku,
139
+ onChange: (e) => h((t) => ({
140
+ ...t,
141
+ sku: e.target.value
142
+ })),
143
+ placeholder: "SKU-001",
144
+ required: !0
145
+ })]
146
+ })]
147
+ }), /* @__PURE__ */ k("div", {
148
+ className: "grid grid-cols-1 md:grid-cols-3 gap-4",
149
+ children: [
150
+ /* @__PURE__ */ k("div", {
151
+ className: "space-y-2",
152
+ children: [/* @__PURE__ */ O(o, {
153
+ htmlFor: "category",
154
+ children: "Category"
155
+ }), /* @__PURE__ */ O(e, {
156
+ id: "category",
157
+ value: p.category,
158
+ onChange: (e) => h((t) => ({
159
+ ...t,
160
+ category: e.target.value
161
+ })),
162
+ placeholder: "Electronics"
163
+ })]
164
+ }),
165
+ /* @__PURE__ */ k("div", {
166
+ className: "space-y-2",
167
+ children: [/* @__PURE__ */ O(o, {
168
+ htmlFor: "brand",
169
+ children: "Brand"
170
+ }), /* @__PURE__ */ O(e, {
171
+ id: "brand",
172
+ value: p.brand,
173
+ onChange: (e) => h((t) => ({
174
+ ...t,
175
+ brand: e.target.value
176
+ })),
177
+ placeholder: "Acme"
178
+ })]
179
+ }),
180
+ /* @__PURE__ */ k("div", {
181
+ className: "space-y-2",
182
+ children: [/* @__PURE__ */ O(o, {
183
+ htmlFor: "weight",
184
+ children: "Weight (kg)"
185
+ }), /* @__PURE__ */ O(e, {
186
+ id: "weight",
187
+ type: "number",
188
+ min: "0",
189
+ step: "0.01",
190
+ value: p.weight,
191
+ onChange: (e) => h((t) => ({
192
+ ...t,
193
+ weight: e.target.value
194
+ })),
195
+ placeholder: "0.5"
196
+ })]
197
+ })
198
+ ]
199
+ })]
200
+ })] })]
201
+ })]
202
+ });
203
+ }
204
+ function F() {
205
+ let { productId: e } = D(), { basePath: o, navigate: p } = d(), { product: v, isLoading: x, error: S, refetch: w } = b(e), T = E().pathname.endsWith("/edit"), F = () => p?.(c(o, "inventory/products")), I = (e) => p?.(c(o, e));
206
+ return e ? T ? /* @__PURE__ */ O(P, { editId: e }) : x ? /* @__PURE__ */ O(u, { message: "Loading product details..." }) : S || !v ? /* @__PURE__ */ O(l, {
207
+ title: "Product not found",
208
+ onRetry: w
209
+ }) : /* @__PURE__ */ k(a, {
210
+ title: v.name,
211
+ subtitle: `SKU: ${v.sku}`,
212
+ icon: /* @__PURE__ */ O(_, { size: 24 }),
213
+ headerActions: /* @__PURE__ */ k("div", {
214
+ className: "flex gap-2",
215
+ children: [/* @__PURE__ */ k(f, {
216
+ variant: "outline",
217
+ onClick: F,
218
+ children: [/* @__PURE__ */ O(m, { size: 16 }), " Back"]
219
+ }), /* @__PURE__ */ k(f, {
220
+ onClick: () => p?.(c(o, `inventory/products/${e}/edit`)),
221
+ children: [/* @__PURE__ */ O(y, { size: 16 }), " Edit"]
222
+ })]
223
+ }),
224
+ headerContent: /* @__PURE__ */ k("div", {
225
+ className: "flex gap-2",
226
+ children: [
227
+ /* @__PURE__ */ O(s, {
228
+ variant: "outline",
229
+ children: v.category
230
+ }),
231
+ v.brand && /* @__PURE__ */ O(s, {
232
+ variant: "secondary",
233
+ children: v.brand
234
+ }),
235
+ v.fragile && /* @__PURE__ */ O(s, {
236
+ variant: "destructive",
237
+ children: "Fragile"
238
+ }),
239
+ v.hazardous && /* @__PURE__ */ O(s, {
240
+ variant: "destructive",
241
+ children: "Hazardous"
242
+ }),
243
+ v.temperatureControlled && /* @__PURE__ */ O(s, {
244
+ variant: "secondary",
245
+ children: "Temp Controlled"
246
+ })
247
+ ]
248
+ }),
249
+ children: [
250
+ /* @__PURE__ */ O(M, {
251
+ icon: /* @__PURE__ */ O(_, { size: 18 }),
252
+ children: "The catalog record for this item — its dimensions, weight, value and handling flags. These drive how it's packed, priced and routed, so keep them accurate before adding the product to an order or stocking it in a warehouse."
253
+ }),
254
+ /* @__PURE__ */ O(j, {
255
+ storageKey: "movethewheels-product-details",
256
+ steps: [{
257
+ id: "order",
258
+ label: "Add this product to an order",
259
+ description: "Include it on a new delivery.",
260
+ icon: /* @__PURE__ */ O(_, { size: 16 }),
261
+ onClick: () => I("orders/new")
262
+ }, {
263
+ id: "edit",
264
+ label: "Edit product details",
265
+ description: "Update dimensions, value or handling flags.",
266
+ icon: /* @__PURE__ */ O(N, { size: 16 }),
267
+ onClick: () => {}
268
+ }]
269
+ }),
270
+ /* @__PURE__ */ k("div", {
271
+ className: "grid grid-cols-1 lg:grid-cols-3 gap-6",
272
+ children: [/* @__PURE__ */ k("div", {
273
+ className: "lg:col-span-2 space-y-6",
274
+ children: [
275
+ /* @__PURE__ */ k(t, { children: [/* @__PURE__ */ O(i, { children: /* @__PURE__ */ O(r, { children: "Description" }) }), /* @__PURE__ */ O(n, { children: /* @__PURE__ */ O("p", { children: v.description }) })] }),
276
+ /* @__PURE__ */ k(t, { children: [/* @__PURE__ */ O(i, { children: /* @__PURE__ */ k(r, {
277
+ className: "flex items-center gap-2",
278
+ children: [/* @__PURE__ */ O(h, { size: 18 }), " Dimensions & Weight"]
279
+ }) }), /* @__PURE__ */ O(n, { children: /* @__PURE__ */ k("div", {
280
+ className: "grid grid-cols-2 md:grid-cols-4 gap-4",
281
+ children: [
282
+ /* @__PURE__ */ k("div", { children: [/* @__PURE__ */ O("p", {
283
+ className: "text-sm text-text-secondary",
284
+ children: "Length"
285
+ }), /* @__PURE__ */ k("p", {
286
+ className: "text-2xl font-bold",
287
+ children: [v.dimensions.length, /* @__PURE__ */ k("span", {
288
+ className: "text-sm font-normal",
289
+ children: [" ", v.dimensions.unit]
290
+ })]
291
+ })] }),
292
+ /* @__PURE__ */ k("div", { children: [/* @__PURE__ */ O("p", {
293
+ className: "text-sm text-text-secondary",
294
+ children: "Width"
295
+ }), /* @__PURE__ */ k("p", {
296
+ className: "text-2xl font-bold",
297
+ children: [v.dimensions.width, /* @__PURE__ */ k("span", {
298
+ className: "text-sm font-normal",
299
+ children: [" ", v.dimensions.unit]
300
+ })]
301
+ })] }),
302
+ /* @__PURE__ */ k("div", { children: [/* @__PURE__ */ O("p", {
303
+ className: "text-sm text-text-secondary",
304
+ children: "Height"
305
+ }), /* @__PURE__ */ k("p", {
306
+ className: "text-2xl font-bold",
307
+ children: [v.dimensions.height, /* @__PURE__ */ k("span", {
308
+ className: "text-sm font-normal",
309
+ children: [" ", v.dimensions.unit]
310
+ })]
311
+ })] }),
312
+ /* @__PURE__ */ k("div", { children: [/* @__PURE__ */ O("p", {
313
+ className: "text-sm text-text-secondary",
314
+ children: "Weight"
315
+ }), /* @__PURE__ */ k("p", {
316
+ className: "text-2xl font-bold",
317
+ children: [v.weight, /* @__PURE__ */ O("span", {
318
+ className: "text-sm font-normal",
319
+ children: " kg"
320
+ })]
321
+ })] })
322
+ ]
323
+ }) })] }),
324
+ v.attributes.length > 0 && /* @__PURE__ */ k(t, { children: [/* @__PURE__ */ O(i, { children: /* @__PURE__ */ k(r, {
325
+ className: "flex items-center gap-2",
326
+ children: [/* @__PURE__ */ O(N, { size: 18 }), " Attributes"]
327
+ }) }), /* @__PURE__ */ O(n, { children: /* @__PURE__ */ O("div", {
328
+ className: "grid grid-cols-2 md:grid-cols-3 gap-4",
329
+ children: v.attributes.map((e, t) => /* @__PURE__ */ k("div", { children: [/* @__PURE__ */ O("p", {
330
+ className: "text-sm text-text-secondary",
331
+ children: e.name
332
+ }), /* @__PURE__ */ O("p", {
333
+ className: "font-medium",
334
+ children: e.value
335
+ })] }, t))
336
+ }) })] })
337
+ ]
338
+ }), /* @__PURE__ */ k("div", {
339
+ className: "space-y-6",
340
+ children: [/* @__PURE__ */ k(A, { children: [
341
+ /* @__PURE__ */ k("h2", {
342
+ className: "flex items-center gap-2 text-base font-semibold text-text-primary mb-3",
343
+ children: [/* @__PURE__ */ O(g, { size: 18 }), " Pricing"]
344
+ }),
345
+ /* @__PURE__ */ O("p", {
346
+ className: "text-3xl font-bold",
347
+ children: C(v.value)
348
+ }),
349
+ /* @__PURE__ */ O("p", {
350
+ className: "text-sm text-text-secondary",
351
+ children: "Unit price"
352
+ })
353
+ ] }), /* @__PURE__ */ k(t, { children: [/* @__PURE__ */ O(i, { children: /* @__PURE__ */ O(r, { children: "Identifiers" }) }), /* @__PURE__ */ k(n, {
354
+ className: "space-y-3",
355
+ children: [/* @__PURE__ */ k("div", { children: [/* @__PURE__ */ O("p", {
356
+ className: "text-sm text-text-secondary",
357
+ children: "SKU"
358
+ }), /* @__PURE__ */ O("p", {
359
+ className: "font-mono",
360
+ children: v.sku
361
+ })] }), v.barcode && /* @__PURE__ */ k("div", { children: [/* @__PURE__ */ O("p", {
362
+ className: "text-sm text-text-secondary",
363
+ children: "Barcode"
364
+ }), /* @__PURE__ */ O("p", {
365
+ className: "font-mono",
366
+ children: v.barcode
367
+ })] })]
368
+ })] })]
369
+ })]
370
+ })
371
+ ]
372
+ }) : /* @__PURE__ */ O(P, {});
373
+ }
374
+ //#endregion
375
+ export { F as default };
@@ -5,7 +5,7 @@ import { t as s } from "./package-UyaWiALC.js";
5
5
  import { t as c } from "./plus-Bk_G-lFC.js";
6
6
  import { t as l } from "./refresh-cw-C4-jecjy.js";
7
7
  import { t as u } from "./triangle-alert-Dh56Yu3-.js";
8
- import { a as d, i as f } from "./useInventory-DmZficcp.js";
8
+ import { a as d, i as f } from "./useInventory-BO7TSgq_.js";
9
9
  import { r as p, t as m } from "./MetricCard-CqU5WsyW.js";
10
10
  import { n as h } from "./formatters-FWJDwTFv.js";
11
11
  import { useState as g } from "react";