Update from Git Manager GUI

This commit is contained in:
2026-03-29 13:35:44 +02:00
parent c4c02c1b9d
commit 7ef72641f6
4 changed files with 995 additions and 22 deletions

View File

@@ -45,6 +45,19 @@
background-color: var(--mc-primary-hover);
}
.mc-upload-wrapper .mc-btn-secondary,
.mc-combined-wrapper .mc-btn-secondary {
background-color: rgba(255,255,255,.07);
color: #94a3b8;
border: 1px solid rgba(100,116,139,.3);
}
.mc-upload-wrapper .mc-btn-secondary:hover,
.mc-combined-wrapper .mc-btn-secondary:hover {
background-color: rgba(255,255,255,.12);
color: #cbd5e1;
border-color: rgba(100,116,139,.5);
}
/* =================================================================== */
/* === 2. MODAL SPECIFIC CSS (Fix für das Popup) ================== */
@@ -739,6 +752,37 @@
color: white;
}
/* Like-Button in Lightbox */
.mc-lightbox-like-wrap {
margin-top: 14px;
display: flex;
justify-content: center;
}
.mc-like-btn--lightbox {
position: static !important;
display: inline-flex !important;
align-items: center;
gap: 8px;
padding: 9px 20px !important;
border-radius: 24px !important;
font-size: 14px !important;
background: rgba(255,255,255,.1) !important;
border: 1px solid rgba(255,255,255,.2) !important;
color: #fff !important;
cursor: pointer;
transition: background .15s, border-color .15s !important;
}
.mc-like-btn--lightbox:hover {
background: rgba(239,68,68,.25) !important;
border-color: rgba(239,68,68,.4) !important;
}
.mc-like-btn--lightbox.mc-like-btn--active {
background: rgba(239,68,68,.2) !important;
border-color: rgba(239,68,68,.5) !important;
}
.mc-like-btn--lightbox .mc-like-icon { width: 18px; height: 18px; }
.mc-like-btn--lightbox .mc-like-label { font-size: 13px; opacity: .85; }
.mc-lightbox-close {
position: absolute;
top: -40px;
@@ -782,4 +826,314 @@
max-width: 90%;
padding: 20px;
}
}
/* =================================================================== */
/* === LIKE / VOTE BUTTON =========================================== */
/* =================================================================== */
.mc-like-btn {
position: absolute;
bottom: 8px;
right: 8px;
display: flex;
align-items: center;
gap: 5px;
padding: 5px 10px;
background: rgba(0,0,0,0.65);
border: 1px solid rgba(255,255,255,0.15);
border-radius: 20px;
color: #fff;
font-size: 12px;
font-weight: 600;
cursor: pointer;
z-index: 10;
transition: background 0.15s, border-color 0.15s, transform 0.1s;
backdrop-filter: blur(4px);
}
.mc-like-btn:hover {
background: rgba(239,68,68,0.3);
border-color: rgba(239,68,68,0.5);
transform: scale(1.08);
}
.mc-like-btn:active { transform: scale(0.96); }
.mc-like-btn:disabled { opacity: 0.5; cursor: wait; }
.mc-like-btn--active {
background: rgba(239,68,68,0.25);
border-color: rgba(239,68,68,0.6);
color: #fca5a5;
}
.mc-like-btn--active .mc-like-icon { stroke: #ef4444; fill: rgba(239,68,68,0.3); }
.mc-like-icon {
width: 14px;
height: 14px;
stroke: currentColor;
flex-shrink: 0;
transition: stroke 0.15s, fill 0.15s;
}
.mc-like-count { min-width: 12px; text-align: center; }
/* =================================================================== */
/* === KOMBINIERTER UPLOAD SHORTCODE ================================ */
/* =================================================================== */
.mc-combined-wrapper {
display: flex;
flex-direction: column;
gap: 8px;
}
.mc-combined-two-col {
display: flex;
flex-direction: column;
gap: 0;
}
.mc-combined-upload-btn {
display: inline-flex;
align-items: center;
justify-content: center;
gap: 10px;
width: 100%;
padding: 13px 20px;
background: var(--mc-primary);
color: #fff;
border: none;
border-radius: var(--mc-radius);
font-size: 15px;
font-weight: 600;
cursor: pointer;
transition: background 0.2s;
position: relative;
}
.mc-combined-upload-btn:hover { background: var(--mc-primary-hover); }
.mc-combined-method-tag {
position: absolute;
right: 14px;
top: 50%;
transform: translateY(-50%);
font-size: 10px;
font-weight: 600;
letter-spacing: .05em;
text-transform: uppercase;
padding: 2px 8px;
border-radius: 20px;
background: rgba(255,255,255,0.18);
color: #fff;
white-space: nowrap;
}
.mc-combined-divider {
display: flex;
align-items: center;
gap: 10px;
margin: 14px 0;
color: #64748b;
font-size: .75rem;
text-transform: uppercase;
letter-spacing: .06em;
}
.mc-combined-divider::before,
.mc-combined-divider::after {
content: '';
flex: 1;
height: 1px;
background: rgba(100,116,139,.25);
}
.mc-combined-verified-row {
display: flex;
align-items: center;
gap: 7px;
margin-top: 10px;
padding: 8px 14px;
background: rgba(34,197,94,.08);
border: 1px solid rgba(34,197,94,.2);
border-radius: 8px;
color: #22c55e;
font-size: .83rem;
font-weight: 500;
}
.mc-combined-verified-row svg {
flex-shrink: 0;
stroke: #22c55e;
}
.mc-combined-verified-row strong { font-weight: 700; }
/* Vote Board */
.mc-vote-board .mc-player-header h2 { font-size: 1.3rem; }
/* =========================================================================
VOTE BUTTONS (Daumen hoch / runter)
========================================================================= */
.mc-vote-wrap {
position: absolute;
bottom: 8px;
right: 8px;
display: flex;
gap: 4px;
z-index: 10;
}
.mc-vote-btn {
display: inline-flex;
align-items: center;
gap: 4px;
padding: 4px 9px;
background: rgba(0,0,0,.65);
border: 1px solid rgba(255,255,255,.15);
border-radius: 16px;
color: #fff;
font-size: 11px;
font-weight: 600;
cursor: pointer;
transition: background .15s, border-color .15s, transform .1s;
backdrop-filter: blur(4px);
-webkit-backdrop-filter: blur(4px);
line-height: 1;
}
.mc-vote-btn svg {
width: 13px;
height: 13px;
flex-shrink: 0;
stroke: #fff;
transition: stroke .15s, fill .15s;
}
.mc-vote-btn:hover { transform: scale(1.08); }
.mc-vote-btn:active { transform: scale(.94); }
.mc-vote-btn:disabled { opacity: .5; cursor: wait; }
/* Daumen hoch aktiv */
.mc-vote-up.mc-vote-btn--active {
background: rgba(34,197,94,.25);
border-color: rgba(34,197,94,.5);
color: #86efac;
}
.mc-vote-up.mc-vote-btn--active svg { stroke: #22c55e; fill: #22c55e; }
.mc-vote-up:not(.mc-vote-btn--active):hover { background: rgba(34,197,94,.2); border-color: rgba(34,197,94,.4); }
/* Daumen runter aktiv */
.mc-vote-down.mc-vote-btn--active {
background: rgba(239,68,68,.25);
border-color: rgba(239,68,68,.5);
color: #fca5a5;
}
.mc-vote-down.mc-vote-btn--active svg { stroke: #ef4444; fill: #ef4444; }
.mc-vote-down:not(.mc-vote-btn--active):hover { background: rgba(239,68,68,.2); border-color: rgba(239,68,68,.4); }
.mc-vote-count { min-width: 10px; text-align: center; }
/* In der Lightbox: größer und zentriert */
.mc-vote-wrap--lightbox {
position: static;
justify-content: center;
margin-top: 14px;
}
.mc-vote-wrap--lightbox .mc-vote-btn {
padding: 8px 18px;
font-size: 13px;
border-radius: 24px;
}
.mc-vote-wrap--lightbox .mc-vote-btn svg { width: 16px; height: 16px; }
/* =========================================================================
COMBINED UPLOAD WRAPPER
========================================================================= */
/* Alle Buttons im Combined-Wrapper: gleiche Basis wie Upload-Button */
.mc-combined-wrapper .mc-btn,
.mc-combined-wrapper a.mc-btn,
.mc-combined-upload-btn {
display: flex !important;
align-items: center;
justify-content: center;
gap: 8px;
width: 100%;
padding: 12px 20px;
border: none;
border-radius: var(--mc-radius);
font-weight: 600;
font-size: 15px;
cursor: pointer;
transition: background-color 0.2s ease, opacity 0.2s ease;
white-space: nowrap;
position: relative;
text-decoration: none;
box-sizing: border-box;
}
.mc-combined-upload-btn {
margin-top: 0;
}
.mc-combined-method-tag {
position: absolute;
right: 14px;
top: 50%;
transform: translateY(-50%);
font-size: 10px;
font-weight: 600;
letter-spacing: .05em;
text-transform: uppercase;
background: rgba(255,255,255,.15);
padding: 2px 8px;
border-radius: 20px;
color: rgba(255,255,255,.85);
}
.mc-combined-two-col {
display: flex;
flex-direction: column;
gap: 0;
}
.mc-combined-divider {
display: flex;
align-items: center;
gap: 10px;
padding: 6px 0;
color: rgba(148,163,184,.6);
font-size: 11px;
text-transform: uppercase;
letter-spacing: .06em;
}
.mc-combined-divider::before,
.mc-combined-divider::after {
content: '';
flex: 1;
height: 1px;
background: rgba(100,116,139,.2);
}
.mc-combined-verified-row {
display: flex;
align-items: center;
gap: 7px;
margin-top: 8px;
padding: 7px 12px;
background: rgba(34,197,94,.08);
border: 1px solid rgba(34,197,94,.2);
border-radius: 8px;
color: #22c55e;
font-size: 13px;
}
.mc-combined-verified-row svg {
flex-shrink: 0;
stroke: #22c55e;
}
/* =========================================================================
VOTE BOARD
========================================================================= */
.mc-vote-board .mc-player-avatar { font-size: 24px; }
/* Forum-Button — blaue Variante */
.mc-combined-forum-btn {
background-color: #2563eb !important;
color: #fff !important;
}
.mc-combined-forum-btn:hover {
background-color: #1d4ed8 !important;
opacity: 1 !important;
}

View File

@@ -0,0 +1,405 @@
/*
* MC Gallery PRO — Forum Bridge Styles
* Pfad: assets/css/mc-gallery-forum-bridge.css
*/
/* ── Verify-Panel unter der Gallery ──────────────────────────────────────── */
.mc-bridge-verify-wrap {
margin-top: 16px;
}
.mc-bridge-divider {
display: flex;
align-items: center;
gap: 10px;
margin: 14px 0;
color: var(--wbf-text-muted, #94a3b8);
font-size: .8rem;
text-transform: uppercase;
letter-spacing: .06em;
}
.mc-bridge-divider::before,
.mc-bridge-divider::after {
content: '';
flex: 1;
height: 1px;
background: var(--wbf-border, rgba(100,116,139,.25));
}
/* ── Forum-Card — gemeinsame Hülle ───────────────────────────────────────── */
.mc-bridge-card {
border-radius: 12px;
border: 1px solid rgba(56,189,248,.15);
background: rgba(15,23,42,.55);
overflow: hidden;
}
.mc-bridge-card--warn {
border-color: rgba(245,158,11,.22);
}
.mc-bridge-card--ok {
border-color: rgba(34,197,94,.22);
}
.mc-bridge-card-inner {
display: flex;
align-items: center;
gap: 16px;
padding: 16px 20px;
flex-wrap: wrap;
}
/* Quadratisches Icon-Kästchen */
.mc-bridge-card-icon {
width: 44px;
height: 44px;
border-radius: 10px;
background: rgba(56,189,248,.09);
border: 1px solid rgba(56,189,248,.18);
display: flex;
align-items: center;
justify-content: center;
flex-shrink: 0;
}
.mc-bridge-card-icon i {
font-size: 1.15rem;
color: #38bdf8;
}
/* Text-Block */
.mc-bridge-card-text {
flex: 1;
min-width: 0;
}
.mc-bridge-card-label {
font-size: .7rem;
text-transform: uppercase;
letter-spacing: .07em;
color: #475569;
margin-bottom: 3px;
}
.mc-bridge-card-desc {
font-size: .84rem;
color: #94a3b8;
line-height: 1.4;
}
.mc-bridge-card-desc strong {
color: #cbd5e1;
font-weight: 500;
}
/* Action-Spalte */
.mc-bridge-card-actions {
display: flex;
flex-direction: column;
gap: 7px;
flex-shrink: 0;
}
/* Haupt-Button */
.mc-bridge-action-btn {
display: inline-flex;
align-items: center;
justify-content: center;
gap: 7px;
padding: 8px 16px;
border-radius: 8px;
border: none;
cursor: pointer;
background: #38bdf8;
color: #0c1222;
font-size: .82rem;
font-weight: 700;
letter-spacing: .01em;
white-space: nowrap;
text-decoration: none;
transition: opacity .15s;
}
.mc-bridge-action-btn:hover { opacity: .85; text-decoration: none; color: #0c1222; }
.mc-bridge-action-btn--warn {
background: #f59e0b;
color: #1c1008;
}
/* Sekundär-Button */
.mc-bridge-action-btn-ghost {
display: inline-flex;
align-items: center;
justify-content: center;
gap: 7px;
padding: 7px 16px;
border-radius: 8px;
cursor: pointer;
background: transparent;
border: 1px solid rgba(100,116,139,.3);
color: #64748b;
font-size: .78rem;
font-weight: 500;
white-space: nowrap;
text-decoration: none;
transition: border-color .15s, color .15s;
}
.mc-bridge-action-btn-ghost:hover {
border-color: rgba(100,116,139,.5);
color: #94a3b8;
text-decoration: none;
}
.mc-bridge-action-btn-ghost i { font-size: .82rem; }
/* Verifiziert-Badge */
.mc-bridge-verified-badge {
display: inline-flex;
align-items: center;
gap: 6px;
padding: 7px 16px;
border-radius: 20px;
background: rgba(34,197,94,.1);
border: 1px solid rgba(34,197,94,.25);
color: #22c55e;
font-size: .8rem;
font-weight: 600;
flex-shrink: 0;
}
/* Nicht eingeloggt / nicht verknüpft — jetzt via .mc-bridge-card */
.mc-bridge-not-logged,
.mc-bridge-not-linked {
display: none; /* HTML-Ersatz durch mc-bridge-card */
}
.mc-bridge-btn-inline {
color: #38bdf8;
text-decoration: none;
font-weight: 600;
}
.mc-bridge-btn-inline:hover { text-decoration: underline; }
/* Eingeloggt & verknüpft — jetzt via .mc-bridge-card */
.mc-bridge-forum-linked { display: none; }
.mc-bridge-head-sm {
width: 44px;
height: 44px;
border-radius: 8px;
flex-shrink: 0;
image-rendering: pixelated;
}
.mc-bridge-forum-name { font-weight: 500; color: #e2e8f0; }
.mc-bridge-arrow { color: #475569; margin: 0 2px; }
.mc-bridge-mc-name-sm { font-weight: 600; color: #38bdf8; }
.mc-bridge-unverified-hint {
display: block;
font-size: .75rem;
color: #f59e0b;
margin-top: 2px;
}
.mc-bridge-verify-trigger {
display: inline-flex;
align-items: center;
gap: 7px;
padding: 8px 16px;
background: #f59e0b;
color: #1c1008;
border: none;
border-radius: 8px;
font-size: .82rem;
font-weight: 700;
cursor: pointer;
transition: opacity .15s;
white-space: nowrap;
flex-shrink: 0;
}
.mc-bridge-verify-trigger:hover { opacity: .85; }
.mc-bridge-verify-trigger:disabled { opacity: .5; cursor: wait; }
.mc-bridge-success {
display: flex;
align-items: center;
gap: 10px;
padding: 14px 18px;
background: rgba(34,197,94,.08);
border: 1px solid rgba(34,197,94,.22);
border-radius: 12px;
color: #22c55e;
font-size: .88rem;
font-weight: 500;
}
.mc-bridge-success i { font-size: 1.1rem; flex-shrink: 0; }
.mc-bridge-error {
margin-top: 8px;
padding: 10px 14px;
background: rgba(239,68,68,.08);
border: 1px solid rgba(239,68,68,.2);
border-radius: 8px;
color: #f87171;
font-size: .83rem;
}
.mc-bridge-error i { margin-right: 5px; }
/* ── Profil-Tab: Minecraft ────────────────────────────────────────────────── */
.mc-bridge-profile-tab {
padding: 4px 0;
}
.mc-bridge-intro {
color: var(--wbf-text-muted, #94a3b8);
margin-bottom: 14px;
font-size: .9rem;
}
/* Verknüpfte Karte */
.mc-bridge-linked-card {
display: flex;
align-items: center;
gap: 14px;
padding: 14px 16px;
border-radius: 10px;
border: 1px solid rgba(100,116,139,.2);
background: rgba(30,41,59,.5);
flex-wrap: wrap;
}
.mc-bridge-linked-card.is-verified {
border-color: rgba(34,197,94,.3);
background: rgba(34,197,94,.05);
}
.mc-bridge-linked-card.is-pending {
border-color: rgba(245,158,11,.25);
background: rgba(245,158,11,.04);
}
.mc-bridge-head {
width: 48px;
height: 48px;
border-radius: 6px;
image-rendering: pixelated;
flex-shrink: 0;
}
.mc-bridge-linked-info {
flex: 1;
min-width: 0;
display: flex;
flex-direction: column;
gap: 4px;
}
.mc-bridge-mc-name {
font-size: 1.05rem;
font-weight: 700;
color: var(--wbf-text, #e2e8f0);
}
.mc-bridge-server-hint {
font-size: .78rem;
color: var(--wbf-text-muted, #64748b);
}
.mc-bridge-server-hint i { margin-right: 3px; }
/* Badges */
.mc-bridge-badge {
display: inline-flex;
align-items: center;
gap: 5px;
padding: 2px 9px;
border-radius: 20px;
font-size: .78rem;
font-weight: 600;
}
.mc-bridge-badge--ok { background: rgba(34,197,94,.15); color: #22c55e; }
.mc-bridge-badge--wait { background: rgba(245,158,11,.15); color: #f59e0b; }
/* Buttons */
.mc-bridge-actions {
display: flex;
gap: 8px;
margin-left: auto;
}
.mc-bridge-btn {
padding: 6px 12px;
border: none;
border-radius: 6px;
font-size: .82rem;
font-weight: 600;
cursor: pointer;
transition: opacity .15s;
}
.mc-bridge-btn:disabled { opacity: .5; cursor: wait; }
.mc-bridge-btn--link {
background: var(--wbf-accent, #38bdf8);
color: #0f172a;
}
.mc-bridge-btn--link:hover { opacity: .85; }
.mc-bridge-btn--approve {
background: rgba(34,197,94,.2);
color: #22c55e;
}
.mc-bridge-btn--approve:hover { background: rgba(34,197,94,.35); }
.mc-bridge-btn--unlink {
background: rgba(239,68,68,.15);
color: #f87171;
}
.mc-bridge-btn--unlink:hover { background: rgba(239,68,68,.28); }
/* Pending-Hinweis */
.mc-bridge-pending-hint {
margin-top: 10px;
padding: 9px 13px;
background: rgba(245,158,11,.07);
border-left: 3px solid #f59e0b;
border-radius: 0 6px 6px 0;
font-size: .85rem;
color: #fcd34d;
line-height: 1.5;
}
.mc-bridge-pending-hint i { margin-right: 5px; }
/* Verknüpfungs-Formular */
.mc-bridge-link-form {
display: flex;
flex-wrap: wrap;
gap: 10px;
align-items: flex-end;
margin-bottom: 10px;
}
.mc-bridge-link-form label {
display: flex;
flex-direction: column;
gap: 4px;
font-size: .82rem;
color: var(--wbf-text-muted, #94a3b8);
}
.mc-bridge-link-form input,
.mc-bridge-link-form select {
padding: 7px 11px;
background: rgba(15,23,42,.6);
border: 1px solid rgba(100,116,139,.3);
border-radius: 6px;
color: var(--wbf-text, #e2e8f0);
font-size: .9rem;
min-width: 180px;
}
.mc-bridge-link-form input:focus,
.mc-bridge-link-form select:focus {
outline: none;
border-color: var(--wbf-accent, #38bdf8);
}
/* ── Admin-Badge in User-Tabelle ──────────────────────────────────────────── */
.mc-bridge-admin-mc-badge {
display: inline-flex;
align-items: center;
gap: 5px;
padding: 2px 7px;
background: rgba(56,189,248,.1);
border: 1px solid rgba(56,189,248,.25);
border-radius: 20px;
font-size: .78rem;
color: #38bdf8;
vertical-align: middle;
}
.mc-bridge-admin-mc-badge img {
width: 20px;
height: 20px;
border-radius: 3px;
image-rendering: pixelated;
}

41
assets/js/forum-bridge.js Normal file
View File

@@ -0,0 +1,41 @@
(function($){
$(document).on('click', '.mc-bridge-verify-trigger', function(){
console.log('[MC-Gallery] Forum-Login Button geklickt!');
if (typeof $ === 'undefined') { alert('jQuery nicht geladen!'); return; }
var $btn = $(this).prop('disabled', true);
var ajax = $btn.data('ajax');
var nonce = $btn.data('nonce');
var server = $btn.data('server') || $btn.closest('[data-server]').data('server') || '';
$btn.html('<i class="fas fa-spinner fa-spin"></i> Prüfe…');
$.post(ajax, {
action: 'mc_forum_verify_upload',
nonce: nonce,
server_id: server
})
.done(function(r){
if ( r.success ) {
$(document).trigger('mc_gallery_forum_verified', [ r.data ]);
if ( typeof window.mcGalleryOnVerified === 'function' ) {
window.mcGalleryOnVerified( r.data );
}
$btn.closest('.mc-bridge-verify-wrap')
.html('<div class="mc-bridge-success">'
+ '<i class="fas fa-check-circle"></i> Verifiziert als <strong>'
+ $('<span>').text(r.data.mc_username).html()
+ '</strong></div>');
} else {
var msg = (r.data && r.data.message) ? r.data.message : 'Fehler bei der Verifikation.';
$btn.closest('.mc-bridge-verify-wrap').find('.mc-bridge-error').remove();
$btn.closest('.mc-bridge-forum-linked, .mc-bridge-not-linked')
.after('<p class="mc-bridge-error"><i class="fas fa-times-circle"></i> ' + msg + '</p>');
$btn.prop('disabled', false).html('<i class="fas fa-sign-in-alt"></i> Mit Forum-Login verifizieren');
}
})
.fail(function(){
$btn.prop('disabled', false).html('<i class="fas fa-sign-in-alt"></i> Mit Forum-Login verifizieren');
alert('Netzwerkfehler. Bitte erneut versuchen.');
});
});
})(jQuery);

View File

@@ -119,16 +119,15 @@
function loadAlbums() {
const $select = $('#mc-upload-album');
$select.html('<option value="">Kein Album</option>').prop('disabled', true);
if (!sessionData.token || !sessionData.verified) return;
// Auch ohne Token laden, wenn Forum-Session aktiv
if ((!sessionData.token && !sessionData.verified) || !sessionData.username) return;
fetch(api + '/albums', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
token: sessionData.token,
username: sessionData.username,
server_id: sessionData.serverId
token: sessionData.token || '',
username: sessionData.username,
server_id: sessionData.serverId || ''
})
})
.then(response => response.json())
@@ -235,6 +234,23 @@
resetModal();
loadServers();
// Wenn User bereits forum-verifiziert ist: direkt zu Schritt 3 springen
if (mcGalleryPro.forumVerified) {
const fv = mcGalleryPro.forumVerified;
sessionData.verified = true;
sessionData.username = fv.mc_username;
sessionData.serverId = fv.server_id;
sessionData.token = null;
$('#mc-session-user').text(fv.display_name || fv.mc_username);
$('#mc_form_username').val(fv.mc_username);
$('#mc_form_server').val(fv.server_id);
$('#mc_form_token').val('');
switchStep(3);
loadAlbums();
}
}
function closeModal() {
@@ -245,6 +261,30 @@
setTimeout(resetModal, 300);
}
// Forum-Login: Auf globales Event reagieren
$(document).on('mc_gallery_forum_verified', function(e, data) {
if (!data || !data.mc_username || !data.server_id) {
showFeedback('Forum-Login: Ungültige Antwort vom Server.', 'error');
return;
}
sessionData.verified = true;
sessionData.username = data.mc_username;
sessionData.serverId = data.server_id;
sessionData.token = null; // Kein Token nötig
$('#mc-session-user').text(data.display_name || data.mc_username);
$('#mc_form_username').val(data.mc_username);
$('#mc_form_server').val(data.server_id);
$('#mc_form_token').val('');
showFeedback('✓ Erfolgreich mit Forum-Login verifiziert!', 'success');
setTimeout(() => {
switchStep(3);
console.log('[MC-Gallery] mc_gallery_forum_verified: switchStep(3) ausgeführt, Upload-Schritt sollte sichtbar sein.');
loadAlbums();
}, 800);
});
$(document).ready(function () {
loadServers();
@@ -264,6 +304,53 @@
}
});
// Forum-Login-Button im Modal (Schritt 1) — einmalig binden, NICHT inside btn-generate
$(document).on('click', '#mc-btn-forum-login', function () {
const serverId = $('#mc-upload-server').val();
if (!serverId || serverId === '') {
showFeedback('Bitte wähle einen Server aus.', 'error');
return;
}
const $btn = $(this);
const originalText = $btn.html();
$btn.prop('disabled', true).html('<span class="mc-loading"></span> Prüfe Forum-Login...');
$.ajax({
url: ajaxUrl,
method: 'POST',
dataType: 'json',
data: {
action: 'mc_forum_verify_upload',
nonce: mcGalleryPro.forumNonce || mcGalleryPro.nonce,
server_id: serverId
},
success: function (data) {
$btn.prop('disabled', false).html(originalText);
if (data.success && data.data && data.data.mc_username) {
sessionData.verified = true;
sessionData.username = data.data.mc_username;
sessionData.serverId = data.data.server_id;
sessionData.token = null;
$('#mc-session-user').text(data.data.display_name || data.data.mc_username);
$('#mc_form_username').val(data.data.mc_username);
$('#mc_form_server').val(data.data.server_id);
$('#mc_form_token').val('');
showFeedback('✓ Erfolgreich mit Forum-Login verifiziert!', 'success');
setTimeout(() => { switchStep(3); loadAlbums(); }, 800);
} else {
const msg = (data.data && data.data.message) ? data.data.message : (data.message || 'Verifizierung fehlgeschlagen.');
showFeedback(msg, 'error');
}
},
error: function () {
$btn.prop('disabled', false).html(originalText);
showFeedback('Netzwerkfehler bei der Forum-Login-Prüfung', 'error');
}
});
});
$('#mc-btn-generate').on('click', function () {
const username = $('#mc-upload-username').val().trim();
const serverId = $('#mc-upload-server').val();
@@ -432,9 +519,9 @@
const formData = new FormData();
formData.append('action', 'mc_gallery_create_album');
formData.append('mc_upload_nonce', mcGalleryPro.nonce);
formData.append('mc_token', sessionData.token);
formData.append('mc_token', sessionData.token || '');
formData.append('mc_username', sessionData.username);
formData.append('mc_server_id', sessionData.serverId);
formData.append('mc_server_id', sessionData.serverId || '');
formData.append('album_name', albumName);
fetch(ajaxUrl, {
@@ -477,10 +564,16 @@
return;
}
// Auch ohne Token erlauben, wenn Forum-Session aktiv
if (!sessionData.verified || !sessionData.username) {
showFeedback('Bitte verifiziere dich zuerst.', 'error');
return;
}
const formData = new FormData();
formData.append('action', 'mc_gallery_upload');
formData.append('mc_upload_nonce', mcGalleryPro.nonce);
formData.append('mc_token', sessionData.token);
formData.append('mc_token', sessionData.token || '');
formData.append('mc_username', sessionData.username);
formData.append('mc_server_id', sessionData.serverId);
formData.append('mc_album_id', $('#mc-upload-album').val() || '');
@@ -546,6 +639,77 @@
$('#mc-upload-file').click();
});
// === VOTE BUTTONS (Daumen hoch / runter) ===
if (mcGalleryPro.votingEnabled) {
// Cookie-Zustand initialisieren
function initVoteBtns() {
$('.mc-vote-wrap').each(function() {
const aid = $(this).data('attach-id');
const up = document.cookie.split(';').some(c => c.trim() === 'mc_vote_' + aid + '=up');
const down = document.cookie.split(';').some(c => c.trim() === 'mc_vote_' + aid + '=down');
if (up) $(this).find('.mc-vote-up').addClass('mc-vote-btn--active');
if (down) $(this).find('.mc-vote-down').addClass('mc-vote-btn--active');
});
}
initVoteBtns();
$(document).on('click', '.mc-vote-btn', function(e) {
e.preventDefault();
e.stopPropagation();
const $btn = $(this);
const $wrap = $btn.closest('.mc-vote-wrap');
const aid = $wrap.data('attach-id');
const nonce = $wrap.data('nonce');
const type = $btn.data('type'); // 'up' oder 'down'
const ck = 'mc_vote_' + aid;
const current = document.cookie.split(';').find(c => c.trim().startsWith(ck + '='));
const curVal = current ? current.trim().split('=')[1] : null;
if ($btn.prop('disabled')) return;
$wrap.find('.mc-vote-btn').prop('disabled', true);
// Toggle-Logik: nochmal klicken = entfernen
const isActive = $btn.hasClass('mc-vote-btn--active');
const action = isActive ? 'remove' : 'add';
$.post(ajaxUrl, {
action: 'mc_gallery_vote',
attach_id: aid,
vote_type: type,
vote_action: action,
nonce: nonce
})
.done(function(r) {
if (r.success) {
$wrap.find('.mc-vote-up-count').text(r.data.votes_up);
$wrap.find('.mc-vote-down-count').text(r.data.votes_down);
if (action === 'add') {
// Gegenpart deaktivieren falls aktiv
const other = type === 'up' ? 'down' : 'up';
$wrap.find('.mc-vote-' + other).removeClass('mc-vote-btn--active');
$btn.addClass('mc-vote-btn--active');
const exp = new Date(); exp.setDate(exp.getDate() + 30);
document.cookie = ck + '=' + type + '; expires=' + exp.toUTCString() + '; path=/; SameSite=Lax';
} else {
$btn.removeClass('mc-vote-btn--active');
document.cookie = ck + '=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/';
}
// Lightbox-Zähler synchronisieren
$('.mc-vote-wrap[data-attach-id="' + aid + '"] .mc-vote-up-count').text(r.data.votes_up);
$('.mc-vote-wrap[data-attach-id="' + aid + '"] .mc-vote-down-count').text(r.data.votes_down);
}
$wrap.find('.mc-vote-btn').prop('disabled', false);
})
.fail(function() {
$wrap.find('.mc-vote-btn').prop('disabled', false);
});
});
}
// === LIGHTBOX & VIEW COUNT ===
$(document).on('click', '.mc-gallery-item', function (e) {
e.preventDefault();
@@ -566,31 +730,40 @@
}
const player = $item.data('player') || $item.find('.mc-watermark').text().trim();
const date = $item.data('date') || '';
const album = $item.data('album') || '';
const views = $item.data('views') || 0;
const date = $item.data('date') || '';
const album = $item.data('album') || '';
const $lightbox = $('<div class="mc-lightbox active"></div>');
const $content = $('<div class="mc-lightbox-content"></div>');
const $img = $('<img>').attr({
'src': href,
'alt': player
});
const $close = $('<button class="mc-lightbox-close" aria-label="Schließen">&times;</button>');
const $content = $('<div class="mc-lightbox-content"></div>');
const $img = $('<img>').attr({ src: href, alt: player });
const $close = $('<button class="mc-lightbox-close" aria-label="Schließen">&times;</button>');
// Info-Zeile
let infoHtml = '';
if (player) infoHtml += `👤 ${player}`;
if (date && player) infoHtml += ' • ';
if (date) infoHtml += `📅 ${date}`;
if (album) infoHtml += ` • 📁 ${album}`;
// Views auch in Lightbox zeigen
if (views) infoHtml += ' • 👁️ ' + views;
if (infoHtml) {
const $info = $('<div class="mc-lightbox-info"></div>').html(infoHtml);
$content.append($info);
}
// Vote-Buttons in Lightbox
if (attachId) {
const $voteWrap = $item.find('.mc-vote-wrap').clone();
if ($voteWrap.length) {
$voteWrap.addClass('mc-vote-wrap--lightbox');
$content.append($voteWrap);
// Cookie-Zustand wiederherstellen
const ck = 'mc_vote_' + attachId;
const cur = document.cookie.split(';').find(c => c.trim().startsWith(ck + '='));
const curV = cur ? cur.trim().split('=')[1] : null;
if (curV === 'up') $voteWrap.find('.mc-vote-up').addClass('mc-vote-btn--active');
if (curV === 'down') $voteWrap.find('.mc-vote-down').addClass('mc-vote-btn--active');
}
}
$content.append($close).append($img);
$lightbox.append($content).appendTo('body');