Vue ImportExport
Wizard multi-step per import/export massivi di dati con mapping campi, supporto CSV/Excel/JSON, template salvabili e backend pluggable via Dependency Injection.
Cos'è @pzeta/vue-importexport
@pzeta/vue-importexport è la libreria Vue 3 per gestire importazioni ed esportazioni massive di dati con un workflow guidato. Fornisce:
ImportWizard— dialog multi-step (upload → mapping → anteprima → esecuzione) con dry-run e polling per import asincroniExportDialog— selezione campi, ordinamento, applicazione di template salvati, download del file generato- Composables (
useImport,useExport,useFieldMapping,useImportHistory,useImportStatus,useExportTemplates) per costruire UI custom - Contratti client (
IImportClient,IExportClient,ITemplateClient,ImportExportClient) per sostituire il backend senza ereditare dalla classe concreta
Backend di riferimento: i microservizi node-excel-import e node-excel-export tramite ImportExportApi. Sostituibile passando un'implementazione delle interfacce alle prop api di ImportWizard / ExportDialog.
v0.2.0 Dependency Injection: i componenti accettano
api?: ImportExportClient (un'interfaccia, non la classe). Ciò permette di sostituire il backend per testing, mock di Storybook, SDK custom o contratti wire alternativi senza ereditare da ImportExportApi.Funzionalità principali
- Import multi-step: upload + mapping interattivo + dry-run (
testImport) + esecuzione conImportStatusTracker - Auto-suggest mapping colonne sorgente → campi destinazione (algoritmo basato su
nome,etichetta,alias) - Polling per import asincroni (file > 500 righe per default) con cleanup automatico
- Export sincrono e asincrono: il server può rispondere con
Blobimmediato o202 AcceptedconexportIdper polling - Template export salvabili:
TemplateManagerper creare, applicare, condividere modelli persistenti - Formati supportati: CSV (via
papaparse), XLSX/XLS (viaexceljs), JSON - Errori categorizzati via
ErrorBoundaryinterno +ErrorCodeenum per logging strutturato - Annullamento upload/export tramite
AbortControllerintegrato
Architettura
ImportWizard / ExportDialog ← Componenti smart (Dialog + Stepper)
↓
useImport / useExport ← Composable orchestratori
↓
useApi → IMPORT_EXPORT_API_KEY ← Provide/inject del client
↓
ImportExportClient (interfaccia) ← Strategy: 3 contratti aggregati
↓
ImportExportApi (default) ← Implementazione fetch verso microservizi
↓
node-excel-import + node-excel-export ← Backend Fastify
I 3 contratti aggregati nell'ImportExportClient:
type ImportExportClient = IImportClient & IExportClient & ITemplateClient
Vedi Client interfaces per le firme complete e gli esempi di implementazione custom.
Mappa componenti
Componenti smart (caso comune)
| Componente | Cosa fa |
|---|---|
ImportWizard | Dialog 4 step: upload → mapping → preview → execute |
ExportDialog | Dialog selezione campi/formato/filtri/template + download |
Componenti per UI custom
| Componente | Quando usarlo |
|---|---|
ImportStepUpload, ImportStepMapping, ImportStepPreview, ImportStepExecute | Wizard custom (es. integrato in una pagina invece di un Dialog) |
FieldMapper / FieldMapperRow | Mapping interattivo standalone |
ExportFieldSelector | PickList campi standalone |
FormatOptions | Opzioni parsing CSV |
TemplateManager / TemplateSaveDialog | Gestione template export |
ImportPreview | Tabella anteprima dry-run |
ImportStatusTracker | Tracker progresso import asincrono |
ImportHistory | Storico import della risorsa |
ImageUploader | Upload immagini collegate a sessione di import |
Sotto-pagine
Nessuna sotto-pagina disponibile.
Quick start
<script setup lang="ts">
import { ref } from 'vue'
import { ImportWizard, ExportDialog } from '@pzeta/vue-importexport'
import '@pzeta/vue-importexport/style.css'
const showImport = ref(false)
const showExport = ref(false)
const baseUrl = import.meta.env.VITE_IMPORTEXPORT_API_URL
</script>
<template>
<button @click="showImport = true">Importa</button>
<button @click="showExport = true">Esporta</button>
<ImportWizard
v-model:visible="showImport"
:base-url="baseUrl"
risorsa="anagrafica"
@import-completed="(r) => console.log('Importate', r.righeImportate)"
/>
<ExportDialog
v-model:visible="showExport"
:base-url="baseUrl"
risorsa="anagrafica"
/>
</template>
ImportWizard istanzia internamente new ImportExportApi(baseUrl) e la fornisce ai sotto-componenti via provide(IMPORT_EXPORT_API_KEY). Per condividere la stessa istanza tra Wizard e Dialog (o passare un client custom), usa la prop api.
Quando usare cosa
| Scenario | Soluzione |
|---|---|
| Import standard CSV/Excel di una risorsa | ImportWizard |
| Export con selezione campi e template | ExportDialog |
| Wizard import integrato in una pagina (no Dialog) | composable useImport + step components |
| Solo upload + parsing client-side | utility parseCSV / readFileHeaders |
| Solo storico import | ImportHistory standalone |
| Backend non-Fastify / SDK custom | implementa ImportExportClient e passalo come prop api |
| Test / Storybook | mock dei 3 contratti client + prop api |
Versione
npm install @pzeta/vue-importexport
# v0.2.0 — peer deps: vue@^3.5, @pzeta/vue-components@^1.4