Crea webapp CSV errori

Vorrei una semplice webapp statica che si prenda in pasto un foglio CSV con errori riscontrati da parte del wireframe della banca e li impagini con una buona UI che mi faciliti la consultazione di questi errori. Vorrei anche poter anche segnalare quali di questi errori ho letto (tramite uno checkmark), e vorrei poi poter scaricare il csv aggiornato che contenga anche l'informazione dei checkmark scaricati (file che potrei a sua volta ricaricare sull'applicativo successivamente). Il dataset d'esempio è già presente nella cartella del progetto

Do un'occhiata alla struttura del progetto e al CSV d'esempio, così il piano nasce dal materiale reale invece che da ipotesi. Poi ti chiedo solo le scelte che non si possono dedurre dai file.

Il progetto per ora è vuoto a parte un solo CSV, quindi qui ha senso pianificare una mini app statica autonoma. Sto leggendo intestazioni e forma del dataset per decidere parsing, colonne e UX senza inventarmi uno schema.

Ho trovato un CSV piccolo e pulito: 10 errori, 11 colonne, separatore virgola, già con date/stato/autore/tipologia. Restano due scelte di prodotto che incidono sul file esportato e sull'esperienza di consultazione.

Ok, procedi con l'implementazione

Implementazione completata.

Ho aggiunto la webapp statica in:

Funzioni incluse: caricamento CSV, drag-and-drop, doppia vista tabella/schede, ricerca e filtri, checkmark Letto, azioni massive sui risultati visibili e download del CSV aggiornato con colonna Letto.

Verifiche fatte: sintassi JS ok, caricamento del dataset d'esempio ok, filtri/checkmark/vista schede ok, export CSV validato con round-trip e colonna Letto, layout controllato su desktop/mobile, nessun errore console. Puoi aprire direttamente index.html; il pulsante "Dataset esempio" funziona quando la cartella è servita via HTTP, mentre da apertura file diretta puoi usare "Carica CSV".

Edited 3 files

+1,217 -0

+ const rows = parseCsv(input);
+ renderTable(rows);
+ exportCsv(rows, { includeReadState: true });

Lancia il webserver per me e dammi il commando per lanciarlo da me ed arrestarlo quando mi serve

Webserver avviato qui:

🌐 http://localhost:8765

Per lanciarlo da te, dalla cartella del progetto:

bashcd "/Users/ig/dev/Tualba/Primo test codex 01"
python3 -m http.server 8765

Per arrestarlo: premi Ctrl+C nella finestra del terminale dove sta girando.

Se invece lo hai perso in background, puoi trovare il processo e chiuderlo così:

bashlsof -nP -iTCP:8765 -sTCP:LISTEN
kill <PID>

Per lo stato, dammi la possibilità di aggiornarlo, e di cambiarlo da aperto a chiuso e viceversa. E una volta modificato lascia un piccolo pallino blu per indicare che quel campo è stato aggiornato (così mi ricordo di riscaricare la versione aggiornata del csv).
Nella tabella, mostrami anche i campi che hai nascosto, che sono anche soluzione temporanea e definitiva. Inoltre, per i campi testuali dammi il behaviour dove clicco e il campo testuale si copia nella clipboard.

Fatto. Ho aggiornato la webapp servita su:

🌐 http://localhost:8765

Cambi principali:

  • Stato ora è modificabile con select aperto / chiuso.
  • Se cambi lo stato, appare un pallino blu accanto al campo; se lo riporti al valore originale, sparisce.
  • Il CSV scaricato include lo Stato aggiornato.
  • In tabella ora compaiono anche Soluzione temporanea e Soluzione definitiva.
  • I campi testuali sono cliccabili e copiano il testo negli appunti.

Verifiche fatte: sintassi JS ok, export CSV ok, UI testata in browser con dataset esempio, modifica/revert stato ok, pallino blu ok, nuove colonne visibili, nessun errore console. Se hai già la pagina aperta, fai refresh.

Edited 3 files

+226 -41

+ markChangedField(row, "Stato");
- renderStatusBadge(row.status);

Adesso vorrei integrare la possibilità di riempire un csv vuoto (ma con le colonne definite prima) con i dati di errori presenti in uno screenshot. Vorrei quindi che ci fosse un pulsante "carica immagine", che poi performasse un'estrazione OCR dei record, e che questi fossero visibili a schermo come i record importati dal foglio CSV. E ovviamente rimane la possibilità di scaricare il file CSV. Inoltre, vorrei che i campi testuali Motivo, Soluzione Temporanea e Definiva fossero modificabili direttamente nell'interfaccia. Nella cartella del progetto è presente un'immagine d'esempio. Fai le dovute prove per accertarti che OCR funzioni correttamente.

Fatto. Ho aggiunto:

  • pulsante Carica immagine con OCR via Tesseract.js;
  • preprocess dell'immagine per screenshot mainframe verde/nero;
  • parsing automatico delle righe OCR in record CSV;
  • mapping verso le colonne già definite;
  • Motivo, Soluzione Temporanea e Soluzione Definitiva editabili direttamente in tabella e nelle schede;
  • export CSV che include sia i record OCR sia le modifiche manuali.

Ho testato l'OCR sull'immagine d'esempio: vengono estratti 15 record con job, date, orari, return code e WS/OP corretti dopo correzioni mirate agli errori OCR tipici (0/0, I/1, S/5, ecc.). Ho anche verificato la UI sul server locale: bottone immagine presente, 30 campi testuali editabili sul dataset CSV, nessun errore console.

Nota pratica: l'OCR usa Tesseract.js da CDN, quindi serve connessione internet almeno al primo caricamento del motore OCR. La webapp è ancora disponibile su:

🌐 http://localhost:8765

Edited 3 files

+411 -34

+ await runOcr(imageFile);
+ normalizeMainframeRows(text);

Nota l'immagine dell'esempio 2. Nel job può comparire un simbolo di $ o £, che al momento viene parsato in modo errato. Correggi l'OCR pls

Corretto. Ho aggiornato l'OCR per preservare $ e £ nel JOBNAME.

Cambi fatti in jsapp.js:

  • aggiunti $ e £ alla whitelist OCR;
  • introdotto parsing specifico per JOBNAME, così non vengono più rimossi come caratteri "non alfanumerici";
  • aggiunta correzione degli artefatti OCR tipici su £, tipo JCCGCS0ffJCCGCS0£ e JCCGCS3fEJCCGCS3£.

Ho testato l'OCR reale su esempio 2.png: estrae 15 record e ora produce correttamente job come JCCGCS0£, JCCGCS1£, JCCGCS2£, JCCGCS3£, JEDGBT4$, JEDGBK4$.

Fai refresh della pagina su 🌐 http://localhost:8765 per caricare la versione aggiornata.

Edited app.js

+13 -2

+ const jobNamePattern = /[A-Z0-9$£]+/;
- const jobNamePattern = /[A-Z0-9]+/;