@burdenoff/microfe-movethewheels 2026.703.3 → 2026.703.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.
Files changed (173) hide show
  1. package/dist/{AIAssistantPage-C3cPsWt-.js → AIAssistantPage-D2gaEL1U.js} +16 -15
  2. package/dist/AnalyticsPage-DZMlEoBi.js +194 -0
  3. package/dist/CreateOrderPage-CWHx8yys.js +490 -0
  4. package/dist/CustomerDetailsPage-nR4oZ_ju.js +615 -0
  5. package/dist/CustomersPage-Bbvwvn8k.js +205 -0
  6. package/dist/DashboardPage-DrEhNf7N.js +542 -0
  7. package/dist/DataTable-CqMUD4er.js +340 -0
  8. package/dist/DocumentsCard-edDkgnJj.js +169 -0
  9. package/dist/DriverDetailsPage-whEMOWs9.js +490 -0
  10. package/dist/DriversPage-CHF2ZEzd.js +221 -0
  11. package/dist/FinancePage-Dn9GrW-1.js +175 -0
  12. package/dist/{FleetPage-DqkFi3s3.js → FleetPage-CrtGPy-p.js} +36 -35
  13. package/dist/{FormError-BlOjnXOq.js → FormError-BKcb_wT-.js} +1 -1
  14. package/dist/{ImportExportPage-DKJRCezl.js → ImportExportPage-WYdwZomZ.js} +52 -72
  15. package/dist/InventoryPage-l5A1f753.js +259 -0
  16. package/dist/LiveTrackingPage-DhEaNKZ4.js +429 -0
  17. package/dist/MarketplacePage-B9RYOb1Y.js +426 -0
  18. package/dist/MetricCard-y3bWHKUQ.js +191 -0
  19. package/dist/Notice-DOO-tjpV.js +46 -0
  20. package/dist/OrderDetailsPage-CwYHwk1K.js +584 -0
  21. package/dist/OrdersListPage-DhZJoQeI.js +386 -0
  22. package/dist/{PageLayout-D4LDHJJq.js → PageLayout-BniRJaQ6.js} +1 -1
  23. package/dist/{ProductDetailsPage-C9uOiYLp.js → ProductDetailsPage-1Gm9JKy0.js} +56 -56
  24. package/dist/ProductsPage-C8sn-1tN.js +186 -0
  25. package/dist/ReportsPage-D1tb0dcz.js +377 -0
  26. package/dist/RouteDetailsPage-CkMyR9b_.js +610 -0
  27. package/dist/{RoutesPage-DMfoicM1.js → RoutesPage-QkENzsE5.js} +58 -47
  28. package/dist/{SettingsPage-Bn-v0mbQ.js → SettingsPage-DV3_tU_X.js} +16 -38
  29. package/dist/Sparkline-K2RMJ58u.js +16729 -0
  30. package/dist/{StatusBadge-BZurYHMy.js → StatusBadge-BNHXYvZx.js} +7 -7
  31. package/dist/TrackingPage-BZrg4RCu.js +368 -0
  32. package/dist/VehicleDetailsPage-D-8XPZ2G.js +393 -0
  33. package/dist/VehiclesPage-D5BELbtM.js +184 -0
  34. package/dist/{WarehouseDetailsPage-L_6sWigM.js → WarehouseDetailsPage-Cmg-8Frn.js} +70 -70
  35. package/dist/WarehousesPage-C1Y1M867.js +182 -0
  36. package/dist/{arrow-left-n48Y-Wis.js → arrow-left-ClW4Isj7.js} +1 -1
  37. package/dist/arrow-right-CmKOmIkh.js +11 -0
  38. package/dist/arrow-up-BJijRLAZ.js +17 -0
  39. package/dist/{box-D9Pal4HM.js → box-BT3NsRQP.js} +1 -1
  40. package/dist/boxes-B_OGvQiW.js +54 -0
  41. package/dist/{chart-column-BFIJysDR.js → chart-column-DQTTdUPk.js} +1 -1
  42. package/dist/charts-Tj_PPTfA.js +2018 -0
  43. package/dist/chevron-left-B1rZyWWb.js +8 -0
  44. package/dist/{chevron-right-EMIIyyJ1.js → chevron-right-BIcwUJZq.js} +1 -1
  45. package/dist/chunk-BdsCSvBP.js +20 -0
  46. package/dist/{circle-alert-iY24lSlp.js → circle-alert-CNkuDNc6.js} +1 -1
  47. package/dist/circle-check-Cs1OVjtV.js +13 -0
  48. package/dist/{circle-check-big-w0TrLKMF.js → circle-check-big-C-p4eNwn.js} +1 -1
  49. package/dist/{clock-DJZtdl8u.js → clock-dRGG4rkF.js} +1 -1
  50. package/dist/{dollar-sign-CgKQRz_e.js → dollar-sign-B6RoYHHz.js} +1 -1
  51. package/dist/{download-DRXxoiQR.js → download-DP04iWTd.js} +1 -1
  52. package/dist/{file-text-DWWY6_f5.js → file-text-BuDx4hZp.js} +1 -1
  53. package/dist/{filter-DloLC2eE.js → filter-BD483_8g.js} +1 -1
  54. package/dist/{wrench-CANXWxF-.js → fuel-DLH1ag04.js} +3 -6
  55. package/dist/index.css +2 -0
  56. package/dist/index.js +150 -172
  57. package/dist/{map-CkJaULb2.js → map-DNQn9fyY.js} +1 -1
  58. package/dist/{map-pin-BGiCvyCs.js → map-pin-CqN1bbT1.js} +1 -1
  59. package/dist/mapMarkers-NCV9MRKR.js +28 -0
  60. package/dist/maps-yzLqiK_C.js +5070 -0
  61. package/dist/{navigation-D36prnAn.js → navigation-CgGUt2tR.js} +1 -1
  62. package/dist/{package-BChUzpJS.js → package-DmRF7iQD.js} +1 -1
  63. package/dist/{phone-Ac9s3mo_.js → phone-Cl32EXKW.js} +1 -1
  64. package/dist/{plus-Z76q-FZm.js → plus-DlANgOFx.js} +1 -1
  65. package/dist/{refresh-cw-DKt6f5T6.js → refresh-cw-rW59D4b7.js} +1 -1
  66. package/dist/route-CWjPrtAN.js +22 -0
  67. package/dist/{save-CojywNhG.js → save-UDlog7hg.js} +1 -1
  68. package/dist/{search-CDGefqb3.js → search-DNIG5Ck7.js} +1 -1
  69. package/dist/{square-pen-CopE9GmB.js → square-pen-BcfB3Grd.js} +1 -1
  70. package/dist/{star-nHlLjDKR.js → star-CVZHFwDx.js} +1 -1
  71. package/dist/{store-BR9Voi5E.js → store-bwnmCK9f.js} +1 -1
  72. package/dist/{trash-2-BKhar6Hs.js → trash-2-B80G12d4.js} +1 -1
  73. package/dist/{trending-up-Dohgd4t_.js → trending-up-CH4R4KOa.js} +1 -1
  74. package/dist/{triangle-alert-i-XQL9Rd.js → triangle-alert-CmS8AUU6.js} +1 -1
  75. package/dist/{truck-C0v_hbLR.js → truck-9rLDncav.js} +1 -1
  76. package/dist/upload-DanJY1Vo.js +21 -0
  77. package/dist/{useAssistant-D4v3oxD3.js → useAssistant-CnEwkTLm.js} +11 -28
  78. package/dist/{useCustomers-BmTNGxiI.js → useCustomers-ChJao1ET.js} +30 -27
  79. package/dist/{useFleet-DKqXZ16m.js → useFleet-g5Yri0G8.js} +82 -70
  80. package/dist/{useImportExport-DHr-SWSw.js → useImportExport-MYwIT3rE.js} +1 -1
  81. package/dist/{useInventory-DkyiVY_A.js → useInventory-BSOn-R1c.js} +84 -39
  82. package/dist/{useOrders-Cfk1GLiq.js → useOrders-BSiqo61w.js} +59 -48
  83. package/dist/{useReports-CTqZr-AB.js → useReports-fWESfsF9.js} +41 -35
  84. package/dist/{useRoutes-BQWO607N.js → useRoutes-zD8Yp323.js} +50 -42
  85. package/dist/{useSettings-CkDH_-gM.js → useSettings-B1lsWeZ1.js} +6 -6
  86. package/dist/{useTracking-B-va1kO3.js → useTracking-BKG0I2ln.js} +3 -3
  87. package/dist/{user-jyFU3lXk.js → user-DU51el3m.js} +1 -1
  88. package/dist/user-check-IMhk-qkX.js +20 -0
  89. package/dist/{users-DZ-ilS6B.js → users-B8KhJBGg.js} +1 -1
  90. package/dist/{warehouse-6m5kXMLu.js → warehouse-CcMMioeY.js} +1 -1
  91. package/dist/wrench-Dg-sgH2e.js +8 -0
  92. package/dist/x-C4ObLVEa.js +11 -0
  93. package/package.json +5 -1
  94. package/src/movethewheels/components/DataTable.tsx +252 -84
  95. package/src/movethewheels/components/DocumentsCard.tsx +102 -0
  96. package/src/movethewheels/components/GlassPanel.tsx +71 -0
  97. package/src/movethewheels/components/MetricCard.tsx +171 -73
  98. package/src/movethewheels/components/Notice.tsx +61 -0
  99. package/src/movethewheels/components/StatusBadge.tsx +7 -6
  100. package/src/movethewheels/components/charts/ChartShell.tsx +78 -0
  101. package/src/movethewheels/components/charts/Sparkline.tsx +85 -0
  102. package/src/movethewheels/components/charts/StatusDonut.tsx +115 -0
  103. package/src/movethewheels/components/charts/TrendChart.tsx +179 -0
  104. package/src/movethewheels/components/charts/VolumeBar.tsx +97 -0
  105. package/src/movethewheels/components/charts/chartTokens.ts +43 -0
  106. package/src/movethewheels/components/charts/index.ts +9 -0
  107. package/src/movethewheels/components/index.ts +51 -1
  108. package/src/movethewheels/components/maps/LogisticsMap.tsx +94 -0
  109. package/src/movethewheels/components/maps/MapCanvas.tsx +118 -0
  110. package/src/movethewheels/components/maps/RouteMap.tsx +71 -0
  111. package/src/movethewheels/components/maps/TrackingMap.tsx +102 -0
  112. package/src/movethewheels/components/maps/index.ts +16 -0
  113. package/src/movethewheels/components/maps/leaflet-setup.ts +124 -0
  114. package/src/movethewheels/components/maps/map-markers.css +121 -0
  115. package/src/movethewheels/hooks/index.ts +9 -0
  116. package/src/movethewheels/hooks/useAnalytics.ts +109 -4
  117. package/src/movethewheels/hooks/useCustomers.ts +11 -4
  118. package/src/movethewheels/hooks/useEntityDocuments.ts +132 -0
  119. package/src/movethewheels/hooks/useFleet.ts +26 -7
  120. package/src/movethewheels/hooks/useInventory.ts +70 -7
  121. package/src/movethewheels/hooks/useOrders.ts +32 -2
  122. package/src/movethewheels/hooks/useReports.ts +14 -4
  123. package/src/movethewheels/hooks/useRoutes.ts +20 -3
  124. package/src/movethewheels/pages/AnalyticsPage.tsx +93 -73
  125. package/src/movethewheels/pages/CreateOrderPage.tsx +48 -20
  126. package/src/movethewheels/pages/CustomerDetailsPage.tsx +239 -33
  127. package/src/movethewheels/pages/CustomersPage.tsx +53 -28
  128. package/src/movethewheels/pages/DashboardPage.tsx +238 -12
  129. package/src/movethewheels/pages/DriverDetailsPage.tsx +17 -31
  130. package/src/movethewheels/pages/DriversPage.tsx +59 -31
  131. package/src/movethewheels/pages/FinancePage.tsx +103 -82
  132. package/src/movethewheels/pages/InventoryPage.tsx +15 -3
  133. package/src/movethewheels/pages/LiveTrackingPage.tsx +124 -16
  134. package/src/movethewheels/pages/MarketplacePage.tsx +265 -50
  135. package/src/movethewheels/pages/OrderDetailsPage.tsx +214 -10
  136. package/src/movethewheels/pages/OrdersListPage.tsx +118 -47
  137. package/src/movethewheels/pages/ProductsPage.tsx +52 -28
  138. package/src/movethewheels/pages/ReportsPage.tsx +88 -4
  139. package/src/movethewheels/pages/RouteDetailsPage.tsx +119 -19
  140. package/src/movethewheels/pages/RoutesPage.tsx +22 -6
  141. package/src/movethewheels/pages/SettingsPage.tsx +5 -21
  142. package/src/movethewheels/pages/TrackingPage.tsx +76 -6
  143. package/src/movethewheels/pages/VehicleDetailsPage.tsx +4 -34
  144. package/src/movethewheels/pages/VehiclesPage.tsx +58 -27
  145. package/src/movethewheels/pages/WarehouseDetailsPage.tsx +1 -1
  146. package/src/movethewheels/pages/WarehousesPage.tsx +47 -36
  147. package/src/movethewheels/types/index.ts +9 -1
  148. package/src/movethewheels/utils/download.ts +62 -0
  149. package/src/movethewheels/utils/mapMarkers.ts +58 -0
  150. package/dist/AnalyticsPage-Dz6g2MvK.js +0 -215
  151. package/dist/CreateOrderPage-C5iwnjp4.js +0 -479
  152. package/dist/CustomerDetailsPage-B6nwFyLO.js +0 -406
  153. package/dist/CustomersPage-BKxMS1AV.js +0 -161
  154. package/dist/DashboardPage-BVjQi0EB.js +0 -387
  155. package/dist/DataTable-DmciIKKM.js +0 -249
  156. package/dist/DriverDetailsPage-CN3WQ0B9.js +0 -507
  157. package/dist/DriversPage-CH9rjQC-.js +0 -165
  158. package/dist/FinancePage-DEDykSOP.js +0 -158
  159. package/dist/InventoryPage-e0ze63iX.js +0 -253
  160. package/dist/LiveTrackingPage-DCX-K-LR.js +0 -379
  161. package/dist/MarketplacePage-CIQ97_zp.js +0 -247
  162. package/dist/MetricCard-BY0QrMD4.js +0 -146
  163. package/dist/OrderDetailsPage-DYiZ-9UK.js +0 -429
  164. package/dist/OrdersListPage-Cn90P1Xx.js +0 -307
  165. package/dist/ProductsPage-QJfHHpqB.js +0 -169
  166. package/dist/ReportsPage-Zp53q3_8.js +0 -284
  167. package/dist/RouteDetailsPage-DUStXSf9.js +0 -531
  168. package/dist/TrackingPage-W-jtdM3Y.js +0 -325
  169. package/dist/VehicleDetailsPage-Bceo5oz3.js +0 -410
  170. package/dist/VehiclesPage-ApKThYeG.js +0 -165
  171. package/dist/WarehousesPage-DCbXXXWE.js +0 -162
  172. package/dist/useAnalytics-DS8n0xgg.js +0 -297
  173. /package/dist/{formatters-CF2S2l1m.js → formatters-FWJDwTFv.js} +0 -0
@@ -0,0 +1,610 @@
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-BniRJaQ6.js";
2
+ import { n as y, t as b } from "./arrow-up-BJijRLAZ.js";
3
+ import { t as x } from "./arrow-left-ClW4Isj7.js";
4
+ import { t as S } from "./circle-check-big-C-p4eNwn.js";
5
+ import { t as C } from "./clock-dRGG4rkF.js";
6
+ import { t as w } from "./fuel-DLH1ag04.js";
7
+ import { n as T, t as E } from "./Notice-DOO-tjpV.js";
8
+ import { t as D } from "./map-pin-CqN1bbT1.js";
9
+ import { t as O } from "./navigation-CgGUt2tR.js";
10
+ import { t as k } from "./plus-DlANgOFx.js";
11
+ import { t as A } from "./save-UDlog7hg.js";
12
+ import { t as j } from "./square-pen-BcfB3Grd.js";
13
+ import { t as M } from "./trash-2-B80G12d4.js";
14
+ import { r as N } from "./useFleet-g5Yri0G8.js";
15
+ import { r as P, t as F } from "./useRoutes-zD8Yp323.js";
16
+ import { n as I } from "./maps-yzLqiK_C.js";
17
+ import { o as L, r as R } from "./StatusBadge-BNHXYvZx.js";
18
+ import { t as z } from "./FormError-BKcb_wT-.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 { useState as W } from "react";
22
+ import { useParams as ee } from "react-router-dom";
23
+ import { jsx as G, jsxs as K } from "react/jsx-runtime";
24
+ import { EmphasisPanel as q, NextSteps as te, PagePurpose as J } from "@burdenoff/fe-libs/ui";
25
+ //#region node_modules/lucide-react/dist/esm/icons/zap.js
26
+ var Y = 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
+ }]]), X = [
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 ne() {
48
+ let { basePath: f, navigate: m } = g(), { createRoute: h } = P(), { vehicles: v, drivers: S } = N(), [C, w] = W({
49
+ name: "",
50
+ status: "planned",
51
+ vehicleId: "",
52
+ driverId: "",
53
+ stops: [{
54
+ address: "",
55
+ type: "delivery"
56
+ }]
57
+ }), [T, E] = W(!1), [D, j] = W(null), F = () => m?.(p(f, "routes")), I = () => w((e) => ({
58
+ ...e,
59
+ stops: [...e.stops, {
60
+ address: "",
61
+ type: "delivery"
62
+ }]
63
+ })), L = (e) => w((t) => ({
64
+ ...t,
65
+ stops: t.stops.filter((t, n) => n !== e)
66
+ })), R = (e, t, n) => w((r) => ({
67
+ ...r,
68
+ stops: r.stops.map((r, i) => i === e ? {
69
+ ...r,
70
+ [t]: n
71
+ } : r)
72
+ })), B = (e, t) => w((n) => {
73
+ let r = e + t;
74
+ if (r < 0 || r >= n.stops.length) return n;
75
+ let i = [...n.stops];
76
+ return [i[e], i[r]] = [i[r], i[e]], {
77
+ ...n,
78
+ stops: i
79
+ };
80
+ }), V = async (e) => {
81
+ if (e.preventDefault(), !C.name.trim()) {
82
+ j("Route name is required.");
83
+ return;
84
+ }
85
+ let t = C.stops.filter((e) => e.address.trim());
86
+ if (t.length === 0) {
87
+ j("Add at least one stop with an address.");
88
+ return;
89
+ }
90
+ E(!0), j(null);
91
+ try {
92
+ let e = t.map((e, t) => ({
93
+ id: `stop-${t + 1}`,
94
+ orderId: "",
95
+ sequence: t + 1,
96
+ address: {
97
+ street: e.address.trim(),
98
+ city: "",
99
+ state: "",
100
+ postalCode: "",
101
+ country: ""
102
+ },
103
+ type: e.type,
104
+ scheduledTime: /* @__PURE__ */ new Date(),
105
+ duration: 0,
106
+ status: "pending"
107
+ })), n = await h({
108
+ name: C.name.trim(),
109
+ status: C.status,
110
+ vehicleId: C.vehicleId || void 0,
111
+ driverId: C.driverId || void 0,
112
+ stops: e
113
+ });
114
+ m?.(p(f, `routes/${n.id}`));
115
+ } catch (e) {
116
+ console.error("Failed to create route:", e), j(e instanceof Error ? e.message : "Failed to create route. Please try again."), E(!1);
117
+ }
118
+ };
119
+ return /* @__PURE__ */ K(u, {
120
+ title: "Create Route",
121
+ subtitle: "Plan a new delivery route",
122
+ icon: /* @__PURE__ */ G(O, { size: 24 }),
123
+ headerActions: /* @__PURE__ */ K("div", {
124
+ className: "flex gap-2",
125
+ children: [/* @__PURE__ */ K(_, {
126
+ variant: "outline",
127
+ onClick: F,
128
+ disabled: T,
129
+ children: [/* @__PURE__ */ G(x, { size: 16 }), " Cancel"]
130
+ }), /* @__PURE__ */ K(_, {
131
+ onClick: V,
132
+ disabled: T,
133
+ children: [
134
+ /* @__PURE__ */ G(A, { size: 16 }),
135
+ " ",
136
+ T ? "Saving..." : "Create Route"
137
+ ]
138
+ })]
139
+ }),
140
+ children: [/* @__PURE__ */ G(J, {
141
+ icon: /* @__PURE__ */ G(O, { size: 18 }),
142
+ 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."
143
+ }), /* @__PURE__ */ K("form", {
144
+ onSubmit: V,
145
+ className: "max-w-3xl space-y-6",
146
+ children: [
147
+ /* @__PURE__ */ G(z, { message: D }),
148
+ /* @__PURE__ */ K(q, { children: [/* @__PURE__ */ G("h2", {
149
+ className: "text-base font-semibold text-text-primary mb-4",
150
+ children: "Route Details"
151
+ }), /* @__PURE__ */ K("div", {
152
+ className: "space-y-4",
153
+ children: [/* @__PURE__ */ K("div", {
154
+ className: "grid grid-cols-1 md:grid-cols-2 gap-4",
155
+ children: [/* @__PURE__ */ K("div", {
156
+ className: "space-y-2",
157
+ children: [/* @__PURE__ */ K(d, {
158
+ htmlFor: "name",
159
+ children: ["Route Name ", /* @__PURE__ */ G("span", {
160
+ className: "text-status-error-text",
161
+ children: "*"
162
+ })]
163
+ }), /* @__PURE__ */ G(e, {
164
+ id: "name",
165
+ value: C.name,
166
+ onChange: (e) => w((t) => ({
167
+ ...t,
168
+ name: e.target.value
169
+ })),
170
+ placeholder: "Downtown morning run",
171
+ required: !0
172
+ })]
173
+ }), /* @__PURE__ */ K("div", {
174
+ className: "space-y-2",
175
+ children: [/* @__PURE__ */ G(d, {
176
+ htmlFor: "status",
177
+ children: "Status"
178
+ }), /* @__PURE__ */ K(i, {
179
+ value: C.status,
180
+ onValueChange: (e) => w((t) => ({
181
+ ...t,
182
+ status: e
183
+ })),
184
+ children: [/* @__PURE__ */ G(r, {
185
+ id: "status",
186
+ children: /* @__PURE__ */ G(a, {})
187
+ }), /* @__PURE__ */ G(t, { children: X.map((e) => /* @__PURE__ */ G(n, {
188
+ value: e.value,
189
+ children: e.label
190
+ }, e.value)) })]
191
+ })]
192
+ })]
193
+ }), /* @__PURE__ */ K("div", {
194
+ className: "grid grid-cols-1 md:grid-cols-2 gap-4",
195
+ children: [/* @__PURE__ */ K("div", {
196
+ className: "space-y-2",
197
+ children: [/* @__PURE__ */ G(d, {
198
+ htmlFor: "vehicle",
199
+ children: "Vehicle (optional)"
200
+ }), /* @__PURE__ */ K(i, {
201
+ value: C.vehicleId,
202
+ onValueChange: (e) => w((t) => ({
203
+ ...t,
204
+ vehicleId: e
205
+ })),
206
+ children: [/* @__PURE__ */ G(r, {
207
+ id: "vehicle",
208
+ children: /* @__PURE__ */ G(a, { placeholder: "Assign later" })
209
+ }), /* @__PURE__ */ G(t, { children: v.map((e) => /* @__PURE__ */ K(n, {
210
+ value: e.id,
211
+ children: [
212
+ e.vehicleNumber,
213
+ " (",
214
+ e.type,
215
+ ")"
216
+ ]
217
+ }, e.id)) })]
218
+ })]
219
+ }), /* @__PURE__ */ K("div", {
220
+ className: "space-y-2",
221
+ children: [/* @__PURE__ */ G(d, {
222
+ htmlFor: "driver",
223
+ children: "Driver (optional)"
224
+ }), /* @__PURE__ */ K(i, {
225
+ value: C.driverId,
226
+ onValueChange: (e) => w((t) => ({
227
+ ...t,
228
+ driverId: e
229
+ })),
230
+ children: [/* @__PURE__ */ G(r, {
231
+ id: "driver",
232
+ children: /* @__PURE__ */ G(a, { placeholder: "Assign later" })
233
+ }), /* @__PURE__ */ G(t, { children: S.map((e) => /* @__PURE__ */ K(n, {
234
+ value: e.id,
235
+ children: [
236
+ e.fullName,
237
+ " (",
238
+ e.employeeId,
239
+ ")"
240
+ ]
241
+ }, e.id)) })]
242
+ })]
243
+ })]
244
+ })]
245
+ })] }),
246
+ /* @__PURE__ */ K(o, { children: [/* @__PURE__ */ K(l, {
247
+ className: "flex flex-row items-center justify-between",
248
+ children: [/* @__PURE__ */ K(c, { children: ["Stops ", /* @__PURE__ */ G("span", {
249
+ className: "text-status-error-text",
250
+ children: "*"
251
+ })] }), /* @__PURE__ */ K(_, {
252
+ type: "button",
253
+ variant: "outline",
254
+ size: "sm",
255
+ onClick: I,
256
+ children: [/* @__PURE__ */ G(k, { size: 16 }), " Add Stop"]
257
+ })]
258
+ }), /* @__PURE__ */ G(s, {
259
+ className: "space-y-4",
260
+ children: C.stops.map((o, s) => /* @__PURE__ */ K("div", {
261
+ className: "grid grid-cols-1 md:grid-cols-12 gap-3 items-end",
262
+ children: [
263
+ /* @__PURE__ */ K("div", {
264
+ className: "md:col-span-7 space-y-2",
265
+ children: [/* @__PURE__ */ K(d, {
266
+ htmlFor: `stop-address-${s}`,
267
+ children: [
268
+ "Stop ",
269
+ s + 1,
270
+ " address"
271
+ ]
272
+ }), /* @__PURE__ */ G(e, {
273
+ id: `stop-address-${s}`,
274
+ value: o.address,
275
+ onChange: (e) => R(s, "address", e.target.value),
276
+ placeholder: "123 Main St, San Francisco, CA"
277
+ })]
278
+ }),
279
+ /* @__PURE__ */ K("div", {
280
+ className: "md:col-span-4 space-y-2",
281
+ children: [/* @__PURE__ */ G(d, {
282
+ htmlFor: `stop-type-${s}`,
283
+ children: "Type"
284
+ }), /* @__PURE__ */ K(i, {
285
+ value: o.type,
286
+ onValueChange: (e) => R(s, "type", e),
287
+ children: [/* @__PURE__ */ G(r, {
288
+ id: `stop-type-${s}`,
289
+ children: /* @__PURE__ */ G(a, {})
290
+ }), /* @__PURE__ */ K(t, { children: [/* @__PURE__ */ G(n, {
291
+ value: "pickup",
292
+ children: "Pickup"
293
+ }), /* @__PURE__ */ G(n, {
294
+ value: "delivery",
295
+ children: "Delivery"
296
+ })] })]
297
+ })]
298
+ }),
299
+ /* @__PURE__ */ K("div", {
300
+ className: "md:col-span-1 flex justify-end gap-1",
301
+ children: [
302
+ /* @__PURE__ */ G(_, {
303
+ type: "button",
304
+ variant: "ghost",
305
+ size: "icon",
306
+ onClick: () => B(s, -1),
307
+ disabled: s === 0,
308
+ "aria-label": `Move stop ${s + 1} up`,
309
+ children: /* @__PURE__ */ G(b, { size: 16 })
310
+ }),
311
+ /* @__PURE__ */ G(_, {
312
+ type: "button",
313
+ variant: "ghost",
314
+ size: "icon",
315
+ onClick: () => B(s, 1),
316
+ disabled: s === C.stops.length - 1,
317
+ "aria-label": `Move stop ${s + 1} down`,
318
+ children: /* @__PURE__ */ G(y, { size: 16 })
319
+ }),
320
+ /* @__PURE__ */ G(_, {
321
+ type: "button",
322
+ variant: "ghost",
323
+ size: "icon",
324
+ className: "text-status-error-text",
325
+ onClick: () => L(s),
326
+ disabled: C.stops.length === 1,
327
+ "aria-label": `Remove stop ${s + 1}`,
328
+ children: /* @__PURE__ */ G(M, { size: 16 })
329
+ })
330
+ ]
331
+ })
332
+ ]
333
+ }, s))
334
+ })] })
335
+ ]
336
+ })]
337
+ });
338
+ }
339
+ function Z() {
340
+ let { routeId: e } = ee(), { basePath: t, navigate: n } = g(), { route: r, isLoading: i, error: a, refetch: d } = F(e), { optimizeRoute: v } = P(), { message: y, notify: b } = T(), [k, A] = W(null), [M, N] = W(!1), X = () => n?.(p(t, "routes")), Z = (e) => n?.(p(t, e)), Q = async () => {
341
+ if (e) {
342
+ N(!0), A(null);
343
+ try {
344
+ await v(e), b("Route optimized — stops resequenced for the shortest run."), d();
345
+ } catch (e) {
346
+ A(e instanceof Error ? e.message : "Failed to optimize route.");
347
+ } finally {
348
+ N(!1);
349
+ }
350
+ }
351
+ };
352
+ if (!e) return /* @__PURE__ */ G(ne, {});
353
+ if (i) return /* @__PURE__ */ G(h, { message: "Loading route details..." });
354
+ if (a || !r) return /* @__PURE__ */ G(m, {
355
+ title: "Route not found",
356
+ onRetry: d
357
+ });
358
+ let $ = r.stops.map((e) => {
359
+ let t = U(e.address);
360
+ return t ? {
361
+ lat: t.lat,
362
+ lng: t.lng,
363
+ sequence: e.sequence,
364
+ label: H(e.address) || `Order #${e.orderId || e.sequence}`
365
+ } : null;
366
+ }).filter((e) => e !== null);
367
+ return /* @__PURE__ */ K(u, {
368
+ title: r.name,
369
+ subtitle: `${r.stops.length} stops - ${r.distance.toFixed(1)} km`,
370
+ icon: /* @__PURE__ */ G(O, { size: 24 }),
371
+ headerActions: /* @__PURE__ */ K("div", {
372
+ className: "flex gap-2",
373
+ children: [
374
+ /* @__PURE__ */ K(_, {
375
+ variant: "outline",
376
+ onClick: X,
377
+ children: [/* @__PURE__ */ G(x, { size: 16 }), " Back"]
378
+ }),
379
+ !r.optimized && /* @__PURE__ */ K(_, {
380
+ variant: "outline",
381
+ onClick: Q,
382
+ disabled: M,
383
+ children: [
384
+ /* @__PURE__ */ G(Y, { size: 16 }),
385
+ " ",
386
+ M ? "Optimizing…" : "Optimize"
387
+ ]
388
+ }),
389
+ /* @__PURE__ */ K(_, { children: [/* @__PURE__ */ G(j, { size: 16 }), " Edit"] })
390
+ ]
391
+ }),
392
+ headerContent: /* @__PURE__ */ K("div", {
393
+ className: "flex gap-2",
394
+ children: [/* @__PURE__ */ G(R, {
395
+ status: r.status,
396
+ customColors: L[r.status]
397
+ }), /* @__PURE__ */ G(f, {
398
+ variant: r.optimized ? "default" : "secondary",
399
+ children: r.optimized ? "Optimized" : "Not Optimized"
400
+ })]
401
+ }),
402
+ children: [
403
+ /* @__PURE__ */ G(J, {
404
+ icon: /* @__PURE__ */ G(O, { size: 18 }),
405
+ 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."
406
+ }),
407
+ /* @__PURE__ */ G(te, {
408
+ storageKey: "movethewheels-route-details",
409
+ steps: [
410
+ ...r.optimized ? [] : [{
411
+ id: "optimize",
412
+ label: "Optimize this route",
413
+ description: "Reorder stops to cut distance and driving time.",
414
+ icon: /* @__PURE__ */ G(Y, { size: 16 }),
415
+ onClick: Q
416
+ }],
417
+ {
418
+ id: "edit",
419
+ label: "Adjust stops",
420
+ description: "Add, remove or reorder the delivery stops.",
421
+ icon: /* @__PURE__ */ G(j, { size: 16 }),
422
+ onClick: () => {}
423
+ },
424
+ {
425
+ id: "orders",
426
+ label: "Review the orders on this route",
427
+ description: "Check the deliveries bundled into this run.",
428
+ icon: /* @__PURE__ */ G(D, { size: 16 }),
429
+ onClick: () => Z("orders")
430
+ }
431
+ ]
432
+ }),
433
+ k && /* @__PURE__ */ G("div", {
434
+ className: "mb-2",
435
+ children: /* @__PURE__ */ G(z, { message: k })
436
+ }),
437
+ y && /* @__PURE__ */ G("div", {
438
+ className: "mb-2",
439
+ children: /* @__PURE__ */ G(E, { message: y })
440
+ }),
441
+ /* @__PURE__ */ K("div", {
442
+ className: "grid grid-cols-1 lg:grid-cols-3 gap-6",
443
+ children: [/* @__PURE__ */ K("div", {
444
+ className: "lg:col-span-2 space-y-6",
445
+ children: [/* @__PURE__ */ K(o, { children: [/* @__PURE__ */ G(l, { children: /* @__PURE__ */ G(c, { children: "Route Map" }) }), /* @__PURE__ */ G(s, { children: $.length > 0 ? /* @__PURE__ */ G(I, {
446
+ className: "overflow-hidden rounded-lg border border-border-seam",
447
+ height: 360,
448
+ stops: $
449
+ }) : /* @__PURE__ */ K("div", {
450
+ className: "rounded-lg border border-border-seam bg-bg-sunken/40 p-4",
451
+ children: [/* @__PURE__ */ G("p", {
452
+ className: "mb-3 text-sm text-text-secondary",
453
+ children: "These stops don't have map coordinates yet — showing the planned sequence instead."
454
+ }), /* @__PURE__ */ G("ol", {
455
+ className: "space-y-2",
456
+ children: r.stops.map((e) => /* @__PURE__ */ K("li", {
457
+ className: "flex items-start gap-3",
458
+ children: [/* @__PURE__ */ G("span", {
459
+ 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",
460
+ children: e.sequence
461
+ }), /* @__PURE__ */ G("span", {
462
+ className: "text-sm",
463
+ children: H(e.address) || `Order #${e.orderId || e.sequence}`
464
+ })]
465
+ }, e.id))
466
+ })]
467
+ }) })] }), /* @__PURE__ */ K(o, { children: [/* @__PURE__ */ G(l, { children: /* @__PURE__ */ K(c, { children: [
468
+ "Stops (",
469
+ r.stops.length,
470
+ ")"
471
+ ] }) }), /* @__PURE__ */ G(s, { children: /* @__PURE__ */ G("div", {
472
+ className: "space-y-4",
473
+ children: r.stops.map((e, t) => /* @__PURE__ */ K("div", {
474
+ className: "flex gap-4",
475
+ children: [/* @__PURE__ */ K("div", {
476
+ className: "relative",
477
+ children: [/* @__PURE__ */ G("div", {
478
+ 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"}`,
479
+ children: e.status === "completed" ? /* @__PURE__ */ G(S, { size: 16 }) : e.sequence
480
+ }), t < r.stops.length - 1 && /* @__PURE__ */ G("div", { className: "absolute top-8 left-4 w-px h-12 bg-border" })]
481
+ }), /* @__PURE__ */ G("div", {
482
+ className: "flex-1 pb-4",
483
+ children: /* @__PURE__ */ K("div", {
484
+ className: "flex items-center justify-between",
485
+ children: [/* @__PURE__ */ K("div", { children: [/* @__PURE__ */ K("div", {
486
+ className: "flex items-center gap-2",
487
+ children: [/* @__PURE__ */ G(f, {
488
+ variant: e.type === "pickup" ? "secondary" : "default",
489
+ className: "capitalize",
490
+ children: e.type
491
+ }), /* @__PURE__ */ K("span", {
492
+ className: "font-medium",
493
+ children: ["Order #", e.orderId]
494
+ })]
495
+ }), /* @__PURE__ */ G("p", {
496
+ className: "text-sm text-text-secondary mt-1",
497
+ children: H(e.address)
498
+ })] }), /* @__PURE__ */ K("div", {
499
+ className: "text-right",
500
+ children: [
501
+ /* @__PURE__ */ K("p", {
502
+ className: "text-sm",
503
+ children: ["Scheduled: ", V(e.scheduledTime, "time")]
504
+ }),
505
+ e.actualTime && /* @__PURE__ */ K("p", {
506
+ className: "text-sm text-status-success-text",
507
+ children: ["Actual: ", V(e.actualTime, "time")]
508
+ }),
509
+ /* @__PURE__ */ K("p", {
510
+ className: "text-xs text-text-secondary",
511
+ children: [e.duration, " min stop"]
512
+ })
513
+ ]
514
+ })]
515
+ })
516
+ })]
517
+ }, e.id))
518
+ }) })] })]
519
+ }), /* @__PURE__ */ K("div", {
520
+ className: "space-y-6",
521
+ children: [
522
+ /* @__PURE__ */ K(q, {
523
+ className: "space-y-4",
524
+ children: [
525
+ /* @__PURE__ */ G("h2", {
526
+ className: "text-base font-semibold text-text-primary",
527
+ children: "Route Info"
528
+ }),
529
+ /* @__PURE__ */ K("div", { children: [/* @__PURE__ */ G("p", {
530
+ className: "text-sm text-text-secondary",
531
+ children: "Total Distance"
532
+ }), /* @__PURE__ */ K("p", {
533
+ className: "text-2xl font-bold",
534
+ children: [r.distance.toFixed(1), /* @__PURE__ */ G("span", {
535
+ className: "text-sm font-normal",
536
+ children: " km"
537
+ })]
538
+ })] }),
539
+ /* @__PURE__ */ K("div", { children: [/* @__PURE__ */ G("p", {
540
+ className: "text-sm text-text-secondary",
541
+ children: "Est. Duration"
542
+ }), /* @__PURE__ */ K("p", {
543
+ className: "text-2xl font-bold",
544
+ children: [r.estimatedDuration, /* @__PURE__ */ G("span", {
545
+ className: "text-sm font-normal",
546
+ children: " min"
547
+ })]
548
+ })] }),
549
+ r.fuelCost !== void 0 && /* @__PURE__ */ K("div", { children: [/* @__PURE__ */ K("p", {
550
+ className: "text-sm text-text-secondary flex items-center gap-1",
551
+ children: [/* @__PURE__ */ G(w, { size: 14 }), " Est. Fuel Cost"]
552
+ }), /* @__PURE__ */ G("p", {
553
+ className: "text-2xl font-bold",
554
+ children: B(r.fuelCost)
555
+ })] }),
556
+ r.actualDuration && /* @__PURE__ */ K("div", { children: [/* @__PURE__ */ G("p", {
557
+ className: "text-sm text-text-secondary",
558
+ children: "Actual Duration"
559
+ }), /* @__PURE__ */ K("p", {
560
+ className: "text-2xl font-bold",
561
+ children: [r.actualDuration, /* @__PURE__ */ G("span", {
562
+ className: "text-sm font-normal",
563
+ children: " min"
564
+ })]
565
+ })] })
566
+ ]
567
+ }),
568
+ /* @__PURE__ */ K(o, { children: [/* @__PURE__ */ G(l, { children: /* @__PURE__ */ K(c, {
569
+ className: "flex items-center gap-2",
570
+ children: [/* @__PURE__ */ G(C, { size: 18 }), " Timeline"]
571
+ }) }), /* @__PURE__ */ K(s, {
572
+ className: "space-y-3",
573
+ children: [
574
+ r.startTime && /* @__PURE__ */ K("div", { children: [/* @__PURE__ */ G("p", {
575
+ className: "text-sm text-text-secondary",
576
+ children: "Started"
577
+ }), /* @__PURE__ */ G("p", { children: V(r.startTime, "full") })] }),
578
+ r.endTime && /* @__PURE__ */ K("div", { children: [/* @__PURE__ */ G("p", {
579
+ className: "text-sm text-text-secondary",
580
+ children: "Completed"
581
+ }), /* @__PURE__ */ G("p", { children: V(r.endTime, "full") })] }),
582
+ /* @__PURE__ */ K("div", { children: [/* @__PURE__ */ G("p", {
583
+ className: "text-sm text-text-secondary",
584
+ children: "Created"
585
+ }), /* @__PURE__ */ G("p", { children: V(r.createdAt, "full") })] })
586
+ ]
587
+ })] }),
588
+ r.trafficConditions.length > 0 && /* @__PURE__ */ K(o, { children: [/* @__PURE__ */ G(l, { children: /* @__PURE__ */ G(c, { children: "Traffic Conditions" }) }), /* @__PURE__ */ G(s, { children: r.trafficConditions.map((e, t) => /* @__PURE__ */ K("div", {
589
+ className: `p-2 rounded mb-2 ${e.condition === "severe" ? "bg-status-error-bg-subtle" : (e.condition, "bg-status-warning-bg-subtle")}`,
590
+ children: [/* @__PURE__ */ K("p", {
591
+ className: "text-sm font-medium capitalize",
592
+ children: [e.condition, " traffic"]
593
+ }), /* @__PURE__ */ K("p", {
594
+ className: "text-xs text-text-secondary",
595
+ children: [
596
+ e.location,
597
+ " - +",
598
+ e.delay,
599
+ " min delay"
600
+ ]
601
+ })]
602
+ }, t)) })] })
603
+ ]
604
+ })]
605
+ })
606
+ ]
607
+ });
608
+ }
609
+ //#endregion
610
+ export { Z as default };