feat: Kategorie/Status-Auswahl im Meldung-Modal, vorbelegt mit aktuellen Werten

Modal hat jetzt zwei Dropdowns (Kategorie, Status/Dringlichkeit) oberhalb
des Freitextfelds, vorbelegt mit den aktuellen Karten-Werten - man
korrigiert nur, was falsch ist, statt alles neu waehlen zu muessen.
meldung.oeffnen() nimmt dafuer kategorie/dringlichkeit entgegen, der
generische Rahmen bleibt erhalten (felder:false blendet die Auswahl fuer
kuenftige nicht-kategorisierungsbezogene Meldungen aus).

aufSpeichern bekommt jetzt {text, kategorie, dringlichkeit} statt nur
Freitext - mit Playwright verifiziert (Vorbelegung + tatsaechlicher
POST-Body).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015vtvcyNkapuDh583643hNs
This commit is contained in:
Jeuner 2026-08-25 00:44:04 +02:00
parent 09b8fcabae
commit 0d7c92644f

View file

@ -491,6 +491,10 @@ z-index:20;align-items:center;justify-content:center;padding:20px}
box-shadow:0 12px 40px rgba(0,0,0,.3)} box-shadow:0 12px 40px rgba(0,0,0,.3)}
.modal h3{margin:0 0 4px;font-size:15px} .modal h3{margin:0 0 4px;font-size:15px}
.modal-kontext{color:var(--muted);font-size:12.5px;margin:0 0 10px} .modal-kontext{color:var(--muted);font-size:12.5px;margin:0 0 10px}
.modal-auswahl{display:flex;gap:10px;margin-bottom:10px}
.modal-auswahl label{flex:1;display:flex;flex-direction:column;gap:3px;font-size:11.5px;color:var(--muted)}
.modal-auswahl select{font:inherit;font-size:13px;padding:5px 6px;border-radius:7px;
border:1px solid var(--rand);background:var(--bg);color:var(--fg)}
.modal textarea{width:100%;min-height:90px;font:inherit;font-size:13px;padding:8px; .modal textarea{width:100%;min-height:90px;font:inherit;font-size:13px;padding:8px;
border-radius:8px;border:1px solid var(--rand);background:var(--bg);color:var(--fg);resize:vertical} border-radius:8px;border:1px solid var(--rand);background:var(--bg);color:var(--fg);resize:vertical}
.modal-aktionen{display:flex;justify-content:flex-end;gap:8px;margin-top:12px} .modal-aktionen{display:flex;justify-content:flex-end;gap:8px;margin-top:12px}
@ -600,6 +604,10 @@ color:var(--gut);border-radius:999px;padding:1px 8px;font-size:11px;font-weight:
<div class="modal"> <div class="modal">
<h3 id="meldungTitel">Meldung</h3> <h3 id="meldungTitel">Meldung</h3>
<p class="modal-kontext" id="meldungKontext"></p> <p class="modal-kontext" id="meldungKontext"></p>
<div class="modal-auswahl">
<label>Kategorie<select id="meldungKategorie"></select></label>
<label>Status<select id="meldungStatus"></select></label>
</div>
<textarea id="meldungTextfeld" placeholder="Was ist hier nicht richtig?"></textarea> <textarea id="meldungTextfeld" placeholder="Was ist hier nicht richtig?"></textarea>
<div class="modal-aktionen"> <div class="modal-aktionen">
<button id="meldungAbbrechen">Abbrechen</button> <button id="meldungAbbrechen">Abbrechen</button>
@ -725,8 +733,9 @@ function zeichneBoard(){
const id=btn.dataset.id, d=ANRUFE.find(x=>x.id===id); const id=btn.dataset.id, d=ANRUFE.find(x=>x.id===id);
meldung.oeffnen({ meldung.oeffnen({
titel:'Kategorisierung melden', titel:'Kategorisierung melden',
kontext:d?`${KAT[d.kategorie]||d.kategorie} · ${d.dringlichkeit} · ${d.name||'unbekannt'}`:'', kontext:d?`aktuell: ${KAT[d.kategorie]||d.kategorie} · ${d.dringlichkeit} · ${d.name||'unbekannt'}`:'',
aufSpeichern:text=>bewerte(id,'schlecht',{text}), kategorie:d&&d.kategorie, dringlichkeit:d&&d.dringlichkeit,
aufSpeichern:daten=>bewerte(id,'schlecht',daten),
}); });
}; };
}); });
@ -867,21 +876,36 @@ function toast(text){
// meldung.oeffnen({titel, kontext, aufSpeichern: text => {...}}) // meldung.oeffnen({titel, kontext, aufSpeichern: text => {...}})
// aufSpeichern wird erst nach Klick auf "Speichern" mit dem eingegebenen // aufSpeichern wird erst nach Klick auf "Speichern" mit dem eingegebenen
// Text aufgerufen; leere Eingaben werden abgewiesen (Fokus bleibt im Feld). // Text aufgerufen; leere Eingaben werden abgewiesen (Fokus bleibt im Feld).
const DRINGLICHKEITEN=['niedrig','normal','hoch','notfall'];
const meldung=(()=>{ const meldung=(()=>{
const overlay=document.getElementById('meldungOverlay'); const overlay=document.getElementById('meldungOverlay');
const titelEl=document.getElementById('meldungTitel'); const titelEl=document.getElementById('meldungTitel');
const kontextEl=document.getElementById('meldungKontext'); const kontextEl=document.getElementById('meldungKontext');
const auswahlEl=document.querySelector('.modal-auswahl');
const katSel=document.getElementById('meldungKategorie');
const statusSel=document.getElementById('meldungStatus');
const textEl=document.getElementById('meldungTextfeld'); const textEl=document.getElementById('meldungTextfeld');
let aufSpeichern=null; let aufSpeichern=null;
katSel.innerHTML=Object.keys(KAT).map(k=>`<option value="${k}">${esc(KAT[k])}</option>`).join('');
statusSel.innerHTML=DRINGLICHKEITEN.map(x=>`<option value="${x}">${x}</option>`).join('');
function schliessen(){ function schliessen(){
overlay.classList.remove('zeigen'); overlay.classList.remove('zeigen');
aufSpeichern=null; aufSpeichern=null;
} }
function oeffnen({titel,kontext,aufSpeichern:cb}){ // felder: true zeigt Kategorie/Status-Auswahl, vorbelegt mit den aktuellen
// Werten - man korrigiert nur, was falsch ist, statt alles neu waehlen zu
// muessen. aufSpeichern bekommt {text, kategorie, dringlichkeit}.
function oeffnen({titel,kontext,kategorie,dringlichkeit,felder=true,aufSpeichern:cb}){
titelEl.textContent=titel||'Meldung'; titelEl.textContent=titel||'Meldung';
kontextEl.textContent=kontext||''; kontextEl.textContent=kontext||'';
kontextEl.style.display=kontext?'block':'none'; kontextEl.style.display=kontext?'block':'none';
auswahlEl.style.display=felder?'flex':'none';
if(felder){
katSel.value=kategorie||'sonstiges';
statusSel.value=dringlichkeit||'normal';
}
textEl.value=''; textEl.value='';
aufSpeichern=cb; aufSpeichern=cb;
overlay.classList.add('zeigen'); overlay.classList.add('zeigen');
@ -892,8 +916,13 @@ const meldung=(()=>{
const text=textEl.value.trim(); const text=textEl.value.trim();
if(!text){textEl.focus();return} if(!text){textEl.focus();return}
const cb=aufSpeichern; const cb=aufSpeichern;
const daten={text};
if(auswahlEl.style.display!=='none'){
daten.kategorie=katSel.value;
daten.dringlichkeit=statusSel.value;
}
schliessen(); schliessen();
if(cb)await cb(text); if(cb)await cb(daten);
}; };
overlay.onclick=e=>{if(e.target===overlay)schliessen()}; overlay.onclick=e=>{if(e.target===overlay)schliessen()};
document.addEventListener('keydown',e=>{ document.addEventListener('keydown',e=>{