fix: update class teacher assignment and enhance UI for teacher selection
All checks were successful
Build & Push / Build & Push image (push) Successful in 40s

This commit is contained in:
2026-03-05 23:41:05 +01:00
parent 4bfa3cd486
commit 653cc6cd74
2 changed files with 13 additions and 3 deletions

View File

@@ -475,7 +475,7 @@ def set_class_teachers(class_id):
User.school_id == current_user.school_id, User.school_id == current_user.school_id,
User.is_active == True, User.is_active == True,
).all() ).all()
klas.users = teachers klas.teachers = teachers
audit_log('class.user_assignment', 'class', target_id=str(class_id), audit_log('class.user_assignment', 'class', target_id=str(class_id),
detail={'class_name': klas.name, 'teacher_ids': user_ids, detail={'class_name': klas.name, 'teacher_ids': user_ids,
'teacher_names': [t.full_name for t in teachers]}) 'teacher_names': [t.full_name for t in teachers]})

View File

@@ -114,6 +114,11 @@
.btn-secondary { background:#334155!important;color:#e2e8f0!important; } .btn-secondary { background:#334155!important;color:#e2e8f0!important; }
.diff-row-same { background:#064e3b!important; } .diff-row-same { background:#064e3b!important; }
.diff-row-differ { background:#451a03!important; } .diff-row-differ { background:#451a03!important; }
#koppelingModal > div { background:#1e293b!important;color:#e2e8f0!important; }
#koppelingCheckboxes label { color:#e2e8f0!important; }
#koppelingCheckboxes label:hover { background:#263548!important; }
#koppelingCheckboxes span { color:#94a3b8!important; }
#koppelingCheckboxes input[type=checkbox] { accent-color:var(--primary); }
} }
</style> </style>
</head> </head>
@@ -456,6 +461,8 @@ function renderKlasProgress() {
const klassen = overviewData.classes || []; const klassen = overviewData.classes || [];
const byClass = overviewData.assessments_by_class || {}; const byClass = overviewData.assessments_by_class || {};
if (!klassen.length) { el.innerHTML = '<div class="empty">Geen klassen</div>'; return; } if (!klassen.length) { el.innerHTML = '<div class="empty">Geen klassen</div>'; return; }
// Filter op leerkrachten (niet directeurs/ICT)
const teacherUsers = allUsers.filter(u => u.role === 'teacher' || u.role === 'director');
el.innerHTML = '<div class="vak-grid">' + klassen.map(k => { el.innerHTML = '<div class="vak-grid">' + klassen.map(k => {
const vakken = byClass[k.id] || {}; const vakken = byClass[k.id] || {};
let g=0,o=0,r=0; let g=0,o=0,r=0;
@@ -728,6 +735,8 @@ async function renderKoppelingTab() {
if (res.ok) { const d = await res.json(); allUsers = d.users || []; } if (res.ok) { const d = await res.json(); allUsers = d.users || []; }
} catch(e) { console.warn('Kon gebruikers niet laden'); } } catch(e) { console.warn('Kon gebruikers niet laden'); }
// Filter op leerkrachten (niet directeurs/ICT)
const teacherUsers = allUsers.filter(u => u.role === 'teacher' || u.role === 'director');
el.innerHTML = '<div class="vak-grid">' + klassen.map(k => { el.innerHTML = '<div class="vak-grid">' + klassen.map(k => {
const teachers = (k.teachers||[]).map(t => t.full_name).join(', ') || '<em style="color:var(--gray-400)">Geen leerkrachten</em>'; const teachers = (k.teachers||[]).map(t => t.full_name).join(', ') || '<em style="color:var(--gray-400)">Geen leerkrachten</em>';
return `<div class="vak-card" style="cursor:pointer;" data-action="openKoppeling" data-id="${k.id}" data-name="${k.name.replace(/"/g,'&quot;')}" data-teachers="${JSON.stringify((k.teachers||[]).map(t=>t.id)).replace(/"/g,'&quot;')}"> return `<div class="vak-card" style="cursor:pointer;" data-action="openKoppeling" data-id="${k.id}" data-name="${k.name.replace(/"/g,'&quot;')}" data-teachers="${JSON.stringify((k.teachers||[]).map(t=>t.id)).replace(/"/g,'&quot;')}">
@@ -750,10 +759,11 @@ document.addEventListener('click', function(e) {
document.getElementById('koppelingModalTitle').textContent = `Leerkrachten voor ${name}`; document.getElementById('koppelingModalTitle').textContent = `Leerkrachten voor ${name}`;
const container = document.getElementById('koppelingCheckboxes'); const container = document.getElementById('koppelingCheckboxes');
if (!allUsers.length) { const teacherUsers = allUsers.filter(u => u.role === 'teacher' || u.role === 'director');
if (!teacherUsers.length) {
container.innerHTML = '<em style="color:var(--gray-400)">Geen leerkrachten beschikbaar. Voeg eerst leerkrachten toe via Gebruikersbeheer.</em>'; container.innerHTML = '<em style="color:var(--gray-400)">Geen leerkrachten beschikbaar. Voeg eerst leerkrachten toe via Gebruikersbeheer.</em>';
} else { } else {
container.innerHTML = allUsers.map(u => ` container.innerHTML = teacherUsers.map(u => `
<label style="display:flex;align-items:center;gap:.5rem;cursor:pointer;padding:.35rem;border-radius:4px;"> <label style="display:flex;align-items:center;gap:.5rem;cursor:pointer;padding:.35rem;border-radius:4px;">
<input type="checkbox" value="${u.id}" ${teachers.includes(u.id)?'checked':''}> <input type="checkbox" value="${u.id}" ${teachers.includes(u.id)?'checked':''}>
<span>${u.full_name} <span style="color:var(--gray-400);font-size:.8rem;">(${u.email})</span></span> <span>${u.full_name} <span style="color:var(--gray-400);font-size:.8rem;">(${u.email})</span></span>