diff --git a/CHANGELOG.md b/CHANGELOG.md index 23af665..aadc31e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,9 @@ Versionierung [semantisch](https://semver.org/lang/de/). ## [Unreleased] – 2026-07-14 · SysnaptiK Neural Rebrand ### Marke & Plattform +- **NeuralNet-Buttons direkt gebunden:** Kontakt- und Chat-Buttons erhalten nach + jedem Rendern eigene Handler. Damit öffnet eine Verbindung unabhängig von der + Ereignisweitergabe des umgebenden Panels zuverlässig den Nachrichtenbereich. - **NeuralNet-Chat öffnet sofort:** Der Klick auf eine Verbindung schaltet das Gespräch samt Eingabefeld nun unabhängig vom anschließenden Verlaufsabruf frei; Chat-Aktionen sind explizit als Buttons markiert. diff --git a/mindfluxfuture.md b/mindfluxfuture.md index ba38eca..b87a3e3 100644 --- a/mindfluxfuture.md +++ b/mindfluxfuture.md @@ -490,6 +490,7 @@ Der Verdacht „Profilbutton fehlt / Einstellungen nicht im Profil / irgendwas i > zurückziehen) und private Nachrichten nach bestätigter Verbindung sind umgesetzt. > Leere Erfolgsantworten des API-Backends werden im Client robust verarbeitet. > Der Gesprächsbereich öffnet unmittelbar beim Auswählen einer bestätigten Verbindung. +> Die dynamisch gerenderten Kontakt- und Chat-Aktionen werden direkt gebunden. > Blockieren, Melden/Moderation, Duelle und Lernlobby bleiben die nächsten Ausbauschritte. > Ersetzt den `/soziales`-Platzhalter („Straßen? Wo wir hingehen, brauchen wir keine Straßen!"). Ziel: User können sich befreunden, intern miteinander schreiben, gemeinsam lernen und Achievements vergleichen – **vollständig selbst gehostet, ohne einen einzigen externen Dienst**, und DSGVO-konform von Grund auf. diff --git a/src/main/resources/static/js/neuralnet.js b/src/main/resources/static/js/neuralnet.js index 9d228cf..c004631 100644 --- a/src/main/resources/static/js/neuralnet.js +++ b/src/main/resources/static/js/neuralnet.js @@ -36,6 +36,7 @@ q('[data-nn-connections]').innerHTML = data.connections.length ? data.connections.map(function (name) { return item(name, ''); }).join('') : 'Noch keine Verbindungen.'; + bindConnectionActions(); } async function refresh() { var data = await api('/overview'); @@ -60,6 +61,30 @@ q('[data-nn-partner]').textContent = user; q('[data-nn-messages]').innerHTML = '
Nachrichten werden geladen …
'; } + async function selectChat(user) { + openChat(user); + try { await loadChat(); } catch (error) { message(error.message); } + } + function bindConnectionActions() { + q('[data-nn-incoming]').querySelectorAll('[data-action]').forEach(function (button) { + button.onclick = async function () { + try { + if (button.dataset.action === 'accept') await api('/requests/' + encodeURIComponent(button.dataset.user) + '/accept', 'POST'); + if (button.dataset.action === 'decline') await api('/requests/' + encodeURIComponent(button.dataset.user) + '/decline', 'POST'); + await refresh(); + } catch (error) { message(error.message); } + }; + }); + q('[data-nn-outgoing]').querySelectorAll('[data-action]').forEach(function (button) { + button.onclick = async function () { + try { await api('/requests/' + encodeURIComponent(button.dataset.user), 'DELETE'); await refresh(); } + catch (error) { message(error.message); } + }; + }); + q('[data-nn-connections]').querySelectorAll('[data-action="chat"]').forEach(function (button) { + button.onclick = function () { selectChat(button.dataset.user); }; + }); + } function message(text) { var hint = q('.nn-head p'); hint.textContent = text; @@ -76,22 +101,6 @@ } catch (error) { message(error.message); } refresh(); }; - q('.nn-sidebar').onclick = async function (event) { - var button = event.target.closest('[data-action]'); - if (!button) return; - var user = button.dataset.user, action = button.dataset.action; - try { - if (action === 'chat') { - openChat(user); - try { await loadChat(); } catch (error) { message(error.message); } - return; - } - if (action === 'accept') await api('/requests/' + encodeURIComponent(user) + '/accept', 'POST'); - if (action === 'decline') await api('/requests/' + encodeURIComponent(user) + '/decline', 'POST'); - if (action === 'cancel') await api('/requests/' + encodeURIComponent(user), 'DELETE'); - await refresh(); - } catch (error) { message(error.message); } - }; q('[data-nn-compose]').onsubmit = async function (event) { event.preventDefault(); try { diff --git a/src/main/resources/templates/soziales.html b/src/main/resources/templates/soziales.html index 8fa3f01..262493f 100644 --- a/src/main/resources/templates/soziales.html +++ b/src/main/resources/templates/soziales.html @@ -4,7 +4,7 @@