import { useState, useMemo } from 'react'; import { Autocomplete, Box, Container, MenuItem, Stack, TextField, Button, } from '@mui/material'; import { useNavigate } from 'react-router-dom'; import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'; import DashboardLayout from '../components/dashboard/DashboardLayout'; import { personalEquipmentApi } from '../services/personalEquipment'; import { ausruestungsanfrageApi } from '../services/ausruestungsanfrage'; import { membersService } from '../services/members'; import { usePermissionContext } from '../contexts/PermissionContext'; import { useNotification } from '../contexts/NotificationContext'; import { PageHeader } from '../components/templates'; import { ZUSTAND_LABELS } from '../types/personalEquipment.types'; import type { PersoenlicheAusruestungZustand, CreatePersoenlicheAusruestungPayload, } from '../types/personalEquipment.types'; import type { AusruestungArtikel } from '../types/ausruestungsanfrage.types'; const ZUSTAND_OPTIONS = Object.entries(ZUSTAND_LABELS) as [PersoenlicheAusruestungZustand, string][]; export default function PersoenlicheAusruestungNeu() { const navigate = useNavigate(); const queryClient = useQueryClient(); const { hasPermission } = usePermissionContext(); const { showSuccess, showError } = useNotification(); const canViewAll = hasPermission('persoenliche_ausruestung:view_all'); const [formArtikel, setFormArtikel] = useState(null); const [formUserId, setFormUserId] = useState<{ id: string; name: string } | null>(null); const [formBenutzerName, setFormBenutzerName] = useState(''); const [formZustand, setFormZustand] = useState('gut'); const [formNotizen, setFormNotizen] = useState(''); const [eigenschaftValues, setEigenschaftValues] = useState>({}); const { data: catalogItems } = useQuery({ queryKey: ['ausruestungsanfrage-items-catalog'], queryFn: () => ausruestungsanfrageApi.getItems(), staleTime: 10 * 60 * 1000, }); const { data: artikelEigenschaften = [] } = useQuery({ queryKey: ['ausruestungsanfrage', 'eigenschaften', formArtikel?.id], queryFn: () => ausruestungsanfrageApi.getArtikelEigenschaften(formArtikel!.id), enabled: !!formArtikel?.id, staleTime: 5 * 60 * 1000, }); const { data: membersList } = useQuery({ queryKey: ['members-list-compact'], queryFn: () => membersService.getMembers({ pageSize: 500 }), staleTime: 5 * 60 * 1000, enabled: canViewAll, }); const memberOptions = useMemo(() => { return (membersList?.items ?? []).map((m) => ({ id: m.id, name: [m.given_name, m.family_name].filter(Boolean).join(' ') || m.email, })); }, [membersList]); const createMutation = useMutation({ mutationFn: (data: CreatePersoenlicheAusruestungPayload) => personalEquipmentApi.create(data), onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['persoenliche-ausruestung'] }); showSuccess('Persönliche Ausrüstung erstellt'); navigate('/persoenliche-ausruestung'); }, onError: () => { showError('Fehler beim Erstellen'); }, }); const handleCreate = () => { const bezeichnung = formArtikel?.bezeichnung ?? ''; if (!bezeichnung.trim()) return; const payload: CreatePersoenlicheAusruestungPayload = { bezeichnung: bezeichnung.trim(), artikel_id: formArtikel?.id, user_id: formUserId?.id || undefined, benutzer_name: formBenutzerName || undefined, zustand: formZustand, notizen: formNotizen || undefined, eigenschaften: Object.entries(eigenschaftValues) .filter(([, v]) => v.trim()) .map(([id, wert]) => ({ eigenschaft_id: Number(id), name: artikelEigenschaften.find(e => e.id === Number(id))?.name ?? '', wert, })), }; createMutation.mutate(payload); }; return ( o.bezeichnung} value={formArtikel} onChange={(_e, v) => { setFormArtikel(v); setEigenschaftValues({}); }} renderInput={(params) => ( )} size="small" /> {artikelEigenschaften.map(e => e.typ === 'options' && e.optionen?.length ? ( setEigenschaftValues(prev => ({ ...prev, [e.id]: ev.target.value }))} > {e.optionen.map(opt => {opt})} ) : ( setEigenschaftValues(prev => ({ ...prev, [e.id]: ev.target.value }))} /> ) )} {canViewAll && ( o.name} value={formUserId} onChange={(_e, v) => setFormUserId(v)} renderInput={(params) => ( )} size="small" /> )} {!canViewAll && ( setFormBenutzerName(e.target.value)} /> )} setFormZustand(e.target.value as PersoenlicheAusruestungZustand)} > {ZUSTAND_OPTIONS.map(([key, label]) => ( {label} ))} setFormNotizen(e.target.value)} /> ); }