Concetti

Dati Extra

Campi dinamici per schede tramite dati_extra JSONB.

Panoramica

dati_extra è una colonna JSONB su fasi.scheda che permette di estendere le schede con campi personalizzati per board senza migrazioni dello schema. La configurazione dei campi è in fasi.boardcampo.

Configurazione campi

// Aggiunge un campo "budget" numerico alla board 42
const nuovoCampo = await fasiService.creaBoardCampo({
  idboard: 42,
  nomecampo: 'budget',       // chiave in dati_extra
  etichetta: 'Budget (€)',   // label nel form
  tipocampo: 'number',
  obbligatorio: false,
  ordine: 1,
  attivo: true,
})

Tramite UI: BoardCampoCrudTable gestisce la configurazione visuale dei campi.

TipoCampo

TipoValore in dati_extraForm input
textstringInputText
textareastringTextarea
numbernumberInputNumber
datestring (ISO 8601)DatePicker
booleanbooleanCheckbox
selectstring (valore opzione)Select

Opzioni per select

Le opzioni possono essere statiche o dinamiche:

// Statiche — array in DB
{
  tipocampo: 'select',
  opzioni: [
    { label: 'Alta', value: 'alta' },
    { label: 'Media', value: 'media' },
    { label: 'Bassa', value: 'bassa' },
  ]
}

// Dinamiche — endpoint REST
{
  tipocampo: 'select',
  opzioni_url: '/api/categorie',
  opzioni_label: 'nome',
  opzioni_value: 'id',
}

Scrittura dati_extra

SchedaFormDialog costruisce automaticamente l'oggetto dati_extra dai campi compilati:

// Payload inviato a POST /scheda
{
  titolo: 'Nuovo cliente',
  idfase: 5,
  dati_extra: {
    budget: 15000,
    categoria: 'enterprise',
    urgente: true,
  }
}

Lettura in ElementCard

ElementCard mostra i campi extra con valore non nullo nell'ordine configurato:

Budget (€):   15.000
Categoria:    Enterprise
Urgente:      Sì

Il rendering usa formatExtraValue che adatta la formattazione al tipo di campo.

Accesso programmatico

const scheda = fasiService.schede.value.find(s => s.idscheda === id)
const budget = scheda?.dati_extra?.budget as number | null

Note

  • nomecampo deve essere univoco per board — usare nomi descrittivi senza spazi (es. data_firma, valore_contratto).
  • Campi disattivati (attivo: false) non vengono mostrati nel form né nella card, ma i valori rimangono in dati_extra.
  • Non esiste schema enforcement a DB — la validazione è gestita lato form da SchedaFormDialog.