@burdenoff/microfe-movethewheels 2026.703.7 → 2026.704.1

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 (117) hide show
  1. package/dist/{AIAssistantPage-B7FGmmKT.js → AIAssistantPage-MWJLAMN_.js} +5 -5
  2. package/dist/{AnalyticsPage-DXduj5KB.js → AnalyticsPage-900jpV2T.js} +9 -9
  3. package/dist/{CreateOrderPage-DuJJQ16b.js → CreateOrderPage-CXbhJLLz.js} +164 -139
  4. package/dist/{CustomerDetailsPage-C98SKw7Z.js → CustomerDetailsPage-CHzg75Q5.js} +16 -16
  5. package/dist/{CustomersPage-s8hK55JL.js → CustomersPage-CwtVspuq.js} +11 -11
  6. package/dist/{DashboardPage-BsEgcKEN.js → DashboardPage-BoswH3ec.js} +17 -17
  7. package/dist/{DataTable-Da7yHjM1.js → DataTable-CmdZd6iV.js} +7 -7
  8. package/dist/{DocumentsCard-CziaTJhP.js → DocumentsCard-y2ybnAlu.js} +4 -4
  9. package/dist/DriverDetailsPage-CPO0G8Ki.js +518 -0
  10. package/dist/{DriversPage-Duy_ITG6.js → DriversPage-6Z61dpDI.js} +11 -11
  11. package/dist/{FinancePage-BZtPTpmT.js → FinancePage-DYadOUzC.js} +9 -9
  12. package/dist/{FleetPage-DJfzoHbs.js → FleetPage-qWRj7WFO.js} +10 -10
  13. package/dist/{FormError-CWjGwOW8.js → FormError-D4T5FWZA.js} +1 -1
  14. package/dist/{ImportExportPage-DJ77GK_7.js → ImportExportPage-BhWGfbH3.js} +6 -6
  15. package/dist/{InventoryPage-Dpnwk_N3.js → InventoryPage-DbR4Z--d.js} +10 -10
  16. package/dist/{LiveTrackingPage-CLlvsP1B.js → LiveTrackingPage-5U68u3oA.js} +10 -10
  17. package/dist/{MarketplacePage-d99r-v6p.js → MarketplacePage-DMH0HNDH.js} +9 -9
  18. package/dist/{MetricCard-DA5ZqAVl.js → MetricCard-CqU5WsyW.js} +2 -2
  19. package/dist/{Notice-kkjV2rLR.js → Notice-BrXJ85dA.js} +2 -2
  20. package/dist/{OrderDetailsPage-BePtkyN0.js → OrderDetailsPage-DRYifXm9.js} +28 -24
  21. package/dist/{OrdersListPage-Csy_KScx.js → OrdersListPage-DvICveRv.js} +14 -14
  22. package/dist/{PageLayout-h_q9l8af.js → PageLayout-j9Zw3wBN.js} +579 -561
  23. package/dist/ProductDetailsPage-CWgcRqGR.js +375 -0
  24. package/dist/{ProductsPage-B4jWJ5bv.js → ProductsPage-CokwDOR2.js} +9 -9
  25. package/dist/{ReportsPage-ALRYfXtz.js → ReportsPage-MU8F9DQC.js} +9 -9
  26. package/dist/RouteDetailsPage-BHQbFgI9.js +642 -0
  27. package/dist/{RoutesPage-CQHCDInT.js → RoutesPage-Dqd5Don6.js} +7 -7
  28. package/dist/{SettingsPage-BYBRrlGe.js → SettingsPage-_6SIlcBX.js} +4 -4
  29. package/dist/{Sparkline-Q-6bJ24J.js → Sparkline-DTGdlxUH.js} +1 -1
  30. package/dist/{StatusBadge-1W2p8fEi.js → StatusBadge-BfiF-nNI.js} +1 -1
  31. package/dist/{TrackingPage-CFndTIyk.js → TrackingPage-Cg0tYGJe.js} +11 -11
  32. package/dist/VehicleDetailsPage-BbZlCFPo.js +417 -0
  33. package/dist/{VehiclesPage-ClkfFZxL.js → VehiclesPage-BfBEyXGs.js} +12 -12
  34. package/dist/WarehouseDetailsPage-DxNhiaoI.js +515 -0
  35. package/dist/{WarehousesPage-kNba6cr3.js → WarehousesPage-M3NaBT0z.js} +8 -8
  36. package/dist/{arrow-left-XOzFvBFD.js → arrow-left-1dVWv2dg.js} +1 -1
  37. package/dist/{arrow-right-CRrwlvFe.js → arrow-right-PUCNATnk.js} +1 -1
  38. package/dist/{arrow-up-ClFaLPly.js → arrow-up-VQuGMABN.js} +1 -1
  39. package/dist/{box-BX4WyCLv.js → box-DW1KNP8j.js} +1 -1
  40. package/dist/{boxes-R3nq5f0_.js → boxes-D6I00XqA.js} +1 -1
  41. package/dist/{chart-column-BgF8J9bx.js → chart-column-BwQ5H9ol.js} +1 -1
  42. package/dist/{charts-BS_OnWc6.js → charts-Dv_zxP7L.js} +2 -2
  43. package/dist/{chevron-left-D3hcLQ1g.js → chevron-left-DzNxoaBG.js} +1 -1
  44. package/dist/{chevron-right-BpfSrzQF.js → chevron-right-CKm3ZC1T.js} +1 -1
  45. package/dist/{circle-alert-CLqT8iCQ.js → circle-alert-CtBm6oIb.js} +1 -1
  46. package/dist/{circle-check-CWLAr_8f.js → circle-check-B_Y7FDyR.js} +1 -1
  47. package/dist/{circle-check-big-Dsuz8dJ2.js → circle-check-big-H5pLiMBW.js} +1 -1
  48. package/dist/{clock-DrZOQD8h.js → clock-B4-qjGuB.js} +1 -1
  49. package/dist/{dollar-sign-CJfKfYul.js → dollar-sign-CYGHy2oS.js} +1 -1
  50. package/dist/{download-C-yNvUiL.js → download-BJonq2ty.js} +1 -1
  51. package/dist/{file-text-m2SyQgBo.js → file-text-C-cZx58r.js} +1 -1
  52. package/dist/{filter-uA6govE9.js → filter-B_S6WOqr.js} +1 -1
  53. package/dist/{fuel-BroSIBo1.js → fuel-Cjt6IxKr.js} +1 -1
  54. package/dist/index.js +53 -33
  55. package/dist/{map-BzwQ__kD.js → map-CO0aWUae.js} +1 -1
  56. package/dist/{map-pin-BGbmEGn3.js → map-pin-BISLzLwb.js} +1 -1
  57. package/dist/{maps-DpIuSSmg.js → maps-CtfuCAmh.js} +1 -1
  58. package/dist/{navigation-CjKGLL9T.js → navigation-BFki5UJz.js} +1 -1
  59. package/dist/{package-D36cKFvu.js → package-UyaWiALC.js} +1 -1
  60. package/dist/{phone-mMZFHd1Z.js → phone-Bav_V7rR.js} +1 -1
  61. package/dist/{plus-DY5R-c1j.js → plus-Bk_G-lFC.js} +1 -1
  62. package/dist/{refresh-cw-DyOLYuDU.js → refresh-cw-C4-jecjy.js} +1 -1
  63. package/dist/{route-CuaZ1wU3.js → route-WpCP6F1x.js} +1 -1
  64. package/dist/{save-h9dzHwJE.js → save-CcfoIn2J.js} +1 -1
  65. package/dist/{search-stTGSec-.js → search-C3YRxW9e.js} +1 -1
  66. package/dist/{square-pen-DT5srCPD.js → square-pen-Dr1X-P2s.js} +1 -1
  67. package/dist/{star-gp4yO3PF.js → star-1Ixfuzai.js} +1 -1
  68. package/dist/{store-DJZDAvCY.js → store-BwU935v5.js} +1 -1
  69. package/dist/{trash-2-DwcjTxYE.js → trash-2-CC4KugEJ.js} +1 -1
  70. package/dist/{trending-up-2q2sPVsb.js → trending-up-1brglj1E.js} +1 -1
  71. package/dist/{triangle-alert-CU60xaOi.js → triangle-alert-Dh56Yu3-.js} +1 -1
  72. package/dist/{truck-ByZxqZhI.js → truck-DxhtLfkG.js} +1 -1
  73. package/dist/{upload-CWor1uj3.js → upload-CLf0JLXW.js} +1 -1
  74. package/dist/{useAssistant-uoc8wjr0.js → useAssistant-B9qBtRKm.js} +1 -1
  75. package/dist/{useCustomers-BPPhQXSH.js → useCustomers-BQ4AIEAT.js} +1 -1
  76. package/dist/{useFleet-CT_iW2V9.js → useFleet-BfA_-VUW.js} +101 -72
  77. package/dist/{useImportExport-BG0Cg_D9.js → useImportExport-7-O8noRJ.js} +1 -1
  78. package/dist/{useInventory-BtBGnOC2.js → useInventory-BO7TSgq_.js} +99 -73
  79. package/dist/{useOrders-BC-1mCc0.js → useOrders-B5FV0kcz.js} +1 -1
  80. package/dist/{useReports-Cx8blThR.js → useReports-hUXb8ryJ.js} +1 -1
  81. package/dist/{useRoutes-8fw8oO6y.js → useRoutes-C_ZCYJ_h.js} +1 -1
  82. package/dist/{useSettings-Do5WSUaI.js → useSettings-BNNzQs_B.js} +2 -2
  83. package/dist/{useTracking-Dogilo5C.js → useTracking-7nd_XOSL.js} +3 -3
  84. package/dist/{user-Dr_JS2FF.js → user-B1IjWJtn.js} +1 -1
  85. package/dist/{user-check-CBSiMH6I.js → user-check-Cx6fHHll.js} +1 -1
  86. package/dist/{users-BRV9-2nV.js → users-BKmsb79k.js} +1 -1
  87. package/dist/{warehouse-CmIAl0_w.js → warehouse-DE1irFyJ.js} +1 -1
  88. package/dist/{wrench-6U-BTSbg.js → wrench-DTJGFs17.js} +1 -1
  89. package/dist/{x-DX8sZrkd.js → x-CvsUGJy1.js} +1 -1
  90. package/package.json +1 -1
  91. package/src/movethewheels/MoveTheWheelsRoutes.tsx +5 -0
  92. package/src/movethewheels/components/GlassPanel.tsx +1 -3
  93. package/src/movethewheels/components/MetricCard.tsx +16 -3
  94. package/src/movethewheels/components/charts/StatusDonut.tsx +2 -6
  95. package/src/movethewheels/components/charts/TrendChart.tsx +2 -6
  96. package/src/movethewheels/components/maps/LogisticsMap.tsx +1 -4
  97. package/src/movethewheels/components/maps/RouteMap.tsx +3 -5
  98. package/src/movethewheels/components/maps/TrackingMap.tsx +11 -2
  99. package/src/movethewheels/hooks/useFleet.ts +113 -0
  100. package/src/movethewheels/hooks/useInventory.ts +86 -0
  101. package/src/movethewheels/hooks/useSettings.ts +8 -1
  102. package/src/movethewheels/pages/CreateOrderPage.tsx +48 -6
  103. package/src/movethewheels/pages/CustomerDetailsPage.tsx +3 -2
  104. package/src/movethewheels/pages/DriverDetailsPage.tsx +58 -20
  105. package/src/movethewheels/pages/OrderDetailsPage.tsx +2 -1
  106. package/src/movethewheels/pages/ProductDetailsPage.tsx +51 -15
  107. package/src/movethewheels/pages/RouteDetailsPage.tsx +51 -7
  108. package/src/movethewheels/pages/VehicleDetailsPage.tsx +53 -17
  109. package/src/movethewheels/pages/VehiclesPage.tsx +9 -1
  110. package/src/movethewheels/pages/WarehouseDetailsPage.tsx +49 -11
  111. package/src/movethewheels/types/index.ts +3 -0
  112. package/src/movethewheels/utils/graphqlClient.ts +51 -1
  113. package/dist/DriverDetailsPage-CBzAmM6s.js +0 -490
  114. package/dist/ProductDetailsPage-BMlRoR9E.js +0 -350
  115. package/dist/RouteDetailsPage-Btb1MSIS.js +0 -610
  116. package/dist/VehicleDetailsPage-DNLrMljV.js +0 -393
  117. package/dist/WarehouseDetailsPage-CAQFz7l_.js +0 -493
@@ -0,0 +1,642 @@
1
+ import { A as e, F as t, I as n, L as r, P as i, R as a, d as o, f as s, g as c, h as l, i as u, j as d, l as f, lt as p, n as m, r as h, st as g, u as _, ut as v } from "./PageLayout-j9Zw3wBN.js";
2
+ import { n as y, t as b } from "./arrow-up-VQuGMABN.js";
3
+ import { t as x } from "./arrow-left-1dVWv2dg.js";
4
+ import { t as S } from "./circle-check-big-H5pLiMBW.js";
5
+ import { t as C } from "./clock-B4-qjGuB.js";
6
+ import { t as w } from "./fuel-Cjt6IxKr.js";
7
+ import { n as T, t as E } from "./Notice-BrXJ85dA.js";
8
+ import { t as D } from "./map-pin-BISLzLwb.js";
9
+ import { t as O } from "./navigation-BFki5UJz.js";
10
+ import { t as k } from "./plus-Bk_G-lFC.js";
11
+ import { t as A } from "./save-CcfoIn2J.js";
12
+ import { t as j } from "./square-pen-Dr1X-P2s.js";
13
+ import { t as M } from "./trash-2-CC4KugEJ.js";
14
+ import { r as N } from "./useFleet-BfA_-VUW.js";
15
+ import { r as P, t as F } from "./useRoutes-C_ZCYJ_h.js";
16
+ import { n as I } from "./maps-CtfuCAmh.js";
17
+ import { o as L, r as R } from "./StatusBadge-BfiF-nNI.js";
18
+ import { t as z } from "./FormError-D4T5FWZA.js";
19
+ import { n as B, r as V, t as H } from "./formatters-FWJDwTFv.js";
20
+ import { n as U } from "./mapMarkers-NCV9MRKR.js";
21
+ import { useEffect as W, useState as G } from "react";
22
+ import { useLocation as K, useParams as q } from "react-router-dom";
23
+ import { jsx as J, jsxs as Y } from "react/jsx-runtime";
24
+ import { EmphasisPanel as X, NextSteps as Z, PagePurpose as Q } from "@burdenoff/fe-libs/ui";
25
+ //#region node_modules/lucide-react/dist/esm/icons/zap.js
26
+ var $ = v("Zap", [["path", {
27
+ d: "M4 14a1 1 0 0 1-.78-1.63l9.9-10.2a.5.5 0 0 1 .86.46l-1.92 6.02A1 1 0 0 0 13 10h7a1 1 0 0 1 .78 1.63l-9.9 10.2a.5.5 0 0 1-.86-.46l1.92-6.02A1 1 0 0 0 11 14z",
28
+ key: "1xq2db"
29
+ }]]), ee = [
30
+ {
31
+ value: "planned",
32
+ label: "Planned"
33
+ },
34
+ {
35
+ value: "in_progress",
36
+ label: "In Progress"
37
+ },
38
+ {
39
+ value: "completed",
40
+ label: "Completed"
41
+ },
42
+ {
43
+ value: "cancelled",
44
+ label: "Cancelled"
45
+ }
46
+ ];
47
+ function te({ editId: f }) {
48
+ let { basePath: m, navigate: h } = g(), { createRoute: v, updateRoute: S } = P(), { route: C } = F(f), { vehicles: w, drivers: T } = N(), E = !!f, [D, j] = G({
49
+ name: "",
50
+ status: "planned",
51
+ vehicleId: "",
52
+ driverId: "",
53
+ stops: [{
54
+ address: "",
55
+ type: "delivery"
56
+ }]
57
+ }), [I, L] = G(!1), [R, B] = G(null);
58
+ W(() => {
59
+ !f || !C || j({
60
+ name: C.name || "",
61
+ status: C.status,
62
+ vehicleId: C.vehicleId || "",
63
+ driverId: C.driverId || "",
64
+ stops: C.stops.length > 0 ? C.stops.map((e) => ({
65
+ address: H(e.address) || e.address.street || "",
66
+ type: e.type
67
+ })) : [{
68
+ address: "",
69
+ type: "delivery"
70
+ }]
71
+ });
72
+ }, [f, C]);
73
+ let V = () => h?.(p(m, "routes")), U = () => j((e) => ({
74
+ ...e,
75
+ stops: [...e.stops, {
76
+ address: "",
77
+ type: "delivery"
78
+ }]
79
+ })), K = (e) => j((t) => ({
80
+ ...t,
81
+ stops: t.stops.filter((t, n) => n !== e)
82
+ })), q = (e, t, n) => j((r) => ({
83
+ ...r,
84
+ stops: r.stops.map((r, i) => i === e ? {
85
+ ...r,
86
+ [t]: n
87
+ } : r)
88
+ })), Z = (e, t) => j((n) => {
89
+ let r = e + t;
90
+ if (r < 0 || r >= n.stops.length) return n;
91
+ let i = [...n.stops];
92
+ return [i[e], i[r]] = [i[r], i[e]], {
93
+ ...n,
94
+ stops: i
95
+ };
96
+ }), $ = async (e) => {
97
+ if (e.preventDefault(), !D.name.trim()) {
98
+ B("Route name is required.");
99
+ return;
100
+ }
101
+ let t = D.stops.filter((e) => e.address.trim());
102
+ if (t.length === 0) {
103
+ B("Add at least one stop with an address.");
104
+ return;
105
+ }
106
+ L(!0), B(null);
107
+ try {
108
+ let e = t.map((e, t) => ({
109
+ id: `stop-${t + 1}`,
110
+ orderId: "",
111
+ sequence: t + 1,
112
+ address: {
113
+ street: e.address.trim(),
114
+ city: "",
115
+ state: "",
116
+ postalCode: "",
117
+ country: ""
118
+ },
119
+ type: e.type,
120
+ scheduledTime: /* @__PURE__ */ new Date(),
121
+ duration: 0,
122
+ status: "pending"
123
+ }));
124
+ if (E) {
125
+ let t = await S(f, {
126
+ name: D.name.trim(),
127
+ status: D.status,
128
+ vehicleId: D.vehicleId || void 0,
129
+ driverId: D.driverId || void 0,
130
+ stops: e
131
+ });
132
+ h?.(p(m, `routes/${t.id}`));
133
+ return;
134
+ }
135
+ let n = await v({
136
+ name: D.name.trim(),
137
+ status: D.status,
138
+ vehicleId: D.vehicleId || void 0,
139
+ driverId: D.driverId || void 0,
140
+ stops: e
141
+ });
142
+ h?.(p(m, `routes/${n.id}`));
143
+ } catch (e) {
144
+ console.error("Failed to create route:", e), B(e instanceof Error ? e.message : "Failed to create route. Please try again."), L(!1);
145
+ }
146
+ };
147
+ return /* @__PURE__ */ Y(u, {
148
+ title: E ? "Edit Route" : "Create Route",
149
+ subtitle: "Plan a new delivery route",
150
+ icon: /* @__PURE__ */ J(O, { size: 24 }),
151
+ headerActions: /* @__PURE__ */ Y("div", {
152
+ className: "flex gap-2",
153
+ children: [/* @__PURE__ */ Y(_, {
154
+ variant: "outline",
155
+ onClick: V,
156
+ disabled: I,
157
+ children: [/* @__PURE__ */ J(x, { size: 16 }), " Cancel"]
158
+ }), /* @__PURE__ */ Y(_, {
159
+ onClick: $,
160
+ disabled: I,
161
+ children: [
162
+ /* @__PURE__ */ J(A, { size: 16 }),
163
+ " ",
164
+ E ? I ? "Saving..." : "Save Changes" : I ? "Saving..." : "Create Route"
165
+ ]
166
+ })]
167
+ }),
168
+ children: [/* @__PURE__ */ J(Q, {
169
+ icon: /* @__PURE__ */ J(O, { size: 18 }),
170
+ children: "Plan a new delivery route — name it, list the stops to visit, and optionally assign a vehicle and driver. Once created you can optimize it to sequence the stops into the shortest run."
171
+ }), /* @__PURE__ */ Y("form", {
172
+ onSubmit: $,
173
+ className: "max-w-3xl space-y-6",
174
+ children: [
175
+ /* @__PURE__ */ J(z, { message: R }),
176
+ /* @__PURE__ */ Y(X, { children: [/* @__PURE__ */ J("h2", {
177
+ className: "text-base font-semibold text-text-primary mb-4",
178
+ children: "Route Details"
179
+ }), /* @__PURE__ */ Y("div", {
180
+ className: "space-y-4",
181
+ children: [/* @__PURE__ */ Y("div", {
182
+ className: "grid grid-cols-1 md:grid-cols-2 gap-4",
183
+ children: [/* @__PURE__ */ Y("div", {
184
+ className: "space-y-2",
185
+ children: [/* @__PURE__ */ Y(d, {
186
+ htmlFor: "name",
187
+ children: ["Route Name ", /* @__PURE__ */ J("span", {
188
+ className: "text-status-error-text",
189
+ children: "*"
190
+ })]
191
+ }), /* @__PURE__ */ J(e, {
192
+ id: "name",
193
+ value: D.name,
194
+ onChange: (e) => j((t) => ({
195
+ ...t,
196
+ name: e.target.value
197
+ })),
198
+ placeholder: "Downtown morning run",
199
+ required: !0
200
+ })]
201
+ }), /* @__PURE__ */ Y("div", {
202
+ className: "space-y-2",
203
+ children: [/* @__PURE__ */ J(d, {
204
+ htmlFor: "status",
205
+ children: "Status"
206
+ }), /* @__PURE__ */ Y(i, {
207
+ value: D.status,
208
+ onValueChange: (e) => j((t) => ({
209
+ ...t,
210
+ status: e
211
+ })),
212
+ children: [/* @__PURE__ */ J(r, {
213
+ id: "status",
214
+ children: /* @__PURE__ */ J(a, {})
215
+ }), /* @__PURE__ */ J(t, { children: ee.map((e) => /* @__PURE__ */ J(n, {
216
+ value: e.value,
217
+ children: e.label
218
+ }, e.value)) })]
219
+ })]
220
+ })]
221
+ }), /* @__PURE__ */ Y("div", {
222
+ className: "grid grid-cols-1 md:grid-cols-2 gap-4",
223
+ children: [/* @__PURE__ */ Y("div", {
224
+ className: "space-y-2",
225
+ children: [/* @__PURE__ */ J(d, {
226
+ htmlFor: "vehicle",
227
+ children: "Vehicle (optional)"
228
+ }), /* @__PURE__ */ Y(i, {
229
+ value: D.vehicleId,
230
+ onValueChange: (e) => j((t) => ({
231
+ ...t,
232
+ vehicleId: e
233
+ })),
234
+ children: [/* @__PURE__ */ J(r, {
235
+ id: "vehicle",
236
+ children: /* @__PURE__ */ J(a, { placeholder: "Assign later" })
237
+ }), /* @__PURE__ */ J(t, { children: w.map((e) => /* @__PURE__ */ Y(n, {
238
+ value: e.id,
239
+ children: [
240
+ e.vehicleNumber,
241
+ " (",
242
+ e.type,
243
+ ")"
244
+ ]
245
+ }, e.id)) })]
246
+ })]
247
+ }), /* @__PURE__ */ Y("div", {
248
+ className: "space-y-2",
249
+ children: [/* @__PURE__ */ J(d, {
250
+ htmlFor: "driver",
251
+ children: "Driver (optional)"
252
+ }), /* @__PURE__ */ Y(i, {
253
+ value: D.driverId,
254
+ onValueChange: (e) => j((t) => ({
255
+ ...t,
256
+ driverId: e
257
+ })),
258
+ children: [/* @__PURE__ */ J(r, {
259
+ id: "driver",
260
+ children: /* @__PURE__ */ J(a, { placeholder: "Assign later" })
261
+ }), /* @__PURE__ */ J(t, { children: T.map((e) => /* @__PURE__ */ Y(n, {
262
+ value: e.id,
263
+ children: [
264
+ e.fullName,
265
+ " (",
266
+ e.employeeId,
267
+ ")"
268
+ ]
269
+ }, e.id)) })]
270
+ })]
271
+ })]
272
+ })]
273
+ })] }),
274
+ /* @__PURE__ */ Y(o, { children: [/* @__PURE__ */ Y(l, {
275
+ className: "flex flex-row items-center justify-between",
276
+ children: [/* @__PURE__ */ Y(c, { children: ["Stops ", /* @__PURE__ */ J("span", {
277
+ className: "text-status-error-text",
278
+ children: "*"
279
+ })] }), /* @__PURE__ */ Y(_, {
280
+ type: "button",
281
+ variant: "outline",
282
+ size: "sm",
283
+ onClick: U,
284
+ children: [/* @__PURE__ */ J(k, { size: 16 }), " Add Stop"]
285
+ })]
286
+ }), /* @__PURE__ */ J(s, {
287
+ className: "space-y-4",
288
+ children: D.stops.map((o, s) => /* @__PURE__ */ Y("div", {
289
+ className: "grid grid-cols-1 md:grid-cols-12 gap-3 items-end",
290
+ children: [
291
+ /* @__PURE__ */ Y("div", {
292
+ className: "md:col-span-7 space-y-2",
293
+ children: [/* @__PURE__ */ Y(d, {
294
+ htmlFor: `stop-address-${s}`,
295
+ children: [
296
+ "Stop ",
297
+ s + 1,
298
+ " address"
299
+ ]
300
+ }), /* @__PURE__ */ J(e, {
301
+ id: `stop-address-${s}`,
302
+ value: o.address,
303
+ onChange: (e) => q(s, "address", e.target.value),
304
+ placeholder: "123 Main St, San Francisco, CA"
305
+ })]
306
+ }),
307
+ /* @__PURE__ */ Y("div", {
308
+ className: "md:col-span-4 space-y-2",
309
+ children: [/* @__PURE__ */ J(d, {
310
+ htmlFor: `stop-type-${s}`,
311
+ children: "Type"
312
+ }), /* @__PURE__ */ Y(i, {
313
+ value: o.type,
314
+ onValueChange: (e) => q(s, "type", e),
315
+ children: [/* @__PURE__ */ J(r, {
316
+ id: `stop-type-${s}`,
317
+ children: /* @__PURE__ */ J(a, {})
318
+ }), /* @__PURE__ */ Y(t, { children: [/* @__PURE__ */ J(n, {
319
+ value: "pickup",
320
+ children: "Pickup"
321
+ }), /* @__PURE__ */ J(n, {
322
+ value: "delivery",
323
+ children: "Delivery"
324
+ })] })]
325
+ })]
326
+ }),
327
+ /* @__PURE__ */ Y("div", {
328
+ className: "md:col-span-1 flex justify-end gap-1",
329
+ children: [
330
+ /* @__PURE__ */ J(_, {
331
+ type: "button",
332
+ variant: "ghost",
333
+ size: "icon",
334
+ onClick: () => Z(s, -1),
335
+ disabled: s === 0,
336
+ "aria-label": `Move stop ${s + 1} up`,
337
+ children: /* @__PURE__ */ J(b, { size: 16 })
338
+ }),
339
+ /* @__PURE__ */ J(_, {
340
+ type: "button",
341
+ variant: "ghost",
342
+ size: "icon",
343
+ onClick: () => Z(s, 1),
344
+ disabled: s === D.stops.length - 1,
345
+ "aria-label": `Move stop ${s + 1} down`,
346
+ children: /* @__PURE__ */ J(y, { size: 16 })
347
+ }),
348
+ /* @__PURE__ */ J(_, {
349
+ type: "button",
350
+ variant: "ghost",
351
+ size: "icon",
352
+ className: "text-status-error-text",
353
+ onClick: () => K(s),
354
+ disabled: D.stops.length === 1,
355
+ "aria-label": `Remove stop ${s + 1}`,
356
+ children: /* @__PURE__ */ J(M, { size: 16 })
357
+ })
358
+ ]
359
+ })
360
+ ]
361
+ }, s))
362
+ })] })
363
+ ]
364
+ })]
365
+ });
366
+ }
367
+ function ne() {
368
+ let { routeId: e } = q(), t = K().pathname.endsWith("/edit"), { basePath: n, navigate: r } = g(), { route: i, isLoading: a, error: d, refetch: v } = F(e), { optimizeRoute: y } = P(), { message: b, notify: k } = T(), [A, M] = G(null), [N, W] = G(!1), ee = () => r?.(p(n, "routes")), ne = (e) => r?.(p(n, e)), re = async () => {
369
+ if (e) {
370
+ W(!0), M(null);
371
+ try {
372
+ await y(e), k("Route optimized — stops resequenced for the shortest run."), v();
373
+ } catch (e) {
374
+ M(e instanceof Error ? e.message : "Failed to optimize route.");
375
+ } finally {
376
+ W(!1);
377
+ }
378
+ }
379
+ };
380
+ if (!e) return /* @__PURE__ */ J(te, {});
381
+ if (t) return /* @__PURE__ */ J(te, { editId: e });
382
+ if (a) return /* @__PURE__ */ J(h, { message: "Loading route details..." });
383
+ if (d || !i) return /* @__PURE__ */ J(m, {
384
+ title: "Route not found",
385
+ onRetry: v
386
+ });
387
+ let ie = i.stops.map((e) => {
388
+ let t = U(e.address);
389
+ return t ? {
390
+ lat: t.lat,
391
+ lng: t.lng,
392
+ sequence: e.sequence,
393
+ label: H(e.address) || `Order #${e.orderId || e.sequence}`
394
+ } : null;
395
+ }).filter((e) => e !== null);
396
+ return /* @__PURE__ */ Y(u, {
397
+ title: i.name,
398
+ subtitle: `${i.stops.length} stops - ${i.distance.toFixed(1)} km`,
399
+ icon: /* @__PURE__ */ J(O, { size: 24 }),
400
+ headerActions: /* @__PURE__ */ Y("div", {
401
+ className: "flex gap-2",
402
+ children: [
403
+ /* @__PURE__ */ Y(_, {
404
+ variant: "outline",
405
+ onClick: ee,
406
+ children: [/* @__PURE__ */ J(x, { size: 16 }), " Back"]
407
+ }),
408
+ !i.optimized && /* @__PURE__ */ Y(_, {
409
+ variant: "outline",
410
+ onClick: re,
411
+ disabled: N,
412
+ children: [
413
+ /* @__PURE__ */ J($, { size: 16 }),
414
+ " ",
415
+ N ? "Optimizing…" : "Optimize"
416
+ ]
417
+ }),
418
+ /* @__PURE__ */ Y(_, {
419
+ onClick: () => r?.(p(n, `routes/${e}/edit`)),
420
+ children: [/* @__PURE__ */ J(j, { size: 16 }), " Edit"]
421
+ })
422
+ ]
423
+ }),
424
+ headerContent: /* @__PURE__ */ Y("div", {
425
+ className: "flex gap-2",
426
+ children: [/* @__PURE__ */ J(R, {
427
+ status: i.status,
428
+ customColors: L[i.status]
429
+ }), /* @__PURE__ */ J(f, {
430
+ variant: i.optimized ? "default" : "secondary",
431
+ children: i.optimized ? "Optimized" : "Not Optimized"
432
+ })]
433
+ }),
434
+ children: [
435
+ /* @__PURE__ */ J(Q, {
436
+ icon: /* @__PURE__ */ J(O, { size: 18 }),
437
+ children: "A single optimized driving plan that chains together this route's stops. Review the sequence, distance and timing here, re-optimize if traffic or stops change, then hand the itinerary to a driver."
438
+ }),
439
+ /* @__PURE__ */ J(Z, {
440
+ storageKey: "movethewheels-route-details",
441
+ steps: [
442
+ ...i.optimized ? [] : [{
443
+ id: "optimize",
444
+ label: "Optimize this route",
445
+ description: "Reorder stops to cut distance and driving time.",
446
+ icon: /* @__PURE__ */ J($, { size: 16 }),
447
+ onClick: re
448
+ }],
449
+ {
450
+ id: "edit",
451
+ label: "Adjust stops",
452
+ description: "Add, remove or reorder the delivery stops.",
453
+ icon: /* @__PURE__ */ J(j, { size: 16 }),
454
+ onClick: () => {}
455
+ },
456
+ {
457
+ id: "orders",
458
+ label: "Review the orders on this route",
459
+ description: "Check the deliveries bundled into this run.",
460
+ icon: /* @__PURE__ */ J(D, { size: 16 }),
461
+ onClick: () => ne("orders")
462
+ }
463
+ ]
464
+ }),
465
+ A && /* @__PURE__ */ J("div", {
466
+ className: "mb-2",
467
+ children: /* @__PURE__ */ J(z, { message: A })
468
+ }),
469
+ b && /* @__PURE__ */ J("div", {
470
+ className: "mb-2",
471
+ children: /* @__PURE__ */ J(E, { message: b })
472
+ }),
473
+ /* @__PURE__ */ Y("div", {
474
+ className: "grid grid-cols-1 lg:grid-cols-3 gap-6",
475
+ children: [/* @__PURE__ */ Y("div", {
476
+ className: "lg:col-span-2 space-y-6",
477
+ children: [/* @__PURE__ */ Y(o, { children: [/* @__PURE__ */ J(l, { children: /* @__PURE__ */ J(c, { children: "Route Map" }) }), /* @__PURE__ */ J(s, { children: ie.length > 0 ? /* @__PURE__ */ J(I, {
478
+ className: "overflow-hidden rounded-lg border border-border-seam",
479
+ height: 360,
480
+ stops: ie
481
+ }) : /* @__PURE__ */ Y("div", {
482
+ className: "rounded-lg border border-border-seam bg-bg-sunken/40 p-4",
483
+ children: [/* @__PURE__ */ J("p", {
484
+ className: "mb-3 text-sm text-text-secondary",
485
+ children: "These stops don't have map coordinates yet — showing the planned sequence instead."
486
+ }), /* @__PURE__ */ J("ol", {
487
+ className: "space-y-2",
488
+ children: i.stops.map((e) => /* @__PURE__ */ Y("li", {
489
+ className: "flex items-start gap-3",
490
+ children: [/* @__PURE__ */ J("span", {
491
+ className: "flex h-6 w-6 shrink-0 items-center justify-center rounded-full bg-action-primary-bg/10 text-xs font-semibold text-primary",
492
+ children: e.sequence
493
+ }), /* @__PURE__ */ J("span", {
494
+ className: "text-sm",
495
+ children: H(e.address) || `Order #${e.orderId || e.sequence}`
496
+ })]
497
+ }, e.id))
498
+ })]
499
+ }) })] }), /* @__PURE__ */ Y(o, { children: [/* @__PURE__ */ J(l, { children: /* @__PURE__ */ Y(c, { children: [
500
+ "Stops (",
501
+ i.stops.length,
502
+ ")"
503
+ ] }) }), /* @__PURE__ */ J(s, { children: /* @__PURE__ */ J("div", {
504
+ className: "space-y-4",
505
+ children: i.stops.map((e, t) => /* @__PURE__ */ Y("div", {
506
+ className: "flex gap-4",
507
+ children: [/* @__PURE__ */ Y("div", {
508
+ className: "relative",
509
+ children: [/* @__PURE__ */ J("div", {
510
+ className: `w-8 h-8 rounded-full flex items-center justify-center ${e.status === "completed" ? "bg-status-success-text text-text-inverse" : "bg-bg-sunken"}`,
511
+ children: e.status === "completed" ? /* @__PURE__ */ J(S, { size: 16 }) : e.sequence
512
+ }), t < i.stops.length - 1 && /* @__PURE__ */ J("div", { className: "absolute top-8 left-4 w-px h-12 bg-border" })]
513
+ }), /* @__PURE__ */ J("div", {
514
+ className: "flex-1 pb-4",
515
+ children: /* @__PURE__ */ Y("div", {
516
+ className: "flex items-center justify-between",
517
+ children: [/* @__PURE__ */ Y("div", { children: [/* @__PURE__ */ Y("div", {
518
+ className: "flex items-center gap-2",
519
+ children: [/* @__PURE__ */ J(f, {
520
+ variant: e.type === "pickup" ? "secondary" : "default",
521
+ className: "capitalize",
522
+ children: e.type
523
+ }), /* @__PURE__ */ Y("span", {
524
+ className: "font-medium",
525
+ children: ["Order #", e.orderId]
526
+ })]
527
+ }), /* @__PURE__ */ J("p", {
528
+ className: "text-sm text-text-secondary mt-1",
529
+ children: H(e.address)
530
+ })] }), /* @__PURE__ */ Y("div", {
531
+ className: "text-right",
532
+ children: [
533
+ /* @__PURE__ */ Y("p", {
534
+ className: "text-sm",
535
+ children: ["Scheduled: ", V(e.scheduledTime, "time")]
536
+ }),
537
+ e.actualTime && /* @__PURE__ */ Y("p", {
538
+ className: "text-sm text-status-success-text",
539
+ children: ["Actual: ", V(e.actualTime, "time")]
540
+ }),
541
+ /* @__PURE__ */ Y("p", {
542
+ className: "text-xs text-text-secondary",
543
+ children: [e.duration, " min stop"]
544
+ })
545
+ ]
546
+ })]
547
+ })
548
+ })]
549
+ }, e.id))
550
+ }) })] })]
551
+ }), /* @__PURE__ */ Y("div", {
552
+ className: "space-y-6",
553
+ children: [
554
+ /* @__PURE__ */ Y(X, {
555
+ className: "space-y-4",
556
+ children: [
557
+ /* @__PURE__ */ J("h2", {
558
+ className: "text-base font-semibold text-text-primary",
559
+ children: "Route Info"
560
+ }),
561
+ /* @__PURE__ */ Y("div", { children: [/* @__PURE__ */ J("p", {
562
+ className: "text-sm text-text-secondary",
563
+ children: "Total Distance"
564
+ }), /* @__PURE__ */ Y("p", {
565
+ className: "text-2xl font-bold",
566
+ children: [i.distance.toFixed(1), /* @__PURE__ */ J("span", {
567
+ className: "text-sm font-normal",
568
+ children: " km"
569
+ })]
570
+ })] }),
571
+ /* @__PURE__ */ Y("div", { children: [/* @__PURE__ */ J("p", {
572
+ className: "text-sm text-text-secondary",
573
+ children: "Est. Duration"
574
+ }), /* @__PURE__ */ Y("p", {
575
+ className: "text-2xl font-bold",
576
+ children: [i.estimatedDuration, /* @__PURE__ */ J("span", {
577
+ className: "text-sm font-normal",
578
+ children: " min"
579
+ })]
580
+ })] }),
581
+ i.fuelCost !== void 0 && /* @__PURE__ */ Y("div", { children: [/* @__PURE__ */ Y("p", {
582
+ className: "text-sm text-text-secondary flex items-center gap-1",
583
+ children: [/* @__PURE__ */ J(w, { size: 14 }), " Est. Fuel Cost"]
584
+ }), /* @__PURE__ */ J("p", {
585
+ className: "text-2xl font-bold",
586
+ children: B(i.fuelCost)
587
+ })] }),
588
+ i.actualDuration && /* @__PURE__ */ Y("div", { children: [/* @__PURE__ */ J("p", {
589
+ className: "text-sm text-text-secondary",
590
+ children: "Actual Duration"
591
+ }), /* @__PURE__ */ Y("p", {
592
+ className: "text-2xl font-bold",
593
+ children: [i.actualDuration, /* @__PURE__ */ J("span", {
594
+ className: "text-sm font-normal",
595
+ children: " min"
596
+ })]
597
+ })] })
598
+ ]
599
+ }),
600
+ /* @__PURE__ */ Y(o, { children: [/* @__PURE__ */ J(l, { children: /* @__PURE__ */ Y(c, {
601
+ className: "flex items-center gap-2",
602
+ children: [/* @__PURE__ */ J(C, { size: 18 }), " Timeline"]
603
+ }) }), /* @__PURE__ */ Y(s, {
604
+ className: "space-y-3",
605
+ children: [
606
+ i.startTime && /* @__PURE__ */ Y("div", { children: [/* @__PURE__ */ J("p", {
607
+ className: "text-sm text-text-secondary",
608
+ children: "Started"
609
+ }), /* @__PURE__ */ J("p", { children: V(i.startTime, "full") })] }),
610
+ i.endTime && /* @__PURE__ */ Y("div", { children: [/* @__PURE__ */ J("p", {
611
+ className: "text-sm text-text-secondary",
612
+ children: "Completed"
613
+ }), /* @__PURE__ */ J("p", { children: V(i.endTime, "full") })] }),
614
+ /* @__PURE__ */ Y("div", { children: [/* @__PURE__ */ J("p", {
615
+ className: "text-sm text-text-secondary",
616
+ children: "Created"
617
+ }), /* @__PURE__ */ J("p", { children: V(i.createdAt, "full") })] })
618
+ ]
619
+ })] }),
620
+ i.trafficConditions.length > 0 && /* @__PURE__ */ Y(o, { children: [/* @__PURE__ */ J(l, { children: /* @__PURE__ */ J(c, { children: "Traffic Conditions" }) }), /* @__PURE__ */ J(s, { children: i.trafficConditions.map((e, t) => /* @__PURE__ */ Y("div", {
621
+ className: `p-2 rounded mb-2 ${e.condition === "severe" ? "bg-status-error-bg-subtle" : (e.condition, "bg-status-warning-bg-subtle")}`,
622
+ children: [/* @__PURE__ */ Y("p", {
623
+ className: "text-sm font-medium capitalize",
624
+ children: [e.condition, " traffic"]
625
+ }), /* @__PURE__ */ Y("p", {
626
+ className: "text-xs text-text-secondary",
627
+ children: [
628
+ e.location,
629
+ " - +",
630
+ e.delay,
631
+ " min delay"
632
+ ]
633
+ })]
634
+ }, t)) })] })
635
+ ]
636
+ })]
637
+ })
638
+ ]
639
+ });
640
+ }
641
+ //#endregion
642
+ export { ne as default };
@@ -1,10 +1,10 @@
1
- import { i as e, l as t, lt as n, st as r, u as i } from "./PageLayout-h_q9l8af.js";
2
- import { t as a } from "./DataTable-Da7yHjM1.js";
3
- import { t as o } from "./navigation-CjKGLL9T.js";
4
- import { t as s } from "./plus-DY5R-c1j.js";
5
- import { t as c } from "./refresh-cw-DyOLYuDU.js";
6
- import { n as l, r as u } from "./useRoutes-8fw8oO6y.js";
7
- import { o as d, r as f } from "./StatusBadge-1W2p8fEi.js";
1
+ import { i as e, l as t, lt as n, st as r, u as i } from "./PageLayout-j9Zw3wBN.js";
2
+ import { t as a } from "./DataTable-CmdZd6iV.js";
3
+ import { t as o } from "./navigation-BFki5UJz.js";
4
+ import { t as s } from "./plus-Bk_G-lFC.js";
5
+ import { t as c } from "./refresh-cw-C4-jecjy.js";
6
+ import { n as l, r as u } from "./useRoutes-C_ZCYJ_h.js";
7
+ import { o as d, r as f } from "./StatusBadge-BfiF-nNI.js";
8
8
  import { r as p } from "./formatters-FWJDwTFv.js";
9
9
  import { useState as m } from "react";
10
10
  import { jsx as h, jsxs as g } from "react/jsx-runtime";
@@ -1,7 +1,7 @@
1
- import { A as e, F as t, I as n, J as r, L as i, P as a, R as o, V as s, X as c, Y as l, Z as u, d, f, g as p, h as m, i as h, j as g, p as _, u as v, ut as y } from "./PageLayout-h_q9l8af.js";
2
- import { n as b, r as x, t as S } from "./useSettings-Do5WSUaI.js";
3
- import { t as C } from "./save-h9dzHwJE.js";
4
- import { t as w } from "./user-Dr_JS2FF.js";
1
+ import { A as e, F as t, I as n, J as r, L as i, P as a, R as o, V as s, X as c, Y as l, Z as u, d, f, g as p, h as m, i as h, j as g, p as _, u as v, ut as y } from "./PageLayout-j9Zw3wBN.js";
2
+ import { n as b, r as x, t as S } from "./useSettings-BNNzQs_B.js";
3
+ import { t as C } from "./save-CcfoIn2J.js";
4
+ import { t as w } from "./user-B1IjWJtn.js";
5
5
  import { useEffect as T, useMemo as E, useState as D } from "react";
6
6
  import { jsx as O, jsxs as k } from "react/jsx-runtime";
7
7
  import { EmphasisPanel as A, NextSteps as j, PagePurpose as M } from "@burdenoff/fe-libs/ui";
@@ -1,5 +1,5 @@
1
1
  import { n as e, r as t, t as n } from "./chunk-BdsCSvBP.js";
2
- import { it as r } from "./PageLayout-h_q9l8af.js";
2
+ import { it as r } from "./PageLayout-j9Zw3wBN.js";
3
3
  import * as i from "react";
4
4
  import a, { Children as o, Component as s, PureComponent as c, cloneElement as l, createContext as u, createElement as d, forwardRef as f, isValidElement as p, useCallback as m, useContext as h, useEffect as g, useId as _, useImperativeHandle as v, useMemo as y, useRef as b, useState as x } from "react";
5
5
  import { jsx as S, jsxs as C } from "react/jsx-runtime";
@@ -1,4 +1,4 @@
1
- import { l as e, rt as t } from "./PageLayout-h_q9l8af.js";
1
+ import { l as e, rt as t } from "./PageLayout-j9Zw3wBN.js";
2
2
  import { jsx as n, jsxs as r } from "react/jsx-runtime";
3
3
  //#region src/movethewheels/constants/index.ts
4
4
  var i = {