diff --git a/VERSION b/VERSION index b8a760f..b5d33cb 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.3.15-beta +0.3.16-beta diff --git a/public/js/admin.js b/public/js/admin.js index 29df23f..df184d8 100644 --- a/public/js/admin.js +++ b/public/js/admin.js @@ -420,6 +420,23 @@ live op, dus nieuwe woorden die je toevoegt komen vanzelf door zonder opnieuw toe te wijzen. Een expliciete "Toewijzen"-knop i.p.v. direct bij het kiezen van een bord opslaan, zodat een klas-brede wijziging niet per ongeluk gebeurt. */ + /* widgets van een eigen bord (voor de één-widget-keuze in assignmentRow); + widgets zonder wid komen uit borden van vóór v0.3.13 en verschijnen pas + na de eerstvolgende save van dat bord */ + function boardWidgets(boardId){ + let found = null; + BS.folders.forEach(fo=>fo.boards.forEach(bo=>{ if(bo.id===boardId) found = bo; })); + return ((found && found.data && found.data.widgets) || []).filter(w=>w.wid); + } + function describeCurrent(current){ + if(!current) return ""; + let s = `${T("amAssignedAs")} “${current.boardName || current.boardId}”`; + if(current.widgetId){ + const wName = current.widgetType ? T("wg_"+current.widgetType) : current.widgetId; + s += ` › ${wName} (${current.mode==="kijken" ? T("amModeWatch") : T("amModeWork")})`; + } + return s; + } function assignmentRow(target, boardOptions, current){ const row = h("div","am-row"); row.appendChild(h("span","am-name", target.label)); @@ -427,19 +444,43 @@ sel.appendChild(new Option(T("amNoAssignment"), "")); boardOptions.forEach(b=>sel.appendChild(new Option(b.label, b.id))); sel.value = current ? current.boardId : ""; - const info = h("span","am-code", current ? `${T("amAssignedAs")} “${current.boardName || current.boardId}”` : ""); + /* keuze: heel bord (default, bestaand gedrag) of één widget + modus */ + const widgetSel = h("select","am-sel am-widget-sel"); + const modeSel = h("select","am-sel am-mode-sel"); + modeSel.appendChild(new Option(T("amModeWork"), "werken")); + modeSel.appendChild(new Option(T("amModeWatch"), "kijken")); + const syncWidgetSel = ()=>{ + widgetSel.innerHTML = ""; + widgetSel.appendChild(new Option(T("amWholeBoard"), "")); + boardWidgets(sel.value).forEach(w=>widgetSel.appendChild(new Option(T("wg_"+w.id), w.wid))); + widgetSel.value = (current && current.boardId===sel.value && current.widgetId) ? current.widgetId : ""; + widgetSel.style.display = sel.value ? "" : "none"; + syncModeSel(); + }; + const syncModeSel = ()=>{ modeSel.style.display = (sel.value && widgetSel.value) ? "" : "none"; }; + modeSel.value = current && current.mode ? current.mode : "werken"; + sel.addEventListener("change", syncWidgetSel); + widgetSel.addEventListener("change", syncModeSel); + const info = h("span","am-code", describeCurrent(current)); row.appendChild(sel); + row.appendChild(widgetSel); + row.appendChild(modeSel); row.appendChild(info); + syncWidgetSel(); const apply = h("button","am-btn", T("amAssign")); apply.type = "button"; apply.addEventListener("click", async ()=>{ try{ - if(sel.value) await api(`/assignments/${target.type}/${target.id}`, {method:"PUT", body:{boardId: sel.value}}); + if(sel.value){ + const body = { boardId: sel.value }; + if(widgetSel.value){ body.widgetId = widgetSel.value; body.mode = modeSel.value; } + await api(`/assignments/${target.type}/${target.id}`, {method:"PUT", body}); + } else await api(`/assignments/${target.type}/${target.id}`, {method:"DELETE"}); if(target.type==="class"){ await reload(); } else{ const a = (await api("/assignments/pupil/"+target.id)).assignment; - info.textContent = a ? `${T("amAssignedAs")} “${a.boardName || a.boardId}”` : ""; + info.textContent = describeCurrent(a); msg(T("amAssignSaved")); } }catch(e){ msg(e.message); } diff --git a/public/js/core.js b/public/js/core.js index da62ed1..1d7738c 100644 --- a/public/js/core.js +++ b/public/js/core.js @@ -2,7 +2,7 @@ "use strict"; /* version — shown until /api/version resolves (or if the fetch fails, e.g. offline). Kept in sync by hand with the VERSION file at the repo root on every release. */ -const VERSION = "0.3.15-beta"; +const VERSION = "0.3.16-beta"; (function(){ const tag = document.getElementById("verTag"); tag.textContent = "v"+VERSION; @@ -176,6 +176,7 @@ const I18N = { amAssignments:"Toewijzingen", amAssignClasses:"Per klas (standaard)", amAssignPupils:"Per leerling (uitzondering)", amPickPupil:"— kies een leerling —", amNoAssignment:"— geen toewijzing —", amAssignedAs:"Toegewezen:", amAssign:"Toewijzen", amAssignSaved:"Toewijzing opgeslagen.", + amWholeBoard:"— heel bord —", amModeWatch:"kijken", amModeWork:"werken", amProgress:"Voortgang", amProgressEmpty:"Nog geen voortgang voor deze leerling.", amConfirmDel:"Weet je zeker dat je deze gebruiker wilt verwijderen?", amCopy:"kopieer", amCopyAll:"kopieer alles", @@ -337,6 +338,7 @@ const I18N = { amAssignments:"Assignments", amAssignClasses:"Per class (default)", amAssignPupils:"Per pupil (override)", amPickPupil:"— pick a pupil —", amNoAssignment:"— no assignment —", amAssignedAs:"Assigned:", amAssign:"Assign", amAssignSaved:"Assignment saved.", + amWholeBoard:"— whole board —", amModeWatch:"watch", amModeWork:"work", amProgress:"Progress", amProgressEmpty:"No progress for this pupil yet.", amConfirmDel:"Are you sure you want to delete this user?", amCopy:"copy", amCopyAll:"copy all",