feat(web+android): Warteschlange bearbeiten — ziehen und entfernen

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
marcandClaude Opus 5 committed 2026-09-22 20:31:08 +02:00
1 parent 77a3bb33f0
commit d5b5c8cf84
9 files changed
+330 -7

No files matched your search

+37
View File
@@ -0,0 +1,37 @@
// Reine Indexrechnung der Warteschlange — bewusst OHNE Importe, damit sie sich ohne DOM und
// ohne Wiedergabe pruefen laesst. Hier steckt der Teil, bei dem ein Fehler nicht auffaellt,
// sondern spaeter den falschen Titel spielt.
/**
* Entfernt Position `i`. Liefert den neuen Zeiger und ob der LAUFENDE Titel getroffen wurde.
* Der Zeiger wandert mit: faellt ein Titel VOR dem laufenden weg, rutscht dieser eine Stelle vor.
*/
export function queueNachEntfernen(laenge, qIdx, i) {
if (i < 0 || i >= laenge) return { qIdx, warAktuell: false, leer: laenge === 0 };
const warAktuell = i === qIdx;
const neueLaenge = laenge - 1;
if (neueLaenge === 0) return { qIdx: -1, warAktuell, leer: true };
let neu = qIdx;
if (!warAktuell && i < qIdx) neu--;
// Traf es den laufenden Titel, zeigt der Index jetzt auf den nachrueckenden — am Ende der
// Liste gibt es keinen, dann auf den davor.
if (warAktuell) neu = Math.min(neu, neueLaenge - 1);
return { qIdx: neu, warAktuell, leer: false };
}
/**
* Verschiebt `von` nach `nach` und liefert die neue Reihenfolge samt nachgefuehrtem Zeiger.
* Der Zeiger wird ueber die POSITION des laufenden Titels neu bestimmt, nicht gerechnet — das
* stimmt auch, wenn er selbst gezogen wurde oder ein anderer ueber ihn hinweggezogen ist.
*/
export function queueNachVerschieben(ids, qIdx, von, nach) {
const n = ids.length;
if (von === nach || von < 0 || von >= n || nach < 0 || nach >= n) return { ids, qIdx };
const laufende = ids[qIdx];
const neu = ids.slice();
const [x] = neu.splice(von, 1);
neu.splice(nach, 0, x);
const gefunden = neu.indexOf(laufende);
return { ids: neu, qIdx: gefunden >= 0 ? gefunden : qIdx };
}