feat(isdirty): Navigations-Guard gegen ungespeichertes Verlassen von Bearbeitungsmasken
Zentraler DirtyGuard (dirtyguard.ts) mit DirtyMaskHelper-Klasse und 3-Button-Bestätigungs-Modal (Speichern/Verwerden/Abbrechen). Form meldet Dirty-State via onDirtyChange nach oben; input-Event ergänzt change für frühzeitiges Dirty-Marking. Alle App-Navigationen (Breadcrumb, Menü, In-Masken-Buttons, Abbrechen) laufen über guardedNavigate. Auto-Redraw bei dirty per e.redraw=false unterbunden, damit DOM-Eingaben erhalten bleiben (Input-Widget hat kein Live-Binding). Generated by Mistral Vibe. Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
This commit is contained in:
1 parent
fd30049a32
commit
a67921ec74
10 files changed
+462
-120
No files matched your search
@@ -10,10 +10,14 @@ export interface iBreadcrumb {
|
||||
|
||||
/** Attribute der BreadcrumbBar: die Vorgänger-Kette (ancestors) und das
|
||||
* Label der aktuellen Ansicht (wird als letztes, nicht klickbares Glied
|
||||
* angezeigt). Ist breadcrumbs leer, wird keine Leiste gerendert. */
|
||||
* angezeigt). Ist breadcrumbs leer, wird keine Leiste gerendert.
|
||||
* onnavigate (optional): Navigations-Callback, der statt m.route.set
|
||||
* verwendet wird — typischerweise guardedNavigate aus dirtyguard.ts,
|
||||
* so dass bei ungespeicherten Änderungen das Bestätigungs-Modal erscheint. */
|
||||
export interface iBreadcrumbBar {
|
||||
breadcrumbs: iBreadcrumb[]
|
||||
current: string
|
||||
onnavigate?: (route: string, params: any, e?: Event) => void
|
||||
}
|
||||
|
||||
/** Parst den Route-Param `bc` (JSON-String) in ein Breadcrumb-Array.
|
||||
@@ -56,12 +60,20 @@ export const BreadcrumbBar: m.ClosureComponent<iBreadcrumbBar> = () => {
|
||||
'white-space': 'nowrap'
|
||||
},
|
||||
title: "Zurück zu " + crumb.label,
|
||||
onclick: () => {
|
||||
onclick: (e: MouseEvent) => {
|
||||
const subChain = crumbs.slice(0, i)
|
||||
const params: any = {...crumb.params}
|
||||
const bc = serializeBc(subChain)
|
||||
if (bc) params.bc = bc
|
||||
m.route.set(crumb.route, params)
|
||||
// Navigation über den Guard, so dass bei dirty-Maske
|
||||
// das Bestätigungs-Modal erscheint. Event wird
|
||||
// durchgereicht, damit guardedNavigate den auto-redraw
|
||||
// unterbinden kann.
|
||||
if (vnode.attrs.onnavigate) {
|
||||
vnode.attrs.onnavigate(crumb.route, params, e)
|
||||
} else {
|
||||
m.route.set(crumb.route, params)
|
||||
}
|
||||
}
|
||||
}, crumb.label))
|
||||
})
|
||||
|
||||
Reference in new issue
Block a user