Zum Inhalt springen

Eigenschaften

Eigenschaften definieren die Spalten in Ihrer Datenbanktabelle und wie sie in der Admin-Benutzeroberfläche gerendert werden. Jede Eigenschaft hat einen type, der Folgendes bestimmt:

  • Den Datenbankspaltentyp (über Drizzle-Schema-Generierung)
  • Die Formularfeld-Komponente
  • Den Tabellenzellen-Renderer
  • Die Validierungs-Regeln
TypeBeschreibungPostgreSQL-Spalte
stringText, Auswahl, Markdown, Dateiupload, URL, E-Mailvarchar, text, jsonb
numberGanzzahl, Dezimalzahl, Währunginteger, numeric, bigint, serial
booleanWahr/Falsch-Umschalterboolean
dateDatum, Datum/Uhrzeit, Zeitstempeltimestamp, date
arrayGeordnete Liste von Wertenjsonb
mapSchlüssel-Wert-Objektjsonb
geopointBreiten-/Längengrad-Paarjsonb
referenceEingebetteter Verweis auf eine andere Entitätvarchar (speichert ID)
relationSQL-FremdschlüsselbeziehungVerwendet das relations-Array

Alle Eigenschaftstypen teilen diese Optionen:

PropertyTypeBeschreibung
typestringErforderlich. Datentyp (siehe oben)
namestringErforderlich. Anzeigebezeichnung
descriptionstringHilfetext, der unterhalb des Feldes angezeigt wird
defaultValueanyStandardwert für neue Entitäten
validationobjectValidierungsregeln
propertyConfigstringRegistrierter Eigenschafts-Konfigurationsschlüssel
columnNamestringExpliziter Datenbankspaltenname (umgeht die snake_case-Konvertierung)
callbacksPropertyCallbacksHooks für afterRead- und beforeSave-Transformationen
dynamicPropsfunctionDynamischer Property-Builder (siehe Bedingte Felder)
conditionsPropertyConditionsDeklarative JSON Logic-Bedingungen

UI-bezogene Optionen werden im ui-Unterobjekt verschachtelt:

price: {
type: "number",
name: "Price",
ui: {
readOnly: true,
columnWidth: 120,
hideFromCollection: false
}
}
PropertyTypeBeschreibung
ui.readOnlybooleanBearbeitung verhindern
ui.disabledboolean | PropertyDisabledConfigDeaktivieren mit optionalem Tooltip
ui.hideFromCollectionbooleanAus der Tabellenansicht ausblenden
ui.columnWidthnumberSpaltenbreite in Pixeln (Tabellenansicht)
ui.widthPercentagenumberFeldbreite als Prozentwert in der Formularansicht
ui.FieldReact.ComponentTypeBenutzerdefinierte Feldkomponente
ui.PreviewReact.ComponentTypeBenutzerdefinierte Tabellenzellenkomponente

Der string-Typ ist am vielseitigsten — je nach den gesetzten Optionen wird er als unterschiedliche Widgets dargestellt.

Ein einfaches einzeiliges Texteingabefeld.

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

Setzen Sie multiline: true, um einen Textbereich darzustellen.

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

Setzen Sie markdown: true, um einen vollständigen Markdown-Editor mit Werkzeugleiste darzustellen.

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

Setzen Sie email: true, um E-Mail-Formatvalidierung hinzuzufügen und mit einem E-Mail-Symbol darzustellen.

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

Setzen Sie url: true, um URL-Formatvalidierung hinzuzufügen und mit einem Link-Symbol darzustellen.

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

Setzen Sie storage, um eine Dateiupload-Dropzone darzustellen.

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

Setzen Sie enum, um eine Auswahl-Dropdown darzustellen. Siehe den Abschnitt Enum-Werte für Details.

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

Setzen Sie enum + multiSelect: true, um die Auswahl mehrerer Werte zu ermöglichen.

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" },
]
}
PropertyTypeBeschreibung
multilinebooleanAls Textbereich rendern
markdownbooleanAls Markdown-Editor rendern
emailbooleanE-Mail-Formatvalidierung
urlbooleanURL-Formatvalidierung
storageStorageConfigDateiupload aktivieren
enumEnumValuesAls Auswahl-Dropdown rendern
multiSelectbooleanMehrere Enum-Auswahlen zulassen
columnTypestringDatenbankspalte: "varchar", "text"
isIdstringID-Generierung: "uuid", "cuid", "increment", "manual"
userSelectbooleanAls Benutzerauswahl rendern
previewAsTagbooleanDiese Zeichenkette als Tag in Vorschauen rendern
clearablebooleanEin Symbol zum Löschen des Wertes hinzufügen (auf null setzen)
price: {
type: "number",
name: "Price",
validation: { required: true, min: 0 }
}
quantity: {
type: "number",
name: "Quantity",
columnType: "integer" // Als Ganzzahl speichern
}

Zahlenfelder werden als Standard-Texteingabe mit numerischer Validierung dargestellt.

PropertyTypeBeschreibung
enumEnumValuesAls Auswahl mit numerischen Werten rendern
columnTypestring"integer", "bigint", "numeric", "serial", "smallint"
isIdstringID-Generierungsstrategie
clearablebooleanEin Symbol zum Löschen des Wertes hinzufügen (auf null setzen)
active: {
type: "boolean",
name: "Selectable",
defaultValue: true
}

Boolean-Felder werden als Kippschalter dargestellt.

Setzen Sie mode: "date", um einen Datumswähler ohne Uhrzeit anzuzeigen.

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

Der Standardmodus "date_time" enthält sowohl Datum als auch Uhrzeit.

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

Verwenden Sie autoValue, um Zeitstempel bei Erstellung oder Aktualisierung automatisch zu setzen.

created_at: {
type: "date",
name: "Created At",
autoValue: "on_create",
ui: { readOnly: true }
}
updated_at: {
type: "date",
name: "Updated At",
autoValue: "on_update"
}
PropertyTypeBeschreibung
mode"date" | "date_time"Nur Datum oder Datum + Uhrzeit (Standard: "date_time")
autoValue"on_create" | "on_update"Zeitstempel automatisch setzen
columnTypestring"timestamp", "date"
timezonestringZeitzonen-String, um das Datum auszuwerten
clearablebooleanEin Symbol zum Löschen des Wertes hinzufügen (auf null setzen)

Verwenden Sie of, um eine wiederholbare Liste von Elementen zu definieren.

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

Kombinieren Sie of mit storage für einen Mehrfach-Dateiupload.

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

Verwenden Sie oneOf, um einen Block-Editor mit mehreren Inhaltstypen zu erstellen. Jeder Schlüssel erstellt einen Kartentyp, den Benutzer auswählen können.

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" }
}
}
}
}
}
PropertyTypeBeschreibung
ofProperty | Property[]Eigenschaftsschema für Array-Elemente
oneOfobjectArray von typisierten Objekten mit mehreren Diskriminator-Typen
expandedbooleanSoll das Feld anfänglich erweitert sein (Standard: true)
minimalistViewbooleanUntergeordnete Eigenschaften direkt ohne erweiterbares Panel anzeigen
sortablebooleanKönnen Elemente neu angeordnet werden (Standard: true)
canAddElementsbooleanKönnen neue Elemente hinzugefügt werden (Standard: true)

Verwenden Sie properties, um ein strukturiertes Objekt mit benannten Feldern zu definieren.

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

Setzen Sie keyValue: true, um einen Editor für beliebige Schlüssel-Wert-Paare darzustellen.

metadata: {
type: "map",
name: "Key value",
keyValue: true
}
PropertyTypeBeschreibung
propertiesPropertiesDatensatz der in der Map enthaltenen Eigenschaften
propertiesOrderstring[]Geordnete Schlüssel für das Rendern
previewPropertiesstring[]Welche Eigenschaften in der Tabellenvorschau angezeigt werden sollen
spreadChildrenbooleanUntergeordnete Eigenschaften als separate Spalten in der Tabellenansicht rendern
minimalistViewbooleanEigenschaften ohne umhüllendes Panel anzeigen
expandedbooleanSoll das Feld anfänglich erweitert sein (Standard: true)
keyValuebooleanAls Editor für beliebige Schlüssel-Wert-Paare rendern

Referenzen verlinken auf Entitäten in einer anderen Sammlung. Sie werden als Vorschaukarte dargestellt, die die Details der referenzierten Entität anzeigt.

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

Wird mit String- oder Zahlen-Eigenschaften verwendet, um Auswahlen zu rendern:

// Einfaches Array
enum: ["draft", "published", "archived"]
// Mit Bezeichnungen
enum: [
{ id: "draft", label: "Draft" },
{ id: "published", label: "Published" },
{ id: "archived", label: "Archived" }
]
// Mit Farben (für Kanban-Spalten und Chips)
enum: [
{ id: "draft", label: "Draft", color: "grayDark" },
{ id: "published", label: "Published", color: "greenDark" },
{ id: "archived", label: "Archived", color: "orangeDark" }
]
validation: {
required: true, // Feld ist erforderlich
unique: true, // Muss in der Tabelle eindeutig sein
requiredMessage: "Custom error message",
// Zeichenketten-spezifisch
min: 2, // Minimale Länge
max: 200, // Maximale Länge
matches: /^[a-z]+$/, // Regex-Muster
email: true, // E-Mail-Format
url: true, // URL-Format
// Zahlen-spezifisch
min: 0, // Minimaler Wert
max: 1000, // Maximaler Wert
integer: true, // Muss eine Ganzzahl sein
// Array-spezifisch
min: 1, // Minimale Anzahl von Elementen
max: 10, // Maximale Anzahl von Elementen
}

Sie können Felder dynamisch gestalten, sodass sie auf die Werte der Entität reagieren. Dafür gibt es zwei Möglichkeiten:

Sie können die Eigenschaft conditions verwenden, um deklarative JSON Logic-Regeln zu definieren, die im Sammlungseditor serialisiert und visuell geändert werden können.

price: {
type: "number",
name: "Price",
conditions: {
disabled: { "==": [{ "var": "values.is_free" }, true] },
required: { "!=": [{ "var": "values.is_free" }, true] },
min: 0,
clearOnDisabled: true // Auf null setzen, wenn das Feld deaktiviert wird
}
}

Das conditions-Objekt bietet Ihnen Zugriff auf:

  • disabled, hidden, readOnly
  • required, min, max
  • defaultValue
  • enumConditions, allowedEnumValues, excludedEnumValues
  • referencePath, referenceFilter
  • canAddElements, sortable (für Arrays)

Für komplexes Verhalten, das nicht über JSON Logic ausgedrückt werden kann, können Sie dynamicProps verwenden, das eine Javascript-Funktion auswertet.

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