Rückgängig machen und Verlauf
Die beiden Schaltflächen in der oberen Leiste sind geteilte Schaltflächen: Das Symbol bewegt sich einmal, die Einfügemarke öffnet den gesamten Verlauf. Es handelt sich um eine Zeitleiste mit einer Linie „jetzt“ – die Zeilen darüber wurden rückgängig gemacht, die Zeilen darunter können noch rückgängig gemacht werden – und wenn Sie auf eine Zeile klicken, gelangen Sie dorthin.
Machen Sie etwas Geschichte und öffnen Sie sie dann:
- Knoten ausblenden oder Knoten löschen aus dem Rechtsklickmenü eines Knotens
- Erstellen ▸ Knoten hinzufügen auf der linken Leiste und dann auf die Arbeitsfläche klicken
- Führen Sie einen Pivot aus, falls Sie einen haben – eine Aufnahme ist ein Eintrag wie jeder andere
Bewegen Sie den Mauszeiger über eine Zeile und sie markiert die Spanne, die ein Klick umkehren würde, gibt den Nettoeffekt in der Fußzeile an und prognostiziert ihn auf der Arbeitsfläche: Was gehen würde, fließt dort ab, wo es steht, und was zurückkommen würde, wird dort umrissen, wo es landen würde. Ctrl + Z geht ohne Menü zurück.
Das Rückgängigmachen ist zusammenhängend: Wenn Sie drei Reihen nach unten zielen, werden diese drei wie ein Stapel umgekehrt.
// Nothing here switches the history on: `graph.history` records the four kinds of
// composition change on its own, and the two split buttons in the header are wired to
// it. `mode: 'full'` is what brings the header the buttons live in, and the left rail's
// Create tool.
const options = {
UI: {
mode: 'full',
// Off: this card is about the top bar, and `full` mode's minimap and data dock
// are neither (see the Minimap and Data table cards for those).
minimap: false,
table: false
},
render: { nodeTypeAccessor: (node) => node.getData().kind }
}// A consumer that writes a change through to its own backend says so. Undo makes no
// compensating write, so it follows the direction of yours: a creation still reverses
// and the row is chipped `saved`, while a deletion is sealed — undoing it would put
// back a node your backend no longer has.
const writeThrough = {
callbacks: {
onBeforeNodeCreate: async (ctx) => {
const values = await ctx.promptData({
fields: [{ key: 'label', label: 'Name', type: 'text' }]
})
if (!values) return false
const saved = await myBackend.create(values)
return { accept: true, id: saved.uuid, data: values, persisted: true }
},
onBeforeDelete: async (ctx) => {
await myBackend.remove(ctx.nodes.map((node) => node.id))
return { accept: true, persisted: true }
}
}
}const data = {
nodes: [
{ id: 'gw', data: { label: 'gateway-01', kind: 'Host' } },
{ id: 'db', data: { label: 'orders-db', kind: 'Database' } },
{ id: 'api', data: { label: 'orders-api', kind: 'Service' } },
{ id: 'cache', data: { label: 'session-cache', kind: 'Service' } },
{ id: 'job', data: { label: 'nightly-export', kind: 'Job' } },
{ id: 'sftp', data: { label: 'partner-sftp', kind: 'Host' } }
],
edges: [
{ from: 'gw', to: 'api', data: { label: 'routes' } },
{ from: 'api', to: 'db', data: { label: 'reads' } },
{ from: 'api', to: 'cache', data: { label: 'reads' } },
{ from: 'job', to: 'db', data: { label: 'reads' } },
{ from: 'job', to: 'sftp', data: { label: 'writes' } }
]
}„Undo“ schreibt nie in Ihr Backend, daher folgt eine Änderung, die Sie durchgeschrieben haben, der Richtung, in die sie gegangen ist. Eine Erstellung wird immer noch rückgängig gemacht – die Arbeitsfläche verliert, was das Backend behält, und die Fußzeile zählt es (Undoes 2 steps · 1 item saved upstream). Eine Löschung ist versiegelt: aufgelistet, nie rückgängig gemacht, und ein Bereich, der eine enthält, geht darüber (Undoes 2 of 3 · 1 saved item kept).
Unter Rückgängig machen & Verlauf finden Sie Informationen zu den vier Arten von Einträgen, zu dem, was absichtlich nicht aufgezeichnet wird, und dazu, wie das Rückgängigmachen einer Aufnahme dazu führt, dass die Kandidaten wieder in den Triage-Bereich gelangen.