Files
AfiS-Aktensystem/web/lib/i18n/common.ts
T
Harlekin 18c9a71fda Export ohne Vier-Augen, Wiedervorlage setzbar, Druckansicht mit Weg zurück
**Export.** Das Vier-Augen-Verfahren ab Stufe 3 ist weg. Wer exportiert,
entscheidet jetzt allein die Freigabestufe: mindestens die des Ziels. Das ist
strenger als das Lesen - wer als Beteiligter ausnahmsweise in eine höher
eingestufte Akte darf, darf sie deshalb noch nicht ausser Haus geben.

Dabei fiel eine Lücke auf: hängte man sich an einen laufenden Auftrag,
entstand kein Protokolleintrag. „Jeder Export wird protokolliert" heisst jeder
Abruf, nicht jeder Rendervorgang - wer dieselbe Datei bekommt, muss genauso
darin stehen.

**Fristen.** dueAt wurde überall gelesen - Übersicht, Suchfilter, Ausdruck -
und nirgends gesetzt. Es gab keine Stelle, an der man ein Datum einträgt,
deshalb stand unter „Fristen" immer „Nichts steht an". Jetzt im Kopf der Akte,
mit Protokolleintrag und ohne Verlaufseintrag: eine Wiedervorlage ist eine
Merkhilfe, keine Aussage über den Fall.

**Statuswechsel.** Aus einem Entwurf führt laut Lebenszyklus nur „Offen"
heraus, deshalb standen dort nie mehr als zwei Ziele. Das sah aus wie ein
Fehler und war keiner - jetzt steht die Erklärung daneben und an jeder Option.

**Druckansicht.** Sie hatte kein eigenes Layout: das weisse Blatt lag auf dem
dunklen Thema und es gab keinen Weg zurück. Jetzt heller Grund, eine Leiste
mit Zurück und Drucken, beides beim Drucken ausgeblendet. Das Ziel wird aus
dem Pfad abgeleitet, damit es auch beim direkten Aufruf stimmt.

**Abteilungsstatistik.** Eine Abteilung ohne Freigabe wird als „Ohne Freigabe"
geführt statt weggelassen - sonst summierten sich die Anteile nicht auf die
Zahl daneben. Mehrere ergeben ein Stück, sonst stünde dort, wie viele es sind.

Dazu: Dienstgrad in eckigen Klammern vor dem Namen und in dessen Grösse, in
einer eigenen Spalte; Knopfform für „Personalakte anlegen"; die abgeschnittene
Anzahl im Kopf der Personalaktenliste; „Zuletzt geöffnet" ohne die zwei
Hinweistexte, leer als Zeichen statt als Satz.
2026-09-04 00:14:07 +02:00

80 lines
3.5 KiB
TypeScript

/**
* Was fast jede Ansicht braucht: Knöpfe, Fehlermeldungen, Freigabestufen.
*
* Nach Bereichen getrennt, weil eine **Client-Komponente die ganze Datei ins
* Bündel zieht**, in der ihr Text steht. Lägen alle Texte in einer, trüge jede
* Ansicht die der ganzen Anwendung mit sich herum — das Budget aus
* docs/09-performance-und-ux.md wäre nach wenigen Phasen aufgebraucht.
*
* Serverkomponenten nehmen weiter `de` aus `lib/i18n/de.ts`: was dorthin
* gezogen wird, verlässt den Server nicht.
*/
export const commonText = {
save: 'Speichern',
cancel: 'Abbrechen',
undo: 'Rückgängig',
retry: 'Erneut versuchen',
loading: 'Wird geladen',
offline: 'Keine Verbindung, wird nachgesendet',
unknown: 'Unbekannt',
} as const
/**
* Meldungen zu abgelehnten Aktionen. Der Schlüssel ist der `code` eines
* `AccessError`, siehe lib/errors.ts. Gilt für Fallakten, Personalakten und
* Dokumente gleichermaßen — die Regeln sind dieselben.
*/
export const actionErrorsText = {
'not-found': 'Die Akte gibt es nicht, oder du darfst sie nicht sehen.',
'department-key-invalid':
'Kürzel: Grossbuchstaben, Ziffern und Bindestrich, höchstens 21 Zeichen.',
'department-key-taken': 'Dieses Kürzel gibt es schon.',
'department-name-missing': 'Die Abteilung braucht einen Namen.',
'clearance-too-low': 'Deine Freigabestufe reicht dafür nicht.',
'no-permission': 'Dir fehlt das nötige Recht.',
'read-only': 'Der Datensatz ist schreibgeschützt.',
closed: 'Der Vorgang ist abgeschlossen. Änderungen brauchen ein eigenes Recht.',
'reason-required': 'Begründung nötig, mindestens 10 Zeichen.',
'transition-invalid': 'Dieser Statuswechsel ist nicht vorgesehen.',
'sections-incomplete': 'Es fehlen Pflichtangaben für den Abschluss.',
'template-missing': 'Dafür gibt es keine Vorlage.',
'field-unknown': 'Dieses Feld gehört nicht zur Vorlage.',
'name-required': 'Ein Name mit mindestens zwei Zeichen ist nötig.',
'participant-target': 'Entweder ein Discord-Konto oder eine Personalakte, nicht beides.',
'link-self': 'Eine Akte lässt sich nicht mit sich selbst verknüpfen.',
'message-empty': 'Die Nachricht ist leer.',
'entry-empty': 'Der Vermerk ist leer.',
'date-invalid': 'Das ist kein gültiges Datum.',
'message-too-long': 'Die Nachricht ist länger als 4000 Zeichen.',
'message-withdrawn': 'Die Nachricht wurde zurückgezogen.',
'adopt-needs-case': 'Nur eine Nachricht aus einem Aktenchat wird zum Vermerk.',
'too-many-views': 'Mehr als dreissig Ansichten werden unübersichtlich. Lösche eine.',
default: 'Nicht gespeichert. Erneut versuchen.',
} as Record<string, string>
export const errorsText = {
notFound: {
title: 'Nicht gefunden',
body: 'Die Seite gibt es nicht, oder du darfst sie nicht sehen.',
},
unexpected: {
title: 'Nicht geladen',
body: 'Der Abruf ist fehlgeschlagen. Erneut versuchen.',
},
conflict: 'Nicht gespeichert, die Akte wurde zwischenzeitlich geändert. Fassungen vergleichen.',
} as const
export const clearanceText = {
label: 'Freigabestufe',
classification: 'Klassifizierung',
level: (n: number) => `Stufe ${n}`,
// Die Bezeichnungen der Stufen stehen nicht hier, sondern in
// ClearanceLevelConfig: sie sind im Adminbereich änderbar und folgen den
// Zugangsrollen des Discord-Servers. Siehe docs/13-entscheidungen.md.
locked: 'Inhalt gesperrt',
lockedHint: (n: number) => `Sichtbar ab Stufe ${n}`,
redacted: 'Geschwärzt',
redactedHint: (n: number) => `Geschwärzt, ab Stufe ${n} sichtbar`,
} as const