The checklist gets a print view: one A4 page, header carrying personnel number, name, date of extract, entry date and position, the items in two flowing columns so twenty-five fit, and two signature lines at the foot. It prints the *state*, dated — not a blank form. The default filename in the save dialog comes from the document title, which is set to the agreed convention: 20260818_2884_Aigner-Manuel_Onboarding-Checklist Surname first, like everywhere else in the application, so a folder of these sorts by person and within a person by date. Umlauts are resolved rather than stripped: the naive route (NFKD, then every non-ASCII to a dash) turns "Müller" into "Mu-ller", because decomposition splits the umlaut and the diaeresis becomes the dash. "Weiß" needs its own rule — it has no decomposition and would otherwise vanish. The reported defect: the printout carried the application's own top bar — hamburger, bell, "Neueinstellung", sign-out. Those are controls; on paper they are decoration, and on a checklist filed in a personnel record, misleading. The rule now sits on AppShell rather than on this one page, so the org-chart print view — which had the same problem — gets it too, along with anything printed later. The shell's padding goes with it: the type area is set by @page on the print page itself, and the shell's would have been added on top. The browser's own header line (date, title, URL) is separate — that is a checkbox in the print dialog, not something CSS can reach. 440 tests pass, including 13 new ones pinning the filename convention. Not yet seen in a browser. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
35 lines
1.2 KiB
TypeScript
35 lines
1.2 KiB
TypeScript
"use client";
|
|
|
|
import { setOnboardingTask, startOnboarding } from "@/actions/employees";
|
|
import { ONBOARDING_GRUPPEN } from "@/lib/onboarding";
|
|
import type { AufgabenStand } from "@/lib/checklist";
|
|
import { ChecklistPanel } from "./ChecklistPanel";
|
|
|
|
// Dünne Bindung: die Mechanik der Checkliste steht in ChecklistPanel, geteilt
|
|
// mit OffboardingTab. Hier steht nur, welches Verzeichnis gilt und welche
|
|
// Server-Aktionen es speichern.
|
|
|
|
export function OnboardingTab({
|
|
employeeId,
|
|
staende,
|
|
vorhanden,
|
|
}: {
|
|
employeeId: string;
|
|
staende: AufgabenStand[];
|
|
/** Ob überhaupt eine Liste existiert — sie entsteht mit dem Eintritt. */
|
|
vorhanden: boolean;
|
|
}) {
|
|
return (
|
|
<ChecklistPanel
|
|
gruppen={ONBOARDING_GRUPPEN}
|
|
staende={staende}
|
|
vorhanden={vorhanden}
|
|
leerText="Für diese Person gibt es keine Onboarding-Checkliste. Sie entsteht mit einer Einstellung oder Wiedereinstellung — wer davor eingetreten ist, hat keine."
|
|
anlegenLabel="Checkliste anlegen"
|
|
druckHref={`/employees/${employeeId}/checkliste?art=onboarding`}
|
|
onSpeichern={(itemKey, teil) => setOnboardingTask({ employee_id: employeeId, item_key: itemKey, ...teil })}
|
|
onAnlegen={() => startOnboarding(employeeId)}
|
|
/>
|
|
);
|
|
}
|