Scanner: Trefferliste per Klick auf die Spaltenüberschrift sortieren

- sort + dir serverseitig für Quote, Agent, Stelle, Unternehmen, Börse,
  Veröffentlicht, Status, Gefunden; leere Werte immer unten
- neue Spalte Veröffentlicht (Alter der Anzeige, Datum im Tooltip)
- Feld Sortierung bleibt als Schnellwahl

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
schakal00783
2026-09-29 14:18:22 +02:00
co-authored by Claude Opus 5.5
parent 1ad774fdd2
commit 0aa8f17b28
3 changed files with 113 additions and 25 deletions
+22 -9
View File
@@ -253,15 +253,28 @@ router.get('/matches', async (req, res, next) => {
}
if (req.query.alarm === '1') where.push('m.alarm = 1');
const order =
req.query.sort === 'score'
? 'm.score DESC, m.created_at DESC'
: req.query.sort === 'published'
? 'j.published_at IS NULL, j.published_at DESC'
: req.query.sort === 'oldest'
? 'j.published_at IS NULL, j.published_at ASC'
: // bekannte Firmen zuerst, dann neueste
'known DESC, m.created_at DESC';
/*
* Sortierung: `sort` = Spalte, `dir` = asc|desc (Klick auf die Spalten-
* ueberschrift). Serverseitig, weil die Liste begrenzt ist - im Browser
* sortiert haette man nur den geladenen Ausschnitt geordnet.
* Leere Werte (Anzeige ohne Datum, ohne Firma) stehen immer unten.
*/
const dir = req.query.dir === 'asc' ? 'ASC' : 'DESC';
const nullsLast = (column) => `${column} IS NULL, ${column} ${dir}`;
const SORTS = {
score: `m.score ${dir}`,
agent: `a.name ${dir}`,
title: `j.title ${dir}`,
company: nullsLast('j.company'),
source: `j.source ${dir}`,
status: `FIELD(m.status, 'neu', 'gesehen', 'in_bearbeitung', 'verworfen') ${dir}`,
published: nullsLast('j.published_at'),
created: `m.created_at ${dir}`,
// Vorgabe: bekannte Firmen zuerst, dann neueste Funde
known: `known ${dir}, m.created_at DESC`,
};
const sortKey = req.query.sort === 'oldest' ? 'published' : String(req.query.sort ?? 'known');
const order = `${SORTS[sortKey] ?? SORTS.known}, m.id DESC`;
const limit = Math.min(Math.max(Number(req.query.limit) || 300, 1), 1000);
const whereSql = where.length ? `WHERE ${where.join(' AND ')}` : '';