diff --git a/assets/css/gallery-pro.css b/assets/css/gallery-pro.css index 514a7e1..d11a881 100644 --- a/assets/css/gallery-pro.css +++ b/assets/css/gallery-pro.css @@ -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; } \ No newline at end of file diff --git a/assets/css/mc-gallery-forum-bridge.css b/assets/css/mc-gallery-forum-bridge.css new file mode 100644 index 0000000..ac7546a --- /dev/null +++ b/assets/css/mc-gallery-forum-bridge.css @@ -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; +} \ No newline at end of file diff --git a/assets/js/forum-bridge.js b/assets/js/forum-bridge.js new file mode 100644 index 0000000..a9a4f64 --- /dev/null +++ b/assets/js/forum-bridge.js @@ -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(' 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('
' + + ' Verifiziert als ' + + $('').text(r.data.mc_username).html() + + '
'); + } 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('

' + msg + '

'); + $btn.prop('disabled', false).html(' Mit Forum-Login verifizieren'); + } + }) + .fail(function(){ + $btn.prop('disabled', false).html(' Mit Forum-Login verifizieren'); + alert('Netzwerkfehler. Bitte erneut versuchen.'); + }); + }); +})(jQuery); diff --git a/assets/js/gallery-pro.js b/assets/js/gallery-pro.js index ae1624d..7d9689f 100644 --- a/assets/js/gallery-pro.js +++ b/assets/js/gallery-pro.js @@ -119,16 +119,15 @@ function loadAlbums() { const $select = $('#mc-upload-album'); $select.html('').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(' 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 = $('
'); - const $content = $('
'); - const $img = $('').attr({ - 'src': href, - 'alt': player - }); - const $close = $(''); - + const $content = $('
'); + const $img = $('').attr({ src: href, alt: player }); + const $close = $(''); + + // 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 = $('
').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');