robot.json editieren - board

This commit is contained in:
chk
2026-06-10 17:27:07 +02:00
parent 45513cf714
commit 6b3053dd76
4 changed files with 322 additions and 0 deletions

View File

@@ -403,4 +403,77 @@ function initBoard() {
btn.disabled = false;
}
});
// ── Aktion 1: Z-Bereich Zuordnung ───────────────────────────────────────────
document.getElementById('btn-act-assign').addEventListener('click', async () => {
const zMin = document.getElementById('act-z-min').value;
const zMax = document.getElementById('act-z-max').value;
const set = document.getElementById('act-set').value.trim();
const link = document.getElementById('act-link').value.trim();
const result = document.getElementById('act-result');
if (zMin === '' || zMax === '') {
result.innerHTML = '<span style="color:#f87171">⚠ Bitte z-Bereich eingeben.</span>'; return;
}
if (!set && !link) {
result.innerHTML = '<span style="color:#f87171">⚠ Bitte mindestens Set oder Link angeben.</span>'; return;
}
result.innerHTML = '<span style="color:#555b6e">Zuordnung läuft …</span>';
try {
const r = await fetch('/api/robot/assign-by-z', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ zMin: parseFloat(zMin), zMax: parseFloat(zMax), set, link }),
});
const data = await r.json();
if (!r.ok || data.error) {
result.innerHTML = `<span style="color:#f87171">❌ ${data.error ?? `HTTP ${r.status}`}</span>`; return;
}
if (data.numChanged === 0) {
result.innerHTML = '<span style="color:#555b6e">Keine Marker im Z-Bereich gefunden.</span>'; return;
}
const moved = data.changes.filter(c => c.oldLink !== c.newLink).length;
result.innerHTML = `<span style="color:#22c55e">✅ ${data.numChanged} Marker geändert` +
(moved ? `, ${moved} verschoben` : '') + `.</span>` +
` IDs: ${data.changes.map(c => c.markerId).join(', ')}`;
loadBoardTable();
} catch (err) {
result.innerHTML = `<span style="color:#f87171">❌ ${err}</span>`;
}
});
// ── Aktion 2: Zuordnung entfernen ───────────────────────────────────────────
document.getElementById('btn-act-remove').addEventListener('click', async () => {
const markerId = document.getElementById('act-rm-id').value.trim();
const removeFrom = document.querySelector('input[name="act-rm-from"]:checked')?.value;
const result = document.getElementById('act-result');
if (!markerId) {
result.innerHTML = '<span style="color:#f87171">⚠ Bitte Marker-ID eingeben.</span>'; return;
}
result.innerHTML = '<span style="color:#555b6e">Verarbeite …</span>';
try {
const r = await fetch('/api/robot/remove-marker', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ markerId: parseInt(markerId, 10), removeFrom }),
});
const data = await r.json();
if (!r.ok) {
result.innerHTML = `<span style="color:#f87171">❌ ${data.error ?? `HTTP ${r.status}`}</span>`; return;
}
if (!data.changed) {
result.innerHTML = `<span style="color:#f87171">❌ ${data.error}</span>`; return;
}
const info = data.action === 'set-removed'
? `Set "${data.oldSet}" entfernt (bleibt in Link "${data.link}")`
: `Aus Link "${data.link}" entfernt`;
result.innerHTML = `<span style="color:#22c55e">✅ Marker ${markerId}: ${info}</span>`;
loadBoardTable();
} catch (err) {
result.innerHTML = `<span style="color:#f87171">❌ ${err}</span>`;
}
});
}

View File

@@ -20,6 +20,62 @@
</div>
</div>
<!-- ── Aktionen ─────────────────────────────────────────────────────────── -->
<div class="section full">
<h2>Aktionen</h2>
<!-- Aktion 1: Z-Bereich Zuordnung -->
<div style="margin-top:14px">
<p style="font-size:10px;color:var(--muted);text-transform:uppercase;letter-spacing:.06em;margin-bottom:8px">
Z-Bereich Zuordnung
</p>
<div style="display:flex;flex-wrap:wrap;align-items:center;gap:8px;font-size:12px;color:var(--text)">
z&nbsp;von
<input id="act-z-min" type="number" step="0.5" placeholder="-30"
style="width:72px;background:#1e293b;border:1px solid #334155;color:#c8cdd8;border-radius:3px;padding:3px 7px;font:inherit;font-size:12px">
bis
<input id="act-z-max" type="number" step="0.5" placeholder="-24"
style="width:72px;background:#1e293b;border:1px solid #334155;color:#c8cdd8;border-radius:3px;padding:3px 7px;font:inherit;font-size:12px">
mm &ensp;&ensp; Set
<input id="act-set" type="text" placeholder="A0"
style="width:72px;background:#1e293b;border:1px solid #334155;color:#c8cdd8;border-radius:3px;padding:3px 7px;font:inherit;font-size:12px">
Link
<input id="act-link" type="text" placeholder="Board"
style="width:90px;background:#1e293b;border:1px solid #334155;color:#c8cdd8;border-radius:3px;padding:3px 7px;font:inherit;font-size:12px">
<button id="btn-act-assign"
style="background:#1e293b;color:#c8cdd8;border:1px solid #4a9eff;border-radius:3px;padding:4px 14px;cursor:pointer;font:inherit;font-size:12px">
Zuordnen
</button>
</div>
</div>
<!-- Aktion 2: Zuordnung entfernen -->
<div style="margin-top:14px">
<p style="font-size:10px;color:var(--muted);text-transform:uppercase;letter-spacing:.06em;margin-bottom:8px">
Zuordnung entfernen
</p>
<div style="display:flex;flex-wrap:wrap;align-items:center;gap:8px;font-size:12px;color:var(--text)">
ID
<input id="act-rm-id" type="number" placeholder="z.B. 46"
style="width:90px;background:#1e293b;border:1px solid #334155;color:#c8cdd8;border-radius:3px;padding:3px 7px;font:inherit;font-size:12px">
aus
<label style="cursor:pointer;display:flex;align-items:center;gap:4px">
<input type="radio" name="act-rm-from" value="set" checked> Set
</label>
<label style="cursor:pointer;display:flex;align-items:center;gap:4px">
<input type="radio" name="act-rm-from" value="link"> Link&nbsp;<span style="color:var(--muted);font-size:10px">(nur falls Set leer)</span>
</label>
<button id="btn-act-remove"
style="background:#1e293b;color:#c8cdd8;border:1px solid #ef4444;border-radius:3px;padding:4px 14px;cursor:pointer;font:inherit;font-size:12px">
Entfernen
</button>
</div>
</div>
<!-- Ergebnis-Zeile -->
<div id="act-result" style="margin-top:10px;font-size:11px;min-height:18px;color:var(--muted)"></div>
</div>
<div class="section full">
<h2>Ausgabe / Log</h2>
<textarea id="log-board" readonly placeholder="(Ausgabe erscheint hier)"></textarea>