PageSourceSearch

https://smartmanageai.ai/assets/daily-inspector-reports-Cpr_g90S.js

js smartmanageai.ai collected 2026-10-05 15:07:07 UTC 16,841 bytes, 1 lines download raw bytes

1import{r as g,j as e}from"./vendor-react-DKbe1Umz.js";import{u as Q,a as S}from"./vendor-data-CjSe2wkl.js";import{u as Y}from"./use-table-keyboard-nav-Updj1w8O.js";import{u as $,aH as f,C as E,v as T,aK as Z,aW as G,B as l,L as n,s as J,t as X,l as B,D as V,q as P,o as R,c as H,d as M,e as F,I as u,T as C,n as L}from"./index-DZ74KeH3.js";import{A as ee,a as te,b as se,c as re,d as ae,e as ie,f as ne,g as oe}from"./alert-dialog-CA9oB9-z.js";import{E as de}from"./EmptyState-B9ZWMRjO.js";import{P as U,f as W,g as k,t as z,b as ce}from"./FieldFormHelpers-CCTTH4PB.js";import{a as O}from"./HeavyCivilDocumentField-VxRI9NnX.js";import{b3 as le,c0 as A,O as ue,c$ as pe,cZ as me,dc as he}from"./vendor-ui-DMaW9-Ov.js";import"./vendor-charts-DWX9qznF.js";import"./vendor-dates-5UNeOyFW.js";import"./vendor-forms-C2vWC2ab.js";import"./ObjectUploader-BErHjEh8.js";const K={DRAFT:"outline",SUBMITTED:"secondary",APPROVED:"default",REVISED:"secondary"};function Ae(){const{toast:a}=$(),v=f("canViewInspectorReports"),m=f("canSubmitInspectorReports"),o=f("canManageInspectorReports"),h=f("canApproveInspectorReports"),w=v||m||o||h,[y,s]=g.useState(""),[i,j]=g.useState(null),[d,N]=g.useState(null),b=["/api/daily-inspector-reports",y?{projectId:y}:{}],{data:x=[],isLoading:D}=Q({queryKey:b,enabled:w});if(!w)return e.jsx("div",{className:"container mx-auto p-6","data-testid":"no-access-inspector-reports",children:e.jsx(E,{children:e.jsx(T,{className:"p-8 text-center text-muted-foreground",children:"You don't have permission to view Daily Inspector Reports."})})});const c=S({mutationFn:async r=>{await R("DELETE",`/api/daily-inspector-reports/${r}`)},onSuccess:()=>{a({title:"Report deleted"}),P.invalidateQueries({queryKey:["/api/daily-inspector-reports"]}),N(null)},onError:r=>a({title:"Failed to delete",description:k(r),variant:"destructive"})}),t=o||h,{getRowProps:p}=Y({rowCount:x.length,onActivate:r=>{if(!t)return;const I=x[r];I&&j(I)}});return Z("daily-inspector-reports",G.filter(r=>r.keys!=="/")),e.jsxs("div",{className:"container max-w-full mx-auto p-4 sm:p-6 space-y-6",children:[e.jsxs("div",{className:"flex flex-col sm:flex-row sm:items-center sm:justify-between gap-3",children:[e.jsxs("div",{children:[e.jsx("h1",{className:"text-2xl font-semibold",children:"Daily Inspector Reports"}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"DOT-style daily field reports — weather, crews, equipment, and work performed."})]}),(m||o)&&e.jsxs(l,{onClick:()=>j("new"),"data-testid":"button-new-idr",children:[e.jsx(le,{className:"h-4 w-4 mr-2"}),"New IDR"]})]}),e.jsxs("div",{className:"max-w-md",children:[e.jsx(n,{className:"text-xs text-muted-foreground",children:"Filter by project"}),e.jsx(U,{value:y,onChange:s,testId:"select-idr-project-filter",placeholder:"All projects"})]}),D?e.jsxs("div",{className:"flex items-center justify-center py-12 text-muted-foreground",children:[e.jsx(A,{className:"animate-spin h-5 w-5 mr-2"}),"Loading…"]}):x.length===0?e.jsx(de,{icon:ue,title:"No daily inspector reports",description:"Create your first daily inspector report to log weather, crews, and work performed.",testId:"empty-idr"}):e.jsx("div",{className:"grid gap-3 sm:grid-cols-2 lg:grid-cols-3",children:x.map((r,I)=>e.jsxs(E,{"data-testid":`card-idr-${r.id}`,className:"data-[focused=true]:ring-2 data-[focused=true]:ring-primary data-[focused=true]:ring-offset-2 data-[focused=true]:ring-offset-background",...p(I),children:[e.jsx(J,{className:"pb-2",children:e.jsxs("div",{className:"flex items-start justify-between gap-2",children:[e.jsxs("div",{className:"min-w-0",children:[e.jsx(X,{className:"text-base",children:W(r.reportDate)}),r.reportNumber&&e.jsxs("div",{className:"text-xs text-muted-foreground",children:["#",r.reportNumber]})]}),e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx(B,{variant:K[r.status]||"outline",children:r.status}),(o||h)&&e.jsx(l,{size:"icon",variant:"ghost",className:"h-7 w-7",onClick:()=>j(r),"data-testid":`button-edit-idr-${r.id}`,"aria-label":"Edit",children:e.jsx(pe,{className:"h-3.5 w-3.5"})}),o&&e.jsx(l,{size:"icon",variant:"ghost",className:"h-7 w-7",onClick:()=>N(r),"data-testid":`button-delete-idr-${r.id}`,"aria-label":"Delete",children:e.jsx(me,{className:"h-3.5 w-3.5"})})]})]})}),e.jsxs(T,{className:"text-sm space-y-1",children:[r.inspectorName&&e.jsxs("div",{children:[e.jsx("span",{className:"text-muted-foreground",children:"Inspector:"})," ",r.inspectorName]}),r.weatherConditions&&e.jsxs("div",{children:[e.jsx("span",{className:"text-muted-foreground",children:"Weather:"})," ",r.weatherConditions]}),(r.temperatureHigh!==null||r.temperatureLow!==null)&&e.jsxs("div",{children:[e.jsx("span",{className:"text-muted-foreground",children:"Temp:"})," ",r.temperatureLow??"—","° / ",r.temperatureHigh??"—","°"]}),(r.crewCount??0)>0&&e.jsxs("div",{children:[e.jsx("span",{className:"text-muted-foreground",children:"Crew:"})," ",r.crewCount," · ",r.crewHours," hrs"]}),r.workPerformed&&e.jsx("div",{className:"line-clamp-3 text-xs text-muted-foreground pt-1",children:r.workPerformed})]})]},r.id))}),e.jsx(V,{open:i!==null,onOpenChange:r=>{r||j(null)},children:i!==null&&e.jsx(je,{existing:i==="new"?null:i,defaultProjectId:y,onClose:()=>j(null)},i==="new"?"new":i.id)}),e.jsx(ee,{open:!!d,onOpenChange:r=>{r||N(null)},children:e.jsxs(te,{"data-testid":"dialog-delete-idr",children:[e.jsxs(se,{children:[e.jsx(re,{children:"Delete Daily Inspector Report?"}),e.jsxs(ae,{children:["This will permanently delete the IDR for"," ",e.jsx("strong",{children:d?W(d.reportDate):""}),d!=null&&d.reportNumber?e.jsxs(e.Fragment,{children:[" (#",d.reportNumber,")"]}):null,". This action cannot be undone."]})]}),e.jsxs(ie,{children:[e.jsx(ne,{"data-testid":"button-delete-idr-cancel",children:"Cancel"}),e.jsx(oe,{className:"bg-destructive text-destructive-foreground hover:bg-destructive/90",disabled:c.isPending,onClick:r=>{r.preventDefault(),d&&c.mutate(d.id)},"data-testid":"button-delete-idr-confirm",children:c.isPending?e.jsxs(e.Fragment,{children:[e.jsx(A,{className:"h-4 w-4 mr-2 animate-spin"}),"Deleting…"]}):"Delete"})]})]})})]})}function q(a,v){var m,o,h,w;return a?{projectId:a.projectId,reportDate:ce(a.reportDate)||z(),reportNumber:a.reportNumber??"",status:a.status,inspectorName:a.inspectorName??"",weatherConditions:a.weatherConditions??"",temperatureHigh:((m=a.temperatureHigh)==null?void 0:m.toString())??"",temperatureLow:((o=a.temperatureLow)==null?void 0:o.toString())??"",precipitationInches:a.precipitationInches??"",windSpeedMph:((h=a.windSpeedMph)==null?void 0:h.toString())??"",crewCount:((w=a.crewCount)==null?void 0:w.toString())??"",crewHours:a.crewHours??"",workPerformed:a.workPerformed??"",stationsWorked:a.stationsWorked??"",deliveries:a.deliveries??"",visitors:a.visitors??"",safetyIncidents:a.safetyIncidents??"",delaysEncountered:a.delaysEncountered??"",photoDocumentIds:a.photoDocumentIds??[],attachmentDocumentIds:a.attachmentDocumentIds??[]}:{projectId:v||"",reportDate:z(),reportNumber:"",status:"DRAFT",inspectorName:"",weatherConditions:"",temperatureHigh:"",temperatureLow:"",precipitationInches:"",windSpeedMph:"",crewCount:"",crewHours:"",workPerformed:"",stationsWorked:"",deliveries:"",visitors:"",safetyIncidents:"",delaysEncountered:"",photoDocumentIds:[],attachmentDocumentIds:[]}}function je({existing:a,onClose:v,defaultProjectId:m}){const{toast:o}=$(),h=f("canManageInspectorReports"),w=f("canApproveInspectorReports"),y=f("canSubmitInspectorReports"),[s,i]=g.useState(()=>q(a,m));g.useEffect(()=>{i(q(a,m))},[a,m]);const[j,d]=g.useState(""),[N,b]=g.useState(!1),x=S({mutationFn:async()=>(await R("POST","/api/ai-features/heavy-civil/idr/summarize",{rawNotes:j,weather:s.weatherConditions||void 0,crewCount:s.crewCount?Number(s.crewCount):void 0,crewHours:s.crewHours||void 0,stationsWorked:s.stationsWorked||void 0})).json(),onSuccess:t=>{if(t!=null&&t.fallback){o({title:"AI summarize failed",description:t.message??"Use raw notes."});return}i(p=>({...p,workPerformed:t.workPerformed??p.workPerformed,delaysEncountered:p.delaysEncountered||(t.delaysEncountered??""),safetyIncidents:p.safetyIncidents||(t.safetyIncidents??"")})),o({title:"AI summary inserted",description:`Confidence ${t.confidence??"—"}/100. Review before submitting.`}),b(!1),d("")},onError:t=>o({title:"AI summarize failed",description:k(t),variant:"destructive"})}),D=S({mutationFn:async t=>{const{status:p,...r}=t,I={...r,temperatureHigh:t.temperatureHigh?Number(t.temperatureHigh):null,temperatureLow:t.temperatureLow?Number(t.temperatureLow):null,precipitationInches:t.precipitationInches||null,windSpeedMph:t.windSpeedMph?Number(t.windSpeedMph):null,crewCount:t.crewCount?Number(t.crewCount):0,crewHours:t.crewHours||"0",photoDocumentIds:t.photoDocumentIds,attachmentDocumentIds:t.attachmentDocumentIds},_=a?`/api/daily-inspector-reports/${a.id}`:"/api/daily-inspector-reports";return(await R(a?"PATCH":"POST",_,I)).json()},onSuccess:()=>{o({title:a?"IDR updated":"IDR saved"}),P.invalidateQueries({queryKey:["/api/daily-inspector-reports"]}),v()},onError:t=>o({title:"Failed to save",description:k(t),variant:"destructive"})}),c=S({mutationFn:async t=>{if(!a)throw new Error("Save the report first");return(await R("POST",`/api/daily-inspector-reports/${a.id}/${t}`,{})).json()},onSuccess:(t,p)=>{o({title:`IDR ${{submit:"submitted",approve:"approved",reject:"rejected","request-revision":"sent for revision"}[p]}`}),P.invalidateQueries({queryKey:["/api/daily-inspector-reports"]}),v()},onError:t=>o({title:"Workflow action failed",description:k(t),variant:"destructive"})});
1return e.jsxs(H,{className:"max-w-2xl max-h-[90vh] overflow-y-auto",children:[e.jsx(M,{children:e.jsx(F,{children:a?"Edit Daily Inspector Report":"New Daily Inspector Report"})}),e.jsxs("form",{onSubmit:t=>{t.preventDefault(),D.mutate(s)},className:"space-y-3",children:[e.jsxs("div",{children:[e.jsx(n,{children:"Project *"}),e.jsx(U,{value:s.projectId,onChange:t=>i({...s,projectId:t}),testId:"select-idr-project"})]}),e.jsxs("div",{className:"grid grid-cols-1 sm:grid-cols-3 gap-3",children:[e.jsxs("div",{children:[e.jsx(n,{children:"Report Date *"}),e.jsx(u,{type:"date",required:!0,value:s.reportDate,onChange:t=>i({...s,reportDate:t.target.value}),"data-testid":"input-idr-date"})]}),e.jsxs("div",{children:[e.jsx(n,{children:"Report #"}),e.jsx(u,{value:s.reportNumber,onChange:t=>i({...s,reportNumber:t.target.value}),"data-testid":"input-idr-number"})]}),e.jsxs("div",{children:[e.jsx(n,{children:"Status"}),e.jsxs("div",{className:"h-10 flex items-center","data-testid":"badge-idr-status",children:[e.jsx(B,{variant:K[s.status]||"outline",children:s.status}),e.jsx("span",{className:"text-xs text-muted-foreground ml-2",children:"Use workflow actions below"})]})]})]}),e.jsxs("div",{children:[e.jsx(n,{children:"Inspector Name"}),e.jsx(u,{value:s.inspectorName,onChange:t=>i({...s,inspectorName:t.target.value}),"data-testid":"input-idr-inspector"})]}),e.jsxs("div",{children:[e.jsx(n,{children:"Weather Conditions"}),e.jsx(u,{placeholder:"e.g. Sunny, light wind",value:s.weatherConditions,onChange:t=>i({...s,weatherConditions:t.target.value}),"data-testid":"input-idr-weather"})]}),e.jsxs("div",{className:"grid grid-cols-2 sm:grid-cols-4 gap-2",children:[e.jsxs("div",{children:[e.jsx(n,{children:"Low °F"}),e.jsx(u,{inputMode:"numeric",value:s.temperatureLow,onChange:t=>i({...s,temperatureLow:t.target.value}),"data-testid":"input-idr-temp-low"})]}),e.jsxs("div",{children:[e.jsx(n,{children:"High °F"}),e.jsx(u,{inputMode:"numeric",value:s.temperatureHigh,onChange:t=>i({...s,temperatureHigh:t.target.value}),"data-testid":"input-idr-temp-high"})]}),e.jsxs("div",{children:[e.jsx(n,{children:"Rain (in)"}),e.jsx(u,{inputMode:"decimal",value:s.precipitationInches,onChange:t=>i({...s,precipitationInches:t.target.value}),"data-testid":"input-idr-rain"})]}),e.jsxs("div",{children:[e.jsx(n,{children:"Wind (mph)"}),e.jsx(u,{inputMode:"numeric",value:s.windSpeedMph,onChange:t=>i({...s,windSpeedMph:t.target.value}),"data-testid":"input-idr-wind"})]})]}),e.jsxs("div",{className:"grid grid-cols-1 sm:grid-cols-2 gap-3",children:[e.jsxs("div",{children:[e.jsx(n,{children:"Crew Count"}),e.jsx(u,{inputMode:"numeric",value:s.crewCount,onChange:t=>i({...s,crewCount:t.target.value}),"data-testid":"input-idr-crew-count"})]}),e.jsxs("div",{children:[e.jsx(n,{children:"Crew Hours"}),e.jsx(u,{inputMode:"decimal",value:s.crewHours,onChange:t=>i({...s,crewHours:t.target.value}),"data-testid":"input-idr-crew-hours"})]})]}),e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx(n,{children:"Work Performed"}),e.jsxs(l,{type:"button",size:"sm",variant:"outline",onClick:()=>b(!0),"data-testid":"button-idr-ai-summarize",children:[e.jsx(he,{className:"h-3.5 w-3.5 mr-2"}),"AI Summarize Notes"]})]}),e.jsx(C,{rows:3,value:s.workPerformed,onChange:t=>i({...s,workPerformed:t.target.value}),"data-testid":"input-idr-work"})]}),e.jsx(V,{open:N,onOpenChange:b,children:e.jsxs(H,{className:"max-w-xl",children:[e.jsx(M,{children:e.jsx(F,{children:"AI Summarize Field Notes"})}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(n,{children:"Paste your raw field notes (voice transcript, scribbles, etc.)"}),e.jsx(C,{rows:8,value:j,onChange:t=>d(t.target.value),placeholder:"Crew of 6 started at 7am pouring class A concrete at sta 12+50…","data-testid":"input-idr-ai-notes"}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"AI extracts work performed, delays, and safety notes. Review before saving."})]}),e.jsxs(L,{children:[e.jsx(l,{type:"button",variant:"outline",onClick:()=>b(!1),"data-testid":"button-idr-ai-cancel",children:"Cancel"}),e.jsxs(l,{type:"button",disabled:x.isPending||j.length<10,onClick:()=>x.mutate(),"data-testid":"button-idr-ai-run",children:[x.isPending&&e.jsx(A,{className:"h-4 w-4 mr-2 animate-spin"}),"Summarize"]})]})]})}),e.jsxs("div",{children:[e.jsx(n,{children:"Stations Worked"}
1),e.jsx(u,{placeholder:"e.g. Sta 100+00 to 110+50",value:s.stationsWorked,onChange:t=>i({...s,stationsWorked:t.target.value}),"data-testid":"input-idr-stations"})]}),e.jsxs("div",{className:"grid grid-cols-1 sm:grid-cols-2 gap-3",children:[e.jsxs("div",{children:[e.jsx(n,{children:"Deliveries"}),e.jsx(C,{rows:2,value:s.deliveries,onChange:t=>i({...s,deliveries:t.target.value}),"data-testid":"input-idr-deliveries"})]}),e.jsxs("div",{children:[e.jsx(n,{children:"Visitors"}),e.jsx(C,{rows:2,value:s.visitors,onChange:t=>i({...s,visitors:t.target.value}),"data-testid":"input-idr-visitors"})]})]}),e.jsxs("div",{className:"grid grid-cols-1 sm:grid-cols-2 gap-3",children:[e.jsxs("div",{children:[e.jsx(n,{children:"Safety Incidents"}),e.jsx(C,{rows:2,value:s.safetyIncidents,onChange:t=>i({...s,safetyIncidents:t.target.value}),"data-testid":"input-idr-safety"})]}),e.jsxs("div",{children:[e.jsx(n,{children:"Delays"}),e.jsx(C,{rows:2,value:s.delaysEncountered,onChange:t=>i({...s,delaysEncountered:t.target.value}),"data-testid":"input-idr-delays"})]})]}),e.jsxs("div",{className:"border-t pt-3 space-y-4",children:[e.jsx(O,{documentIds:s.photoDocumentIds,projectId:s.projectId,titleBase:`IDR ${s.reportDate} Photo`,docType:"OTHER",label:"Photos",testId:"idr-photos",onChange:t=>i({...s,photoDocumentIds:t})}),e.jsx(O,{documentIds:s.attachmentDocumentIds,projectId:s.projectId,titleBase:`IDR ${s.reportDate} Attachment`,docType:"OTHER",label:"Attachments",testId:"idr-attachments",onChange:t=>i({...s,attachmentDocumentIds:t})})]}),a&&e.jsxs("div",{className:"flex flex-wrap gap-2 border-t pt-3",children:[e.jsx("span",{className:"text-xs text-muted-foreground self-center mr-1",children:"Workflow:"}),(y||h)&&(a.status==="DRAFT"||a.status==="REVISED")&&e.jsx(l,{type:"button",size:"sm",variant:"secondary",disabled:c.isPending,onClick:()=>c.mutate("submit"),"data-testid":"button-idr-submit",children:"Submit"}),(w||h)&&a.status==="SUBMITTED"&&e.jsxs(e.Fragment,{children:[e.jsx(l,{type:"button",size:"sm",disabled:c.isPending,onClick:()=>c.mutate("approve"),"data-testid":"button-idr-approve",children:"Approve"}),e.jsx(l,{type:"button",size:"sm",variant:"destructive",disabled:c.isPending,onClick:()=>c.mutate("reject"),"data-testid":"button-idr-reject",children:"Reject"}),e.jsx(l,{type:"button",size:"sm",variant:"outline",disabled:c.isPending,onClick:()=>c.mutate("request-revision"),"data-testid":"button-idr-revise",children:"Request Revision"})]})]}),e.jsxs(L,{children:[e.jsx(l,{type:"button",variant:"outline",onClick:v,"data-testid":"button-idr-cancel",children:"Cancel"}),e.jsx(l,{type:"submit",disabled:D.isPending||!s.projectId,"data-testid":"button-idr-save",children:D.isPending?e.jsxs(e.Fragment,{children:[e.jsx(A,{className:"h-4 w-4 mr-2 animate-spin"}),"Saving…"]}):a?"Update Report":"Save Report"})]})]})]})}export{Ae as default};

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.