Composables

useImportStatus, useImportHistory, useExportTemplates

Polling import asincrono, storico importazioni e gestione template di export.

useImportStatus

Wrapper su usePolling specifico per import. Effettua il polling di GET /api/import/status/:id, normalizza i valori stato italiani del backend (es. completato, errore, in_corso) nel tipo ImportStato interno (inglese: completed, error, importing).

Inizializzazione

import { useImportStatus, useApi } from '@pzeta/vue-importexport'

const api = useApi()
const { progresso, isPolling, errore, startPolling, stopPolling, reset } = useImportStatus(api)

Stato reattivo

ProprietàTipoDescrizione
progressoRef<ImportProgresso | null>Stato corrente dal server (con stato normalizzato)
isPollingRef<boolean>Polling attivo
erroreRef<string | null>Errore di rete o stato error ricevuto

Metodi

MetodoDescrizione
startPolling(importId)Avvia il polling per un dato importId
stopPolling()Ferma il polling
reset()Stop + azzera progresso e errore

Mappatura stati server → interno

{
  completato:    'completed',
  errore:        'error',
  in_corso:      'importing',
  importazione: 'importing',
  caricamento:   'uploading',
}

Esempio

const status = useImportStatus(api)

const result = await api.executeImport(sessionId, mappings)
if (result.stato !== 'completato') {
  status.startPolling(result.importId)
}

watch(() => status.progresso.value?.stato, (s) => {
  if (s === 'completed') showToast('Import completato!')
})

useImportHistory

Carica lo storico importazioni filtrabile per risorsa. Singolo metodo loadHistory(), niente polling.

Inizializzazione

import { useImportHistory } from '@pzeta/vue-importexport'

const { items, loading, errore, loadHistory } = useImportHistory('anagrafica')
// senza filtro: useImportHistory()

Parametri

ParametroTipoDefaultDescrizione
risorsastringundefinedFiltro server-side per risorsa
apiOverrideImportExportApiuseApi()Istanza API custom

Stato reattivo

ProprietàTipoDescrizione
itemsRef<ImportHistoryItem[]>Storico caricato
loadingRef<boolean>Caricamento in corso
erroreRef<string | null>Errore caricamento

Tipo ImportHistoryItem

interface ImportHistoryItem {
  importId: string
  risorsa: string
  nomeFile: string
  formato: FileFormato
  stato: 'completato' | 'parziale' | 'errore'
  righeImportate: number
  righeScartate: number
  dataEsecuzione: string
  esecutore: string
}

Esempio

const history = useImportHistory('contratto')
onMounted(history.loadHistory)

useExportTemplates

Gestione CRUD dei modelli di esportazione (ModelloExport). Usato internamente da useExport.templateManager.

Inizializzazione

import { useExportTemplates, useApi } from '@pzeta/vue-importexport'

const api = useApi()
const {
  templates, selectedTemplate, loading, errore,
  loadTemplates, saveTemplate, updateTemplate, deleteTemplate, selectTemplate,
} = useExportTemplates(api)

Stato reattivo

ProprietàTipoDescrizione
templatesRef<ModelloExport[]>Lista template
selectedTemplateRef<ModelloExport | null>Template selezionato
loadingRef<boolean>Operazione in corso
erroreRef<string | null>Messaggio errore

Metodi

MetodoDescrizioneEndpoint
loadTemplates(risorsa?)Carica template della risorsaGET /api/export/templates?risorsa=…
saveTemplate(template)Crea nuovo templatePOST /api/export/templates
updateTemplate(id, updates)Aggiorna template esistentePUT /api/export/templates/:id
deleteTemplate(id)Elimina template (rimuove anche da templates.value)DELETE /api/export/templates/:id
selectTemplate(template)Imposta selectedTemplate.value

Esempio

const tm = useExportTemplates(api)
await tm.loadTemplates('anagrafica')

const created = await tm.saveTemplate({
  nome: 'Export clienti standard',
  descrizione: 'Solo clienti attivi con email',
  risorsa: 'anagrafica',
  formato: 'xlsx',
  campi: ['nome', 'cognome', 'email'],
  filtri: { attivo: true },
  condiviso: true,
})

if (created) {
  tm.selectTemplate(created)
}

Note

  • saveTemplate restituisce ModelloExport | null (null in caso di errore — il messaggio è in errore.value)
  • Allo deleteTemplate riuscito, se selectedTemplate.value.id === id, la selezione viene azzerata
  • Il backend (node-excel-export) usa internamente l'entità MsTemplate; la libreria fa il mapping bidirezionale tramite mapMsTemplateToModello