Coleções e campos

Nesta página

Uma coleção é um tipo de conteúdo (publicações, páginas, produtos). Suas definições de campo definem a estrutura dos dados de cada entrada.

Criando coleções

Crie coleções através do painel de administração em Content Types. Cada coleção tem as seguintes propriedades:

Tipos de conteúdo EmDash mostrando Páginas, Publicações e coleções personalizadas com suas funcionalidades
PropriedadeDescrição
slugIdentificador seguro para URL (ex., posts, products)
labelNome de exibição (ex., “Blog Posts”)
labelSingularForma singular (ex., “Post”)
descriptionDescrição opcional para editores
iconNome do ícone Lucide para a barra lateral admin
supportsFuncionalidades como rascunhos, revisões, pré-visualização, agendamento, pesquisa, seo

Funcionalidades de coleção

Ao criar uma coleção, ative as funcionalidades que você precisa:

FuncionalidadeDescrição
draftsAtivar fluxo de trabalho rascunho/publicado
revisionsRastrear histórico de conteúdo com snapshots de versão
previewGerar URLs de pré-visualização assinadas para conteúdo em rascunho
schedulingAgendar conteúdo para publicar em uma data futura

A seguinte coleção ativa todas as quatro funcionalidades:

{
  slug: "posts",
  label: "Blog Posts",
  labelSingular: "Post",
  supports: ["drafts", "revisions", "preview", "scheduling"]
}

Tipos de campo

EmDash suporta 16 tipos de campo que mapeiam para tipos de coluna SQLite.

Campos de texto

string

Entrada de texto curto. Mapeia para coluna TEXT.

{ slug: "title", type: "string", label: "Title" }

text

Área de texto multilinha. Mapeia para coluna TEXT.

{ slug: "excerpt", type: "text", label: "Excerpt" }

slug

Campo slug seguro para URL. Mapeia para coluna TEXT.

{ slug: "handle", type: "slug", label: "URL Handle" }

Conteúdo rico

portableText

Editor de texto rico (TipTap/ProseMirror). Armazenado como JSON.

{ slug: "content", type: "portableText", label: "Content" }

Portable Text é um formato baseado em blocos que preserva a estrutura sem incorporar HTML.

json

Dados JSON arbitrários. Armazenado como JSON.

{ slug: "metadata", type: "json", label: "Custom Metadata" }

Números

number

Números decimais. Mapeia para coluna REAL.

{ slug: "price", type: "number", label: "Price" }

integer

Números inteiros. Mapeia para coluna INTEGER.

{ slug: "quantity", type: "integer", label: "Stock Quantity" }

Booleanos e datas

boolean

Alternância verdadeiro/falso. Mapeia para INTEGER (0/1).

{ slug: "featured", type: "boolean", label: "Featured Post" }

datetime

Seletor de data e hora. Armazenado como string ISO 8601.

{ slug: "eventDate", type: "datetime", label: "Event Date" }

Seleção

select

Opção única de uma lista. Mapeia para coluna TEXT.

{
  slug: "status",
  type: "select",
  label: "Product Status",
  validation: {
    options: ["active", "discontinued", "coming_soon"]
  }
}

multiSelect

Múltiplas opções de uma lista. Armazenado como array JSON.

{
  slug: "features",
  type: "multiSelect",
  label: "Product Features",
  validation: {
    options: ["wireless", "waterproof", "eco-friendly"]
  }
}

Mídia e referências

image

Seletor de imagem da biblioteca de mídia. Armazena ID de mídia como TEXT.

{ slug: "featuredImage", type: "image", label: "Featured Image" }

file

Seletor de arquivo da biblioteca de mídia. Armazena ID de mídia como TEXT.

{ slug: "attachment", type: "file", label: "PDF Attachment" }

reference

Referência para a entrada de outra coleção. Armazena ID da entrada como TEXT.

{
  slug: "author",
  type: "reference",
  label: "Author",
  options: {
    collection: "authors"
  }
}

Propriedades de campo

Todo campo suporta estas propriedades:

PropriedadeTipoDescrição
slugstringNome da coluna no banco de dados
labelstringRótulo de exibição na interface admin
typeFieldTypeUm dos 16 tipos de campo
requiredbooleanSe o campo deve ter um valor
uniquebooleanSe os valores devem ser únicos entre entradas
indexedbooleanPermitir ordenação e filtragem eficientes por este campo
defaultValueunknownValor padrão para novas entradas
validationobjectRegras de validação específicas do tipo
widgetstringIdentificador de widget personalizado
optionsobjectConfiguração específica do widget
sortOrdernumberOrdem de exibição no editor

Defina indexed: true quando uma consulta de coleção precisar usar um campo personalizado em orderBy ou um filtro de campo. Índices são suportados para campos string, url, number, integer, boolean, datetime, select, reference e slug. EmDash rejeita campos JSON indexados, conteúdo rico e outros tipos de campo não escalares.

Regras de validação

O objeto validation varia por tipo de campo. Sua forma completa é:

interface FieldValidation {
	required?: boolean; // Todos os tipos
	min?: number; // number, integer
	max?: number; // number, integer
	minLength?: number; // string, text
	maxLength?: number; // string, text
	pattern?: string; // string (regex)
	options?: string[]; // select, multiSelect
}

O seguinte campo requer um endereço de email único e validado por padrão:

{
  slug: "email",
  type: "string",
  label: "Email Address",
  required: true,
  unique: true,
  validation: {
    pattern: "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$"
  }
}

Opções de widget

O objeto options configura o comportamento de UI específico do campo. Sua forma completa é:

interface FieldWidgetOptions {
	rows?: number; // text (linhas da área de texto)
	showPreview?: boolean; // image, file
	collection?: string; // reference (coleção de destino)
	allowMultiple?: boolean; // reference (múltiplas refs)
	[key: string]: unknown; // Opções de widget personalizadas
}

O seguinte campo de referência vincula a múltiplos produtos:

{
  slug: "relatedProducts",
  type: "reference",
  label: "Related Products",
  options: {
    collection: "products",
    allowMultiple: true
  }
}

Consultando coleções

Use as funções de consulta fornecidas para buscar conteúdo. Estas seguem o padrão de coleções ao vivo do Astro, retornando resultados estruturados. O seguinte exemplo mostra as opções de consulta comuns:

import { getEmDashCollection, getEmDashEntry } from "emdash";

// Obter todas as entradas - retorna { entries, error }
const { entries: posts } = await getEmDashCollection("posts");

// Filtrar por status
const { entries: drafts } = await getEmDashCollection("posts", {
	status: "draft",
});

// Limitar resultados
const { entries: recent } = await getEmDashCollection("posts", {
	limit: 5,
});

// Filtrar por taxonomia
const { entries: newsPosts } = await getEmDashCollection("posts", {
	where: { category: "news" },
});

// Obter uma entrada por slug - retorna { entry, error, isPreview }
const { entry: post } = await getEmDashEntry("posts", "my-post-slug");

// Tratamento de erros
const { entries, error } = await getEmDashCollection("posts");
if (error) {
	console.error("Failed to load posts:", error);
}

Geração de tipos

Execute npx emdash types para gerar tipos TypeScript a partir do seu schema. O arquivo gerado contém uma interface por coleção:

export interface Post {
	title: string;
	content: PortableTextBlock[];
	excerpt?: string;
	featuredImage?: string;
	author: string; // ID de referência
}

export interface Product {
	title: string;
	price: number;
	description: PortableTextBlock[];
}

Mapeamento de banco de dados

Tipos de campo mapeiam para tipos de coluna SQLite da seguinte forma:

Tipo de campoTipo SQLiteNotas
stringTEXT
textTEXT
slugTEXT
urlTEXT
numberREALPonto flutuante de 64 bits
integerINTEGERInteiro com sinal de 64 bits
booleanINTEGER0 ou 1
datetimeTEXTFormato ISO 8601
selectTEXT
multiSelectJSONArray de strings
portableTextJSONArray de blocos
imageTEXTID de mídia
fileTEXTID de mídia
referenceTEXTID de entrada
jsonJSONJSON arbitrário
repeaterJSONArray de subcampos

Próximos passos