fixed session numbering
Some checks failed
PHPUnit / test (push) Has been cancelled

This commit is contained in:
2026-07-01 08:44:29 +02:00
parent 9db886a1ae
commit e589b46a8a
4 changed files with 92 additions and 28 deletions

View File

@ -36,8 +36,7 @@ export async function sessionsPage() {
function renderSessions(sessions, questionnaires, settings) {
const el = document.getElementById('sessionsContent');
const sorted = [...sessions].sort((a, b) =>
(a.orderIndex ?? 0) - (b.orderIndex ?? 0)
|| (a.sessionNumber ?? 0) - (b.sessionNumber ?? 0)
effectiveSessionNumber(a) - effectiveSessionNumber(b)
|| String(a.name).localeCompare(String(b.name)),
);
const autoRepeat = !!settings.autoRepeatSessions;
@ -145,7 +144,7 @@ function sessionCardHTML(session, questionnaires) {
<strong>${esc(session.name)}</strong>
${activeBadge}
</div>
<p class="scoring-profile-bands">Session ${session.sessionNumber} · Order ${session.orderIndex}</p>
<p class="scoring-profile-bands">Session ${effectiveSessionNumber(session)}</p>
${session.description
? `<p class="scoring-profile-desc">${esc(session.description)}</p>`
: ''}
@ -174,9 +173,7 @@ function openSessionModal(session, questionnaires, allSessions) {
}))
: [];
const selectedIds = new Set(members.map(m => m.questionnaireID));
const defaultOrder = allSessions?.length
? Math.max(...allSessions.map(s => s.orderIndex ?? 0)) + 1
: 0;
const defaultSessionNumber = (allSessions?.length ?? 0) + 1;
const overlay = document.createElement('div');
overlay.className = 'modal-overlay';
@ -191,20 +188,14 @@ function openSessionModal(session, questionnaires, allSessions) {
</div>
<div class="form-group">
<label for="sessNumber">Session number</label>
<input type="number" id="sessNumber" min="1" value="${session?.sessionNumber ?? 1}">
<input type="number" id="sessNumber" min="1" value="${session ? effectiveSessionNumber(session) : defaultSessionNumber}">
</div>
</div>
<div class="form-row" style="display:grid;grid-template-columns:1fr 1fr;gap:12px">
<div class="form-group">
<label for="sessOrder">Display order</label>
<input type="number" id="sessOrder" min="0" value="${session?.orderIndex ?? defaultOrder}">
</div>
<div class="form-group scoring-profile-active-row" style="align-self:end;padding-bottom:8px">
<label class="checkbox-inline">
<input type="checkbox" id="sessActive" ${session?.isActive !== 0 ? 'checked' : ''}>
Active (visible in app)
</label>
</div>
<div class="form-group scoring-profile-active-row">
<label class="checkbox-inline">
<input type="checkbox" id="sessActive" ${session?.isActive !== 0 ? 'checked' : ''}>
Active (visible in app)
</label>
</div>
<div class="form-group">
<label for="sessDesc">Description</label>
@ -314,7 +305,6 @@ function openSessionModal(session, questionnaires, allSessions) {
const name = overlay.querySelector('#sessName')?.value.trim();
const description = overlay.querySelector('#sessDesc')?.value.trim() || '';
const sessionNumber = parseInt(overlay.querySelector('#sessNumber')?.value || '1', 10);
const orderIndex = parseInt(overlay.querySelector('#sessOrder')?.value || '0', 10);
const isActive = overlay.querySelector('#sessActive')?.checked;
if (!name) {
showToast('Session name is required', 'error');
@ -324,7 +314,6 @@ function openSessionModal(session, questionnaires, allSessions) {
name,
description,
sessionNumber: Number.isFinite(sessionNumber) ? Math.max(1, sessionNumber) : 1,
orderIndex: Number.isFinite(orderIndex) ? Math.max(0, orderIndex) : 0,
isActive,
questionnaires: members.map((m, idx) => ({
questionnaireID: m.questionnaireID,
@ -347,6 +336,11 @@ function openSessionModal(session, questionnaires, allSessions) {
});
}
function effectiveSessionNumber(session) {
if (!session) return 1;
return Math.max(session.sessionNumber ?? 1, (session.orderIndex ?? 0) + 1);
}
function esc(s) {
const d = document.createElement('div');
d.textContent = s ?? '';