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
columnWidthnumberSpaltenbreite in Pixeln (Tabellenansicht)
readOnlybooleanBearbeitung verhindern
disabledboolean | PropertyDisabledConfigDeaktivieren mit optionalem Tooltip
hideFromCollectionbooleanAus der Tabellenansicht ausblenden
defaultValueanyStandardwert für neue Entitäten
validationobjectValidierungsregeln
FieldReact.ComponentTypeBenutzerdefinierte Feldkomponente
PreviewReact.ComponentTypeBenutzerdefinierte Tabellenzellenkomponente
propertyConfigstringRegistrierter Eigenschafts-Konfigurationsschlüssel
editablebooleanInline-Bearbeitung in der Tabelle aktivieren (Standard: true)
name: {
type: "string",
name: "Name",
validation: { required: true, min: 2, max: 200 }
}
description: {
type: "string",
name: "Description",
multiline: true, // Textbereich
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, // E-Mail-Validierung
validation: { required: true }
}
website: {
type: "string",
name: "Website",
url: true // URL-Validierung
}
avatar: {
type: "string",
name: "Avatar",
storage: { // Dateiupload
storagePath: "avatars",
acceptedFiles: ["image/*"],
maxSize: 2 * 1024 * 1024
}
}
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
}
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: "Active",
defaultValue: true
}

Schalterfeld

created_at: {
type: "date",
name: "Created At",
autoValue: "on_create", // Automatisch bei Erstellung festlegen
readOnly: true
}
updated_at: {
type: "date",
name: "Updated At",
autoValue: "on_update" // Automatisch bei jedem Speichern festlegen
}
event_date: {
type: "date",
name: "Event Date",
mode: "date" // Nur Datum (keine Zeit)
}

Datumsfeld

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)
tags: {
type: "array",
name: "Tags",
of: { type: "string" } // Array von Zeichenketten
}
images: {
type: "array",
name: "Images",
of: {
type: "string",
storage: { storagePath: "images", acceptedFiles: ["image/*"] }
}
}
// Block-Editor (mehrere Typen)
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" }
}
}
}
}
}

Blockfeld

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)
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 // Freiform-Schlüssel-Wert-Editor
}

Gruppenfeld

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
pickOnlySomeKeysbooleanDem Benutzer ermöglichen, Schlüssel selektiv in der UI hinzuzufügen
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

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

Auswahlfeld

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