Coleções raiz dinâmicas
Vamos construir um exemplo mais complexo onde a navegação principal é carregada dinamicamente do
banco de dados. Vamos usar a coleção units como a que gera o
restante da navegação.
Para este exemplo teremos Units e Lessons como os principais tipos de conteúdo,
imagine que estamos modelando a estrutura de um curso.
Na coleção units vamos criar um documento para cada unidade:

E cada um desses documentos gerará um novo item de navegação. Neste caso teremos 3 itens de navegação, um para cada unidade:

Declarar a coleção principal
Seção intitulada “Declarar a coleção principal”Vamos definir a coleção units como a principal:
import { buildCollection } from "@firecms/core";
export type Unit = { name: string; description: string;}
export const unitsCollection = buildCollection<Unit>({ name: "Units", singularName: "Unit", group: "Main", id: "units", path: "units", customId: true, icon: "LocalLibrary", callbacks: { onSaveSuccess: ({ context }) => { context.navigation.refreshNavigation(); }, onDelete: ({ context }) => { context.navigation.refreshNavigation(); } }, properties: { name: { name: "Name", validation: { required: true }, dataType: "string" }, description: { name: "Description", validation: { required: true }, dataType: "string", multiline: true } }});Construtor de coleção dinâmica
Seção intitulada “Construtor de coleção dinâmica”Normalmente no FireCMS você passa uma lista estática de coleções para o componente CMS principal component, mas neste caso precisamos construir as coleções dinamicamente com base nos dados do banco de dados.
O FireCMS permite passar uma função que retorna uma lista de coleções para a
prop collections do componente FireCMSApp.
import { buildCollection, EntityCollectionsBuilder } from "@firecms/core";import { Unit, unitsCollection } from "./unit_collection";
const collectionBuilder: EntityCollectionsBuilder = async ({ dataSource, user }) => { const units = await dataSource.fetchCollection<Unit>({ path: "units", }); const lessonCollections = units.map(unit => buildCollection<Unit>({ name: unit.values.name, id: `units/${unit.id}/lessons`, path: `units/${unit.id}/lessons`, description: unit.values.description, group: "Units", properties: { name: { name: "Name", dataType: "string" }, description: { name: "Description", dataType: "string" } } }));
return [ unitsCollection, ...lessonCollections ]};Este código está buscando os dados que estão sendo gerados na coleção units
e criando uma nova coleção para cada um dos documentos.
Código completo
Seção intitulada “Código completo”Conectando tudo, obtemos um app simples que nos permite criar novas unidades e lições e navegar entre elas:
import { buildCollection } from "@firecms/core";import { FireCMSAppConfig } from "@firecms/cloud";
type Unit = { name: string; description: string;}
const unitsCollection = buildCollection<Unit>({ name: "Units", singularName: "Unit", group: "Main", id: "units", path: "units", customId: true, icon: "LocalLibrary", callbacks: { onSaveSuccess: ({ context }) => { context.navigation.refreshNavigation(); }, onDelete: ({ context }) => { context.navigation.refreshNavigation(); } }, properties: { name: { name: "Name", validation: { required: true }, dataType: "string" }, description: { name: "Description", validation: { required: true }, dataType: "string", multiline: true } }});
const appConfig: FireCMSAppConfig = { version: "1", collections: async ({ dataSource }) => { const units = await dataSource.fetchCollection<Unit>({ path: "units", }); const lessonCollections = units.map(unit => buildCollection({ name: unit.values.name, id: `units/${unit.id}/lessons`, path: `units/${unit.id}/lessons`, description: unit.values.description, group: "Units", properties: { name: { name: "Name", dataType: "string" } } }));
return [ unitsCollection, ...lessonCollections ] }}
export default appConfig;