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

PropTipoDefaultDescrizione
tipiTipoAttivita[]Richiesto. Lista tipi (presentational — niente fetch interno)
loadingbooleanfalseStato caricamento per skeleton DataTable

Emits

EventoPayloadDescrizione
nuovoClick "Nuovo tipo"
editTipoAttivitaModifica tipo
toggleAttivoTipoAttivitaToggle switch attivo
gestisciConcatenamentiTipoAttivitaApre dialog concatenamenti
eliminaTipoAttivitaConferma eliminazione (gestita internamente con useConfirmPopup)

TipoAttivitaForm

Form per creare e modificare un tipo attività.

Anteprima live

Props

PropTipoDefaultDescrizione
visiblebooleanRichiesto. Visibilità dialog (v-model:visible)
tipoTipoAttivitaundefinedTipo da modificare (omettere → nuovo). Internamente gestito come Partial<TipoAttivita> per popolare i campi del DynamicFormDialog
submittingbooleanfalseLoading state esterno gestito dal parent durante save async

Emits

EventoPayloadDescrizione
update:visiblebooleanCambio visibilità
submitPartial<TipoAttivita>Conferma form — il parent chiama poi repository.createTipoAttivita o updateTipoAttivita
cancelChiusura 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

CampoDescrizione
nomeNome visualizzato
codtipoattivitaCodice identificativo
iconaClasse PrimeFont (es. pi-phone)
coloreNome colore Tailwind (es. blue)
azioneComportamento speciale: riunione, upload_documento, richiesta_firma
cartellaRaggruppamento nella lista
idutentepredefinitoAssegnatario predefinito
riepilogopredefinitoTesto pre-compilato
notapredefinitaNota pre-compilata
mantienicompletateMantieni le istanze completate visibili
ordinamentoPosizione nella lista
attivoNasconde il tipo dal form utente

ConcatenamentoForm

Form per configurare un concatenamento — attività successiva attivata o suggerita al completamento/annullamento.

Anteprima live

Props

PropTipoDefaultDescrizione
attivitaSuggeriteAttivitaSuccessiva[]Richiesto. Suggerimenti da mostrare dopo un completamento (tipicamente completaResponse.attivita_successive)
visiblebooleanRichiesto. Visibilità (v-model:visible)
entitasorgentestring''Pre-fill per pianificare la suggerita
identitasorgentenumber0Pre-fill per pianificare la suggerita

Emits

EventoPayloadDescrizione
update:visiblebooleanCambio visibilità
accettaL'utente ha accettato un suggerimento (apre AttivitaForm con initialState precompilato)
rifiutaL'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 ConcatenamentoForm dopo 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

PropTipoDescrizione
tipoTipoAttivitaRichiesto. Tipo di partenza (i tipo.concatenamenti esistenti vengono mostrati come lista)
visiblebooleanRichiesto. Visibilità (v-model:visible)

Emits

EventoPayloadDescrizione
update:visiblebooleanCambio visibilità
updatedConcatenamenti 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>