Salta ai contenuti

Proprietà

Le proprietà definiscono le colonne nella tabella del database e come vengono renderizzate nell’interfaccia utente di amministrazione. Ogni proprietà ha un type che determina:

  • Il tipo di colonna del database (tramite la generazione dello schema Drizzle)
  • Il componente campo del modulo
  • Il renderer della cella di tabella
  • Le regole di validazione
TypeDescrizioneColonna PostgreSQL
stringTesto, selezione, markdown, caricamento file, URL, emailvarchar, text, jsonb
numberIntero, decimale, valutainteger, numeric, bigint, serial
booleanInterruttore vero/falsoboolean
dateData, data e ora, timestamptimestamp, date
arrayElenco ordinato di valorijsonb
mapOggetto chiave-valorejsonb
geopointCoppia latitudine/longitudinejsonb
referenceRiferimento incorporato a un’altra entitàvarchar (memorizza ID)
relationRelazione di chiave esterna SQLUsa l’array relations

Tutti i tipi di proprietà condividono queste opzioni:

ProprietàTipoDescrizione
typestringObbligatorio. Tipo di dato (vedi sopra)
namestringObbligatorio. Etichetta di visualizzazione
descriptionstringTesto di aiuto mostrato sotto il campo
defaultValueanyValore predefinito per nuove entità
validationobjectRegole di validazione
propertyConfigstringChiave di configurazione della proprietà registrata
columnNamestringNome esplicito della colonna del database (bypassa la conversione snake_case)
callbacksPropertyCallbacksHook per le trasformazioni afterRead e beforeSave
dynamicPropsfunctionCostruttore di proprietà dinamico (vedi Campi Condizionali)
conditionsPropertyConditionsCondizioni dichiarative JSON Logic

Le opzioni relative all’interfaccia utente sono raggruppate sotto il sotto-oggetto ui:

price: {
type: "number",
name: "Price",
ui: {
readOnly: true,
columnWidth: 120,
hideFromCollection: false
}
}
ProprietàTipoDescrizione
ui.readOnlybooleanImpedisce la modifica
ui.disabledboolean | PropertyDisabledConfigDisabilita con tooltip opzionale
ui.hideFromCollectionbooleanNasconde dalla vista tabella
ui.columnWidthnumberLarghezza della colonna in pixel (vista tabella)
ui.widthPercentagenumberLarghezza del campo come percentuale nella vista modulo
ui.FieldReact.ComponentTypeComponente campo personalizzato
ui.PreviewReact.ComponentTypeComponente cella di tabella personalizzato

Il tipo string è il più versatile — a seconda delle opzioni impostate, viene renderizzato come widget diversi.

Un input di testo a riga singola di base.

name: {
type: "string",
name: "Name",
validation: { required: true, min: 2, max: 200 }
}

Imposta multiline: true per renderizzare come textarea.

description: {
type: "string",
name: "Description",
multiline: true
}

Imposta markdown: true per renderizzare un editor markdown completo con barra degli strumenti.

body: {
type: "string",
name: "Blog text",
markdown: true
}

Imposta email: true per aggiungere la validazione del formato email e renderizzare con un’icona email.

email: {
type: "string",
name: "User email",
email: true,
validation: { required: true }
}

Imposta url: true per aggiungere la validazione del formato URL e renderizzare con un’icona link.

website: {
type: "string",
name: "Amazon link",
url: true
}

Imposta storage per renderizzare una zona di caricamento file tramite trascinamento.

avatar: {
type: "string",
name: "Main image",
storage: {
storagePath: "avatars",
acceptedFiles: ["image/*"],
maxSize: 2 * 1024 * 1024
}
}

Imposta enum per renderizzare un menu a discesa di selezione. Vedi la sezione Valori Enum per i dettagli.

category: {
type: "string",
name: "Category",
enum: [
{ id: "electronics", label: "Electronics", color: "blueDark" },
{ id: "clothing", label: "Clothing", color: "pinkLight" },
]
}

Imposta enum + multiSelect: true per consentire la selezione di più valori.

locales: {
type: "string",
name: "Available locales",
multiSelect: true,
enum: [
{ id: "es", label: "Spanish", color: "pinkLight" },
{ id: "en", label: "English", color: "blueLight" },
{ id: "fr", label: "French", color: "purpleLight" },
]
}
ProprietàTipoDescrizione
multilinebooleanRenderizza come textarea
markdownbooleanRenderizza come editor markdown
emailbooleanValidazione formato email
urlbooleanValidazione formato URL
storageStorageConfigAbilita il caricamento di file
enumEnumValuesRenderizza come menu a discesa di selezione
multiSelectbooleanConsente selezioni multiple di enum
columnTypestringColonna del database: "varchar", "text"
isIdstringGenerazione ID: "uuid", "cuid", "increment", "manual"
userSelectbooleanRenderizza come selettore utente
previewAsTagbooleanRenderizza questa stringa come un tag nelle anteprime
clearablebooleanAggiunge un’icona per cancellare il valore (imposta su null)
price: {
type: "number",
name: "Price",
validation: { required: true, min: 0 }
}
quantity: {
type: "number",
name: "Quantity",
columnType: "integer" // Store as integer
}

I campi numero vengono visualizzati come un input di testo standard con validazione numerica.

ProprietàTipoDescrizione
enumEnumValuesRenderizza come selezione con valori numerici
columnTypestring"integer", "bigint", "numeric", "serial", "smallint"
isIdstringStrategia di generazione ID
clearablebooleanAggiunge un’icona per cancellare il valore (imposta su null)
active: {
type: "boolean",
name: "Selectable",
defaultValue: true
}

I campi booleani vengono visualizzati come un interruttore a levetta.

Imposta mode: "date" per mostrare un selettore di data senza orario.

event_date: {
type: "date",
name: "Expiry date",
mode: "date"
}

La modalità predefinita "date_time" include sia la data che l’orario.

arrival_time: {
type: "date",
name: "Arrival time",
mode: "date_time"
}

Usa autoValue per impostare automaticamente i timestamp alla creazione o all’aggiornamento.

created_at: {
type: "date",
name: "Created At",
autoValue: "on_create",
ui: { readOnly: true }
}
updated_at: {
type: "date",
name: "Updated At",
autoValue: "on_update"
}
ProprietàTipoDescrizione
mode"date" | "date_time"Solo data o data + ora (predefinito: "date_time")
autoValue"on_create" | "on_update"Imposta automaticamente i timestamp
columnTypestring"timestamp", "date"
timezonestringStringa del fuso orario per valutare la data
clearablebooleanAggiunge un’icona per cancellare il valore (imposta su null)

Usa of per definire una lista ripetibile di elementi.

tags: {
type: "array",
name: "Tags",
of: { type: "string" }
}

Combina of con storage per un caricamento di più file.

images: {
type: "array",
name: "Images",
of: {
type: "string",
storage: { storagePath: "images", acceptedFiles: ["image/*"] }
}
}

Usa oneOf per creare un editor a blocchi con più tipi di contenuto. Ogni chiave crea un tipo di scheda che gli utenti possono selezionare.

content: {
type: "array",
name: "Content",
oneOf: {
properties: {
text: {
type: "map",
properties: {
body: { type: "string", name: "Text", markdown: true }
}
},
image: {
type: "map",
properties: {
src: { type: "string", name: "Image", storage: { storagePath: "content" } },
caption: { type: "string", name: "Caption" }
}
}
}
}
}
ProprietàTipoDescrizione
ofProperty | Property[]Schema di proprietà per gli elementi dell’array
oneOfobjectArray di oggetti tipizzati con più tipi discriminatori
expandedbooleanIl campo dovrebbe essere inizialmente espanso (predefinito: true)
minimalistViewbooleanVisualizza le proprietà figlie direttamente senza pannello estendibile
sortablebooleanGli elementi possono essere riordinati (predefinito: true)
canAddElementsbooleanPossono essere aggiunti nuovi elementi (predefinito: true)

Usa properties per definire un oggetto strutturato con campi denominati.

address: {
type: "map",
name: "Address",
properties: {
street: { type: "string", name: "Street" },
zip: { type: "string", name: "Postal code" }
}
}

Imposta keyValue: true per renderizzare un editor di coppie chiave-valore arbitrarie.

metadata: {
type: "map",
name: "Key value",
keyValue: true
}
ProprietàTipoDescrizione
propertiesPropertiesRecord delle proprietà incluse nella mappa
propertiesOrderstring[]Chiavi ordinate per il rendering
previewPropertiesstring[]Quali proprietà mostrare nell’anteprima della tabella
spreadChildrenbooleanRenderizza le proprietà figlie come colonne separate nella vista tabella
minimalistViewbooleanVisualizza le proprietà senza un pannello di contenimento
expandedbooleanIl campo dovrebbe essere inizialmente espanso (predefinito: true)
keyValuebooleanRenderizza come editor di coppie chiave-valore arbitrario

I riferimenti collegano a entità in un’altra collection. Vengono visualizzati come una scheda di anteprima che mostra i dettagli dell’entità referenziata.

client: {
type: "reference",
name: "Related client",
path: "clients",
previewProperties: ["first_name", "last_name", "email"]
}

Usato con proprietà stringa o numero per renderizzare i selettori:

// Simple array
enum: ["draft", "published", "archived"]
// With labels
enum: [
{ id: "draft", label: "Draft" },
{ id: "published", label: "Published" },
{ id: "archived", label: "Archived" }
]
// With colors (for Kanban columns and chips)
enum: [
{ id: "draft", label: "Draft", color: "grayDark" },
{ id: "published", label: "Published", color: "greenDark" },
{ id: "archived", label: "Archived", color: "orangeDark" }
]
validation: {
required: true, // Campo obbligatorio
unique: true, // Deve essere unico nella tabella
requiredMessage: "Custom error message",
// Specifico per stringhe
min: 2, // Lunghezza minima
max: 200, // Lunghezza massima
matches: /^[a-z]+$/, // Pattern Regex
email: true, // Formato email
url: true, // Formato URL
// Specifico per numeri
min: 0, // Valore minimo
max: 1000, // Valore massimo
integer: true, // Deve essere un intero
// Specifico per array
min: 1, // Numero minimo di elementi
max: 10, // Numero massimo di elementi
}

È possibile rendere i campi dinamici in modo che reagiscano ai valori dell’entità. Ci sono due modi per farlo:

È possibile utilizzare la proprietà conditions per definire regole JSON Logic dichiarative che possono essere serializzate e modificate visivamente nell’editor di collection.

price: {
type: "number",
name: "Price",
conditions: {
disabled: { "==": [{ "var": "values.is_free" }, true] },
required: { "!=": [{ "var": "values.is_free" }, true] },
min: 0,
clearOnDisabled: true // Imposta su null se il campo viene disabilitato
}
}

L’oggetto conditions ti dà accesso a:

  • disabled, hidden, readOnly
  • required, min, max
  • defaultValue
  • enumConditions, allowedEnumValues, excludedEnumValues
  • referencePath, referenceFilter
  • canAddElements, sortable (per array)

Per comportamenti complessi che non possono essere espressi tramite JSON Logic, è possibile utilizzare dynamicProps che valuta una funzione Javascript.

price: {
type: "number",
name: "Price",
dynamicProps: ({ values, user }) => ({
disabled: values.is_free === true || !user.roles.includes("admin"),
validation: values.is_free ? {} : { required: true, min: 0 }
})
}