Ir al contenido

Propiedades

Las propiedades definen las columnas en la tabla de tu base de datos y cómo se renderizan en la interfaz de administración. Cada propiedad tiene un type que determina:

  • El tipo de columna de la base de datos (mediante la generación de esquemas Drizzle)
  • El componente de campo de formulario
  • El renderizador de celda de tabla
  • Las reglas de validación
TypeDescriptionPostgreSQL Column
stringTexto, selección, markdown, carga de archivos, URL, correo electrónicovarchar, text, jsonb
numberEntero, decimal, monedainteger, numeric, bigint, serial
booleanAlternador verdadero/falsoboolean
dateFecha, fecha y hora, marca de tiempotimestamp, date
arrayLista ordenada de valoresjsonb
mapObjeto clave-valorjsonb
geopointPar latitud/longitudjsonb
referenceReferencia incrustada a otra entidadvarchar (almacena ID)
relationRelación de clave foránea SQLUtiliza el array relations

Todos los tipos de propiedades comparten estas opciones:

PropertyTypeDescription
typestringRequerido. Tipo de dato (ver arriba)
namestringRequerido. Etiqueta de visualización
descriptionstringTexto de ayuda mostrado debajo del campo
columnWidthnumberAncho de columna en píxeles (vista de tabla)
readOnlybooleanPrevenir edición
disabledboolean | PropertyDisabledConfigDeshabilitar con tooltip opcional
hideFromCollectionbooleanOcultar de la vista de tabla
defaultValueanyValor predeterminado para nuevas entidades
validationobjectReglas de validación
FieldReact.ComponentTypeComponente de campo personalizado
PreviewReact.ComponentTypeComponente de celda de tabla personalizado
propertyConfigstringClave de configuración de propiedad registrada
editablebooleanHabilitar edición en línea en la tabla (predeterminado: 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
}
}
PropertyTypeDescription
multilinebooleanRenderizar como textarea
markdownbooleanRenderizar como editor markdown
emailbooleanValidación de formato de correo electrónico
urlbooleanValidación de formato de URL
storageStorageConfigHabilitar carga de archivos
enumEnumValuesRenderizar como menú desplegable (select)
multiSelectbooleanPermitir múltiples selecciones de enum
columnTypestringColumna de base de datos: "varchar", "text"
isIdstringGeneración de ID: "uuid", "cuid", "increment", "manual"
userSelectbooleanRenderizar como un selector de usuario
previewAsTagbooleanRenderizar esta cadena como una etiqueta en las vistas previas
clearablebooleanAñadir un icono para borrar el valor (establecer a null)
price: {
type: "number",
name: "Price",
validation: { required: true, min: 0 }
}
quantity: {
type: "number",
name: "Quantity",
columnType: "integer" // Store as integer
}
PropertyTypeDescription
enumEnumValuesRenderizar como select con valores numéricos
columnTypestring"integer", "bigint", "numeric", "serial", "smallint"
isIdstringEstrategia de generación de ID
clearablebooleanAñadir un icono para borrar el valor (establecer a null)
active: {
type: "boolean",
name: "Active",
defaultValue: true
}

Campo de interruptor

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 de fecha

PropertyTypeDescription
mode"date" | "date_time"Solo fecha o fecha + hora (predeterminado: "date_time")
autoValue"on_create" | "on_update"Establecer marcas de tiempo automáticamente
columnTypestring"timestamp", "date"
timezonestringCadena de zona horaria para evaluar la fecha
clearablebooleanAñadir un icono para borrar el valor (establecer a 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 de bloque

PropertyTypeDescription
ofProperty | Property[]Esquema de propiedad para los elementos del array
oneOfobjectArray de objetos tipados con múltiples tipos discriminadores
expandedboolean¿Debe el campo estar inicialmente expandido (predeterminado: true)
minimalistViewbooleanMostrar propiedades secundarias directamente sin panel extensible
sortableboolean¿Pueden reordenarse los elementos (predeterminado: true)
canAddElementsboolean¿Se pueden añadir nuevos elementos (predeterminado: 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 de grupo

PropertyTypeDescription
propertiesPropertiesRegistro de propiedades incluidas en el mapa
propertiesOrderstring[]Claves ordenadas para la renderización
previewPropertiesstring[]Qué propiedades mostrar en la vista previa de la tabla
pickOnlySomeKeysbooleanPermitir al usuario añadir selectivamente claves en la UI
spreadChildrenbooleanRenderizar propiedades secundarias como columnas separadas en la vista de tabla
minimalistViewbooleanMostrar propiedades sin un panel envolvente
expandedboolean¿Debe el campo estar inicialmente expandido (predeterminado: true)
keyValuebooleanRenderizar como editor de pares clave-valor arbitrarios

Se utiliza con propiedades de cadena o número para renderizar selectores:

// 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 de selección

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
}

Puedes hacer que los campos sean dinámicos para que reaccionen a los valores de la entidad. Hay dos formas de hacer esto:

Puedes usar la propiedad conditions para definir reglas declarativas de JSON Logic que pueden ser serializadas y modificadas visualmente en el editor de colecciones.

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

El objeto conditions te da acceso a:

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

2. Constructores de Propiedades (Programáticos)

Sección titulada «2. Constructores de Propiedades (Programáticos)»

Para comportamientos complejos que no pueden expresarse mediante JSON Logic, puedes usar dynamicProps, que evalúa una función 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 }
})
}