@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
@@ -1,610 +0,0 @@
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-h_q9l8af.js";
2
- import { n as y, t as b } from "./arrow-up-ClFaLPly.js";
3
- import { t as x } from "./arrow-left-XOzFvBFD.js";
4
- import { t as S } from "./circle-check-big-Dsuz8dJ2.js";
5
- import { t as C } from "./clock-DrZOQD8h.js";
6
- import { t as w } from "./fuel-BroSIBo1.js";
7
- import { n as T, t as E } from "./Notice-kkjV2rLR.js";
8
- import { t as D } from "./map-pin-BGbmEGn3.js";
9
- import { t as O } from "./navigation-CjKGLL9T.js";
10
- import { t as k } from "./plus-DY5R-c1j.js";
11
- import { t as A } from "./save-h9dzHwJE.js";
12
- import { t as j } from "./square-pen-DT5srCPD.js";
13
- import { t as M } from "./trash-2-DwcjTxYE.js";
14
- import { r as N } from "./useFleet-CT_iW2V9.js";
15
- import { r as P, t as F } from "./useRoutes-8fw8oO6y.js";
16
- import { n as I } from "./maps-DpIuSSmg.js";
17
- import { o as L, r as R } from "./StatusBadge-1W2p8fEi.js";
18
- import { t as z } from "./FormError-CWjGwOW8.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 };