@burdenoff/microfe-movethewheels 2026.626.2 → 2026.703.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 (120) hide show
  1. package/dist/{AIAssistantPage-AvsMbunM.js → AIAssistantPage-C3ovZ0Fh.js} +100 -73
  2. package/dist/AnalyticsPage-O8SpY-V4.js +215 -0
  3. package/dist/{CreateOrderPage-CjlnEtk3.js → CreateOrderPage-CB1_-_mN.js} +33 -35
  4. package/dist/{CustomerDetailsPage-I6cdDHUi.js → CustomerDetailsPage-BaeKEI1D.js} +42 -44
  5. package/dist/{CustomersPage-CGGfD4ki.js → CustomersPage-DRaLuHMC.js} +26 -28
  6. package/dist/{DashboardPage-D2HRqwg9.js → DashboardPage-DPjhNfKB.js} +85 -83
  7. package/dist/{DataTable-CD9ZhpLB.js → DataTable-DmciIKKM.js} +3 -3
  8. package/dist/{DriverDetailsPage-rg_pGNuP.js → DriverDetailsPage-CSSQTOzn.js} +52 -54
  9. package/dist/{DriversPage-DKiynISH.js → DriversPage-C2Bk0w4Q.js} +24 -26
  10. package/dist/{FinancePage-Vg8WPs38.js → FinancePage-lmp0Sdsw.js} +9 -9
  11. package/dist/FleetPage-DZn5pIqd.js +365 -0
  12. package/dist/ImportExportPage-BIUJZc7O.js +290 -0
  13. package/dist/InventoryPage-Cxh1zYJd.js +253 -0
  14. package/dist/{LiveTrackingPage-DQ1q4Id3.js → LiveTrackingPage-BY1yAkIt.js} +60 -56
  15. package/dist/MarketplacePage-RMuL17EA.js +247 -0
  16. package/dist/{MetricCard-B7yMyvMX.js → MetricCard-7aYgzZHK.js} +1 -1
  17. package/dist/{OrderDetailsPage-CFASgsYX.js → OrderDetailsPage-C2Mf4KSy.js} +83 -85
  18. package/dist/{OrdersListPage-BHeT8S5o.js → OrdersListPage-BrPBtnhp.js} +31 -33
  19. package/dist/{PageLayout-D3N8MCTm.js → PageLayout-D4LDHJJq.js} +483 -422
  20. package/dist/{ProductDetailsPage-CFGcbaHo.js → ProductDetailsPage-CezzzZcj.js} +27 -29
  21. package/dist/{ProductsPage--xEpbQ8A.js → ProductsPage-I5DilIoY.js} +21 -23
  22. package/dist/ReportsPage-BDXNmUng.js +284 -0
  23. package/dist/RouteDetailsPage-BcomL20M.js +263 -0
  24. package/dist/RoutesPage-lqX9ylHP.js +144 -0
  25. package/dist/SettingsPage-CQVIOaNs.js +421 -0
  26. package/dist/StatusBadge-NpTeHVlw.js +152 -0
  27. package/dist/{TrackingPage-CcRc_dva.js → TrackingPage-BXrjz7V8.js} +59 -61
  28. package/dist/{VehicleDetailsPage-3YDMPsPs.js → VehicleDetailsPage-DZjLcJgr.js} +40 -42
  29. package/dist/{VehiclesPage-UlxPWP9K.js → VehiclesPage-6W39XT5W.js} +19 -21
  30. package/dist/{WarehouseDetailsPage-Db7KeN-d.js → WarehouseDetailsPage-C10pgRGW.js} +38 -40
  31. package/dist/{WarehousesPage-CuTO-OPp.js → WarehousesPage-CHvBqNaQ.js} +15 -17
  32. package/dist/{arrow-left-CBpZKkpq.js → arrow-left-n48Y-Wis.js} +1 -1
  33. package/dist/{box-CAaiElsb.js → box-D9Pal4HM.js} +1 -1
  34. package/dist/{chart-column-D1Ym15-S.js → chart-column-BFIJysDR.js} +1 -1
  35. package/dist/{chevron-right-BIFGi0UA.js → chevron-right-EMIIyyJ1.js} +1 -1
  36. package/dist/{circle-alert-DjmNo5_L.js → circle-alert-iY24lSlp.js} +1 -1
  37. package/dist/{circle-check-big-CjuPVo3_.js → circle-check-big-w0TrLKMF.js} +1 -1
  38. package/dist/{clock-BjkdnddD.js → clock-DJZtdl8u.js} +1 -1
  39. package/dist/{dollar-sign-IB4O0wuQ.js → dollar-sign-CgKQRz_e.js} +1 -1
  40. package/dist/{download-Dpa9vqoG.js → download-DRXxoiQR.js} +1 -1
  41. package/dist/{file-text-C8Uioy11.js → file-text-DWWY6_f5.js} +1 -1
  42. package/dist/{filter-Da5OZaHI.js → filter-DloLC2eE.js} +1 -1
  43. package/dist/index.js +119 -111
  44. package/dist/{map-_Per4sT9.js → map-CkJaULb2.js} +1 -1
  45. package/dist/{map-pin-BSaf5IDL.js → map-pin-BGiCvyCs.js} +1 -1
  46. package/dist/{navigation-DaTbrhw2.js → navigation-D36prnAn.js} +1 -1
  47. package/dist/{package-BE7U0wQE.js → package-BChUzpJS.js} +1 -1
  48. package/dist/{phone-DV4StZiA.js → phone-Ac9s3mo_.js} +1 -1
  49. package/dist/{plus-Dl1rLeJR.js → plus-Z76q-FZm.js} +1 -1
  50. package/dist/{refresh-cw-CWfERAit.js → refresh-cw-DKt6f5T6.js} +1 -1
  51. package/dist/{save-XH8vydOn.js → save-CojywNhG.js} +1 -1
  52. package/dist/{search-OxoIiL_C.js → search-CDGefqb3.js} +1 -1
  53. package/dist/{square-pen-hLIbFQFV.js → square-pen-CopE9GmB.js} +1 -1
  54. package/dist/{star-YsVV3MNQ.js → star-nHlLjDKR.js} +1 -1
  55. package/dist/{store-RCBl7HB-.js → store-BR9Voi5E.js} +1 -1
  56. package/dist/{trending-up-C-85AwGT.js → trending-up-B7W-GL6P.js} +1 -1
  57. package/dist/{triangle-alert-BOhfGgmh.js → triangle-alert-BonHFFNz.js} +1 -1
  58. package/dist/{truck-CtDjNFbi.js → truck-DrlfSpRC.js} +1 -1
  59. package/dist/{useAnalytics-ph7eTIK6.js → useAnalytics-CgdzUfY_.js} +40 -40
  60. package/dist/useAssistant-D4v3oxD3.js +84 -0
  61. package/dist/{useCustomers-bS3a4ytk.js → useCustomers-QrlozybF.js} +24 -24
  62. package/dist/{useFleet-BdETplNE.js → useFleet-DiAC-IiH.js} +70 -67
  63. package/dist/useImportExport-BLMnAKCC.js +55 -0
  64. package/dist/{useInventory-Dwn18FPz.js → useInventory-DKoks37x.js} +33 -33
  65. package/dist/{useOrders-D_3_hGMp.js → useOrders-D3UZVy8Y.js} +42 -42
  66. package/dist/useReports-Puq4DCH9.js +78 -0
  67. package/dist/{useRoutes-v4aBaS-E.js → useRoutes-Do57LvRb.js} +31 -31
  68. package/dist/useSettings-CkDH_-gM.js +81 -0
  69. package/dist/{useTracking-De2KIUNu.js → useTracking-GJify4HN.js} +22 -22
  70. package/dist/{user-Dz5TJZFs.js → user-CjSoudeu.js} +1 -1
  71. package/dist/{users-g2N0eL-Z.js → users-BAM4gHTn.js} +1 -1
  72. package/dist/{warehouse-D3WWDeTX.js → warehouse-C7MSr47B.js} +1 -1
  73. package/dist/{wrench-CmxY1n4I.js → wrench-CANXWxF-.js} +1 -1
  74. package/package.json +1 -1
  75. package/src/movethewheels/MoveTheWheelsRoutes.tsx +27 -3
  76. package/src/movethewheels/components/StatusBadge.tsx +18 -37
  77. package/src/movethewheels/constants/index.ts +67 -26
  78. package/src/movethewheels/hooks/index.ts +12 -0
  79. package/src/movethewheels/hooks/useAnalytics.ts +20 -6
  80. package/src/movethewheels/hooks/useAssistant.ts +74 -0
  81. package/src/movethewheels/hooks/useFleet.ts +63 -59
  82. package/src/movethewheels/hooks/useImportExport.ts +101 -0
  83. package/src/movethewheels/hooks/useReports.ts +158 -0
  84. package/src/movethewheels/hooks/useSettings.ts +120 -0
  85. package/src/movethewheels/pages/AIAssistantPage.tsx +53 -15
  86. package/src/movethewheels/pages/AnalyticsPage.tsx +67 -64
  87. package/src/movethewheels/pages/CustomerDetailsPage.tsx +1 -1
  88. package/src/movethewheels/pages/CustomersPage.tsx +1 -1
  89. package/src/movethewheels/pages/DashboardPage.tsx +42 -22
  90. package/src/movethewheels/pages/DriverDetailsPage.tsx +1 -1
  91. package/src/movethewheels/pages/DriversPage.tsx +1 -1
  92. package/src/movethewheels/pages/FleetPage.tsx +96 -38
  93. package/src/movethewheels/pages/ImportExportPage.tsx +174 -68
  94. package/src/movethewheels/pages/InventoryPage.tsx +66 -28
  95. package/src/movethewheels/pages/LiveTrackingPage.tsx +12 -3
  96. package/src/movethewheels/pages/MarketplacePage.tsx +87 -45
  97. package/src/movethewheels/pages/OrderDetailsPage.tsx +2 -2
  98. package/src/movethewheels/pages/ReportsPage.tsx +194 -90
  99. package/src/movethewheels/pages/RouteDetailsPage.tsx +5 -11
  100. package/src/movethewheels/pages/RoutesPage.tsx +4 -9
  101. package/src/movethewheels/pages/SettingsPage.tsx +234 -56
  102. package/src/movethewheels/pages/TrackingPage.tsx +6 -6
  103. package/src/movethewheels/providers/MoveTheWheelsProvider.tsx +7 -6
  104. package/src/movethewheels/store/movethewheelsStore.ts +1 -1
  105. package/dist/AnalyticsPage-CCLfHgQZ.js +0 -212
  106. package/dist/FleetPage-DddXt8r8.js +0 -332
  107. package/dist/ImportExportPage-BW6qO3kc.js +0 -248
  108. package/dist/InventoryPage-rMGuaJN-.js +0 -222
  109. package/dist/MarketplacePage-DKrXAv62.js +0 -219
  110. package/dist/ReportsPage-Bb7_90rK.js +0 -235
  111. package/dist/RouteDetailsPage-CVtDVb1N.js +0 -282
  112. package/dist/RoutesPage-s57PtgcQ.js +0 -163
  113. package/dist/SettingsPage-BYNCBOpN.js +0 -298
  114. package/dist/StatusBadge-CijYQXtb.js +0 -209
  115. package/dist/graphqlClient-CdJyR_ed.js +0 -55
  116. package/dist/navigation-BgnOfsVd.js +0 -6
  117. package/dist/route-Dp9JiN_E.js +0 -51
  118. package/dist/settings-3Rw5NwFF.js +0 -28
  119. package/src/movethewheels/constants/mockData.ts +0 -1342
  120. /package/dist/{formatters-_vJlC-47.js → formatters-DhKZ-eA1.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-DrlfSpRC.js";
6
+ import { t as _ } from "./users-BAM4gHTn.js";
7
+ import { i as v, n as y, o as b } from "./useFleet-DiAC-IiH.js";
8
+ import { n as x, r as S, t as C } from "./MetricCard-7aYgzZHK.js";
9
+ import { a as w, r as T } from "./StatusBadge-NpTeHVlw.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,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-BLMnAKCC.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 };