Zum Inhalt springen

Upgrade von 0.18 auf 0.21

0.21.0 ist veröffentlicht. Dies sind die ### Breaking-Einträge aus seinem Abschnitt im Changelog, einer nach dem anderen, jeweils mit dem, was Sie ändern müssen. 0.19 und 0.20 deklarieren keine Breaking Changes, daher ist dies ein direkter Schritt von 0.18 — lesen Sie es, bevor Sie auf 0.21 wechseln, nicht danach.

Beide sind Kompilierfehler statt stiller Verhaltensänderungen: Der Build zeigt auf jede Zeile, die angepasst werden muss, und das grep unter jedem Abschnitt findet sie noch vor dem Build.


31. context.client.data kompiliert in einem Collection-Callback nicht mehr

Abschnitt betitelt „31. context.client.data kompiliert in einem Collection-Callback nicht mehr“

RebaseCallContext["client"] ist jetzt RebaseCallbackClient: RebaseClient ohne data. Serverseitig ist dieser Client das rebase-Singleton, welches seit 0.18 kein data mehr hat, sodass context.client.data.collection(…) kompilierte und dann bei jedem Aufruf Cannot read properties of undefined (reading 'collection') warf. Stattdessen ist es nun ein Compiler-Fehler.

Was zu ändern ist: Führen Sie Abfragen über context.data aus, den Accessor, den die Abfragen eines Callbacks schon immer nutzen sollten. Er läuft mit den Berechtigungen dessen, was den Callback ausgelöst hat, auf der eigenen Transaktion des Schreibvorgangs. Der Leitfaden für Callbacks beschreibt, worauf die einzelnen Accessoren auf dem Kontext zugreifen können.

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 steht weiterhin für Callbacks zur Verfügung, die sehen müssen, was ein Administrator sehen darf. admin.browserCallbacks ändert sich ebenfalls: Die alte Schreibweise funktionierte dort, weil der Client des Panels data bereitstellt, und lässt sich nun gleichermaßen nicht mehr kompilieren. useRebaseContext().client in einer React-Komponente behält sein data.

32. selectedEntities wurde entfernt: Eine Auswahl besteht aus Zeilen oder einer Query

Abschnitt betitelt „32. selectedEntities wurde entfernt: Eine Auswahl besteht aus Zeilen oder einer Query“

Eine Collection-Ansicht kann nun jede Zeile auswählen, die ihrem Filter entspricht, nicht nur die Zeilen, die sie geladen hat. Daher gibt SelectionController kein Entity[] mehr zurück. selectionController.selection ist eine EntitySelection-Union: { type: "entities", entities } für manuell ausgewählte Zeilen oder { type: "query", query, excluded, count? } für jede Zeile, die einer Abfrage entspricht, von denen die meisten niemand geladen hat.

Was zu ändern ist: Eine benutzerdefinierte Aktion, die die Auswahl liest, wandelt sie mit resolveSelection aus @rebasepro/cms in Zeilen um. Dies gibt die angehakten Zeilen sofort zurück und liest eine Query-Auswahl seitenweise – mit einem optionalen Fortschritts-Callback – wobei ein Fehler geworfen wird, anstatt nur ein Präfix zurückzugeben, wenn die Abfrage auf mehr als 20.000 Zeilen zutrifft.

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

Drei kleinere Änderungen gehen damit einher:

  • selectionController.selectedEntities.lengthselectionController.selectedCount. Dies ist undefined, niemals 0, wenn jede Zeile ausgewählt ist, die einer Abfrage entspricht, und die Collection nicht gezählt werden kann – stellen Sie diesen Fall dar, setzen Sie keinen Standardwert ein.
  • setSelectedEntities(prev => …)setSelection(prev => …), welches eine EntitySelection entgegennimmt und zurückgibt. setSelectedEntities(rows) mit einem Array funktioniert weiterhin.
  • Die Prüfung, ob etwas ausgewählt ist, erfolgt über selectionController.hasSelection.

isEntitySelected und toggleEntitySelection bleiben unverändert und sollten weiterhin für Checkboxen auf Zeilenebene verwendet werden. Das Beispiel für Collection Actions zeigt das vollständige Muster.