@burdenoff/microfe-movethewheels 2026.703.3 → 2026.703.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (173) hide show
  1. package/dist/{AIAssistantPage-C3cPsWt-.js → AIAssistantPage-D2gaEL1U.js} +16 -15
  2. package/dist/AnalyticsPage-DZMlEoBi.js +194 -0
  3. package/dist/CreateOrderPage-CWHx8yys.js +490 -0
  4. package/dist/CustomerDetailsPage-nR4oZ_ju.js +615 -0
  5. package/dist/CustomersPage-Bbvwvn8k.js +205 -0
  6. package/dist/DashboardPage-DrEhNf7N.js +542 -0
  7. package/dist/DataTable-CqMUD4er.js +340 -0
  8. package/dist/DocumentsCard-edDkgnJj.js +169 -0
  9. package/dist/DriverDetailsPage-whEMOWs9.js +490 -0
  10. package/dist/DriversPage-CHF2ZEzd.js +221 -0
  11. package/dist/FinancePage-Dn9GrW-1.js +175 -0
  12. package/dist/{FleetPage-DqkFi3s3.js → FleetPage-CrtGPy-p.js} +36 -35
  13. package/dist/{FormError-BlOjnXOq.js → FormError-BKcb_wT-.js} +1 -1
  14. package/dist/{ImportExportPage-DKJRCezl.js → ImportExportPage-WYdwZomZ.js} +52 -72
  15. package/dist/InventoryPage-l5A1f753.js +259 -0
  16. package/dist/LiveTrackingPage-DhEaNKZ4.js +429 -0
  17. package/dist/MarketplacePage-B9RYOb1Y.js +426 -0
  18. package/dist/MetricCard-y3bWHKUQ.js +191 -0
  19. package/dist/Notice-DOO-tjpV.js +46 -0
  20. package/dist/OrderDetailsPage-CwYHwk1K.js +584 -0
  21. package/dist/OrdersListPage-DhZJoQeI.js +386 -0
  22. package/dist/{PageLayout-D4LDHJJq.js → PageLayout-BniRJaQ6.js} +1 -1
  23. package/dist/{ProductDetailsPage-C9uOiYLp.js → ProductDetailsPage-1Gm9JKy0.js} +56 -56
  24. package/dist/ProductsPage-C8sn-1tN.js +186 -0
  25. package/dist/ReportsPage-D1tb0dcz.js +377 -0
  26. package/dist/RouteDetailsPage-CkMyR9b_.js +610 -0
  27. package/dist/{RoutesPage-DMfoicM1.js → RoutesPage-QkENzsE5.js} +58 -47
  28. package/dist/{SettingsPage-Bn-v0mbQ.js → SettingsPage-DV3_tU_X.js} +16 -38
  29. package/dist/Sparkline-K2RMJ58u.js +16729 -0
  30. package/dist/{StatusBadge-BZurYHMy.js → StatusBadge-BNHXYvZx.js} +7 -7
  31. package/dist/TrackingPage-BZrg4RCu.js +368 -0
  32. package/dist/VehicleDetailsPage-D-8XPZ2G.js +393 -0
  33. package/dist/VehiclesPage-D5BELbtM.js +184 -0
  34. package/dist/{WarehouseDetailsPage-L_6sWigM.js → WarehouseDetailsPage-Cmg-8Frn.js} +70 -70
  35. package/dist/WarehousesPage-C1Y1M867.js +182 -0
  36. package/dist/{arrow-left-n48Y-Wis.js → arrow-left-ClW4Isj7.js} +1 -1
  37. package/dist/arrow-right-CmKOmIkh.js +11 -0
  38. package/dist/arrow-up-BJijRLAZ.js +17 -0
  39. package/dist/{box-D9Pal4HM.js → box-BT3NsRQP.js} +1 -1
  40. package/dist/boxes-B_OGvQiW.js +54 -0
  41. package/dist/{chart-column-BFIJysDR.js → chart-column-DQTTdUPk.js} +1 -1
  42. package/dist/charts-Tj_PPTfA.js +2018 -0
  43. package/dist/chevron-left-B1rZyWWb.js +8 -0
  44. package/dist/{chevron-right-EMIIyyJ1.js → chevron-right-BIcwUJZq.js} +1 -1
  45. package/dist/chunk-BdsCSvBP.js +20 -0
  46. package/dist/{circle-alert-iY24lSlp.js → circle-alert-CNkuDNc6.js} +1 -1
  47. package/dist/circle-check-Cs1OVjtV.js +13 -0
  48. package/dist/{circle-check-big-w0TrLKMF.js → circle-check-big-C-p4eNwn.js} +1 -1
  49. package/dist/{clock-DJZtdl8u.js → clock-dRGG4rkF.js} +1 -1
  50. package/dist/{dollar-sign-CgKQRz_e.js → dollar-sign-B6RoYHHz.js} +1 -1
  51. package/dist/{download-DRXxoiQR.js → download-DP04iWTd.js} +1 -1
  52. package/dist/{file-text-DWWY6_f5.js → file-text-BuDx4hZp.js} +1 -1
  53. package/dist/{filter-DloLC2eE.js → filter-BD483_8g.js} +1 -1
  54. package/dist/{wrench-CANXWxF-.js → fuel-DLH1ag04.js} +3 -6
  55. package/dist/index.css +2 -0
  56. package/dist/index.js +150 -172
  57. package/dist/{map-CkJaULb2.js → map-DNQn9fyY.js} +1 -1
  58. package/dist/{map-pin-BGiCvyCs.js → map-pin-CqN1bbT1.js} +1 -1
  59. package/dist/mapMarkers-NCV9MRKR.js +28 -0
  60. package/dist/maps-yzLqiK_C.js +5070 -0
  61. package/dist/{navigation-D36prnAn.js → navigation-CgGUt2tR.js} +1 -1
  62. package/dist/{package-BChUzpJS.js → package-DmRF7iQD.js} +1 -1
  63. package/dist/{phone-Ac9s3mo_.js → phone-Cl32EXKW.js} +1 -1
  64. package/dist/{plus-Z76q-FZm.js → plus-DlANgOFx.js} +1 -1
  65. package/dist/{refresh-cw-DKt6f5T6.js → refresh-cw-rW59D4b7.js} +1 -1
  66. package/dist/route-CWjPrtAN.js +22 -0
  67. package/dist/{save-CojywNhG.js → save-UDlog7hg.js} +1 -1
  68. package/dist/{search-CDGefqb3.js → search-DNIG5Ck7.js} +1 -1
  69. package/dist/{square-pen-CopE9GmB.js → square-pen-BcfB3Grd.js} +1 -1
  70. package/dist/{star-nHlLjDKR.js → star-CVZHFwDx.js} +1 -1
  71. package/dist/{store-BR9Voi5E.js → store-bwnmCK9f.js} +1 -1
  72. package/dist/{trash-2-BKhar6Hs.js → trash-2-B80G12d4.js} +1 -1
  73. package/dist/{trending-up-Dohgd4t_.js → trending-up-CH4R4KOa.js} +1 -1
  74. package/dist/{triangle-alert-i-XQL9Rd.js → triangle-alert-CmS8AUU6.js} +1 -1
  75. package/dist/{truck-C0v_hbLR.js → truck-9rLDncav.js} +1 -1
  76. package/dist/upload-DanJY1Vo.js +21 -0
  77. package/dist/{useAssistant-D4v3oxD3.js → useAssistant-CnEwkTLm.js} +11 -28
  78. package/dist/{useCustomers-BmTNGxiI.js → useCustomers-ChJao1ET.js} +30 -27
  79. package/dist/{useFleet-DKqXZ16m.js → useFleet-g5Yri0G8.js} +82 -70
  80. package/dist/{useImportExport-DHr-SWSw.js → useImportExport-MYwIT3rE.js} +1 -1
  81. package/dist/{useInventory-DkyiVY_A.js → useInventory-BSOn-R1c.js} +84 -39
  82. package/dist/{useOrders-Cfk1GLiq.js → useOrders-BSiqo61w.js} +59 -48
  83. package/dist/{useReports-CTqZr-AB.js → useReports-fWESfsF9.js} +41 -35
  84. package/dist/{useRoutes-BQWO607N.js → useRoutes-zD8Yp323.js} +50 -42
  85. package/dist/{useSettings-CkDH_-gM.js → useSettings-B1lsWeZ1.js} +6 -6
  86. package/dist/{useTracking-B-va1kO3.js → useTracking-BKG0I2ln.js} +3 -3
  87. package/dist/{user-jyFU3lXk.js → user-DU51el3m.js} +1 -1
  88. package/dist/user-check-IMhk-qkX.js +20 -0
  89. package/dist/{users-DZ-ilS6B.js → users-B8KhJBGg.js} +1 -1
  90. package/dist/{warehouse-6m5kXMLu.js → warehouse-CcMMioeY.js} +1 -1
  91. package/dist/wrench-Dg-sgH2e.js +8 -0
  92. package/dist/x-C4ObLVEa.js +11 -0
  93. package/package.json +5 -1
  94. package/src/movethewheels/components/DataTable.tsx +252 -84
  95. package/src/movethewheels/components/DocumentsCard.tsx +102 -0
  96. package/src/movethewheels/components/GlassPanel.tsx +71 -0
  97. package/src/movethewheels/components/MetricCard.tsx +171 -73
  98. package/src/movethewheels/components/Notice.tsx +61 -0
  99. package/src/movethewheels/components/StatusBadge.tsx +7 -6
  100. package/src/movethewheels/components/charts/ChartShell.tsx +78 -0
  101. package/src/movethewheels/components/charts/Sparkline.tsx +85 -0
  102. package/src/movethewheels/components/charts/StatusDonut.tsx +115 -0
  103. package/src/movethewheels/components/charts/TrendChart.tsx +179 -0
  104. package/src/movethewheels/components/charts/VolumeBar.tsx +97 -0
  105. package/src/movethewheels/components/charts/chartTokens.ts +43 -0
  106. package/src/movethewheels/components/charts/index.ts +9 -0
  107. package/src/movethewheels/components/index.ts +51 -1
  108. package/src/movethewheels/components/maps/LogisticsMap.tsx +94 -0
  109. package/src/movethewheels/components/maps/MapCanvas.tsx +118 -0
  110. package/src/movethewheels/components/maps/RouteMap.tsx +71 -0
  111. package/src/movethewheels/components/maps/TrackingMap.tsx +102 -0
  112. package/src/movethewheels/components/maps/index.ts +16 -0
  113. package/src/movethewheels/components/maps/leaflet-setup.ts +124 -0
  114. package/src/movethewheels/components/maps/map-markers.css +121 -0
  115. package/src/movethewheels/hooks/index.ts +9 -0
  116. package/src/movethewheels/hooks/useAnalytics.ts +109 -4
  117. package/src/movethewheels/hooks/useCustomers.ts +11 -4
  118. package/src/movethewheels/hooks/useEntityDocuments.ts +132 -0
  119. package/src/movethewheels/hooks/useFleet.ts +26 -7
  120. package/src/movethewheels/hooks/useInventory.ts +70 -7
  121. package/src/movethewheels/hooks/useOrders.ts +32 -2
  122. package/src/movethewheels/hooks/useReports.ts +14 -4
  123. package/src/movethewheels/hooks/useRoutes.ts +20 -3
  124. package/src/movethewheels/pages/AnalyticsPage.tsx +93 -73
  125. package/src/movethewheels/pages/CreateOrderPage.tsx +48 -20
  126. package/src/movethewheels/pages/CustomerDetailsPage.tsx +239 -33
  127. package/src/movethewheels/pages/CustomersPage.tsx +53 -28
  128. package/src/movethewheels/pages/DashboardPage.tsx +238 -12
  129. package/src/movethewheels/pages/DriverDetailsPage.tsx +17 -31
  130. package/src/movethewheels/pages/DriversPage.tsx +59 -31
  131. package/src/movethewheels/pages/FinancePage.tsx +103 -82
  132. package/src/movethewheels/pages/InventoryPage.tsx +15 -3
  133. package/src/movethewheels/pages/LiveTrackingPage.tsx +124 -16
  134. package/src/movethewheels/pages/MarketplacePage.tsx +265 -50
  135. package/src/movethewheels/pages/OrderDetailsPage.tsx +214 -10
  136. package/src/movethewheels/pages/OrdersListPage.tsx +118 -47
  137. package/src/movethewheels/pages/ProductsPage.tsx +52 -28
  138. package/src/movethewheels/pages/ReportsPage.tsx +88 -4
  139. package/src/movethewheels/pages/RouteDetailsPage.tsx +119 -19
  140. package/src/movethewheels/pages/RoutesPage.tsx +22 -6
  141. package/src/movethewheels/pages/SettingsPage.tsx +5 -21
  142. package/src/movethewheels/pages/TrackingPage.tsx +76 -6
  143. package/src/movethewheels/pages/VehicleDetailsPage.tsx +4 -34
  144. package/src/movethewheels/pages/VehiclesPage.tsx +58 -27
  145. package/src/movethewheels/pages/WarehouseDetailsPage.tsx +1 -1
  146. package/src/movethewheels/pages/WarehousesPage.tsx +47 -36
  147. package/src/movethewheels/types/index.ts +9 -1
  148. package/src/movethewheels/utils/download.ts +62 -0
  149. package/src/movethewheels/utils/mapMarkers.ts +58 -0
  150. package/dist/AnalyticsPage-Dz6g2MvK.js +0 -215
  151. package/dist/CreateOrderPage-C5iwnjp4.js +0 -479
  152. package/dist/CustomerDetailsPage-B6nwFyLO.js +0 -406
  153. package/dist/CustomersPage-BKxMS1AV.js +0 -161
  154. package/dist/DashboardPage-BVjQi0EB.js +0 -387
  155. package/dist/DataTable-DmciIKKM.js +0 -249
  156. package/dist/DriverDetailsPage-CN3WQ0B9.js +0 -507
  157. package/dist/DriversPage-CH9rjQC-.js +0 -165
  158. package/dist/FinancePage-DEDykSOP.js +0 -158
  159. package/dist/InventoryPage-e0ze63iX.js +0 -253
  160. package/dist/LiveTrackingPage-DCX-K-LR.js +0 -379
  161. package/dist/MarketplacePage-CIQ97_zp.js +0 -247
  162. package/dist/MetricCard-BY0QrMD4.js +0 -146
  163. package/dist/OrderDetailsPage-DYiZ-9UK.js +0 -429
  164. package/dist/OrdersListPage-Cn90P1Xx.js +0 -307
  165. package/dist/ProductsPage-QJfHHpqB.js +0 -169
  166. package/dist/ReportsPage-Zp53q3_8.js +0 -284
  167. package/dist/RouteDetailsPage-DUStXSf9.js +0 -531
  168. package/dist/TrackingPage-W-jtdM3Y.js +0 -325
  169. package/dist/VehicleDetailsPage-Bceo5oz3.js +0 -410
  170. package/dist/VehiclesPage-ApKThYeG.js +0 -165
  171. package/dist/WarehousesPage-DCbXXXWE.js +0 -162
  172. package/dist/useAnalytics-DS8n0xgg.js +0 -297
  173. /package/dist/{formatters-CF2S2l1m.js → formatters-FWJDwTFv.js} +0 -0
@@ -0,0 +1,221 @@
1
+ import { i as e, lt as t, o as n, s as r, st as i, ut as a } from "./PageLayout-BniRJaQ6.js";
2
+ import { t as o } from "./DataTable-CqMUD4er.js";
3
+ import { t as s } from "./download-DP04iWTd.js";
4
+ import { t as c } from "./plus-DlANgOFx.js";
5
+ import { t as l } from "./refresh-cw-rW59D4b7.js";
6
+ import { t as u } from "./star-CVZHFwDx.js";
7
+ import { t as d } from "./user-check-IMhk-qkX.js";
8
+ import { t as f } from "./users-B8KhJBGg.js";
9
+ import { i as p, n as m } from "./useFleet-g5Yri0G8.js";
10
+ import { r as h, t as g } from "./MetricCard-y3bWHKUQ.js";
11
+ import { r as _ } from "./StatusBadge-BNHXYvZx.js";
12
+ import { r as v } from "./formatters-FWJDwTFv.js";
13
+ import { useState as y } from "react";
14
+ import { jsx as b, jsxs as x } from "react/jsx-runtime";
15
+ import { CTAOverflowMenu as S, PagePurpose as C } from "@burdenoff/fe-libs/ui";
16
+ //#region node_modules/lucide-react/dist/esm/icons/coffee.js
17
+ var w = a("Coffee", [
18
+ ["path", {
19
+ d: "M10 2v2",
20
+ key: "7u0qdc"
21
+ }],
22
+ ["path", {
23
+ d: "M14 2v2",
24
+ key: "6buw04"
25
+ }],
26
+ ["path", {
27
+ d: "M16 8a1 1 0 0 1 1 1v8a4 4 0 0 1-4 4H7a4 4 0 0 1-4-4V9a1 1 0 0 1 1-1h14a4 4 0 1 1 0 8h-1",
28
+ key: "pwadti"
29
+ }],
30
+ ["path", {
31
+ d: "M6 2v2",
32
+ key: "colzsn"
33
+ }]
34
+ ]), T = a("UserMinus", [
35
+ ["path", {
36
+ d: "M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2",
37
+ key: "1yyitq"
38
+ }],
39
+ ["circle", {
40
+ cx: "9",
41
+ cy: "7",
42
+ r: "4",
43
+ key: "nufk8"
44
+ }],
45
+ ["line", {
46
+ x1: "22",
47
+ x2: "16",
48
+ y1: "11",
49
+ y2: "11",
50
+ key: "1shjgl"
51
+ }]
52
+ ]);
53
+ //#endregion
54
+ //#region src/movethewheels/pages/DriversPage.tsx
55
+ function E() {
56
+ let { basePath: a, navigate: E } = i(), [D, O] = y(0), [k, A] = y(25), { drivers: j, isLoading: M, refetch: N } = m({
57
+ limit: k,
58
+ offset: D * k
59
+ }), { stats: P } = p(), F = P.totalDrivers, I = (e) => E?.(t(a, e));
60
+ return /* @__PURE__ */ x(e, {
61
+ title: "Drivers",
62
+ subtitle: `${F} drivers`,
63
+ icon: /* @__PURE__ */ b(f, { size: 24 }),
64
+ headerActions: /* @__PURE__ */ b(S, {
65
+ primary: {
66
+ label: "Add Driver",
67
+ icon: /* @__PURE__ */ b(c, { size: 16 }),
68
+ onSelect: () => I("fleet/drivers/new")
69
+ },
70
+ actions: [{
71
+ label: "Refresh",
72
+ icon: /* @__PURE__ */ b(l, { size: 16 }),
73
+ onSelect: () => N()
74
+ }, {
75
+ label: "Export",
76
+ icon: /* @__PURE__ */ b(s, { size: 16 }),
77
+ onSelect: () => I("import-export")
78
+ }]
79
+ }),
80
+ children: [
81
+ /* @__PURE__ */ b(C, {
82
+ icon: /* @__PURE__ */ b(f, { size: 18 }),
83
+ children: "Your delivery workforce. Track each driver's availability, performance rating, completed deliveries and license status here — open a driver to review their history before assigning them to an order or route."
84
+ }),
85
+ /* @__PURE__ */ x("div", { children: [/* @__PURE__ */ b("p", {
86
+ className: "mb-3 text-sm font-medium text-text-secondary",
87
+ children: "Workforce at a glance"
88
+ }), /* @__PURE__ */ x(h, {
89
+ columns: 4,
90
+ children: [
91
+ /* @__PURE__ */ b(g, {
92
+ label: "On duty",
93
+ value: P.driversByStatus.available + P.driversByStatus.busy,
94
+ icon: /* @__PURE__ */ b(d, { size: 20 }),
95
+ accent: "success",
96
+ subtitle: "Available or delivering"
97
+ }),
98
+ /* @__PURE__ */ b(g, {
99
+ label: "On break",
100
+ value: P.driversByStatus.on_break,
101
+ icon: /* @__PURE__ */ b(w, { size: 20 }),
102
+ accent: "warning"
103
+ }),
104
+ /* @__PURE__ */ b(g, {
105
+ label: "Off duty",
106
+ value: P.driversByStatus.offline,
107
+ icon: /* @__PURE__ */ b(T, { size: 20 }),
108
+ accent: "neutral"
109
+ }),
110
+ /* @__PURE__ */ b(g, {
111
+ label: "Avg rating",
112
+ value: P.avgDriverRating > 0 ? P.avgDriverRating.toFixed(1) : "—",
113
+ icon: /* @__PURE__ */ b(u, { size: 20 }),
114
+ accent: "brand",
115
+ subtitle: `${F} drivers`
116
+ })
117
+ ]
118
+ })] }),
119
+ /* @__PURE__ */ b(o, {
120
+ columns: [
121
+ {
122
+ id: "driver",
123
+ header: "Driver",
124
+ cell: (e) => /* @__PURE__ */ x("div", {
125
+ className: "flex items-center gap-3",
126
+ children: [/* @__PURE__ */ b(n, { children: /* @__PURE__ */ b(r, { children: e.fullName.split(" ").map((e) => e[0]).join("") }) }), /* @__PURE__ */ x("div", { children: [/* @__PURE__ */ b("p", {
127
+ className: "font-medium",
128
+ children: e.fullName
129
+ }), /* @__PURE__ */ b("p", {
130
+ className: "text-sm text-text-secondary",
131
+ children: e.employeeId
132
+ })] })]
133
+ })
134
+ },
135
+ {
136
+ id: "status",
137
+ header: "Status",
138
+ accessorKey: "status",
139
+ sortable: !0,
140
+ cell: (e) => /* @__PURE__ */ b(_, {
141
+ status: e.status,
142
+ type: "driver"
143
+ })
144
+ },
145
+ {
146
+ id: "rating",
147
+ header: "Rating",
148
+ cell: (e) => /* @__PURE__ */ x("div", {
149
+ className: "flex items-center gap-1",
150
+ children: [
151
+ /* @__PURE__ */ b(u, {
152
+ size: 14,
153
+ className: "text-status-warning-text fill-current"
154
+ }),
155
+ /* @__PURE__ */ b("span", {
156
+ className: "font-medium",
157
+ children: e.ratings.overall.toFixed(1)
158
+ }),
159
+ /* @__PURE__ */ x("span", {
160
+ className: "text-text-secondary text-sm",
161
+ children: [
162
+ "(",
163
+ e.ratings.totalRatings,
164
+ ")"
165
+ ]
166
+ })
167
+ ]
168
+ })
169
+ },
170
+ {
171
+ id: "deliveries",
172
+ header: "Deliveries",
173
+ accessorKey: "completedOrders",
174
+ sortable: !0,
175
+ cell: (e) => /* @__PURE__ */ b("span", {
176
+ className: "font-medium",
177
+ children: e.completedOrders.toLocaleString()
178
+ })
179
+ },
180
+ {
181
+ id: "license",
182
+ header: "License",
183
+ cell: (e) => /* @__PURE__ */ x("div", {
184
+ className: "text-sm",
185
+ children: [/* @__PURE__ */ b("p", { children: e.licenseType }), /* @__PURE__ */ x("p", {
186
+ className: "text-text-secondary",
187
+ children: ["Exp: ", v(e.licenseExpiry, "short")]
188
+ })]
189
+ })
190
+ },
191
+ {
192
+ id: "joined",
193
+ header: "Join Date",
194
+ accessorKey: "joinDate",
195
+ sortable: !0,
196
+ cell: (e) => v(e.joinDate, "short")
197
+ }
198
+ ],
199
+ data: j,
200
+ isLoading: M,
201
+ searchable: !0,
202
+ searchPlaceholder: "Search drivers...",
203
+ searchFields: ["fullName", "employeeId"],
204
+ onRowClick: (e) => I(`fleet/drivers/${e.id}`),
205
+ getRowId: (e) => e.id,
206
+ pageIndex: D,
207
+ pageSize: k,
208
+ onPageChange: O,
209
+ onPageSizeChange: (e) => {
210
+ A(e), O(0);
211
+ },
212
+ totalItems: F,
213
+ emptyIllustration: "empty-people",
214
+ emptyTitle: "No drivers yet",
215
+ emptyDescription: "Add drivers to start assigning deliveries and routes."
216
+ })
217
+ ]
218
+ });
219
+ }
220
+ //#endregion
221
+ export { E as default };
@@ -0,0 +1,175 @@
1
+ import { d as e, f as t, g as n, h as r, i, st as a, u as o, ut as s } from "./PageLayout-BniRJaQ6.js";
2
+ import { t as c } from "./arrow-right-CmKOmIkh.js";
3
+ import { t as l } from "./dollar-sign-B6RoYHHz.js";
4
+ import { t as u } from "./file-text-BuDx4hZp.js";
5
+ import { t as d } from "./fuel-DLH1ag04.js";
6
+ import { t as f } from "./trending-up-CH4R4KOa.js";
7
+ import { c as p, n as m, o as h, r as g } from "./charts-Tj_PPTfA.js";
8
+ import { n as _ } from "./Sparkline-K2RMJ58u.js";
9
+ import { r as v, t as y } from "./MetricCard-y3bWHKUQ.js";
10
+ import { n as b } from "./formatters-FWJDwTFv.js";
11
+ import { useMemo as x } from "react";
12
+ import { jsx as S, jsxs as C } from "react/jsx-runtime";
13
+ import { EmphasisPanel as w, PagePurpose as T } from "@burdenoff/fe-libs/ui";
14
+ //#region node_modules/lucide-react/dist/esm/icons/credit-card.js
15
+ var E = s("CreditCard", [["rect", {
16
+ width: "20",
17
+ height: "14",
18
+ x: "2",
19
+ y: "5",
20
+ rx: "2",
21
+ key: "ynyp8z"
22
+ }], ["line", {
23
+ x1: "2",
24
+ x2: "22",
25
+ y1: "10",
26
+ y2: "10",
27
+ key: "1b3vmo"
28
+ }]]);
29
+ //#endregion
30
+ //#region src/movethewheels/pages/FinancePage.tsx
31
+ function D() {
32
+ let { analytics: s } = h(), { metrics: D } = p(), { navigate: O } = a(), k = () => O("/billing"), A = x(() => s.trends.revenue.map((e) => ({
33
+ month: e.month,
34
+ revenue: e.revenue
35
+ })), [s.trends.revenue]), j = x(() => [
36
+ {
37
+ label: "Total revenue",
38
+ amount: D.totalRevenue
39
+ },
40
+ {
41
+ label: "Collected",
42
+ amount: D.deliveredRevenue
43
+ },
44
+ {
45
+ label: "Fuel cost",
46
+ amount: D.fuelCost
47
+ }
48
+ ], [
49
+ D.totalRevenue,
50
+ D.deliveredRevenue,
51
+ D.fuelCost
52
+ ]), M = j.some((e) => e.amount > 0);
53
+ return /* @__PURE__ */ C(i, {
54
+ title: "Finance",
55
+ subtitle: "Financial overview and reports",
56
+ icon: /* @__PURE__ */ S(l, { size: 24 }),
57
+ headerActions: /* @__PURE__ */ C(o, {
58
+ variant: "outline",
59
+ onClick: k,
60
+ children: [/* @__PURE__ */ S(u, { size: 16 }), " Invoices & Billing"]
61
+ }),
62
+ children: [
63
+ /* @__PURE__ */ S(T, {
64
+ icon: /* @__PURE__ */ S(l, { size: 18 }),
65
+ children: "Follow the money behind your deliveries. See total revenue, how much has already been collected on delivered orders, fuel cost and how many invoices are still open — then head to Billing to raise and settle invoices."
66
+ }),
67
+ /* @__PURE__ */ C(v, {
68
+ columns: 4,
69
+ children: [
70
+ /* @__PURE__ */ S(y, {
71
+ treatment: "glass",
72
+ glow: !0,
73
+ label: "Total Revenue",
74
+ value: b(D.totalRevenue),
75
+ icon: /* @__PURE__ */ S(l, { size: 20 }),
76
+ accent: "success"
77
+ }),
78
+ /* @__PURE__ */ S(y, {
79
+ label: "Collected (Delivered)",
80
+ value: b(D.deliveredRevenue),
81
+ icon: /* @__PURE__ */ S(f, { size: 20 }),
82
+ accent: "brand"
83
+ }),
84
+ /* @__PURE__ */ S(y, {
85
+ label: "Fuel Cost",
86
+ value: b(D.fuelCost),
87
+ icon: /* @__PURE__ */ S(d, { size: 20 }),
88
+ accent: "warning"
89
+ }),
90
+ /* @__PURE__ */ S(y, {
91
+ label: "Open Invoices",
92
+ value: String(D.openInvoices),
93
+ icon: /* @__PURE__ */ S(E, { size: 20 }),
94
+ accent: "blue"
95
+ })
96
+ ]
97
+ }),
98
+ /* @__PURE__ */ C("div", {
99
+ className: "grid grid-cols-1 lg:grid-cols-3 gap-6",
100
+ children: [/* @__PURE__ */ C(e, {
101
+ className: "lg:col-span-2",
102
+ children: [/* @__PURE__ */ S(r, { children: /* @__PURE__ */ S(n, { children: "Revenue trend" }) }), /* @__PURE__ */ S(t, { children: /* @__PURE__ */ S(g, {
103
+ xKey: "month",
104
+ variant: "area",
105
+ height: 280,
106
+ showLegend: !1,
107
+ data: A,
108
+ series: [{
109
+ dataKey: "revenue",
110
+ name: "Revenue",
111
+ color: _.brandBlue
112
+ }],
113
+ valueFormatter: (e) => b(Number(e)),
114
+ emptyMessage: "No revenue recorded yet. Revenue appears here as orders are delivered."
115
+ }) })]
116
+ }), /* @__PURE__ */ C(w, {
117
+ className: "space-y-4",
118
+ children: [
119
+ /* @__PURE__ */ S("h2", {
120
+ className: "text-base font-semibold text-text-primary",
121
+ children: "Invoices & Settlement"
122
+ }),
123
+ /* @__PURE__ */ S("p", {
124
+ className: "text-sm text-text-secondary",
125
+ children: "Invoicing, payments and settlement run through the platform Billing module — the single source of truth for what's been billed and paid. MoveTheWheels doesn't keep its own invoice ledger."
126
+ }),
127
+ /* @__PURE__ */ C("div", {
128
+ className: "flex items-center justify-between p-4 bg-status-warning-bg/10 rounded-lg",
129
+ children: [/* @__PURE__ */ C("div", {
130
+ className: "flex items-center gap-3",
131
+ children: [/* @__PURE__ */ S("div", {
132
+ className: "w-10 h-10 rounded-full bg-status-warning-bg/20 flex items-center justify-center",
133
+ children: /* @__PURE__ */ S(E, {
134
+ size: 20,
135
+ className: "text-status-warning-text"
136
+ })
137
+ }), /* @__PURE__ */ C("div", { children: [/* @__PURE__ */ S("p", {
138
+ className: "font-medium",
139
+ children: "Open invoices"
140
+ }), /* @__PURE__ */ C("p", {
141
+ className: "text-sm text-text-secondary",
142
+ children: [D.openInvoices, " awaiting settlement"]
143
+ })] })]
144
+ }), /* @__PURE__ */ S("span", {
145
+ className: "text-xl font-bold text-status-warning-text",
146
+ children: D.openInvoices
147
+ })]
148
+ }),
149
+ /* @__PURE__ */ C(o, {
150
+ className: "w-full",
151
+ onClick: k,
152
+ children: ["Open Billing ", /* @__PURE__ */ S(c, { size: 16 })]
153
+ })
154
+ ]
155
+ })]
156
+ }),
157
+ /* @__PURE__ */ C(e, { children: [/* @__PURE__ */ S(r, { children: /* @__PURE__ */ S(n, { children: "Revenue vs cost" }) }), /* @__PURE__ */ S(t, { children: M ? /* @__PURE__ */ S(m, {
158
+ xKey: "label",
159
+ height: 260,
160
+ showLegend: !1,
161
+ data: j,
162
+ series: [{
163
+ dataKey: "amount",
164
+ name: "Amount"
165
+ }],
166
+ valueFormatter: (e) => b(Number(e))
167
+ }) : /* @__PURE__ */ S("p", {
168
+ className: "py-8 text-center text-sm text-text-secondary",
169
+ children: "Revenue and cost figures appear here as orders are delivered."
170
+ }) })] })
171
+ ]
172
+ });
173
+ }
174
+ //#endregion
175
+ export { D as default };
@@ -1,12 +1,13 @@
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";
1
+ import { M as e, a as t, d as n, f as r, g as i, h as a, i as o, lt as s, o as c, s as l, st as u, u as d } from "./PageLayout-BniRJaQ6.js";
2
+ import { t as f } from "./chevron-right-BIcwUJZq.js";
3
+ import { t as p } from "./fuel-DLH1ag04.js";
4
+ import { t as m } from "./star-CVZHFwDx.js";
5
+ import { t as h } from "./truck-9rLDncav.js";
6
+ import { t as g } from "./users-B8KhJBGg.js";
7
+ import { t as _ } from "./wrench-Dg-sgH2e.js";
8
+ import { i as v, n as y, o as b } from "./useFleet-g5Yri0G8.js";
9
+ import { n as x, r as S, t as C } from "./MetricCard-y3bWHKUQ.js";
10
+ import { a as w, r as T } from "./StatusBadge-BNHXYvZx.js";
10
11
  import { jsx as E, jsxs as D } from "react/jsx-runtime";
11
12
  import { CTAOverflowMenu as O, EmphasisPanel as k, NextSteps as A, PagePurpose as j } from "@burdenoff/fe-libs/ui";
12
13
  import { useI18n as M } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
@@ -15,32 +16,32 @@ function N() {
15
16
  let { t: N } = M(), P = (e, t) => {
16
17
  let n = N(e);
17
18
  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
+ }, { basePath: F, navigate: I } = u(), { 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
20
  B(), W(), J();
20
21
  }, Q = (e) => {
21
- I && I(n(F, e));
22
+ I && I(s(F, e));
22
23
  }, $ = (e, t) => {
23
24
  (e.key === "Enter" || e.key === " ") && (e.preventDefault(), t());
24
25
  };
25
- return /* @__PURE__ */ D(s, {
26
+ return /* @__PURE__ */ D(o, {
26
27
  title: P("movethewheels.fleet.title", "Fleet Management"),
27
28
  subtitle: P("movethewheels.fleet.subtitle", "Manage your vehicles and drivers"),
28
- icon: /* @__PURE__ */ E(g, { size: 24 }),
29
+ icon: /* @__PURE__ */ E(h, { size: 24 }),
29
30
  headerActions: /* @__PURE__ */ E(O, {
30
31
  primary: {
31
32
  label: P("movethewheels.fleet.actions.allVehicles", "All Vehicles"),
32
- icon: /* @__PURE__ */ E(g, { size: 16 }),
33
+ icon: /* @__PURE__ */ E(h, { size: 16 }),
33
34
  onSelect: () => Q("fleet/vehicles")
34
35
  },
35
36
  actions: [{
36
37
  label: P("movethewheels.fleet.actions.allDrivers", "All Drivers"),
37
- icon: /* @__PURE__ */ E(_, { size: 16 }),
38
+ icon: /* @__PURE__ */ E(g, { size: 16 }),
38
39
  onSelect: () => Q("fleet/drivers")
39
40
  }]
40
41
  }),
41
42
  children: [
42
43
  /* @__PURE__ */ E(j, {
43
- icon: /* @__PURE__ */ E(g, { size: 18 }),
44
+ icon: /* @__PURE__ */ E(h, { size: 18 }),
44
45
  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
  }),
46
47
  /* @__PURE__ */ E(A, {
@@ -50,14 +51,14 @@ function N() {
50
51
  id: "vehicles",
51
52
  label: P("movethewheels.fleet.nextSteps.vehicles", "Review your vehicles"),
52
53
  description: P("movethewheels.fleet.nextSteps.vehiclesDesc", "Check capacity, fuel and maintenance status across the fleet."),
53
- icon: /* @__PURE__ */ E(g, { size: 16 }),
54
+ icon: /* @__PURE__ */ E(h, { size: 16 }),
54
55
  onClick: () => Q("fleet/vehicles")
55
56
  },
56
57
  {
57
58
  id: "drivers",
58
59
  label: P("movethewheels.fleet.nextSteps.drivers", "Review your drivers"),
59
60
  description: P("movethewheels.fleet.nextSteps.driversDesc", "See availability, ratings and delivery history before assigning work."),
60
- icon: /* @__PURE__ */ E(_, { size: 16 }),
61
+ icon: /* @__PURE__ */ E(g, { size: 16 }),
61
62
  onClick: () => Q("fleet/drivers")
62
63
  },
63
64
  {
@@ -69,9 +70,9 @@ function N() {
69
70
  }
70
71
  ]
71
72
  }),
72
- X && !Y ? /* @__PURE__ */ E(r, {
73
+ X && !Y ? /* @__PURE__ */ E(n, {
73
74
  className: "border-status-error-border",
74
- children: /* @__PURE__ */ D(i, {
75
+ children: /* @__PURE__ */ D(r, {
75
76
  className: "p-6 text-center space-y-3",
76
77
  children: [
77
78
  /* @__PURE__ */ E("p", {
@@ -98,14 +99,14 @@ function N() {
98
99
  /* @__PURE__ */ E(C, {
99
100
  label: P("movethewheels.fleet.metrics.totalVehicles", "Total Vehicles"),
100
101
  value: L.totalVehicles,
101
- icon: /* @__PURE__ */ E(g, { size: 20 }),
102
+ icon: /* @__PURE__ */ E(h, { size: 20 }),
102
103
  subtitle: `${L.vehiclesByStatus.available} ${P("movethewheels.fleet.metrics.available", "available")}`,
103
104
  onClick: () => Q("fleet/vehicles")
104
105
  }),
105
106
  /* @__PURE__ */ E(C, {
106
107
  label: P("movethewheels.fleet.metrics.totalDrivers", "Total Drivers"),
107
108
  value: L.totalDrivers,
108
- icon: /* @__PURE__ */ E(_, { size: 20 }),
109
+ icon: /* @__PURE__ */ E(g, { size: 20 }),
109
110
  subtitle: `${L.driversByStatus.available} ${P("movethewheels.fleet.metrics.available", "available")}`,
110
111
  onClick: () => Q("fleet/drivers")
111
112
  }),
@@ -114,13 +115,13 @@ function N() {
114
115
  glow: !0,
115
116
  label: P("movethewheels.fleet.metrics.utilization", "Fleet Utilization"),
116
117
  value: `${L.utilization.toFixed(0)}%`,
117
- icon: /* @__PURE__ */ E(g, { size: 20 }),
118
+ icon: /* @__PURE__ */ E(h, { size: 20 }),
118
119
  changeType: L.utilization >= 70 ? "positive" : "neutral"
119
120
  }),
120
121
  /* @__PURE__ */ E(C, {
121
122
  label: P("movethewheels.fleet.metrics.avgDriverRating", "Avg Driver Rating"),
122
123
  value: L.avgDriverRating.toFixed(1),
123
- icon: /* @__PURE__ */ E(h, { size: 20 }),
124
+ icon: /* @__PURE__ */ E(m, { size: 20 }),
124
125
  subtitle: P("movethewheels.fleet.metrics.outOfFive", "out of 5"),
125
126
  changeType: L.avgDriverRating >= 4.5 ? "positive" : "neutral"
126
127
  })
@@ -140,7 +141,7 @@ function N() {
140
141
  /* @__PURE__ */ E(f, { size: 16 })
141
142
  ]
142
143
  }),
143
- children: /* @__PURE__ */ E(r, { children: /* @__PURE__ */ E(i, {
144
+ children: /* @__PURE__ */ E(n, { children: /* @__PURE__ */ E(r, {
144
145
  className: "p-0",
145
146
  children: /* @__PURE__ */ E("div", {
146
147
  className: "divide-y",
@@ -157,7 +158,7 @@ function N() {
157
158
  className: "flex items-center gap-3",
158
159
  children: [/* @__PURE__ */ E("div", {
159
160
  className: "w-10 h-10 rounded-lg bg-action-primary-bg/10 flex items-center justify-center",
160
- children: /* @__PURE__ */ E(g, {
161
+ children: /* @__PURE__ */ E(h, {
161
162
  size: 20,
162
163
  className: "text-primary"
163
164
  })
@@ -221,7 +222,7 @@ function N() {
221
222
  /* @__PURE__ */ E(f, { size: 16 })
222
223
  ]
223
224
  }),
224
- children: /* @__PURE__ */ E(r, { children: /* @__PURE__ */ E(i, {
225
+ children: /* @__PURE__ */ E(n, { children: /* @__PURE__ */ E(r, {
225
226
  className: "p-0",
226
227
  children: /* @__PURE__ */ E("div", {
227
228
  className: "divide-y",
@@ -236,7 +237,7 @@ function N() {
236
237
  className: "flex items-center justify-between",
237
238
  children: [/* @__PURE__ */ D("div", {
238
239
  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
+ children: [/* @__PURE__ */ E(c, { children: /* @__PURE__ */ E(l, { children: e.fullName.split(" ").map((e) => e[0]).join("") }) }), /* @__PURE__ */ D("div", { children: [/* @__PURE__ */ E("p", {
240
241
  className: "font-medium",
241
242
  children: e.fullName
242
243
  }), /* @__PURE__ */ D("p", {
@@ -257,7 +258,7 @@ function N() {
257
258
  size: "sm"
258
259
  }), /* @__PURE__ */ D("div", {
259
260
  className: "mt-1 flex items-center gap-1 justify-end",
260
- children: [/* @__PURE__ */ E(h, {
261
+ children: [/* @__PURE__ */ E(m, {
261
262
  size: 12,
262
263
  className: "text-status-warning-text fill-current"
263
264
  }), /* @__PURE__ */ E("span", {
@@ -301,7 +302,7 @@ function N() {
301
302
  })]
302
303
  }, t))
303
304
  })]
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
+ }), /* @__PURE__ */ D(n, { children: [/* @__PURE__ */ E(a, { children: /* @__PURE__ */ E(i, { children: P("movethewheels.fleet.status.driverTitle", "Driver Status") }) }), /* @__PURE__ */ E(r, { children: /* @__PURE__ */ E("div", {
305
306
  className: "space-y-4",
306
307
  children: Object.entries(L.driversByStatus).map(([t, n]) => /* @__PURE__ */ D("div", {
307
308
  className: "flex items-center justify-between",
@@ -324,18 +325,18 @@ function N() {
324
325
  }, t))
325
326
  }) })] })]
326
327
  }),
327
- L.vehiclesByStatus.maintenance > 0 && /* @__PURE__ */ D(r, {
328
+ L.vehiclesByStatus.maintenance > 0 && /* @__PURE__ */ D(n, {
328
329
  className: "border-status-warning-border",
329
- children: [/* @__PURE__ */ E(o, { children: /* @__PURE__ */ D(a, {
330
+ children: [/* @__PURE__ */ E(a, { children: /* @__PURE__ */ D(i, {
330
331
  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", {
332
+ children: [/* @__PURE__ */ E(_, { size: 18 }), P("movethewheels.fleet.maintenance.title", "Maintenance Required")]
333
+ }) }), /* @__PURE__ */ E(r, { children: /* @__PURE__ */ E("div", {
333
334
  className: "space-y-3",
334
335
  children: V.filter((e) => e.status === "maintenance").map((e) => /* @__PURE__ */ D("div", {
335
336
  className: "flex items-center justify-between p-3 bg-status-warning-bg/10 rounded-lg",
336
337
  children: [/* @__PURE__ */ D("div", {
337
338
  className: "flex items-center gap-3",
338
- children: [/* @__PURE__ */ E(g, {
339
+ children: [/* @__PURE__ */ E(h, {
339
340
  size: 20,
340
341
  className: "text-status-warning-text"
341
342
  }), /* @__PURE__ */ D("div", { children: [/* @__PURE__ */ E("p", {
@@ -1,4 +1,4 @@
1
- import { t as e } from "./circle-alert-iY24lSlp.js";
1
+ import { t as e } from "./circle-alert-CNkuDNc6.js";
2
2
  import { jsx as t, jsxs as n } from "react/jsx-runtime";
3
3
  //#region src/movethewheels/components/FormError.tsx
4
4
  function r({ message: r }) {