Typescript

Injection Keys

InjectionKey tipizzate per la comunicazione provide/inject tra componenti padre e figlio — AccordionKey, ButtonGroupKey, TabsKey, ToastServiceKey e altre.

Le injection keys permettono la comunicazione type-safe tra componenti padre e figlio usando il pattern provide/inject di Vue 3. Ogni chiave è un Symbol tipizzato che garantisce il corretto tipo del valore iniettato.

Sorgenti: src/types/injection-keys.ts, src/composables/useToast.ts, src/composables/useConfirm.ts, src/composables/useConfirmPopup.ts, src/config/configPlugin.ts.


AccordionKey

export const AccordionKey: InjectionKey<AccordionContext> = Symbol('accordion');

Iniettato dal componente Accordion root per condividere lo stato con i pannelli figlio (AccordionPanel, AccordionHeader, AccordionContent).

export interface AccordionContext {
  activeValue: Ref<AccordionActiveValue>;
  multiple: boolean;
  lazy: boolean;
  expandIcon: string | null;
  collapseIcon: string | null;
  togglePanel: (value: AccordionValue, event?: Event) => void;
  shouldRenderPanel: (value: AccordionValue) => boolean;
}
CampoTipoDescrizione
activeValueRef<AccordionActiveValue>Valore/valori dei pannelli aperti
multiplebooleanPermette più pannelli aperti simultaneamente
lazybooleanLazy load del contenuto dei pannelli
expandIconstring | nullIcona di espansione
collapseIconstring | nullIcona di collasso
togglePanelFunctionApre/chiude un pannello per valore
shouldRenderPanelFunctionDetermina se il contenuto deve essere renderizzato

AccordionPanelKey

export const AccordionPanelKey: InjectionKey<AccordionPanelContext> = Symbol('accordionPanel');

Iniettato dal singolo AccordionPanel per condividere il proprio stato con header e content interni.

export interface AccordionPanelContext {
  value: AccordionValue;
  disabled: boolean;
  isActive: Ref<boolean>;
  toggle: () => void;
}

ButtonGroupKey

export const ButtonGroupKey: InjectionKey<ButtonGroupContext | null> = Symbol('buttonGroupContext');

Iniettato dal componente ButtonGroup (o SelectButton) per coordinare la selezione tra i pulsanti figlio. Può essere null quando il pulsante è usato fuori da un gruppo.

export interface ButtonGroupContext {
  selectedValue: ComputedRef<string | number | null | undefined>;
  onSelect: (value: string | number | null) => void;
}
CampoTipoDescrizione
selectedValueComputedRef<string | number | null | undefined>Valore attualmente selezionato nel gruppo
onSelectFunctionNotifica la selezione di un pulsante al gruppo

StepperKey

export const StepperKey: InjectionKey<ComputedRef<StepperContext>> = Symbol('stepperContext');

Iniettato dal componente Stepper root per condividere lo stato di avanzamento con gli step figlio.

export interface StepperContext {
  activeValue: string | number | undefined;
  completedValues: Set<string | number>;
  orientation: StepperOrientation;
  linear: boolean;
  severity?: Severity;
  size?: Size;
  selectStep: (value: string | number) => void;
  completeStep: (value: string | number) => void;
  isStepCompleted: (value: string | number) => boolean;
  registerStep: (value: string | number) => void;
}
CampoTipoDescrizione
activeValuestring | number | undefinedStep correntemente attivo
completedValuesSet<string | number>Insieme degli step completati
orientationStepperOrientationOrientamento orizzontale/verticale
linearbooleanForza progressione lineare
severitySeverityColore degli step
sizeSizeDimensione degli step
selectStepFunctionNaviga verso uno step
completeStepFunctionSegna uno step come completato
isStepCompletedFunctionVerifica se uno step è completato
registerStepFunctionRegistra uno step nel contesto

TabsKey

export const TabsKey: InjectionKey<ComputedRef<TabsContext>> = Symbol('tabsContext');

Iniettato dal componente Tabs root per condividere lo stato con TabList, Tab e TabPanel.

export interface TabsContext {
  activeValue: string | number;
  variant: TabsVariant;
  size: Size;
  severity?: Severity;
  rounded?: boolean;
  orientation: TabsOrientation;
  closeIcon: string;
  selectTab: (value: string | number, event?: Event) => void;
  registerTab: (value: string | number, index: number) => void;
}
CampoTipoDescrizione
activeValuestring | numberTab attualmente attivo
variantTabsVariantVariante visiva delle tab
sizeSizeDimensione delle tab
severitySeverityColore delle tab
roundedbooleanBordi arrotondati
orientationTabsOrientationOrientamento orizzontale/verticale
closeIconstringIcona chiusura tab (per tab chiudibili)
selectTabFunctionAttiva una tab per valore
registerTabFunctionRegistra una tab nel contesto

ToastServiceKey

export const ToastServiceKey: InjectionKey<ToastService> = Symbol('ToastService');

Iniettato dal componente ToastProvider (o dall'app root) per rendere disponibile il servizio toast tramite il composable useToast().

export interface ToastService {
  add: (message: ToastMessage) => number;
  remove: (id: number) => void;
  removeAll: () => void;
  info: (title: string, message?: string, life?: number) => number;
  success: (title: string, message?: string, life?: number) => number;
  warn: (title: string, message?: string, life?: number) => number;
  error: (title: string, message?: string, life?: number) => number;
}

Utilizzo tramite composable:

import { useToast } from '@pzeta/vue-components'

const toast = useToast()
toast.success('Salvato', 'Operazione completata con successo')
toast.error('Errore', 'Si è verificato un problema')

ConfirmServiceKey

export const ConfirmServiceKey: InjectionKey<ConfirmService> = Symbol('ConfirmService');

Iniettato dal componente ConfirmDialog per rendere disponibile il servizio di conferma tramite il composable useConfirm().

Utilizzo tramite composable:

import { useConfirm } from '@pzeta/vue-components'

const confirm = useConfirm()
confirm.require({
  message: 'Sei sicuro di voler procedere?',
  header: 'Conferma',
  severity: 'warn',
  accept: () => doAction()
})

ConfirmPopupServiceKey

export const ConfirmPopupServiceKey: InjectionKey<UseConfirmPopup> = Symbol('ConfirmPopupService');

Iniettato dal componente ConfirmPopup per il servizio di conferma inline (popover), alternativo al dialog modale.


ConfigKey

export const ConfigKey: InjectionKey<PzetaConfig> = Symbol('pzeta-config');

Iniettato dal ConfigPlugin a livello applicazione per rendere disponibile la configurazione globale (icone dei componenti) tramite il composable useIcons().

export interface PzetaConfig {
  icons: ComponentIcons;
  setIcons: (newIcons: DeepPartial<ComponentIcons>) => void;
}

Setup:

import { createApp } from 'vue'
import { ConfigPlugin } from '@pzeta/vue-components'

const app = createApp(App)
app.use(ConfigPlugin, {
  icons: {
    common: { close: 'fa fa-times' }
  }
})