Overlays

ConfirmDialog

Dialog di conferma modale gestito tramite il composable `useConfirm()`. Si posiziona globalmente nell'app e viene attivato programmaticamente, senza v-model.

Import

import { ConfirmDialog } from '@pzeta/vue-components'
import { useConfirm } from '@pzeta/vue-components'
// oppure con plugin selettivo:
import { OverlaysPlugin } from '@pzeta/vue-components'
app.use(OverlaysPlugin)

Pattern service con useConfirm()

ConfirmDialog non si usa con v-model. Il componente va registrato una volta nel layout principale dell'app; le conferme vengono poi richieste da qualsiasi componente figlio tramite il composable useConfirm().

1. Registrazione nel layout

<!-- App.vue o layout principale -->
<template>
  <RouterView />
  <ConfirmDialog />
</template>

2. Utilizzo nei componenti

Props

PropTipoDefaultDescrizione
groupstring'default'Gruppo per distinguere dialogs multipli nella stessa app
widthstring'450px'Larghezza del dialog
draggablebooleanfalseAbilita il trascinamento del dialog
positionConfirmationOptions['position']'center'Posizione del dialog sullo schermo
transitionstring'hs-confirm'Nome della transizione CSS

ConfirmationOptions

Oggetto passato a confirm.require(options):

OpzioneTipoDefaultDescrizione
messagestring—Messaggio principale da mostrare
headerstringt('overlay.confirmHeader')Titolo del dialog
iconstringicona da ConfigPluginClasse CSS icona (es. pi pi-exclamation-triangle)
severitySeverity'warn'Severity per lo stile visivo del dialog
groupstring—Gruppo target (deve corrispondere alla prop group del componente)
acceptLabelstringt('overlay.confirmAccept')Testo pulsante accetta
rejectLabelstringt('overlay.confirmReject')Testo pulsante rifiuta
acceptIconstring—Classe CSS icona pulsante accetta
rejectIconstring—Classe CSS icona pulsante rifiuta
acceptSeveritySeverity'primary'Severity pulsante accetta
rejectSeveritySeverity'secondary'Severity pulsante rifiuta
acceptClassstring—Classe CSS aggiuntiva pulsante accetta
rejectClassstring—Classe CSS aggiuntiva pulsante rifiuta
accept() => void—Callback eseguito quando l'utente accetta
reject() => void—Callback eseguito quando l'utente rifiuta
dismissableMaskbooleanfalseChiude al click fuori dal dialog. Dalla 1.9.0 il default è false
closeOnEscapebooleantrueChiude alla pressione di Escape
blockScrollbooleantrueBlocca lo scroll del body
position'center' | 'top' | 'bottom' | 'left' | 'right' | 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right''center'Posizione del dialog

Emits

EventoPayloadDescrizione
show—Dialog reso visibile
hide—Dialog nascosto
accept—Utente ha accettato
reject—Utente ha rifiutato

Slot

SlotScopeDescrizione
message{ message: ConfirmationOptions }Contenuto messaggio personalizzato
icon{ message: ConfirmationOptions }Icona personalizzata
accepticon—Icona pulsante accetta
rejecticon—Icona pulsante rifiuta
footer{ message, acceptCallback, rejectCallback }Footer personalizzato con i pulsanti
container{ message, acceptCallback, rejectCallback, closeCallback }Sostituzione completa del contenuto del dialog (headless mode)

Esempi

Dialogs multipli con gruppi

Nota: la funzionalità multi-gruppo richiede il fix #20. L'esempio seguente usa un singolo dialog come workaround.

Chiusura programmatica

const confirm = useConfirm()

// Apre il dialog
confirm.require({ message: 'Confermare?' })

// Chiude il dialog senza eseguire i callback
confirm.close()

Chiusura dal click fuori

Dalla versione 1.9.0 il click sulla mask non rifiuta la conferma: rispondere al posto dell'utente su una domanda che spesso riguarda un'azione distruttiva è un effetto indesiderato. Il pannello pulsa brevemente per segnalare che serve una risposta esplicita, dai pulsanti o da Escape.

Per ripristinare il comportamento precedente su una singola richiesta:

confirm.require({
  message: 'Vuoi continuare?',
  dismissableMask: true,   // il click fuori equivale a "rifiuta"
  accept: () => salva(),
})

Accessibilità

  • Renderizzato con role="alertdialog" e aria-modal="true"
  • aria-labelledby e aria-describedby collegati automaticamente agli ID interni
  • Focus sul dialog all'apertura
  • Chiusura con Escape (configurabile per singola richiesta tramite closeOnEscape)
  • Usa <Teleport to="body"> per corretto stacking context

TypeScript

import type {
  ConfirmDialogProps,
  ConfirmDialogEmits,
  ConfirmationOptions,
  ConfirmService,
} from '@pzeta/vue-components'