feat(quick-260923-ad9): Reiter per Ziehen umsortieren - Task 4
dashboard-tabs.tsx: Ziehen ueber Pointer-Ereignisse (Muster xframe-config-form.tsx, D-05 - keine neue Abhaengigkeit). Schwelle 4 px waagerechte Auslenkung trennt Klick von Ziehen; darueber wird der Zeiger eingefangen (jsdom-Schutzhuelle), die Leiste zeigt die Vorschau-Reihenfolge (computeReorderedIds, Einfuegen vor dem ersten Nachbarn mit Mittelpunkt rechts vom Zeiger), beim Loslassen geht die VOLLSTAENDIGE Kennungsliste an onReorder. Abbruch des Zeigers verwirft die Vorschau ohne zu senden. Ein hasDraggedRef-Merker unterdrueckt den Klick, der im echten Browser nach einem Ziehen folgt. Ziehen ist IMMER moeglich, nicht nur im Bearbeitungsmodus (D-09) - ein Hinweistext erklaert, dass der erste Reiter beim Oeffnen geladen wird. dashboard-store.ts: reorderDashboards() setzt die neue Reihenfolge SOFORT optimistisch, sendet sie und stellt bei einem Fehler die vorherige Reihenfolge wieder her; der aktive Reiter bleibt aktiv. dashboard-tabs.test.tsx: 21 Tests (12 alte aus Task 3 + 9 neue fuer jeden Punkt des Verhaltensblocks). getBoundingClientRect wird je Reiter-Wrapper ueber data-tab-index gestubbt (Reiter i belegt 100i..100i+100 - jsdom liefert keine echten Masse). dashboard-store.test.ts: 17 Tests (15 alte + 2 neue fuer Optimismus/Ruecknahme). Messages: widgets.tabs.dragHint war bereits in Task 3 eingetragen (vorausschauend) - in diesem Task keine weitere Aenderung an de.json/en.json noetig. Gemessene Abweichung von der Plan-Erwartung (kein Rule-1/2/3-Fall, reine Zahlendifferenz): `grep -c "react-grid-layout|dnd|sortable" apps/web/package.json` liefert 2 statt der im Plan erwarteten 1 - der zweite Treffer ist `@types/react-grid-layout`, bereits vor diesem Task vorhanden (siehe `git diff --stat apps/web/package.json`: keine Aenderung in keinem der vier Tasks). D-05 (keine neue Zieh-Abhaengigkeit) ist damit weiterhin erfuellt, nur an der leeren package.json-Diff nachgewiesen statt an der im Plan vorausgesagten Zahl. Ebenso liefert `pnpm --filter @tessera/web test` 82 statt der erwarteten 83 Dateien - Task 4 fuegt (siehe files_modified oben) keine neue Testdatei hinzu, Task 3 hatte die Dateizahl bereits auf 82 gebracht. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
@@ -32,6 +32,7 @@ interface DashboardState {
|
||||
createDashboard: () => Promise<void>;
|
||||
renameDashboard: (id: string, name: string) => Promise<void>;
|
||||
deleteDashboard: (id: string) => Promise<void>;
|
||||
reorderDashboards: (ids: string[]) => Promise<void>;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -300,4 +301,28 @@ export const useDashboardStore = create<DashboardState>()((set, get) => ({
|
||||
console.error('Failed to delete dashboard:', err);
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Persistiert eine per Ziehen bestimmte Reihenfolge (quick-260923-ad9,
|
||||
* Task 4). Setzt die neue Reihenfolge SOFORT im Zustand (optimistisch —
|
||||
* die Leiste in `dashboard-tabs.tsx` zeigt schon ihre eigene Vorschau
|
||||
* waehrend des Ziehens, dieses `set` uebernimmt sie beim Loslassen als
|
||||
* Tatsache) und stellt bei einem fehlgeschlagenen Speichern die VORHERIGE
|
||||
* Reihenfolge wieder her. Der aktive Reiter bleibt aktiv, auch wenn er
|
||||
* seine Position wechselt — `activeDashboardId` bleibt unberuehrt.
|
||||
*/
|
||||
reorderDashboards: async (ids: string[]) => {
|
||||
const previous = get().dashboards;
|
||||
const byId = new Map(previous.map((d) => [d.id, d]));
|
||||
const optimistic = ids.map((id) => byId.get(id)).filter((d): d is DashboardTab => d !== undefined);
|
||||
set({ dashboards: optimistic });
|
||||
|
||||
try {
|
||||
const updated = await api.reorderDashboardTabs(ids);
|
||||
set({ dashboards: updated });
|
||||
} catch (err) {
|
||||
console.error('Failed to reorder dashboards:', err);
|
||||
set({ dashboards: previous });
|
||||
}
|
||||
},
|
||||
}));
|
||||
|
||||
Reference in New Issue
Block a user