diff --git a/html/js/office-scene.js b/html/js/office-scene.js
index 928f4c2..b2836ef 100644
--- a/html/js/office-scene.js
+++ b/html/js/office-scene.js
@@ -227,6 +227,11 @@ export function truncateDescriptionLines(text, maxLines = TICKET_DESCRIPTION_MAX
* traegt jedes Ticket sein Quell-Repo ("owner/name") selbst in ticket.repo; opts dient nur
* noch als Fallback fuer aeltere Tickets ohne dieses Feld.
*
+ * Issue #102: Die Liste im Modal zeigt das neueste Ticket zuerst, absteigend nach Alter.
+ * tickets kommt (ueber groupTicketsByColumn()) aeltestes zuerst herein, weil das Board selbst
+ * diese Reihenfolge fuer die "aelteste 4 + Stapel"-Regel (F3, buildBoardColumnLayout())
+ * braucht - hier wird deshalb nur fuer die Modal-Ausgabe umgedreht.
+ *
* @param {string} columnKey
* @param {Array} tickets
* @param {{codebergOwner?: string, codebergRepo?: string}} [opts]
@@ -234,10 +239,11 @@ export function truncateDescriptionLines(text, maxLines = TICKET_DESCRIPTION_MAX
export function buildTicketModalContent(columnKey, tickets = [], opts = {}) {
const { codebergOwner = "fds2610", codebergRepo = "monitor" } = opts;
const column = BOARD_COLUMNS.find((c) => c.key === columnKey);
+ const newestFirst = [...tickets].reverse();
return {
title: column ? column.label : columnKey,
- items: tickets.map((ticket) => ({
+ items: newestFirst.map((ticket) => ({
id: ticket.id,
title: ticket.title,
description: truncateDescriptionLines(ticket.description),
diff --git a/tests/frontend/office-scene.test.js b/tests/frontend/office-scene.test.js
index 513c2c8..cc6eb62 100644
--- a/tests/frontend/office-scene.test.js
+++ b/tests/frontend/office-scene.test.js
@@ -268,8 +268,9 @@ test("buildTicketModalContent traegt Titel/Spaltenlabel und baut Codeberg-Links
{ id: 2, title: "B", description: "", source: "api", external_ref: null },
]);
assert.equal(content.title, "Bereit");
- assert.equal(content.items[0].link, "https://codeberg.org/fds2610/monitor/issues/42");
- assert.equal(content.items[1].link, null);
+ // Issue #102: Modal zeigt neuestes Ticket zuerst, also id 2 (zuletzt in der Eingabe) vor id 1.
+ assert.equal(content.items[0].link, null);
+ assert.equal(content.items[1].link, "https://codeberg.org/fds2610/monitor/issues/42");
});
test("buildTicketModalContent respektiert benutzerdefinierten owner/repo", () => {
@@ -286,8 +287,21 @@ test("buildTicketModalContent baut den Link aus dem repo-Feld des Tickets, nicht
{ id: 1, title: "A", source: "codeberg", external_ref: "3", repo: "fds2610/Steuerkram", color: "#28a745" },
{ id: 2, title: "B", source: "codeberg", external_ref: "9", repo: "fds2610/nc-gantt", color: "#0366d6" },
]);
- assert.equal(content.items[0].link, "https://codeberg.org/fds2610/Steuerkram/issues/3");
- assert.equal(content.items[1].link, "https://codeberg.org/fds2610/nc-gantt/issues/9");
+ // Issue #102: Modal zeigt neuestes Ticket zuerst, also id 2 (zuletzt in der Eingabe) vor id 1.
+ assert.equal(content.items[0].link, "https://codeberg.org/fds2610/nc-gantt/issues/9");
+ assert.equal(content.items[1].link, "https://codeberg.org/fds2610/Steuerkram/issues/3");
+});
+
+test("buildTicketModalContent zeigt das neueste Ticket zuerst, absteigend nach Alter (Issue #102)", () => {
+ const content = buildTicketModalContent("backlog", [
+ { id: 1, title: "aeltestes" },
+ { id: 2, title: "mittel" },
+ { id: 3, title: "neuestes" },
+ ]);
+ assert.deepEqual(
+ content.items.map((item) => item.id),
+ [3, 2, 1]
+ );
});
// ---------------------------------------------------------------------------------------
@@ -949,15 +963,17 @@ test("buildTicketModalContent liefert Repo und Ticket-Nummer fuer die Ueberschri
{ id: 1, title: "A", source: "codeberg", external_ref: "3", repo: "fds2610/Steuerkram" },
{ id: 2, title: "B", source: "api", external_ref: null },
]);
- assert.equal(content.items[0].repo, "fds2610/Steuerkram");
- assert.equal(content.items[0].number, "3");
- assert.equal(content.items[1].repo, null);
- assert.equal(content.items[1].number, null);
+ // Issue #102: Modal zeigt neuestes Ticket zuerst, also id 2 (zuletzt in der Eingabe) vor id 1.
+ assert.equal(content.items[0].repo, null);
+ assert.equal(content.items[0].number, null);
+ assert.equal(content.items[1].repo, "fds2610/Steuerkram");
+ assert.equal(content.items[1].number, "3");
});
test("buildTicketModalContent kuerzt Beschreibungen auf 10 Zeilen mit '...' (Issue #88)", () => {
const lines = Array.from({ length: 12 }, (_, i) => `Zeile ${i + 1}`);
- const [long, exact] = buildTicketModalContent("backlog", [
+ // Issue #102: Modal zeigt neuestes Ticket zuerst, also kommt "exact" (id 2) vor "long" (id 1).
+ const [exact, long] = buildTicketModalContent("backlog", [
{ id: 1, title: "A", description: lines.join("\n") },
{ id: 2, title: "B", description: lines.slice(0, 10).join("\n") },
]).items;