@@ -27,6 +27,7 @@ import {
2727 useCallback ,
2828} from "react" ;
2929import { apiUrl , authHeaders } from "@/lib/api" ;
30+ import { downloadMaintenanceReportPdf } from "@/lib/maintenance-report" ;
3031
3132const faultToToggleKey = (
3233 fault : string | null | undefined
@@ -463,6 +464,7 @@ const InspectionDetailsPanel = ({
463464 const [ maintenanceModalMode , setMaintenanceModalMode ] = useState < "form" | "view" > ( "form" ) ;
464465 const [ showMaintenanceModal , setShowMaintenanceModal ] = useState ( false ) ;
465466 const [ isSavingMaintenance , setIsSavingMaintenance ] = useState ( false ) ;
467+ const [ isReportGenerating , setIsReportGenerating ] = useState ( false ) ;
466468
467469 const transformer = useMemo (
468470 ( ) =>
@@ -1634,6 +1636,32 @@ const InspectionDetailsPanel = ({
16341636 }
16351637 } ;
16361638
1639+ const handleDownloadMaintenanceReport = async ( ) => {
1640+ if ( ! maintenanceRecord || isReportGenerating ) return ;
1641+ setIsReportGenerating ( true ) ;
1642+ try {
1643+ await downloadMaintenanceReportPdf ( {
1644+ inspection,
1645+ maintenance : maintenanceRecord ,
1646+ annotations : {
1647+ boxes : storedBoxes ,
1648+ faults : storedFaultTypes ,
1649+ annotatedBy : storedAnnotatedBy ,
1650+ severity : storedSeverity ,
1651+ comments : storedComments ,
1652+ } ,
1653+ imageUrl : storedImageUrl ,
1654+ } ) ;
1655+ } catch ( error ) {
1656+ console . error ( "Failed to download maintenance report" , error ) ;
1657+ if ( typeof window !== "undefined" ) {
1658+ window . alert ( "Unable to generate the maintenance report. Please try again." ) ;
1659+ }
1660+ } finally {
1661+ setIsReportGenerating ( false ) ;
1662+ }
1663+ } ;
1664+
16371665 const uploadBaseline = async ( file : File , weather : string ) => {
16381666 if ( ! transformer ?. id ) return ;
16391667 const form = new FormData ( ) ;
@@ -1736,6 +1764,29 @@ const InspectionDetailsPanel = ({
17361764 </ svg >
17371765 < span > { isExporting ? "Preparing…" : "Export data" } </ span >
17381766 </ button >
1767+ < button
1768+ type = "button"
1769+ onClick = { handleDownloadMaintenanceReport }
1770+ disabled = { ! maintenanceRecord || maintenanceLoading || isReportGenerating }
1771+ className = "inline-flex items-center gap-2 px-3 py-1 text-sm border rounded custombutton disabled:opacity-60 disabled:cursor-not-allowed"
1772+ title = "Download the maintenance form with annotations as a PDF"
1773+ >
1774+ < svg
1775+ className = "w-4 h-4"
1776+ fill = "none"
1777+ stroke = "currentColor"
1778+ strokeWidth = { 1.5 }
1779+ strokeLinecap = "round"
1780+ strokeLinejoin = "round"
1781+ viewBox = "0 0 24 24"
1782+ >
1783+ < path d = "M6 2h9l4 4v16H6z" />
1784+ < path d = "M15 2v5h5" />
1785+ < path d = "M9 13h6" />
1786+ < path d = "M9 17h6" />
1787+ </ svg >
1788+ < span > { isReportGenerating ? "Preparing…" : "Maintenance PDF" } </ span >
1789+ </ button >
17391790 < label className = "flex items-center gap-2 text-sm" >
17401791 < span > Tune model</ span >
17411792 < span className = "relative inline-flex h-5 w-10 items-center" >
0 commit comments