@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.
- package/dist/{AIAssistantPage-CNyoKtID.js → AIAssistantPage-AvsMbunM.js} +35 -29
- package/dist/{AnalyticsPage-Ck615ox7.js → AnalyticsPage-CCLfHgQZ.js} +36 -25
- package/dist/CreateOrderPage-CjlnEtk3.js +510 -0
- package/dist/CustomerDetailsPage-I6cdDHUi.js +265 -0
- package/dist/CustomersPage-CGGfD4ki.js +163 -0
- package/dist/{DashboardPage-DTmyuC11.js → DashboardPage-D2HRqwg9.js} +93 -89
- package/dist/DataTable-CD9ZhpLB.js +249 -0
- package/dist/DriverDetailsPage-rg_pGNuP.js +330 -0
- package/dist/DriversPage-DKiynISH.js +167 -0
- package/dist/FinancePage-Vg8WPs38.js +158 -0
- package/dist/{FleetPage-DCfOmBa2.js → FleetPage-DddXt8r8.js} +109 -71
- package/dist/ImportExportPage-BW6qO3kc.js +248 -0
- package/dist/{InventoryPage-BW0QXWuf.js → InventoryPage-rMGuaJN-.js} +74 -70
- package/dist/LiveTrackingPage-DQ1q4Id3.js +375 -0
- package/dist/MarketplacePage-DKrXAv62.js +219 -0
- package/dist/OrderDetailsPage-CFASgsYX.js +431 -0
- package/dist/OrdersListPage-BHeT8S5o.js +309 -0
- package/dist/ProductDetailsPage-CFGcbaHo.js +195 -0
- package/dist/ProductsPage--xEpbQ8A.js +171 -0
- package/dist/{ReportsPage-Df3hciPy.js → ReportsPage-Bb7_90rK.js} +53 -45
- package/dist/RouteDetailsPage-CVtDVb1N.js +282 -0
- package/dist/RoutesPage-s57PtgcQ.js +163 -0
- package/dist/SettingsPage-BYNCBOpN.js +298 -0
- package/dist/{TrackingPage-CU0Vk4mx.js → TrackingPage-CcRc_dva.js} +77 -72
- package/dist/VehicleDetailsPage-3YDMPsPs.js +220 -0
- package/dist/VehiclesPage-UlxPWP9K.js +167 -0
- package/dist/WarehouseDetailsPage-Db7KeN-d.js +238 -0
- package/dist/WarehousesPage-CuTO-OPp.js +164 -0
- package/dist/index.js +2 -2
- package/package.json +2 -2
- package/src/movethewheels/components/DataTable.tsx +37 -2
- package/src/movethewheels/components/MetricCard.tsx +3 -1
- package/src/movethewheels/pages/AIAssistantPage.tsx +11 -3
- package/src/movethewheels/pages/AnalyticsPage.tsx +31 -25
- package/src/movethewheels/pages/CreateOrderPage.tsx +56 -17
- package/src/movethewheels/pages/CustomerDetailsPage.tsx +63 -38
- package/src/movethewheels/pages/CustomersPage.tsx +40 -2
- package/src/movethewheels/pages/DashboardPage.tsx +8 -1
- package/src/movethewheels/pages/DriverDetailsPage.tsx +57 -26
- package/src/movethewheels/pages/DriversPage.tsx +37 -1
- package/src/movethewheels/pages/FinancePage.tsx +45 -41
- package/src/movethewheels/pages/FleetPage.tsx +68 -25
- package/src/movethewheels/pages/ImportExportPage.tsx +46 -29
- package/src/movethewheels/pages/InventoryPage.tsx +20 -23
- package/src/movethewheels/pages/LiveTrackingPage.tsx +58 -20
- package/src/movethewheels/pages/MarketplacePage.tsx +37 -3
- package/src/movethewheels/pages/OrderDetailsPage.tsx +74 -46
- package/src/movethewheels/pages/OrdersListPage.tsx +62 -1
- package/src/movethewheels/pages/ProductDetailsPage.tsx +36 -11
- package/src/movethewheels/pages/ProductsPage.tsx +33 -1
- package/src/movethewheels/pages/ReportsPage.tsx +23 -19
- package/src/movethewheels/pages/RouteDetailsPage.tsx +71 -31
- package/src/movethewheels/pages/RoutesPage.tsx +41 -5
- package/src/movethewheels/pages/SettingsPage.tsx +68 -26
- package/src/movethewheels/pages/TrackingPage.tsx +50 -47
- package/src/movethewheels/pages/VehicleDetailsPage.tsx +49 -24
- package/src/movethewheels/pages/VehiclesPage.tsx +33 -1
- package/src/movethewheels/pages/WarehouseDetailsPage.tsx +55 -30
- package/src/movethewheels/pages/WarehousesPage.tsx +42 -4
- package/dist/CreateOrderPage-C9Vb57Yn.js +0 -471
- package/dist/CustomerDetailsPage-BVkHRZvi.js +0 -239
- package/dist/CustomersPage-DhQg-6h_.js +0 -118
- package/dist/DataTable-CfWvFw5B.js +0 -239
- package/dist/DriverDetailsPage-DaaCQ-2O.js +0 -297
- package/dist/DriversPage-D0RMBB_t.js +0 -129
- package/dist/FinancePage-BUXqW1IM.js +0 -154
- package/dist/ImportExportPage-BM1BoRcE.js +0 -232
- package/dist/LiveTrackingPage-DqcGXdkw.js +0 -332
- package/dist/MarketplacePage-DFqsxNYU.js +0 -192
- package/dist/OrderDetailsPage-Dx1m3cVA.js +0 -398
- package/dist/OrdersListPage-DHYBGrWf.js +0 -256
- package/dist/ProductDetailsPage-DOXO90kb.js +0 -168
- package/dist/ProductsPage-RLMTwWN0.js +0 -133
- package/dist/RouteDetailsPage-xzFDeR-X.js +0 -240
- package/dist/RoutesPage-DDFy1QVi.js +0 -118
- package/dist/SettingsPage-JH_-UPbf.js +0 -247
- package/dist/VehicleDetailsPage-P4xDttKw.js +0 -194
- package/dist/VehiclesPage-tJZ64QKV.js +0 -129
- package/dist/WarehouseDetailsPage-Bt_w2Yf7.js +0 -215
- 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
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
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
|
-
<
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
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
|
-
</
|
|
95
|
-
</
|
|
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
|
);
|