@burdenoff/microfe-movethewheels 2026.626.2 → 2026.703.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (135) hide show
  1. package/dist/{AIAssistantPage-AvsMbunM.js → AIAssistantPage-C3cPsWt-.js} +100 -73
  2. package/dist/AnalyticsPage-Dz6g2MvK.js +215 -0
  3. package/dist/{CreateOrderPage-CjlnEtk3.js → CreateOrderPage-C5iwnjp4.js} +36 -67
  4. package/dist/CustomerDetailsPage-B6nwFyLO.js +406 -0
  5. package/dist/{CustomersPage-CGGfD4ki.js → CustomersPage-2Y05LVyh.js} +26 -28
  6. package/dist/{DashboardPage-D2HRqwg9.js → DashboardPage-BVjQi0EB.js} +85 -83
  7. package/dist/{DataTable-CD9ZhpLB.js → DataTable-DmciIKKM.js} +3 -3
  8. package/dist/DriverDetailsPage-CN3WQ0B9.js +507 -0
  9. package/dist/{DriversPage-DKiynISH.js → DriversPage-B0Zpx8OQ.js} +25 -27
  10. package/dist/{FinancePage-Vg8WPs38.js → FinancePage-DEDykSOP.js} +9 -9
  11. package/dist/FleetPage-DqkFi3s3.js +365 -0
  12. package/dist/FormError-BlOjnXOq.js +15 -0
  13. package/dist/ImportExportPage-DKJRCezl.js +290 -0
  14. package/dist/InventoryPage-DwfgCUQq.js +253 -0
  15. package/dist/{LiveTrackingPage-DQ1q4Id3.js → LiveTrackingPage-DCX-K-LR.js} +60 -56
  16. package/dist/MarketplacePage-CIQ97_zp.js +247 -0
  17. package/dist/{MetricCard-B7yMyvMX.js → MetricCard-BY0QrMD4.js} +1 -1
  18. package/dist/{OrderDetailsPage-CFASgsYX.js → OrderDetailsPage-DYiZ-9UK.js} +83 -85
  19. package/dist/{OrdersListPage-BHeT8S5o.js → OrdersListPage-BjDlCKJd.js} +31 -33
  20. package/dist/{PageLayout-D3N8MCTm.js → PageLayout-D4LDHJJq.js} +483 -422
  21. package/dist/ProductDetailsPage-C9uOiYLp.js +350 -0
  22. package/dist/{ProductsPage--xEpbQ8A.js → ProductsPage-C1G9h7Xd.js} +22 -24
  23. package/dist/ReportsPage-Zp53q3_8.js +284 -0
  24. package/dist/RouteDetailsPage-DUStXSf9.js +531 -0
  25. package/dist/RoutesPage-DMfoicM1.js +144 -0
  26. package/dist/SettingsPage-Bn-v0mbQ.js +421 -0
  27. package/dist/StatusBadge-BZurYHMy.js +152 -0
  28. package/dist/{TrackingPage-CcRc_dva.js → TrackingPage-W-jtdM3Y.js} +59 -61
  29. package/dist/VehicleDetailsPage-Bceo5oz3.js +410 -0
  30. package/dist/{VehiclesPage-UlxPWP9K.js → VehiclesPage-VBtOep91.js} +20 -22
  31. package/dist/WarehouseDetailsPage-L_6sWigM.js +493 -0
  32. package/dist/{WarehousesPage-CuTO-OPp.js → WarehousesPage-DCbXXXWE.js} +16 -18
  33. package/dist/{arrow-left-CBpZKkpq.js → arrow-left-n48Y-Wis.js} +1 -1
  34. package/dist/{box-CAaiElsb.js → box-D9Pal4HM.js} +1 -1
  35. package/dist/{chart-column-D1Ym15-S.js → chart-column-BFIJysDR.js} +1 -1
  36. package/dist/{chevron-right-BIFGi0UA.js → chevron-right-EMIIyyJ1.js} +1 -1
  37. package/dist/{circle-alert-DjmNo5_L.js → circle-alert-iY24lSlp.js} +1 -1
  38. package/dist/{circle-check-big-CjuPVo3_.js → circle-check-big-w0TrLKMF.js} +1 -1
  39. package/dist/{clock-BjkdnddD.js → clock-DJZtdl8u.js} +1 -1
  40. package/dist/{dollar-sign-IB4O0wuQ.js → dollar-sign-CgKQRz_e.js} +1 -1
  41. package/dist/{download-Dpa9vqoG.js → download-DRXxoiQR.js} +1 -1
  42. package/dist/{file-text-C8Uioy11.js → file-text-DWWY6_f5.js} +1 -1
  43. package/dist/{filter-Da5OZaHI.js → filter-DloLC2eE.js} +1 -1
  44. package/dist/index.js +186 -162
  45. package/dist/{map-_Per4sT9.js → map-CkJaULb2.js} +1 -1
  46. package/dist/{map-pin-BSaf5IDL.js → map-pin-BGiCvyCs.js} +1 -1
  47. package/dist/{navigation-DaTbrhw2.js → navigation-D36prnAn.js} +1 -1
  48. package/dist/{package-BE7U0wQE.js → package-BChUzpJS.js} +1 -1
  49. package/dist/{phone-DV4StZiA.js → phone-Ac9s3mo_.js} +1 -1
  50. package/dist/{plus-Dl1rLeJR.js → plus-Z76q-FZm.js} +1 -1
  51. package/dist/{refresh-cw-CWfERAit.js → refresh-cw-DKt6f5T6.js} +1 -1
  52. package/dist/{save-XH8vydOn.js → save-CojywNhG.js} +1 -1
  53. package/dist/{search-OxoIiL_C.js → search-CDGefqb3.js} +1 -1
  54. package/dist/{square-pen-hLIbFQFV.js → square-pen-CopE9GmB.js} +1 -1
  55. package/dist/{star-YsVV3MNQ.js → star-nHlLjDKR.js} +1 -1
  56. package/dist/{store-RCBl7HB-.js → store-BR9Voi5E.js} +1 -1
  57. package/dist/trash-2-BKhar6Hs.js +32 -0
  58. package/dist/{trending-up-C-85AwGT.js → trending-up-Dohgd4t_.js} +1 -1
  59. package/dist/{triangle-alert-BOhfGgmh.js → triangle-alert-i-XQL9Rd.js} +1 -1
  60. package/dist/{truck-CtDjNFbi.js → truck-C0v_hbLR.js} +1 -1
  61. package/dist/{useAnalytics-ph7eTIK6.js → useAnalytics-DS8n0xgg.js} +40 -40
  62. package/dist/useAssistant-D4v3oxD3.js +84 -0
  63. package/dist/{useCustomers-bS3a4ytk.js → useCustomers-BmTNGxiI.js} +24 -24
  64. package/dist/{useFleet-BdETplNE.js → useFleet-DKqXZ16m.js} +133 -109
  65. package/dist/useImportExport-DHr-SWSw.js +55 -0
  66. package/dist/{useInventory-Dwn18FPz.js → useInventory-DkyiVY_A.js} +95 -75
  67. package/dist/{useOrders-D_3_hGMp.js → useOrders-Cfk1GLiq.js} +42 -42
  68. package/dist/useReports-CTqZr-AB.js +78 -0
  69. package/dist/{useRoutes-v4aBaS-E.js → useRoutes-BQWO607N.js} +31 -31
  70. package/dist/useSettings-CkDH_-gM.js +81 -0
  71. package/dist/{useTracking-De2KIUNu.js → useTracking-B-va1kO3.js} +22 -22
  72. package/dist/{user-Dz5TJZFs.js → user-jyFU3lXk.js} +1 -1
  73. package/dist/{users-g2N0eL-Z.js → users-DZ-ilS6B.js} +1 -1
  74. package/dist/{warehouse-D3WWDeTX.js → warehouse-6m5kXMLu.js} +1 -1
  75. package/dist/{wrench-CmxY1n4I.js → wrench-CANXWxF-.js} +1 -1
  76. package/package.json +1 -1
  77. package/src/movethewheels/MoveTheWheelsRoutes.tsx +31 -3
  78. package/src/movethewheels/components/FormError.tsx +25 -0
  79. package/src/movethewheels/components/StatusBadge.tsx +18 -37
  80. package/src/movethewheels/constants/index.ts +67 -26
  81. package/src/movethewheels/hooks/index.ts +12 -0
  82. package/src/movethewheels/hooks/useAnalytics.ts +20 -6
  83. package/src/movethewheels/hooks/useAssistant.ts +74 -0
  84. package/src/movethewheels/hooks/useFleet.ts +170 -59
  85. package/src/movethewheels/hooks/useImportExport.ts +101 -0
  86. package/src/movethewheels/hooks/useInventory.ts +107 -0
  87. package/src/movethewheels/hooks/useReports.ts +158 -0
  88. package/src/movethewheels/hooks/useSettings.ts +120 -0
  89. package/src/movethewheels/pages/AIAssistantPage.tsx +53 -15
  90. package/src/movethewheels/pages/AnalyticsPage.tsx +67 -64
  91. package/src/movethewheels/pages/CustomerDetailsPage.tsx +154 -21
  92. package/src/movethewheels/pages/CustomersPage.tsx +1 -1
  93. package/src/movethewheels/pages/DashboardPage.tsx +42 -22
  94. package/src/movethewheels/pages/DriverDetailsPage.tsx +160 -3
  95. package/src/movethewheels/pages/DriversPage.tsx +6 -2
  96. package/src/movethewheels/pages/FleetPage.tsx +96 -38
  97. package/src/movethewheels/pages/ImportExportPage.tsx +174 -68
  98. package/src/movethewheels/pages/InventoryPage.tsx +66 -28
  99. package/src/movethewheels/pages/LiveTrackingPage.tsx +12 -3
  100. package/src/movethewheels/pages/MarketplacePage.tsx +87 -45
  101. package/src/movethewheels/pages/OrderDetailsPage.tsx +2 -2
  102. package/src/movethewheels/pages/ProductDetailsPage.tsx +146 -3
  103. package/src/movethewheels/pages/ProductsPage.tsx +5 -1
  104. package/src/movethewheels/pages/ReportsPage.tsx +194 -90
  105. package/src/movethewheels/pages/RouteDetailsPage.tsx +290 -36
  106. package/src/movethewheels/pages/RoutesPage.tsx +4 -9
  107. package/src/movethewheels/pages/SettingsPage.tsx +234 -56
  108. package/src/movethewheels/pages/TrackingPage.tsx +6 -6
  109. package/src/movethewheels/pages/VehicleDetailsPage.tsx +158 -2
  110. package/src/movethewheels/pages/VehiclesPage.tsx +5 -1
  111. package/src/movethewheels/pages/WarehouseDetailsPage.tsx +224 -2
  112. package/src/movethewheels/pages/WarehousesPage.tsx +5 -1
  113. package/src/movethewheels/providers/MoveTheWheelsProvider.tsx +7 -6
  114. package/src/movethewheels/store/movethewheelsStore.ts +1 -1
  115. package/dist/AnalyticsPage-CCLfHgQZ.js +0 -212
  116. package/dist/CustomerDetailsPage-I6cdDHUi.js +0 -265
  117. package/dist/DriverDetailsPage-rg_pGNuP.js +0 -330
  118. package/dist/FleetPage-DddXt8r8.js +0 -332
  119. package/dist/ImportExportPage-BW6qO3kc.js +0 -248
  120. package/dist/InventoryPage-rMGuaJN-.js +0 -222
  121. package/dist/MarketplacePage-DKrXAv62.js +0 -219
  122. package/dist/ProductDetailsPage-CFGcbaHo.js +0 -195
  123. package/dist/ReportsPage-Bb7_90rK.js +0 -235
  124. package/dist/RouteDetailsPage-CVtDVb1N.js +0 -282
  125. package/dist/RoutesPage-s57PtgcQ.js +0 -163
  126. package/dist/SettingsPage-BYNCBOpN.js +0 -298
  127. package/dist/StatusBadge-CijYQXtb.js +0 -209
  128. package/dist/VehicleDetailsPage-3YDMPsPs.js +0 -220
  129. package/dist/WarehouseDetailsPage-Db7KeN-d.js +0 -238
  130. package/dist/graphqlClient-CdJyR_ed.js +0 -55
  131. package/dist/navigation-BgnOfsVd.js +0 -6
  132. package/dist/route-Dp9JiN_E.js +0 -51
  133. package/dist/settings-3Rw5NwFF.js +0 -28
  134. package/src/movethewheels/constants/mockData.ts +0 -1342
  135. /package/dist/{formatters-_vJlC-47.js → formatters-CF2S2l1m.js} +0 -0
@@ -0,0 +1,365 @@
1
+ import { M as e, a as t, ct as n, d as r, f as i, g as a, h as o, i as s, o as c, ot as l, s as u, u as d } from "./PageLayout-D4LDHJJq.js";
2
+ import { t as f } from "./chevron-right-EMIIyyJ1.js";
3
+ import { n as p, t as m } from "./wrench-CANXWxF-.js";
4
+ import { t as h } from "./star-nHlLjDKR.js";
5
+ import { t as g } from "./truck-C0v_hbLR.js";
6
+ import { t as _ } from "./users-DZ-ilS6B.js";
7
+ import { i as v, n as y, o as b } from "./useFleet-DKqXZ16m.js";
8
+ import { n as x, r as S, t as C } from "./MetricCard-BY0QrMD4.js";
9
+ import { a as w, r as T } from "./StatusBadge-BZurYHMy.js";
10
+ import { jsx as E, jsxs as D } from "react/jsx-runtime";
11
+ import { CTAOverflowMenu as O, EmphasisPanel as k, NextSteps as A, PagePurpose as j } from "@burdenoff/fe-libs/ui";
12
+ import { useI18n as M } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
13
+ //#region src/movethewheels/pages/FleetPage.tsx
14
+ function N() {
15
+ let { t: N } = M(), P = (e, t) => {
16
+ let n = N(e);
17
+ return n === e ? t : n;
18
+ }, { basePath: F, navigate: I } = l(), { stats: L, isLoading: R, error: z, refetch: B } = v(), { vehicles: V, isLoading: H, error: U, refetch: W } = b(), { drivers: G, isLoading: K, error: q, refetch: J } = y(), Y = R || H || K, X = z ?? U ?? q, Z = () => {
19
+ B(), W(), J();
20
+ }, Q = (e) => {
21
+ I && I(n(F, e));
22
+ }, $ = (e, t) => {
23
+ (e.key === "Enter" || e.key === " ") && (e.preventDefault(), t());
24
+ };
25
+ return /* @__PURE__ */ D(s, {
26
+ title: P("movethewheels.fleet.title", "Fleet Management"),
27
+ subtitle: P("movethewheels.fleet.subtitle", "Manage your vehicles and drivers"),
28
+ icon: /* @__PURE__ */ E(g, { size: 24 }),
29
+ headerActions: /* @__PURE__ */ E(O, {
30
+ primary: {
31
+ label: P("movethewheels.fleet.actions.allVehicles", "All Vehicles"),
32
+ icon: /* @__PURE__ */ E(g, { size: 16 }),
33
+ onSelect: () => Q("fleet/vehicles")
34
+ },
35
+ actions: [{
36
+ label: P("movethewheels.fleet.actions.allDrivers", "All Drivers"),
37
+ icon: /* @__PURE__ */ E(_, { size: 16 }),
38
+ onSelect: () => Q("fleet/drivers")
39
+ }]
40
+ }),
41
+ children: [
42
+ /* @__PURE__ */ E(j, {
43
+ icon: /* @__PURE__ */ E(g, { size: 18 }),
44
+ children: P("movethewheels.fleet.purpose", "Your command center for vehicles and drivers. See utilization at a glance, keep an eye on availability and ratings, and act on maintenance alerts so you always have road-ready capacity to fulfil orders.")
45
+ }),
46
+ /* @__PURE__ */ E(A, {
47
+ storageKey: "movethewheels-fleet",
48
+ steps: [
49
+ {
50
+ id: "vehicles",
51
+ label: P("movethewheels.fleet.nextSteps.vehicles", "Review your vehicles"),
52
+ description: P("movethewheels.fleet.nextSteps.vehiclesDesc", "Check capacity, fuel and maintenance status across the fleet."),
53
+ icon: /* @__PURE__ */ E(g, { size: 16 }),
54
+ onClick: () => Q("fleet/vehicles")
55
+ },
56
+ {
57
+ id: "drivers",
58
+ label: P("movethewheels.fleet.nextSteps.drivers", "Review your drivers"),
59
+ description: P("movethewheels.fleet.nextSteps.driversDesc", "See availability, ratings and delivery history before assigning work."),
60
+ icon: /* @__PURE__ */ E(_, { size: 16 }),
61
+ onClick: () => Q("fleet/drivers")
62
+ },
63
+ {
64
+ id: "assign",
65
+ label: P("movethewheels.fleet.nextSteps.assign", "Assign capacity to orders"),
66
+ description: P("movethewheels.fleet.nextSteps.assignDesc", "Open an order to assign an available vehicle and driver."),
67
+ icon: /* @__PURE__ */ E(f, { size: 16 }),
68
+ onClick: () => Q("orders")
69
+ }
70
+ ]
71
+ }),
72
+ X && !Y ? /* @__PURE__ */ E(r, {
73
+ className: "border-status-error-border",
74
+ children: /* @__PURE__ */ D(i, {
75
+ className: "p-6 text-center space-y-3",
76
+ children: [
77
+ /* @__PURE__ */ E("p", {
78
+ className: "text-status-error-text font-medium",
79
+ children: P("movethewheels.fleet.error.title", "Couldn't load fleet data")
80
+ }),
81
+ /* @__PURE__ */ E("p", {
82
+ className: "text-sm text-text-secondary",
83
+ children: X.message
84
+ }),
85
+ /* @__PURE__ */ E(d, {
86
+ variant: "outline",
87
+ onClick: Z,
88
+ children: P("movethewheels.fleet.error.retry", "Retry")
89
+ })
90
+ ]
91
+ })
92
+ }) : Y ? /* @__PURE__ */ E(S, {
93
+ columns: 4,
94
+ children: Array.from({ length: 4 }).map((e, t) => /* @__PURE__ */ E(x, {}, t))
95
+ }) : /* @__PURE__ */ D(S, {
96
+ columns: 4,
97
+ children: [
98
+ /* @__PURE__ */ E(C, {
99
+ label: P("movethewheels.fleet.metrics.totalVehicles", "Total Vehicles"),
100
+ value: L.totalVehicles,
101
+ icon: /* @__PURE__ */ E(g, { size: 20 }),
102
+ subtitle: `${L.vehiclesByStatus.available} ${P("movethewheels.fleet.metrics.available", "available")}`,
103
+ onClick: () => Q("fleet/vehicles")
104
+ }),
105
+ /* @__PURE__ */ E(C, {
106
+ label: P("movethewheels.fleet.metrics.totalDrivers", "Total Drivers"),
107
+ value: L.totalDrivers,
108
+ icon: /* @__PURE__ */ E(_, { size: 20 }),
109
+ subtitle: `${L.driversByStatus.available} ${P("movethewheels.fleet.metrics.available", "available")}`,
110
+ onClick: () => Q("fleet/drivers")
111
+ }),
112
+ /* @__PURE__ */ E(C, {
113
+ treatment: "glass",
114
+ glow: !0,
115
+ label: P("movethewheels.fleet.metrics.utilization", "Fleet Utilization"),
116
+ value: `${L.utilization.toFixed(0)}%`,
117
+ icon: /* @__PURE__ */ E(g, { size: 20 }),
118
+ changeType: L.utilization >= 70 ? "positive" : "neutral"
119
+ }),
120
+ /* @__PURE__ */ E(C, {
121
+ label: P("movethewheels.fleet.metrics.avgDriverRating", "Avg Driver Rating"),
122
+ value: L.avgDriverRating.toFixed(1),
123
+ icon: /* @__PURE__ */ E(h, { size: 20 }),
124
+ subtitle: P("movethewheels.fleet.metrics.outOfFive", "out of 5"),
125
+ changeType: L.avgDriverRating >= 4.5 ? "positive" : "neutral"
126
+ })
127
+ ]
128
+ }),
129
+ /* @__PURE__ */ D("div", {
130
+ className: "grid grid-cols-1 lg:grid-cols-2 gap-6",
131
+ children: [/* @__PURE__ */ E(t, {
132
+ title: P("movethewheels.fleet.vehicles.title", "Vehicles"),
133
+ actions: /* @__PURE__ */ D(d, {
134
+ variant: "ghost",
135
+ size: "sm",
136
+ onClick: () => Q("fleet/vehicles"),
137
+ children: [
138
+ P("movethewheels.fleet.common.viewAll", "View all"),
139
+ " ",
140
+ /* @__PURE__ */ E(f, { size: 16 })
141
+ ]
142
+ }),
143
+ children: /* @__PURE__ */ E(r, { children: /* @__PURE__ */ E(i, {
144
+ className: "p-0",
145
+ children: /* @__PURE__ */ E("div", {
146
+ className: "divide-y",
147
+ children: V.slice(0, 5).map((t) => /* @__PURE__ */ E("div", {
148
+ role: "button",
149
+ tabIndex: 0,
150
+ "aria-label": `View vehicle ${t.vehicleNumber}`,
151
+ className: "p-4 hover:bg-bg-sunken/50 cursor-pointer transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-action-primary-bg",
152
+ onClick: () => Q(`fleet/vehicles/${t.id}`),
153
+ onKeyDown: (e) => $(e, () => Q(`fleet/vehicles/${t.id}`)),
154
+ children: /* @__PURE__ */ D("div", {
155
+ className: "flex items-center justify-between",
156
+ children: [/* @__PURE__ */ D("div", {
157
+ className: "flex items-center gap-3",
158
+ children: [/* @__PURE__ */ E("div", {
159
+ className: "w-10 h-10 rounded-lg bg-action-primary-bg/10 flex items-center justify-center",
160
+ children: /* @__PURE__ */ E(g, {
161
+ size: 20,
162
+ className: "text-primary"
163
+ })
164
+ }), /* @__PURE__ */ D("div", { children: [/* @__PURE__ */ D("div", {
165
+ className: "flex items-center gap-2",
166
+ children: [/* @__PURE__ */ E("span", {
167
+ className: "font-medium",
168
+ children: t.vehicleNumber
169
+ }), /* @__PURE__ */ E(w, {
170
+ type: t.type,
171
+ size: "sm"
172
+ })]
173
+ }), /* @__PURE__ */ D("p", {
174
+ className: "text-sm text-text-secondary",
175
+ children: [
176
+ t.make,
177
+ " ",
178
+ t.model,
179
+ " (",
180
+ t.year,
181
+ ")"
182
+ ]
183
+ })] })]
184
+ }), /* @__PURE__ */ D("div", {
185
+ className: "text-right",
186
+ children: [/* @__PURE__ */ E(T, {
187
+ status: t.status,
188
+ type: "vehicle",
189
+ size: "sm"
190
+ }), t.fuelLevel !== void 0 && /* @__PURE__ */ D("div", {
191
+ className: "mt-2 flex items-center gap-2",
192
+ children: [
193
+ /* @__PURE__ */ E(p, {
194
+ size: 12,
195
+ className: "text-text-secondary"
196
+ }),
197
+ /* @__PURE__ */ E(e, {
198
+ value: t.fuelLevel,
199
+ className: "w-16 h-2"
200
+ }),
201
+ /* @__PURE__ */ D("span", {
202
+ className: "text-xs text-text-secondary",
203
+ children: [t.fuelLevel, "%"]
204
+ })
205
+ ]
206
+ })]
207
+ })]
208
+ })
209
+ }, t.id))
210
+ })
211
+ }) })
212
+ }), /* @__PURE__ */ E(t, {
213
+ title: P("movethewheels.fleet.drivers.title", "Drivers"),
214
+ actions: /* @__PURE__ */ D(d, {
215
+ variant: "ghost",
216
+ size: "sm",
217
+ onClick: () => Q("fleet/drivers"),
218
+ children: [
219
+ P("movethewheels.fleet.common.viewAll", "View all"),
220
+ " ",
221
+ /* @__PURE__ */ E(f, { size: 16 })
222
+ ]
223
+ }),
224
+ children: /* @__PURE__ */ E(r, { children: /* @__PURE__ */ E(i, {
225
+ className: "p-0",
226
+ children: /* @__PURE__ */ E("div", {
227
+ className: "divide-y",
228
+ children: G.slice(0, 5).map((e) => /* @__PURE__ */ E("div", {
229
+ role: "button",
230
+ tabIndex: 0,
231
+ "aria-label": `View driver ${e.fullName}`,
232
+ className: "p-4 hover:bg-bg-sunken/50 cursor-pointer transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-action-primary-bg",
233
+ onClick: () => Q(`fleet/drivers/${e.id}`),
234
+ onKeyDown: (t) => $(t, () => Q(`fleet/drivers/${e.id}`)),
235
+ children: /* @__PURE__ */ D("div", {
236
+ className: "flex items-center justify-between",
237
+ children: [/* @__PURE__ */ D("div", {
238
+ className: "flex items-center gap-3",
239
+ children: [/* @__PURE__ */ E(c, { children: /* @__PURE__ */ E(u, { children: e.fullName.split(" ").map((e) => e[0]).join("") }) }), /* @__PURE__ */ D("div", { children: [/* @__PURE__ */ E("p", {
240
+ className: "font-medium",
241
+ children: e.fullName
242
+ }), /* @__PURE__ */ D("p", {
243
+ className: "text-sm text-text-secondary",
244
+ children: [
245
+ e.employeeId,
246
+ " - ",
247
+ e.completedOrders,
248
+ " ",
249
+ P("movethewheels.fleet.drivers.deliveries", "deliveries")
250
+ ]
251
+ })] })]
252
+ }), /* @__PURE__ */ D("div", {
253
+ className: "text-right",
254
+ children: [/* @__PURE__ */ E(T, {
255
+ status: e.status,
256
+ type: "driver",
257
+ size: "sm"
258
+ }), /* @__PURE__ */ D("div", {
259
+ className: "mt-1 flex items-center gap-1 justify-end",
260
+ children: [/* @__PURE__ */ E(h, {
261
+ size: 12,
262
+ className: "text-status-warning-text fill-current"
263
+ }), /* @__PURE__ */ E("span", {
264
+ className: "text-sm font-medium",
265
+ children: e.ratings.overall.toFixed(1)
266
+ })]
267
+ })]
268
+ })]
269
+ })
270
+ }, e.id))
271
+ })
272
+ }) })
273
+ })]
274
+ }),
275
+ /* @__PURE__ */ D("div", {
276
+ className: "grid grid-cols-1 md:grid-cols-2 gap-6",
277
+ children: [/* @__PURE__ */ D(k, {
278
+ className: "space-y-4",
279
+ children: [/* @__PURE__ */ E("h2", {
280
+ className: "text-base font-semibold text-text-primary",
281
+ children: P("movethewheels.fleet.status.vehicleTitle", "Vehicle Status")
282
+ }), /* @__PURE__ */ E("div", {
283
+ className: "space-y-4",
284
+ children: Object.entries(L.vehiclesByStatus).map(([t, n]) => /* @__PURE__ */ D("div", {
285
+ className: "flex items-center justify-between",
286
+ children: [/* @__PURE__ */ E("div", {
287
+ className: "flex items-center gap-3",
288
+ children: /* @__PURE__ */ E(T, {
289
+ status: t,
290
+ type: "vehicle"
291
+ })
292
+ }), /* @__PURE__ */ D("div", {
293
+ className: "flex items-center gap-3",
294
+ children: [/* @__PURE__ */ E("span", {
295
+ className: "font-medium",
296
+ children: n
297
+ }), /* @__PURE__ */ E(e, {
298
+ value: n / L.totalVehicles * 100,
299
+ className: "w-24 h-2"
300
+ })]
301
+ })]
302
+ }, t))
303
+ })]
304
+ }), /* @__PURE__ */ D(r, { children: [/* @__PURE__ */ E(o, { children: /* @__PURE__ */ E(a, { children: P("movethewheels.fleet.status.driverTitle", "Driver Status") }) }), /* @__PURE__ */ E(i, { children: /* @__PURE__ */ E("div", {
305
+ className: "space-y-4",
306
+ children: Object.entries(L.driversByStatus).map(([t, n]) => /* @__PURE__ */ D("div", {
307
+ className: "flex items-center justify-between",
308
+ children: [/* @__PURE__ */ E("div", {
309
+ className: "flex items-center gap-3",
310
+ children: /* @__PURE__ */ E(T, {
311
+ status: t,
312
+ type: "driver"
313
+ })
314
+ }), /* @__PURE__ */ D("div", {
315
+ className: "flex items-center gap-3",
316
+ children: [/* @__PURE__ */ E("span", {
317
+ className: "font-medium",
318
+ children: n
319
+ }), /* @__PURE__ */ E(e, {
320
+ value: n / L.totalDrivers * 100,
321
+ className: "w-24 h-2"
322
+ })]
323
+ })]
324
+ }, t))
325
+ }) })] })]
326
+ }),
327
+ L.vehiclesByStatus.maintenance > 0 && /* @__PURE__ */ D(r, {
328
+ className: "border-status-warning-border",
329
+ children: [/* @__PURE__ */ E(o, { children: /* @__PURE__ */ D(a, {
330
+ className: "flex items-center gap-2 text-status-warning-text",
331
+ children: [/* @__PURE__ */ E(m, { size: 18 }), P("movethewheels.fleet.maintenance.title", "Maintenance Required")]
332
+ }) }), /* @__PURE__ */ E(i, { children: /* @__PURE__ */ E("div", {
333
+ className: "space-y-3",
334
+ children: V.filter((e) => e.status === "maintenance").map((e) => /* @__PURE__ */ D("div", {
335
+ className: "flex items-center justify-between p-3 bg-status-warning-bg/10 rounded-lg",
336
+ children: [/* @__PURE__ */ D("div", {
337
+ className: "flex items-center gap-3",
338
+ children: [/* @__PURE__ */ E(g, {
339
+ size: 20,
340
+ className: "text-status-warning-text"
341
+ }), /* @__PURE__ */ D("div", { children: [/* @__PURE__ */ E("p", {
342
+ className: "font-medium",
343
+ children: e.vehicleNumber
344
+ }), /* @__PURE__ */ D("p", {
345
+ className: "text-sm text-text-secondary",
346
+ children: [
347
+ e.make,
348
+ " ",
349
+ e.model
350
+ ]
351
+ })] })]
352
+ }), /* @__PURE__ */ E(d, {
353
+ variant: "outline",
354
+ size: "sm",
355
+ onClick: () => Q(`fleet/vehicles/${e.id}`),
356
+ children: P("movethewheels.fleet.maintenance.viewDetails", "View Details")
357
+ })]
358
+ }, e.id))
359
+ }) })]
360
+ })
361
+ ]
362
+ });
363
+ }
364
+ //#endregion
365
+ export { N as default };
@@ -0,0 +1,15 @@
1
+ import { t as e } from "./circle-alert-iY24lSlp.js";
2
+ import { jsx as t, jsxs as n } from "react/jsx-runtime";
3
+ //#region src/movethewheels/components/FormError.tsx
4
+ function r({ message: r }) {
5
+ return r ? /* @__PURE__ */ n("div", {
6
+ role: "alert",
7
+ className: "flex items-start gap-2 rounded-lg border border-status-error-border bg-status-error-bg-subtle px-4 py-3 text-sm text-status-error-text",
8
+ children: [/* @__PURE__ */ t(e, {
9
+ size: 18,
10
+ className: "mt-0.5 shrink-0"
11
+ }), /* @__PURE__ */ t("span", { children: r })]
12
+ }) : null;
13
+ }
14
+ //#endregion
15
+ export { r as t };
@@ -0,0 +1,290 @@
1
+ import { d as e, f as t, g as n, h as r, i, l as a, lt as o, u as s } from "./PageLayout-D4LDHJJq.js";
2
+ import { t as c } from "./download-DRXxoiQR.js";
3
+ import { t as l } from "./file-text-DWWY6_f5.js";
4
+ import { t as u } from "./useImportExport-DHr-SWSw.js";
5
+ import { useRef as d, useState as f } from "react";
6
+ import { jsx as p, jsxs as m } from "react/jsx-runtime";
7
+ import { EmphasisPanel as h, IllustratedEmptyState as g, PagePurpose as _ } from "@burdenoff/fe-libs/ui";
8
+ //#region node_modules/lucide-react/dist/esm/icons/check.js
9
+ var v = o("Check", [["path", {
10
+ d: "M20 6 9 17l-5-5",
11
+ key: "1gmf2c"
12
+ }]]), y = o("FileSpreadsheet", [
13
+ ["path", {
14
+ d: "M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z",
15
+ key: "1rqfz7"
16
+ }],
17
+ ["path", {
18
+ d: "M14 2v4a2 2 0 0 0 2 2h4",
19
+ key: "tnqrlb"
20
+ }],
21
+ ["path", {
22
+ d: "M8 13h2",
23
+ key: "yr2amv"
24
+ }],
25
+ ["path", {
26
+ d: "M14 13h2",
27
+ key: "un5t4a"
28
+ }],
29
+ ["path", {
30
+ d: "M8 17h2",
31
+ key: "2yhykz"
32
+ }],
33
+ ["path", {
34
+ d: "M14 17h2",
35
+ key: "10kma7"
36
+ }]
37
+ ]), b = o("Upload", [
38
+ ["path", {
39
+ d: "M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4",
40
+ key: "ih7n3h"
41
+ }],
42
+ ["polyline", {
43
+ points: "17 8 12 3 7 8",
44
+ key: "t8dd8p"
45
+ }],
46
+ ["line", {
47
+ x1: "12",
48
+ x2: "12",
49
+ y1: "3",
50
+ y2: "15",
51
+ key: "widbto"
52
+ }]
53
+ ]), x = o("X", [["path", {
54
+ d: "M18 6 6 18",
55
+ key: "1bl5f8"
56
+ }], ["path", {
57
+ d: "m6 6 12 12",
58
+ key: "d8bk6v"
59
+ }]]), S = [
60
+ {
61
+ name: "Orders",
62
+ description: "Import orders from CSV or JSON",
63
+ resource: "orders"
64
+ },
65
+ {
66
+ name: "Customers",
67
+ description: "Import customer database",
68
+ resource: "customers"
69
+ },
70
+ {
71
+ name: "Products",
72
+ description: "Import product catalog",
73
+ resource: "products"
74
+ },
75
+ {
76
+ name: "Inventory",
77
+ description: "Import inventory levels",
78
+ resource: "inventory"
79
+ }
80
+ ], C = [
81
+ {
82
+ name: "Orders Report",
83
+ description: "Export all orders data",
84
+ resource: "orders",
85
+ formats: ["CSV", "JSON"]
86
+ },
87
+ {
88
+ name: "Financial Report",
89
+ description: "Export revenue and payments",
90
+ resource: "finance",
91
+ formats: ["CSV", "JSON"]
92
+ },
93
+ {
94
+ name: "Fleet Report",
95
+ description: "Export vehicle and driver data",
96
+ resource: "fleet",
97
+ formats: ["CSV", "JSON"]
98
+ },
99
+ {
100
+ name: "Analytics Report",
101
+ description: "Export performance metrics",
102
+ resource: "analytics",
103
+ formats: ["CSV", "JSON"]
104
+ }
105
+ ];
106
+ function w() {
107
+ let { exportData: o, importData: w, isBusy: T } = u(), [E, D] = f([]), [O, k] = f(null), A = d(null), j = d(null), M = (e) => D((t) => [e, ...t]), N = async (e, t) => {
108
+ k(`${e.resource}:${t}`);
109
+ try {
110
+ let n = await o(e.resource, t);
111
+ if (n.success && n.payload) {
112
+ let r = JSON.stringify(n.payload, null, 2), i = new Blob([r], { type: "application/json" }), a = URL.createObjectURL(i), o = document.createElement("a");
113
+ o.href = a, o.download = `${e.resource}-export.${t.toLowerCase() === "csv" ? "csv" : "json"}`, document.body.appendChild(o), o.click(), o.remove(), URL.revokeObjectURL(a);
114
+ }
115
+ M({
116
+ type: "export",
117
+ name: `${e.name} (${t})`,
118
+ at: /* @__PURE__ */ new Date(),
119
+ success: n.success,
120
+ message: n.message
121
+ });
122
+ } catch (n) {
123
+ M({
124
+ type: "export",
125
+ name: `${e.name} (${t})`,
126
+ at: /* @__PURE__ */ new Date(),
127
+ success: !1,
128
+ message: n instanceof Error ? n.message : "Export failed"
129
+ });
130
+ } finally {
131
+ k(null);
132
+ }
133
+ }, P = (e) => {
134
+ j.current = e, A.current?.click();
135
+ };
136
+ return /* @__PURE__ */ m(i, {
137
+ title: "Import / Export",
138
+ subtitle: "Import and export your data",
139
+ icon: /* @__PURE__ */ p(l, { size: 24 }),
140
+ children: [
141
+ /* @__PURE__ */ p(_, {
142
+ icon: /* @__PURE__ */ p(l, { size: 18 }),
143
+ children: "Move data in and out in bulk. Import orders, customers, products or inventory from CSV/JSON to onboard or migrate without re-keying, and export any dataset for accounting, BI tools or backups — no manual copy-paste required."
144
+ }),
145
+ /* @__PURE__ */ p("input", {
146
+ ref: A,
147
+ type: "file",
148
+ accept: ".csv,.json,application/json,text/csv",
149
+ className: "hidden",
150
+ onChange: async (e) => {
151
+ let t = e.target.files?.[0], n = j.current;
152
+ if (e.target.value = "", !(!t || !n)) {
153
+ k(`import:${n.resource}`);
154
+ try {
155
+ let e = await t.text(), r = await w(n.resource, {
156
+ filename: t.name,
157
+ content: e
158
+ });
159
+ M({
160
+ type: "import",
161
+ name: `${n.name} — ${t.name}`,
162
+ at: /* @__PURE__ */ new Date(),
163
+ success: r.success,
164
+ message: r.message
165
+ });
166
+ } catch (e) {
167
+ M({
168
+ type: "import",
169
+ name: `${n.name} — ${t.name}`,
170
+ at: /* @__PURE__ */ new Date(),
171
+ success: !1,
172
+ message: e instanceof Error ? e.message : "Import failed"
173
+ });
174
+ } finally {
175
+ k(null);
176
+ }
177
+ }
178
+ }
179
+ }),
180
+ /* @__PURE__ */ m("div", {
181
+ className: "grid grid-cols-1 lg:grid-cols-2 gap-6",
182
+ children: [/* @__PURE__ */ m(h, {
183
+ className: "space-y-4",
184
+ children: [/* @__PURE__ */ m("h2", {
185
+ className: "flex items-center gap-2 text-base font-semibold text-text-primary",
186
+ children: [/* @__PURE__ */ p(b, { size: 18 }), " Import Data"]
187
+ }), /* @__PURE__ */ p("div", {
188
+ className: "space-y-4",
189
+ children: S.map((e) => /* @__PURE__ */ m("div", {
190
+ className: "flex items-center justify-between p-4 border rounded-lg hover:border-primary/50 transition-colors",
191
+ children: [/* @__PURE__ */ m("div", {
192
+ className: "flex items-center gap-3",
193
+ children: [/* @__PURE__ */ p("div", {
194
+ className: "w-10 h-10 rounded-lg bg-action-primary-bg/10 flex items-center justify-center",
195
+ children: /* @__PURE__ */ p(y, {
196
+ size: 20,
197
+ className: "text-primary"
198
+ })
199
+ }), /* @__PURE__ */ m("div", { children: [/* @__PURE__ */ p("p", {
200
+ className: "font-medium",
201
+ children: e.name
202
+ }), /* @__PURE__ */ p("p", {
203
+ className: "text-sm text-text-secondary",
204
+ children: e.description
205
+ })] })]
206
+ }), /* @__PURE__ */ m("div", {
207
+ className: "text-right",
208
+ children: [/* @__PURE__ */ p(a, {
209
+ variant: "outline",
210
+ children: "CSV, JSON"
211
+ }), /* @__PURE__ */ p(s, {
212
+ variant: "outline",
213
+ size: "sm",
214
+ className: "ml-2",
215
+ "aria-label": `Import ${e.name}`,
216
+ disabled: T,
217
+ onClick: () => P(e),
218
+ children: /* @__PURE__ */ p(b, { size: 14 })
219
+ })]
220
+ })]
221
+ }, e.name))
222
+ })]
223
+ }), /* @__PURE__ */ m(e, { children: [/* @__PURE__ */ p(r, { children: /* @__PURE__ */ m(n, {
224
+ className: "flex items-center gap-2",
225
+ children: [/* @__PURE__ */ p(c, { size: 18 }), " Export Data"]
226
+ }) }), /* @__PURE__ */ p(t, {
227
+ className: "space-y-4",
228
+ children: C.map((e) => /* @__PURE__ */ m("div", {
229
+ className: "flex items-center justify-between p-4 border rounded-lg hover:border-primary/50 transition-colors",
230
+ children: [/* @__PURE__ */ m("div", { children: [/* @__PURE__ */ p("p", {
231
+ className: "font-medium",
232
+ children: e.name
233
+ }), /* @__PURE__ */ p("p", {
234
+ className: "text-sm text-text-secondary",
235
+ children: e.description
236
+ })] }), /* @__PURE__ */ p("div", {
237
+ className: "flex gap-1",
238
+ children: e.formats.map((t) => /* @__PURE__ */ p(s, {
239
+ variant: "outline",
240
+ size: "sm",
241
+ disabled: O === `${e.resource}:${t}`,
242
+ onClick: () => void N(e, t),
243
+ children: t
244
+ }, t))
245
+ })]
246
+ }, e.name))
247
+ })] })]
248
+ }),
249
+ /* @__PURE__ */ m(e, { children: [/* @__PURE__ */ p(r, { children: /* @__PURE__ */ p(n, { children: "Recent Activity" }) }), /* @__PURE__ */ p(t, { children: E.length === 0 ? /* @__PURE__ */ p(g, {
250
+ illustration: "empty-data",
251
+ title: "No import or export activity yet",
252
+ description: "Your recent imports and exports will show up here once you run one."
253
+ }) : /* @__PURE__ */ p("div", {
254
+ className: "space-y-3",
255
+ children: E.map((e, t) => /* @__PURE__ */ m("div", {
256
+ className: "flex items-center justify-between p-3 bg-bg-sunken/50 rounded-lg",
257
+ children: [/* @__PURE__ */ m("div", {
258
+ className: "flex items-center gap-3",
259
+ children: [e.type === "import" ? /* @__PURE__ */ p(b, {
260
+ size: 16,
261
+ className: "text-primary"
262
+ }) : /* @__PURE__ */ p(c, {
263
+ size: 16,
264
+ className: "text-primary"
265
+ }), /* @__PURE__ */ m("div", { children: [/* @__PURE__ */ p("p", {
266
+ className: "font-medium",
267
+ children: e.name
268
+ }), /* @__PURE__ */ m("p", {
269
+ className: "text-sm text-text-secondary",
270
+ children: [
271
+ e.type === "import" ? "Imported" : "Exported",
272
+ " at",
273
+ " ",
274
+ e.at.toLocaleTimeString(),
275
+ " — ",
276
+ e.message
277
+ ]
278
+ })] })]
279
+ }), /* @__PURE__ */ m(a, {
280
+ variant: e.success ? "default" : "destructive",
281
+ className: "gap-1",
282
+ children: [e.success ? /* @__PURE__ */ p(v, { size: 12 }) : /* @__PURE__ */ p(x, { size: 12 }), e.success ? "done" : "failed"]
283
+ })]
284
+ }, t))
285
+ }) })] })
286
+ ]
287
+ });
288
+ }
289
+ //#endregion
290
+ export { w as default };