@burdenoff/microfe-movethewheels 2026.624.1 → 2026.626.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 (119) hide show
  1. package/dist/{AIAssistantPage-BrHX2lQn.js → AIAssistantPage-AvsMbunM.js} +39 -33
  2. package/dist/{AnalyticsPage-DI6Wcaw5.js → AnalyticsPage-CCLfHgQZ.js} +44 -33
  3. package/dist/CreateOrderPage-CjlnEtk3.js +510 -0
  4. package/dist/CustomerDetailsPage-I6cdDHUi.js +265 -0
  5. package/dist/CustomersPage-CGGfD4ki.js +163 -0
  6. package/dist/{DashboardPage-3ZOnwg1a.js → DashboardPage-D2HRqwg9.js} +122 -111
  7. package/dist/DataTable-CD9ZhpLB.js +249 -0
  8. package/dist/DriverDetailsPage-rg_pGNuP.js +330 -0
  9. package/dist/DriversPage-DKiynISH.js +167 -0
  10. package/dist/FinancePage-Vg8WPs38.js +158 -0
  11. package/dist/{FleetPage-CPS7r4J3.js → FleetPage-DddXt8r8.js} +124 -85
  12. package/dist/ImportExportPage-BW6qO3kc.js +248 -0
  13. package/dist/InventoryPage-rMGuaJN-.js +222 -0
  14. package/dist/LiveTrackingPage-DQ1q4Id3.js +375 -0
  15. package/dist/MarketplacePage-DKrXAv62.js +219 -0
  16. package/dist/MetricCard-B7yMyvMX.js +146 -0
  17. package/dist/OrderDetailsPage-CFASgsYX.js +431 -0
  18. package/dist/OrdersListPage-BHeT8S5o.js +309 -0
  19. package/dist/{PageLayout-xDTiBTDS.js → PageLayout-D3N8MCTm.js} +213 -195
  20. package/dist/ProductDetailsPage-CFGcbaHo.js +195 -0
  21. package/dist/ProductsPage--xEpbQ8A.js +171 -0
  22. package/dist/{ReportsPage-B8OyWGzl.js → ReportsPage-Bb7_90rK.js} +57 -49
  23. package/dist/RouteDetailsPage-CVtDVb1N.js +282 -0
  24. package/dist/RoutesPage-s57PtgcQ.js +163 -0
  25. package/dist/SettingsPage-BYNCBOpN.js +298 -0
  26. package/dist/{StatusBadge-C--7NhoW.js → StatusBadge-CijYQXtb.js} +5 -2
  27. package/dist/{TrackingPage-BldUm_g7.js → TrackingPage-CcRc_dva.js} +88 -83
  28. package/dist/VehicleDetailsPage-3YDMPsPs.js +220 -0
  29. package/dist/VehiclesPage-UlxPWP9K.js +167 -0
  30. package/dist/WarehouseDetailsPage-Db7KeN-d.js +238 -0
  31. package/dist/WarehousesPage-CuTO-OPp.js +164 -0
  32. package/dist/{arrow-left-Bk5GsGNk.js → arrow-left-CBpZKkpq.js} +1 -1
  33. package/dist/{box-BAMv2-7M.js → box-CAaiElsb.js} +1 -1
  34. package/dist/{chart-column-CAfkf4o6.js → chart-column-D1Ym15-S.js} +1 -1
  35. package/dist/{chevron-right-Czrt_Qew.js → chevron-right-BIFGi0UA.js} +1 -1
  36. package/dist/{circle-alert-CEuV9Pij.js → circle-alert-DjmNo5_L.js} +1 -1
  37. package/dist/{circle-check-big-Cx8aO6B-.js → circle-check-big-CjuPVo3_.js} +1 -1
  38. package/dist/{clock-Be95bq7_.js → clock-BjkdnddD.js} +1 -1
  39. package/dist/{dollar-sign-kJqItPli.js → dollar-sign-IB4O0wuQ.js} +1 -1
  40. package/dist/{download-caab0D3V.js → download-Dpa9vqoG.js} +1 -1
  41. package/dist/{file-text-b1qhrJn1.js → file-text-C8Uioy11.js} +1 -1
  42. package/dist/{filter-BWmLTZB-.js → filter-Da5OZaHI.js} +1 -1
  43. package/dist/index.js +16 -16
  44. package/dist/{map-CS2aFgyO.js → map-_Per4sT9.js} +1 -1
  45. package/dist/{map-pin-96FeqL7H.js → map-pin-BSaf5IDL.js} +1 -1
  46. package/dist/{navigation-i6UXEjTC.js → navigation-DaTbrhw2.js} +1 -1
  47. package/dist/{package-KhSi3xaT.js → package-BE7U0wQE.js} +1 -1
  48. package/dist/{phone-B-h3tbsr.js → phone-DV4StZiA.js} +1 -1
  49. package/dist/{plus-D2BYAzMn.js → plus-Dl1rLeJR.js} +1 -1
  50. package/dist/{refresh-cw-D5Sy01s-.js → refresh-cw-CWfERAit.js} +1 -1
  51. package/dist/{route-CBDXuwH9.js → route-Dp9JiN_E.js} +1 -1
  52. package/dist/{save-CMc7h-Vi.js → save-XH8vydOn.js} +1 -1
  53. package/dist/{search-DVrUQbOg.js → search-OxoIiL_C.js} +1 -1
  54. package/dist/{settings-BwzIRYv3.js → settings-3Rw5NwFF.js} +1 -1
  55. package/dist/{square-pen-DmW36Bau.js → square-pen-hLIbFQFV.js} +1 -1
  56. package/dist/{star-Cv2MzxZL.js → star-YsVV3MNQ.js} +1 -1
  57. package/dist/{store-CLH957vl.js → store-RCBl7HB-.js} +1 -1
  58. package/dist/{trending-up-l8M0BO_w.js → trending-up-C-85AwGT.js} +1 -1
  59. package/dist/{triangle-alert-BI45s6bH.js → triangle-alert-BOhfGgmh.js} +1 -1
  60. package/dist/{truck-DX3lNQkz.js → truck-CtDjNFbi.js} +1 -1
  61. package/dist/{user-D8EY1uvt.js → user-Dz5TJZFs.js} +1 -1
  62. package/dist/{users-CfG0J8wP.js → users-g2N0eL-Z.js} +1 -1
  63. package/dist/{warehouse-Dt_bAr82.js → warehouse-D3WWDeTX.js} +1 -1
  64. package/dist/{wrench-C50eI_Iy.js → wrench-CmxY1n4I.js} +1 -1
  65. package/package.json +2 -2
  66. package/src/movethewheels/components/DataTable.tsx +41 -6
  67. package/src/movethewheels/components/MetricCard.tsx +51 -20
  68. package/src/movethewheels/components/PageLayout.tsx +60 -5
  69. package/src/movethewheels/components/StatusBadge.tsx +2 -1
  70. package/src/movethewheels/pages/AIAssistantPage.tsx +11 -3
  71. package/src/movethewheels/pages/AnalyticsPage.tsx +31 -25
  72. package/src/movethewheels/pages/CreateOrderPage.tsx +56 -17
  73. package/src/movethewheels/pages/CustomerDetailsPage.tsx +63 -38
  74. package/src/movethewheels/pages/CustomersPage.tsx +51 -12
  75. package/src/movethewheels/pages/DashboardPage.tsx +62 -48
  76. package/src/movethewheels/pages/DriverDetailsPage.tsx +57 -26
  77. package/src/movethewheels/pages/DriversPage.tsx +45 -12
  78. package/src/movethewheels/pages/FinancePage.tsx +45 -41
  79. package/src/movethewheels/pages/FleetPage.tsx +82 -34
  80. package/src/movethewheels/pages/ImportExportPage.tsx +46 -29
  81. package/src/movethewheels/pages/InventoryPage.tsx +37 -33
  82. package/src/movethewheels/pages/LiveTrackingPage.tsx +58 -20
  83. package/src/movethewheels/pages/MarketplacePage.tsx +37 -3
  84. package/src/movethewheels/pages/OrderDetailsPage.tsx +74 -46
  85. package/src/movethewheels/pages/OrdersListPage.tsx +81 -14
  86. package/src/movethewheels/pages/ProductDetailsPage.tsx +36 -11
  87. package/src/movethewheels/pages/ProductsPage.tsx +41 -12
  88. package/src/movethewheels/pages/ReportsPage.tsx +23 -19
  89. package/src/movethewheels/pages/RouteDetailsPage.tsx +71 -31
  90. package/src/movethewheels/pages/RoutesPage.tsx +48 -9
  91. package/src/movethewheels/pages/SettingsPage.tsx +68 -26
  92. package/src/movethewheels/pages/TrackingPage.tsx +52 -49
  93. package/src/movethewheels/pages/VehicleDetailsPage.tsx +49 -24
  94. package/src/movethewheels/pages/VehiclesPage.tsx +41 -15
  95. package/src/movethewheels/pages/WarehouseDetailsPage.tsx +55 -30
  96. package/src/movethewheels/pages/WarehousesPage.tsx +46 -9
  97. package/dist/CreateOrderPage-DfkSi6JF.js +0 -471
  98. package/dist/CustomerDetailsPage-DzAIu_tH.js +0 -239
  99. package/dist/CustomersPage-d21ixOYa.js +0 -119
  100. package/dist/DataTable-CZGz3SJu.js +0 -239
  101. package/dist/DriverDetailsPage-YuZSlPSV.js +0 -297
  102. package/dist/DriversPage-BOhqEBTv.js +0 -127
  103. package/dist/FinancePage-CnjUNXOb.js +0 -154
  104. package/dist/ImportExportPage-zNjs7xsV.js +0 -232
  105. package/dist/InventoryPage-C9g5d3SW.js +0 -223
  106. package/dist/LiveTrackingPage-DoBvtdBG.js +0 -332
  107. package/dist/MarketplacePage-BEj5hcBF.js +0 -192
  108. package/dist/MetricCard-DeHVeVwl.js +0 -135
  109. package/dist/OrderDetailsPage-D-9lDZYU.js +0 -398
  110. package/dist/OrdersListPage-CJzHbgY3.js +0 -257
  111. package/dist/ProductDetailsPage-3rKtzXpy.js +0 -168
  112. package/dist/ProductsPage-B0P_wjBJ.js +0 -131
  113. package/dist/RouteDetailsPage-DGjKTUMj.js +0 -240
  114. package/dist/RoutesPage-CpopY8xN.js +0 -116
  115. package/dist/SettingsPage-BvXSa3gi.js +0 -247
  116. package/dist/VehicleDetailsPage-Dqv--MVW.js +0 -194
  117. package/dist/VehiclesPage-CCBHRDHu.js +0 -127
  118. package/dist/WarehouseDetailsPage-ZObC_c7W.js +0 -215
  119. package/dist/WarehousesPage-CpgZEVW9.js +0 -121
@@ -0,0 +1,282 @@
1
+ import { d as e, f as t, g as n, h as r, i, it as a, l as o, n as s, r as c, t as l, u } from "./PageLayout-D3N8MCTm.js";
2
+ import { t as d } from "./arrow-left-CBpZKkpq.js";
3
+ import { t as f } from "./circle-check-big-CjuPVo3_.js";
4
+ import { t as p } from "./clock-BjkdnddD.js";
5
+ import { t as m } from "./map-pin-BSaf5IDL.js";
6
+ import { t as h } from "./navigation-DaTbrhw2.js";
7
+ import { t as g } from "./square-pen-hLIbFQFV.js";
8
+ import { r as _ } from "./graphqlClient-CdJyR_ed.js";
9
+ import { r as v, t as y } from "./useRoutes-v4aBaS-E.js";
10
+ import { r as b } from "./StatusBadge-CijYQXtb.js";
11
+ import { r as x, t as S } from "./formatters-_vJlC-47.js";
12
+ import { t as C } from "./navigation-BgnOfsVd.js";
13
+ import { useParams as w } from "react-router-dom";
14
+ import { jsx as T, jsxs as E } from "react/jsx-runtime";
15
+ import { EmphasisPanel as D, NextSteps as O, PagePurpose as k } from "@burdenoff/fe-libs/ui";
16
+ //#region node_modules/lucide-react/dist/esm/icons/zap.js
17
+ var A = a("Zap", [["path", {
18
+ 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",
19
+ key: "1xq2db"
20
+ }]]);
21
+ //#endregion
22
+ //#region src/movethewheels/pages/RouteDetailsPage.tsx
23
+ function j() {
24
+ let { routeId: a } = w(), { basePath: j, navigate: M } = _(), { route: N, isLoading: P, error: F, refetch: I } = y(a), { optimizeRoute: L } = v(), R = () => M?.(C(j, "routes")), z = (e) => M?.(C(j, e));
25
+ if (!a) return /* @__PURE__ */ E(i, {
26
+ title: "Create Route",
27
+ subtitle: "Plan a new delivery route",
28
+ icon: /* @__PURE__ */ T(h, { size: 24 }),
29
+ headerActions: /* @__PURE__ */ E(u, {
30
+ variant: "outline",
31
+ onClick: R,
32
+ children: [/* @__PURE__ */ T(d, { size: 16 }), " Back"]
33
+ }),
34
+ children: [/* @__PURE__ */ T(k, {
35
+ icon: /* @__PURE__ */ T(h, { size: 18 }),
36
+ children: "Plan a new delivery route — pick the stops to visit, and the optimizer will sequence them into the shortest driving plan so one driver can cover them in a single run."
37
+ }), /* @__PURE__ */ T(l, {
38
+ illustration: "onboarding",
39
+ title: "Build your route",
40
+ description: "The route planner lets you add stops, set the running order, and optimize for distance and time."
41
+ })]
42
+ });
43
+ if (P) return /* @__PURE__ */ T(c, { message: "Loading route details..." });
44
+ if (F || !N) return /* @__PURE__ */ T(s, {
45
+ title: "Route not found",
46
+ onRetry: I
47
+ });
48
+ let B = async () => {
49
+ try {
50
+ await L(N.id), I();
51
+ } catch (e) {
52
+ console.error(e);
53
+ }
54
+ };
55
+ return /* @__PURE__ */ E(i, {
56
+ title: N.name,
57
+ subtitle: `${N.stops.length} stops - ${N.distance.toFixed(1)} km`,
58
+ icon: /* @__PURE__ */ T(h, { size: 24 }),
59
+ headerActions: /* @__PURE__ */ E("div", {
60
+ className: "flex gap-2",
61
+ children: [
62
+ /* @__PURE__ */ E(u, {
63
+ variant: "outline",
64
+ onClick: R,
65
+ children: [/* @__PURE__ */ T(d, { size: 16 }), " Back"]
66
+ }),
67
+ !N.optimized && /* @__PURE__ */ E(u, {
68
+ variant: "outline",
69
+ onClick: B,
70
+ children: [/* @__PURE__ */ T(A, { size: 16 }), " Optimize"]
71
+ }),
72
+ /* @__PURE__ */ E(u, { children: [/* @__PURE__ */ T(g, { size: 16 }), " Edit"] })
73
+ ]
74
+ }),
75
+ headerContent: /* @__PURE__ */ E("div", {
76
+ className: "flex gap-2",
77
+ children: [/* @__PURE__ */ T(b, {
78
+ status: N.status,
79
+ customColors: {
80
+ planned: {
81
+ bg: "bg-blue-100",
82
+ text: "text-blue-700"
83
+ },
84
+ in_progress: {
85
+ bg: "bg-yellow-100",
86
+ text: "text-yellow-700"
87
+ },
88
+ completed: {
89
+ bg: "bg-green-100",
90
+ text: "text-green-700"
91
+ },
92
+ cancelled: {
93
+ bg: "bg-red-100",
94
+ text: "text-red-700"
95
+ }
96
+ }[N.status]
97
+ }), /* @__PURE__ */ T(o, {
98
+ variant: N.optimized ? "default" : "secondary",
99
+ children: N.optimized ? "Optimized" : "Not Optimized"
100
+ })]
101
+ }),
102
+ children: [
103
+ /* @__PURE__ */ T(k, {
104
+ icon: /* @__PURE__ */ T(h, { size: 18 }),
105
+ 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."
106
+ }),
107
+ /* @__PURE__ */ T(O, {
108
+ storageKey: "movethewheels-route-details",
109
+ steps: [
110
+ ...N.optimized ? [] : [{
111
+ id: "optimize",
112
+ label: "Optimize this route",
113
+ description: "Reorder stops to cut distance and driving time.",
114
+ icon: /* @__PURE__ */ T(A, { size: 16 }),
115
+ onClick: B
116
+ }],
117
+ {
118
+ id: "edit",
119
+ label: "Adjust stops",
120
+ description: "Add, remove or reorder the delivery stops.",
121
+ icon: /* @__PURE__ */ T(g, { size: 16 }),
122
+ onClick: () => {}
123
+ },
124
+ {
125
+ id: "orders",
126
+ label: "Review the orders on this route",
127
+ description: "Check the deliveries bundled into this run.",
128
+ icon: /* @__PURE__ */ T(m, { size: 16 }),
129
+ onClick: () => z("orders")
130
+ }
131
+ ]
132
+ }),
133
+ /* @__PURE__ */ E("div", {
134
+ className: "grid grid-cols-1 lg:grid-cols-3 gap-6",
135
+ children: [/* @__PURE__ */ E("div", {
136
+ className: "lg:col-span-2 space-y-6",
137
+ children: [/* @__PURE__ */ E(e, { children: [/* @__PURE__ */ T(r, { children: /* @__PURE__ */ T(n, { children: "Route Map" }) }), /* @__PURE__ */ T(t, { children: /* @__PURE__ */ T("div", {
138
+ className: "aspect-video bg-bg-sunken rounded-lg flex items-center justify-center",
139
+ children: /* @__PURE__ */ E("div", {
140
+ className: "text-center text-text-secondary",
141
+ children: [/* @__PURE__ */ T(m, {
142
+ size: 48,
143
+ className: "mx-auto mb-2 opacity-50"
144
+ }), /* @__PURE__ */ T("p", { children: "Route map visualization" })]
145
+ })
146
+ }) })] }), /* @__PURE__ */ E(e, { children: [/* @__PURE__ */ T(r, { children: /* @__PURE__ */ E(n, { children: [
147
+ "Stops (",
148
+ N.stops.length,
149
+ ")"
150
+ ] }) }), /* @__PURE__ */ T(t, { children: /* @__PURE__ */ T("div", {
151
+ className: "space-y-4",
152
+ children: N.stops.map((e, t) => /* @__PURE__ */ E("div", {
153
+ className: "flex gap-4",
154
+ children: [/* @__PURE__ */ E("div", {
155
+ className: "relative",
156
+ children: [/* @__PURE__ */ T("div", {
157
+ className: `w-8 h-8 rounded-full flex items-center justify-center ${e.status === "completed" ? "bg-green-500 text-white" : "bg-bg-sunken"}`,
158
+ children: e.status === "completed" ? /* @__PURE__ */ T(f, { size: 16 }) : e.sequence
159
+ }), t < N.stops.length - 1 && /* @__PURE__ */ T("div", { className: "absolute top-8 left-4 w-px h-12 bg-border" })]
160
+ }), /* @__PURE__ */ T("div", {
161
+ className: "flex-1 pb-4",
162
+ children: /* @__PURE__ */ E("div", {
163
+ className: "flex items-center justify-between",
164
+ children: [/* @__PURE__ */ E("div", { children: [/* @__PURE__ */ E("div", {
165
+ className: "flex items-center gap-2",
166
+ children: [/* @__PURE__ */ T(o, {
167
+ variant: e.type === "pickup" ? "secondary" : "default",
168
+ className: "capitalize",
169
+ children: e.type
170
+ }), /* @__PURE__ */ E("span", {
171
+ className: "font-medium",
172
+ children: ["Order #", e.orderId]
173
+ })]
174
+ }), /* @__PURE__ */ T("p", {
175
+ className: "text-sm text-text-secondary mt-1",
176
+ children: S(e.address)
177
+ })] }), /* @__PURE__ */ E("div", {
178
+ className: "text-right",
179
+ children: [
180
+ /* @__PURE__ */ E("p", {
181
+ className: "text-sm",
182
+ children: ["Scheduled: ", x(e.scheduledTime, "time")]
183
+ }),
184
+ e.actualTime && /* @__PURE__ */ E("p", {
185
+ className: "text-sm text-green-600",
186
+ children: ["Actual: ", x(e.actualTime, "time")]
187
+ }),
188
+ /* @__PURE__ */ E("p", {
189
+ className: "text-xs text-text-secondary",
190
+ children: [e.duration, " min stop"]
191
+ })
192
+ ]
193
+ })]
194
+ })
195
+ })]
196
+ }, e.id))
197
+ }) })] })]
198
+ }), /* @__PURE__ */ E("div", {
199
+ className: "space-y-6",
200
+ children: [
201
+ /* @__PURE__ */ E(D, {
202
+ className: "space-y-4",
203
+ children: [
204
+ /* @__PURE__ */ T("h2", {
205
+ className: "text-base font-semibold text-text-primary",
206
+ children: "Route Info"
207
+ }),
208
+ /* @__PURE__ */ E("div", { children: [/* @__PURE__ */ T("p", {
209
+ className: "text-sm text-text-secondary",
210
+ children: "Total Distance"
211
+ }), /* @__PURE__ */ E("p", {
212
+ className: "text-2xl font-bold",
213
+ children: [N.distance.toFixed(1), /* @__PURE__ */ T("span", {
214
+ className: "text-sm font-normal",
215
+ children: " km"
216
+ })]
217
+ })] }),
218
+ /* @__PURE__ */ E("div", { children: [/* @__PURE__ */ T("p", {
219
+ className: "text-sm text-text-secondary",
220
+ children: "Est. Duration"
221
+ }), /* @__PURE__ */ E("p", {
222
+ className: "text-2xl font-bold",
223
+ children: [N.estimatedDuration, /* @__PURE__ */ T("span", {
224
+ className: "text-sm font-normal",
225
+ children: " min"
226
+ })]
227
+ })] }),
228
+ N.actualDuration && /* @__PURE__ */ E("div", { children: [/* @__PURE__ */ T("p", {
229
+ className: "text-sm text-text-secondary",
230
+ children: "Actual Duration"
231
+ }), /* @__PURE__ */ E("p", {
232
+ className: "text-2xl font-bold",
233
+ children: [N.actualDuration, /* @__PURE__ */ T("span", {
234
+ className: "text-sm font-normal",
235
+ children: " min"
236
+ })]
237
+ })] })
238
+ ]
239
+ }),
240
+ /* @__PURE__ */ E(e, { children: [/* @__PURE__ */ T(r, { children: /* @__PURE__ */ E(n, {
241
+ className: "flex items-center gap-2",
242
+ children: [/* @__PURE__ */ T(p, { size: 18 }), " Timeline"]
243
+ }) }), /* @__PURE__ */ E(t, {
244
+ className: "space-y-3",
245
+ children: [
246
+ N.startTime && /* @__PURE__ */ E("div", { children: [/* @__PURE__ */ T("p", {
247
+ className: "text-sm text-text-secondary",
248
+ children: "Started"
249
+ }), /* @__PURE__ */ T("p", { children: x(N.startTime, "full") })] }),
250
+ N.endTime && /* @__PURE__ */ E("div", { children: [/* @__PURE__ */ T("p", {
251
+ className: "text-sm text-text-secondary",
252
+ children: "Completed"
253
+ }), /* @__PURE__ */ T("p", { children: x(N.endTime, "full") })] }),
254
+ /* @__PURE__ */ E("div", { children: [/* @__PURE__ */ T("p", {
255
+ className: "text-sm text-text-secondary",
256
+ children: "Created"
257
+ }), /* @__PURE__ */ T("p", { children: x(N.createdAt, "full") })] })
258
+ ]
259
+ })] }),
260
+ N.trafficConditions.length > 0 && /* @__PURE__ */ E(e, { children: [/* @__PURE__ */ T(r, { children: /* @__PURE__ */ T(n, { children: "Traffic Conditions" }) }), /* @__PURE__ */ T(t, { children: N.trafficConditions.map((e, t) => /* @__PURE__ */ E("div", {
261
+ className: `p-2 rounded mb-2 ${e.condition === "severe" ? "bg-red-50" : e.condition === "heavy" ? "bg-orange-50" : "bg-yellow-50"}`,
262
+ children: [/* @__PURE__ */ E("p", {
263
+ className: "text-sm font-medium capitalize",
264
+ children: [e.condition, " traffic"]
265
+ }), /* @__PURE__ */ E("p", {
266
+ className: "text-xs text-text-secondary",
267
+ children: [
268
+ e.location,
269
+ " - +",
270
+ e.delay,
271
+ " min delay"
272
+ ]
273
+ })]
274
+ }, t)) })] })
275
+ ]
276
+ })]
277
+ })
278
+ ]
279
+ });
280
+ }
281
+ //#endregion
282
+ export { j as default };
@@ -0,0 +1,163 @@
1
+ import { i as e, l as t, u as n } from "./PageLayout-D3N8MCTm.js";
2
+ import { t as r } from "./DataTable-CD9ZhpLB.js";
3
+ import { t as i } from "./navigation-DaTbrhw2.js";
4
+ import { t as a } from "./plus-Dl1rLeJR.js";
5
+ import { t as o } from "./refresh-cw-CWfERAit.js";
6
+ import { r as s } from "./graphqlClient-CdJyR_ed.js";
7
+ import { r as c } from "./useRoutes-v4aBaS-E.js";
8
+ import { r as l } from "./StatusBadge-CijYQXtb.js";
9
+ import { r as u } from "./formatters-_vJlC-47.js";
10
+ import { t as d } from "./navigation-BgnOfsVd.js";
11
+ import { jsx as f, jsxs as p } from "react/jsx-runtime";
12
+ import { CTAOverflowMenu as m, EmphasisPanel as h, PagePurpose as g } from "@burdenoff/fe-libs/ui";
13
+ //#region src/movethewheels/pages/RoutesPage.tsx
14
+ function _() {
15
+ let { basePath: _, navigate: v } = s(), { routes: y, totalRoutes: b, isLoading: x, refetch: S } = c(), C = (e) => v?.(d(_, e));
16
+ return /* @__PURE__ */ p(e, {
17
+ title: "Routes",
18
+ subtitle: `${b} routes`,
19
+ icon: /* @__PURE__ */ f(i, { size: 24 }),
20
+ headerActions: /* @__PURE__ */ f(m, {
21
+ primary: {
22
+ label: "Create Route",
23
+ icon: /* @__PURE__ */ f(a, { size: 16 }),
24
+ onSelect: () => C("routes/new")
25
+ },
26
+ actions: [{
27
+ label: "Refresh",
28
+ icon: /* @__PURE__ */ f(o, { size: 16 }),
29
+ onSelect: () => S()
30
+ }]
31
+ }),
32
+ children: [
33
+ /* @__PURE__ */ f(g, {
34
+ icon: /* @__PURE__ */ f(i, { size: 18 }),
35
+ children: "Routes group multiple delivery stops into an optimized driving plan. Build a route to batch nearby drop-offs, cut distance and fuel, and give drivers a single ordered itinerary — then open one to review stops, distance and optimization status."
36
+ }),
37
+ /* @__PURE__ */ p(h, { children: [/* @__PURE__ */ f("p", {
38
+ className: "text-sm font-medium text-text-secondary",
39
+ children: "Routes at a glance"
40
+ }), /* @__PURE__ */ p("div", {
41
+ className: "mt-3 grid grid-cols-3 gap-4",
42
+ children: [
43
+ /* @__PURE__ */ p("div", { children: [/* @__PURE__ */ f("p", {
44
+ className: "text-2xl font-bold text-text-primary tabular-nums",
45
+ children: b
46
+ }), /* @__PURE__ */ f("p", {
47
+ className: "text-xs text-text-secondary",
48
+ children: "Total routes"
49
+ })] }),
50
+ /* @__PURE__ */ p("div", { children: [/* @__PURE__ */ f("p", {
51
+ className: "text-2xl font-bold text-text-primary tabular-nums",
52
+ children: y.filter((e) => e.status === "in_progress").length
53
+ }), /* @__PURE__ */ f("p", {
54
+ className: "text-xs text-text-secondary",
55
+ children: "In progress"
56
+ })] }),
57
+ /* @__PURE__ */ p("div", { children: [/* @__PURE__ */ f("p", {
58
+ className: "text-2xl font-bold text-text-primary tabular-nums",
59
+ children: y.filter((e) => e.optimized).length
60
+ }), /* @__PURE__ */ f("p", {
61
+ className: "text-xs text-text-secondary",
62
+ children: "Optimized"
63
+ })] })
64
+ ]
65
+ })] }),
66
+ /* @__PURE__ */ f(r, {
67
+ columns: [
68
+ {
69
+ id: "name",
70
+ header: "Route Name",
71
+ accessorKey: "name",
72
+ sortable: !0,
73
+ cell: (e) => /* @__PURE__ */ f("span", {
74
+ className: "font-medium",
75
+ children: e.name
76
+ })
77
+ },
78
+ {
79
+ id: "status",
80
+ header: "Status",
81
+ accessorKey: "status",
82
+ sortable: !0,
83
+ cell: (e) => /* @__PURE__ */ f(l, {
84
+ status: e.status,
85
+ customColors: {
86
+ planned: {
87
+ bg: "bg-blue-100",
88
+ text: "text-blue-700"
89
+ },
90
+ in_progress: {
91
+ bg: "bg-yellow-100",
92
+ text: "text-yellow-700"
93
+ },
94
+ completed: {
95
+ bg: "bg-green-100",
96
+ text: "text-green-700"
97
+ },
98
+ cancelled: {
99
+ bg: "bg-red-100",
100
+ text: "text-red-700"
101
+ }
102
+ }[e.status]
103
+ })
104
+ },
105
+ {
106
+ id: "stops",
107
+ header: "Stops",
108
+ cell: (e) => /* @__PURE__ */ p(t, {
109
+ variant: "secondary",
110
+ children: [e.stops.length, " stops"]
111
+ })
112
+ },
113
+ {
114
+ id: "distance",
115
+ header: "Distance",
116
+ accessorKey: "distance",
117
+ sortable: !0,
118
+ cell: (e) => `${e.distance.toFixed(1)} km`
119
+ },
120
+ {
121
+ id: "duration",
122
+ header: "Est. Duration",
123
+ cell: (e) => `${e.estimatedDuration} min`
124
+ },
125
+ {
126
+ id: "optimized",
127
+ header: "Optimized",
128
+ cell: (e) => /* @__PURE__ */ f(t, {
129
+ variant: e.optimized ? "default" : "outline",
130
+ children: e.optimized ? "Yes" : "No"
131
+ })
132
+ },
133
+ {
134
+ id: "created",
135
+ header: "Created",
136
+ accessorKey: "createdAt",
137
+ sortable: !0,
138
+ cell: (e) => u(e.createdAt, "short")
139
+ }
140
+ ],
141
+ data: y,
142
+ isLoading: x,
143
+ searchable: !0,
144
+ searchPlaceholder: "Search routes...",
145
+ searchFields: ["name"],
146
+ onRowClick: (e) => C(`routes/${e.id}`),
147
+ getRowId: (e) => e.id,
148
+ emptyIllustration: "empty-data",
149
+ emptyTitle: "No routes yet",
150
+ emptyDescription: "Create a route to batch deliveries into an optimized driving plan.",
151
+ emptyAction: /* @__PURE__ */ p(n, {
152
+ onClick: () => C("routes/new"),
153
+ children: [/* @__PURE__ */ f(a, {
154
+ size: 16,
155
+ className: "mr-1.5"
156
+ }), "Create Route"]
157
+ })
158
+ })
159
+ ]
160
+ });
161
+ }
162
+ //#endregion
163
+ export { _ as default };