Gedankenstriche durch Bindestriche ersetzt
Prüfung / Lint, Typen, Tests (push) Canceled after 0s
Prüfung / Images bauen (pdf) (push) Canceled after 0s
Prüfung / Images bauen (web) (push) Canceled after 0s
Prüfung / Images bauen (worker) (push) Canceled after 0s
Images / bauen (pdf, docker/pdf.Dockerfile) (push) Canceled after 0s
Images / bauen (web, docker/web.Dockerfile) (push) Canceled after 0s
Images / bauen (worker, docker/worker.Dockerfile) (push) Canceled after 0s
Prüfung / Lint, Typen, Tests (push) Canceled after 0s
Prüfung / Images bauen (pdf) (push) Canceled after 0s
Prüfung / Images bauen (web) (push) Canceled after 0s
Prüfung / Images bauen (worker) (push) Canceled after 0s
Images / bauen (pdf, docker/pdf.Dockerfile) (push) Canceled after 0s
Images / bauen (web, docker/web.Dockerfile) (push) Canceled after 0s
Images / bauen (worker, docker/worker.Dockerfile) (push) Canceled after 0s
375 Vorkommen in 210 Dateien. Betrifft Kommentare, Oberflaechentexte und die README; an keiner Stelle Bedeutung, nur Zeichensetzung.
This commit is contained in:
@@ -6,13 +6,13 @@ import { commonText } from '@/lib/i18n/common'
|
||||
/**
|
||||
* Ein aufklappbares Formular zum Hinzufügen.
|
||||
*
|
||||
* Beteiligte, Verknüpfungen, Dokumente, Zuordnungen — überall derselbe Ablauf:
|
||||
* Beteiligte, Verknüpfungen, Dokumente, Zuordnungen - überall derselbe Ablauf:
|
||||
* ein Knopf, ein kleines Formular, eine Server Action, eine Fehlermeldung an
|
||||
* Ort und Stelle. Das viermal zu wiederholen kostete nicht nur Zeilen, sondern
|
||||
* auch Bündelgrösse auf der Fallakte, die ohnehin die dichteste Seite ist.
|
||||
*
|
||||
* Der Rückruf bekommt `schliessen`, damit das Formular nur nach einem Erfolg
|
||||
* zugeht — ein Fehler soll die Eingabe nicht wegräumen.
|
||||
* zugeht - ein Fehler soll die Eingabe nicht wegräumen.
|
||||
*/
|
||||
export function AddPanel({
|
||||
label,
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
* im Stack für ein Bild von 64 Pixeln. Dafür steht `cdn.discordapp.com` in der
|
||||
* Inhaltsrichtlinie, siehe middleware.ts.
|
||||
*
|
||||
* Ohne Bild — und das ist der Normalfall bei Konten ohne eigenes Profilbild —
|
||||
* Ohne Bild - und das ist der Normalfall bei Konten ohne eigenes Profilbild -
|
||||
* stehen die Anfangsbuchstaben da. Kein Platzhaltergesicht: ein leerer Kreis
|
||||
* mit Initialen ist ehrlicher und lädt nichts nach.
|
||||
*/
|
||||
|
||||
@@ -7,7 +7,7 @@ import { Pending } from '@/components/Pending'
|
||||
/**
|
||||
* Die Bereiche der Anwendung in der Kopfzeile.
|
||||
*
|
||||
* Sie waren blosse Textlinks — von einem Fliesstextlink nicht zu unterscheiden
|
||||
* Sie waren blosse Textlinks - von einem Fliesstextlink nicht zu unterscheiden
|
||||
* und ohne Hinweis darauf, wo man gerade ist. Jetzt tragen sie dieselbe
|
||||
* Knopfform wie alles Bedienbare, und der Bereich, in dem man steht, ist
|
||||
* gefüllt.
|
||||
|
||||
@@ -6,12 +6,12 @@ import { useLinkStatus } from 'next/link'
|
||||
* Der Ladepunkt in einem Link, solange der Wechsel läuft.
|
||||
*
|
||||
* Ein Wechsel kann einen Moment dauern, und ohne Rückmeldung sieht es aus, als
|
||||
* sei der Klick nicht angekommen — man klickt ein zweites Mal. Der Punkt sitzt
|
||||
* sei der Klick nicht angekommen - man klickt ein zweites Mal. Der Punkt sitzt
|
||||
* **im geklickten Link**, damit sichtbar bleibt, wohin es geht.
|
||||
*
|
||||
* Das ist kein Blockade-Spinner im Sinn von Zusicherung 5 der README: er ersetzt
|
||||
* keinen Inhalt und hält nichts auf. Die Zielseite bringt ihr Skelett mit, das
|
||||
* ist die eigentliche Antwort auf das Warten — hier geht es nur darum, den
|
||||
* ist die eigentliche Antwort auf das Warten - hier geht es nur darum, den
|
||||
* Klick zu quittieren.
|
||||
*
|
||||
* `useLinkStatus` funktioniert nur als Kind eines `next/link`, deshalb die
|
||||
|
||||
@@ -27,7 +27,7 @@ export function PieChart({
|
||||
}: {
|
||||
slices: Slice[]
|
||||
emptyLabel: string
|
||||
/** „12 Fälle" — steht in der Mitte und sagt, worauf sich die Anteile beziehen. */
|
||||
/** „12 Fälle" - steht in der Mitte und sagt, worauf sich die Anteile beziehen. */
|
||||
totalLabel: (total: number) => string
|
||||
}) {
|
||||
const gesamt = slices.reduce((summe, stueck) => summe + stueck.value, 0)
|
||||
@@ -101,7 +101,7 @@ export function PieChart({
|
||||
|
||||
/**
|
||||
* Abstufungen von `--steel`, gleichmässig verteilt. Bei einem einzigen
|
||||
* Segment die volle Farbe, sonst von kräftig nach blass — so bleibt die
|
||||
* Segment die volle Farbe, sonst von kräftig nach blass - so bleibt die
|
||||
* Reihenfolge der Liste auch im Kreis ablesbar.
|
||||
*/
|
||||
function farbeFuer(index: number, anzahl: number): string {
|
||||
|
||||
@@ -19,7 +19,7 @@ import { ThemeToggle } from '@/components/ThemeToggle'
|
||||
* das Abmelden. In der Kopfzeile standen diese Dinge vorher zwischen den
|
||||
* Aktenbereichen und nahmen dort Platz weg, den die Arbeit braucht.
|
||||
*
|
||||
* Das Abmelden kommt als Server Action von aussen herein — dieses Fenster darf
|
||||
* Das Abmelden kommt als Server Action von aussen herein - dieses Fenster darf
|
||||
* die Sitzung nicht selbst beenden können.
|
||||
*/
|
||||
export function ProfileMenu({
|
||||
|
||||
@@ -3,7 +3,7 @@ import { searchBarText } from '@/lib/i18n/shell'
|
||||
/**
|
||||
* Der Suchbalken in der Kopfzeile.
|
||||
*
|
||||
* Ein gewöhnliches Formular, das die Anfrage an `/suche` übergibt — kein
|
||||
* Ein gewöhnliches Formular, das die Anfrage an `/suche` übergibt - kein
|
||||
* Skript, kein Zustand, keine Bytes im Bündel. Die eigentliche Suche mit
|
||||
* Filtern, Facetten und Abbruch laufender Anfragen sitzt auf der Suchseite,
|
||||
* hier steht nur das Eingangstor.
|
||||
|
||||
@@ -17,7 +17,7 @@ export function stampColor(level: number): string {
|
||||
* `ClearanceLevelConfig.colorToken` und `PersonnelStatusTag.colorToken` sind
|
||||
* Daten und im Adminbereich pflegbar. Sie landen als Name einer CSS-Variablen
|
||||
* in einem `style`-Attribut, und was aus der Datenbank in ein Stilattribut
|
||||
* geht, wird geprueft — nicht weil es heute jemand setzen koennte, sondern
|
||||
* geht, wird geprueft - nicht weil es heute jemand setzen koennte, sondern
|
||||
* weil es morgen jemand koennen soll. Ein unbekannter Wert faellt auf die
|
||||
* neutrale Marke zurueck, statt eine Variable zu erfinden, die es nicht gibt.
|
||||
*/
|
||||
@@ -45,7 +45,7 @@ export function colorVariable(token: string | null | undefined): string {
|
||||
* **Feste Breite.** Die Namen der Stufen sind unterschiedlich lang und im
|
||||
* Adminbereich aenderbar; unterschiedlich breite Marken untereinander lesen
|
||||
* sich als Unordnung, nicht als Unterschied. Ein zu langer Name wird gekuerzt,
|
||||
* die Stufenziffer davor bleibt immer stehen — sie ist die eigentliche
|
||||
* die Stufenziffer davor bleibt immer stehen - sie ist die eigentliche
|
||||
* Auskunft.
|
||||
*
|
||||
* `name` kommt aus ClearanceLevelConfig und ist im Adminbereich aenderbar,
|
||||
|
||||
@@ -5,7 +5,7 @@ import { colorVariable } from '@/components/StampMark'
|
||||
*
|
||||
* Mehrere zugleich: „Gekündigt" und „Verhaftet" schließen einander nicht aus.
|
||||
* Die Namen und Farben kommen aus `PersonnelStatusTag` und sind im
|
||||
* Adminbereich pflegbar — deshalb werden sie hereingereicht und nicht aus
|
||||
* Adminbereich pflegbar - deshalb werden sie hereingereicht und nicht aus
|
||||
* `lib/i18n/de.ts` gelesen. Siehe die Sprachkonvention: Code englisch, Oberflaeche deutsch.
|
||||
*/
|
||||
export function StatusTags({
|
||||
|
||||
@@ -8,7 +8,7 @@ import { Pending } from '@/components/Pending'
|
||||
* Eine Reiterleiste.
|
||||
*
|
||||
* Sie hebt hervor, wo man gerade ist. Vorher taten das weder die Reiter der
|
||||
* Fallakte noch die der Verwaltung — fünf gleich aussehende Links, und man
|
||||
* Fallakte noch die der Verwaltung - fünf gleich aussehende Links, und man
|
||||
* musste an der Seite selbst ablesen, welcher davon offen war.
|
||||
*
|
||||
* Der Vergleich läuft über den Pfad, nicht über die vollständige Adresse:
|
||||
|
||||
@@ -12,7 +12,7 @@ export const THEME_KEY = 'afis:thema'
|
||||
*
|
||||
* Drei Zustände, nicht zwei: „System" ist der Auslieferungszustand und folgt
|
||||
* `prefers-color-scheme`. Wer ausdrücklich wählt, bekommt seine Wahl auf
|
||||
* diesem Gerät gemerkt — nicht am Konto, denn es ist eine Eigenschaft des
|
||||
* diesem Gerät gemerkt - nicht am Konto, denn es ist eine Eigenschaft des
|
||||
* Bildschirms, an dem jemand sitzt, nicht der Person.
|
||||
*
|
||||
* Gesetzt wird das Attribut schon vor dem ersten Malen, siehe das Skript im
|
||||
|
||||
@@ -8,7 +8,7 @@ import { usePathname } from 'next/navigation'
|
||||
*
|
||||
* Gesendet wird mit `sendBeacon`: das überlebt den Seitenwechsel, blockiert
|
||||
* nichts und braucht keine offene Verbindung. Die Bibliothek wird erst
|
||||
* geladen, wenn der Browser Zeit hat — die Messung darf nicht selbst zur
|
||||
* geladen, wenn der Browser Zeit hat - die Messung darf nicht selbst zur
|
||||
* Ladezeit beitragen.
|
||||
*
|
||||
* Übertragen wird das **Routenmuster**, nicht der konkrete Pfad: eine
|
||||
|
||||
@@ -25,16 +25,16 @@ export type ChatScopeView =
|
||||
type Reaktion = { messageId: string; userId: string; key: string }
|
||||
|
||||
/**
|
||||
* Der Chat einer Akte — Fallakte oder Personalakte.
|
||||
* Der Chat einer Akte - Fallakte oder Personalakte.
|
||||
*
|
||||
* Optisch klar vom Verlauf abgesetzt, weil er inhaltlich etwas anderes ist:
|
||||
* formlos, kein Aktenbestandteil. Die Zeitachse des Verlaufs hat eine
|
||||
* durchgehende Linie, der Chat nicht — der Unterschied muss ohne Beschriftung
|
||||
* durchgehende Linie, der Chat nicht - der Unterschied muss ohne Beschriftung
|
||||
* erkennbar sein. Siehe docs/10-design-system.md.
|
||||
*
|
||||
* Gesendet wird optimistisch: die Nachricht steht sofort da, mit einer
|
||||
* clientseitig erzeugten UUIDv7 als Kennung. Kommt dieselbe Kennung über den
|
||||
* Strom zurück, wird der optimistische Eintrag ersetzt statt verdoppelt — und
|
||||
* Strom zurück, wird der optimistische Eintrag ersetzt statt verdoppelt - und
|
||||
* ein wiederholtes Absenden nach einem Netzfehler erzeugt keine zweite
|
||||
* Nachricht. Siehe docs/09-performance-und-ux.md.
|
||||
*/
|
||||
@@ -194,7 +194,7 @@ export function Chat({
|
||||
|
||||
{nachricht.replyToId ? (
|
||||
<p className="mb-1 border-l-(length:--spacing-edge) border-line pl-2 text-2xs text-text-dim">
|
||||
{chatText.replyingTo} {nachId.get(nachricht.replyToId)?.authorName ?? '—'}:{' '}
|
||||
{chatText.replyingTo} {nachId.get(nachricht.replyToId)?.authorName ?? '-'}:{' '}
|
||||
{(nachId.get(nachricht.replyToId)?.body ?? '').slice(0, 80)}
|
||||
</p>
|
||||
) : null}
|
||||
@@ -357,7 +357,7 @@ export function Chat({
|
||||
<div className="border-t border-line px-4 py-3">
|
||||
{antwortAuf ? (
|
||||
<p className="mb-2 flex items-center gap-3 text-2xs text-text-dim">
|
||||
{chatText.replyingTo} {nachId.get(antwortAuf)?.authorName ?? '—'}
|
||||
{chatText.replyingTo} {nachId.get(antwortAuf)?.authorName ?? '-'}
|
||||
<button
|
||||
type="button"
|
||||
onClick={() => setAntwortAuf(null)}
|
||||
|
||||
@@ -18,7 +18,7 @@ const ChatInner = dynamic(() => import('./Chat').then((modul) => modul.Chat), {
|
||||
* Lädt den Chat erst, wenn er in Sichtweite kommt.
|
||||
*
|
||||
* Zwei Gründe, beide handfest: die Fallakte ist das, weswegen die Seite
|
||||
* geöffnet wird — ihr Bündelbudget soll nicht für einen Chat draufgehen, den
|
||||
* geöffnet wird - ihr Bündelbudget soll nicht für einen Chat draufgehen, den
|
||||
* viele nie aufklappen. Und der Chat hält eine offene Verbindung zum
|
||||
* Ereignisstrom; wer nur die Akte liest, soll sie nicht aufbauen.
|
||||
*
|
||||
|
||||
@@ -14,7 +14,7 @@ type Eintrag = {
|
||||
}
|
||||
|
||||
/**
|
||||
* Dokumente eines Besitzers. Die Liste ist bereits gefiltert — was hier
|
||||
* Dokumente eines Besitzers. Die Liste ist bereits gefiltert - was hier
|
||||
* ankommt, darf der Leser sehen. Kein Ausblenden im Client.
|
||||
*/
|
||||
export function DocumentList({
|
||||
|
||||
@@ -9,7 +9,7 @@ import { createDocumentAction, type ActionResult } from '@/app/(app)/dokumente/a
|
||||
* Dokument anlegen, an einer Fallakte oder an einer Personalakte.
|
||||
*
|
||||
* Die Vorlagenliste kommt vom Server und enthält nur, was an dieser Stelle
|
||||
* erlaubt ist. Geprüft wird das trotzdem noch einmal beim Anlegen — die
|
||||
* erlaubt ist. Geprüft wird das trotzdem noch einmal beim Anlegen - die
|
||||
* Auswahl im Formular ist eine Bequemlichkeit, keine Sicherung.
|
||||
*/
|
||||
export function NewDocument({
|
||||
|
||||
@@ -14,7 +14,7 @@ import type { RenderedSection } from '@/lib/sections/render'
|
||||
* Das Aktenblatt: ein Formular, kein Bildschirmelement.
|
||||
*
|
||||
* Nachgebaut nach dem Blatt, das die Personalabteilung bislang von Hand
|
||||
* ausgefüllt hat — Raster, Rahmenstärken und Beschriftungen entsprechen ihm.
|
||||
* ausgefüllt hat - Raster, Rahmenstärken und Beschriftungen entsprechen ihm.
|
||||
* Es steht bewusst außerhalb des Design-Systems der Oberfläche, weil es
|
||||
* gedruckt weitergereicht wird und auf Papier gleich aussehen muss.
|
||||
*
|
||||
@@ -81,7 +81,7 @@ export function Sheet({
|
||||
style={{ backgroundColor: balken?.colorHex ?? '#333333' }}
|
||||
>
|
||||
<span>
|
||||
{subtitle} — {balken ? `${balken.name} [Level ${balken.level}]` : de.document.unclassified}
|
||||
{subtitle} - {balken ? `${balken.name} [Level ${balken.level}]` : de.document.unclassified}
|
||||
</span>
|
||||
<span>
|
||||
{de.document.issuedAt}: {formatiereDatum(issuedAt)}
|
||||
@@ -213,7 +213,7 @@ function Cell({
|
||||
<div className="sheet-signature">{asText(section?.value)}</div>
|
||||
{field.dateKey ? (
|
||||
<div className="sheet-label" style={{ marginTop: 5 }}>
|
||||
{de.document.signedOn}: {asText(dateSection?.value) || '—'}
|
||||
{de.document.signedOn}: {asText(dateSection?.value) || '-'}
|
||||
</div>
|
||||
) : null}
|
||||
</td>
|
||||
|
||||
@@ -7,7 +7,7 @@ import { documentText } from '@/lib/i18n/documents'
|
||||
* Umschalter zwischen Aktenblatt und Bearbeitung.
|
||||
*
|
||||
* Beide Bäume kommen fertig gerendert vom Server herein; hier wird nur
|
||||
* umgeschaltet. Das Blatt bleibt damit das, was es ist — ein Formular —, ohne
|
||||
* umgeschaltet. Das Blatt bleibt damit das, was es ist - ein Formular -, ohne
|
||||
* dass die Bearbeitung es mit Eingabefeldern zerlegt.
|
||||
*/
|
||||
export function SheetSwitch({
|
||||
|
||||
@@ -10,7 +10,7 @@ import { requestExportAction, type ExportState } from '@/app/(app)/export/action
|
||||
*
|
||||
* Kein Fortschrittsbalken, der eine Zahl erfindet: der Auftrag hat drei
|
||||
* Zustände, und die stehen da. Fertig meldet der Ereignisstrom, dann steht
|
||||
* der Knopf zum Herunterladen bereit — automatisch losladen wäre unhöflich,
|
||||
* der Knopf zum Herunterladen bereit - automatisch losladen wäre unhöflich,
|
||||
* wenn jemand die Seite inzwischen wieder verlassen hat und zurückkommt.
|
||||
*/
|
||||
export function ExportPanel({
|
||||
|
||||
@@ -18,7 +18,7 @@ const SEITEN: Treffer[] = paletteText.pages.map((seite) => ({
|
||||
* Aktenzeichen eintippen und hinspringen, mehr will sie nicht. Die Treffer
|
||||
* kommen serverseitig gefiltert; was hier ankommt, darf der Nutzer sehen.
|
||||
*
|
||||
* Eine laufende Anfrage wird bei neuer Eingabe abgebrochen — sonst überholt
|
||||
* Eine laufende Anfrage wird bei neuer Eingabe abgebrochen - sonst überholt
|
||||
* eine langsame Antwort eine schnellere und zeigt Treffer zu einem Begriff,
|
||||
* der nicht mehr im Feld steht. Siehe docs/09-performance-und-ux.md.
|
||||
*/
|
||||
|
||||
@@ -13,7 +13,7 @@ const CommandPalette = dynamic(
|
||||
*
|
||||
* Absichtlich winzig: dieser Teil steckt in jeder Seite, und die Fallakte hat
|
||||
* kein Bündel übrig. Die Palette selbst wird erst geholt, wenn jemand sie
|
||||
* öffnet — vorher ist sie ein Tastaturereignis und sonst nichts.
|
||||
* öffnet - vorher ist sie ein Tastaturereignis und sonst nichts.
|
||||
*/
|
||||
export function PaletteTrigger() {
|
||||
const [offen, setOffen] = useState(false)
|
||||
|
||||
@@ -11,7 +11,7 @@ import { useEffect, useRef } from 'react'
|
||||
* Verkehr kostet nichts.
|
||||
*
|
||||
* Die Rückrufe stehen in einem Ref, damit ein neu erzeugter Handler nicht die
|
||||
* ganze Verbindung neu aufbaut — sonst reisst der Strom bei jedem Tastendruck
|
||||
* ganze Verbindung neu aufbaut - sonst reisst der Strom bei jedem Tastendruck
|
||||
* im Eingabefeld ab.
|
||||
*/
|
||||
export type StreamHandlers = Record<string, (data: unknown) => void>
|
||||
@@ -46,7 +46,7 @@ export function useStream(topics: string[], handlers: StreamHandlers): void {
|
||||
// Der Server meldet einen Entzug ausdrücklich, statt die Verbindung nur
|
||||
// fallen zu lassen: `EventSource` baut sonst sofort wieder auf, und man
|
||||
// arbeitet auf einer Seite weiter, für die man keine Rechte mehr hat.
|
||||
// Neu laden führt in die Anmeldung — dorthin, wo man jetzt hingehört.
|
||||
// Neu laden führt in die Anmeldung - dorthin, wo man jetzt hingehört.
|
||||
const entzogen: EventListener = () => {
|
||||
quelle.close()
|
||||
window.location.reload()
|
||||
|
||||
@@ -6,7 +6,7 @@ import { useSectionsForm } from './SectionsForm'
|
||||
import type { SaveSection } from './types'
|
||||
|
||||
type Props = {
|
||||
/** Wohin gespeichert wird — gebundene Server Action der Akte oder des Dokuments. */
|
||||
/** Wohin gespeichert wird - gebundene Server Action der Akte oder des Dokuments. */
|
||||
save: SaveSection
|
||||
/** Eindeutig je Besitzer, damit Entwürfe zweier Akten sich nicht mischen. */
|
||||
scope: string
|
||||
@@ -25,7 +25,7 @@ const AUTOSAVE_MS = 2000
|
||||
|
||||
/**
|
||||
* Ein Abschnitt zum Bearbeiten. Trägt einen Fallabschnitt genauso wie ein
|
||||
* Feld eines Dokuments — wohin gespeichert wird, kommt von außen.
|
||||
* Feld eines Dokuments - wohin gespeichert wird, kommt von außen.
|
||||
*
|
||||
* Entwürfe werden alle zwei Sekunden **lokal** gesichert, damit ein
|
||||
* versehentlicher Tab-Wechsel keinen Text kostet. Gespeichert wird erst auf
|
||||
@@ -153,7 +153,7 @@ export function SectionEditor(props: Props) {
|
||||
if (props.readOnly) {
|
||||
return (
|
||||
<p className="mt-1 max-w-(--container-measure) text-sm whitespace-pre-wrap">
|
||||
{String(value || '—')}
|
||||
{String(value || '-')}
|
||||
</p>
|
||||
)
|
||||
}
|
||||
@@ -166,7 +166,7 @@ export function SectionEditor(props: Props) {
|
||||
onChange={(event) => change(event.target.value)}
|
||||
className="field"
|
||||
>
|
||||
<option value="">—</option>
|
||||
<option value="">-</option>
|
||||
{props.options?.map((option) => (
|
||||
<option key={option} value={option}>
|
||||
{option}
|
||||
|
||||
@@ -11,12 +11,12 @@ import type { RenderedSection } from '@/lib/sections/render'
|
||||
* Ausgefüllte Vorlage: der Sachstand einer Fallakte oder der Inhalt eines
|
||||
* Dokuments. Beide sind dasselbe Gebilde, deshalb dieselbe Darstellung.
|
||||
*
|
||||
* Feste Textbausteine der Vorlage werden gerendert, nicht bearbeitet — ihre
|
||||
* Feste Textbausteine der Vorlage werden gerendert, nicht bearbeitet - ihre
|
||||
* Platzhalter ziehen die Werte der Eingabefelder. Damit trägt dieselbe
|
||||
* Darstellung ein Formular und einen Vertragstext.
|
||||
*
|
||||
* Gespeichert wird das Blatt als Ganzes: ein Knopf unten, nicht einer je Feld.
|
||||
* Lichtbilder sind die Ausnahme — ein Bild wird hochgeladen und geprüft, das
|
||||
* Lichtbilder sind die Ausnahme - ein Bild wird hochgeladen und geprüft, das
|
||||
* ist ein eigener Vorgang und keine Feldänderung.
|
||||
*/
|
||||
export function Sections({
|
||||
@@ -73,7 +73,7 @@ export function Sections({
|
||||
}
|
||||
|
||||
if (field.type === 'photo') {
|
||||
// Ohne Dokument gibt es kein Ziel für den Upload — Fallabschnitte
|
||||
// Ohne Dokument gibt es kein Ziel für den Upload - Fallabschnitte
|
||||
// tragen keine Bilder, ihre Dateien hängen an der Akte.
|
||||
if (!documentNumber) {
|
||||
return (
|
||||
|
||||
@@ -46,7 +46,7 @@ export function SectionsForm({
|
||||
children,
|
||||
}: {
|
||||
save: SaveSections
|
||||
/** „Dokument speichern" oder „Abschnitte speichern" — je nachdem, was es ist. */
|
||||
/** „Dokument speichern" oder „Abschnitte speichern" - je nachdem, was es ist. */
|
||||
label: string
|
||||
children: ReactNode
|
||||
}) {
|
||||
|
||||
@@ -24,7 +24,7 @@ export type SaveSection = (input: {
|
||||
*
|
||||
* Zurück kommt ein Ergebnis **je Feld**, nicht eines für alles. Abschnitte
|
||||
* sind einzeln versioniert, und wenn ein Feld zwischenzeitlich von jemand
|
||||
* anderem geändert wurde, soll das nicht die übrigen elf aufhalten — es soll
|
||||
* anderem geändert wurde, soll das nicht die übrigen elf aufhalten - es soll
|
||||
* genau an diesem Feld stehen.
|
||||
*/
|
||||
export type SaveSectionsInput = {
|
||||
|
||||
Reference in New Issue
Block a user