Verbeter grafische kwaliteit van kleurplaten (v0.4.67-beta) #5

Open
bes-r wants to merge 208 commits from bes-r/coloring-quality-v0.4.67 into main AGit
7 changed files with 37 additions and 10 deletions
Showing only changes of commit b2f6a69897 - Show all commits

View file

@ -1 +1 @@
0.4.55-beta
0.4.56-beta

View file

@ -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{

View file

@ -76,7 +76,15 @@
<button class="tbtn ghost" id="btnFs" title="Fullscreen"></button>
</div>
<div id="rolePreviewBanner" hidden><strong data-i18n="vwPreview"></strong><span id="rolePreviewLabel"></span><button type="button" data-i18n="vwPreviewReset"></button></div>
<div id="rolePreviewBanner" hidden>
<strong data-i18n="vwPreview"></strong>
<span id="rolePreviewLabel"></span>
<div id="rolePreviewTeacherActions" hidden>
<button type="button" id="rolePreviewPath" data-i18n="vwTeacherPath"></button>
<button type="button" id="rolePreviewDashboard" data-i18n="vwTeacherDashboard"></button>
</div>
<button type="button" id="rolePreviewReset" data-i18n="vwPreviewReset"></button>
</div>
<div id="board"></div>
<div id="pupilView"></div>
<div id="parentView"></div>

View file

@ -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"] },

View file

@ -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",

View file

@ -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()){

View file

@ -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()+'"'));