diff --git a/public/neu/auftrags-zeitleiste.js b/public/neu/auftrags-zeitleiste.js index aa9f350..a961cf0 100644 --- a/public/neu/auftrags-zeitleiste.js +++ b/public/neu/auftrags-zeitleiste.js @@ -53,12 +53,13 @@ export function letzteAktivitaet(auftrag) { // 0 = laufend (auch pausiert), 1 = erledigt, 2 = storniert oder abgebrochen const rang = (auftrag) => (auftrag?.status?.tone === 'done' ? 1 : auftrag?.status?.tone === 'stopped' ? 2 : 0) -/** Laufende Aufträge zuerst, dann erledigte, Storniertes zuletzt; innerhalb jeder Gruppe die jüngste Aktivität vorn, bei Gleichstand die Reihenfolge des Servers. */ +/** Laufende Aufträge zuerst, dann erledigte, Storniertes zuletzt; unter den laufenden stehen die mit Rückfrage (braucheInfo) vor den übrigen, damit eine Frage + an den Kunden nie hinter „Ältere Aufträge anzeigen“ verschwindet. Innerhalb jeder Gruppe die jüngste Aktivität vorn, bei Gleichstand die Reihenfolge des Servers. */ export function sortiereAuftraege(tickets) { const liste = Array.isArray(tickets) ? tickets.filter((t) => t && typeof t === 'object') : [] return liste - .map((auftrag, i) => ({ auftrag, i, rang: rang(auftrag), zeit: letzteAktivitaet(auftrag) })) - .sort((a, b) => a.rang - b.rang || b.zeit - a.zeit || a.i - b.i) + .map((auftrag, i) => ({ auftrag, i, rang: rang(auftrag), frage: braucheInfo(auftrag) ? 0 : 1, zeit: letzteAktivitaet(auftrag) })) + .sort((a, b) => a.rang - b.rang || a.frage - b.frage || b.zeit - a.zeit || a.i - b.i) .map((e) => e.auftrag) } diff --git a/test/knAuftragsZeitleiste.test.js b/test/knAuftragsZeitleiste.test.js index a2d0268..4e78c17 100644 --- a/test/knAuftragsZeitleiste.test.js +++ b/test/knAuftragsZeitleiste.test.js @@ -69,6 +69,39 @@ test('Reihenfolge: laufende zuerst (letzte Aktivität), dann erledigte (neueste assert.deepEqual(nummern(liste), ['1', '2', '3', '4', '5', '6', '7', '8'], 'die Eingabe bleibt unverändert') }) +test('Reihenfolge: Aufträge mit Rückfrage stehen vor den übrigen laufenden (auch wenn sie am ältesten sind), unter sich nach Aktivität; erledigte bleiben dahinter', () => { + const liste = [ + auftrag(1, 'arbeit', '2026-10-14T00:00:00Z'), + auftrag(2, 'wartet', '2026-09-01T00:00:00Z', [eintrag('2026-09-05', 'alt')]), + auftrag(3, 'neu', '2026-10-13T00:00:00Z'), + auftrag(4, 'fertig', '2026-10-15T00:00:00Z'), + auftrag(5, 'wartet', '2026-09-20T00:00:00Z', [eintrag('2026-10-02', 'etwas neuer')]), + auftrag(6, 'pause', '2026-10-12T00:00:00Z'), + auftrag(7, 'pruefung', '2026-10-11T00:00:00Z'), + auftrag(8, 'storniert', '2026-10-16T00:00:00Z'), + auftrag(9, 'arbeit', '2026-10-10T00:00:00Z'), + ] + assert.deepEqual(nummern(sortiereAuftraege(liste)), ['5', '2', '1', '3', '6', '7', '9', '4', '8']) + // ohne Rückfrage ändert sich nichts an der alten Regel (Aktivität, dann Serverreihenfolge) + assert.deepEqual(nummern(sortiereAuftraege(liste.filter((a) => !braucheInfo(a)))), ['1', '3', '6', '7', '9', '4', '8']) +}) + +test('Gruppierung: eine Rückfrage verschwindet nie hinter „Ältere Aufträge anzeigen“, auch wenn sie die älteste Aktivität hat', () => { + const laufend = Array.from({ length: 6 }, (_, i) => auftrag(200 + i, 'arbeit', `2026-10-0${i + 3}T00:00:00Z`)) + const rueckfrage = auftrag(300, 'wartet', '2026-08-01T00:00:00Z', [eintrag('2026-08-02', 'sehr alt')]) + const zweite = auftrag(301, 'wartet', '2026-07-01T00:00:00Z') + const g = gruppiereAuftraege([...laufend, rueckfrage, zweite]) + assert.deepEqual(nummern(g.sichtbar.slice(0, 2)), ['300', '301']) + assert.equal(g.sichtbar.length, 5) + assert.ok(nummern(g.sichtbar).includes('300') && nummern(g.sichtbar).includes('301')) + assert.ok(g.aeltere.every((a) => !braucheInfo(a))) + // mehr Rückfragen als Plätze: die mit der jüngsten Aktivität stehen vorn, der Rest gehört in „älter“ (kein Auftrag geht verloren) + const viele = Array.from({ length: 7 }, (_, i) => auftrag(400 + i, 'wartet', `2026-10-0${i + 1}T00:00:00Z`)) + const g2 = gruppiereAuftraege(viele) + assert.deepEqual(nummern(g2.sichtbar), ['406', '405', '404', '403', '402']) + assert.deepEqual(nummern(g2.aeltere), ['401', '400']) +}) + test('Reihenfolge: bei gleicher Aktivität bleibt die Reihenfolge des Servers', () => { const liste = ['9', '8', '7'].map((n) => auftrag(n, 'arbeit', '2026-10-10T00:00:00Z')) assert.deepEqual(nummern(sortiereAuftraege(liste)), ['9', '8', '7'])