Update from Git Manager GUI
This commit is contained in:
@@ -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);
|
||||
@@ -2832,3 +2834,285 @@ select.wbf-cf-input option { background: var(--c-surface2); color: var(--c-text)
|
||||
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;
|
||||
}
|
||||
@@ -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('<i class="fas fa-' + (nowIgnored ? 'eye' : 'eye-slash') + '"></i> ' + (nowIgnored ? 'Entblocken' : 'Ignorieren'));
|
||||
} else {
|
||||
// Profil-Variante mit wbf-btn
|
||||
$b.html('<i class="fas fa-' + (nowIgnored ? 'eye' : 'eye-slash') + '"></i> ' + (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 = '<div class="wbf-ignored-bar">' +
|
||||
'<span><i class="fas fa-eye-slash"></i> Beitrag von ignoriertem Nutzer: <strong>' +
|
||||
$('<span>').text(name).html() + '</strong></span>' +
|
||||
'<button class="wbf-show-ignored-btn" type="button">Trotzdem anzeigen</button>' +
|
||||
'</div>' +
|
||||
'<div class="wbf-ignored-content" style="display:none">';
|
||||
$post.addClass('wbf-post--ignored');
|
||||
$post.prepend(barHtml);
|
||||
// Restlichen Inhalt in ignored-content verschieben
|
||||
$post.children(':not(.wbf-ignored-bar):not(.wbf-ignored-content)').wrapAll('<div class="wbf-ignored-content-inner">');
|
||||
$post.find('.wbf-ignored-content').append($post.find('.wbf-ignored-content-inner').children());
|
||||
$post.find('.wbf-ignored-content-inner').remove();
|
||||
}
|
||||
} else {
|
||||
// Entblockt → Overlay entfernen
|
||||
var $bar = $post.find('.wbf-ignored-bar');
|
||||
var $content = $post.find('.wbf-ignored-content');
|
||||
if ($bar.length) {
|
||||
// Inhalt wieder nach oben holen
|
||||
$content.children().unwrap();
|
||||
$bar.remove();
|
||||
$post.removeClass('wbf-post--ignored');
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
// Ignore-Liste im Profil aktualisieren (falls Nutzer auf eigener Profil-Seite)
|
||||
if (!nowIgnored) {
|
||||
// Eintrag aus der Liste entfernen
|
||||
$('#wbf-ignore-item-' + ignoredId).fadeOut(300, function () {
|
||||
$(this).remove();
|
||||
var remaining = $('#wbfIgnoreList .wbf-ignore-item').length;
|
||||
$('#wbfIgnoreCount').text(remaining);
|
||||
if (remaining === 0) {
|
||||
$('#wbfIgnoreList').replaceWith('<p class="wbf-profile-empty" id="wbfIgnoreEmpty">Du ignorierst niemanden.</p>');
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// Toast-Meldung
|
||||
var $t = $('<div class="wbf-toast">' + (d.message || (nowIgnored ? name + ' ignoriert.' : 'Ignorierung aufgehoben.')) + '</div>').appendTo('body');
|
||||
setTimeout(function () { $t.remove(); }, 3000);
|
||||
|
||||
}, function () {
|
||||
// Fehler-Callback
|
||||
$('.wbf-ignore-btn[data-id="' + ignoredId + '"]').prop('disabled', false);
|
||||
});
|
||||
});
|
||||
|
||||
/* "Trotzdem anzeigen" — eingeklappten ignorierten Post aufdecken */
|
||||
$(document).on('click', '.wbf-show-ignored-btn', function () {
|
||||
var $bar = $(this).closest('.wbf-ignored-bar');
|
||||
var $content = $bar.next('.wbf-ignored-content');
|
||||
$content.slideDown(200);
|
||||
$bar.hide();
|
||||
});
|
||||
|
||||
}(jQuery));
|
||||
Reference in New Issue
Block a user