Composables

Composables Vue 3 per accesso al contesto MFE e pattern CRUD riutilizzabili. Riducono boilerplate in viste lista/dettaglio/dialog/toast.

Cosa contengono

I composables in @pzeta/mfe-contracts/composables astraggono pattern ricorrenti nelle viste dei microfrontend:

  • accesso al MFEContext iniettato dalla shell,
  • CRUD generico (load/create/update/delete) con stato items + loading + error,
  • UI CRUD (dialog visibile, editing item, save, delete con conferma),
  • form di dettaglio con dirty/loading/save guard,
  • gestione stato dialog con error tracking,
  • toast errori automatico da una Ref<string | null>.

Sono headless: non importano @pzeta/vue-components e non hanno dipendenze da UI library specifiche. Le interazioni con toast/confirm/UI avvengono via callback iniettate dal MFE chiamante.

Composables disponibili

ComposableScopo
useMfeContextAccesso tipizzato al MFEContext (throw se non disponibile)
useCrudResourceRisorsa CRUD generica: items/loading/error + load/create/update/delete
useCrudViewUI CRUD su una risorsa: dialog state + handleCreate/handleEdit/handleSave/handleDelete
useDetailFormForm dettaglio: loading/isFormDirty/canSave + saving wrapper + markDirty/markClean/reset
useDialogStato dialog: visible/loading/error/hasError + open/close/setLoading/setError/reset
useErrorToastWatcher su una Ref<string | null> che chiama un callback toast

Quando usare cosa

ScenarioComposable
Recuperare http, eventBus, theme, getUser() dalla shelluseMfeContext
Lista CRUD generica (es. tabella ruoli/permessi/tag)useCrudResource
Lista CRUD + dialog di creazione/modifica + delete con confermauseCrudView (manuale) o useCrudViewFromResource (con bridge automatico)
Pagina di dettaglio con save abilitato solo se dirtyuseDetailForm
Dialog di conferma con loading + messaggio di errore inlineuseDialog
Mostrare automaticamente un toast quando una ref di errore cambiauseErrorToast

Pattern composto: lista CRUD completa

import { useToast, useConfirm } from 'primevue'
import {
  useMfeContext,
  useCrudResource,
  useCrudViewFromResource,
  useErrorToast,
} from '@pzeta/mfe-contracts/composables'

interface Tag { id: string; nome: string; colore: string }
interface CreateTagRequest { nome: string; colore: string }

const ctx = useMfeContext()
const toast = useToast()
const confirm = useConfirm()

// 1. Risorsa CRUD
const resource = useCrudResource<Tag, CreateTagRequest>({
  resourceName: 'tag',
  loadItems: async () => (await ctx.http.get<Tag[]>('/api/tags')).data,
  createItem: async (p) => (await ctx.http.post<Tag>('/api/tags', p)).data,
  updateItem: async (id, p) => (await ctx.http.put<Tag>(`/api/tags/${id}`, p)).data,
  deleteItem: async (id) => { await ctx.http.delete(`/api/tags/${id}`) },
})

// 2. UI CRUD ponteggiata sulla risorsa
const view = useCrudViewFromResource(resource, {
  singularName: 'tag',
  getDisplayName: (t) => t.nome,
  showErrorToast: (msg) => toast.add({ severity: 'error', detail: msg, life: 5000 }),
  showDeleteConfirm: (message, header, onAccept) =>
    confirm.require({ message, header, accept: onAccept }),
})

// 3. Toast automatico su resource.error
useErrorToast(resource.error, (msg) =>
  toast.add({ severity: 'error', detail: msg, life: 5000 }),
)

// 4. Carica iniziale
await resource.load()

Sotto-pagine