diff --git a/server.js b/server.js index 93cbdb3..ebd84c7 100644 --- a/server.js +++ b/server.js @@ -1647,6 +1647,20 @@ initializeDatabase().then(async () => { GROUP BY status ORDER BY count DESC `, [U]); + // Letzte Aktivitäten für die Startseite: die jüngsten Statusänderungen, quer + // über alle Bewerbungen. Sortiert nach Erfassungszeit (created_at), nicht nach + // dem fachlichen Datum — sonst würde ein nachgetragener alter Eintrag oben + // stehen, obwohl gerade etwas anderes passiert ist. + const aktivitaet = await dbAll(` + SELECT sv.datum, sv.status, sv.kommentar, + b.id AS bewerbung_id, b.firma, b.stelle + FROM status_verlauf sv + LEFT JOIN bewerbungen b ON b.id = sv.bewerbung_id AND b.user_id = sv.user_id + WHERE sv.user_id = ? + ORDER BY datetime(sv.created_at) DESC, sv.id DESC + LIMIT 8 + `, [U]); + // Get available months/years for filter const availableMonths = await dbAll(` SELECT DISTINCT strftime("%Y-%m", datum) as yearmonth, @@ -1683,6 +1697,7 @@ initializeDatabase().then(async () => { availableMonths, exportMonths, currentFilter: { month, year }, + aktivitaet, kommendeTermine, caldavTz: caldav.TZ, artOptions: ART_OPTIONS, diff --git a/views/index.ejs b/views/index.ejs index d9e8b43..d746c1b 100644 --- a/views/index.ejs +++ b/views/index.ejs @@ -130,7 +130,39 @@ transform: rotate(90deg); } + <% + // Status-Reihenfolge synchron zu public/js/main.js halten. Steht hier oben, + // weil sowohl die Liste als auch die Aktivitäten weiter unten sie brauchen. + const statusOrder = ['Entwurf', 'Gesendet', 'Eingangsbestätigung', + 'In Bearbeitung', 'Interessiert', 'Warten auf Rückmeldung', 'Warten auf meine Antwort', + 'Vorstellungsgespräch', 'Vertragsverhandlung', 'Einstellung', 'Absage', 'Absage von meiner Seite', 'Keine Rückmeldung']; + const statusDot = { + 'Entwurf': 'bg-purple-500', + 'Gesendet': 'bg-indigo-500', + 'Eingangsbestätigung': 'bg-blue-500', + 'In Bearbeitung': 'bg-teal-500', + 'Interessiert': 'bg-pink-500', + 'Warten auf Rückmeldung': 'bg-orange-500', + 'Warten auf meine Antwort': 'bg-fuchsia-500', + 'Vorstellungsgespräch': 'bg-yellow-500', + 'Vertragsverhandlung': 'bg-lime-500', + 'Einstellung': 'bg-green-500', + 'Absage': 'bg-red-500', + 'Absage von meiner Seite': 'bg-rose-500', + 'Keine Rückmeldung': 'bg-gray-400', + 'Ohne Status': 'bg-gray-300' + }; + %>
+ +
+

Bewerbungen

+

+ <%= statistics.total %> + <%= statistics.total === 1 ? 'Bewerbung' : 'Bewerbungen' %> gesamt +

+
@@ -144,26 +176,6 @@
<% if (applications.length > 0) { %> <% - // Status-Reihenfolge synchron zu public/js/main.js halten - const statusOrder = ['Entwurf', 'Gesendet', 'Eingangsbestätigung', - 'In Bearbeitung', 'Interessiert', 'Warten auf Rückmeldung', 'Warten auf meine Antwort', - 'Vorstellungsgespräch', 'Vertragsverhandlung', 'Einstellung', 'Absage', 'Absage von meiner Seite', 'Keine Rückmeldung']; - const statusDot = { - 'Entwurf': 'bg-purple-500', - 'Gesendet': 'bg-indigo-500', - 'Eingangsbestätigung': 'bg-blue-500', - 'In Bearbeitung': 'bg-teal-500', - 'Interessiert': 'bg-pink-500', - 'Warten auf Rückmeldung': 'bg-orange-500', - 'Warten auf meine Antwort': 'bg-fuchsia-500', - 'Vorstellungsgespräch': 'bg-yellow-500', - 'Vertragsverhandlung': 'bg-lime-500', - 'Einstellung': 'bg-green-500', - 'Absage': 'bg-red-500', - 'Absage von meiner Seite': 'bg-rose-500', - 'Keine Rückmeldung': 'bg-gray-400', - 'Ohne Status': 'bg-gray-300' - }; const groups = {}; applications.forEach(a => { const key = (a.status && a.status.trim()) ? a.status.trim() : 'Ohne Status'; @@ -315,6 +327,55 @@
+ +
+
+

Letzte Aktivitäten

+ Alle in der Statistik +
+ + <% if (aktivitaet && aktivitaet.length) { %> + + <% } else { %> +
+ Noch keine Statusänderungen protokolliert. +
+ <% } %> +
+