Dateien nach "assets/js" hochladen
This commit is contained in:
620
assets/js/gallery-pro.js
Normal file
620
assets/js/gallery-pro.js
Normal file
@@ -0,0 +1,620 @@
|
|||||||
|
(function ($) {
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
if (typeof mcGalleryPro === 'undefined') {
|
||||||
|
console.error('MC Gallery Pro: Configuration not found.');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const api = mcGalleryPro.restBase.replace(/\/?$/, '');
|
||||||
|
const ajaxUrl = mcGalleryPro.uploadUrl;
|
||||||
|
const maxUploads = mcGalleryPro.maxUploads || 5;
|
||||||
|
|
||||||
|
let originalBodyPadding = '';
|
||||||
|
let scrollbarWidth = 0;
|
||||||
|
|
||||||
|
let sessionData = {
|
||||||
|
token: null,
|
||||||
|
username: null,
|
||||||
|
serverId: null,
|
||||||
|
verified: false
|
||||||
|
};
|
||||||
|
|
||||||
|
let selectedFiles = [];
|
||||||
|
|
||||||
|
function getScrollbarWidth() {
|
||||||
|
if (scrollbarWidth > 0) return scrollbarWidth;
|
||||||
|
const outer = document.createElement('div');
|
||||||
|
outer.style.visibility = 'hidden';
|
||||||
|
outer.style.width = '100px';
|
||||||
|
outer.style.msOverflowStyle = 'scrollbar';
|
||||||
|
document.body.appendChild(outer);
|
||||||
|
|
||||||
|
const widthNoScroll = outer.offsetWidth;
|
||||||
|
outer.style.overflow = 'scroll';
|
||||||
|
|
||||||
|
const inner = document.createElement('div');
|
||||||
|
inner.style.width = '100%';
|
||||||
|
outer.appendChild(inner);
|
||||||
|
|
||||||
|
const widthWithScroll = inner.offsetWidth;
|
||||||
|
outer.parentNode.removeChild(outer);
|
||||||
|
|
||||||
|
scrollbarWidth = widthNoScroll - widthWithScroll;
|
||||||
|
return scrollbarWidth;
|
||||||
|
}
|
||||||
|
|
||||||
|
function showFeedback(msg, type = 'info') {
|
||||||
|
const $fb = $('#mc-feedback-msg');
|
||||||
|
$fb.removeClass('mc-msg-success mc-msg-error');
|
||||||
|
|
||||||
|
if (type === 'success') {
|
||||||
|
$fb.addClass('mc-msg-success');
|
||||||
|
} else if (type === 'error') {
|
||||||
|
$fb.addClass('mc-msg-error');
|
||||||
|
}
|
||||||
|
|
||||||
|
$fb.html(msg).fadeIn(300);
|
||||||
|
}
|
||||||
|
|
||||||
|
function switchStep(stepNum) {
|
||||||
|
$('.mc-step').removeClass('active');
|
||||||
|
$(`.mc-step[data-step="${stepNum}"]`).addClass('active');
|
||||||
|
}
|
||||||
|
|
||||||
|
function resetModal() {
|
||||||
|
$('#mc-upload-username').val('');
|
||||||
|
$('#mc-token-text').text('Waiting...');
|
||||||
|
$('#mc-upload-file').val('');
|
||||||
|
$('#mc-file-name').text('Keine Bilder gewählt').css('color', '');
|
||||||
|
$('.mc-file-drop').css('border-color', '').css('background', '');
|
||||||
|
$('#mc-feedback-msg').hide().empty();
|
||||||
|
$('#mc-file-preview').empty();
|
||||||
|
$('#mc-upload-progress').hide();
|
||||||
|
$('#mc-btn-upload-more').hide();
|
||||||
|
$('#mc-btn-final-upload').show();
|
||||||
|
selectedFiles = [];
|
||||||
|
sessionData = {
|
||||||
|
token: null,
|
||||||
|
username: null,
|
||||||
|
serverId: null,
|
||||||
|
verified: false
|
||||||
|
};
|
||||||
|
switchStep(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
function loadServers() {
|
||||||
|
const $select = $('#mc-upload-server');
|
||||||
|
if (!$select.length) return;
|
||||||
|
|
||||||
|
$select.html('<option>Lade Server...</option>').prop('disabled', true);
|
||||||
|
|
||||||
|
fetch(api + '/servers')
|
||||||
|
.then(response => {
|
||||||
|
if (!response.ok) throw new Error('Server response not OK');
|
||||||
|
return response.json();
|
||||||
|
})
|
||||||
|
.then(data => {
|
||||||
|
if (data.success && Array.isArray(data.data) && data.data.length > 0) {
|
||||||
|
$select.empty().prop('disabled', false);
|
||||||
|
data.data.forEach(server => {
|
||||||
|
const displayText = server.host
|
||||||
|
? `${server.title} (${server.host})`
|
||||||
|
: server.title;
|
||||||
|
$select.append($('<option>')
|
||||||
|
.val(server.id)
|
||||||
|
.text(displayText)
|
||||||
|
);
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
$select.html('<option>Keine aktiven Server</option>');
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.catch(error => {
|
||||||
|
console.error('Failed to load servers:', error);
|
||||||
|
$select.html('<option>Fehler beim Laden</option>');
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function loadAlbums() {
|
||||||
|
const $select = $('#mc-upload-album');
|
||||||
|
$select.html('<option value="">Kein Album</option>').prop('disabled', true);
|
||||||
|
|
||||||
|
if (!sessionData.token || !sessionData.verified) return;
|
||||||
|
|
||||||
|
fetch(api + '/albums', {
|
||||||
|
method: 'POST',
|
||||||
|
headers: { 'Content-Type': 'application/json' },
|
||||||
|
body: JSON.stringify({
|
||||||
|
token: sessionData.token,
|
||||||
|
username: sessionData.username,
|
||||||
|
server_id: sessionData.serverId
|
||||||
|
})
|
||||||
|
})
|
||||||
|
.then(response => response.json())
|
||||||
|
.then(data => {
|
||||||
|
if (data.success && data.data.albums) {
|
||||||
|
$select.prop('disabled', false);
|
||||||
|
data.data.albums.forEach(album => {
|
||||||
|
$select.append($('<option>')
|
||||||
|
.val(album.id)
|
||||||
|
.text(album.title)
|
||||||
|
);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.catch(error => {
|
||||||
|
console.error('Failed to load albums:', error);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// FIX 1: View Counter Zähler erhöhen
|
||||||
|
function incrementViewCount(attachId, $badgeElement) {
|
||||||
|
$.post(ajaxUrl, {
|
||||||
|
action: 'mc_gallery_increment_view',
|
||||||
|
attach_id: attachId,
|
||||||
|
nonce: mcGalleryPro.nonce
|
||||||
|
}, function(response) {
|
||||||
|
if (response.success && response.data && typeof response.data.views !== 'undefined') {
|
||||||
|
// Badge sofort aktualisieren (Animation optional)
|
||||||
|
$badgeElement.find('.mc-views-count').text(response.data.views);
|
||||||
|
}
|
||||||
|
}).fail(function() {
|
||||||
|
console.error('Failed to increment view count');
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function renderFilePreview() {
|
||||||
|
const $preview = $('#mc-file-preview');
|
||||||
|
$preview.empty();
|
||||||
|
|
||||||
|
if (selectedFiles.length === 0) return;
|
||||||
|
|
||||||
|
selectedFiles.forEach((file, index) => {
|
||||||
|
const reader = new FileReader();
|
||||||
|
reader.onload = function(e) {
|
||||||
|
const $item = $(`
|
||||||
|
<div class="mc-preview-item" data-index="${index}">
|
||||||
|
<img src="${e.target.result}" alt="${file.name}">
|
||||||
|
<button class="mc-preview-remove" data-index="${index}" title="Entfernen">×</button>
|
||||||
|
<span class="mc-preview-name">${file.name}</span>
|
||||||
|
</div>
|
||||||
|
`);
|
||||||
|
$preview.append($item);
|
||||||
|
};
|
||||||
|
reader.readAsDataURL(file);
|
||||||
|
});
|
||||||
|
|
||||||
|
updateFileCount();
|
||||||
|
}
|
||||||
|
|
||||||
|
function updateFileCount() {
|
||||||
|
const count = selectedFiles.length;
|
||||||
|
|
||||||
|
$('#mc-file-name').css('color', '').removeClass('mc-msg-error-text');
|
||||||
|
$('#mc-btn-final-upload').prop('disabled', false).removeClass('mc-btn-disabled');
|
||||||
|
$('.mc-file-drop').css({
|
||||||
|
'border-color': '',
|
||||||
|
'background': ''
|
||||||
|
});
|
||||||
|
|
||||||
|
if (count === 0) {
|
||||||
|
$('#mc-file-name').text('Keine Bilder gewählt');
|
||||||
|
} else if (count > maxUploads) {
|
||||||
|
$('#mc-file-name')
|
||||||
|
.html(`<strong>${count} / ${maxUploads} Bilder</strong> (Zu viele!)`)
|
||||||
|
.css('color', 'var(--mc-error)')
|
||||||
|
.addClass('mc-msg-error-text');
|
||||||
|
$('#mc-btn-final-upload')
|
||||||
|
.prop('disabled', true)
|
||||||
|
.addClass('mc-btn-disabled');
|
||||||
|
$('.mc-file-drop').css({
|
||||||
|
'border-color': 'var(--mc-error)',
|
||||||
|
'background': 'rgba(239, 68, 68, 0.05)'
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
$('#mc-file-name')
|
||||||
|
.html(`<strong>${count} Bild${count > 1 ? 'er' : ''}</strong> ausgewählt`)
|
||||||
|
.css('color', 'var(--mc-text-main)');
|
||||||
|
$('.mc-file-drop').css({
|
||||||
|
'border-color': 'var(--mc-primary)',
|
||||||
|
'background': 'rgba(16, 185, 129, 0.05)'
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
$('#mc-upload-btn-text').text(count > 0 ? `${count} Bild${count > 1 ? 'er' : ''} hochladen` : 'Bilder hochladen');
|
||||||
|
}
|
||||||
|
|
||||||
|
function openModal() {
|
||||||
|
$('#mc-upload-modal').addClass('open').attr('aria-hidden', 'false');
|
||||||
|
originalBodyPadding = $('body').css('padding-right');
|
||||||
|
const width = getScrollbarWidth();
|
||||||
|
|
||||||
|
$('html').css('overflow', 'hidden');
|
||||||
|
$('body').css('padding-right', (parseInt(originalBodyPadding) || 0) + width + 'px');
|
||||||
|
|
||||||
|
resetModal();
|
||||||
|
loadServers();
|
||||||
|
}
|
||||||
|
|
||||||
|
function closeModal() {
|
||||||
|
$('#mc-upload-modal').removeClass('open').attr('aria-hidden', 'true');
|
||||||
|
$('html').css('overflow', '');
|
||||||
|
$('body').css('padding-right', originalBodyPadding);
|
||||||
|
|
||||||
|
setTimeout(resetModal, 300);
|
||||||
|
}
|
||||||
|
|
||||||
|
$(document).ready(function () {
|
||||||
|
|
||||||
|
loadServers();
|
||||||
|
|
||||||
|
$('#mc-open-upload-modal').on('click', function(e) {
|
||||||
|
e.preventDefault();
|
||||||
|
openModal();
|
||||||
|
});
|
||||||
|
|
||||||
|
$('.mc-modal-close, .mc-modal-backdrop').on('click', function() {
|
||||||
|
closeModal();
|
||||||
|
});
|
||||||
|
|
||||||
|
$(document).on('keydown', function(e) {
|
||||||
|
if (e.key === 'Escape' && $('#mc-upload-modal').hasClass('open')) {
|
||||||
|
closeModal();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#mc-btn-generate').on('click', function () {
|
||||||
|
const username = $('#mc-upload-username').val().trim();
|
||||||
|
const serverId = $('#mc-upload-server').val();
|
||||||
|
|
||||||
|
if (!username) {
|
||||||
|
showFeedback('Bitte gib deinen Minecraft-Namen ein.', 'error');
|
||||||
|
$('#mc-upload-username').focus();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!serverId || serverId === '') {
|
||||||
|
showFeedback('Bitte wähle einen Server aus.', 'error');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const $btn = $(this);
|
||||||
|
const originalText = $btn.text();
|
||||||
|
$btn.prop('disabled', true).html('<span class="mc-loading"></span> Starte Session...');
|
||||||
|
|
||||||
|
fetch(api + '/request-token', {
|
||||||
|
method: 'POST',
|
||||||
|
headers: { 'Content-Type': 'application/json' },
|
||||||
|
body: JSON.stringify({
|
||||||
|
username: username,
|
||||||
|
server_id: parseInt(serverId, 10)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
.then(response => response.json())
|
||||||
|
.then(data => {
|
||||||
|
$btn.prop('disabled', false).text(originalText);
|
||||||
|
|
||||||
|
if (data.success && data.data && data.data.token) {
|
||||||
|
sessionData.token = data.data.token;
|
||||||
|
sessionData.username = username;
|
||||||
|
sessionData.serverId = parseInt(serverId, 10);
|
||||||
|
|
||||||
|
$('#mc-token-text').text(data.data.token);
|
||||||
|
$('#mc_form_token').val(data.data.token);
|
||||||
|
$('#mc_form_username').val(username);
|
||||||
|
$('#mc_form_server').val(serverId);
|
||||||
|
|
||||||
|
showFeedback('✓ Session-Token erstellt! Gültig für 1 Stunde.', 'success');
|
||||||
|
setTimeout(() => switchStep(2), 600);
|
||||||
|
} else {
|
||||||
|
showFeedback(data.message || 'Fehler beim Token-Erstellen', 'error');
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.catch(error => {
|
||||||
|
console.error('Token generation error:', error);
|
||||||
|
$btn.prop('disabled', false).text(originalText);
|
||||||
|
showFeedback('Netzwerkfehler beim Token-Erstellen', 'error');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
$('.mc-copy-btn').on('click', function() {
|
||||||
|
const text = $('#mc-token-text').text();
|
||||||
|
const $btn = $(this);
|
||||||
|
|
||||||
|
if (text === 'Waiting...' || !text) {
|
||||||
|
showFeedback('Kein Token zum Kopieren verfügbar', 'error');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
navigator.clipboard.writeText(text)
|
||||||
|
.then(() => {
|
||||||
|
const original = $btn.text();
|
||||||
|
$btn.text('✓');
|
||||||
|
setTimeout(() => $btn.text(original), 2000);
|
||||||
|
})
|
||||||
|
.catch(() => {
|
||||||
|
showFeedback('Kopieren fehlgeschlagen', 'error');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#mc-btn-check').on('click', function () {
|
||||||
|
const token = $('#mc_form_token').val();
|
||||||
|
|
||||||
|
if (!token) {
|
||||||
|
showFeedback('Kein Token vorhanden', 'error');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const $btn = $(this);
|
||||||
|
const originalText = $btn.text();
|
||||||
|
$btn.prop('disabled', true).html('<span class="mc-loading"></span> Prüfe...');
|
||||||
|
|
||||||
|
fetch(api + '/check-token', {
|
||||||
|
method: 'POST',
|
||||||
|
headers: { 'Content-Type': 'application/json' },
|
||||||
|
body: JSON.stringify({ token: token })
|
||||||
|
})
|
||||||
|
.then(response => response.json().then(data => {
|
||||||
|
if (!response.ok) throw new Error(data.message || 'Verifizierung fehlgeschlagen.');
|
||||||
|
return data;
|
||||||
|
}))
|
||||||
|
.then(data => {
|
||||||
|
$btn.prop('disabled', false).text(originalText);
|
||||||
|
|
||||||
|
if (data.success && data.data && data.data.claimed) {
|
||||||
|
sessionData.verified = true;
|
||||||
|
$('#mc-session-user').text(data.data.claimed_by);
|
||||||
|
showFeedback(`✓ Erfolgreich verifiziert als <strong>${data.data.claimed_by}</strong>!`, 'success');
|
||||||
|
setTimeout(() => {
|
||||||
|
switchStep(3);
|
||||||
|
loadAlbums();
|
||||||
|
}, 800);
|
||||||
|
} else {
|
||||||
|
sessionData.verified = false;
|
||||||
|
showFeedback('⚠ Noch nicht verifiziert. Gib <strong>/verify [Token]</strong> im Spiel ein.', 'error');
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.catch(error => {
|
||||||
|
console.error('Check token error:', error);
|
||||||
|
$btn.prop('disabled', false).text(originalText);
|
||||||
|
sessionData.verified = false;
|
||||||
|
showFeedback(`❌ ${error.message}`, 'error');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#mc-upload-file').on('change', function() {
|
||||||
|
let files = Array.from(this.files);
|
||||||
|
|
||||||
|
// FIX: NUR BILDER ZULASSEN (Client Side Filter)
|
||||||
|
files = files.filter(function(f) {
|
||||||
|
return f.type.startsWith('image/');
|
||||||
|
});
|
||||||
|
|
||||||
|
if (files.length > 0) {
|
||||||
|
// Wenn Dateien gefiltert wurden (User hat PDF ausgewählt), aktualisiere Input
|
||||||
|
if (files.length !== this.files.length) {
|
||||||
|
const dataTransfer = new DataTransfer();
|
||||||
|
files.forEach(file => dataTransfer.items.add(file));
|
||||||
|
this.files = dataTransfer.files;
|
||||||
|
showFeedback('❌ Nur Bilder sind erlaubt! PDFs/Zip wurden entfernt.', 'error');
|
||||||
|
}
|
||||||
|
selectedFiles = files;
|
||||||
|
renderFilePreview();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
$(document).on('click', '.mc-preview-remove', function() {
|
||||||
|
const index = $(this).data('index');
|
||||||
|
selectedFiles.splice(index, 1);
|
||||||
|
renderFilePreview();
|
||||||
|
|
||||||
|
const dataTransfer = new DataTransfer();
|
||||||
|
selectedFiles.forEach(file => dataTransfer.items.add(file));
|
||||||
|
$('#mc-upload-file')[0].files = dataTransfer.files;
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#mc-btn-new-album').on('click', function() {
|
||||||
|
$('#mc-new-album-form').slideToggle();
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#mc-btn-create-album').on('click', function() {
|
||||||
|
const albumName = $('#mc-new-album-name').val().trim();
|
||||||
|
|
||||||
|
if (!albumName) {
|
||||||
|
showFeedback('Bitte gib einen Album-Namen ein', 'error');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const $btn = $(this);
|
||||||
|
$btn.prop('disabled', true).html('<span class="mc-loading"></span> Erstelle...');
|
||||||
|
|
||||||
|
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_username', sessionData.username);
|
||||||
|
formData.append('mc_server_id', sessionData.serverId);
|
||||||
|
formData.append('album_name', albumName);
|
||||||
|
|
||||||
|
fetch(ajaxUrl, {
|
||||||
|
method: 'POST',
|
||||||
|
body: formData,
|
||||||
|
credentials: 'same-origin'
|
||||||
|
})
|
||||||
|
.then(response => response.json())
|
||||||
|
.then(data => {
|
||||||
|
if (data.success) {
|
||||||
|
const $select = $('#mc-upload-album');
|
||||||
|
$select.append($('<option>')
|
||||||
|
.val(data.data.album.id)
|
||||||
|
.text(data.data.album.title)
|
||||||
|
);
|
||||||
|
$select.val(data.data.album.id);
|
||||||
|
$('#mc-new-album-name').val('');
|
||||||
|
$('#mc-new-album-form').slideUp();
|
||||||
|
showFeedback('✓ Album erfolgreich erstellt!', 'success');
|
||||||
|
} else {
|
||||||
|
showFeedback('Fehler: ' + (data.data?.message || 'Unbekannt'), 'error');
|
||||||
|
}
|
||||||
|
$btn.prop('disabled', false).text('Album erstellen');
|
||||||
|
})
|
||||||
|
.catch(error => {
|
||||||
|
console.error('Create album error:', error);
|
||||||
|
$btn.prop('disabled', false).text('Album erstellen');
|
||||||
|
showFeedback('Netzwerkfehler', 'error');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#mc-btn-final-upload').on('click', function () {
|
||||||
|
if (selectedFiles.length === 0) {
|
||||||
|
showFeedback('Bitte wähle mindestens ein Bild aus', 'error');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (selectedFiles.length > maxUploads) {
|
||||||
|
showFeedback('Du kannst nur ' + maxUploads + ' Bilder gleichzeitig hochladen.', '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_username', sessionData.username);
|
||||||
|
formData.append('mc_server_id', sessionData.serverId);
|
||||||
|
formData.append('mc_album_id', $('#mc-upload-album').val() || '');
|
||||||
|
|
||||||
|
selectedFiles.forEach((file) => {
|
||||||
|
formData.append('mc_images[]', file);
|
||||||
|
});
|
||||||
|
|
||||||
|
const $btn = $(this);
|
||||||
|
$btn.prop('disabled', true).hide();
|
||||||
|
$('#mc-upload-progress').show();
|
||||||
|
$('#mc-progress-text').text(`Lade ${selectedFiles.length} Bild${selectedFiles.length > 1 ? 'er' : ''} hoch...`);
|
||||||
|
|
||||||
|
let progress = 0;
|
||||||
|
const progressInterval = setInterval(() => {
|
||||||
|
progress += 5;
|
||||||
|
if (progress > 90) progress = 90;
|
||||||
|
$('#mc-progress-fill').css('width', progress + '%');
|
||||||
|
}, 200);
|
||||||
|
|
||||||
|
fetch(ajaxUrl, {
|
||||||
|
method: 'POST',
|
||||||
|
body: formData,
|
||||||
|
credentials: 'same-origin'
|
||||||
|
})
|
||||||
|
.then(response => response.json())
|
||||||
|
.then(data => {
|
||||||
|
clearInterval(progressInterval);
|
||||||
|
$('#mc-progress-fill').css('width', '100%');
|
||||||
|
|
||||||
|
if (data.success) {
|
||||||
|
const uploaded = data.data.uploaded || [];
|
||||||
|
const errors = data.data.errors || [];
|
||||||
|
|
||||||
|
let msg = `✓ ${uploaded.length} Bild${uploaded.length > 1 ? 'er' : ''} erfolgreich hochgeladen!`;
|
||||||
|
if (errors.length > 0) {
|
||||||
|
msg += `<br>⚠ ${errors.length} Fehler: ${errors.join(', ')}`;
|
||||||
|
}
|
||||||
|
|
||||||
|
showFeedback(msg, 'success');
|
||||||
|
|
||||||
|
setTimeout(() => {
|
||||||
|
window.location.reload();
|
||||||
|
}, 1500);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
throw new Error(data.data?.message || data.message || 'Upload fehlgeschlagen');
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.catch(error => {
|
||||||
|
clearInterval(progressInterval);
|
||||||
|
console.error('Upload error:', error);
|
||||||
|
$('#mc-upload-progress').hide();
|
||||||
|
$('#mc-progress-fill').css('width', '0%');
|
||||||
|
$btn.show().prop('disabled', false);
|
||||||
|
showFeedback(`❌ Upload Fehler: ${error.message}`, 'error');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#mc-btn-upload-more').on('click', function() {
|
||||||
|
$(this).hide();
|
||||||
|
$('#mc-feedback-msg').hide();
|
||||||
|
$('#mc-upload-file').click();
|
||||||
|
});
|
||||||
|
|
||||||
|
// === LIGHTBOX & VIEW COUNT ===
|
||||||
|
$(document).on('click', '.mc-gallery-item', function (e) {
|
||||||
|
e.preventDefault();
|
||||||
|
|
||||||
|
const $item = $(this);
|
||||||
|
const href = $item.attr('href');
|
||||||
|
|
||||||
|
if (!href) return;
|
||||||
|
|
||||||
|
// View Count Trigger
|
||||||
|
// Wir lesen die ID aus data-attach (müssen wir im Shortcode hinzufügen) oder versuchen sie aus der URL zu ermitteln
|
||||||
|
// Besser: Wir übergeben die Attach-ID im data-Attribut
|
||||||
|
const attachId = $item.data('attach-id');
|
||||||
|
const $badge = $item.find('.mc-views-badge');
|
||||||
|
|
||||||
|
if (attachId && $badge.length) {
|
||||||
|
incrementViewCount(attachId, $badge);
|
||||||
|
}
|
||||||
|
|
||||||
|
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 $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">×</button>');
|
||||||
|
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
|
$content.append($close).append($img);
|
||||||
|
$lightbox.append($content).appendTo('body');
|
||||||
|
|
||||||
|
$lightbox.on('click', function(e) {
|
||||||
|
if (e.target === this) {
|
||||||
|
$(this).removeClass('active');
|
||||||
|
setTimeout(() => $(this).remove(), 300);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
$close.on('click', function() {
|
||||||
|
$lightbox.removeClass('active');
|
||||||
|
setTimeout(() => $lightbox.remove(), 300);
|
||||||
|
});
|
||||||
|
|
||||||
|
$(document).on('keydown.lightbox', function(e) {
|
||||||
|
if (e.key === 'Escape') {
|
||||||
|
$lightbox.removeClass('active');
|
||||||
|
setTimeout(() => $lightbox.remove(), 300);
|
||||||
|
$(document).off('keydown.lightbox');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
})(jQuery);
|
||||||
Reference in New Issue
Block a user