Scouting: links die normalen Creator, rechts die Premium
Filipe: "ich will dass es da in der mitte eine trennung gibt. links sollen normale creator sein und rechts premium creator. es gibt bei tiktok naemlich diese zwei optionen von streamer ... auch dass wenn man die eintraegt soll man aussuchen koennen." Jede Stufe der Pipeline hat jetzt zwei Spalten mit einer Trennlinie dazwischen. Die Trennung sitzt IN der Stufe, nicht einmal ueber der ganzen Seite: Zwei komplette Pipelines nebeneinander haetten jede Stufenueberschrift verdoppelt und die beiden Seiten waeren nie auf gleicher Hoehe gewesen. GENAU ZWEI WERTE, kein "weiss nicht". Anders als bei `netzwerk`, wo "noch nicht gefragt" eine eigene gueltige Antwort ist: Dort wird eine fremde Tatsache festgehalten, hier eine eigene Absicht -- und deren Normalfall ist "normal". NULL wird als "normal" gelesen, der eine vorhandene Lead steht damit links, ohne dass ihm etwas unterstellt wird. DIE ART UEBERLEBT DIE UEBERGABE. Beim Creator-Onboarding wandert sie auf die Person und ist in der Personenverwaltung aenderbar. Ohne das endet die Angabe genau dort, wo sie zum ersten Mal vertraglich zaehlt. Die Schwelle misst den STUFENKASTEN (@container), nicht das Fenster -- der Fehler vom 06.09.2026 im selben Haus. Auf dem Handy liegen die Spalten untereinander, die senkrechte Linie faellt weg. ZWEI FUNDE BEIM BAUEN, beide von Hauswachen: * `pruef-fingermass` fand, dass meine neue Handy-Messung mit `setViewportSize` statt eigenem Kontext lief -- ohne `hasTouch` greift keine einzige Regel aus `@media (pointer: coarse)`. * Die Klassen hiessen zuerst `.spalte__*` -- die gehoeren `aufgaben.css`, und scouting.html laedt die VOR scouting.css. `margin-left: auto` aus dem Aufgabenbrett zog die Zahl 560 px von ihrem Wort weg, ohne dass eine Pruefung rot wurde. Jetzt `.art-spalte__*`, und der Abstand wird gemessen. pruef-scouting-felder: 28 -> 64 Pruefungen, gruen. Zwei Gegenproben gefahren (Trennung deaktiviert, Spaltenreihenfolge gedreht) -- beide schlugen an. Dazu gruen: haus-trennung, css-klassen, personen-liste, personen-kachel, hand-personen, schranke, formulare, lesbarkeit, agentur, deutsche-texte, tippziele, leerzustand, fingermass. Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
@@ -426,6 +426,12 @@ Der Code gilt einmal fuer die `
|
||||
/* ---------- Liste ----------------------------------------------------- */
|
||||
|
||||
let betreuerListe = [];
|
||||
/* Normal und Premium kommen vom Server (siehe die Personenliste).
|
||||
Die Vorgabe hier ist die Rueckfallebene fuer den Fall, dass ein
|
||||
alter Serverstand die Liste noch nicht mitschickt -- dann fehlt
|
||||
die Auswahl nicht, sie ist nur nicht nachgefuehrt. */
|
||||
let artenListe = ['normal', 'premium'];
|
||||
let artName = { normal: 'Normal', premium: 'Premium' };
|
||||
|
||||
/** Ein oder zwei Buchstaben aus einem Namen.
|
||||
*
|
||||
@@ -562,6 +568,22 @@ Der Code gilt einmal fuer die `
|
||||
anderen grauen Woertern -- auf einer Kachel, die ohnehin blasser
|
||||
ist, hat es niemand gesehen. Jetzt ist es eine Marke in der
|
||||
Warnfarbe. */
|
||||
/* PREMIUM STEHT NEBEN DER ROLLE (06.10.2026).
|
||||
|
||||
"Creator" allein sagt nicht mehr alles, seit es die beiden Arten
|
||||
gibt, die TikTok kennt. Die Marke steht deshalb direkt neben der
|
||||
Rolle und nicht im Zahlenband -- sie beschreibt, WER jemand ist,
|
||||
nicht wie viel er tut.
|
||||
|
||||
Nur Premium bekommt eine Marke, genau wie in der Pipeline:
|
||||
"Normal" auf jeder zweiten Kachel wiederholte nur, was ohnehin
|
||||
der Normalfall ist. */
|
||||
if (p.rolle === 'creator' && p.creator_art === 'premium') {
|
||||
const a = el('span', 'marke-rolle', 'Premium');
|
||||
a.dataset.art = 'premium';
|
||||
a.title = 'Premium-Creator – die zweite der beiden Arten, die TikTok kennt.';
|
||||
marken.append(a);
|
||||
}
|
||||
if (!p.aktiv) {
|
||||
const g = el('span', 'marke-rolle', 'gesperrt');
|
||||
g.dataset.rolle = 'gesperrt';
|
||||
@@ -637,6 +659,44 @@ Der Code gilt einmal fuer die `
|
||||
links.append(el('div', 'person__bezug', `gehört zu ${p.manager_name}`));
|
||||
}
|
||||
|
||||
/* NORMAL ODER PREMIUM — änderbar (06.10.2026).
|
||||
|
||||
Beim Creator-Onboarding kommt die Art aus der Scout-Pipeline mit.
|
||||
Danach hängt sie an der Person, und hier wird sie geändert: Ein
|
||||
Vertrag kann wechseln, und ein Lead, aus dem die Angabe einmal
|
||||
stammte, kann längst gelöscht sein.
|
||||
|
||||
Dieselbe Bauart wie „Betreut von" direkt darunter — ein Auswahlfeld,
|
||||
das beim Umstellen sofort speichert. Kein eigener Speichern-Knopf:
|
||||
Bei einer Auswahl mit zwei Werten wäre er ein zweiter Klick, den
|
||||
man vergisst, und dann steht etwas anderes da, als man sieht. */
|
||||
if (p.rolle === 'creator') {
|
||||
const a = el('div', 'betreuung');
|
||||
const as = el('label', 'betreuung__schild', 'Art');
|
||||
as.htmlFor = 'creator-art-' + p.id;
|
||||
const aw = el('select', 'betreuung__wahl');
|
||||
aw.id = 'creator-art-' + p.id;
|
||||
for (const w of artenListe) aw.append(new Option(artName[w] || w, w));
|
||||
aw.value = p.creator_art === 'premium' ? 'premium' : 'normal';
|
||||
aw.addEventListener('change', async () => {
|
||||
aw.disabled = true; melde('');
|
||||
try {
|
||||
const antwort = await hole(`/workspace/api/verwaltung/personen/${p.id}/creator-art`, {
|
||||
method: 'PUT',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify({ creator_art: aw.value }),
|
||||
});
|
||||
if (!antwort.ok) {
|
||||
melde(sagWas((await antwort.json().catch(() => ({}))).fehler, 'Ging nicht.'));
|
||||
return;
|
||||
}
|
||||
await laden();
|
||||
} catch { /* umgeleitet */ } finally { aw.disabled = false; }
|
||||
});
|
||||
a.append(as, aw);
|
||||
links.append(a);
|
||||
}
|
||||
|
||||
/* Zuständigkeit. Steht nur bei Creator und nur dann, wenn es
|
||||
überhaupt einen Scout gibt, dem man sie geben könnte. */
|
||||
if (p.rolle === 'creator' && betreuerListe.length) {
|
||||
@@ -1257,8 +1317,13 @@ Der Code gilt einmal fuer die `
|
||||
try {
|
||||
const a = await hole('/workspace/api/verwaltung/personen');
|
||||
if (!a.ok) { melde('Personen konnten nicht geladen werden.'); return; }
|
||||
const { personen, betreuer, zusatzrollen } = await a.json();
|
||||
const { personen, betreuer, zusatzrollen, arten, art_name } = await a.json();
|
||||
betreuerListe = betreuer || [];
|
||||
/* Nur uebernehmen, wenn wirklich etwas kommt: `|| []` haette hier
|
||||
eine leere Auswahl ergeben -- ein Feld ohne einen einzigen
|
||||
Eintrag sieht aus wie ein Fehler und ist einer. */
|
||||
if (Array.isArray(arten) && arten.length) artenListe = arten;
|
||||
if (art_name) artName = art_name;
|
||||
zusatzAbschnitte = Array.isArray(zusatzrollen) ? zusatzrollen : [];
|
||||
rollenwahlErgaenzen(zusatzrollen);
|
||||
alle = personen;
|
||||
|
||||
Reference in New Issue
Block a user