@@ -10,6 +10,7 @@ export default function ScheduleMaker({ token, user }) {
|
|||||||
const [busLines, setBusLines] = useState([])
|
const [busLines, setBusLines] = useState([])
|
||||||
const [buses, setBuses] = useState([])
|
const [buses, setBuses] = useState([])
|
||||||
const [drivers, setDrivers] = useState([])
|
const [drivers, setDrivers] = useState([])
|
||||||
|
const [selectedDriverFilter, setSelectedDriverFilter] = useState('')
|
||||||
const [message, setMessage] = useState(null)
|
const [message, setMessage] = useState(null)
|
||||||
const [isAdmin] = useState(Boolean(user?.userCode))
|
const [isAdmin] = useState(Boolean(user?.userCode))
|
||||||
const [deleteConfirm, setDeleteConfirm] = useState(null)
|
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' })
|
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 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 (
|
return (
|
||||||
<section className="card">
|
<section className="card">
|
||||||
@@ -148,7 +152,19 @@ export default function ScheduleMaker({ token, user }) {
|
|||||||
<h2>Diensten Inplannen</h2>
|
<h2>Diensten Inplannen</h2>
|
||||||
<p>Maak diensten aan met automatische eindtijd, vertrektijden per halte en herhaald rooster.</p>
|
<p>Maak diensten aan met automatische eindtijd, vertrektijden per halte en herhaald rooster.</p>
|
||||||
</div>
|
</div>
|
||||||
<button className="secondary" onClick={loadSchedules}>Refresh</button>
|
<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>
|
</div>
|
||||||
|
|
||||||
{isAdmin && (
|
{isAdmin && (
|
||||||
|
|||||||
@@ -1051,18 +1051,21 @@ app.get('/admin/drivers', authMiddleware, adminMiddleware, async (req, res) => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const result = await db.query(`
|
const result = await db.query(`
|
||||||
SELECT id, name, email, phone
|
SELECT id, firstname, lastname, email, phone, job, joined, status
|
||||||
FROM workers.employees
|
FROM workers.employees
|
||||||
WHERE status = 'active'
|
WHERE status = 'active'
|
||||||
ORDER BY name ASC
|
ORDER BY firstname, lastname ASC
|
||||||
`);
|
`);
|
||||||
|
|
||||||
res.json({
|
res.json({
|
||||||
drivers: result.rows.map(row => ({
|
drivers: result.rows.map(row => ({
|
||||||
id: row.id,
|
id: row.id,
|
||||||
name: row.name,
|
name: (String(row.firstname || '') + ' ' + String(row.lastname || '')).trim(),
|
||||||
email: row.email,
|
email: row.email,
|
||||||
phone: row.phone,
|
phone: row.phone,
|
||||||
|
job: row.job,
|
||||||
|
joined: row.joined,
|
||||||
|
status: row.status,
|
||||||
})),
|
})),
|
||||||
});
|
});
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
@@ -1099,7 +1102,7 @@ app.get('/admin/schedules', authMiddleware, adminMiddleware, async (req, res) =>
|
|||||||
bl.estimated_duration_minutes,
|
bl.estimated_duration_minutes,
|
||||||
b.name as bus_name,
|
b.name as bus_name,
|
||||||
b.license_plate,
|
b.license_plate,
|
||||||
e.name as driver_name
|
TRIM(COALESCE(e.firstname, '') || ' ' || COALESCE(e.lastname, '')) as driver_name
|
||||||
FROM transit.schedules s
|
FROM transit.schedules s
|
||||||
LEFT JOIN transit.bus_lines bl ON s.bus_line_id = bl.id
|
LEFT JOIN transit.bus_lines bl ON s.bus_line_id = bl.id
|
||||||
LEFT JOIN fleet.bus b ON s.bus_id = b.id
|
LEFT JOIN fleet.bus b ON s.bus_id = b.id
|
||||||
|
|||||||
Reference in New Issue
Block a user