Aller au contenu

Propriétés

Les propriétés définissent les colonnes de votre table de base de données et la manière dont elles sont affichées dans l’interface utilisateur d’administration. Chaque propriété a un type qui détermine :

  • Le type de colonne de base de données (via la génération de schéma Drizzle)
  • Le composant de champ de formulaire
  • Le rendu de la cellule de tableau
  • Les règles de validation
TypeDescriptionColonne PostgreSQL
stringTexte, sélection, markdown, téléchargement de fichier, URL, e-mailvarchar, text, jsonb
numberEntier, décimal, deviseinteger, numeric, bigint, serial
booleanInterrupteur vrai/fauxboolean
dateDate, date et heure, horodatagetimestamp, date
arrayListe ordonnée de valeursjsonb
mapObjet clé-valeurjsonb
geopointPaire latitude/longitudejsonb
referenceRéférence intégrée à une autre entitévarchar (stocke l’ID)
relationRelation de clé étrangère SQLUtilise le tableau relations

Tous les types de propriétés partagent ces options :

PropriétéTypeDescription
typestringObligatoire. Type de données (voir ci-dessus)
namestringObligatoire. Étiquette d’affichage
descriptionstringTexte d’aide affiché sous le champ
defaultValueanyValeur par défaut pour les nouvelles entités
validationobjectRègles de validation
propertyConfigstringClé de configuration de propriété enregistrée
columnNamestringNom de colonne de base de données explicite (contourne la conversion snake_case)
callbacksPropertyCallbacksHooks pour les transformations afterRead et beforeSave
dynamicPropsfunctionConstructeur de propriétés dynamiques (voir Champs conditionnels)
conditionsPropertyConditionsConditions déclaratives JSON Logic

Les options liées à l’interface utilisateur sont imbriquées sous le sous-objet ui :

price: {
type: "number",
name: "Price",
ui: {
readOnly: true,
columnWidth: 120,
hideFromCollection: false
}
}
PropriétéTypeDescription
ui.readOnlybooleanEmpêche l’édition
ui.disabledboolean | PropertyDisabledConfigDésactiver avec info-bulle optionnelle
ui.hideFromCollectionbooleanMasquer de la vue tableau
ui.columnWidthnumberLargeur de colonne en pixels (vue tableau)
ui.widthPercentagenumberLargeur du champ en pourcentage dans la vue formulaire
ui.FieldReact.ComponentTypeComposant de champ personnalisé
ui.PreviewReact.ComponentTypeComposant de cellule de tableau personnalisé

Le type string est le plus polyvalent — selon les options que vous définissez, il s’affiche sous différents widgets.

Un champ de saisie de texte simple sur une seule ligne.

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

Définissez multiline: true pour afficher une zone de texte (textarea).

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

Définissez markdown: true pour afficher un éditeur Markdown complet avec barre d’outils.

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

Définissez email: true pour ajouter une validation de format e-mail et afficher avec une icône e-mail.

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

Définissez url: true pour ajouter une validation de format URL et afficher avec une icône de lien.

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

Définissez storage pour afficher une zone de dépôt de fichier.

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

Définissez enum pour afficher une liste déroulante. Voir la section Valeurs d’énumération pour plus de détails.

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

Définissez enum + multiSelect: true pour permettre de choisir plusieurs valeurs.

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" },
]
}
PropriétéTypeDescription
multilinebooleanRendu en tant que zone de texte (textarea)
markdownbooleanRendu en tant qu’éditeur Markdown
emailbooleanValidation du format e-mail
urlbooleanValidation du format URL
storageStorageConfigActiver le téléchargement de fichiers
enumEnumValuesRendu en tant que liste déroulante (select)
multiSelectbooleanAutoriser plusieurs sélections d’énumérations
columnTypestringColonne de base de données : "varchar", "text"
isIdstringGénération d’ID : "uuid", "cuid", "increment", "manual"
userSelectbooleanRendu en tant que sélecteur d’utilisateur
previewAsTagbooleanAfficher cette chaîne comme une étiquette dans les aperçus
clearablebooleanAjouter une icône pour effacer la valeur (définir à null)
price: {
type: "number",
name: "Price",
validation: { required: true, min: 0 }
}
quantity: {
type: "number",
name: "Quantity",
columnType: "integer" // Store as integer
}

Les champs de nombre s’affichent comme un champ de saisie standard avec validation numérique.

PropriétéTypeDescription
enumEnumValuesRendu en tant que liste déroulante avec des valeurs numériques
columnTypestring"integer", "bigint", "numeric", "serial", "smallint"
isIdstringStratégie de génération d’ID
clearablebooleanAjouter une icône pour effacer la valeur (définir à null)
active: {
type: "boolean",
name: "Selectable",
defaultValue: true
}

Les champs booléens s’affichent sous forme d’interrupteur.

Définissez mode: "date" pour afficher un sélecteur de date sans heure.

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

Le mode par défaut "date_time" inclut la date et l’heure.

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

Utilisez autoValue pour définir automatiquement les horodatages à la création ou à la mise à jour.

created_at: {
type: "date",
name: "Created At",
autoValue: "on_create",
ui: { readOnly: true }
}
updated_at: {
type: "date",
name: "Updated At",
autoValue: "on_update"
}
PropriétéTypeDescription
mode"date" | "date_time"Date seule ou date + heure (par défaut : "date_time")
autoValue"on_create" | "on_update"Horodatages définis automatiquement
columnTypestring"timestamp", "date"
timezonestringChaîne de fuseau horaire pour évaluer la date
clearablebooleanAjouter une icône pour effacer la valeur (définir à null)

Utilisez of pour définir une liste répétable d’éléments.

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

Combinez of avec storage pour un téléchargement de fichiers multiples.

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

Utilisez oneOf pour créer un éditeur de blocs avec plusieurs types de contenu. Chaque clé crée un type de carte que les utilisateurs peuvent choisir.

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" }
}
}
}
}
}
PropriétéTypeDescription
ofProperty | Property[]Schéma de propriété pour les éléments du tableau
oneOfobjectTableau d’objets typés avec plusieurs types de discriminateurs
expandedbooleanLe champ doit-être initialement développé (par défaut : true)
minimalistViewbooleanAfficher les propriétés enfants directement sans panneau extensible
sortablebooleanLes éléments peuvent-ils être réordonnés (par défaut : true)
canAddElementsbooleanDe nouveaux éléments peuvent-ils être ajoutés (par défaut : true)

Utilisez properties pour définir un objet structuré avec des champs nommés.

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

Définissez keyValue: true pour afficher un éditeur de paires clé-valeur arbitraires.

metadata: {
type: "map",
name: "Key value",
keyValue: true
}
PropriétéTypeDescription
propertiesPropertiesEnregistrement des propriétés incluses dans la carte
propertiesOrderstring[]Clés ordonnées pour le rendu
previewPropertiesstring[]Propriétés à afficher dans l’aperçu du tableau
spreadChildrenbooleanAfficher les propriétés enfants comme des colonnes séparées dans la vue tableau
minimalistViewbooleanAfficher les propriétés sans panneau d’encapsulation
expandedbooleanLe champ doit-être initialement développé (par défaut : true)
keyValuebooleanRendu en tant qu’éditeur de paires clé-valeur arbitraires

Les références permettent de créer un lien vers des entités d’une autre collection. Elles s’affichent sous forme de carte d’aperçu montrant les détails de l’entité référencée.

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

Utilisé avec les propriétés de type chaîne de caractères ou nombre pour afficher les listes déroulantes :

// 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, // Field is required
unique: true, // Must be unique in the table
requiredMessage: "Custom error message",
// String-specific
min: 2, // Minimum length
max: 200, // Maximum length
matches: /^[a-z]+$/, // Regex pattern
email: true, // Email format
url: true, // URL format
// Number-specific
min: 0, // Minimum value
max: 1000, // Maximum value
integer: true, // Must be integer
// Array-specific
min: 1, // Minimum items
max: 10, // Maximum items
}

Vous pouvez rendre les champs dynamiques afin qu’ils réagissent aux valeurs de l’entité. Il existe deux façons de procéder :

Vous pouvez utiliser la propriété conditions pour définir des règles JSON Logic déclaratives qui peuvent être sérialisées et modifiées visuellement dans l’éditeur de collection.

price: {
type: "number",
name: "Price",
conditions: {
disabled: { "==": [{ "var": "values.is_free" }, true] },
required: { "!=": [{ "var": "values.is_free" }, true] },
min: 0,
clearOnDisabled: true // Set to null if field gets disabled
}
}

L’objet conditions vous donne accès à :

  • disabled, hidden, readOnly
  • required, min, max
  • defaultValue
  • enumConditions, allowedEnumValues, excludedEnumValues
  • referencePath, referenceFilter
  • canAddElements, sortable (pour les tableaux)

2. Constructeurs de propriétés (Programmatiques)

Section intitulée « 2. Constructeurs de propriétés (Programmatiques) »

Pour un comportement complexe qui ne peut pas être exprimé via JSON Logic, vous pouvez utiliser dynamicProps qui évalue une fonction 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 }
})
}