A client-side web app for reviewing audit-export CSVs, marking records complete, and tracking progress — all locally in the browser. No backend, no build step, no external data leaves the page.
- Open
index.htmlin a modern browser (Chrome, Edge, Firefox, Safari) — or serve the folder with any static HTTP server, e.g.python -m http.server 8000. - Drag and drop a CSV file onto the upload zone, or click Choose CSV File.
- Browse, filter, and open records. Use ✓ Mark Complete inside the record viewer to move a record to the Completed tab.
- Refresh freely — the app auto-saves active + completed records to
localStorage, so progress survives reloads. - Click 🔄 New Upload in the header to clear the saved session and load a different file.
- CSV upload with RFC 4180 multi-line quoted-field support (up to 10 MB).
- Session persistence: parsed rows + completion state are stored in
localStorageand auto-restored on page load. - Record viewer with detail cards, expandable banners, clipboard copy on every field, and embedded image/link previews.
- Mark Complete from the viewer — one click on the current record moves it to Completed and jumps to the next record.
- Risk filters / sort: filter by risk 1–6 or "No Risk", sort by risk or name.
- Analytics tab: bar + doughnut charts of risk distribution plus a summary stat panel (Chart.js CDN).
- Dark mode toggle, persisted in
localStorage. - Keyboard nav:
←/→navigate between records in the viewer,Escreturns to the list.
Audit-Client-Viewer/
├── index.html # Markup + all styles (Tailwind-free; dark-mode via body class)
├── app.js # All application logic — state, rendering, persistence, charts
├── xlsx-parser.js # Legacy XLSX parser (not on the main path — CSV is the supported input)
├── docs/ # Architecture, data flow, and persistence notes
│ ├── architecture.md
│ ├── data-flow.md
│ └── persistence.md
└── README.md
.csvonly (UTF-8 recommended). Excel files must be exported to CSV first.- The first row is treated as the header.
- Columns the UI knows how to render specially:
ClientFirstName,ClientLastName,ClientId— identity; rows without both names are hidden.Risk_Level— integer 1–6; anything else is bucketed as "No Risk".DateOfService,CR Start Time,CR End Time— shown as date + session time.ProcedureCode,Ensora_Site,Id,Template Type,Place of Service— shown in the detail banners.Is_AI_Note,Educational Flag,ADL Flag,PayorName,ProviderFirstName/ProviderLastName,Signature Status— shown in the flags banner.CAT_Narrative_Notes— rendered as the bottom Notes section.- Any URL/field containing
screenshot,image,photo,picture, orimgbecomes a clickable image tile.
- Every other column is rendered as a detail card with a Copy button.
Active rows, completed rows, and the source filename are serialized to localStorage under the key auditClientViewer_session_v1. See docs/persistence.md for the full lifecycle (save points, restore, reset).
- All parsing happens in the browser. Nothing is uploaded.
- The only CDN requests are for
chart.jsandjszip(loaded in<head>); they receive no data from your file.
- Nothing loaded after upload — check for a header row and confirm the file is actual CSV (not XLSX renamed).
- Completed records gone after reload — localStorage may be full or blocked; open DevTools → Application → Local Storage and look for
auditClientViewer_session_v1. - Images don't render — the source URL may block hotlinking. The field still works as a clickable link.
Chrome/Edge 90+, Firefox 88+, Safari 14+.