Admin
Panoramica
title: Amministrazione Tipi description: Componenti per configurare tipi attività e concatenamenti.
Panoramica
La sezione di amministrazione permette di configurare i tipi di attività disponibili nel sistema e le sequenze automatiche (concatenamenti) tra di essi.
TipoAttivitaList
Tabella di elenco dei tipi attività con pulsante "Nuovo" e azioni inline modifica/elimina.
Anteprima live (con IHttpClient mockato)
<TipoAttivitaList
:tipi="tipi"
:loading="loading"
@nuovo="apriFormNuovo"
@edit="(t) => apriFormModifica(t)"
@toggle-attivo="(t) => toggleAttivo(t)"
@gestisci-concatenamenti="(t) => apriDialogConcatenamenti(t)"
@elimina="(t) => eliminaTipo(t)"
/>
Props
| Prop | Tipo | Default | Descrizione |
|---|---|---|---|
tipi | TipoAttivita[] | — | Richiesto. Lista tipi (presentational — niente fetch interno) |
loading | boolean | false | Stato caricamento per skeleton DataTable |
Emits
| Evento | Payload | Descrizione |
|---|---|---|
nuovo | — | Click "Nuovo tipo" |
edit | TipoAttivita | Modifica tipo |
toggleAttivo | TipoAttivita | Toggle switch attivo |
gestisciConcatenamenti | TipoAttivita | Apre dialog concatenamenti |
elimina | TipoAttivita | Conferma eliminazione (gestita internamente con useConfirmPopup) |
TipoAttivitaForm
Form per creare e modificare un tipo attività.
Anteprima live
Props
| Prop | Tipo | Default | Descrizione |
|---|---|---|---|
visible | boolean | — | Richiesto. Visibilità dialog (v-model:visible) |
tipo | TipoAttivita | undefined | Tipo da modificare (omettere → nuovo). Internamente gestito come Partial<TipoAttivita> per popolare i campi del DynamicFormDialog |
submitting | boolean | false | Loading state esterno gestito dal parent durante save async |
Emits
| Evento | Payload | Descrizione |
|---|---|---|
update:visible | boolean | Cambio visibilità |
submit | Partial<TipoAttivita> | Conferma form — il parent chiama poi repository.createTipoAttivita o updateTipoAttivita |
cancel | — | Chiusura senza salvare |
Pattern submit: come per
CompletaDialog/AnnullaDialog, il form non chiama il backend. Emette submit con i dati validati e il parent decide come persistere. Questo permette al parent di gestire submitting, toast e refresh in modo centralizzato.Campi configurabili
| Campo | Descrizione |
|---|---|
nome | Nome visualizzato |
codtipoattivita | Codice identificativo |
icona | Classe PrimeFont (es. pi-phone) |
colore | Nome colore Tailwind (es. blue) |
azione | Comportamento speciale: riunione, upload_documento, richiesta_firma |
cartella | Raggruppamento nella lista |
idutentepredefinito | Assegnatario predefinito |
riepilogopredefinito | Testo pre-compilato |
notapredefinita | Nota pre-compilata |
mantienicompletate | Mantieni le istanze completate visibili |
ordinamento | Posizione nella lista |
attivo | Nasconde il tipo dal form utente |
ConcatenamentoForm
Form per configurare un concatenamento — attività successiva attivata o suggerita al completamento/annullamento.
Anteprima live
Props
| Prop | Tipo | Default | Descrizione |
|---|---|---|---|
attivitaSuggerite | AttivitaSuccessiva[] | — | Richiesto. Suggerimenti da mostrare dopo un completamento (tipicamente completaResponse.attivita_successive) |
visible | boolean | — | Richiesto. Visibilità (v-model:visible) |
entitasorgente | string | '' | Pre-fill per pianificare la suggerita |
identitasorgente | number | 0 | Pre-fill per pianificare la suggerita |
Emits
| Evento | Payload | Descrizione |
|---|---|---|
update:visible | boolean | Cambio visibilità |
accetta | — | L'utente ha accettato un suggerimento (apre AttivitaForm con initialState precompilato) |
rifiuta | — | L'utente ha rifiutato il suggerimento corrente |
Concatenamento — struttura
interface Concatenamento {
idtipoattivitanext: number
tipoconcatenamento: 'suggerisci' | 'attiva'
intervallovalore: number
intervallounita: 'giorni' | 'settimane' | 'mesi'
riferimentodata: 'scadenza' | 'completamento'
}
- suggerisci: mostra il
ConcatenamentoFormdopo il completamento; l'utente decide se pianificare - attiva: crea automaticamente l'attività successiva senza intervento utente
ConcatenamentoGestioneDialog
Dialog per gestire tutti i concatenamenti configurati su un tipo attività. Costruito su DynamicFormListDialog di @pzeta/vue-form (lista embedded + form di aggiunta inline).
Anteprima live
Props
| Prop | Tipo | Descrizione |
|---|---|---|
tipo | TipoAttivita | Richiesto. Tipo di partenza (i tipo.concatenamenti esistenti vengono mostrati come lista) |
visible | boolean | Richiesto. Visibilità (v-model:visible) |
Emits
| Evento | Payload | Descrizione |
|---|---|---|
update:visible | boolean | Cambio visibilità |
updated | — | Concatenamenti modificati — il parent ricarica i tipi |
<ConcatenamentoGestioneDialog
:visible="showDialog"
:tipo="tipoSelezionato"
@update:visible="showDialog = $event"
@updated="reloadTipi"
/>
Pagina amministrazione completa
<script setup lang="ts">
import { ref } from 'vue'
import {
useTipiAttivita,
TipoAttivitaList,
TipoAttivitaForm,
ConcatenamentoGestioneDialog,
} from '@pzeta/vue-attivita'
const { tipi, loading, fetchTipi, createTipo, updateTipo } = useTipiAttivita()
await fetchTipi()
const showForm = ref(false)
const tipoInModifica = ref<TipoAttivita | undefined>(undefined)
const tipoConcatenamenti = ref<TipoAttivita | null>(null)
async function handleSubmit(payload: Partial<TipoAttivita>) {
if (tipoInModifica.value) {
await updateTipo(tipoInModifica.value.idtipoattivita, payload)
} else {
await createTipo(payload as Omit<TipoAttivita, 'idtipoattivita' | 'concatenamenti'>)
}
showForm.value = false
}
</script>
<template>
<TipoAttivitaList
:tipi="tipi"
:loading="loading"
@nuovo="() => { tipoInModifica = undefined; showForm = true }"
@edit="(t) => { tipoInModifica = t; showForm = true }"
@gestisci-concatenamenti="(t) => tipoConcatenamenti = t"
/>
<TipoAttivitaForm
:visible="showForm"
:tipo="tipoInModifica"
@update:visible="showForm = $event"
@submit="handleSubmit"
/>
<ConcatenamentoGestioneDialog
v-if="tipoConcatenamenti"
:visible="!!tipoConcatenamenti"
:tipo="tipoConcatenamenti"
@update:visible="(v) => !v && (tipoConcatenamenti = null)"
@updated="fetchTipi(true)"
/>
</template>