Files
votianng/frontend/src/AppointmentCustomerNavigation.tsx
T
Sven 781a2b82dc Erweitere VoTiAn NG um Fachfunktionen und verbessere die Listenoberfläche
Ergänze Auftragsbearbeitung, Disposition, Stammdaten, Kunden- und
Transporteurportale, Lagerverwaltung, Abrechnung, Exporte und Statistik.
Füge Kontoeinstellungen, Mitteilungen, Automatikdienste und Betriebsstatus
sowie die zugehörigen Tests und PHP-Abgleichsdokumentation hinzu.

Vergrößere die persönlichen Auftragslisten auf einheitliche Höhen und
richte Statusanzeigen sowie die Ranking-Vorschau-Steuerelemente bündig aus.

Validierung: 44 Frontendtests und Produktionsbuild erfolgreich.
Backend funktional unverändert gegenüber dem vollständigen Lauf mit 1.624
erfolgreichen und drei übersprungenen Tests. Layout im Browser und lokale
Bereitstellung geprüft.
2026-10-20 11:19:43 +02:00

17 lines
1.9 KiB
TypeScript

import {useEffect,useState} from 'react';
import {request} from './api';
import {Modal} from './FormElements';
import {MasterDataEditor} from './BusinessForms';
import {Statistics} from './Statistics';
type Context={id:number;number:string;label:string;headquartersId:number;canOpenMaster:boolean;canStatistics:boolean;masterUnavailableReason:string};
export function AppointmentCustomerNavigation({customer,kind,onClose,onDirtyChange}:{customer:number;kind:'master'|'statistics';onClose:()=>void;onDirtyChange:(dirty:boolean)=>void}){
const [data,setData]=useState<Context|null>(null),[error,setError]=useState('');
useEffect(()=>{if(customer===0)return;let active=true;request<Context>(`/appointments/customers/${customer}/context`).then(d=>{if(active)setData(d);}).catch(e=>{if(active)setError(e.message);});return()=>{active=false;};},[customer]);
// The existing master editor owns save/uncertain-response and discard handling.
// Keep the outer calendar/workspace from unmounting an open editor silently.
const editing=kind==='master'&&(customer===0||!!data?.canOpenMaster);
useEffect(()=>{onDirtyChange(editing);return()=>onDirtyChange(false);},[editing,onDirtyChange]);
if(editing)return <MasterDataEditor kind="customers" id={customer} onClose={onClose} onSaved={()=>{}}/>;
return <Modal title={kind==='statistics'?'Kundenstatistik im Vertrieb':'Kundenstamm im Vertrieb'} wide onClose={onClose}><div className="admin-dialog-body">{error?<p role="alert" className="alert error">{error}</p>:!data?<p role="status">Kunde wird geladen …</p>:kind==='master'?<p>{data.masterUnavailableReason}</p>:!data.canStatistics?<p>Für diese Ansicht ist das Statistikrecht erforderlich.</p>:!data.number?<p>Beim Kunden fehlt die Kundennummer für die Statistik.</p>:<Statistics initialCustomer={{number:data.number,label:data.label,headquartersId:data.headquartersId,from:'2004-01-01'}}/>}</div></Modal>;
}