import React, { useState, useEffect } from 'react'; import { Plus, UserCheck, RefreshCw, Trash2, Edit3, CheckCircle, Clock, CalendarDays, MoveHorizontal } from 'lucide-react'; import { ScheduleItem } from '../types'; import { SupabaseService } from '../services/supabaseService'; import { ScheduleItemModal } from '../components/ScheduleItemModal'; import { DispatchingInteractiveView } from './DispatchingInteractiveView'; export const DispatchingView: React.FC = () => { const [scheduleData, setScheduleData] = useState([]); const [loading, setLoading] = useState(true); const [isModalOpen, setIsModalOpen] = useState(false); const [editingItem, setEditingItem] = useState(null); const [toastMessage, setToastMessage] = useState(null); // View Mode Switcher: 'list' (Standard Tabelle) vs 'interactive' (Drag & Drop Timeline) const [viewMode, setViewMode] = useState<'list' | 'interactive'>('interactive'); const showNotification = (msg: string) => { setToastMessage(msg); setTimeout(() => setToastMessage(null), 4000); }; const loadData = async () => { setLoading(true); try { const items = await SupabaseService.getScheduleItems(); setScheduleData(items); } catch (err) { console.error('Fehler beim Laden des Tagesplans:', err); } finally { setLoading(false); } }; useEffect(() => { loadData(); }, []); const handleSaveItem = async (data: Omit | ScheduleItem) => { if ('id' in data) { const updated = await SupabaseService.updateScheduleItem(data.id, data); showNotification(`Einsatz "${updated.title}" aktualisiert.`); } else { const created = await SupabaseService.createScheduleItem(data); showNotification(`Neuer Einsatz "${created.title}" in Supabase eingeplant.`); } await loadData(); }; const handleStatusToggle = async (item: ScheduleItem) => { let nextStatus: 'Geplant' | 'In Bearbeitung' | 'Abgeschlossen' = 'In Bearbeitung'; if (item.status === 'In Bearbeitung') nextStatus = 'Abgeschlossen'; else if (item.status === 'Abgeschlossen') nextStatus = 'Geplant'; await SupabaseService.updateScheduleItem(item.id, { status: nextStatus }); showNotification(`Status von "${item.title}" geändert auf ${nextStatus}.`); await loadData(); }; const handleDeleteItem = async (item: ScheduleItem) => { if (window.confirm(`Einsatz "${item.title}" aus dem Tagesplan löschen?`)) { await SupabaseService.deleteScheduleItem(item.id); showNotification(`Einsatz "${item.title}" gelöscht.`); await loadData(); } }; return ( <> {/* Toast Notification */} {toastMessage && (
{toastMessage}
)} {/* Header Bar */}

Dispatching & Auftragsdisposition

Interaktives Timeline-Board mit Drag & Drop und Zeitraster (06:00 - 20:00 Uhr)

{/* View Switcher Tabs */}
{/* Content Rendering based on selected view mode */} {viewMode === 'interactive' ? ( ) : (

Tagesdisposition ({scheduleData.length} Einsätze)

Supabase Sync aktiv
{scheduleData.map((item) => ( ))} {scheduleData.length === 0 && ( )}
Uhrzeit Monteur Kunde & Adresse Aufgabe / Tätigkeit Status Aktionen
{item.startTime} - {item.endTime}
{item.technicianName || 'Monteur'}
{item.customerName}
{item.address &&
{item.address}
}
{item.title}
{item.taskDescription &&
{item.taskDescription}
}
Keine Einsätze für heute vorhanden.
)} setIsModalOpen(false)} onSave={handleSaveItem} initialItem={editingItem} /> ); };