Gate-Screens entzerrt + Tiefe-Label "Ausgearbeitet"
Aufbauend auf "app update final" (b6500be), das den Großteil des Frank-Feedbacks v0.10 enthält (RACI-Betonung, SLC-Gesamtbild 6x, Feedback-System mit Server-Save, Review-Template, Gate-1 zweistufig):
- Gates: Freigabe-/Entscheidung ist jetzt ein EIGENER Screen NACH der
Kriterienpruefung (vorher auf einem Screen -> ueberladen). Gilt fuer
Gate 1/2/3: Pruef-Kriterien -> Button "Weiter -> Entscheidung" (erst
aktiv, wenn alle Kriterien geprueft) -> schlanker Entscheidungs-Screen
(Optionen + "<- zu den Kriterien"). Gate 1 danach wie gehabt Routing
Entwicklung/Konfiguration. Neuer State: gateCritDone.
- Tiefe-Badge "Bearbeitet" -> "Ausgearbeitet" (klarer; nur sichtbares
Label + Tooltip, interne Bezeichner/CSS-Klasse unveraendert).
- sw.js Cache hochgezaehlt; PROJEKTSTAND.md nachgezogen.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
parent
b6500bebe1
commit
e79cb97362
3 changed files with 38 additions and 14 deletions
|
|
@ -1294,7 +1294,7 @@ function stationTiefe(id){ return BEARBEITET.has(id) ? "bearbeitet" : "entwurf";
|
||||||
function tiefeBadge(id){
|
function tiefeBadge(id){
|
||||||
const t = stationTiefe(id);
|
const t = stationTiefe(id);
|
||||||
return t==="bearbeitet"
|
return t==="bearbeitet"
|
||||||
? `<span class="tiefeBadge bearbeitet" title="Eigene Arbeitsergebnisse/Templates liegen vor — hier ist detailliertes Feedback besonders wertvoll.">● Bearbeitet</span>`
|
? `<span class="tiefeBadge bearbeitet" title="Ausgearbeitet — eigene Arbeitsergebnisse/Templates liegen vor; hier ist detailliertes Feedback besonders wertvoll.">● Ausgearbeitet</span>`
|
||||||
: `<span class="tiefeBadge entwurf" title="Konzeptioneller Entwurf nach Best Practice — noch keine substantiellen eigenen Arbeitsergebnisse.">○ Entwurf</span>`;
|
: `<span class="tiefeBadge entwurf" title="Konzeptioneller Entwurf nach Best Practice — noch keine substantiellen eigenen Arbeitsergebnisse.">○ Entwurf</span>`;
|
||||||
}
|
}
|
||||||
/* Dokumente mit eigenem Detail-Feedback (Frank): Gate 1/2/3 + Service Review. */
|
/* Dokumente mit eigenem Detail-Feedback (Frank): Gate 1/2/3 + Service Review. */
|
||||||
|
|
@ -1325,7 +1325,7 @@ function defaultState(){
|
||||||
freigabeDone:false, freigabeWrong:null,
|
freigabeDone:false, freigabeWrong:null,
|
||||||
entryDone:false, entryWrong:null,
|
entryDone:false, entryWrong:null,
|
||||||
bonusReveal:false, bonusDone:{}, servicesDone:{}, akteFlash:null, svcModalSel:null,
|
bonusReveal:false, bonusDone:{}, servicesDone:{}, akteFlash:null, svcModalSel:null,
|
||||||
index:0, stage:"discuss", quizIndex:0, gateDeciderDone:false, gateCrit:0, gate1Approval:null,
|
index:0, stage:"discuss", quizIndex:0, gateDeciderDone:false, gateCrit:0, gateCritDone:false, gate1Approval:null,
|
||||||
feedback:{}, feedbackSaved:{}, feedbackQueue:[],
|
feedback:{}, feedbackSaved:{}, feedbackQueue:[],
|
||||||
actStep:0, actReveal:false, actDone:false, arteWrong:null,
|
actStep:0, actReveal:false, actDone:false, arteWrong:null,
|
||||||
picks:{}, done:{}, akte:{},
|
picks:{}, done:{}, akte:{},
|
||||||
|
|
@ -1820,7 +1820,7 @@ function enterStation(idx){
|
||||||
}
|
}
|
||||||
S.index = idx;
|
S.index = idx;
|
||||||
S.stage = STATIONEN[idx].typ==="gate" ? "gate" : "act";
|
S.stage = STATIONEN[idx].typ==="gate" ? "gate" : "act";
|
||||||
S.gatePick = null; S.quizIndex = 0; S.gateDeciderDone = false; S.gateCrit = 0; S.gate1Approval = null;
|
S.gatePick = null; S.quizIndex = 0; S.gateDeciderDone = false; S.gateCrit = 0; S.gateCritDone = false; S.gate1Approval = null;
|
||||||
S.actStep = 0; S.actReveal = false; S.actDone = false; S.arteWrong = null;
|
S.actStep = 0; S.actReveal = false; S.actDone = false; S.arteWrong = null;
|
||||||
S.akteFlash = null; document.body.classList.remove("akteOpen");
|
S.akteFlash = null; document.body.classList.remove("akteOpen");
|
||||||
}
|
}
|
||||||
|
|
@ -2071,6 +2071,25 @@ function renderGate(st){
|
||||||
<div class="gateCrit">${critItems}</div>
|
<div class="gateCrit">${critItems}</div>
|
||||||
${allChecked?`<p class="muted" style="margin:0 0 16px">Alle Kriterien geprüft. Geforderte Artefakte in der Akte (siehe oben)? Pflicht-Figuren am Gate-Puck?</p>`:``}` : ``;
|
${allChecked?`<p class="muted" style="margin:0 0 16px">Alle Kriterien geprüft. Geforderte Artefakte in der Akte (siehe oben)? Pflicht-Figuren am Gate-Puck?</p>`:``}` : ``;
|
||||||
|
|
||||||
|
// ---- Schritt 2: Prüf-Kriterien (eigener Screen) ----
|
||||||
|
if(pruef.length && !S.gateCritDone){
|
||||||
|
return `
|
||||||
|
${revisitNote}
|
||||||
|
${zielLine}
|
||||||
|
<p class="lead"><b>Entscheidet:</b> ${roleLabel(keeper)}</p>
|
||||||
|
${reqLine}
|
||||||
|
${critWrap}
|
||||||
|
<div class="actions">
|
||||||
|
<div class="spacer"></div>
|
||||||
|
<button class="primary" id="gateToDecision" ${allChecked?'':'disabled'}>Weiter → Entscheidung</button>
|
||||||
|
</div>`;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ---- Schritt 3: Entscheidung (eigener Screen, nach Kriterienprüfung) ----
|
||||||
|
const critRecap = pruef.length ? `<div class="hint ok">✓ Alle Prüf-Kriterien geprüft</div>` : ``;
|
||||||
|
const critBack = pruef.length ? `<button class="ghost" id="gateToCrit">← zu den Kriterien</button>` : `<div></div>`;
|
||||||
|
const deciderLine = `<p class="lead" style="margin:0 0 12px"><b>Entscheidet:</b> ${roleLabel(keeper)}</p>`;
|
||||||
|
|
||||||
// Zweistufiges Gate (Gate 1): erst Freigabe-Entscheidung, dann Build-/Konfig-Routing.
|
// Zweistufiges Gate (Gate 1): erst Freigabe-Entscheidung, dann Build-/Konfig-Routing.
|
||||||
if(st.freigabe){
|
if(st.freigabe){
|
||||||
if(S.gate1Approval==null){
|
if(S.gate1Approval==null){
|
||||||
|
|
@ -2078,12 +2097,12 @@ function renderGate(st){
|
||||||
`<button class="choice freigabeOpt" data-fi="${i}" ${blocked?"disabled":""}><b>${n}</b><br><span style="color:var(--muted);font-weight:400">${d}</span></button>`).join("");
|
`<button class="choice freigabeOpt" data-fi="${i}" ${blocked?"disabled":""}><b>${n}</b><br><span style="color:var(--muted);font-weight:400">${d}</span></button>`).join("");
|
||||||
return `
|
return `
|
||||||
${revisitNote}
|
${revisitNote}
|
||||||
${zielLine}
|
${critRecap}
|
||||||
<p class="lead"><b>Entscheidet:</b> ${roleLabel(keeper)}</p>
|
|
||||||
${reqLine}
|
${reqLine}
|
||||||
${critWrap}
|
|
||||||
<div class="critHead">Freigabe-Entscheidung</div>
|
<div class="critHead">Freigabe-Entscheidung</div>
|
||||||
<div class="choiceGrid">${fopts}</div>`;
|
${deciderLine}
|
||||||
|
<div class="choiceGrid">${fopts}</div>
|
||||||
|
<div class="actions">${critBack}<div class="spacer"></div></div>`;
|
||||||
}
|
}
|
||||||
// Freigabe erteilt (0/1) → Routing-Schritt
|
// Freigabe erteilt (0/1) → Routing-Schritt
|
||||||
const fa = st.freigabe[S.gate1Approval];
|
const fa = st.freigabe[S.gate1Approval];
|
||||||
|
|
@ -2096,13 +2115,15 @@ function renderGate(st){
|
||||||
<div class="actions"><button class="ghost" id="gateApprovalBack">← andere Freigabe-Entscheidung</button><div class="spacer"></div></div>`;
|
<div class="actions"><button class="ghost" id="gateApprovalBack">← andere Freigabe-Entscheidung</button><div class="spacer"></div></div>`;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Normales Gate (2/3): Entscheidung
|
||||||
return `
|
return `
|
||||||
${revisitNote}
|
${revisitNote}
|
||||||
${zielLine}
|
${critRecap}
|
||||||
<p class="lead"><b>Entscheidet:</b> ${roleLabel(keeper)}</p>
|
|
||||||
${reqLine}
|
${reqLine}
|
||||||
${critWrap}
|
<div class="critHead">Entscheidung</div>
|
||||||
<div class="choiceGrid">${opts}</div>`;
|
${deciderLine}
|
||||||
|
<div class="choiceGrid">${opts}</div>
|
||||||
|
<div class="actions">${critBack}<div class="spacer"></div></div>`;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Gate — Konsequenz der Entscheidung */
|
/* Gate — Konsequenz der Entscheidung */
|
||||||
|
|
@ -2283,6 +2304,8 @@ function wire(st){
|
||||||
if(b("finish")) b("finish").onclick = ()=>{ captureFeedbackInputs(); S.done[st.id]=true; S.view="end"; S.endReason="done"; save(); draw(); };
|
if(b("finish")) b("finish").onclick = ()=>{ captureFeedbackInputs(); S.done[st.id]=true; S.view="end"; S.endReason="done"; save(); draw(); };
|
||||||
// Gate
|
// Gate
|
||||||
if(b("gateDeciderNext")) b("gateDeciderNext").onclick = ()=>{ S.gateDeciderDone=true; save(); draw(); };
|
if(b("gateDeciderNext")) b("gateDeciderNext").onclick = ()=>{ S.gateDeciderDone=true; save(); draw(); };
|
||||||
|
if(b("gateToDecision")) b("gateToDecision").onclick = ()=>{ S.gateCritDone=true; save(); draw(); };
|
||||||
|
if(b("gateToCrit")) b("gateToCrit").onclick = ()=>{ S.gateCritDone=false; S.gate1Approval=null; save(); draw(); };
|
||||||
$("#panel").querySelectorAll(".critItem[data-ci]").forEach(el=>{
|
$("#panel").querySelectorAll(".critItem[data-ci]").forEach(el=>{
|
||||||
el.onclick = ()=>{ const i=+el.dataset.ci;
|
el.onclick = ()=>{ const i=+el.dataset.ci;
|
||||||
S.gateCrit = (i < (S.gateCrit||0)) ? i : i+1; // abgehaktes wieder lösen vs. nächstes aufdecken
|
S.gateCrit = (i < (S.gateCrit||0)) ? i : i+1; // abgehaktes wieder lösen vs. nächstes aufdecken
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
/* Service Worker — SLC-Workshop Companion (App-Shell, offline-first) */
|
/* Service Worker — SLC-Workshop Companion (App-Shell, offline-first) */
|
||||||
const CACHE = "slc-companion-v32";
|
const CACHE = "slc-companion-v34";
|
||||||
const SHELL = ["./", "index.html", "manifest.webmanifest", "icon.svg"];
|
const SHELL = ["./", "index.html", "manifest.webmanifest", "icon.svg"];
|
||||||
// Action-Card-Grafiken (cards/s<service>-c<change>.png) fuer Offline vorab cachen (alle 24).
|
// Action-Card-Grafiken (cards/s<service>-c<change>.png) fuer Offline vorab cachen (alle 24).
|
||||||
const CARDS = [];
|
const CARDS = [];
|
||||||
|
|
|
||||||
|
|
@ -118,8 +118,9 @@ Konzept (`00_Konzept/README_konzept.md`), bis Rückkopplung mit Michael:**
|
||||||
- [x] **GRAFIK SLC (Gesamtbild) 6×** im **Major-Walk**: Start (Main-Intro), an den 4 Phasenübergängen
|
- [x] **GRAFIK SLC (Gesamtbild) 6×** im **Major-Walk**: Start (Main-Intro), an den 4 Phasenübergängen
|
||||||
(`renderActivity`/`renderGateDone`) und am Schluss (`renderEnd`) — jeweils mit Highlight der
|
(`renderActivity`/`renderGateDone`) und am Schluss (`renderEnd`) — jeweils mit Highlight der
|
||||||
aktuellen/nächsten Phase (`slcOverview` auf Basis von `phaseDonut`). **Bonus unberührt.**
|
aktuellen/nächsten Phase (`slcOverview` auf Basis von `phaseDonut`). **Bonus unberührt.**
|
||||||
- [x] **„Bearbeitet"/„Entwurf" sichtbar:** Badge im Stations-Header (`stationTiefe`/`tiefeBadge`).
|
- [x] **„Ausgearbeitet"/„Entwurf" sichtbar:** Badge im Stations-Header (`stationTiefe`/`tiefeBadge`;
|
||||||
Bearbeitet = `ds_01, tr_01, tr_09, tr_12, rv_01`; alles andere Entwurf.
|
Label „Ausgearbeitet" — Franks „Bearbeitet", klarer benannt). Ausgearbeitet = `ds_01, tr_01,
|
||||||
|
tr_09, tr_12, rv_01`; alles andere Entwurf.
|
||||||
- [x] **Gate 1 zweistufig:** erst **Freigabe-Entscheidung** (Freigabe / mit Auflagen / **Zurück an
|
- [x] **Gate 1 zweistufig:** erst **Freigabe-Entscheidung** (Freigabe / mit Auflagen / **Zurück an
|
||||||
Design** [Rückschleife] / **Ablehnung** [End-Screen]), dann **Routing** Entwicklung/Konfiguration.
|
Design** [Rückschleife] / **Ablehnung** [End-Screen]), dann **Routing** Entwicklung/Konfiguration.
|
||||||
Gate-Templates: `ziel` an Gate 1/2/3 ergänzt; Gate-1-Prüfdim. „Budget für die **Implementierung**".
|
Gate-Templates: `ziel` an Gate 1/2/3 ergänzt; Gate-1-Prüfdim. „Budget für die **Implementierung**".
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue