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 asincroni
  • ExportDialog — 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 con ImportStatusTracker
  • 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 Blob immediato o 202 Accepted con exportId per polling
  • Template export salvabili: TemplateManager per creare, applicare, condividere modelli persistenti
  • Formati supportati: CSV (via papaparse), XLSX/XLS (via exceljs), JSON
  • Errori categorizzati via ErrorBoundary interno + ErrorCode enum per logging strutturato
  • Annullamento upload/export tramite AbortController integrato

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)

ComponenteCosa fa
ImportWizardDialog 4 step: upload → mapping → preview → execute
ExportDialogDialog selezione campi/formato/filtri/template + download

Componenti per UI custom

ComponenteQuando usarlo
ImportStepUpload, ImportStepMapping, ImportStepPreview, ImportStepExecuteWizard custom (es. integrato in una pagina invece di un Dialog)
FieldMapper / FieldMapperRowMapping interattivo standalone
ExportFieldSelectorPickList campi standalone
FormatOptionsOpzioni parsing CSV
TemplateManager / TemplateSaveDialogGestione template export
ImportPreviewTabella anteprima dry-run
ImportStatusTrackerTracker progresso import asincrono
ImportHistoryStorico import della risorsa
ImageUploaderUpload 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

ScenarioSoluzione
Import standard CSV/Excel di una risorsaImportWizard
Export con selezione campi e templateExportDialog
Wizard import integrato in una pagina (no Dialog)composable useImport + step components
Solo upload + parsing client-sideutility parseCSV / readFileHeaders
Solo storico importImportHistory standalone
Backend non-Fastify / SDK customimplementa ImportExportClient e passalo come prop api
Test / Storybookmock 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