Pular para o conteúdo

Propriedades

As propriedades definem as colunas na sua tabela de banco de dados e como elas são renderizadas na UI de administração. Cada propriedade tem um type que determina:

  • O tipo de coluna do banco de dados (via geração de esquema Drizzle)
  • O componente de campo de formulário
  • O renderizador de célula de tabela
  • As regras de validação
TipoDescriçãoColuna PostgreSQL
stringTexto, seleção, markdown, upload de arquivo, URL, e-mailvarchar, text, jsonb
numberInteiro, decimal, moedainteger, numeric, bigint, serial
booleanAlternador verdadeiro/falsoboolean
dateData, data/hora, timestamptimestamp, date
arrayLista ordenada de valoresjsonb
mapObjeto chave-valorjsonb
geopointPar latitude/longitudejsonb
referenceReferência incorporada a outra entidadevarchar (armazena ID)
relationRelação de chave estrangeira SQLUsa o array relations

Todos os tipos de propriedades compartilham estas opções:

PropriedadeTipoDescrição
typestringObrigatório. Tipo de dado (veja acima)
namestringObrigatório. Rótulo de exibição
descriptionstringTexto de ajuda exibido abaixo do campo
columnWidthnumberLargura da coluna em pixels (visualização de tabela)
readOnlybooleanImpedir edição
disabledboolean | PropertyDisabledConfigDesabilitar com tooltip opcional
hideFromCollectionbooleanOcultar da visualização de tabela
defaultValueanyValor padrão para novas entidades
validationobjectRegras de validação
FieldReact.ComponentTypeComponente de campo personalizado
PreviewReact.ComponentTypeComponente de célula de tabela personalizado
propertyConfigstringChave de configuração de propriedade registrada
editablebooleanHabilitar edição em linha na tabela (padrão: 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
}
}
PropriedadeTipoDescrição
multilinebooleanRenderizar como textarea
markdownbooleanRenderizar como editor de markdown
emailbooleanValidação de formato de e-mail
urlbooleanValidação de formato de URL
storageStorageConfigHabilitar upload de arquivo
enumEnumValuesRenderizar como seletor dropdown
multiSelectbooleanPermitir múltiplas seleções de enum
columnTypestringColuna de banco de dados: "varchar", "text"
isIdstringGeração de ID: "uuid", "cuid", "increment", "manual"
userSelectbooleanRenderizar como um seletor de usuário
previewAsTagbooleanRenderizar esta string como uma tag nas pré-visualizações
clearablebooleanAdicionar um ícone para limpar o valor (definir como nulo)
price: {
type: "number",
name: "Price",
validation: { required: true, min: 0 }
}
quantity: {
type: "number",
name: "Quantity",
columnType: "integer" // Store as integer
}
PropriedadeTipoDescrição
enumEnumValuesRenderizar como seletor com valores numéricos
columnTypestring"integer", "bigint", "numeric", "serial", "smallint"
isIdstringEstratégia de geração de ID
clearablebooleanAdicionar um ícone para limpar o valor (definir como nulo)
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 data

PropriedadeTipoDescrição
mode"date" | "date_time"Apenas data ou data + hora (padrão: "date_time")
autoValue"on_create" | "on_update"Definir timestamps automaticamente
columnTypestring"timestamp", "date"
timezonestringString de fuso horário para avaliar a data
clearablebooleanAdicionar um ícone para limpar o valor (definir como nulo)
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 bloco

PropriedadeTipoDescrição
ofProperty | Property[]Esquema de propriedade para itens do array
oneOfobjectArray de objetos tipados com múltiplos tipos discriminadores
expandedbooleanO campo deve ser inicialmente expandido (padrão: true)
minimalistViewbooleanExibir propriedades filhas diretamente sem painel extensível
sortablebooleanOs elementos podem ser reordenados (padrão: true)
canAddElementsbooleanNovos elementos podem ser adicionados (padrão: 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

PropriedadeTipoDescrição
propertiesPropertiesRegistro de propriedades incluídas no mapa
propertiesOrderstring[]Chaves ordenadas para renderização
previewPropertiesstring[]Quais propriedades mostrar na pré-visualização da tabela
pickOnlySomeKeysbooleanPermitir que o usuário adicione chaves seletivamente na UI
spreadChildrenbooleanRenderizar propriedades filhas como colunas separadas na visualização de tabela
minimalistViewbooleanExibir propriedades sem um painel de envoltório
expandedbooleanO campo deve ser inicialmente expandido (padrão: true)
keyValuebooleanRenderizar como editor de pares chave-valor arbitrários

Usado com propriedades de string ou numéricas para renderizar seleções:

// 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 seleção

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
}

Você pode tornar os campos dinâmicos para que reajam aos valores da entidade. Existem duas maneiras de fazer isso:

Você pode usar a propriedade conditions para definir regras JSON Logic declarativas que podem ser serializadas e modificadas visualmente no editor de coleção.

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

O objeto conditions dá acesso a:

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

Para comportamentos complexos que não podem ser expressos via JSON Logic, você pode usar dynamicProps, que avalia uma função 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 }
})
}