feat(projekt): Anheftungen per Drag & Drop zwischen Unterreitern verschieben

Pin-Zeilen in der Ordneransicht sind draggable, die Reiter sind Ablageziele.
Ein Drop schickt PATCH /api/projects/:id/pins/:pinId {tab_id}; movePin schreibt
project_pins.tab_id um. Verschoben wird nur die Referenz.

- Zielebene hat die Aufnahme schon: Quell-Pin loeschen statt an UNIQUE uniq_pin
  scheitern (merged:true)
- Zielreiter serverseitig gegen den Ordner pruefen, sonst 404
- .ptab-n braucht pointer-events:none, sonst flackert die Ablagemarkierung

Verifiziert gegen die laufende App inkl. 404- und Merge-Faellen; Testdaten
zurueckgesetzt. Doku: Kapitel 10 + Changelog.
This commit is contained in:
2026-08-14 14:52:14 +02:00
parent 2be938c91b
commit 3d628b4b96
6 changed files with 1842 additions and 1678 deletions
+8
View File
@@ -541,6 +541,14 @@ app.post('/api/projects/:id/pins', wrap(async (req, res) => {
await db.pinRecording(+req.params.id, +((req.body && req.body.tab_id) || 0), recId);
res.json({ ok: true });
}));
// Drag&Drop in der Projektansicht: Pin auf eine andere Ebene desselben Ordners
// ziehen. tab_id 0 = zurück auf die Ordner-Ebene.
app.patch('/api/projects/:id/pins/:pinId', wrap(async (req, res) => {
const tabId = +((req.body && req.body.tab_id) || 0);
const r = await db.movePin(+req.params.pinId, +req.params.id, tabId);
if (!r) return res.status(404).json({ error: 'Anheftung oder Zielreiter nicht gefunden' });
res.json(r);
}));
app.delete('/api/projects/:id/pins/:pinId', wrap(async (req, res) => {
await db.unpinRecording(+req.params.pinId);
res.json({ ok: true });