Setup: gruene Bestaetigung statt Zuruecksetzen-Knopf (2026.9.1.11)

Passt die zugeordnete Entitaet zum Beispielnamen der Rolle (FELDER-Schluessel
"beispiel"), faerbt sich das Feld leicht gruen. Dieselbe Pruefung, die
entitaetScore() ohnehin mit 8 gewichtet - hier nur fuers Auge, damit man eine
richtig belegte Rolle sieht, ohne den langen Entity-Namen Zeichen fuer Zeichen
mit dem Beispiel daneben zu vergleichen.

Bewusst nur ein Hinweis, keine Bedingung: Installationen mit anderer
Datenquelle haben andere Namen und sind trotzdem richtig zugeordnet. Deshalb
gruen als Bestaetigung, aber kein Rot und keine Warnung, wenn es fehlt. Und
nicht waehrend gesucht wird - dann steht die Sucheingabe im Feld, nicht die
Zuordnung.

Die Farbe kommt per color-mix aus dem vorhandenen --ok-Ton und dem Feldgrund
statt aus einem eigenen Gruen, damit sie in beiden Themen ruhig bleibt.

"Auf Standard zurueckstellen" entfernt (Wunsch des Eigentuemers): Knopf,
Symbol, Zuhoerer, CSS und der nur dafuer vorhandene Helfer setupStandardwert().
Keine verwaisten Verweise mehr im Quelltext.

Panel als Modul geparst, Bundle und Manifest auf 2026.9.1.11.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-01 18:21:52 +02:00
parent 24bcc42655
commit 02187ee129
5 changed files with 36 additions and 29 deletions
@@ -1 +1 @@
{"version":"2026.9.1.10","sha256":"ea987e424774f4d2d0e7ea87f38f4b265f0605730515cacfd7193b2bb309b647","bytes":265700,"gebaut":"2026-09-01T15:30:31Z"}
{"version":"2026.9.1.11","sha256":"02c280790b205ea78638997a92aca00dbe7c099c2ad897ccf7eee50394e598b2","bytes":265708,"gebaut":"2026-09-01T16:21:24Z"}
@@ -3179,13 +3179,24 @@ function setupSchliessen() {
setupOffen = false; setupSucheOffen = null; setupZuordnung = null; setupZuordnungStart = null; render();
}
/* Standardwert (aus einstellungen.py, vor jedem Override) für ein Feld bzw.
eine Listenposition - Grundlage für den Zurücksetzen-Button. */
function setupStandardwert(key, idx) {
const standard = (ENTITAETEN && ENTITAETEN.standardwerte) || {};
const wert = standard[key];
if (idx == null) return wert || "";
return (wert || [])[idx] || "";
/* Passt die zugeordnete Entität zum Beispielnamen der Rolle?
Der Beispielname steht im Feld-Katalog (FELDER in einstellungen.py,
Schlüssel "beispiel") und ist der treffsicherste Hinweis, den es gibt -
entitaetScore() gewichtet ihn deshalb mit 8, mehr als jedes Stichwort.
Dieselbe Prüfung hier noch einmal, nur fürs Auge: wer eine Rolle richtig
belegt hat, soll das sehen, ohne den langen Entity-Namen mit dem Beispiel
daneben Zeichen für Zeichen zu vergleichen.
Bewusst nur ein Hinweis, keine Bedingung: es gibt Installationen mit
anderer Datenquelle, deren Namen nicht passen und die trotzdem richtig
zugeordnet sind. Deshalb grün als Bestätigung, aber kein Rot und keine
Warnung, wenn es fehlt. */
function entitaetPasstZumBeispiel(key, wert) {
if (!wert) return false;
const feld = setupKatalog().find((f) => f.key === key);
if (!feld || !feld.beispiel) return false;
return String(wert).toLowerCase().includes(String(feld.beispiel).toLowerCase());
}
/* Entity-IDs, die im Arbeitsstand mehr als einer Rolle zugeordnet sind. */
@@ -4516,20 +4527,19 @@ function entitaetZeilenMarkup(feldId, key, suchtext, aktuellerWert) {
}).join("");
}
const RESET_SVG = `<svg viewBox="0 0 20 20" width="15" height="15" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"><path d="M16 10a6 6 0 1 1-2-4.5"/><path d="M16 3v4h-4"/></svg>`;
function entitaetCombo(key, idx) {
const feldId = idx == null ? key : `${key}:${idx}`;
const wert = idx == null ? setupZuordnung[key] : (setupZuordnung[key] || [])[idx];
const offen = setupSucheOffen === feldId;
const anzeige = offen ? setupSuchtext : entitaetName(wert);
const standard = setupStandardwert(key, idx);
const zeigeReset = wert !== standard;
// Waehrend gesucht wird nicht gruen faerben - der Text im Feld ist dann
// die Sucheingabe und nicht die Zuordnung, die Faerbung wuerde ihm
// widersprechen.
const treffer = !offen && entitaetPasstZumBeispiel(key, wert);
return `<div class="entitaet-combo">
<span class="entitaet-combo-icon">${LUPE_SVG}</span>
<input type="text" class="entitaet-combo-input" autocomplete="off" spellcheck="false"
<input type="text" class="entitaet-combo-input${treffer ? " passend" : ""}" autocomplete="off" spellcheck="false"
placeholder="Entität suchen …" value="${esc(anzeige)}" data-setup-suche="${esc(feldId)}">
${zeigeReset ? `<button type="button" class="entitaet-combo-reset" title="Auf Standard zurücksetzen" data-setup-reset="${esc(feldId)}">${RESET_SVG}</button>` : ""}
${offen ? `<div class="entitaet-liste" data-setup-liste="${esc(feldId)}">${entitaetZeilenMarkup(feldId, key, setupSuchtext, wert)}</div>` : ""}
</div>`;
}
@@ -5202,15 +5212,6 @@ function ereignisseVerdrahten() {
setupSucheOffen = null; setupSuchtext = ""; render();
return;
}
const reset = e.target.closest("[data-setup-reset]");
if (reset) {
const feldId = reset.dataset.setupReset;
const teile = feldId.split(":");
if (teile.length === 2) setupZuordnung[teile[0]][Number(teile[1])] = setupStandardwert(teile[0], Number(teile[1]));
else setupZuordnung[feldId] = setupStandardwert(feldId, null);
render();
return;
}
if (e.target.closest("[data-setup-speichern]")) {
if (setupSpeichertLaeuft) return;
const duplikate = setupDuplikate();
@@ -1395,12 +1395,18 @@ img.carfix.klein { aspect-ratio: auto; height: auto; }
-webkit-appearance: none; appearance: none;
}
.entitaet-combo-input:focus { outline: none; border-color: var(--red); }
.entitaet-combo-reset {
position: absolute; right: 8px; top: 50%; transform: translateY(-50%);
width: 26px; height: 26px; display: flex; align-items: center; justify-content: center;
background: none; border: none; color: var(--fg3); cursor: pointer; padding: 0;
/* Die Zuordnung passt zum Beispielnamen der Rolle (siehe
entitaetPasstZumBeispiel). Bewusst zurueckhaltend: eine Bestaetigung im
Vorbeigehen, kein Ausrufezeichen. Deshalb die Farbe ueber color-mix aus dem
vorhandenen Erfolgs-Ton und dem Feldgrund statt eines eigenen Gruens - so
bleibt sie in beiden Themen ruhig und passt zum Rest der Oberflaeche.
Der Rahmen traegt etwas mehr Farbe als die Flaeche, sonst verschwindet die
Markierung auf dunklem Grund. */
.entitaet-combo-input.passend {
background: color-mix(in srgb, var(--ok, #2e7d32) 9%, var(--tile-deckend, var(--canvas)));
border-color: color-mix(in srgb, var(--ok, #2e7d32) 38%, var(--line));
}
.entitaet-combo-reset:active { color: var(--fg); }
.entitaet-combo-input.passend:focus { border-color: var(--red); }
.entitaet-liste {
position: absolute; z-index: 5; left: 0; right: 0; top: calc(100% + 4px);
max-height: 240px; overflow-y: auto;
@@ -1,7 +1,7 @@
{
"domain": "audi_dashboard",
"name": "Audi Dashboard",
"version": "2026.9.1.10",
"version": "2026.9.1.11",
"documentation": "https://gitea.nothaft.cloud/paul/audi-app/src/branch/main/README.md",
"issue_tracker": "https://gitea.nothaft.cloud/paul/audi-app/issues",
"codeowners": ["@paul"],