diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index 945c56c..2f6c58c 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -27,6 +27,7 @@ const StationsMobileScreen = lazy(() => import('./features/stations/mobile/Stati const VehiclesMobileScreen = lazy(() => import('./features/vehicles/mobile/VehiclesMobileScreen').then(m => ({ default: m.VehiclesMobileScreen }))); const VehicleDetailMobile = lazy(() => import('./features/vehicles/mobile/VehicleDetailMobile').then(m => ({ default: m.VehicleDetailMobile }))); const DocumentsMobileScreen = lazy(() => import('./features/documents/mobile/DocumentsMobileScreen')); +const MaintenanceMobileScreen = lazy(() => import('./features/maintenance/mobile/MaintenanceMobileScreen')); // Admin pages (lazy-loaded) const AdminUsersPage = lazy(() => import('./pages/admin/AdminUsersPage').then(m => ({ default: m.AdminUsersPage }))); @@ -633,7 +634,12 @@ function App() { setShowAddVehicle(true)} + onViewMaintenance={() => navigateToScreen('Maintenance', { source: 'dashboard-maintenance' })} + onAddVehicle={() => { + setShowAddVehicle(true); + navigateToScreen('Vehicles', { source: 'dashboard-add-vehicle' }); + navigateToVehicleSubScreen('add', undefined, { source: 'dashboard-add-vehicle' }); + }} /> @@ -685,6 +691,31 @@ function App() { )} + {activeScreen === "Maintenance" && ( + + + + +
+
+ Loading maintenance screen... +
+
+
+ + }> + +
+
+
+ )} {activeScreen === "Settings" && ( { + const queryClient = useQueryClient(); + const { records, schedules, isRecordsLoading, isSchedulesLoading, recordsError, schedulesError, updateRecord, deleteRecord, updateSchedule, deleteSchedule } = useMaintenanceRecords(); + + const [activeTab, setActiveTab] = useState<'records' | 'schedules'>('records'); + const [showForm, setShowForm] = useState(false); + const [editingRecord, setEditingRecord] = useState(null); + const [editDialogOpen, setEditDialogOpen] = useState(false); + const [editingSchedule, setEditingSchedule] = useState(null); + const [scheduleEditDialogOpen, setScheduleEditDialogOpen] = useState(false); + + const handleEdit = (record: MaintenanceRecordResponse) => { + setEditingRecord(record); + setEditDialogOpen(true); + }; + + const handleEditSave = async (id: string, data: UpdateMaintenanceRecordRequest) => { + try { + await updateRecord({ id, data }); + queryClient.refetchQueries({ queryKey: ['maintenanceRecords'] }); + setEditDialogOpen(false); + setEditingRecord(null); + } catch (error) { + console.error('Failed to update maintenance record:', error); + throw error; + } + }; + + const handleEditClose = () => { + setEditDialogOpen(false); + setEditingRecord(null); + }; + + const handleDelete = async (recordId: string) => { + try { + await deleteRecord(recordId); + queryClient.refetchQueries({ queryKey: ['maintenanceRecords', 'all'] }); + } catch (error) { + console.error('Failed to delete maintenance record:', error); + } + }; + + const handleScheduleEdit = (schedule: MaintenanceScheduleResponse) => { + setEditingSchedule(schedule); + setScheduleEditDialogOpen(true); + }; + + const handleScheduleEditSave = async (id: string, data: UpdateScheduleRequest) => { + try { + await updateSchedule({ id, data }); + queryClient.refetchQueries({ queryKey: ['maintenanceSchedules'] }); + setScheduleEditDialogOpen(false); + setEditingSchedule(null); + } catch (error) { + console.error('Failed to update maintenance schedule:', error); + throw error; + } + }; + + const handleScheduleEditClose = () => { + setScheduleEditDialogOpen(false); + setEditingSchedule(null); + }; + + const handleScheduleDelete = async (scheduleId: string) => { + try { + await deleteSchedule(scheduleId); + queryClient.refetchQueries({ queryKey: ['maintenanceSchedules'] }); + } catch (error) { + console.error('Failed to delete maintenance schedule:', error); + } + }; + + const isLoading = activeTab === 'records' ? isRecordsLoading : isSchedulesLoading; + const hasError = activeTab === 'records' ? recordsError : schedulesError; + + return ( +
+ {/* Header */} + +
+

Maintenance

+ + {/* Tabs */} + + { + setActiveTab(v as 'records' | 'schedules'); + setShowForm(false); + }} + aria-label="Maintenance tabs" + sx={{ + minHeight: 40, + '& .MuiTab-root': { + minHeight: 40, + fontSize: '0.875rem', + textTransform: 'none', + }, + }} + > + + + + + + {/* Add Button */} +
+ +
+ + {/* Loading State */} + {isLoading && ( +
+ Loading maintenance {activeTab}... +
+ )} + + {/* Error State */} + {hasError && ( +
+

Failed to load maintenance {activeTab}

+ +
+ )} +
+
+ + {/* Form */} + {showForm && !isLoading && !hasError && ( + +
+

+ {activeTab === 'records' ? 'New Maintenance Record' : 'New Maintenance Schedule'} +

+ {activeTab === 'records' ? ( + + ) : ( + + )} +
+
+ )} + + {/* Records List */} + {activeTab === 'records' && !isLoading && !hasError && ( + +
+

+ Recent Records +

+ {records && records.length === 0 ? ( +
+

No maintenance records yet

+

+ Add a record to track your vehicle maintenance +

+
+ ) : ( + + )} +
+
+ )} + + {/* Schedules List */} + {activeTab === 'schedules' && !isLoading && !hasError && ( + +
+

+ Maintenance Schedules +

+ {schedules && schedules.length === 0 ? ( +
+

No schedules yet

+

+ Create a schedule to get maintenance reminders +

+
+ ) : ( + + )} +
+
+ )} + + {/* Edit Dialogs */} + + +
+ ); +}; + +export default MaintenanceMobileScreen;