Die Historie bekommt ihre eigenen Farben
In "Letzte Aktivitaeten" stand "Eintritt" weiter auf Rosa, waehrend die Karte daneben ihn laengst gruen zeigte. Dieselbe Ursache wie bei den Anstehend-Chips, nur eine Ecke weiter: die Uebersicht zeigt Ereignisse aus employee_history, holte ihre Farbe aber aus ACTION_CATEGORY — und das ist die Sprache des Protokolls. Dort heisst es "Neueinstellung" und "Wiedereinstellung", in der Historie "Eintritt" und "Wiedereintritt". Genau diese zwei von elf standen nicht darin und fielen auf den neutralen Chip zurueck; die uebrigen neun trafen zufaellig. EVENT_CATEGORY ist jetzt die Zuordnung fuer die Historie, als Record<HistoryEventType, …> und damit vollzaehlig: ein zwoelftes Ereignis laesst der Typpruefer nicht durch, ohne dass jemand eine Farbe dafuer bestimmt. Ein Nachschlagen mit Rueckfall haette auch dann wieder still etwas Plausibles geliefert. Betroffen war nicht nur die Uebersicht — der Historie-Reiter in der Personalakte faerbte seine Chips und seine Filterknoepfe aus derselben falschen Tabelle. Auch die sind umgestellt. Die Punkte vor den Zeilen lagen in einer zweiten Tabelle in page.tsx und sagten fuer "Eintritt" bereits gruen — Punkt und Chip derselben Zeile kamen also aus zwei Verzeichnissen, von denen eines das falsche war. Beide leiten jetzt aus EVENT_CATEGORY ab. Die Rueckkehr ist dabei violett geworden, auch in der Historie: auf der Uebersicht steht sie neben dem Eintritt, und zwei Gruentoene nebeneinander sind keine zwei Dinge. ANSTEHEND_STYLES leitet fuer Eintritt, Austritt und Rueckkehr aus derselben Tabelle ab — die beiden Karten koennen nicht mehr auseinanderlaufen. ACTION_CATEGORY behaelt seinen Rueckfall, und das bleibt richtig: die Aktionen schreiben die SQL-Funktionen als freien Text, eine neue kann jederzeit dazukommen, und ihr neutraler Chip ist dann eine ehrliche Aussage. Fuer eine geschlossene Aufzaehlung war derselbe Rueckfall ein Fehler. Acht Tests, aus EVENT_TYPE_LABELS abgeleitet statt abgeschrieben: dass jedes Ereignis eine Farbe hat, dass keines den neutralen Chip bekommt, dass Punkt und Chip derselben Zeile zusammenpassen und dass die beiden Karten der Uebersicht dasselbe meinen. Lint, Typen, Schemaabgleich, 575 Tests und der Build sind sauber. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
import type { AnstehendArt } from "./dashboard-filter";
|
||||
import type { EmploymentStatus, NoteCategory } from "./types";
|
||||
import type { EmploymentStatus, HistoryEventType, NoteCategory } from "./types";
|
||||
|
||||
// Die Initialen stehen in Weiss darauf, jeder Ton braucht also 4.5:1 gegen
|
||||
// Weiss — nachgerechnet liegt der schwaechste bei 6.11:1. Die Reihe beginnt
|
||||
@@ -50,8 +50,66 @@ export const CATEGORY_STYLES: Record<ColorCategory, string> = {
|
||||
brand: "bg-accent-200 text-brand-700",
|
||||
};
|
||||
|
||||
// Audit-log / activity-feed action -> badge color, per the action list in
|
||||
// dem Kommentar an audit_log in der ersten Migration.
|
||||
/** Der Punkt vor einer Zeile: dieselbe Kategorie, nur als Flaeche. */
|
||||
const CATEGORY_DOT: Record<ColorCategory, string> = {
|
||||
success: "bg-success-text",
|
||||
danger: "bg-danger-text",
|
||||
warning: "bg-warning-text",
|
||||
info: "bg-info-text",
|
||||
purple: "bg-purple-text",
|
||||
brand: "bg-accent-600",
|
||||
};
|
||||
|
||||
/**
|
||||
* Die Ereignisse der Personalakte — die Sprache von employee_history.
|
||||
*
|
||||
* Getrennt von ACTION_CATEGORY darunter, und das ist der Punkt: die beiden
|
||||
* sind zwei Vokabulare fuer dasselbe Geschehen. Das Protokoll schreibt
|
||||
* „Neueinstellung", die Historie schreibt „Eintritt"; „Wiedereinstellung"
|
||||
* steht dort als „Wiedereintritt". Die Uebersicht zeigt Historienereignisse,
|
||||
* holte ihre Farbe aber aus der Protokolltabelle — und genau diese zwei
|
||||
* standen nicht darin und bekamen den neutralen Chip. In „Letzte
|
||||
* Aktivitaeten" war „Eintritt" deshalb rosa, waehrend die Karte daneben ihn
|
||||
* laengst gruen zeigte.
|
||||
*
|
||||
* `Record<HistoryEventType, …>` statt `Record<string, …>`: kaeme ein
|
||||
* zwoelftes Ereignis dazu, liesse der Typpruefer es nicht durch, ohne dass
|
||||
* jemand eine Farbe dafuer bestimmt. Ein Nachschlagen mit Rueckfall haette
|
||||
* auch dann wieder still etwas Plausibles geliefert.
|
||||
*/
|
||||
export const EVENT_CATEGORY: Record<HistoryEventType, ColorCategory> = {
|
||||
Eintritt: "success",
|
||||
Wiedereintritt: "success",
|
||||
Austritt: "danger",
|
||||
// Violett und nicht gruen: auf der Uebersicht steht die Rueckkehr neben dem
|
||||
// Eintritt, und zwei Gruentoene nebeneinander sind keine zwei Dinge. Die
|
||||
// Begruendung samt Messung steht bei ANSTEHEND_STYLES.
|
||||
Rückkehr: "purple",
|
||||
Versetzung: "info",
|
||||
Beförderung: "purple",
|
||||
Reorganisation: "purple",
|
||||
Karenz: "warning",
|
||||
Vertragsänderung: "warning",
|
||||
Stammdatenänderung: "warning",
|
||||
Gehaltsanpassung: "warning",
|
||||
};
|
||||
|
||||
export function eventBadgeStyle(event: HistoryEventType): string {
|
||||
return CATEGORY_STYLES[EVENT_CATEGORY[event]];
|
||||
}
|
||||
|
||||
export function eventDotStyle(event: HistoryEventType): string {
|
||||
return CATEGORY_DOT[EVENT_CATEGORY[event]];
|
||||
}
|
||||
|
||||
// Audit-log action -> badge color, per the action list in dem Kommentar an
|
||||
// audit_log in der ersten Migration.
|
||||
//
|
||||
// Hier ist der Rueckfall richtig und bleibt: die Aktionen schreiben die
|
||||
// SQL-Funktionen als freien Text, und eine neue kann jederzeit dazukommen.
|
||||
// Ihr neutraler Chip ist dann eine ehrliche Aussage. Fuer die Historie gilt
|
||||
// das nicht — deren Werte sind eine geschlossene Aufzaehlung, und dort war
|
||||
// derselbe Rueckfall ein Fehler.
|
||||
const ACTION_CATEGORY: Record<string, ColorCategory> = {
|
||||
Neueinstellung: "success",
|
||||
Wiedereinstellung: "success",
|
||||
@@ -103,9 +161,15 @@ export function actionBadgeStyle(action: string): string {
|
||||
* die man im Vorbeigehen auseinanderhaelt.
|
||||
*/
|
||||
export const ANSTEHEND_STYLES: Record<AnstehendArt, string> = {
|
||||
hire: CATEGORY_STYLES.success,
|
||||
exit: CATEGORY_STYLES.danger,
|
||||
return: CATEGORY_STYLES.purple,
|
||||
// Aus EVENT_CATEGORY abgeleitet, wo es dasselbe meint: auf der Uebersicht
|
||||
// stehen die beiden Karten nebeneinander, und ein Eintritt darf links nicht
|
||||
// anders aussehen als rechts. Genau das war zu sehen, bevor die Historie
|
||||
// ihre eigene Zuordnung bekam.
|
||||
hire: CATEGORY_STYLES[EVENT_CATEGORY.Eintritt],
|
||||
exit: CATEGORY_STYLES[EVENT_CATEGORY.Austritt],
|
||||
return: CATEGORY_STYLES[EVENT_CATEGORY.Rückkehr],
|
||||
// Die Wiedervorlage ist kein Ereignis der Personalakte, sondern ein Termin
|
||||
// aus den Notizen — sie hat in EVENT_CATEGORY nichts verloren.
|
||||
note: CATEGORY_STYLES.warning,
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user