@@ -10,6 +10,7 @@ export default function ScheduleMaker({ token, user }) {
|
||||
const [busLines, setBusLines] = useState([])
|
||||
const [buses, setBuses] = useState([])
|
||||
const [drivers, setDrivers] = useState([])
|
||||
const [selectedDriverFilter, setSelectedDriverFilter] = useState('')
|
||||
const [message, setMessage] = useState(null)
|
||||
const [isAdmin] = useState(Boolean(user?.userCode))
|
||||
const [deleteConfirm, setDeleteConfirm] = useState(null)
|
||||
@@ -137,9 +138,12 @@ export default function ScheduleMaker({ token, user }) {
|
||||
return date.toLocaleTimeString('nl-NL', { hour: '2-digit', minute: '2-digit' })
|
||||
}
|
||||
|
||||
// Group schedules by date and time
|
||||
// Group schedules by date and time (apply driver filter if selected)
|
||||
const timeSlots = generateTimeSlots()
|
||||
const schedulesBySlot = groupSchedulesByTimeSlot(schedules, timeSlots)
|
||||
const filteredSchedules = selectedDriverFilter
|
||||
? schedules.filter(s => String(s.driverId) === String(selectedDriverFilter))
|
||||
: schedules
|
||||
const schedulesBySlot = groupSchedulesByTimeSlot(filteredSchedules, timeSlots)
|
||||
|
||||
return (
|
||||
<section className="card">
|
||||
@@ -148,7 +152,19 @@ export default function ScheduleMaker({ token, user }) {
|
||||
<h2>Diensten Inplannen</h2>
|
||||
<p>Maak diensten aan met automatische eindtijd, vertrektijden per halte en herhaald rooster.</p>
|
||||
</div>
|
||||
<div style={{ display: 'flex', gap: '0.5rem', alignItems: 'center' }}>
|
||||
<button className="secondary" onClick={loadSchedules}>Refresh</button>
|
||||
<select
|
||||
value={selectedDriverFilter}
|
||||
onChange={e => setSelectedDriverFilter(e.target.value)}
|
||||
style={{ padding: '6px', borderRadius: '6px', border: '1px solid #ccc' }}
|
||||
>
|
||||
<option value="">Alle chauffeurs</option>
|
||||
{drivers.map(d => (
|
||||
<option key={d.id} value={d.id}>{d.name}</option>
|
||||
))}
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{isAdmin && (
|
||||
|
||||
@@ -1051,18 +1051,21 @@ app.get('/admin/drivers', authMiddleware, adminMiddleware, async (req, res) => {
|
||||
}
|
||||
|
||||
const result = await db.query(`
|
||||
SELECT id, name, email, phone
|
||||
SELECT id, firstname, lastname, email, phone, job, joined, status
|
||||
FROM workers.employees
|
||||
WHERE status = 'active'
|
||||
ORDER BY name ASC
|
||||
ORDER BY firstname, lastname ASC
|
||||
`);
|
||||
|
||||
res.json({
|
||||
drivers: result.rows.map(row => ({
|
||||
id: row.id,
|
||||
name: row.name,
|
||||
name: (String(row.firstname || '') + ' ' + String(row.lastname || '')).trim(),
|
||||
email: row.email,
|
||||
phone: row.phone,
|
||||
job: row.job,
|
||||
joined: row.joined,
|
||||
status: row.status,
|
||||
})),
|
||||
});
|
||||
} catch (err) {
|
||||
@@ -1099,7 +1102,7 @@ app.get('/admin/schedules', authMiddleware, adminMiddleware, async (req, res) =>
|
||||
bl.estimated_duration_minutes,
|
||||
b.name as bus_name,
|
||||
b.license_plate,
|
||||
e.name as driver_name
|
||||
TRIM(COALESCE(e.firstname, '') || ' ' || COALESCE(e.lastname, '')) as driver_name
|
||||
FROM transit.schedules s
|
||||
LEFT JOIN transit.bus_lines bl ON s.bus_line_id = bl.id
|
||||
LEFT JOIN fleet.bus b ON s.bus_id = b.id
|
||||
|
||||
Reference in New Issue
Block a user