Atualizando da versão 0.18 para a 0.21
Atualizando de 0.18 → 0.21
Seção intitulada “Atualizando de 0.18 → 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" configcontext.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 frontendTrês mudanças menores acompanham isso:
selectionController.selectedEntities.length→selectionController.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 umEntitySelection.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.