@burdenoff/microfe-movethewheels 2026.703.8 → 2026.704.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 (37) hide show
  1. package/dist/{CreateOrderPage-V8aXfcpN.js → CreateOrderPage-CXbhJLLz.js} +163 -138
  2. package/dist/{DashboardPage-DiD-cWwD.js → DashboardPage-BoswH3ec.js} +2 -2
  3. package/dist/DriverDetailsPage-CPO0G8Ki.js +518 -0
  4. package/dist/{DriversPage-DW-FGPFW.js → DriversPage-6Z61dpDI.js} +1 -1
  5. package/dist/{FleetPage-P9k4zZqP.js → FleetPage-qWRj7WFO.js} +1 -1
  6. package/dist/{InventoryPage-BWikjZMW.js → InventoryPage-DbR4Z--d.js} +1 -1
  7. package/dist/{LiveTrackingPage-UQBWlthJ.js → LiveTrackingPage-5U68u3oA.js} +1 -1
  8. package/dist/{OrderDetailsPage-2J4ua0wd.js → OrderDetailsPage-DRYifXm9.js} +1 -1
  9. package/dist/ProductDetailsPage-CWgcRqGR.js +375 -0
  10. package/dist/{ProductsPage-Bn1U2jTj.js → ProductsPage-CokwDOR2.js} +1 -1
  11. package/dist/{RouteDetailsPage-CgSY1CTd.js → RouteDetailsPage-BHQbFgI9.js} +242 -210
  12. package/dist/{SettingsPage-2a05Sq2k.js → SettingsPage-_6SIlcBX.js} +1 -1
  13. package/dist/{TrackingPage-SnjW6qeD.js → TrackingPage-Cg0tYGJe.js} +1 -1
  14. package/dist/{VehicleDetailsPage-CvRMJ2zC.js → VehicleDetailsPage-BbZlCFPo.js} +159 -135
  15. package/dist/{VehiclesPage-qxf-1C1B.js → VehiclesPage-BfBEyXGs.js} +1 -1
  16. package/dist/WarehouseDetailsPage-DxNhiaoI.js +515 -0
  17. package/dist/{WarehousesPage-44Wj7AGT.js → WarehousesPage-M3NaBT0z.js} +1 -1
  18. package/dist/index.js +25 -5
  19. package/dist/{useFleet-BXSocBD_.js → useFleet-BfA_-VUW.js} +100 -71
  20. package/dist/{useInventory-DmZficcp.js → useInventory-BO7TSgq_.js} +98 -72
  21. package/dist/{useSettings-CteNasBE.js → useSettings-BNNzQs_B.js} +1 -1
  22. package/dist/{useTracking-B7ttexRe.js → useTracking-7nd_XOSL.js} +1 -1
  23. package/package.json +1 -1
  24. package/src/movethewheels/MoveTheWheelsRoutes.tsx +5 -0
  25. package/src/movethewheels/hooks/useFleet.ts +113 -0
  26. package/src/movethewheels/hooks/useInventory.ts +86 -0
  27. package/src/movethewheels/hooks/useSettings.ts +8 -1
  28. package/src/movethewheels/pages/CreateOrderPage.tsx +48 -6
  29. package/src/movethewheels/pages/DriverDetailsPage.tsx +56 -18
  30. package/src/movethewheels/pages/ProductDetailsPage.tsx +51 -15
  31. package/src/movethewheels/pages/RouteDetailsPage.tsx +51 -7
  32. package/src/movethewheels/pages/VehicleDetailsPage.tsx +51 -15
  33. package/src/movethewheels/pages/WarehouseDetailsPage.tsx +46 -10
  34. package/src/movethewheels/types/index.ts +3 -0
  35. package/dist/DriverDetailsPage-DjaXaATQ.js +0 -490
  36. package/dist/ProductDetailsPage-BSjWLrty.js +0 -350
  37. 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
- const created = await createVehicle({
69
- vehicleNumber: form.vehicleNumber.trim(),
70
- type: form.type,
71
- make: form.make.trim() || undefined,
72
- model: form.model.trim() || undefined,
73
- licensePlate: form.licensePlate.trim() || undefined,
74
- });
75
- navigate?.(joinPath(basePath, `fleet/vehicles/${created.id}`));
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="Add Vehicle"
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} /> {submitting ? 'Saving...' : 'Add Vehicle'}
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 created = await createWarehouse({
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
- navigate?.(joinPath(basePath, `inventory/warehouses/${created.id}`));
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="Add Warehouse"
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} /> {submitting ? 'Saving...' : 'Add Warehouse'}
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;