From b2f6a69897a19193ae1b4121f5d05baebf319228 Mon Sep 17 00:00:00 2001 From: Ramon Date: Thu, 23 Jul 2026 23:15:08 +0200 Subject: [PATCH] fix: maak leerkrachtfuncties zichtbaar in voorbeeldmodus --- VERSION | 2 +- public/css/teach.css | 7 +++++-- public/index.html | 10 +++++++++- public/js/admin.js | 3 ++- public/js/core.js | 8 +++++--- public/js/role-preview.js | 12 +++++++++++- test/role-preview.test.js | 5 ++++- 7 files changed, 37 insertions(+), 10 deletions(-) diff --git a/VERSION b/VERSION index 8489daf..5c259b0 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.4.55-beta +0.4.56-beta diff --git a/public/css/teach.css b/public/css/teach.css index 4354849..9e2c9ea 100644 --- a/public/css/teach.css +++ b/public/css/teach.css @@ -1326,12 +1326,15 @@ #ownPwBlock input{flex:1; min-width:0;} /* systeemmanager: veilige voorbeeldweergave van vaste rollen */ -.vw-role-block[hidden],#rolePreviewBanner[hidden]{display:none} +.vw-role-block[hidden],#rolePreviewBanner[hidden],#rolePreviewTeacherActions[hidden]{display:none} .vw-role-block{margin-bottom:8px;padding:10px 12px;border:1px solid var(--accent-soft);border-radius:12px;background:var(--surface-2)} .vw-role-block .vw-row{align-items:flex-start;padding-top:0}.vw-role-seg{flex-wrap:wrap;justify-content:flex-end;max-width:min(620px,72%)} .vw-role-note{margin-top:7px} #rolePreviewBanner{position:fixed;top:calc(var(--tbar) + 8px);left:50%;z-index:5700;display:flex;align-items:center;gap:8px;transform:translateX(-50%);padding:7px 9px 7px 12px;border:1px solid var(--orange);border-radius:999px;background:var(--surface);box-shadow:var(--shadow-2);font-size:12px} #rolePreviewBanner span{font-weight:800;color:var(--orange)}#rolePreviewBanner button{border:0;border-radius:999px;padding:5px 9px;background:color-mix(in srgb,var(--orange) 16%,var(--surface));color:var(--ink);font:inherit;font-weight:800;cursor:pointer} +#rolePreviewTeacherActions{display:flex;align-items:center;gap:5px} +#rolePreviewTeacherActions button{background:var(--accent);color:#fff} +#rolePreviewTeacherActions button:hover,#rolePreviewTeacherActions button:focus-visible{filter:brightness(1.08);outline:2px solid var(--accent-soft);outline-offset:1px} .role-preview-note{max-width:760px;margin:0 auto 14px;padding:11px 14px;border:1px solid var(--orange);border-radius:12px;background:color-mix(in srgb,var(--orange) 16%,var(--surface));color:var(--ink);font-size:13px;line-height:1.45} body.role-preview-active #parentView button:disabled,body.role-preview-active #parentView input:disabled,body.role-preview-active #parentView select:disabled{opacity:.55;cursor:not-allowed} body.role-preview-pupil #pupilView .widget-body{pointer-events:none;user-select:none} @@ -1345,7 +1348,7 @@ body.role-preview-pupil #pupilView .widget-body{pointer-events:none;user-select: body.role-preview-updating #board{visibility:hidden} @media(max-width:560px){.role-preview-widget-grid{grid-template-columns:1fr}} body.tb-left #rolePreviewBanner,body.tb-right #rolePreviewBanner{top:8px} -@media(max-width:720px){.vw-role-block .vw-row{align-items:stretch;flex-direction:column}.vw-role-seg{max-width:none;justify-content:flex-start}#rolePreviewBanner{max-width:calc(100vw - 24px);white-space:nowrap}#rolePreviewBanner strong{display:none}} +@media(max-width:720px){.vw-role-block .vw-row{align-items:stretch;flex-direction:column}.vw-role-seg{max-width:none;justify-content:flex-start}#rolePreviewBanner{max-width:calc(100vw - 24px);flex-wrap:wrap;justify-content:center;border-radius:16px;white-space:nowrap}#rolePreviewBanner strong{display:none}#rolePreviewTeacherActions{order:3;width:100%;justify-content:center}} /* ---------- weergave-instellingen (tabblad "Weergave") ---------- */ .vw-row{ diff --git a/public/index.html b/public/index.html index d4b8504..4306562 100644 --- a/public/index.html +++ b/public/index.html @@ -76,7 +76,15 @@ - +
diff --git a/public/js/admin.js b/public/js/admin.js index 8ef9b6b..8b4c60e 100644 --- a/public/js/admin.js +++ b/public/js/admin.js @@ -229,7 +229,8 @@ ] }, { tab:"toewijzingen", icon:"๐ŸŽฏ", group:"school", order:12, labelKey:"amAssignments", subKey:"stToewijzSub", show:()=>can("assignments.manage"), - keywords:()=>[T("amModeWatch"), T("amModeWork"), "bord","board","delen","share","toewijzen","assign","widget"] }, + keywords:()=>[T("amModeWatch"), T("amModeWork"), T("amDashboardTitle"), T("castPathTitle"), + "bord","board","delen","share","toewijzen","assign","widget","dashboard","opdrachtenreeks","learning path"] }, { tab:"voortgang", icon:"๐Ÿ“ˆ", group:"school", order:13, labelKey:"amProgress", subKey:"stVoortgangSub", show:()=>can("progress.view"), keywords:()=>["voortgang","progress","score","resultaten","results","tijdlijn","timeline"] }, diff --git a/public/js/core.js b/public/js/core.js index 9c7a773..508fb68 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.4.55-beta"; +const VERSION = "0.4.56-beta"; /* Safari en oudere mobiele browsers behandelen 100vh/100% soms als de hoogte achter hun adres- en navigatiebalk. visualViewport geeft de werkelijk zichtbare hoogte; de CSS gebruikt deze pixelwaarde als betrouwbare bron en @@ -281,7 +281,7 @@ const I18N = { wikiLanguageNote:"The official SLO goals and these implementation summaries are shown in Dutch.", stUsersSub:"Accounts beheren: leerlingen, staf, ouders en aanmeldingen.", stKlassenSub:"Klassen aanmaken, koppelen en beheren.", - stToewijzSub:"Bepaal wat een klas of leerling te zien krijgt.", + stToewijzSub:"Wijs borden en opdrachtenreeksen toe en bekijk het klasdashboard.", stVoortgangSub:"Volg per leerling de resultaten in de tijd.", stScholenSub:"Scholen en systeemmanagers, over alle scholen heen.", amSchoolMenu:"School", stSchoolMenuSub:"Scholen, klassen en gebruikers beheren.", @@ -307,6 +307,7 @@ const I18N = { vwRole:"Weergave als", vwRoleSystem:"Systeem", vwRoleAdmin:"Schoolbeheerder", vwRoleTeacher:"Leerkracht", vwRoleParent:"Ouder", vwRolePupil:"Leerling", vwRoleNote:"Alleen de interface verandert. Je blijft ingelogd als systeemmanager; serverrechten en gegevens wijzigen niet.", vwPreview:"Voorbeeldweergave", vwPreviewReset:"Terug naar systeem", + vwTeacherPath:"๐ŸŽฏ Opdrachtenreeks", vwTeacherDashboard:"๐Ÿ“ˆ Klasdashboard", vwParentPreview:"Voorbeeld van het ouderportaal. Echte kindgegevens en acties zijn in deze weergave uitgeschakeld.", vwPupilPreview:"Voorbeeld van de leerlingomgeving met de taal- en rekenwidgets van het huidige bord. Bediening en voortgang zijn uitgeschakeld.", vwPupilAddWidget:"Widget toevoegen", vwPupilChooseWidget:"Kies een leerlingwidget", @@ -678,7 +679,7 @@ const I18N = { wikiLanguageNote:"The official SLO goals and these implementation summaries are shown in Dutch.", stUsersSub:"Manage accounts: pupils, staff, parents and enrolments.", stKlassenSub:"Create, link and manage classes.", - stToewijzSub:"Choose what a class or pupil gets to see.", + stToewijzSub:"Assign boards and learning paths and view the class dashboard.", stVoortgangSub:"Follow each pupil's results over time.", stScholenSub:"Schools and system managers, across all schools.", amSchoolMenu:"School", stSchoolMenuSub:"Manage schools, classes and users.", @@ -704,6 +705,7 @@ const I18N = { vwRole:"View as", vwRoleSystem:"System", vwRoleAdmin:"School administrator", vwRoleTeacher:"Teacher", vwRoleParent:"Parent", vwRolePupil:"Pupil", vwRoleNote:"Only the interface changes. You remain signed in as system manager; server permissions and data do not change.", vwPreview:"Preview mode", vwPreviewReset:"Return to system", + vwTeacherPath:"๐ŸŽฏ Learning path", vwTeacherDashboard:"๐Ÿ“ˆ Class dashboard", vwParentPreview:"Preview of the parent portal. Real child data and actions are disabled in this view.", vwPupilPreview:"Preview of the pupil environment using language and maths widgets from the current board. Controls and progress are disabled.", vwPupilAddWidget:"Add widget", vwPupilChooseWidget:"Choose a pupil widget", diff --git a/public/js/role-preview.js b/public/js/role-preview.js index 07e710a..f7274ac 100644 --- a/public/js/role-preview.js +++ b/public/js/role-preview.js @@ -8,7 +8,10 @@ const roleSeg=document.getElementById("segViewRole"); const banner=document.getElementById("rolePreviewBanner"); const bannerLabel=document.getElementById("rolePreviewLabel"); - const resetButton=banner.querySelector("button"); + const teacherActions=document.getElementById("rolePreviewTeacherActions"); + const pathButton=document.getElementById("rolePreviewPath"); + const dashboardButton=document.getElementById("rolePreviewDashboard"); + const resetButton=document.getElementById("rolePreviewReset"); const ROLE_KEYS={ super:"vwRoleSystem",admin:"vwRoleAdmin",teacher:"vwRoleTeacher", parent:"vwRoleParent",pupil:"vwRolePupil" @@ -128,6 +131,7 @@ }); banner.hidden=!enabled||role==="super"; bannerLabel.textContent=enabled&&role!=="super"?roleLabel(role):""; + teacherActions.hidden=!enabled||role!=="teacher"; } async function renderPreviewSurface(){ const sequence=++renderSequence; @@ -169,6 +173,12 @@ roleSeg.querySelectorAll("button").forEach(button=>{ button.addEventListener("click",()=>chooseRole(button.dataset.role)); }); + pathButton.addEventListener("click",()=>{ + if(isSystemManager()&&activeRole()==="teacher")document.getElementById("btnCast").click(); + }); + dashboardButton.addEventListener("click",()=>{ + if(isSystemManager()&&activeRole()==="teacher")openSettings("toewijzingen"); + }); resetButton.addEventListener("click",()=>chooseRole("super")); document.addEventListener("userchange",()=>{ if(isSystemManager()){ diff --git a/test/role-preview.test.js b/test/role-preview.test.js index 727d2c6..994bc1a 100644 --- a/test/role-preview.test.js +++ b/test/role-preview.test.js @@ -42,10 +42,13 @@ test('Weergave bevat de vijf rollen en laadt de veilige voorbeeldmodule vรณรณr d assert.match(preview,/pupilAllowedDefs\(\)\.includes\(def\)/); assert.match(preview,/setActiveViewRole\("super"\)[\s\S]*?makeWidget\(def\)[\s\S]*?await doSave\(\)/); assert.match(preview,/role-preview-add-widget/); + assert.match(html,/id="rolePreviewTeacherActions" hidden/); + assert.match(preview,/document\.getElementById\("btnCast"\)\.click\(\)/); + assert.match(preview,/openSettings\("toewijzingen"\)/); assert.doesNotMatch(preview,/currentUser\.role\s*=(?!=)/); assert.doesNotMatch(preview,/api\(/); assert.match(css,/body\.role-preview-pupil #pupilView \.widget-body\{pointer-events:none/); - for(const key of ['vwRole','vwRoleSystem','vwRoleAdmin','vwRoleTeacher','vwRoleParent','vwRolePupil','vwRoleNote','vwPreviewReset','vwPupilAddWidget','vwPupilChooseWidget','vwPupilAddWidgetNote']){ + for(const key of ['vwRole','vwRoleSystem','vwRoleAdmin','vwRoleTeacher','vwRoleParent','vwRolePupil','vwRoleNote','vwPreviewReset','vwTeacherPath','vwTeacherDashboard','vwPupilAddWidget','vwPupilChooseWidget','vwPupilAddWidgetNote']){ assert.equal((core.match(new RegExp(key+':','g'))||[]).length,2,key); } assert.ok(core.includes('const VERSION = "'+version.trim()+'"'));