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
defaultValueanyValor padrão para novas entidades
validationobjectRegras de validação
propertyConfigstringChave de configuração de propriedade registrada
columnNamestringNome explícito da coluna do banco de dados (ignora conversão para snake_case)
callbacksPropertyCallbacksHooks para transformações afterRead e beforeSave
dynamicPropsfunctionConstrutor de propriedades dinâmicas (ver Campos Condicionais)
conditionsPropertyConditionsCondições declarativas com JSON Logic

As opções relacionadas à UI são aninhadas sob o sub-objeto ui:

price: {
type: "number",
name: "Price",
ui: {
readOnly: true,
columnWidth: 120,
hideFromCollection: false
}
}
PropriedadeTipoDescrição
ui.readOnlybooleanImpedir edição
ui.disabledboolean | PropertyDisabledConfigDesabilitar com tooltip opcional
ui.hideFromCollectionbooleanOcultar da visualização de tabela
ui.columnWidthnumberLargura da coluna em pixels (visualização de tabela)
ui.widthPercentagenumberLargura do campo como porcentagem na visualização de formulário
ui.FieldReact.ComponentTypeComponente de campo personalizado
ui.PreviewReact.ComponentTypeComponente de célula de tabela personalizado

O tipo string é o mais versátil — dependendo das opções que você configurar, ele é renderizado como diferentes widgets.

Um campo de texto básico de uma única linha.

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

Configure multiline: true para renderizar como um textarea.

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

Configure markdown: true para renderizar um editor de markdown completo com barra de ferramentas.

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

Configure email: true para adicionar validação de formato de e-mail e renderizar com um ícone de e-mail.

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

Configure url: true para adicionar validação de formato de URL e renderizar com um ícone de link.

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

Configure storage para renderizar uma zona de upload de arquivo.

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

Configure enum para renderizar um menu suspenso. Consulte a seção Valores de Enum para detalhes.

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

Configure enum + multiSelect: true para permitir a seleção de múltiplos valores.

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" },
]
}
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" // Armazenar como inteiro
}

Campos numéricos são renderizados como um campo de texto padrão com validação numérica.

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: "Selectable",
defaultValue: true
}

Campos booleanos são renderizados como um interruptor de alternância.

Configure mode: "date" para mostrar um seletor de data sem hora.

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

O modo padrão "date_time" inclui tanto data quanto hora.

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

Use autoValue para definir timestamps automaticamente ao criar ou atualizar.

created_at: {
type: "date",
name: "Created At",
autoValue: "on_create",
ui: { readOnly: true }
}
updated_at: {
type: "date",
name: "Updated At",
autoValue: "on_update"
}
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)

Use of para definir uma lista repetível de itens.

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

Combine of com storage para um upload de múltiplos arquivos.

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

Use oneOf para criar um editor de blocos com múltiplos tipos de conteúdo. Cada chave cria um tipo de cartão que os usuários podem selecionar.

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

Use properties para definir um objeto estruturado com campos nomeados.

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

Configure keyValue: true para renderizar um editor de pares chave-valor arbitrários.

metadata: {
type: "map",
name: "Key value",
keyValue: true
}
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
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

As referências linkam a entidades em outra coleção. Elas são renderizadas como um cartão de pré-visualização mostrando os detalhes da entidade referenciada.

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

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

// Array simples
enum: ["draft", "published", "archived"]
// Com rótulos
enum: [
{ id: "draft", label: "Draft" },
{ id: "published", label: "Published" },
{ id: "archived", label: "Archived" }
]
// Com cores (para colunas Kanban e chips)
enum: [
{ id: "draft", label: "Draft", color: "grayDark" },
{ id: "published", label: "Published", color: "greenDark" },
{ id: "archived", label: "Archived", color: "orangeDark" }
]
validation: {
required: true, // Campo obrigatório
unique: true, // Deve ser único na tabela
requiredMessage: "Custom error message",
// Específico para strings
min: 2, // Comprimento mínimo
max: 200, // Comprimento máximo
matches: /^[a-z]+$/, // Padrão regex
email: true, // Formato de e-mail
url: true, // Formato de URL
// Específico para números
min: 0, // Valor mínimo
max: 1000, // Valor máximo
integer: true, // Deve ser inteiro
// Específico para arrays
min: 1, // Número mínimo de itens
max: 10, // Número máximo de itens
}

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 // Definir como null se o campo for desabilitado
}
}

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