Pular para o conteúdo

Atualizando da versão 0.18 para a 0.21

A 0.21.0 foi lançada. Estas são as entradas ### Breaking da sua seção do changelog, uma de cada vez, com o que cada uma pede que você altere. As versões 0.19 e 0.20 não declaram nenhuma quebra de compatibilidade, portanto este é um salto direto a partir da 0.18 — leia antes de migrar para a 0.21, não depois.

Ambas são erros de compilação, e não mudanças silenciosas de comportamento: o build aponta cada linha que precisa ser editada, e o grep em cada seção as encontra antes dele.


31. context.client.data não compila mais em um callback de coleção

Seção intitulada “31. context.client.data não compila mais em um callback de coleção”

RebaseCallContext["client"] agora é RebaseCallbackClient: RebaseClient sem data. No lado do servidor, esse cliente é o singleton rebase, que não possui data desde a versão 0.18; logo, context.client.data.collection(…) compilava e, em seguida, lançava Cannot read properties of undefined (reading 'collection') a cada chamada. Agora, isso se tornou um erro de compilação.

O que alterar: faça consultas através de context.data, o acessor que as consultas de um callback sempre deveriam utilizar. Ele é executado com os privilégios daquilo que disparou o callback, na própria transação de escrita. O guia de callbacks explica o que cada acessor no contexto pode alcançar.

afterSave: async ({ context }) => {
await context.client.data.audit_logs.create({ action: "approved" });
await context.data.audit_logs.create({ action: "approved" });
}
grep -rn "client\.data\b" config

context.client.dataAsAdmin continua disponível para callbacks que precisam ver o que um administrador pode ver. admin.browserCallbacks também muda: a forma antiga funcionava lá porque o cliente do painel contém data, mas agora também deixa de compilar. useRebaseContext().client em um componente React mantém seu data.

32. selectedEntities foi removido: uma seleção agora são linhas ou uma query

Seção intitulada “32. selectedEntities foi removido: uma seleção agora são linhas ou uma query”

Uma visualização de coleção agora pode selecionar todas as linhas que atendem ao seu filtro, e não apenas as linhas carregadas; portanto, SelectionController não retorna mais um Entity[]. selectionController.selection é uma união EntitySelection: { type: "entities", entities } para linhas marcadas manualmente, ou { type: "query", query, excluded, count? } para todas as linhas correspondentes a uma consulta, a maioria das quais ninguém leu.

O que alterar: uma ação personalizada que lê a seleção a transforma em linhas usando resolveSelection de @rebasepro/cms. Ela retorna as linhas marcadas de uma só vez e lê uma seleção baseada em query página por página — com um callback opcional de progresso — lançando um erro em vez de retornar um prefixo incompleto quando a consulta corresponder a mais de 20.000 linhas.

const handlePublish = async () => {
for (const entity of selectionController.selectedEntities) {
const selected = await resolveSelection({
selection: selectionController.selection,
accessor: data.collection(path)
});
for (const entity of selected) {
await data.collection(entity.path).update(entity.id, { status: "published" });
}
};
grep -rn "selectedEntities" config frontend

Três mudanças menores acompanham isso:

  • selectionController.selectedEntities.lengthselectionController.selectedCount. Ele é undefined, nunca 0, quando todas as linhas correspondentes a uma consulta estão selecionadas e a coleção não pode ser contada — trate esse caso na interface, não aplique um valor padrão.
  • setSelectedEntities(prev => …)setSelection(prev => …), que recebe e retorna um EntitySelection. setSelectedEntities(rows) com um array ainda funciona.
  • A verificação para saber se “algo está selecionado” agora é selectionController.hasSelection.

isEntitySelected e toggleEntitySelection permanecem inalterados e continuam sendo o que uma caixa de seleção por linha deve usar. O exemplo de ações de coleção mostra o padrão completo.