diff --git a/admin_ui/src/components/FixedScheduleEditor.jsx b/admin_ui/src/components/FixedScheduleEditor.jsx index 4325189..77d860d 100644 --- a/admin_ui/src/components/FixedScheduleEditor.jsx +++ b/admin_ui/src/components/FixedScheduleEditor.jsx @@ -167,6 +167,10 @@ const FixedScheduleEditor = ({ const [presetName, setPresetName] = useState('') const [savedPresets, setSavedPresets] = useState([]) const [deleteConfirm, setDeleteConfirm] = useState(null) + const [showDriverAssignment, setShowDriverAssignment] = useState(false) + const [driverAssignments, setDriverAssignments] = useState([]) + const [availableDrivers, setAvailableDrivers] = useState([]) + const [pendingBatchData, setPendingBatchData] = useState(null) const isAdmin = Boolean(user?.userCode) @@ -203,6 +207,23 @@ const FixedScheduleEditor = ({ } }, [user]) + // Load available drivers when driver assignment dialog opens + useEffect(() => { + if (!showDriverAssignment) return + + const loadDrivers = async () => { + try { + const res = await client.get('/admin/drivers') + setAvailableDrivers(res.data.drivers || []) + } catch (err) { + console.error('Error loading drivers:', err) + setAvailableDrivers([]) + } + } + + loadDrivers() + }, [showDriverAssignment]) + const persistPresets = (nextPresets) => { setSavedPresets(nextPresets) try { @@ -410,6 +431,37 @@ const FixedScheduleEditor = ({ } }) + // If no driver assigned, show driver assignment dialog + if (!driverId) { + setPendingBatchData({ + schedules, + times: uniqueTimes, + dayLabels: normalizedWeekdays.length > 0 ? getWeekdayLabel(normalizedWeekdays) : 'eenmalig', + busLineId: Number(selectedLine), + busId: Number(selectedBus), + weekdays: normalizedWeekdays, + }) + + // Check for conflicts + try { + const res = await client.post('/admin/check-driver-conflicts', { + generatedTimes: uniqueTimes.map(t => `${selectedDate}T${t}:00`), + drivers: drivers || [], + busLineId: Number(selectedLine), + busId: Number(selectedBus), + weekdays: normalizedWeekdays, + }) + setDriverAssignments(res.data.assignments || []) + setShowDriverAssignment(true) + return { skipped: true } + } catch (err) { + console.error('Error checking conflicts:', err) + // Still show dialog even if conflict check failed + setShowDriverAssignment(true) + return { skipped: true } + } + } + const payload = { schedules } const res = await client.post('/admin/schedules/bulk', payload) @@ -885,6 +937,141 @@ const FixedScheduleEditor = ({ )} + + {/* Driver Assignment Modal */} + {showDriverAssignment && ( +
Laden...
+ ) : ( + <> +