"use client"; import { useActionState, useState } from "react"; import { ArrowDown, ArrowUp, Plus, X } from "lucide-react"; import type { GeraeteTyp } from "@/generated/prisma/enums"; import { GERAETE_TYP_TEXT } from "@/lib/geraete-text"; import { schnellstartSpeichernAktion, type AktionsErgebnis } from "@/server/actions/schnellstart"; export type Eintrag = { readonly vorlageId: string; readonly name: string; readonly kategorie: string | null; readonly kundeName: string | null; }; /** * Schnellstart eines Geraetetyps pflegen (#022). * * Die Reihenfolge laeuft ueber Hoch und Runter, nicht ueber Drag & Drop. Der * Editor benutzt dnd-kit, weil dort hundert Schritte in Abschnitten liegen; hier * sind es zwei bis vier Kacheln, und zwei Knoepfe sind am Handy verlaesslicher * als eine Ziehgeste neben einer scrollenden Seite. * * Gespeichert wird die **ganze** Liste als ein Feld, eine Kennung je Zeile. So * gibt es eine Wahrheit ueber die Reihenfolge: die des Formulars. */ export function SchnellstartPflege({ typ, zugewiesen, auswahl, }: { typ: GeraeteTyp; zugewiesen: readonly Eintrag[]; auswahl: readonly Eintrag[]; }) { const [liste, setListe] = useState(zugewiesen); const [ergebnis, aktion, laeuft] = useActionState( schnellstartSpeichernAktion, {}, ); const offen = auswahl.filter( (eintrag) => !liste.some((gewaehlt) => gewaehlt.vorlageId === eintrag.vorlageId), ); function verschieben(stelle: number, richtung: -1 | 1) { const ziel = stelle + richtung; if (ziel < 0 || ziel >= liste.length) return; const kopie = [...liste]; const [heraus] = kopie.splice(stelle, 1); if (heraus) kopie.splice(ziel, 0, heraus); setListe(kopie); } const geaendert = liste.length !== zugewiesen.length || liste.some((eintrag, stelle) => eintrag.vorlageId !== zugewiesen[stelle]?.vorlageId); return (

{GERAETE_TYP_TEXT[typ]}

{liste.length === 0 ? (

Kein Schnellstart. Auf der Geräteseite erscheint dann nur „Vorlage zuweisen“.

) : (
    {liste.map((eintrag, stelle) => (
  1. {String(stelle + 1).padStart(2, "0")} {eintrag.name} {eintrag.kundeName ? ( nur {eintrag.kundeName} ) : null}
  2. ))}
)} {offen.length > 0 ? (
) : null}
eintrag.vorlageId).join("\n")} /> {geaendert ? nicht gespeichert : null}
{ergebnis.fehler ? (

{ergebnis.fehler}

) : null} {ergebnis.erfolg && !geaendert ? (

{ergebnis.erfolg}

) : null}
); }