feat: Quickstart, Benutzerverwaltung und Orion-Ergebnisbox

This commit is contained in:
Schubert Ferenc 2026-07-12 12:19:54 +02:00
parent 4f669a3426
commit e9e46f2cb4
404 changed files with 1032 additions and 600 deletions

View file

@ -9,6 +9,7 @@ import { z } from "zod";
import { ActionButton, ActionState } from "@/components/action-button";
import { useAuth } from "@/components/auth";
import { API_BASE, apiGet, apiSend, Contact, Customer, Device, Equipment, Location, normalizeValidationPayload, Paginated, ValidationItem } from "@/lib/api";
import { getValidationResultPresentation, normalizeValidationResult, validationResultValues } from "@/lib/validation-result";
const triState = ["yes", "no", "na"] as const;
const today = new Date().toISOString().slice(0, 10);
@ -86,7 +87,7 @@ function defaults(reportNumber = ""): FormValues {
examiner_name: "",
participants: "",
status: "ENTWURF",
result: "offen",
result: "OFFEN",
customer_id: "",
location_id: "",
contact_id: "",
@ -180,6 +181,7 @@ export function ValidationEditor({ validationId }: { validationId?: string }) {
const watched = useWatch({ control: form.control });
const selectedDevice = devices.data?.items.find((item) => item.id === form.watch("device_id"));
const selectedEquipment = equipment.data?.items.filter((item) => form.watch("equipment_ids").includes(item.id)) ?? [];
const selectedResult = getValidationResultPresentation(form.watch("result"));
const recommendations = useFieldArray({ control: form.control, name: "recommendations" });
const attachments = useFieldArray({ control: form.control, name: "attachments" });
@ -195,7 +197,7 @@ export function ValidationEditor({ validationId }: { validationId?: string }) {
form.reset({
...defaults(),
...data,
result: data.result ?? "offen",
result: normalizeValidationResult(data.result),
project: data.project ?? "",
test_location: data.test_location ?? "",
examiner_name: data.examiner_name ?? "",
@ -405,7 +407,7 @@ export function ValidationEditor({ validationId }: { validationId?: string }) {
<Field label="Pruefer *"><input className={inputClass} {...form.register("examiner_name")} /></Field>
<Field label="Mitwirkende Personen"><textarea className={areaClass} {...form.register("participants")} /></Field>
<Field label="Status"><select className={selectClass} {...form.register("status")}><option value="ENTWURF">Entwurf</option><option value="BEREIT_ZUR_PRUEFUNG">Bereit zur Pruefung</option><option value="IN_PRUEFUNG">In Pruefung</option><option value="FREIGEGEBEN">Freigegeben</option><option value="ABGESCHLOSSEN">Abgeschlossen</option><option value="STORNIERT">Storniert</option></select></Field>
<Field label="Gesamtergebnis"><select className={selectClass} {...form.register("result")}><option value="offen">Offen</option><option value="bestanden">Bestanden</option><option value="nicht_bestanden">Nicht bestanden</option><option value="mit_auflagen">Mit Auflagen</option></select></Field>
<Field label="Gesamtergebnis"><select className={selectClass} {...form.register("result")}>{validationResultValues.map((value) => <option key={value} value={value}>{getValidationResultPresentation(value).label}</option>)}</select><div className={`mt-3 flex min-h-12 items-center justify-center rounded-lg border px-4 text-sm font-semibold ${selectedResult.previewClass}`}>{selectedResult.label}</div></Field>
</div>
</Accordion>