From ead2f3a62aff27d77c7ffd325493bd4390fce897 Mon Sep 17 00:00:00 2001 From: M_Viper Date: Sun, 22 Mar 2026 00:40:17 +0100 Subject: [PATCH] Update from Git Manager GUI --- assets/css/forum-style.css | 292 ++++++++++++++++++++++++++++++++++++- assets/js/forum-script.js | 155 ++++++++++++++++++++ 2 files changed, 443 insertions(+), 4 deletions(-) diff --git a/assets/css/forum-style.css b/assets/css/forum-style.css index c553c54..0afb406 100644 --- a/assets/css/forum-style.css +++ b/assets/css/forum-style.css @@ -148,15 +148,17 @@ border-color: var(--c-border-d); } .wbf-btn:hover { background: var(--c-surface); color: var(--c-text); border-color: var(--c-primary); } -.wbf-btn--primary { - background: var(--c-primary); color: #fff; +.wbf-btn--primary, +a.wbf-btn--primary { + background: var(--c-primary); color: #fff !important; border-color: var(--c-primary); box-shadow: 0 0 12px rgba(0,180,216,.3); } -.wbf-btn--primary:hover { +.wbf-btn--primary:hover, +a.wbf-btn--primary:hover { background: var(--c-primary-d); border-color: var(--c-primary-d); box-shadow: 0 0 20px rgba(0,180,216,.45); - color: #fff; + color: #fff !important; } .wbf-btn--outline { background: transparent; border-color: rgba(255,255,255,.18); @@ -2831,4 +2833,286 @@ select.wbf-cf-input option { background: var(--c-surface2); color: var(--c-text) border-color: #fbbf24; color: #fbbf24; background: rgba(251,191,36,.12); +} + +/* ── Ignore / Block ────────────────────────────────────────────────────────── */ + +/* Eingeklappter Post-Wrapper */ +.wbf-post--ignored { + background: transparent; + border: 1px solid rgba(148,163,184,.15); + border-radius: var(--radius-sm); + overflow: hidden; +} + +/* Info-Bar die anstelle des Posts erscheint */ +.wbf-ignored-bar { + display: flex; + align-items: center; + justify-content: space-between; + gap: .75rem; + padding: .6rem 1rem; + background: rgba(71,85,105,.18); + color: var(--c-muted); + font-size: .8rem; + flex-wrap: wrap; +} +.wbf-ignored-bar span { + display: flex; + align-items: center; + gap: .4rem; +} +.wbf-ignored-bar strong { + color: var(--c-text-dim); +} + +/* "Trotzdem anzeigen"-Button in der ignored-bar */ +.wbf-show-ignored-btn { + background: none; + border: 1px solid rgba(148,163,184,.3); + border-radius: var(--radius-sm); + color: var(--c-muted); + font-size: .75rem; + padding: 2px 8px; + cursor: pointer; + transition: var(--transition); + white-space: nowrap; + flex-shrink: 0; +} +.wbf-show-ignored-btn:hover { + border-color: var(--c-primary); + color: var(--c-primary); +} + +/* Ignore-Button in Post-Footer */ +.wbf-ignore-btn { + background: none; + border: none; + cursor: pointer; + color: var(--c-muted); + padding: 2px 6px; + border-radius: 4px; + font-size: .82rem; + transition: var(--transition); + display: inline-flex; + align-items: center; + gap: .3rem; +} +.wbf-ignore-btn:hover { + color: #f97316; + background: rgba(249,115,22,.08); +} +/* Profil-Button-Variante (mit Border via wbf-btn--sm) */ +.wbf-btn.wbf-ignore-btn { + border: 1.5px solid rgba(148,163,184,.3); + padding: .35rem .75rem; +} +.wbf-btn.wbf-ignore-btn:hover, +.wbf-btn.wbf-ignore-btn[data-ignored="1"] { + border-color: #f97316; + color: #f97316; + background: rgba(249,115,22,.08); +} + +/* Ignorierte-Nutzer-Liste im Profil */ +.wbf-ignore-list { + display: flex; + flex-direction: column; + gap: .5rem; +} +.wbf-ignore-item { + display: flex; + align-items: center; + gap: .75rem; + padding: .6rem .75rem; + border-radius: var(--radius-sm); + background: rgba(255,255,255,.03); + border: 1px solid var(--c-border); + transition: var(--transition); +} +.wbf-ignore-item:hover { + background: rgba(255,255,255,.05); +} +.wbf-ignore-item__avatar { + flex-shrink: 0; + text-decoration: none; +} +.wbf-ignore-item__info { + display: flex; + flex-direction: column; + gap: .15rem; + min-width: 0; +} +.wbf-ignore-item__name { + font-size: .88rem; + font-weight: 600; + color: var(--c-text); + text-decoration: none; +} +.wbf-ignore-item__name:hover { + color: var(--c-primary); +} +.wbf-ignore-item__since { + font-size: .73rem; + color: var(--c-muted); +} + + +/* ── Profil-Tabs ─────────────────────────────────────────────────────────── */ +.wbf-profile-tabs { + display: flex; + gap: 0; + margin-bottom: 1.5rem; + border-bottom: 2px solid var(--c-border); + padding: 0; + overflow-x: auto; + scrollbar-width: none; +} +.wbf-profile-tabs::-webkit-scrollbar { display: none; } + +.wbf-profile-tab { + display: inline-flex; + align-items: center; + gap: .45rem; + padding: .7rem 1.1rem; + font-size: .88rem; + font-weight: 600; + color: var(--c-muted); + text-decoration: none; + border-bottom: 2px solid transparent; + margin-bottom: -2px; + transition: color .15s, border-color .15s; + white-space: nowrap; + letter-spacing: .01em; +} +.wbf-profile-tab:hover { + color: var(--c-text); + border-bottom-color: rgba(255,255,255,.2); +} +.wbf-profile-tab.active { + color: var(--c-primary); + border-bottom-color: var(--c-primary); +} +.wbf-profile-tab i { + font-size: .8rem; +} + +@media (max-width: 480px) { + .wbf-profile-tab { + padding: .6rem .75rem; + font-size: .82rem; + } +} + + +/* ── Notification Preferences ────────────────────────────────────────────── */ +.wbf-notif-pref-list { + display: flex; + flex-direction: column; + gap: .5rem; +} +.wbf-notif-pref { + display: flex; + align-items: center; + justify-content: space-between; + gap: 1rem; + padding: .75rem 1rem; + background: rgba(255,255,255,.03); + border: 1px solid var(--c-border); + border-radius: var(--radius-sm); + cursor: pointer; + transition: var(--transition); +} +.wbf-notif-pref:hover { + background: rgba(255,255,255,.05); +} +.wbf-notif-pref__info { + display: flex; + flex-direction: column; + gap: .2rem; +} +.wbf-notif-pref__info span { + font-size: .88rem; + font-weight: 600; + color: var(--c-text); + display: flex; + align-items: center; + gap: .4rem; +} +.wbf-notif-pref__info span i { + color: var(--c-primary); + font-size: .78rem; +} +.wbf-notif-pref__info small { + font-size: .75rem; + color: var(--c-muted); +} + +/* ── Toggle-Switch ───────────────────────────────────────────────────────── */ +.wbf-toggle { + position: relative; + width: 42px; + height: 24px; + background: rgba(148,163,184,.25); + border-radius: 12px; + transition: background .2s; + flex-shrink: 0; + cursor: pointer; + border: 1px solid rgba(148,163,184,.2); +} +.wbf-toggle--on { + background: var(--c-primary); + border-color: var(--c-primary); +} +.wbf-toggle__knob { + position: absolute; + top: 2px; + left: 2px; + width: 18px; + height: 18px; + background: #fff; + border-radius: 50%; + transition: transform .2s; + box-shadow: 0 1px 3px rgba(0,0,0,.3); +} +.wbf-toggle--on .wbf-toggle__knob { + transform: translateX(18px); +} + + +/* ── Profil-Sidebar: Online-Status & Zuletzt aktiv ──────────────────────── */ +.wbf-profile-online-badge { + display: inline-flex; + align-items: center; + gap: .35rem; + font-size: .75rem; + font-weight: 700; + color: #22c55e; + margin-top: .25rem; + letter-spacing: .02em; +} +.wbf-profile-online-dot { + width: 8px; + height: 8px; + border-radius: 50%; + background: #22c55e; + box-shadow: 0 0 6px #22c55e; + animation: wbf-pulse-green 2s infinite; + flex-shrink: 0; +} +@keyframes wbf-pulse-green { + 0%, 100% { opacity: 1; box-shadow: 0 0 6px #22c55e; } + 50% { opacity: .7; box-shadow: 0 0 10px #22c55e; } +} +.wbf-profile-lastseen { + display: inline-flex; + align-items: center; + gap: .3rem; + font-size: .73rem; + color: var(--c-muted); + margin-top: .25rem; +} +.wbf-profile-lastseen i { + font-size: .68rem; + opacity: .7; } \ No newline at end of file diff --git a/assets/js/forum-script.js b/assets/js/forum-script.js index 21e9b49..64e6cac 100644 --- a/assets/js/forum-script.js +++ b/assets/js/forum-script.js @@ -1944,6 +1944,55 @@ }); }); + + /* ── E-Mail-Adresse ändern ──────────────────────────────────────────── */ + $(document).on('click', '#wbfSaveEmail', function () { + var $btn = $(this); + var email = $('#wbfNewEmail').val().trim(); + var password = $('#wbfEmailPassword').val(); + var $msg = $('#wbfEmailMsg'); + if (!email) { $msg.removeClass('wbf-ok').addClass('wbf-err').text('Bitte E-Mail eingeben.'); return; } + if (!password) { $msg.removeClass('wbf-ok').addClass('wbf-err').text('Bitte Passwort eingeben.'); return; } + $btn.prop('disabled', true); + wbfPost('wbf_change_email', { new_email: email, password: password }, function (d) { + $msg.removeClass('wbf-err').addClass('wbf-ok').text(d.message || 'E-Mail geaendert.'); + $('#wbfNewEmail').val(''); + $('#wbfEmailPassword').val(''); + $btn.prop('disabled', false); + }, function (d) { + $msg.removeClass('wbf-ok').addClass('wbf-err').text(d.message || 'Fehler.'); + $btn.prop('disabled', false); + }); + }); + + /* ── Toggle-Switch (Notification Prefs) ─────────────────────────────── */ + $(document).on('click', '.wbf-toggle', function () { + var $t = $(this); + var on = String($t.data('state')) === '1'; + var val = on ? '0' : '1'; + $t.data('state', val).attr('data-state', val); + if (val === '1') { $t.addClass('wbf-toggle--on'); } + else { $t.removeClass('wbf-toggle--on'); } + }); + + /* ── Benachrichtigungs-Einstellungen speichern ───────────────────────── */ + $(document).on('click', '#wbfSaveNotifPrefs', function () { + var $btn = $(this); + var $msg = $('#wbfNotifPrefsMsg'); + $btn.prop('disabled', true); + wbfPost('wbf_save_notification_prefs', { + notify_reply: String($('#wbfNotifReply').data('state')) === '1' ? '1' : '0', + notify_mention: String($('#wbfNotifMention').data('state')) === '1' ? '1' : '0', + notify_message: String($('#wbfNotifMessage').data('state')) === '1' ? '1' : '0' + }, function (d) { + $msg.removeClass('wbf-err').addClass('wbf-ok').text(d.message || 'Gespeichert!'); + $btn.prop('disabled', false); + }, function (d) { + $msg.removeClass('wbf-ok').addClass('wbf-err').text(d.message || 'Fehler.'); + $btn.prop('disabled', false); + }); + }); + /* ── Lesezeichen ────────────────────────────────────────────────────── */ $(document).on('click', '.wbf-bookmark-btn', function () { var $btn = $(this); @@ -1959,4 +2008,110 @@ }); }); + /* ── Nutzer ignorieren / Ignorierung aufheben ────────────────────────── */ + $(document).on('click', '.wbf-ignore-btn', function () { + var $btn = $(this); + var ignoredId = parseInt($btn.data('id'), 10); + var name = $btn.data('name') || 'diesen Nutzer'; + var isIgnored = String($btn.data('ignored')) === '1'; + + // Bestätigung nur beim Ignorieren, nicht beim Entblocken + if (!isIgnored) { + if (!confirm(name + ' ignorieren?\n\nDessen Beiträge werden in Threads ausgeblendet und DMs werden blockiert.')) { + return; + } + } + + $btn.prop('disabled', true); + + wbfPost('wbf_toggle_ignore', { ignored_id: ignoredId }, function (d) { + var nowIgnored = d.ignored; + + // Alle Buttons mit dieser User-ID auf der Seite aktualisieren + $('.wbf-ignore-btn[data-id="' + ignoredId + '"]').each(function () { + var $b = $(this); + $b.data('ignored', nowIgnored ? '1' : '0'); + $b.attr('data-ignored', nowIgnored ? '1' : '0'); + + // Icon + Label aktualisieren + $b.find('i').attr('class', 'fas fa-' + (nowIgnored ? 'eye' : 'eye-slash')); + + // Button-Variante (Post-Footer, klein ohne wbf-btn) + if (!$b.hasClass('wbf-btn')) { + $b.text(''); + $b.append(' ' + (nowIgnored ? 'Entblocken' : 'Ignorieren')); + } else { + // Profil-Variante mit wbf-btn + $b.html(' ' + (nowIgnored ? 'Ignorierung aufheben' : 'Nutzer ignorieren')); + } + $b.prop('disabled', false); + }); + + // Posts des Users auf der aktuellen Seite ein-/ausblenden + $('.wbf-post, .wbf-post--op').each(function () { + var $post = $(this); + // Buttons innerhalb dieses Posts mit der User-ID suchen + var $ib = $post.find('.wbf-ignore-btn[data-id="' + ignoredId + '"]'); + if (!$ib.length) return; + + if (nowIgnored) { + // Ignoriert → Overlay zeigen wenn noch nicht vorhanden + if (!$post.find('.wbf-ignored-bar').length) { + var barHtml = '
' + + ' Beitrag von ignoriertem Nutzer: ' + + $('').text(name).html() + '' + + '' + + '
' + + '