Vollständiger Statusfilter, Beteiligte beim Anlegen, Knöpfe in den Listen

Vier Sachen aus der Durchsicht.

**Der Statusfilter zeigte fünf von sieben Zuständen.** DRAFT und SEALED
fehlten - ausgerechnet die beiden, die in der Liste am häufigsten standen; man
konnte nach dem, was man sah, gerade nicht filtern. Das erklärt auch die Frage,
was „In Prüfung" und „Ruhend" bedeuten: die Zustände standen nirgends in der
Oberfläche. Jetzt alle sieben in der Reihenfolge des Lebenszyklus, mit einer
Erklärung als title, und Versiegelt nur für den, der Versiegeltes lesen darf.
Ein Test verlangt zu jedem Zustand einen Namen und eine Erklärung.

**Beliebig viele Beteiligte beim Anlegen.** Das Formular kannte genau eine
„betroffene Person", und die Rolle war auf SUBJECT festgelegt. Jetzt beliebig
viele Zeilen mit je einer Rolle, Konten und Personalakten in einer Auswahl, wie
auf der Aktenseite. Die Zerlegung steht als parseParticipantDrafts in
lib/cases/terms.ts und nicht in der Server Action: seit die Rolle über den
Zugriff entscheidet, darf eine erfundene Rolle nicht durchrutschen.

**Die Filterleisten sind Knöpfe** wie überall sonst, mit gefülltem aktivem
Filter.

**Keine leere Kennungsspalte mehr.** In „Zuletzt geöffnet" stand bei einer
Person nichts, wo sonst das Aktenzeichen steht - jetzt steht dort
„Personalakte". Nebenbei zwei Stellen zurückgenommen, an denen die
Spaltenklasse im Seitenkopf gelandet war statt in einer Zeile.
This commit is contained in:
Harlekin
2026-09-03 23:38:56 +02:00
parent 9c24858d75
commit 738330cee5
10 changed files with 295 additions and 42 deletions
+13 -7
View File
@@ -9,7 +9,7 @@ import { editEntry, restoreEntry, retractEntry } from '@/lib/cases/entryService'
import { addParticipant, removeParticipant } from '@/lib/cases/participants'
import { linkCases, unlinkCases } from '@/lib/cases/links'
import { toggleWatch } from '@/lib/cases/watch'
import { LINK_KINDS, PARTICIPANT_ROLES } from '@/lib/cases/terms'
import { LINK_KINDS, PARTICIPANT_ROLES, parseParticipantDrafts } from '@/lib/cases/terms'
import { de } from '@/lib/i18n/de'
export type ActionResult = { ok: true } | { ok: false; error: string }
@@ -46,22 +46,28 @@ export async function createCaseAction(
title: formData.get('title'),
classification: formData.get('classification'),
templateKey: formData.get('templateKey'),
personnelFileId: formData.get('personnelFileId') || undefined,
})
if (!parsed.success) return { error: de.actionErrors.default! }
// Beliebig viele Beteiligte. Was nicht sauber ankommt, fällt weg: die Akte
// soll nicht an einer krummen Zeile scheitern. Siehe lib/cases/terms.ts.
const beteiligte = parseParticipantDrafts(formData.getAll('participants'))
let caseNumber: string
try {
const created = await createCase(user.permissions, parsed.data)
caseNumber = created.caseNumber
// Die betroffene Person gleich mitverknüpfen, damit sie nicht in einem
// zweiten Schritt vergessen wird. Scheitert das, steht die Akte trotzdem.
if (parsed.data.personnelFileId) {
// Die Beteiligten gleich mitverknüpfen, damit sie nicht in einem zweiten
// Schritt vergessen werden. Scheitert einer, steht die Akte trotzdem — sie
// ist das Wichtigere, und nachtragen kann man auf der Aktenseite.
for (const eintrag of beteiligte) {
await addParticipant(user.permissions, {
caseNumber,
role: 'SUBJECT',
personnelFileId: parsed.data.personnelFileId,
role: eintrag.role,
...(eintrag.kind === 'user'
? { userId: eintrag.id }
: { personnelFileId: eintrag.id }),
})
}
} catch (error) {