@burdenoff/microfe-movethewheels 2026.625.1 → 2026.626.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (80) hide show
  1. package/dist/{AIAssistantPage-CNyoKtID.js → AIAssistantPage-AvsMbunM.js} +35 -29
  2. package/dist/{AnalyticsPage-Ck615ox7.js → AnalyticsPage-CCLfHgQZ.js} +36 -25
  3. package/dist/CreateOrderPage-CjlnEtk3.js +510 -0
  4. package/dist/CustomerDetailsPage-I6cdDHUi.js +265 -0
  5. package/dist/CustomersPage-CGGfD4ki.js +163 -0
  6. package/dist/{DashboardPage-DTmyuC11.js → DashboardPage-D2HRqwg9.js} +93 -89
  7. package/dist/DataTable-CD9ZhpLB.js +249 -0
  8. package/dist/DriverDetailsPage-rg_pGNuP.js +330 -0
  9. package/dist/DriversPage-DKiynISH.js +167 -0
  10. package/dist/FinancePage-Vg8WPs38.js +158 -0
  11. package/dist/{FleetPage-DCfOmBa2.js → FleetPage-DddXt8r8.js} +109 -71
  12. package/dist/ImportExportPage-BW6qO3kc.js +248 -0
  13. package/dist/{InventoryPage-BW0QXWuf.js → InventoryPage-rMGuaJN-.js} +74 -70
  14. package/dist/LiveTrackingPage-DQ1q4Id3.js +375 -0
  15. package/dist/MarketplacePage-DKrXAv62.js +219 -0
  16. package/dist/OrderDetailsPage-CFASgsYX.js +431 -0
  17. package/dist/OrdersListPage-BHeT8S5o.js +309 -0
  18. package/dist/ProductDetailsPage-CFGcbaHo.js +195 -0
  19. package/dist/ProductsPage--xEpbQ8A.js +171 -0
  20. package/dist/{ReportsPage-Df3hciPy.js → ReportsPage-Bb7_90rK.js} +53 -45
  21. package/dist/RouteDetailsPage-CVtDVb1N.js +282 -0
  22. package/dist/RoutesPage-s57PtgcQ.js +163 -0
  23. package/dist/SettingsPage-BYNCBOpN.js +298 -0
  24. package/dist/{TrackingPage-CU0Vk4mx.js → TrackingPage-CcRc_dva.js} +77 -72
  25. package/dist/VehicleDetailsPage-3YDMPsPs.js +220 -0
  26. package/dist/VehiclesPage-UlxPWP9K.js +167 -0
  27. package/dist/WarehouseDetailsPage-Db7KeN-d.js +238 -0
  28. package/dist/WarehousesPage-CuTO-OPp.js +164 -0
  29. package/dist/index.js +2 -2
  30. package/package.json +2 -2
  31. package/src/movethewheels/components/DataTable.tsx +37 -2
  32. package/src/movethewheels/components/MetricCard.tsx +3 -1
  33. package/src/movethewheels/pages/AIAssistantPage.tsx +11 -3
  34. package/src/movethewheels/pages/AnalyticsPage.tsx +31 -25
  35. package/src/movethewheels/pages/CreateOrderPage.tsx +56 -17
  36. package/src/movethewheels/pages/CustomerDetailsPage.tsx +63 -38
  37. package/src/movethewheels/pages/CustomersPage.tsx +40 -2
  38. package/src/movethewheels/pages/DashboardPage.tsx +8 -1
  39. package/src/movethewheels/pages/DriverDetailsPage.tsx +57 -26
  40. package/src/movethewheels/pages/DriversPage.tsx +37 -1
  41. package/src/movethewheels/pages/FinancePage.tsx +45 -41
  42. package/src/movethewheels/pages/FleetPage.tsx +68 -25
  43. package/src/movethewheels/pages/ImportExportPage.tsx +46 -29
  44. package/src/movethewheels/pages/InventoryPage.tsx +20 -23
  45. package/src/movethewheels/pages/LiveTrackingPage.tsx +58 -20
  46. package/src/movethewheels/pages/MarketplacePage.tsx +37 -3
  47. package/src/movethewheels/pages/OrderDetailsPage.tsx +74 -46
  48. package/src/movethewheels/pages/OrdersListPage.tsx +62 -1
  49. package/src/movethewheels/pages/ProductDetailsPage.tsx +36 -11
  50. package/src/movethewheels/pages/ProductsPage.tsx +33 -1
  51. package/src/movethewheels/pages/ReportsPage.tsx +23 -19
  52. package/src/movethewheels/pages/RouteDetailsPage.tsx +71 -31
  53. package/src/movethewheels/pages/RoutesPage.tsx +41 -5
  54. package/src/movethewheels/pages/SettingsPage.tsx +68 -26
  55. package/src/movethewheels/pages/TrackingPage.tsx +50 -47
  56. package/src/movethewheels/pages/VehicleDetailsPage.tsx +49 -24
  57. package/src/movethewheels/pages/VehiclesPage.tsx +33 -1
  58. package/src/movethewheels/pages/WarehouseDetailsPage.tsx +55 -30
  59. package/src/movethewheels/pages/WarehousesPage.tsx +42 -4
  60. package/dist/CreateOrderPage-C9Vb57Yn.js +0 -471
  61. package/dist/CustomerDetailsPage-BVkHRZvi.js +0 -239
  62. package/dist/CustomersPage-DhQg-6h_.js +0 -118
  63. package/dist/DataTable-CfWvFw5B.js +0 -239
  64. package/dist/DriverDetailsPage-DaaCQ-2O.js +0 -297
  65. package/dist/DriversPage-D0RMBB_t.js +0 -129
  66. package/dist/FinancePage-BUXqW1IM.js +0 -154
  67. package/dist/ImportExportPage-BM1BoRcE.js +0 -232
  68. package/dist/LiveTrackingPage-DqcGXdkw.js +0 -332
  69. package/dist/MarketplacePage-DFqsxNYU.js +0 -192
  70. package/dist/OrderDetailsPage-Dx1m3cVA.js +0 -398
  71. package/dist/OrdersListPage-DHYBGrWf.js +0 -256
  72. package/dist/ProductDetailsPage-DOXO90kb.js +0 -168
  73. package/dist/ProductsPage-RLMTwWN0.js +0 -133
  74. package/dist/RouteDetailsPage-xzFDeR-X.js +0 -240
  75. package/dist/RoutesPage-DDFy1QVi.js +0 -118
  76. package/dist/SettingsPage-JH_-UPbf.js +0 -247
  77. package/dist/VehicleDetailsPage-P4xDttKw.js +0 -194
  78. package/dist/VehiclesPage-tJZ64QKV.js +0 -129
  79. package/dist/WarehouseDetailsPage-Bt_w2Yf7.js +0 -215
  80. package/dist/WarehousesPage-HsPpEFeG.js +0 -126
@@ -7,7 +7,7 @@ import { PageLayout } from '../components/PageLayout';
7
7
  import { DataTable, type Column } from '../components/DataTable';
8
8
  import { StatusBadge, VehicleTypeBadge } from '../components/StatusBadge';
9
9
  import { Progress } from '../components/ui';
10
- import { CTAOverflowMenu } from '@burdenoff/fe-libs/ui';
10
+ import { CTAOverflowMenu, EmphasisPanel, PagePurpose } from '@burdenoff/fe-libs/ui';
11
11
  import { useVehicles } from '../hooks/useFleet';
12
12
  import { useMoveTheWheels } from '../providers/MoveTheWheelsProvider';
13
13
  import { joinPath } from '../utils/navigation';
@@ -103,6 +103,35 @@ export default function VehiclesPage() {
103
103
  />
104
104
  }
105
105
  >
106
+ <PagePurpose icon={<Truck size={18} />}>
107
+ Every truck, van and bike in your fleet. Monitor capacity, fuel level, mileage and
108
+ maintenance status here so you always know which vehicles are road-ready before dispatching
109
+ an order.
110
+ </PagePurpose>
111
+
112
+ {/* Fleet at a glance — the page's single emphasis zone */}
113
+ <EmphasisPanel>
114
+ <p className="text-sm font-medium text-text-secondary">Fleet at a glance</p>
115
+ <div className="mt-3 grid grid-cols-3 gap-4">
116
+ <div>
117
+ <p className="text-2xl font-bold text-text-primary tabular-nums">{totalVehicles}</p>
118
+ <p className="text-xs text-text-secondary">Total vehicles</p>
119
+ </div>
120
+ <div>
121
+ <p className="text-2xl font-bold text-text-primary tabular-nums">
122
+ {vehicles.filter((v) => v.status === 'available').length}
123
+ </p>
124
+ <p className="text-xs text-text-secondary">Available now</p>
125
+ </div>
126
+ <div>
127
+ <p className="text-2xl font-bold text-text-primary tabular-nums">
128
+ {vehicles.filter((v) => v.status === 'maintenance').length}
129
+ </p>
130
+ <p className="text-xs text-text-secondary">In maintenance</p>
131
+ </div>
132
+ </div>
133
+ </EmphasisPanel>
134
+
106
135
  <DataTable
107
136
  columns={columns}
108
137
  data={vehicles}
@@ -112,6 +141,9 @@ export default function VehiclesPage() {
112
141
  searchFields={['vehicleNumber', 'make', 'model'] as (keyof Vehicle)[]}
113
142
  onRowClick={(row) => goTo(`fleet/vehicles/${row.id}`)}
114
143
  getRowId={(row) => row.id}
144
+ emptyIllustration="empty-data"
145
+ emptyTitle="No vehicles yet"
146
+ emptyDescription="Add vehicles to your fleet to start assigning them to deliveries."
115
147
  />
116
148
  </PageLayout>
117
149
  );
@@ -14,6 +14,7 @@ import {
14
14
  Badge,
15
15
  Progress,
16
16
  } from '../components/ui';
17
+ import { EmphasisPanel, NextSteps, PagePurpose } from '@burdenoff/fe-libs/ui';
17
18
  import { useWarehouse } from '../hooks/useInventory';
18
19
  import { useMoveTheWheels } from '../providers/MoveTheWheelsProvider';
19
20
  import { formatAddress } from '../utils/formatters';
@@ -25,6 +26,7 @@ export default function WarehouseDetailsPage() {
25
26
  const { warehouse, isLoading, error, refetch } = useWarehouse(warehouseId);
26
27
 
27
28
  const goBack = () => navigate?.(joinPath(basePath, 'inventory/warehouses'));
29
+ const goTo = (path: string) => navigate?.(joinPath(basePath, path));
28
30
 
29
31
  if (isLoading) return <LoadingState message="Loading warehouse details..." />;
30
32
  if (error || !warehouse) return <ErrorState title="Warehouse not found" onRetry={refetch} />;
@@ -57,42 +59,65 @@ export default function WarehouseDetailsPage() {
57
59
  </div>
58
60
  }
59
61
  >
62
+ <PagePurpose icon={<Warehouse size={18} />}>
63
+ A storage and fulfilment site at a glance — how full it is, its zones, operating hours,
64
+ throughput and staff. Use it to decide whether this warehouse has the space and hours to
65
+ fulfil an order, and where stock is running tight.
66
+ </PagePurpose>
67
+
68
+ <NextSteps
69
+ storageKey="movethewheels-warehouse-details"
70
+ steps={[
71
+ {
72
+ id: 'inventory',
73
+ label: 'Review stock here',
74
+ description: 'See which products are stored at this site.',
75
+ icon: <Box size={16} />,
76
+ onClick: () => goTo('inventory/products'),
77
+ },
78
+ {
79
+ id: 'fulfil',
80
+ label: 'Fulfil an order from this site',
81
+ description: 'Pick a pending order to ship out of this warehouse.',
82
+ icon: <MapPin size={16} />,
83
+ onClick: () => goTo('orders'),
84
+ },
85
+ ]}
86
+ />
87
+
60
88
  <div className="grid grid-cols-1 lg:grid-cols-3 gap-6">
61
89
  <div className="lg:col-span-2 space-y-6">
62
- <Card>
63
- <CardHeader>
64
- <CardTitle className="flex items-center gap-2">
65
- <Box size={18} /> Capacity
66
- </CardTitle>
67
- </CardHeader>
68
- <CardContent>
69
- <div className="space-y-4">
90
+ {/* Capacity — the page's single emphasis zone */}
91
+ <EmphasisPanel>
92
+ <h2 className="flex items-center gap-2 text-base font-semibold text-text-primary mb-4">
93
+ <Box size={18} /> Capacity
94
+ </h2>
95
+ <div className="space-y-4">
96
+ <div>
97
+ <div className="flex justify-between text-sm mb-2">
98
+ <span>Space Utilization</span>
99
+ <span>{utilization.toFixed(0)}%</span>
100
+ </div>
101
+ <Progress value={utilization} />
102
+ <p className="text-sm text-text-secondary mt-1">
103
+ {warehouse.capacity.usedSpace.toLocaleString()} /{' '}
104
+ {warehouse.capacity.totalSpace.toLocaleString()} sq ft
105
+ </p>
106
+ </div>
107
+ <div className="grid grid-cols-2 gap-4">
70
108
  <div>
71
- <div className="flex justify-between text-sm mb-2">
72
- <span>Space Utilization</span>
73
- <span>{utilization.toFixed(0)}%</span>
74
- </div>
75
- <Progress value={utilization} />
76
- <p className="text-sm text-text-secondary mt-1">
77
- {warehouse.capacity.usedSpace.toLocaleString()} /{' '}
78
- {warehouse.capacity.totalSpace.toLocaleString()} sq ft
109
+ <p className="text-sm text-text-secondary">Pallets Used</p>
110
+ <p className="text-2xl font-bold">
111
+ {warehouse.capacity.usedPallets}
112
+ <span className="text-sm font-normal text-text-secondary">
113
+ {' '}
114
+ / {warehouse.capacity.totalPallets}
115
+ </span>
79
116
  </p>
80
117
  </div>
81
- <div className="grid grid-cols-2 gap-4">
82
- <div>
83
- <p className="text-sm text-text-secondary">Pallets Used</p>
84
- <p className="text-2xl font-bold">
85
- {warehouse.capacity.usedPallets}
86
- <span className="text-sm font-normal text-text-secondary">
87
- {' '}
88
- / {warehouse.capacity.totalPallets}
89
- </span>
90
- </p>
91
- </div>
92
- </div>
93
118
  </div>
94
- </CardContent>
95
- </Card>
119
+ </div>
120
+ </EmphasisPanel>
96
121
 
97
122
  <Card>
98
123
  <CardHeader>
@@ -6,7 +6,7 @@ import { Warehouse, Plus, RefreshCw } from 'lucide-react';
6
6
  import { PageLayout } from '../components/PageLayout';
7
7
  import { DataTable, type Column } from '../components/DataTable';
8
8
  import { Badge, Progress } from '../components/ui';
9
- import { CTAOverflowMenu } from '@burdenoff/fe-libs/ui';
9
+ import { CTAOverflowMenu, EmphasisPanel, PagePurpose } from '@burdenoff/fe-libs/ui';
10
10
  import { useWarehouses } from '../hooks/useInventory';
11
11
  import { useMoveTheWheels } from '../providers/MoveTheWheelsProvider';
12
12
  import { joinPath } from '../utils/navigation';
@@ -100,12 +100,47 @@ export default function WarehousesPage() {
100
100
  headerActions={
101
101
  <CTAOverflowMenu
102
102
  primary={{ label: 'Add Warehouse', icon: <Plus size={16} />, onSelect: () => {} }}
103
- actions={[
104
- { label: 'Refresh', icon: <RefreshCw size={16} />, onSelect: () => refetch() },
105
- ]}
103
+ actions={[{ label: 'Refresh', icon: <RefreshCw size={16} />, onSelect: () => refetch() }]}
106
104
  />
107
105
  }
108
106
  >
107
+ <PagePurpose icon={<Warehouse size={18} />}>
108
+ Your storage and fulfilment sites. Watch space and pallet utilization across each warehouse
109
+ to balance stock, spot capacity crunches, and decide where to fulfil an order from.
110
+ </PagePurpose>
111
+
112
+ {/* Network at a glance — the page's single emphasis zone */}
113
+ <EmphasisPanel>
114
+ <p className="text-sm font-medium text-text-secondary">Network at a glance</p>
115
+ <div className="mt-3 grid grid-cols-3 gap-4">
116
+ <div>
117
+ <p className="text-2xl font-bold text-text-primary tabular-nums">{totalWarehouses}</p>
118
+ <p className="text-xs text-text-secondary">Total sites</p>
119
+ </div>
120
+ <div>
121
+ <p className="text-2xl font-bold text-text-primary tabular-nums">
122
+ {warehouses.filter((w) => w.isActive).length}
123
+ </p>
124
+ <p className="text-xs text-text-secondary">Active</p>
125
+ </div>
126
+ <div>
127
+ <p className="text-2xl font-bold text-text-primary tabular-nums">
128
+ {warehouses.length > 0
129
+ ? `${Math.round(
130
+ (warehouses.reduce(
131
+ (sum, w) => sum + w.capacity.usedSpace / w.capacity.totalSpace,
132
+ 0
133
+ ) /
134
+ warehouses.length) *
135
+ 100
136
+ )}%`
137
+ : '—'}
138
+ </p>
139
+ <p className="text-xs text-text-secondary">Avg utilization</p>
140
+ </div>
141
+ </div>
142
+ </EmphasisPanel>
143
+
109
144
  <DataTable
110
145
  columns={columns}
111
146
  data={warehouses}
@@ -115,6 +150,9 @@ export default function WarehousesPage() {
115
150
  searchFields={['name', 'code'] as (keyof WarehouseType)[]}
116
151
  onRowClick={(row) => goTo(`inventory/warehouses/${row.id}`)}
117
152
  getRowId={(row) => row.id}
153
+ emptyIllustration="empty-data"
154
+ emptyTitle="No warehouses yet"
155
+ emptyDescription="Add a warehouse to store inventory and fulfil orders from it."
118
156
  />
119
157
  </PageLayout>
120
158
  );