Einsatz-je-Pfad-Feld war nicht bedienbar - auf das bewaehrte Muster umgebaut

User: "Einsatz je Pfad kann ich nichts eingeben".

URSACHE - mein erster Entwurf hat ein EIGENES Markup erfunden, statt das zu
nehmen, das im Projekt nachweislich funktioniert. Zwei Fehler darin:

(1) KEIN `inputmode`. Alle funktionierenden Felder des Projekts (SL, TP,
    Gewinn-Close, Notfall-Close) tragen `inputmode="decimal"` - am Handy
    erscheint sonst keine brauchbare Zahlentastatur. Das allein macht ein Feld
    praktisch unbedienbar, obwohl es sichtbar und technisch "aktiv" ist.
(2) Die Inputs steckten in einem <b> innerhalb einer `.kv`-Zeile. `.kv` ist
    `display:flex; align-items:baseline` und fuer das Muster
    <span>Label</span><b>Wert</b> gebaut - also fuer TEXT, nicht fuer
    Formularelemente.

BEHOBEN: identisches Markup wie die Trade-Leiste (`.tb-row` > `.tb-field` mit
<label> ueber <input>), plus `inputmode="decimal"` und `placeholder="global"`
statt "BRK"/"M15" - das macht zugleich sichtbar, was LEER bedeutet.

Zusaetzlich den Render gehaertet, damit der 1-s-Snapshot die Eingabe nicht
fressen kann: Feld mit Fokus wird gar nicht angefasst, und geschrieben wird nur
bei tatsaechlicher Aenderung (eine Zuweisung setzt sonst auch bei identischem
Text die Cursorposition zurueck).

⚠ LEHRE, die ueber diesen Fall hinausgeht: es gab in derselben Datei vier
funktionierende Vorbilder, und ich habe keines davon angesehen, bevor ich ein
neues Muster erfunden habe. Beim Hinzufuegen eines Bedienelements gehoert das
vorhandene Muster kopiert - dieselbe Klasse wie die dokumentierte Regel, beim
Wiederverwenden eines Backtest-Kerns die Live-KONFIGURATION mitzukopieren.

Reine Frontend-Aenderung (HTML/CSS/JS + v=184) - kein Neustart noetig, statische
Dateien werden je Request frisch von der Platte gelesen. Verifiziert: Tags
ausgeglichen (div 84/84, span 49/49), keine doppelten IDs, node --check gruen,
beide Felder mit inputmode im ausgelieferten HTML, v=184 wird ausgeliefert.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Axel Hocks
2026-08-19 19:22:56 +02:00
co-authored by Claude Opus 5
parent 8bbc58f336
commit 027267063d
3 changed files with 23 additions and 13 deletions
+9 -1
View File
@@ -174,7 +174,15 @@ function renderBrk(d) {
// wie beim Mindestgewinn-Feld). // wie beim Mindestgewinn-Feld).
[["am-brk", d.margin_brk], ["am-m15", d.margin_m15]].forEach(([id, v]) => { [["am-brk", d.margin_brk], ["am-m15", d.margin_m15]].forEach(([id, v]) => {
const el = $streng(id); const el = $streng(id);
if (el && document.activeElement !== el) el.value = (v > 0) ? v : ""; if (!el) return;
// ⚠ NICHT anfassen, solange das Feld den Fokus hat -- sonst frisst der
// 1-s-Snapshot die laufende Eingabe (der Grund, warum das Feld sich
// zuerst nicht bedienen liess).
if (document.activeElement === el) return;
const soll = (v > 0) ? String(v) : "";
// ⚠ Nur schreiben, wenn sich WIRKLICH etwas aendert: eine Zuweisung setzt
// auch bei gleichem Text die Cursorposition zurueck.
if (el.value !== soll) el.value = soll;
}); });
const b5 = d.squeeze_b5; const b5 = d.squeeze_b5;
if (!b5) { box.classList.add("hidden"); return; } if (!b5) { box.classList.add("hidden"); return; }
+7 -12
View File
@@ -12,7 +12,7 @@
⚠ LOKAL eingebunden, kein CDN: die PWA laeuft ueber WireGuard ⚠ LOKAL eingebunden, kein CDN: die PWA laeuft ueber WireGuard
und muss offline funktionieren. --> und muss offline funktionieren. -->
<link rel="stylesheet" href="pico.min.css?v=1"> <link rel="stylesheet" href="pico.min.css?v=1">
<link rel="stylesheet" href="style.css?v=183"> <link rel="stylesheet" href="style.css?v=184">
</head> </head>
<body> <body>
<!-- Modul-Menü (ganz oben) --> <!-- Modul-Menü (ganz oben) -->
@@ -171,16 +171,11 @@
<div class="kv"><span>Squeeze jetzt</span><b id="brk-squeeze"></b></div> <div class="kv"><span>Squeeze jetzt</span><b id="brk-squeeze"></b></div>
<div class="kv"><span>Liegende Orders</span><b id="brk-pending"></b></div> <div class="kv"><span>Liegende Orders</span><b id="brk-pending"></b></div>
<div class="kv" title="B5 = die VORAB fixierte Abbruchregel: nach 20 Trades ab 01.08. muss Verhaeltnis (OeGewinn/OeVerlust) >= 1,0 UND PF >= 1 sein."><span>B5-Regel</span><b id="brk-b5"></b></div> <div class="kv" title="B5 = die VORAB fixierte Abbruchregel: nach 20 Trades ab 01.08. muss Verhaeltnis (OeGewinn/OeVerlust) >= 1,0 UND PF >= 1 sein."><span>B5-Regel</span><b id="brk-b5"></b></div>
<div class="kv" title="Einsatz JE PFAD in Prozent der freien Margin. 0 = der globale Wert gilt (Feld unten bzw. margin_buffer_pct). WICHTIG: das ist KEINE gleichzeitige Reservierung - der Bot haelt EINE Position, es kann nie BRK und M15 nebeneinander geben. Das Feld steuert die GROESSE der jeweiligen Position. Manuelle Trades bleiben beim globalen Wert."> <div class="tb-row mg-row" title="Einsatz JE PFAD in Prozent der freien Margin. Leer oder 0 = der globale Wert gilt. WICHTIG: das ist KEINE gleichzeitige Reservierung - der Bot haelt EINE Position, es kann nie BRK und M15 nebeneinander geben. Das Feld steuert die GROESSE der jeweiligen Position. Manuelle Trades bleiben beim globalen Wert.">
<span>Einsatz je Pfad</span> <span class="tb-field"><label title="Einsatz % fuer autonome Breakout-Trades. Leer = globaler Wert.">Einsatz BRK %</label>
<b> <input id="am-brk" type="number" inputmode="decimal" step="1" min="0" max="99" placeholder="global"></span>
<input id="am-brk" type="number" min="0" max="99" step="1" placeholder="BRK" <span class="tb-field"><label title="Einsatz % fuer autonome M15-Trades. Leer = globaler Wert.">Einsatz M15 %</label>
style="width:56px" title="Einsatz % fuer Breakout-Trades (0 = global)"> <input id="am-m15" type="number" inputmode="decimal" step="1" min="0" max="99" placeholder="global"></span>
<span style="opacity:.6">/</span>
<input id="am-m15" type="number" min="0" max="99" step="1" placeholder="M15"
style="width:56px" title="Einsatz % fuer M15-Auto-Trades (0 = global)">
<span style="opacity:.6">%</span>
</b>
</div> </div>
<div id="brk-note" class="hint"></div> <div id="brk-note" class="hint"></div>
</section> </section>
@@ -393,6 +388,6 @@
</div> </div>
<div id="toast" class="toast hidden"></div> <div id="toast" class="toast hidden"></div>
<script src="app.js?v=183"></script> <script src="app.js?v=184"></script>
</body> </body>
</html> </html>
+7
View File
@@ -623,3 +623,10 @@ main{padding-bottom:4.1111rem} /* Platz für die fixe Leiste */
/* Lange Knopf-Beschriftung ("CIRCUIT BREAKER", 2026-08-19) sauber umbrechen /* Lange Knopf-Beschriftung ("CIRCUIT BREAKER", 2026-08-19) sauber umbrechen
statt ueberlaufen -- 6 Knoepfe teilen sich die Leistenbreite. */ statt ueberlaufen -- 6 Knoepfe teilen sich die Leistenbreite. */
.btn.tog{ line-height:1.1; word-break:break-word; hyphens:auto; } .btn.tog{ line-height:1.1; word-break:break-word; hyphens:auto; }
/* Einsatz je Pfad (2026-08-19): nutzt bewusst das bewaehrte `.tb-field`-Muster
der Trade-Leiste statt eines eigenen. Der erste Entwurf steckte die Inputs in
ein `<b>` innerhalb `.kv` (display:flex; align-items:baseline) und OHNE
`inputmode` — am Handy kam dort keine Zahlentastatur, das Feld war praktisch
nicht bedienbar (User: „Einsatz je Pfad kann ich nichts eingeben"). */
.mg-row{margin-top:0.4444rem;padding-top:0.4444rem;border-top:1px solid var(--line)}
.mg-row .tb-field input{width:7ch}