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
columnWidthnumberLarghezza della colonna in pixel (vista tabella)
readOnlybooleanImpedisce la modifica
disabledboolean | PropertyDisabledConfigDisabilita con tooltip opzionale
hideFromCollectionbooleanNasconde dalla vista tabella
defaultValueanyValore predefinito per nuove entità
validationobjectRegole di validazione
FieldReact.ComponentTypeComponente campo personalizzato
PreviewReact.ComponentTypeComponente cella di tabella personalizzato
propertyConfigstringChiave di configurazione della proprietà registrata
editablebooleanAbilita la modifica inline nella tabella (predefinito: true)
name: {
type: "string",
name: "Name",
validation: { required: true, min: 2, max: 200 }
}
description: {
type: "string",
name: "Description",
multiline: true, // Textarea
markdown: true // Markdown editor
}
category: {
type: "string",
name: "Category",
enum: [
{ id: "electronics", label: "Electronics", color: "blueDark" },
{ id: "clothing", label: "Clothing", color: "pinkLight" },
]
}
email: {
type: "string",
name: "Email",
email: true, // Email validation
validation: { required: true }
}
website: {
type: "string",
name: "Website",
url: true // URL validation
}
avatar: {
type: "string",
name: "Avatar",
storage: { // File upload
storagePath: "avatars",
acceptedFiles: ["image/*"],
maxSize: 2 * 1024 * 1024
}
}
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
}
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: "Active",
defaultValue: true
}

Campo switch

created_at: {
type: "date",
name: "Created At",
autoValue: "on_create", // Set automatically on creation
readOnly: true
}
updated_at: {
type: "date",
name: "Updated At",
autoValue: "on_update" // Set automatically on every save
}
event_date: {
type: "date",
name: "Event Date",
mode: "date" // Date only (no time)
}

Campo data

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)
tags: {
type: "array",
name: "Tags",
of: { type: "string" } // Array of strings
}
images: {
type: "array",
name: "Images",
of: {
type: "string",
storage: { storagePath: "images", acceptedFiles: ["image/*"] }
}
}
// Block editor (multiple types)
content: {
type: "array",
name: "Content Blocks",
oneOf: {
properties: {
text: {
type: "map",
properties: {
body: { type: "string", name: "Body", markdown: true }
}
},
image: {
type: "map",
properties: {
src: { type: "string", name: "Image", storage: { ... } },
caption: { type: "string", name: "Caption" }
}
}
}
}
}

Campo blocco

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)
address: {
type: "map",
name: "Address",
properties: {
street: { type: "string", name: "Street" },
city: { type: "string", name: "City" },
zip: { type: "string", name: "ZIP Code" },
country: { type: "string", name: "Country" }
}
}
metadata: {
type: "map",
name: "Metadata",
keyValue: true // Free-form key-value editor
}

Campo gruppo

ProprietàTipoDescrizione
propertiesPropertiesRecord delle proprietà incluse nella mappa
propertiesOrderstring[]Chiavi ordinate per il rendering
previewPropertiesstring[]Quali proprietà mostrare nell’anteprima della tabella
pickOnlySomeKeysbooleanPermette all’utente di aggiungere chiavi selettivamente nell’interfaccia utente
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

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" }
]

Campo selezione

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 }
})
}