Step del wizard
I quattro componenti ImportStep* rappresentano gli step interni di ImportWizard. Sono esportati pubblicamente per consentire la composizione di wizard custom (es. con risorsa selezionabile, header brandizzato, layout diverso). Ogni step è "puro" — riceve stato e callback via props/emits e non chiama l'API direttamente.
ImportStepUpload
Gestisce drag & drop, file picker, validazione lato client (estensione, MIME, size 50 MB) e visualizzazione delle opzioni CSV. Mostra spinner di caricamento e link "Scarica un modello d'esempio".
Props
| Prop | Tipo | Descrizione |
|---|---|---|
file | File | null | File correntemente selezionato |
formato | FileFormato | Formato derivato dall'estensione |
risorsa | string | Codice risorsa target |
opzioniCsv | CsvOpzioni | Opzioni di parsing CSV |
loading | boolean | Upload in corso |
errore | string | null | Messaggio di errore da mostrare |
Emits
| Evento | Payload | Descrizione |
|---|---|---|
selectFile | File | File selezionato (validato lato client) |
update:opzioniCsv | CsvOpzioni | Modifica opzioni CSV |
cancelUpload | — | Annulla upload in corso (chiama AbortController) |
downloadTemplate | risorsa: string, formato: string | Richiesta download template d'esempio |
Esempio
<ImportStepUpload
:file="file"
:formato="formato"
:risorsa="risorsa"
:opzioni-csv="opzioniCsv"
:loading="loading"
:errore="errore"
@select-file="setFile($event); upload()"
@update:opzioni-csv="Object.assign(opzioniCsv, $event)"
@cancel-upload="cancelUpload"
@download-template="downloadTemplate"
/>
ImportStepMapping
Wrapper attorno a FieldMapper che mostra anche un Message di warning quando ci sono campi obbligatori non ancora mappati.
Props
| Prop | Tipo | Descrizione |
|---|---|---|
mappings | MappingColonna[] | Lista corrente di mapping |
campiDestinazione | CampoMetadato[] | Campi target disponibili |
campiObbligatoriMancanti | CampoMetadato[] | Campi obbligatori non ancora mappati |
isValid | boolean | Se il mapping può essere submittato |
anteprimaRighe | Record<string, unknown>[] | Prime righe del file (per mostrare un campione di valore sotto il nome colonna) |
Emits
| Evento | Payload | Descrizione |
|---|---|---|
updateMapping | index: number, campo: string | Cambia il campoDestinazione di una colonna |
updateTransform | index: number, trasformazione: string | Imposta una trasformazione |
updateDefault | index: number, valore: string | Imposta valore di default |
reset | — | Reset mapping (azzera campoDestinazione, trasformazione, valoreDefault) |
Esempio
<ImportStepMapping
:mappings="fieldMapping.mappings.value"
:campi-destinazione="campiDestinazione"
:campi-obbligatori-mancanti="fieldMapping.campiObbligatoriMancanti.value"
:is-valid="fieldMapping.isValid.value"
:anteprima-righe="anteprimaRigheFile"
@update-mapping="fieldMapping.updateMapping"
@reset="fieldMapping.resetMappings"
/>
ImportStepPreview
Esegue il dry-run e mostra il risultato della validazione tramite ImportPreview. Aggiunge:
- Pulsante "Esegui test importazione"
- Lista dei primi 5 warning (con contatore residuo)
Messagedi esito (success se 0 errori, warn se errori presenti)
Props
| Prop | Tipo | Descrizione |
|---|---|---|
testResult | TestImportResult | null | Risultato del dry-run |
loading | boolean | Test in corso |
errore | string | null | Messaggio errore |
Emits
| Evento | Payload | Descrizione |
|---|---|---|
test | — | Richiesta esecuzione test (POST /api/import/test) |
Esempio
<ImportStepPreview
:test-result="testResult"
:loading="loading"
:errore="errore"
@test="testImport"
/>
ImportStepExecute
Lo step finale: pulsante "Avvia importazione", ProgressBar durante import sincrono, ImportStatusTracker durante import asincrono, e card riepilogativa con conteggio importate/scartate/tempo a fine elaborazione.
Props
| Prop | Tipo | Descrizione |
|---|---|---|
importResult | ImportResult | null | Risultato sincrono |
progresso | ImportProgresso | null | Stato corrente del polling (per import async) |
isAsync | boolean | true se l'import è asincrono (≥ 500 righe per default) |
isPolling | boolean | Polling attivo |
loading | boolean | Esecuzione in corso |
errore | string | null | Errore esecuzione |
errorePolling | string | null | Errore durante il polling |
Emits
| Evento | Payload | Descrizione |
|---|---|---|
execute | — | Avvia l'esecuzione effettiva (POST /api/import/execute) |
Layout esito
A esecuzione completata viene mostrato un grid 3 colonne:
| Colonna | Valore |
|---|---|
| Importate | risultatoFinale.righeImportate (verde) |
| Scartate | risultatoFinale.righeScartate (rosso) |
| Tempo | tempoEsecuzione / 1000 in secondi |
Se ci sono errori, viene mostrato un elenco dei primi 20.
Esempio
<ImportStepExecute
:import-result="importResult"
:progresso="importStatus.progresso.value"
:is-async="isAsync"
:is-polling="importStatus.isPolling.value"
:loading="loading"
:errore="errore"
:errore-polling="importStatus.errore.value"
@execute="executeImport"
/>