Manager-Ziele: mehr als das Ziel wird jetzt auch gezaehlt

Filipe: "soll jeder die möglichkeit auch mehr wie das ziel einzutragen.
die sollen auch gezählt werden. die zahl die die leute erreichen sollen
sollen aber während dems immer gleich bleiben. mit der möglichkeit die
grenzen zu übergehen."

ZUERST GEMESSEN, DANN GEBAUT -- und die Messung hat die Aufgabe
verschoben: Eintragen ueber dem Ziel ging schon immer. Fuenf von fuenf
Versuchen wurden angenommen, es gab nie eine Sperre. Was fehlte, war
das ZAEHLEN.

Gemessen am Beispiel eines Scouts: creator 2/3, meeting 1/2,
schulung 1/2, werbung 2/1. Er hatte sechs Dinge getan, die Seite sagte
"5 von 8". Das Werbe-Video ueber dem Ziel fiel aus der Summe heraus,
weil sie je Aufgabe bei Math.min(zahl, ziel) gedeckelt war -- ohne
Hinweis, und niemand konnte es sehen.

ZWEI ZAHLEN STATT EINER, weil es zwei Fragen sind:
  erledigt  Wie viel von der PFLICHT ist erfuellt? Je Aufgabe
            hoechstens ihr Ziel. Daraus kommt der Ring.
  getan     Wie viel wurde WIRKLICH getan? Ohne Deckel.

`erledigt` wurde bewusst NICHT entdeckelt: Wer zehn Werbevideos und
sonst nichts macht, haette sonst 10 von 8 und einen vollen Ring bei
drei unberuehrten Aufgaben. Das waere keine Grosszuegigkeit, sondern
eine falsche Auskunft. Gemessen bleibt der Ring bei 75 %, und zwei
Aufgaben bleiben offen.

DAS ZIEL BLEIBT STEHEN -- die naheliegende falsche Loesung waere, es
mitwachsen zu lassen; dann haette nie jemand mehr als sein Ziel.
Nachgemessen: 2 -> 2, waehrend die Zahl von 1 auf 6 stieg.

AUF DEM BILDSCHIRM: "+N" als eigenes Zeichen neben der Zahl, nicht in
ihr ("5/2 +3" statt "5/2"), im Ton von "erledigt" statt in einem
Warnton -- mehr zu tun als verlangt ist nichts, wovor man warnt. Im
Ring ein kleines Plus unter der Pflichtzahl, im Kopf "4 von 8 erledigt
· 2 zusaetzlich". Der Balken waechst NICHT ueber seinen Kasten hinaus
(bei 10 von 1 waeren alle anderen Aufgaben optisch platt), sondern
bekommt eine hellere Kappe. Auch im Verlauf und in der Teamtabelle.

Die Ausgabedatei bekommt "Gesamt getan" NEBEN "Gesamt erledigt" --
eine Zahl, die nur auf dem Bildschirm steht, fehlt in der Liste, die
am Monatsende weitergereicht wird.

pruef-manager-ziele: 216 -> 229 Pruefungen, gruen. Gegenprobe gefahren
(getan wieder gedeckelt -> 2 rot, mit "6 = 11" als Beleg). Beim ersten
Anlauf der Messung lagen alle fuenf Testdaten in der Zukunft; "0 von 5
angenommen" sah nach einer Sperre aus und war der Kalender -- steht
jetzt als Warnung in der Pruefung.

Nebenbei: mess-manager-ziele schrieb seine Bilder in den Projektstamm
statt nach server/ (relativer Pfad). Korrigiert, Stamm aufgeraeumt.

Dazu gruen: xlsx, css-klassen, lesbarkeit, tippziele, fingermass,
haus-trennung, deutsche-texte.

Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
2026-10-07 00:16:02 +02:00
co-authored by Claude Opus 5
parent ea4078740e
commit aaee74818f
51 changed files with 974 additions and 695 deletions
+71
View File
@@ -441,3 +441,74 @@
@media (prefers-reduced-motion: reduce) {
.mz-ring, .mz-balken__fuell, .mz-zeile__pfeil { transition: none; }
}
/* =====================================================================
MEHR ALS GEFORDERT (07.10.2026)
=====================================================================
Filipe: „soll jeder die möglichkeit auch mehr wie das ziel
einzutragen. die sollen auch gezählt werden. die zahl die die leute
erreichen sollen sollen aber immer gleich bleiben. mit der
möglichkeit die grenzen zu übergehen."
GEMESSEN AM 07.10.2026, bevor etwas gebaut wurde: Eintragen ging
schon immer -- fünf von fünf Versuchen wurden angenommen, es gab nie
eine Sperre. Was fehlte, war das ZÄHLEN. Ein Scout mit creator 2/3,
meeting 1/2, schulung 1/2 und werbung 2/1 hatte sechs Dinge getan,
und die Seite sagte „5 von 8": Das Werbe-Video über dem Ziel fiel aus
der Summe heraus, weil sie je Aufgabe bei `Math.min(zahl, ziel)`
gedeckelt war. Unsichtbar, ohne Hinweis, und niemand konnte es sehen.
DAS PLUS IST EIN EIGENES ZEICHEN, nicht Teil der Zahl. Die geforderte
Zahl bleibt dadurch stehen -- „5/2" allein liest sich wie ein Fehler
im Ziel, „5/2 +3" liest sich als das, was es ist.
IM TON VON „ERLEDIGT" (--mz-gut), nicht in einem Warnton: Mehr zu tun
als verlangt ist nichts, wovor jemand gewarnt werden müsste. Gedeckt
gehalten wie alles im Haus. */
.mz-zeile__plus,
.mz-ring__plus {
flex: 0 0 auto;
font-variant-numeric: tabular-nums;
font-weight: 800;
color: var(--mz-gut);
}
.mz-zeile__plus {
/* .78rem = 12,5px -- über der Hausgrenze von 11,5px. */
font-size: .78rem;
margin-left: 6px;
padding: 1px 7px;
border-radius: 999px;
background: color-mix(in srgb, var(--mz-gut) 14%, transparent);
border: 1px solid color-mix(in srgb, var(--mz-gut) 32%, transparent);
}
/* Im Ring steht das Plus unter „von 8" und bleibt klein -- die große
Zahl dort ist und bleibt der Pflichtstand. */
.mz-ring__plus {
display: block;
margin-top: 1px;
font-size: .72rem;
}
/* Der Balken wächst NICHT über seinen Kasten hinaus (bei 10 von 1 wären
alle anderen Aufgaben optisch platt). Stattdessen eine hellere Kappe
am Ende: Man sieht, dass dort noch etwas ist, und die Zahl steht
oben in der Zeile.
`inset-inline-end` statt `right`: Die Kappe sitzt damit auch dann am
Ende des Balkens, wenn die Seite einmal von rechts nach links läuft. */
.mz-balken[data-ueber="ja"] {
position: relative;
background: color-mix(in srgb, var(--mz-gut) 22%, rgba(150, 186, 220, .13));
}
.mz-balken[data-ueber="ja"]::after {
content: "";
position: absolute; inset-block: 0; inset-inline-end: 0;
width: 10px;
background: var(--mz-gut);
}
@media (forced-colors: active) {
.mz-zeile__plus { border: 1px solid CanvasText; }
.mz-balken[data-ueber="ja"]::after { background: CanvasText; }
}
+45 -3
View File
@@ -178,15 +178,32 @@
const ring = $('ring');
ring.dataset.stufe = s.stufe;
ring.style.setProperty('--mz-anteil', String(s.gesamt.anteil));
ring.setAttribute('aria-label',
`${s.gesamt.erledigt} von ${s.gesamt.ziel} erledigt`);
/* Die Beschriftung für die Sprachausgabe steht weiter unten, dort
wo auch das Plus gesetzt wird -- sie stand hier schon einmal und
wäre damit zweimal dagewesen, ohne das "zusätzlich". */
$('ring-zahl').textContent = String(s.gesamt.erledigt);
$('ring-von').textContent = `von ${s.gesamt.ziel}`;
/* MEHR ALS GEFORDERT -- gezählt und sichtbar (07.10.2026).
Die Zahl im Ring bleibt der Pflichtstand, das Plus steht daneben.
Beides kommt fertig vom Server (`gesamt.extra`); hier wird nichts
nachgerechnet, sonst gäbe es zwei Rechenwege für dieselbe Zahl. */
const plus = $('ring-plus');
plus.hidden = !s.gesamt.extra;
if (s.gesamt.extra) {
plus.textContent = `+${s.gesamt.extra}`;
plus.title = `${s.gesamt.extra} mehr als gefordert – zählt mit.`;
}
ring.setAttribute('aria-label', s.gesamt.extra
? `${s.gesamt.erledigt} von ${s.gesamt.ziel} erledigt, ${s.gesamt.extra} zusätzlich`
: `${s.gesamt.erledigt} von ${s.gesamt.ziel} erledigt`);
$('kopf-monat').textContent = monatText(s.monat);
$('kopf-stand').textContent = s.gesamt.ziel === 0
? 'Für deine Rolle sind diesen Monat keine Ziele gesetzt.'
: `${s.gesamt.erledigt} von ${s.gesamt.ziel} erledigt`;
: `${s.gesamt.erledigt} von ${s.gesamt.ziel} erledigt`
+ (s.gesamt.extra ? ` · ${s.gesamt.extra} zusätzlich` : '');
const rest = $('kopf-rest');
if (s.monat !== s.jetztMonat) {
@@ -257,6 +274,20 @@
zahl.setAttribute('aria-label',
`${a.zahl} von ${a.ziel} ${a.ziel === 1 ? a.einheit[0] : a.einheit[1]}`);
kopf.append(zahl);
/* DAS PLUS ÜBER DEM ZIEL (07.10.2026).
Als EIGENES Zeichen neben der Zahl, nicht in sie hinein: Die
geforderte Zahl soll gleich bleiben, auch wenn jemand darüber
hinausgeht ("die zahl die die leute erreichen sollen sollen aber
immer gleich bleiben"). „5/2" allein liest sich wie ein Fehler
im Ziel; „5/2 +3" liest sich als das, was es ist. */
if (a.extra > 0) {
const mehr = el('span', 'mz-zeile__plus', `+${a.extra}`);
mehr.setAttribute('aria-label',
`${a.extra} mehr als gefordert, zählt mit`);
mehr.title = `${a.extra} mehr als gefordert – zählt mit.`;
kopf.append(mehr);
}
kopf.append(el('span', 'mz-zeile__pfeil', '›'));
/* NUR DIESE ZEILE AUF- UND ZUKLAPPEN, nicht die ganze Liste neu
@@ -290,6 +321,12 @@
const fuell = el('span', 'mz-balken__fuell');
fuell.style.setProperty('--mz-anteil',
String(a.ziel ? Math.min(100, Math.round((a.zahl / a.ziel) * 100)) : 0));
/* DER BALKEN BLEIBT BEI 100 % STEHEN -- und sagt trotzdem, dass es
mehr war. Ein Balken, der über seinen Kasten hinauswächst, hat
keine Skala mehr: Bei 10 von 1 wären alle anderen Aufgaben
optisch platt. Stattdessen bekommt er eine zweite, hellere Kappe
am Ende; die ZAHL steht als „+N" oben in der Zeile. */
if (a.extra > 0) balken.dataset.ueber = 'ja';
balken.append(fuell);
li.append(balken);
@@ -953,9 +990,14 @@
td.append(punkt);
td.append(document.createTextNode(
x.erreicht === null ? 'nicht gefordert' : `${x.zahl}/${x.ziel}`));
/* Auch im Verlauf: Was über dem Ziel lag, bleibt sichtbar.
Sonst sieht ein Monat mit Mehrarbeit später genauso aus wie
einer, der gerade so gereicht hat. */
if (x.extra > 0) td.append(el('span', 'mz-zeile__plus', `+${x.extra}`));
tr.append(td);
}
const tg = el('td', 'mz-wert', `${m.gesamt.erledigt}/${m.gesamt.ziel}`);
if (m.gesamt.extra > 0) tg.append(el('span', 'mz-zeile__plus', `+${m.gesamt.extra}`));
tg.dataset.schild = 'Gesamt';
tr.append(tg);
koerper.append(tr);