Detect oversized must groups as conflicts

This commit is contained in:
Ian Gulliver
2026-02-15 21:35:23 -08:00
parent 3497842899
commit 5dd20ab6df

View File

@@ -173,6 +173,19 @@ async function loadStudents() {
} }
} }
const mustGroups = {};
for (const s of students) {
const root = ufFind(s.id);
if (!mustGroups[root]) mustGroups[root] = [];
mustGroups[root].push(s.name);
}
const oversizedGroups = [];
for (const members of Object.values(mustGroups)) {
if (members.length > trip.room_size) {
oversizedGroups.push(members);
}
}
const conflictsEl = document.getElementById('conflicts'); const conflictsEl = document.getElementById('conflicts');
const conflictsWasOpen = conflictsEl.querySelector('wa-details')?.open; const conflictsWasOpen = conflictsEl.querySelector('wa-details')?.open;
conflictsEl.innerHTML = ''; conflictsEl.innerHTML = '';
@@ -222,9 +235,10 @@ async function loadStudents() {
const hardConflictsEl = document.getElementById('hard-conflicts'); const hardConflictsEl = document.getElementById('hard-conflicts');
const hardConflictsWasOpen = hardConflictsEl.querySelector('wa-details')?.open; const hardConflictsWasOpen = hardConflictsEl.querySelector('wa-details')?.open;
hardConflictsEl.innerHTML = ''; hardConflictsEl.innerHTML = '';
if (hardConflictList.length > 0) { const totalConflicts = hardConflictList.length + oversizedGroups.length;
if (totalConflicts > 0) {
const det = document.createElement('wa-details'); const det = document.createElement('wa-details');
det.summary = '\u26a0 Conflicts (' + hardConflictList.length + ')'; det.summary = '\u26a0 Conflicts (' + totalConflicts + ')';
if (hardConflictsWasOpen) det.open = true; if (hardConflictsWasOpen) det.open = true;
for (const chain of hardConflictList) { for (const chain of hardConflictList) {
const div = document.createElement('div'); const div = document.createElement('div');
@@ -241,6 +255,13 @@ async function loadStudents() {
}); });
det.appendChild(div); det.appendChild(div);
} }
for (const members of oversizedGroups) {
const div = document.createElement('div');
div.className = 'conflict-row';
div.appendChild(kindSpan('must'));
div.appendChild(document.createTextNode(' group too large (' + members.length + ' for room size ' + trip.room_size + '): ' + members.join(', ')));
det.appendChild(div);
}
hardConflictsEl.appendChild(det); hardConflictsEl.appendChild(det);
} }