Ir al contenido

Actualización de 0.18 a 0.21

0.21.0 ya está publicada. Estas son las entradas ### Breaking de su sección del changelog, una a una, con lo que cada una le pide cambiar. Las versiones 0.19 y 0.20 no introducen cambios incompatibles, por lo que esto representa un solo salto desde 0.18: léalo antes de pasar a 0.21, no después.

Ambos son errores de compilación, no cambios silenciosos de comportamiento: la compilación señala cada línea que hay que editar, y el grep de cada sección las encuentra antes que ella.


31. context.client.data ya no compila en un callback de colección

Sección titulada «31. context.client.data ya no compila en un callback de colección»

RebaseCallContext["client"] ahora es RebaseCallbackClient: RebaseClient sin data. En el lado del servidor, ese cliente es el singleton rebase, que no tiene data desde 0.18, por lo que context.client.data.collection(…) compilaba y luego lanzaba Cannot read properties of undefined (reading 'collection') en cada llamada. Ahora, en su lugar, produce un error de compilación.

Qué cambiar: realice las consultas a través de context.data, el descriptor de acceso que las consultas de un callback siempre debieron utilizar. Se ejecuta con los privilegios de lo que haya disparado el callback, en la propia transacción de escritura. La guía de callbacks explica a qué puede acceder cada descriptor en el contexto.

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 sigue disponible para aquellos callbacks que necesiten ver lo que un administrador puede ver. admin.browserCallbacks también cambia: la sintaxis anterior se ejecutaba allí porque el cliente del panel incluye data, pero ahora también deja de compilar. useRebaseContext().client en un componente de React conserva su data.

32. selectedEntities desaparece: una selección ahora son filas o una consulta

Sección titulada «32. selectedEntities desaparece: una selección ahora son filas o una consulta»

Una vista de colección ahora puede seleccionar todas las filas que coincidan con su filtro, no solo las filas que ha cargado, por lo que SelectionController ya no entrega un Entity[]. selectionController.selection es una unión EntitySelection: { type: "entities", entities } para filas marcadas manualmente, o { type: "query", query, excluded, count? } para todas las filas que coincidan con una consulta, la mayoría de las cuales nadie ha leído aún.

Qué cambiar: una acción personalizada que lea la selección la transforma en filas mediante resolveSelection de @rebasepro/cms. Devuelve las filas marcadas de una sola vez y lee la selección de una consulta página por página —con un callback de progreso opcional—, lanzando un error en lugar de devolver un prefijo cuando la consulta coincide con más de 20.000 filas.

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

Esto incluye tres cambios menores adicionales:

  • selectionController.selectedEntities.lengthselectionController.selectedCount. Es undefined, nunca 0, cuando se seleccionan todas las filas que coinciden con una consulta y la colección no se puede contabilizar; contemple ese caso en la interfaz, no le asigne un valor por defecto.
  • setSelectedEntities(prev => …)setSelection(prev => …), que recibe y devuelve un EntitySelection. setSelectedEntities(rows) con un array sigue funcionando.
  • La comprobación para saber si “hay algo seleccionado” ahora es selectionController.hasSelection.

isEntitySelected y toggleEntitySelection se mantienen sin cambios y son lo que debe seguir utilizando una casilla de verificación por fila. El ejemplo de acciones de colección muestra el patrón completo.