@burdenoff/microfe-movethewheels 2026.703.8 → 2026.704.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{CreateOrderPage-V8aXfcpN.js → CreateOrderPage-CXbhJLLz.js} +163 -138
- package/dist/{DashboardPage-DiD-cWwD.js → DashboardPage-BoswH3ec.js} +2 -2
- package/dist/DriverDetailsPage-CPO0G8Ki.js +518 -0
- package/dist/{DriversPage-DW-FGPFW.js → DriversPage-6Z61dpDI.js} +1 -1
- package/dist/{FleetPage-P9k4zZqP.js → FleetPage-qWRj7WFO.js} +1 -1
- package/dist/{InventoryPage-BWikjZMW.js → InventoryPage-DbR4Z--d.js} +1 -1
- package/dist/{LiveTrackingPage-UQBWlthJ.js → LiveTrackingPage-5U68u3oA.js} +1 -1
- package/dist/{OrderDetailsPage-2J4ua0wd.js → OrderDetailsPage-DRYifXm9.js} +1 -1
- package/dist/ProductDetailsPage-CWgcRqGR.js +375 -0
- package/dist/{ProductsPage-Bn1U2jTj.js → ProductsPage-CokwDOR2.js} +1 -1
- package/dist/{RouteDetailsPage-CgSY1CTd.js → RouteDetailsPage-sRRVY5UM.js} +243 -211
- package/dist/{RoutesPage-Dqd5Don6.js → RoutesPage-hec06HnD.js} +1 -1
- package/dist/{SettingsPage-2a05Sq2k.js → SettingsPage-_6SIlcBX.js} +1 -1
- package/dist/{TrackingPage-SnjW6qeD.js → TrackingPage-Cg0tYGJe.js} +1 -1
- package/dist/{VehicleDetailsPage-CvRMJ2zC.js → VehicleDetailsPage-BbZlCFPo.js} +159 -135
- package/dist/{VehiclesPage-qxf-1C1B.js → VehiclesPage-BfBEyXGs.js} +1 -1
- package/dist/WarehouseDetailsPage-DxNhiaoI.js +515 -0
- package/dist/{WarehousesPage-44Wj7AGT.js → WarehousesPage-M3NaBT0z.js} +1 -1
- package/dist/index.js +26 -6
- package/dist/{useFleet-BXSocBD_.js → useFleet-BfA_-VUW.js} +100 -71
- package/dist/{useInventory-DmZficcp.js → useInventory-BO7TSgq_.js} +98 -72
- package/dist/{useRoutes-C_ZCYJ_h.js → useRoutes-DAdy2BGv.js} +8 -8
- package/dist/{useSettings-CteNasBE.js → useSettings-BNNzQs_B.js} +1 -1
- package/dist/{useTracking-B7ttexRe.js → useTracking-7nd_XOSL.js} +1 -1
- package/package.json +1 -1
- package/src/movethewheels/MoveTheWheelsRoutes.tsx +5 -0
- package/src/movethewheels/hooks/useFleet.ts +113 -0
- package/src/movethewheels/hooks/useInventory.ts +86 -0
- package/src/movethewheels/hooks/useRoutes.ts +17 -7
- package/src/movethewheels/hooks/useSettings.ts +8 -1
- package/src/movethewheels/pages/CreateOrderPage.tsx +48 -6
- package/src/movethewheels/pages/DriverDetailsPage.tsx +56 -18
- package/src/movethewheels/pages/ProductDetailsPage.tsx +51 -15
- package/src/movethewheels/pages/RouteDetailsPage.tsx +51 -7
- package/src/movethewheels/pages/VehicleDetailsPage.tsx +51 -15
- package/src/movethewheels/pages/WarehouseDetailsPage.tsx +46 -10
- package/src/movethewheels/types/index.ts +3 -0
- package/dist/DriverDetailsPage-DjaXaATQ.js +0 -490
- package/dist/ProductDetailsPage-BSjWLrty.js +0 -350
- package/dist/WarehouseDetailsPage-D0Wyyj1Y.js +0 -493
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
* Vehicle Details Page
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
|
-
import { useState } from 'react';
|
|
6
|
-
import { useParams } from 'react-router-dom';
|
|
5
|
+
import { useEffect, useState } from 'react';
|
|
6
|
+
import { useParams, useLocation } from 'react-router-dom';
|
|
7
7
|
import { Truck, ArrowLeft, MapPin, Fuel, Wrench, Edit, Save } from 'lucide-react';
|
|
8
8
|
import { PageLayout, LoadingState, ErrorState } from '../components/PageLayout';
|
|
9
9
|
import { StatusBadge, VehicleTypeBadge } from '../components/StatusBadge';
|
|
@@ -41,9 +41,11 @@ const VEHICLE_TYPE_OPTIONS = [
|
|
|
41
41
|
{ value: 'DRONE', label: 'Drone' },
|
|
42
42
|
];
|
|
43
43
|
|
|
44
|
-
function NewVehicleForm() {
|
|
44
|
+
function NewVehicleForm({ editId }: { editId?: string }) {
|
|
45
45
|
const { basePath, navigate } = useMoveTheWheels();
|
|
46
|
-
const { createVehicle } = useFleet();
|
|
46
|
+
const { createVehicle, updateVehicle } = useFleet();
|
|
47
|
+
const { vehicle } = useVehicle(editId);
|
|
48
|
+
const isEditing = !!editId;
|
|
47
49
|
const [form, setForm] = useState({
|
|
48
50
|
vehicleNumber: '',
|
|
49
51
|
type: 'VAN',
|
|
@@ -54,6 +56,18 @@ function NewVehicleForm() {
|
|
|
54
56
|
const [submitting, setSubmitting] = useState(false);
|
|
55
57
|
const [error, setError] = useState<string | null>(null);
|
|
56
58
|
|
|
59
|
+
useEffect(() => {
|
|
60
|
+
if (editId && vehicle) {
|
|
61
|
+
setForm({
|
|
62
|
+
vehicleNumber: vehicle.vehicleNumber ?? '',
|
|
63
|
+
type: vehicle.type ? vehicle.type.toUpperCase() : 'VAN',
|
|
64
|
+
make: vehicle.make ?? '',
|
|
65
|
+
model: vehicle.model ?? '',
|
|
66
|
+
licensePlate: vehicle.licensePlate ?? '',
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
}, [editId, vehicle]);
|
|
70
|
+
|
|
57
71
|
const goBack = () => navigate?.(joinPath(basePath, 'fleet/vehicles'));
|
|
58
72
|
|
|
59
73
|
const handleSubmit = async (e: React.FormEvent) => {
|
|
@@ -65,14 +79,25 @@ function NewVehicleForm() {
|
|
|
65
79
|
setSubmitting(true);
|
|
66
80
|
setError(null);
|
|
67
81
|
try {
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
82
|
+
if (editId) {
|
|
83
|
+
const updated = await updateVehicle(editId, {
|
|
84
|
+
vehicleNumber: form.vehicleNumber.trim(),
|
|
85
|
+
type: form.type,
|
|
86
|
+
make: form.make.trim() || undefined,
|
|
87
|
+
model: form.model.trim() || undefined,
|
|
88
|
+
licensePlate: form.licensePlate.trim() || undefined,
|
|
89
|
+
});
|
|
90
|
+
navigate?.(joinPath(basePath, `fleet/vehicles/${updated.id}`));
|
|
91
|
+
} else {
|
|
92
|
+
const created = await createVehicle({
|
|
93
|
+
vehicleNumber: form.vehicleNumber.trim(),
|
|
94
|
+
type: form.type,
|
|
95
|
+
make: form.make.trim() || undefined,
|
|
96
|
+
model: form.model.trim() || undefined,
|
|
97
|
+
licensePlate: form.licensePlate.trim() || undefined,
|
|
98
|
+
});
|
|
99
|
+
navigate?.(joinPath(basePath, `fleet/vehicles/${created.id}`));
|
|
100
|
+
}
|
|
76
101
|
} catch (err) {
|
|
77
102
|
console.error('Failed to create vehicle:', err);
|
|
78
103
|
setError(err instanceof Error ? err.message : 'Failed to create vehicle. Please try again.');
|
|
@@ -82,7 +107,7 @@ function NewVehicleForm() {
|
|
|
82
107
|
|
|
83
108
|
return (
|
|
84
109
|
<PageLayout
|
|
85
|
-
title=
|
|
110
|
+
title={isEditing ? 'Edit Vehicle' : 'Add Vehicle'}
|
|
86
111
|
subtitle="Register a new vehicle in your fleet"
|
|
87
112
|
icon={<Truck size={24} />}
|
|
88
113
|
headerActions={
|
|
@@ -91,7 +116,14 @@ function NewVehicleForm() {
|
|
|
91
116
|
<ArrowLeft size={16} /> Cancel
|
|
92
117
|
</Button>
|
|
93
118
|
<Button onClick={handleSubmit} disabled={submitting}>
|
|
94
|
-
<Save size={16} />
|
|
119
|
+
<Save size={16} />{' '}
|
|
120
|
+
{isEditing
|
|
121
|
+
? submitting
|
|
122
|
+
? 'Saving...'
|
|
123
|
+
: 'Save Changes'
|
|
124
|
+
: submitting
|
|
125
|
+
? 'Saving...'
|
|
126
|
+
: 'Add Vehicle'}
|
|
95
127
|
</Button>
|
|
96
128
|
</div>
|
|
97
129
|
}
|
|
@@ -180,11 +212,13 @@ export default function VehicleDetailsPage() {
|
|
|
180
212
|
const { vehicleId } = useParams<{ vehicleId: string }>();
|
|
181
213
|
const { basePath, navigate } = useMoveTheWheels();
|
|
182
214
|
const { vehicle, isLoading, error, refetch } = useVehicle(vehicleId);
|
|
215
|
+
const isEditRoute = useLocation().pathname.endsWith('/edit');
|
|
183
216
|
|
|
184
217
|
const goBack = () => navigate?.(joinPath(basePath, 'fleet/vehicles'));
|
|
185
218
|
const goTo = (path: string) => navigate?.(joinPath(basePath, path));
|
|
186
219
|
|
|
187
220
|
if (!vehicleId) return <NewVehicleForm />;
|
|
221
|
+
if (isEditRoute) return <NewVehicleForm editId={vehicleId} />;
|
|
188
222
|
if (isLoading) return <LoadingState message="Loading vehicle details..." />;
|
|
189
223
|
if (error || !vehicle) return <ErrorState title="Vehicle not found" onRetry={refetch} />;
|
|
190
224
|
|
|
@@ -198,7 +232,9 @@ export default function VehicleDetailsPage() {
|
|
|
198
232
|
<Button variant="outline" onClick={goBack}>
|
|
199
233
|
<ArrowLeft size={16} /> Back
|
|
200
234
|
</Button>
|
|
201
|
-
<Button
|
|
235
|
+
<Button
|
|
236
|
+
onClick={() => navigate?.(joinPath(basePath, 'fleet/vehicles/' + vehicleId + '/edit'))}
|
|
237
|
+
>
|
|
202
238
|
<Edit size={16} /> Edit
|
|
203
239
|
</Button>
|
|
204
240
|
</div>
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
* Warehouse Details Page
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
|
-
import { useState } from 'react';
|
|
6
|
-
import { useParams } from 'react-router-dom';
|
|
5
|
+
import { useEffect, useState } from 'react';
|
|
6
|
+
import { useLocation, useParams } from 'react-router-dom';
|
|
7
7
|
import { Warehouse, ArrowLeft, Edit, MapPin, Clock, Users, Box, Save } from 'lucide-react';
|
|
8
8
|
import { PageLayout, LoadingState, ErrorState } from '../components/PageLayout';
|
|
9
9
|
import {
|
|
@@ -37,9 +37,11 @@ const WAREHOUSE_TYPE_OPTIONS = [
|
|
|
37
37
|
{ value: 'RETAIL', label: 'Retail' },
|
|
38
38
|
];
|
|
39
39
|
|
|
40
|
-
function NewWarehouseForm() {
|
|
40
|
+
function NewWarehouseForm({ editId }: { editId?: string }) {
|
|
41
41
|
const { basePath, navigate } = useMoveTheWheels();
|
|
42
|
-
const { createWarehouse } = useInventory();
|
|
42
|
+
const { createWarehouse, updateWarehouse } = useInventory();
|
|
43
|
+
const { warehouse } = useWarehouse(editId);
|
|
44
|
+
const isEditing = !!editId;
|
|
43
45
|
const [form, setForm] = useState({
|
|
44
46
|
code: '',
|
|
45
47
|
name: '',
|
|
@@ -54,6 +56,21 @@ function NewWarehouseForm() {
|
|
|
54
56
|
const [submitting, setSubmitting] = useState(false);
|
|
55
57
|
const [error, setError] = useState<string | null>(null);
|
|
56
58
|
|
|
59
|
+
useEffect(() => {
|
|
60
|
+
if (!editId || !warehouse) return;
|
|
61
|
+
setForm({
|
|
62
|
+
code: warehouse.code || '',
|
|
63
|
+
name: warehouse.name || '',
|
|
64
|
+
type: warehouse.type ? warehouse.type.toUpperCase() : 'DISTRIBUTION',
|
|
65
|
+
street: warehouse.address.street || '',
|
|
66
|
+
city: warehouse.address.city || '',
|
|
67
|
+
state: warehouse.address.state || '',
|
|
68
|
+
postalCode: warehouse.address.postalCode || '',
|
|
69
|
+
country: warehouse.address.country || 'USA',
|
|
70
|
+
totalCapacity: warehouse.capacity.totalSpace ? String(warehouse.capacity.totalSpace) : '',
|
|
71
|
+
});
|
|
72
|
+
}, [editId, warehouse]);
|
|
73
|
+
|
|
57
74
|
const goBack = () => navigate?.(joinPath(basePath, 'inventory/warehouses'));
|
|
58
75
|
|
|
59
76
|
const update = (field: keyof typeof form, value: string) =>
|
|
@@ -73,7 +90,7 @@ function NewWarehouseForm() {
|
|
|
73
90
|
setError(null);
|
|
74
91
|
try {
|
|
75
92
|
const totalCapacity = form.totalCapacity.trim() ? Number(form.totalCapacity) : undefined;
|
|
76
|
-
const
|
|
93
|
+
const warehouseInput = {
|
|
77
94
|
code: form.code.trim(),
|
|
78
95
|
name: form.name.trim(),
|
|
79
96
|
type: form.type,
|
|
@@ -86,8 +103,14 @@ function NewWarehouseForm() {
|
|
|
86
103
|
},
|
|
87
104
|
totalCapacity:
|
|
88
105
|
totalCapacity !== undefined && !Number.isNaN(totalCapacity) ? totalCapacity : undefined,
|
|
89
|
-
}
|
|
90
|
-
|
|
106
|
+
};
|
|
107
|
+
if (editId) {
|
|
108
|
+
await updateWarehouse(editId, warehouseInput);
|
|
109
|
+
navigate?.(joinPath(basePath, `inventory/warehouses/${editId}`));
|
|
110
|
+
} else {
|
|
111
|
+
const created = await createWarehouse(warehouseInput);
|
|
112
|
+
navigate?.(joinPath(basePath, `inventory/warehouses/${created.id}`));
|
|
113
|
+
}
|
|
91
114
|
} catch (err) {
|
|
92
115
|
console.error('Failed to create warehouse:', err);
|
|
93
116
|
setError(
|
|
@@ -99,7 +122,7 @@ function NewWarehouseForm() {
|
|
|
99
122
|
|
|
100
123
|
return (
|
|
101
124
|
<PageLayout
|
|
102
|
-
title=
|
|
125
|
+
title={isEditing ? 'Edit Warehouse' : 'Add Warehouse'}
|
|
103
126
|
subtitle="Register a storage and fulfilment site"
|
|
104
127
|
icon={<Warehouse size={24} />}
|
|
105
128
|
headerActions={
|
|
@@ -108,7 +131,14 @@ function NewWarehouseForm() {
|
|
|
108
131
|
<ArrowLeft size={16} /> Cancel
|
|
109
132
|
</Button>
|
|
110
133
|
<Button onClick={handleSubmit} disabled={submitting}>
|
|
111
|
-
<Save size={16} />
|
|
134
|
+
<Save size={16} />{' '}
|
|
135
|
+
{isEditing
|
|
136
|
+
? submitting
|
|
137
|
+
? 'Saving...'
|
|
138
|
+
: 'Save Changes'
|
|
139
|
+
: submitting
|
|
140
|
+
? 'Saving...'
|
|
141
|
+
: 'Add Warehouse'}
|
|
112
142
|
</Button>
|
|
113
143
|
</div>
|
|
114
144
|
}
|
|
@@ -246,12 +276,14 @@ function NewWarehouseForm() {
|
|
|
246
276
|
export default function WarehouseDetailsPage() {
|
|
247
277
|
const { warehouseId } = useParams<{ warehouseId: string }>();
|
|
248
278
|
const { basePath, navigate } = useMoveTheWheels();
|
|
279
|
+
const isEditRoute = useLocation().pathname.endsWith('/edit');
|
|
249
280
|
const { warehouse, isLoading, error, refetch } = useWarehouse(warehouseId);
|
|
250
281
|
|
|
251
282
|
const goBack = () => navigate?.(joinPath(basePath, 'inventory/warehouses'));
|
|
252
283
|
const goTo = (path: string) => navigate?.(joinPath(basePath, path));
|
|
253
284
|
|
|
254
285
|
if (!warehouseId) return <NewWarehouseForm />;
|
|
286
|
+
if (isEditRoute) return <NewWarehouseForm editId={warehouseId} />;
|
|
255
287
|
if (isLoading) return <LoadingState message="Loading warehouse details..." />;
|
|
256
288
|
if (error || !warehouse) return <ErrorState title="Warehouse not found" onRetry={refetch} />;
|
|
257
289
|
|
|
@@ -267,7 +299,11 @@ export default function WarehouseDetailsPage() {
|
|
|
267
299
|
<Button variant="outline" onClick={goBack}>
|
|
268
300
|
<ArrowLeft size={16} /> Back
|
|
269
301
|
</Button>
|
|
270
|
-
<Button
|
|
302
|
+
<Button
|
|
303
|
+
onClick={() =>
|
|
304
|
+
navigate?.(joinPath(basePath, `inventory/warehouses/${warehouseId}/edit`))
|
|
305
|
+
}
|
|
306
|
+
>
|
|
271
307
|
<Edit size={16} /> Edit
|
|
272
308
|
</Button>
|
|
273
309
|
</div>
|
|
@@ -307,6 +307,7 @@ export interface Vehicle {
|
|
|
307
307
|
type: VehicleType;
|
|
308
308
|
make: string;
|
|
309
309
|
model: string;
|
|
310
|
+
licensePlate: string;
|
|
310
311
|
year: number;
|
|
311
312
|
capacity: {
|
|
312
313
|
weight: number;
|
|
@@ -339,6 +340,8 @@ export interface Driver {
|
|
|
339
340
|
id: string;
|
|
340
341
|
userId: string;
|
|
341
342
|
fullName: string;
|
|
343
|
+
email: string;
|
|
344
|
+
phone: string;
|
|
342
345
|
employeeId: string;
|
|
343
346
|
licenseNumber: string;
|
|
344
347
|
licenseType: string;
|