Die Kachel verwies auf eine Adresse, die die Liste nicht lesen konnte
Die neue Kachel "Aktives Dienstverhaeltnis" verlinkte auf
?status=Aktiv&status=Karenz. Die Mitarbeiterliste liest den Parameter aber
als *eine* Zeichenkette und trennt selbst an Kommas — zweimal uebergeben
macht Next daraus ein Array, und `.split(",")` lief dagegen. Sichtbar war
nur "Diese Ansicht konnte nicht geladen werden".
Die Kachel schreibt jetzt status=Aktiv,Karenz. Dazu glaettet die Seite alle
ihre Parameter: eine Adresse kommt nicht nur aus der eigenen Anwendung, sie
steht in Lesezeichen und in E-Mails, und ?q=a&q=b haette sie genauso
gefaellt.
Zwei Anmerkungen von Max:
* Die Reihenfolge der Wochentage wurde beim Speichern mitgenommen — "Mo,
Di" und "Di, Mo" waren zwei Werte fuer dieselbe Aussage. Da
change_employee_data die Arbeitstage als zusammengefuegte Zeichenkette
vergleicht, erzeugte jedes Nachsehen und Wiederherstellen eine
Vertragsaenderung in der Akte und einen Protokolleintrag — ueber nichts.
Jetzt sortiert gespeichert (lib/wochentage.ts, an einer Stelle statt in
vier Kopien), auch im Massenimport. Der Bestand richtet sich beim
naechsten Speichern von selbst.
* "Beguenstigt behindert" steht jetzt als eingerueckter Unterpunkt des
Kuendigungsschutzes statt als eigener Block daneben. In der Datenbank
bleiben es getrennte Felder, und das mit Absicht: eine Kopplung liesse
jede Korrektur am Personenkreis scheitern, solange der Grad noch
dransteht.
This commit is contained in:
@@ -7,9 +7,9 @@ import {
|
||||
KUENDIGUNGSSCHUTZ_GRUENDE,
|
||||
} from "@/lib/kuendigungsschutz";
|
||||
import { MITARBEITERARTEN } from "@/lib/mitarbeiterart";
|
||||
import { sortiereWochentage, WOCHENTAGE } from "@/lib/wochentage";
|
||||
import type { CollectiveAgreement, DienstwagenArt, Mitarbeiterart, Weekday, WorkerType } from "@/lib/types";
|
||||
|
||||
const WEEKDAYS: Weekday[] = ["Mo", "Di", "Mi", "Do", "Fr", "Sa", "So"];
|
||||
|
||||
export type RoleEmploymentValue = {
|
||||
workerType: WorkerType;
|
||||
@@ -67,9 +67,21 @@ export type RoleEmploymentValue = {
|
||||
// the same set of employees columns, just against different local state.
|
||||
export function RoleEmploymentFields({ value, onChange }: { value: RoleEmploymentValue; onChange: (patch: Partial<RoleEmploymentValue>) => void }) {
|
||||
function toggleWorkDay(day: Weekday) {
|
||||
onChange({ workDays: value.workDays.includes(day) ? value.workDays.filter((d) => d !== day) : [...value.workDays, day] });
|
||||
// Sortiert und nicht angehängt: sonst hinge die gespeicherte Reihenfolge
|
||||
// davon ab, in welcher die Knöpfe angeklickt wurden. „Mo, Di" und „Di,
|
||||
// Mo" waren damit zwei Werte für dieselbe Aussage, und wer die Tage nur
|
||||
// nachsah und wieder herstellte, erzeugte eine Vertragsänderung in der
|
||||
// Akte über nichts. Siehe lib/wochentage.ts.
|
||||
const neu = value.workDays.includes(day) ? value.workDays.filter((d) => d !== day) : [...value.workDays, day];
|
||||
onChange({ workDays: sortiereWochentage(neu) });
|
||||
}
|
||||
|
||||
// Der Personenkreis zieht das Kennzeichen mit: wer „Begünstigte behinderte
|
||||
// ArbeitnehmerInnen" als Grund wählt, hat die Frage damit schon beantwortet.
|
||||
// Eine Hilfe der Oberfläche, keine Bedingung der Datenbank — abwählen lässt
|
||||
// es sich weiterhin.
|
||||
const istBehindert = value.istBeguenstigtBehindert || value.kuendigungsschutzGrund === GRUND_BEGUENSTIGT_BEHINDERT;
|
||||
|
||||
return (
|
||||
<div className="flex flex-col gap-3">
|
||||
<div className="grid grid-cols-1 gap-3 sm:grid-cols-2">
|
||||
@@ -116,7 +128,7 @@ export function RoleEmploymentFields({ value, onChange }: { value: RoleEmploymen
|
||||
<fieldset>
|
||||
<legend className="mb-1 block text-xs font-semibold text-ink-muted">Arbeitstage</legend>
|
||||
<div className="flex flex-wrap gap-1.5">
|
||||
{WEEKDAYS.map((day) => (
|
||||
{WOCHENTAGE.map((day) => (
|
||||
<button
|
||||
key={day}
|
||||
type="button"
|
||||
@@ -204,50 +216,56 @@ export function RoleEmploymentFields({ value, onChange }: { value: RoleEmploymen
|
||||
onChange={(v) => onChange({ kuendigungsschutzBis: v })}
|
||||
hint="Optional. Leer lassen, solange das Ende nicht feststeht."
|
||||
/>
|
||||
</>
|
||||
)}
|
||||
</div>
|
||||
|
||||
{/* ── Begünstigte Behinderung ──────────────────────────────────
|
||||
Eigener Block und nicht innerhalb des Kündigungsschutzes: die
|
||||
Begünstigung besteht für sich, auch wenn niemand sie als Schutz
|
||||
führt. Der Haken setzt sich mit, wenn der Personenkreis gewählt
|
||||
wird — das ist eine Hilfe der Oberfläche, keine Bedingung der
|
||||
Datenbank, und er lässt sich danach wieder abwählen. */}
|
||||
<div className="grid grid-cols-1 items-end gap-3 sm:grid-cols-2">
|
||||
<label className="flex items-center gap-2 text-sm text-ink">
|
||||
<input
|
||||
type="checkbox"
|
||||
checked={value.istBeguenstigtBehindert || value.kuendigungsschutzGrund === GRUND_BEGUENSTIGT_BEHINDERT}
|
||||
onChange={(e) => onChange({ istBeguenstigtBehindert: e.target.checked })}
|
||||
/>
|
||||
Begünstigt behindert
|
||||
</label>
|
||||
{(value.istBeguenstigtBehindert || value.kuendigungsschutzGrund === GRUND_BEGUENSTIGT_BEHINDERT) && (
|
||||
<>
|
||||
<TextField
|
||||
label="Grad der Behinderung"
|
||||
dense
|
||||
type="number"
|
||||
value={value.behinderungGrad}
|
||||
onChange={(v) => onChange({ behinderungGrad: v })}
|
||||
hint={`In Prozent laut Bescheid. Die Begünstigung beginnt bei ${BEGUENSTIGUNG_AB_GRAD}%.`}
|
||||
/>
|
||||
<TextField
|
||||
label="Bescheid ab"
|
||||
dense
|
||||
type="date"
|
||||
value={value.behinderungAb}
|
||||
onChange={(v) => onChange({ behinderungAb: v })}
|
||||
/>
|
||||
<TextField
|
||||
label="Bescheid bis"
|
||||
dense
|
||||
type="date"
|
||||
value={value.behinderungBis}
|
||||
onChange={(v) => onChange({ behinderungBis: v })}
|
||||
hint="Leer heisst unbefristet."
|
||||
/>
|
||||
{/* ── Begünstigte Behinderung ────────────────────────────
|
||||
Als Unterpunkt des Kündigungsschutzes und eingerückt — sie ist
|
||||
einer der zwölf Personenkreise und stand vorher als eigener
|
||||
Block daneben, was sie wie ein zweites, unabhängiges Thema
|
||||
aussehen liess.
|
||||
*
|
||||
In der Datenbank bleibt sie trotzdem ein eigenes Kennzeichen
|
||||
mit eigenen Feldern, und das mit Absicht: eine Bedingung
|
||||
„Grad nur bei diesem Personenkreis" liesse jede Korrektur am
|
||||
Personenkreis scheitern, solange der Grad noch dransteht —
|
||||
also genau beim Geradebiegen eines Fehlers. Was hier
|
||||
zusammengehört, muss dort nicht aneinandergekettet sein. */}
|
||||
<div className="ml-1 flex flex-col gap-2 border-l-2 border-border-subtle pl-3">
|
||||
<label className="flex items-center gap-2 text-sm text-ink-body">
|
||||
<input
|
||||
type="checkbox"
|
||||
checked={istBehindert}
|
||||
onChange={(e) => onChange({ istBeguenstigtBehindert: e.target.checked })}
|
||||
/>
|
||||
Begünstigt behindert
|
||||
</label>
|
||||
{istBehindert && (
|
||||
<div className="grid grid-cols-1 gap-3 sm:grid-cols-2">
|
||||
<TextField
|
||||
label="Grad der Behinderung"
|
||||
dense
|
||||
type="number"
|
||||
value={value.behinderungGrad}
|
||||
onChange={(v) => onChange({ behinderungGrad: v })}
|
||||
hint={`In Prozent laut Bescheid. Die Begünstigung beginnt bei ${BEGUENSTIGUNG_AB_GRAD}%.`}
|
||||
/>
|
||||
<TextField
|
||||
label="Bescheid ab"
|
||||
dense
|
||||
type="date"
|
||||
value={value.behinderungAb}
|
||||
onChange={(v) => onChange({ behinderungAb: v })}
|
||||
/>
|
||||
<TextField
|
||||
label="Bescheid bis"
|
||||
dense
|
||||
type="date"
|
||||
value={value.behinderungBis}
|
||||
onChange={(v) => onChange({ behinderungBis: v })}
|
||||
hint="Leer heisst unbefristet."
|
||||
/>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
</>
|
||||
)}
|
||||
</div>
|
||||
|
||||
Reference in New Issue
Block a user