@burdenoff/microfe-movethewheels 2026.614.1 → 2026.625.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-FGGTN-DA.js → AIAssistantPage-CNyoKtID.js} +8 -8
- package/dist/{AnalyticsPage-DSLYCnln.js → AnalyticsPage-Ck615ox7.js} +21 -21
- package/dist/{CreateOrderPage-BgjA_QFT.js → CreateOrderPage-C9Vb57Yn.js} +8 -8
- package/dist/{CustomerDetailsPage-Cfvfw12U.js → CustomerDetailsPage-BVkHRZvi.js} +24 -24
- package/dist/CustomersPage-DhQg-6h_.js +118 -0
- package/dist/{DashboardPage-BeyvN3Mr.js → DashboardPage-DTmyuC11.js} +134 -127
- package/dist/{DataTable-oNjXEcUO.js → DataTable-CfWvFw5B.js} +13 -13
- package/dist/{DriverDetailsPage-DGTUZG5S.js → DriverDetailsPage-DaaCQ-2O.js} +27 -27
- package/dist/DriversPage-D0RMBB_t.js +129 -0
- package/dist/{FinancePage-Cyi75iWa.js → FinancePage-BUXqW1IM.js} +11 -11
- package/dist/{FleetPage-Dlupg1NZ.js → FleetPage-DCfOmBa2.js} +74 -73
- package/dist/{ImportExportPage-D81vnXbH.js → ImportExportPage-BM1BoRcE.js} +9 -9
- package/dist/{InventoryPage-D0u2nxRd.js → InventoryPage-BW0QXWuf.js} +68 -73
- package/dist/{LiveTrackingPage-CKIlbMBA.js → LiveTrackingPage-DqcGXdkw.js} +26 -26
- package/dist/{MarketplacePage-3NpZ0_SK.js → MarketplacePage-DFqsxNYU.js} +13 -13
- package/dist/MetricCard-B7yMyvMX.js +146 -0
- package/dist/{OrderDetailsPage-BeGWzAws.js → OrderDetailsPage-Dx1m3cVA.js} +34 -34
- package/dist/{OrdersListPage-DczM6NXa.js → OrdersListPage-DHYBGrWf.js} +78 -79
- package/dist/{PageLayout-3DR4pMQ9.js → PageLayout-D3N8MCTm.js} +628 -568
- package/dist/{ProductDetailsPage-Czcrqe2F.js → ProductDetailsPage-DOXO90kb.js} +15 -15
- package/dist/{ProductsPage-DJhdrfox.js → ProductsPage-RLMTwWN0.js} +42 -40
- package/dist/{ReportsPage-DPqE4Q3D.js → ReportsPage-Df3hciPy.js} +10 -10
- package/dist/{RouteDetailsPage-j6ZczLRT.js → RouteDetailsPage-xzFDeR-X.js} +22 -22
- package/dist/{RoutesPage-OZM7lJDi.js → RoutesPage-DDFy1QVi.js} +32 -30
- package/dist/{SettingsPage-v6vRyIAp.js → SettingsPage-JH_-UPbf.js} +7 -7
- package/dist/{StatusBadge-elLZA4Wl.js → StatusBadge-CijYQXtb.js} +5 -2
- package/dist/{TrackingPage-CBmGvTW_.js → TrackingPage-CU0Vk4mx.js} +31 -31
- package/dist/{VehicleDetailsPage-DJXYkTN2.js → VehicleDetailsPage-P4xDttKw.js} +21 -21
- package/dist/VehiclesPage-tJZ64QKV.js +129 -0
- package/dist/{WarehouseDetailsPage-nMZvp56W.js → WarehouseDetailsPage-Bt_w2Yf7.js} +19 -19
- package/dist/{WarehousesPage-BcJ_QrK3.js → WarehousesPage-HsPpEFeG.js} +40 -35
- package/dist/arrow-left-CBpZKkpq.js +11 -0
- package/dist/{box-CnErOGkD.js → box-CAaiElsb.js} +2 -2
- package/dist/{chart-column-CFT0jC9N.js → chart-column-D1Ym15-S.js} +2 -2
- package/dist/chevron-right-BIFGi0UA.js +8 -0
- package/dist/{circle-alert-B2pZQFzu.js → circle-alert-DjmNo5_L.js} +2 -2
- package/dist/circle-check-big-CjuPVo3_.js +11 -0
- package/dist/{clock-DP-76dyQ.js → clock-BjkdnddD.js} +2 -2
- package/dist/{dollar-sign-CrwqdoEC.js → dollar-sign-IB4O0wuQ.js} +2 -2
- package/dist/{download-CQqBpPk5.js → download-Dpa9vqoG.js} +2 -2
- package/dist/{file-text-CnHcsdsc.js → file-text-C8Uioy11.js} +2 -2
- package/dist/filter-Da5OZaHI.js +8 -0
- package/dist/index.js +52 -50
- package/dist/{map-qljBUQ1N.js → map-_Per4sT9.js} +2 -2
- package/dist/{map-pin-4a-IA2NP.js → map-pin-BSaf5IDL.js} +2 -2
- package/dist/navigation-DaTbrhw2.js +8 -0
- package/dist/{package-CPePjBwW.js → package-BE7U0wQE.js} +2 -2
- package/dist/{phone-2rkA8w_3.js → phone-DV4StZiA.js} +2 -2
- package/dist/plus-Dl1rLeJR.js +11 -0
- package/dist/{refresh-cw-oWEqfHnS.js → refresh-cw-CWfERAit.js} +2 -2
- package/dist/{route-DBljW-z4.js → route-Dp9JiN_E.js} +2 -2
- package/dist/{save-Cjsx5R5Y.js → save-XH8vydOn.js} +2 -2
- package/dist/search-OxoIiL_C.js +13 -0
- package/dist/{settings-CX94mtOc.js → settings-3Rw5NwFF.js} +2 -2
- package/dist/{square-pen-BIgbw83U.js → square-pen-hLIbFQFV.js} +2 -2
- package/dist/{star-BW23nRLp.js → star-YsVV3MNQ.js} +2 -2
- package/dist/{store-Cdk0UEPT.js → store-RCBl7HB-.js} +2 -2
- package/dist/{trending-up-DYQ3Xns5.js → trending-up-C-85AwGT.js} +2 -2
- package/dist/{triangle-alert-Ck_oBZ7n.js → triangle-alert-BOhfGgmh.js} +2 -2
- package/dist/{truck-Cd54agV-.js → truck-CtDjNFbi.js} +2 -2
- package/dist/{user-CUEmQUkJ.js → user-Dz5TJZFs.js} +2 -2
- package/dist/{users-e-wRlQnX.js → users-g2N0eL-Z.js} +2 -2
- package/dist/{warehouse-DXnNb4kf.js → warehouse-D3WWDeTX.js} +2 -2
- package/dist/{wrench-DYJo0U8_.js → wrench-CmxY1n4I.js} +2 -2
- package/package.json +2 -2
- package/src/dev/main.tsx +4 -4
- package/src/movethewheels/MoveTheWheelsRoutes.tsx +1 -1
- package/src/movethewheels/components/DataTable.tsx +10 -10
- package/src/movethewheels/components/MetricCard.tsx +52 -23
- package/src/movethewheels/components/PageLayout.tsx +70 -15
- package/src/movethewheels/components/StatusBadge.tsx +2 -1
- package/src/movethewheels/components/ui.tsx +3 -3
- package/src/movethewheels/pages/AIAssistantPage.tsx +3 -3
- package/src/movethewheels/pages/AnalyticsPage.tsx +13 -13
- package/src/movethewheels/pages/CreateOrderPage.tsx +2 -2
- package/src/movethewheels/pages/CustomerDetailsPage.tsx +14 -14
- package/src/movethewheels/pages/CustomersPage.tsx +14 -13
- package/src/movethewheels/pages/DashboardPage.tsx +71 -64
- package/src/movethewheels/pages/DriverDetailsPage.tsx +17 -17
- package/src/movethewheels/pages/DriversPage.tsx +12 -15
- package/src/movethewheels/pages/FinancePage.tsx +4 -4
- package/src/movethewheels/pages/FleetPage.tsx +23 -18
- package/src/movethewheels/pages/ImportExportPage.tsx +5 -5
- package/src/movethewheels/pages/InventoryPage.tsx +25 -18
- package/src/movethewheels/pages/LiveTrackingPage.tsx +18 -18
- package/src/movethewheels/pages/MarketplacePage.tsx +6 -6
- package/src/movethewheels/pages/OrderDetailsPage.tsx +20 -20
- package/src/movethewheels/pages/OrdersListPage.tsx +22 -16
- package/src/movethewheels/pages/ProductDetailsPage.tsx +8 -8
- package/src/movethewheels/pages/ProductsPage.tsx +10 -13
- package/src/movethewheels/pages/ReportsPage.tsx +5 -5
- package/src/movethewheels/pages/RouteDetailsPage.tsx +13 -13
- package/src/movethewheels/pages/RoutesPage.tsx +12 -9
- package/src/movethewheels/pages/SettingsPage.tsx +2 -2
- package/src/movethewheels/pages/TrackingPage.tsx +23 -23
- package/src/movethewheels/pages/VehicleDetailsPage.tsx +13 -13
- package/src/movethewheels/pages/VehiclesPage.tsx +11 -17
- package/src/movethewheels/pages/WarehouseDetailsPage.tsx +11 -11
- package/src/movethewheels/pages/WarehousesPage.tsx +11 -12
- package/dist/CustomersPage-DXnx04Au.js +0 -119
- package/dist/DriversPage-CRursDRZ.js +0 -127
- package/dist/MetricCard-BDcT-7Ei.js +0 -135
- package/dist/VehiclesPage-r_snhuEj.js +0 -127
- package/dist/arrow-left-Crb7WKr1.js +0 -11
- package/dist/chevron-right-Bzo6Rr8_.js +0 -8
- package/dist/circle-check-big-R_fjEgxM.js +0 -11
- package/dist/filter-CgTF21j9.js +0 -8
- package/dist/navigation-CqRTj3vI.js +0 -8
- package/dist/plus-Dew5yoQK.js +0 -11
- package/dist/search-FWYzDbBx.js +0 -13
|
@@ -124,17 +124,17 @@ export default function OrderDetailsPage() {
|
|
|
124
124
|
<div>
|
|
125
125
|
<h4 className="font-medium mb-2">{order.customerInfo.name}</h4>
|
|
126
126
|
{order.customerInfo.company && (
|
|
127
|
-
<p className="text-sm text-
|
|
127
|
+
<p className="text-sm text-text-secondary mb-2">
|
|
128
128
|
{order.customerInfo.company}
|
|
129
129
|
</p>
|
|
130
130
|
)}
|
|
131
131
|
<div className="space-y-1 text-sm">
|
|
132
132
|
<p className="flex items-center gap-2">
|
|
133
|
-
<Mail size={14} className="text-
|
|
133
|
+
<Mail size={14} className="text-text-secondary" />
|
|
134
134
|
{order.customerInfo.email}
|
|
135
135
|
</p>
|
|
136
136
|
<p className="flex items-center gap-2">
|
|
137
|
-
<Phone size={14} className="text-
|
|
137
|
+
<Phone size={14} className="text-text-secondary" />
|
|
138
138
|
{order.customerInfo.phone}
|
|
139
139
|
</p>
|
|
140
140
|
</div>
|
|
@@ -142,13 +142,13 @@ export default function OrderDetailsPage() {
|
|
|
142
142
|
<div>
|
|
143
143
|
{order.customerInfo.preferredDeliveryTime && (
|
|
144
144
|
<div className="mb-2">
|
|
145
|
-
<p className="text-sm text-
|
|
145
|
+
<p className="text-sm text-text-secondary">Preferred Delivery Time</p>
|
|
146
146
|
<p className="text-sm">{order.customerInfo.preferredDeliveryTime}</p>
|
|
147
147
|
</div>
|
|
148
148
|
)}
|
|
149
149
|
{order.customerInfo.deliveryInstructions && (
|
|
150
150
|
<div>
|
|
151
|
-
<p className="text-sm text-
|
|
151
|
+
<p className="text-sm text-text-secondary">Delivery Instructions</p>
|
|
152
152
|
<p className="text-sm">{order.customerInfo.deliveryInstructions}</p>
|
|
153
153
|
</div>
|
|
154
154
|
)}
|
|
@@ -173,7 +173,7 @@ export default function OrderDetailsPage() {
|
|
|
173
173
|
</h4>
|
|
174
174
|
<p className="text-sm">{formatAddress(order.pickupAddress)}</p>
|
|
175
175
|
{order.scheduledPickup && (
|
|
176
|
-
<p className="text-sm text-
|
|
176
|
+
<p className="text-sm text-text-secondary mt-2">
|
|
177
177
|
Scheduled: {formatDate(order.scheduledPickup, 'full')}
|
|
178
178
|
</p>
|
|
179
179
|
)}
|
|
@@ -190,7 +190,7 @@ export default function OrderDetailsPage() {
|
|
|
190
190
|
</h4>
|
|
191
191
|
<p className="text-sm">{formatAddress(order.deliveryAddress)}</p>
|
|
192
192
|
{order.scheduledDelivery && (
|
|
193
|
-
<p className="text-sm text-
|
|
193
|
+
<p className="text-sm text-text-secondary mt-2">
|
|
194
194
|
Scheduled: {formatDate(order.scheduledDelivery, 'full')}
|
|
195
195
|
</p>
|
|
196
196
|
)}
|
|
@@ -231,7 +231,7 @@ export default function OrderDetailsPage() {
|
|
|
231
231
|
<div>
|
|
232
232
|
<p className="font-medium">{item.name}</p>
|
|
233
233
|
{item.description && (
|
|
234
|
-
<p className="text-sm text-
|
|
234
|
+
<p className="text-sm text-text-secondary">{item.description}</p>
|
|
235
235
|
)}
|
|
236
236
|
</div>
|
|
237
237
|
</TableCell>
|
|
@@ -261,7 +261,7 @@ export default function OrderDetailsPage() {
|
|
|
261
261
|
{order.timeline.map((event, index) => (
|
|
262
262
|
<div key={index} className="flex gap-4 pb-6 last:pb-0">
|
|
263
263
|
<div className="relative">
|
|
264
|
-
<div className="w-3 h-3 rounded-full bg-primary mt-1.5" />
|
|
264
|
+
<div className="w-3 h-3 rounded-full bg-action-primary-bg mt-1.5" />
|
|
265
265
|
{index < order.timeline.length - 1 && (
|
|
266
266
|
<div className="absolute top-4 left-1.5 w-px h-full -ml-px bg-border" />
|
|
267
267
|
)}
|
|
@@ -269,12 +269,12 @@ export default function OrderDetailsPage() {
|
|
|
269
269
|
<div className="flex-1">
|
|
270
270
|
<div className="flex items-center gap-2 mb-1">
|
|
271
271
|
<StatusBadge status={event.status} type="order" size="sm" />
|
|
272
|
-
<span className="text-sm text-
|
|
272
|
+
<span className="text-sm text-text-secondary">
|
|
273
273
|
{formatDate(event.timestamp, 'full')}
|
|
274
274
|
</span>
|
|
275
275
|
</div>
|
|
276
276
|
{event.notes && <p className="text-sm">{event.notes}</p>}
|
|
277
|
-
<p className="text-xs text-
|
|
277
|
+
<p className="text-xs text-text-secondary">by {event.performedBy}</p>
|
|
278
278
|
</div>
|
|
279
279
|
</div>
|
|
280
280
|
))}
|
|
@@ -296,25 +296,25 @@ export default function OrderDetailsPage() {
|
|
|
296
296
|
<CardContent>
|
|
297
297
|
<div className="space-y-3">
|
|
298
298
|
<div className="flex justify-between text-sm">
|
|
299
|
-
<span className="text-
|
|
299
|
+
<span className="text-text-secondary">Subtotal</span>
|
|
300
300
|
<span>{formatCurrency(order.pricing.subtotal)}</span>
|
|
301
301
|
</div>
|
|
302
302
|
<div className="flex justify-between text-sm">
|
|
303
|
-
<span className="text-
|
|
303
|
+
<span className="text-text-secondary">Delivery</span>
|
|
304
304
|
<span>{formatCurrency(order.pricing.fees.delivery)}</span>
|
|
305
305
|
</div>
|
|
306
306
|
<div className="flex justify-between text-sm">
|
|
307
|
-
<span className="text-
|
|
307
|
+
<span className="text-text-secondary">Handling</span>
|
|
308
308
|
<span>{formatCurrency(order.pricing.fees.handling)}</span>
|
|
309
309
|
</div>
|
|
310
310
|
{order.pricing.fees.insurance && (
|
|
311
311
|
<div className="flex justify-between text-sm">
|
|
312
|
-
<span className="text-
|
|
312
|
+
<span className="text-text-secondary">Insurance</span>
|
|
313
313
|
<span>{formatCurrency(order.pricing.fees.insurance)}</span>
|
|
314
314
|
</div>
|
|
315
315
|
)}
|
|
316
316
|
<div className="flex justify-between text-sm">
|
|
317
|
-
<span className="text-
|
|
317
|
+
<span className="text-text-secondary">Taxes</span>
|
|
318
318
|
<span>{formatCurrency(order.pricing.taxes)}</span>
|
|
319
319
|
</div>
|
|
320
320
|
<Separator />
|
|
@@ -323,7 +323,7 @@ export default function OrderDetailsPage() {
|
|
|
323
323
|
<span className="text-lg">{formatCurrency(order.pricing.total)}</span>
|
|
324
324
|
</div>
|
|
325
325
|
<div className="pt-2">
|
|
326
|
-
<p className="text-sm text-
|
|
326
|
+
<p className="text-sm text-text-secondary">Payment Method</p>
|
|
327
327
|
<p className="text-sm capitalize">
|
|
328
328
|
{order.pricing.paymentMethod.replace('_', ' ')}
|
|
329
329
|
</p>
|
|
@@ -343,15 +343,15 @@ export default function OrderDetailsPage() {
|
|
|
343
343
|
<CardContent>
|
|
344
344
|
<div className="space-y-4">
|
|
345
345
|
<div>
|
|
346
|
-
<p className="text-sm text-
|
|
346
|
+
<p className="text-sm text-text-secondary">Driver</p>
|
|
347
347
|
<p className="text-sm">{order.driverId || 'Not assigned'}</p>
|
|
348
348
|
</div>
|
|
349
349
|
<div>
|
|
350
|
-
<p className="text-sm text-
|
|
350
|
+
<p className="text-sm text-text-secondary">Vehicle</p>
|
|
351
351
|
<p className="text-sm">{order.vehicleId || 'Not assigned'}</p>
|
|
352
352
|
</div>
|
|
353
353
|
<div>
|
|
354
|
-
<p className="text-sm text-
|
|
354
|
+
<p className="text-sm text-text-secondary">Tracking Number</p>
|
|
355
355
|
<p className="text-sm font-mono">{order.trackingNumber}</p>
|
|
356
356
|
</div>
|
|
357
357
|
<Button
|
|
@@ -9,6 +9,7 @@ import { Package, Plus, Filter, Download, RefreshCw } from 'lucide-react';
|
|
|
9
9
|
import { PageLayout } from '../components/PageLayout';
|
|
10
10
|
import { DataTable, type Column } from '../components/DataTable';
|
|
11
11
|
import { StatusBadge, PriorityBadge, TypeBadge } from '../components/StatusBadge';
|
|
12
|
+
import { CTAOverflowMenu } from '@burdenoff/fe-libs/ui';
|
|
12
13
|
import {
|
|
13
14
|
Button,
|
|
14
15
|
Card,
|
|
@@ -67,7 +68,7 @@ export default function OrdersListPage() {
|
|
|
67
68
|
cell: (row) => (
|
|
68
69
|
<div className="min-w-0">
|
|
69
70
|
<p className="font-medium truncate">{row.customerInfo.name}</p>
|
|
70
|
-
<p className="text-sm text-
|
|
71
|
+
<p className="text-sm text-text-secondary truncate">{row.customerInfo.email}</p>
|
|
71
72
|
</div>
|
|
72
73
|
),
|
|
73
74
|
},
|
|
@@ -152,20 +153,25 @@ export default function OrdersListPage() {
|
|
|
152
153
|
subtitle={`${totalOrders} ${t('movethewheels.orders.subtitle', 'total orders')}`}
|
|
153
154
|
icon={<Package size={24} />}
|
|
154
155
|
headerActions={
|
|
155
|
-
<
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
{
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
{
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
156
|
+
<CTAOverflowMenu
|
|
157
|
+
primary={{
|
|
158
|
+
label: t('movethewheels.orders.actions.newOrder', 'New Order'),
|
|
159
|
+
icon: <Plus size={16} />,
|
|
160
|
+
onSelect: () => goTo('orders/new'),
|
|
161
|
+
}}
|
|
162
|
+
actions={[
|
|
163
|
+
{
|
|
164
|
+
label: t('movethewheels.orders.actions.refresh', 'Refresh'),
|
|
165
|
+
icon: <RefreshCw size={16} />,
|
|
166
|
+
onSelect: () => refetch(),
|
|
167
|
+
},
|
|
168
|
+
{
|
|
169
|
+
label: t('movethewheels.orders.actions.export', 'Export'),
|
|
170
|
+
icon: <Download size={16} />,
|
|
171
|
+
onSelect: () => {},
|
|
172
|
+
},
|
|
173
|
+
]}
|
|
174
|
+
/>
|
|
169
175
|
}
|
|
170
176
|
>
|
|
171
177
|
{/* Filters */}
|
|
@@ -173,7 +179,7 @@ export default function OrdersListPage() {
|
|
|
173
179
|
<CardContent className="p-4">
|
|
174
180
|
<div className="flex flex-wrap items-center gap-4">
|
|
175
181
|
<div className="flex items-center gap-2">
|
|
176
|
-
<Filter size={16} className="text-
|
|
182
|
+
<Filter size={16} className="text-text-secondary" />
|
|
177
183
|
<span className="text-sm font-medium">
|
|
178
184
|
{t('movethewheels.orders.filters.label', 'Filters:')}
|
|
179
185
|
</span>
|
|
@@ -66,28 +66,28 @@ export default function ProductDetailsPage() {
|
|
|
66
66
|
<CardContent>
|
|
67
67
|
<div className="grid grid-cols-2 md:grid-cols-4 gap-4">
|
|
68
68
|
<div>
|
|
69
|
-
<p className="text-sm text-
|
|
69
|
+
<p className="text-sm text-text-secondary">Length</p>
|
|
70
70
|
<p className="text-2xl font-bold">
|
|
71
71
|
{product.dimensions.length}
|
|
72
72
|
<span className="text-sm font-normal"> {product.dimensions.unit}</span>
|
|
73
73
|
</p>
|
|
74
74
|
</div>
|
|
75
75
|
<div>
|
|
76
|
-
<p className="text-sm text-
|
|
76
|
+
<p className="text-sm text-text-secondary">Width</p>
|
|
77
77
|
<p className="text-2xl font-bold">
|
|
78
78
|
{product.dimensions.width}
|
|
79
79
|
<span className="text-sm font-normal"> {product.dimensions.unit}</span>
|
|
80
80
|
</p>
|
|
81
81
|
</div>
|
|
82
82
|
<div>
|
|
83
|
-
<p className="text-sm text-
|
|
83
|
+
<p className="text-sm text-text-secondary">Height</p>
|
|
84
84
|
<p className="text-2xl font-bold">
|
|
85
85
|
{product.dimensions.height}
|
|
86
86
|
<span className="text-sm font-normal"> {product.dimensions.unit}</span>
|
|
87
87
|
</p>
|
|
88
88
|
</div>
|
|
89
89
|
<div>
|
|
90
|
-
<p className="text-sm text-
|
|
90
|
+
<p className="text-sm text-text-secondary">Weight</p>
|
|
91
91
|
<p className="text-2xl font-bold">
|
|
92
92
|
{product.weight}
|
|
93
93
|
<span className="text-sm font-normal"> kg</span>
|
|
@@ -108,7 +108,7 @@ export default function ProductDetailsPage() {
|
|
|
108
108
|
<div className="grid grid-cols-2 md:grid-cols-3 gap-4">
|
|
109
109
|
{product.attributes.map((attr, i) => (
|
|
110
110
|
<div key={i}>
|
|
111
|
-
<p className="text-sm text-
|
|
111
|
+
<p className="text-sm text-text-secondary">{attr.name}</p>
|
|
112
112
|
<p className="font-medium">{attr.value}</p>
|
|
113
113
|
</div>
|
|
114
114
|
))}
|
|
@@ -127,7 +127,7 @@ export default function ProductDetailsPage() {
|
|
|
127
127
|
</CardHeader>
|
|
128
128
|
<CardContent>
|
|
129
129
|
<p className="text-3xl font-bold">{formatCurrency(product.value)}</p>
|
|
130
|
-
<p className="text-sm text-
|
|
130
|
+
<p className="text-sm text-text-secondary">Unit price</p>
|
|
131
131
|
</CardContent>
|
|
132
132
|
</Card>
|
|
133
133
|
|
|
@@ -137,12 +137,12 @@ export default function ProductDetailsPage() {
|
|
|
137
137
|
</CardHeader>
|
|
138
138
|
<CardContent className="space-y-3">
|
|
139
139
|
<div>
|
|
140
|
-
<p className="text-sm text-
|
|
140
|
+
<p className="text-sm text-text-secondary">SKU</p>
|
|
141
141
|
<p className="font-mono">{product.sku}</p>
|
|
142
142
|
</div>
|
|
143
143
|
{product.barcode && (
|
|
144
144
|
<div>
|
|
145
|
-
<p className="text-sm text-
|
|
145
|
+
<p className="text-sm text-text-secondary">Barcode</p>
|
|
146
146
|
<p className="font-mono">{product.barcode}</p>
|
|
147
147
|
</div>
|
|
148
148
|
)}
|
|
@@ -5,7 +5,8 @@
|
|
|
5
5
|
import { Package, Plus, RefreshCw, Download } from 'lucide-react';
|
|
6
6
|
import { PageLayout } from '../components/PageLayout';
|
|
7
7
|
import { DataTable, type Column } from '../components/DataTable';
|
|
8
|
-
import {
|
|
8
|
+
import { Badge } from '../components/ui';
|
|
9
|
+
import { CTAOverflowMenu } from '@burdenoff/fe-libs/ui';
|
|
9
10
|
import { useProducts } from '../hooks/useInventory';
|
|
10
11
|
import { useMoveTheWheels } from '../providers/MoveTheWheelsProvider';
|
|
11
12
|
import { formatCurrency } from '../utils/formatters';
|
|
@@ -34,7 +35,7 @@ export default function ProductsPage() {
|
|
|
34
35
|
cell: (row) => (
|
|
35
36
|
<div>
|
|
36
37
|
<p className="font-medium">{row.name}</p>
|
|
37
|
-
<p className="text-sm text-
|
|
38
|
+
<p className="text-sm text-text-secondary line-clamp-1">{row.description}</p>
|
|
38
39
|
</div>
|
|
39
40
|
),
|
|
40
41
|
},
|
|
@@ -96,17 +97,13 @@ export default function ProductsPage() {
|
|
|
96
97
|
subtitle={`${totalProducts} products`}
|
|
97
98
|
icon={<Package size={24} />}
|
|
98
99
|
headerActions={
|
|
99
|
-
<
|
|
100
|
-
<
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
<Button>
|
|
107
|
-
<Plus size={16} /> Add Product
|
|
108
|
-
</Button>
|
|
109
|
-
</div>
|
|
100
|
+
<CTAOverflowMenu
|
|
101
|
+
primary={{ label: 'Add Product', icon: <Plus size={16} />, onSelect: () => {} }}
|
|
102
|
+
actions={[
|
|
103
|
+
{ label: 'Refresh', icon: <RefreshCw size={16} />, onSelect: () => refetch() },
|
|
104
|
+
{ label: 'Export', icon: <Download size={16} />, onSelect: () => {} },
|
|
105
|
+
]}
|
|
106
|
+
/>
|
|
110
107
|
}
|
|
111
108
|
>
|
|
112
109
|
<DataTable
|
|
@@ -95,18 +95,18 @@ export default function ReportsPage() {
|
|
|
95
95
|
<CardContent className="p-4">
|
|
96
96
|
<div className="flex items-center justify-between">
|
|
97
97
|
<div className="flex items-center gap-3">
|
|
98
|
-
<div className="w-10 h-10 rounded-lg bg-primary/10 flex items-center justify-center">
|
|
98
|
+
<div className="w-10 h-10 rounded-lg bg-action-primary-bg/10 flex items-center justify-center">
|
|
99
99
|
<FileBarChart size={20} className="text-primary" />
|
|
100
100
|
</div>
|
|
101
101
|
<div>
|
|
102
102
|
<p className="font-medium">{report.name}</p>
|
|
103
|
-
<p className="text-sm text-
|
|
103
|
+
<p className="text-sm text-text-secondary">{report.description}</p>
|
|
104
104
|
</div>
|
|
105
105
|
</div>
|
|
106
106
|
<div className="flex items-center gap-3">
|
|
107
107
|
<div className="text-right">
|
|
108
108
|
<Badge variant="outline">{report.frequency}</Badge>
|
|
109
|
-
<p className="text-xs text-
|
|
109
|
+
<p className="text-xs text-text-secondary mt-1">
|
|
110
110
|
Last: {report.lastGenerated}
|
|
111
111
|
</p>
|
|
112
112
|
</div>
|
|
@@ -131,8 +131,8 @@ export default function ReportsPage() {
|
|
|
131
131
|
{scheduledReports.map((report) => (
|
|
132
132
|
<div key={report.name} className="p-3 border rounded-lg">
|
|
133
133
|
<p className="font-medium">{report.name}</p>
|
|
134
|
-
<p className="text-sm text-
|
|
135
|
-
<p className="text-xs text-
|
|
134
|
+
<p className="text-sm text-text-secondary">Next: {report.nextRun}</p>
|
|
135
|
+
<p className="text-xs text-text-secondary">{report.recipients} recipients</p>
|
|
136
136
|
</div>
|
|
137
137
|
))}
|
|
138
138
|
<Button variant="outline" className="w-full">
|
|
@@ -35,7 +35,7 @@ export default function RouteDetailsPage() {
|
|
|
35
35
|
>
|
|
36
36
|
<Card>
|
|
37
37
|
<CardContent className="p-8 text-center">
|
|
38
|
-
<p className="text-
|
|
38
|
+
<p className="text-text-secondary">Route creation form would go here</p>
|
|
39
39
|
</CardContent>
|
|
40
40
|
</Card>
|
|
41
41
|
</PageLayout>
|
|
@@ -97,8 +97,8 @@ export default function RouteDetailsPage() {
|
|
|
97
97
|
<CardTitle>Route Map</CardTitle>
|
|
98
98
|
</CardHeader>
|
|
99
99
|
<CardContent>
|
|
100
|
-
<div className="aspect-video bg-
|
|
101
|
-
<div className="text-center text-
|
|
100
|
+
<div className="aspect-video bg-bg-sunken rounded-lg flex items-center justify-center">
|
|
101
|
+
<div className="text-center text-text-secondary">
|
|
102
102
|
<MapPin size={48} className="mx-auto mb-2 opacity-50" />
|
|
103
103
|
<p>Route map visualization</p>
|
|
104
104
|
</div>
|
|
@@ -116,7 +116,7 @@ export default function RouteDetailsPage() {
|
|
|
116
116
|
<div key={stop.id} className="flex gap-4">
|
|
117
117
|
<div className="relative">
|
|
118
118
|
<div
|
|
119
|
-
className={`w-8 h-8 rounded-full flex items-center justify-center ${stop.status === 'completed' ? 'bg-green-500 text-white' : 'bg-
|
|
119
|
+
className={`w-8 h-8 rounded-full flex items-center justify-center ${stop.status === 'completed' ? 'bg-green-500 text-white' : 'bg-bg-sunken'}`}
|
|
120
120
|
>
|
|
121
121
|
{stop.status === 'completed' ? <CheckCircle size={16} /> : stop.sequence}
|
|
122
122
|
</div>
|
|
@@ -136,7 +136,7 @@ export default function RouteDetailsPage() {
|
|
|
136
136
|
</Badge>
|
|
137
137
|
<span className="font-medium">Order #{stop.orderId}</span>
|
|
138
138
|
</div>
|
|
139
|
-
<p className="text-sm text-
|
|
139
|
+
<p className="text-sm text-text-secondary mt-1">
|
|
140
140
|
{formatAddress(stop.address)}
|
|
141
141
|
</p>
|
|
142
142
|
</div>
|
|
@@ -149,7 +149,7 @@ export default function RouteDetailsPage() {
|
|
|
149
149
|
Actual: {formatDate(stop.actualTime, 'time')}
|
|
150
150
|
</p>
|
|
151
151
|
)}
|
|
152
|
-
<p className="text-xs text-
|
|
152
|
+
<p className="text-xs text-text-secondary">{stop.duration} min stop</p>
|
|
153
153
|
</div>
|
|
154
154
|
</div>
|
|
155
155
|
</div>
|
|
@@ -167,14 +167,14 @@ export default function RouteDetailsPage() {
|
|
|
167
167
|
</CardHeader>
|
|
168
168
|
<CardContent className="space-y-4">
|
|
169
169
|
<div>
|
|
170
|
-
<p className="text-sm text-
|
|
170
|
+
<p className="text-sm text-text-secondary">Total Distance</p>
|
|
171
171
|
<p className="text-2xl font-bold">
|
|
172
172
|
{route.distance.toFixed(1)}
|
|
173
173
|
<span className="text-sm font-normal"> km</span>
|
|
174
174
|
</p>
|
|
175
175
|
</div>
|
|
176
176
|
<div>
|
|
177
|
-
<p className="text-sm text-
|
|
177
|
+
<p className="text-sm text-text-secondary">Est. Duration</p>
|
|
178
178
|
<p className="text-2xl font-bold">
|
|
179
179
|
{route.estimatedDuration}
|
|
180
180
|
<span className="text-sm font-normal"> min</span>
|
|
@@ -182,7 +182,7 @@ export default function RouteDetailsPage() {
|
|
|
182
182
|
</div>
|
|
183
183
|
{route.actualDuration && (
|
|
184
184
|
<div>
|
|
185
|
-
<p className="text-sm text-
|
|
185
|
+
<p className="text-sm text-text-secondary">Actual Duration</p>
|
|
186
186
|
<p className="text-2xl font-bold">
|
|
187
187
|
{route.actualDuration}
|
|
188
188
|
<span className="text-sm font-normal"> min</span>
|
|
@@ -201,18 +201,18 @@ export default function RouteDetailsPage() {
|
|
|
201
201
|
<CardContent className="space-y-3">
|
|
202
202
|
{route.startTime && (
|
|
203
203
|
<div>
|
|
204
|
-
<p className="text-sm text-
|
|
204
|
+
<p className="text-sm text-text-secondary">Started</p>
|
|
205
205
|
<p>{formatDate(route.startTime, 'full')}</p>
|
|
206
206
|
</div>
|
|
207
207
|
)}
|
|
208
208
|
{route.endTime && (
|
|
209
209
|
<div>
|
|
210
|
-
<p className="text-sm text-
|
|
210
|
+
<p className="text-sm text-text-secondary">Completed</p>
|
|
211
211
|
<p>{formatDate(route.endTime, 'full')}</p>
|
|
212
212
|
</div>
|
|
213
213
|
)}
|
|
214
214
|
<div>
|
|
215
|
-
<p className="text-sm text-
|
|
215
|
+
<p className="text-sm text-text-secondary">Created</p>
|
|
216
216
|
<p>{formatDate(route.createdAt, 'full')}</p>
|
|
217
217
|
</div>
|
|
218
218
|
</CardContent>
|
|
@@ -230,7 +230,7 @@ export default function RouteDetailsPage() {
|
|
|
230
230
|
className={`p-2 rounded mb-2 ${tc.condition === 'severe' ? 'bg-red-50' : tc.condition === 'heavy' ? 'bg-orange-50' : 'bg-yellow-50'}`}
|
|
231
231
|
>
|
|
232
232
|
<p className="text-sm font-medium capitalize">{tc.condition} traffic</p>
|
|
233
|
-
<p className="text-xs text-
|
|
233
|
+
<p className="text-xs text-text-secondary">
|
|
234
234
|
{tc.location} - +{tc.delay} min delay
|
|
235
235
|
</p>
|
|
236
236
|
</div>
|
|
@@ -6,7 +6,8 @@ import { Plus, RefreshCw, Navigation } from 'lucide-react';
|
|
|
6
6
|
import { PageLayout } from '../components/PageLayout';
|
|
7
7
|
import { DataTable, type Column } from '../components/DataTable';
|
|
8
8
|
import { StatusBadge } from '../components/StatusBadge';
|
|
9
|
-
import {
|
|
9
|
+
import { Badge } from '../components/ui';
|
|
10
|
+
import { CTAOverflowMenu } from '@burdenoff/fe-libs/ui';
|
|
10
11
|
import { useRoutes } from '../hooks/useRoutes';
|
|
11
12
|
import { useMoveTheWheels } from '../providers/MoveTheWheelsProvider';
|
|
12
13
|
import { formatDate } from '../utils/formatters';
|
|
@@ -79,14 +80,16 @@ export default function RoutesPage() {
|
|
|
79
80
|
subtitle={`${totalRoutes} routes`}
|
|
80
81
|
icon={<Navigation size={24} />}
|
|
81
82
|
headerActions={
|
|
82
|
-
<
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
83
|
+
<CTAOverflowMenu
|
|
84
|
+
primary={{
|
|
85
|
+
label: 'Create Route',
|
|
86
|
+
icon: <Plus size={16} />,
|
|
87
|
+
onSelect: () => goTo('routes/new'),
|
|
88
|
+
}}
|
|
89
|
+
actions={[
|
|
90
|
+
{ label: 'Refresh', icon: <RefreshCw size={16} />, onSelect: () => refetch() },
|
|
91
|
+
]}
|
|
92
|
+
/>
|
|
90
93
|
}
|
|
91
94
|
>
|
|
92
95
|
<DataTable
|
|
@@ -143,7 +143,7 @@ export default function SettingsPage() {
|
|
|
143
143
|
<div key={item.label} className="flex items-center justify-between">
|
|
144
144
|
<div>
|
|
145
145
|
<p className="font-medium">{item.label}</p>
|
|
146
|
-
<p className="text-sm text-
|
|
146
|
+
<p className="text-sm text-text-secondary">{item.desc}</p>
|
|
147
147
|
</div>
|
|
148
148
|
<Switch defaultChecked />
|
|
149
149
|
</div>
|
|
@@ -200,7 +200,7 @@ export default function SettingsPage() {
|
|
|
200
200
|
<CardDescription>Manage your API access</CardDescription>
|
|
201
201
|
</CardHeader>
|
|
202
202
|
<CardContent className="space-y-4">
|
|
203
|
-
<div className="p-4 bg-
|
|
203
|
+
<div className="p-4 bg-bg-sunken rounded-lg">
|
|
204
204
|
<p className="font-medium">Production API Key</p>
|
|
205
205
|
<code className="text-sm">pk_live_••••••••••••••••</code>
|
|
206
206
|
</div>
|