Konfigurationsbereich auffindbar machen
Der Bereich war sichtbar, wurde aber übersehen: ein 12-Pixel-Knopf, der an der Überschrift klebte, während "Handel pausieren" und "Training starten" jeweils in einer eigenen Box mit normalgroßem Knopf sitzen. 71x26 px gegenüber 90x58 und 79x58 - das liest sich nicht als Bedienelement. Der Bereich sieht jetzt aus wie die beiden anderen: eigene Panel-Box, Knopf "Konfiguration bearbeiten" in gleicher Größe (114x58 px, 14px Schrift), daneben eine Zeile, die sagt, was dahintersteckt. Geöffnet heißt der Knopf "Konfiguration schließen". Zwei neue Tests halten die drei Haupt-Bedienelemente auf gleicher Linie: keine Inline-Styles, die Schrift oder Polsterung verkleinern, und jeder Knopf muss in einer Panel-Box stehen statt in einer Überschrift. 233 Tests (6 neue), ruff sauber. Im Browser durchgespielt: öffnen, 76 Felder, risk.cooldown_bars_after_exit geändert und sofort wirksam, schließen.
This commit is contained in:
+19
-10
@@ -131,15 +131,23 @@ _DASHBOARD = r"""<!doctype html>
|
||||
</div>
|
||||
</section>
|
||||
<section id="config-section" hidden>
|
||||
<h2>Konfiguration <button id="cfg-toggle" class="ghost" style="font-size:12px;padding:3px 9px">anzeigen</button></h2>
|
||||
<div class="panel" id="cfg-panel" hidden>
|
||||
<div class="hint" id="cfg-meta"></div>
|
||||
<div id="cfg-sections"></div>
|
||||
<div class="row" style="margin-top:14px; border-top:1px solid var(--line); padding-top:14px">
|
||||
<button id="cfg-save">Änderungen speichern</button>
|
||||
<button id="cfg-revert" class="ghost">Eingaben verwerfen</button>
|
||||
<button id="cfg-reset" class="ghost">Alle Overlays zurücksetzen</button>
|
||||
<span class="hint" id="cfg-hint" style="margin:0"></span>
|
||||
<h2>Konfiguration</h2>
|
||||
<div class="panel">
|
||||
<div class="row">
|
||||
<button id="cfg-toggle">Konfiguration bearbeiten</button>
|
||||
<span class="hint" id="cfg-summary" style="margin:0">
|
||||
Alle Einstellungen ändern – Risiko, Strategie, Lernmodell, Börse.
|
||||
</span>
|
||||
</div>
|
||||
<div id="cfg-panel" hidden style="margin-top:14px; border-top:1px solid var(--line); padding-top:14px">
|
||||
<div class="hint" id="cfg-meta"></div>
|
||||
<div id="cfg-sections"></div>
|
||||
<div class="row" style="margin-top:14px; border-top:1px solid var(--line); padding-top:14px">
|
||||
<button id="cfg-save">Änderungen speichern</button>
|
||||
<button id="cfg-revert" class="ghost">Eingaben verwerfen</button>
|
||||
<button id="cfg-reset" class="ghost">Alle Overlays zurücksetzen</button>
|
||||
<span class="hint" id="cfg-hint" style="margin:0"></span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
@@ -393,7 +401,8 @@ async function loadConfig() {
|
||||
$("cfg-toggle").addEventListener("click", async () => {
|
||||
cfgOpen = !cfgOpen;
|
||||
$("cfg-panel").hidden = !cfgOpen;
|
||||
$("cfg-toggle").textContent = cfgOpen ? "ausblenden" : "anzeigen";
|
||||
$("cfg-toggle").textContent = cfgOpen ? "Konfiguration schließen" : "Konfiguration bearbeiten";
|
||||
$("cfg-toggle").className = cfgOpen ? "ghost" : "";
|
||||
if (cfgOpen) await loadConfig();
|
||||
});
|
||||
|
||||
|
||||
@@ -145,6 +145,38 @@ def test_hidden_sections_are_unhidden_by_the_status_loop(section_id: str):
|
||||
)
|
||||
|
||||
|
||||
PRIMARY_BUTTONS = ["trade-btn", "train-btn", "cfg-toggle"]
|
||||
|
||||
|
||||
@pytest.mark.parametrize("button_id", PRIMARY_BUTTONS)
|
||||
def test_primary_buttons_are_not_shrunk_by_inline_styles(button_id: str):
|
||||
"""Die Haupt-Bedienelemente sollen gleich aussehen.
|
||||
|
||||
Der Konfigurationsknopf war einmal ein 12-Pixel-Anhängsel an einer Überschrift und
|
||||
wurde schlicht übersehen. Inline-Styles, die Schrift oder Polsterung verkleinern,
|
||||
gehören hier nicht hin.
|
||||
"""
|
||||
match = re.search(rf'<button id="{button_id}"([^>]*)>', _DASHBOARD)
|
||||
assert match is not None, f"Knopf #{button_id} fehlt"
|
||||
attributes = match.group(1)
|
||||
for verboten in ("font-size", "padding"):
|
||||
assert verboten not in attributes, (
|
||||
f"#{button_id} verkleinert sich per Inline-Style ({verboten}) gegenüber den anderen"
|
||||
)
|
||||
|
||||
|
||||
@pytest.mark.parametrize("button_id", PRIMARY_BUTTONS)
|
||||
def test_primary_buttons_sit_inside_a_panel(button_id: str):
|
||||
"""Ein Knopf direkt in der Überschrift liest sich nicht als Bedienelement."""
|
||||
match = re.search(rf'<button id="{button_id}"[^>]*>', _DASHBOARD)
|
||||
before = _DASHBOARD[: match.start()]
|
||||
letzte_ueberschrift = before.rfind("<h2>")
|
||||
letztes_panel = before.rfind('class="panel"')
|
||||
assert letztes_panel > letzte_ueberschrift, (
|
||||
f"#{button_id} steht in einer Überschrift statt in einer Panel-Box"
|
||||
)
|
||||
|
||||
|
||||
def test_render_functions_are_called_by_the_status_loop():
|
||||
body = function_body(script_body(), "refresh")
|
||||
for name in ("renderTrading", "renderTraining"):
|
||||
|
||||
Reference in New Issue
Block a user