/** * Door Status Voting - Admin JavaScript */ (function($) { 'use strict'; $(document).ready(function() { initSettingsForm(); initResetButtons(); initResetByTypeButtons(); initMismatchFilter(); initMetaStatusButtons(); }); /** * Settings Form Handler */ function initSettingsForm() { $('#dsv-settings-form').on('submit', function(e) { e.preventDefault(); var $form = $(this); var $btn = $form.find('.button-primary'); var $status = $form.find('.dsv-save-status'); $btn.prop('disabled', true).text('Speichern...'); $status.text(''); $.ajax({ type: 'POST', url: dsvAdmin.ajaxUrl, data: { action: 'dsv_save_settings', nonce: dsvAdmin.nonce, disabled_posts: $('#dsv-disabled-posts').val() }, success: function(response) { if (response.success) { $status.text('✓ Gespeichert').css('color', '#00a32a'); } else { $status.text('✗ Fehler: ' + (response.data?.message || 'Unbekannt')).css('color', '#d63638'); } }, error: function() { $status.text('✗ Verbindungsfehler').css('color', '#d63638'); }, complete: function() { $btn.prop('disabled', false).text('Einstellungen speichern'); setTimeout(function() { $status.fadeOut(300, function() { $(this).text('').show(); }); }, 3000); } }); }); } /** * Reset All Buttons Handler */ function initResetButtons() { $(document).on('click', '.dsv-reset-btn', function() { var $btn = $(this); var $row = $btn.closest('tr'); var postId = $btn.data('post-id'); if (!confirm('Alle Votes für diesen Beitrag wirklich zurücksetzen?')) { return; } $btn.prop('disabled', true).text('Löschen...'); $.ajax({ type: 'POST', url: dsvAdmin.ajaxUrl, data: { action: 'dsv_reset_votes', nonce: dsvAdmin.nonce, post_id: postId }, success: function(response) { if (response.success) { $row.fadeOut(300, function() { $(this).remove(); checkEmptyTable(); }); } else { alert('Fehler: ' + (response.data?.message || 'Unbekannt')); $btn.prop('disabled', false).text('Alle löschen'); } }, error: function() { alert('Verbindungsfehler'); $btn.prop('disabled', false).text('Alle löschen'); } }); }); } /** * Reset By Type Buttons Handler */ function initResetByTypeButtons() { $(document).on('click', '.dsv-reset-type-btn', function() { var $btn = $(this); var $row = $btn.closest('tr'); var postId = $btn.data('post-id'); var type = $btn.data('type'); var typeLabel = type === 'open' ? 'Geöffnet' : 'Geschlossen'; if (!confirm('Alle "' + typeLabel + '" Stimmen für diesen Beitrag löschen?')) { return; } var originalText = $btn.text(); $btn.prop('disabled', true).text('...'); $.ajax({ type: 'POST', url: dsvAdmin.ajaxUrl, data: { action: 'dsv_reset_votes_by_type', nonce: dsvAdmin.nonce, post_id: postId, type: type }, success: function(response) { if (response.success) { // Zähler aktualisieren $row.find('.dsv-count-open').text(response.data.votes.open); $row.find('.dsv-count-closed').text(response.data.votes.closed); $row.find('.dsv-count-total').text(response.data.votes.open + response.data.votes.closed); // Status Badge aktualisieren var $badge = $row.find('.dsv-badge'); $badge.removeClass('dsv-badge-open dsv-badge-closed dsv-badge-tied'); if (response.data.votes.open > response.data.votes.closed) { $badge.addClass('dsv-badge-open').text('Geöffnet'); } else if (response.data.votes.closed > response.data.votes.open) { $badge.addClass('dsv-badge-closed').text('Geschlossen'); } else { $badge.addClass('dsv-badge-tied').text('Unklar'); } // Wenn keine Votes mehr, Zeile entfernen if (response.data.votes.open === 0 && response.data.votes.closed === 0) { $row.fadeOut(300, function() { $(this).remove(); checkEmptyTable(); }); } else { // Kurzes Feedback $btn.text('✓').css('color', '#00a32a'); setTimeout(function() { $btn.prop('disabled', false).text(originalText).css('color', ''); }, 1000); } } else { alert('Fehler: ' + (response.data?.message || 'Unbekannt')); $btn.prop('disabled', false).text(originalText); } }, error: function() { alert('Verbindungsfehler'); $btn.prop('disabled', false).text(originalText); } }); }); } /** * Filter: Nur Abweichungen anzeigen */ function initMismatchFilter() { var $btn = $('#dsv-filter-mismatch'); var active = false; $btn.on('click', function() { active = !active; var $table = $('#dsv-votes-table'); if (active) { $table.find('tbody tr').not('.dsv-mismatch').hide(); $btn.addClass('button-primary').text('Alle anzeigen'); } else { $table.find('tbody tr').show(); $btn.removeClass('button-primary').text('Nur Abweichungen anzeigen'); } }); } /** * Meta-Status per Knopfdruck ändern */ function initMetaStatusButtons() { $(document).on('click', '.dsv-meta-set-btn', function() { var $btn = $(this); var $cell = $btn.closest('.dsv-meta-status-cell'); var postId = $btn.data('post-id'); var status = $btn.data('status'); $cell.find('.dsv-meta-set-btn').prop('disabled', true); $.ajax({ type: 'POST', url: dsvAdmin.ajaxUrl, data: { action: 'dsv_update_meta_status', nonce: dsvAdmin.nonce, post_id: postId, status: status }, success: function(response) { if (response.success) { // Badge aktualisieren var badgeClass = 'dsv-badge-tied'; var lower = status.toLowerCase(); if (lower === 'geöffnet') badgeClass = 'dsv-badge-open'; else if (lower === 'geschlossen') badgeClass = 'dsv-badge-closed'; var $badge = $cell.find('.dsv-badge, .dsv-meta-empty'); if ($badge.hasClass('dsv-meta-empty')) { $badge.removeClass('dsv-meta-empty').addClass('dsv-badge'); } $badge.removeClass('dsv-badge-open dsv-badge-closed dsv-badge-tied') .addClass(badgeClass) .text(status); // Active-State der Buttons $cell.find('.dsv-meta-set-btn').removeClass('active'); $btn.addClass('active'); } else { alert('Fehler: ' + (response.data?.message || 'Unbekannt')); } }, error: function() { alert('Verbindungsfehler'); }, complete: function() { $cell.find('.dsv-meta-set-btn').prop('disabled', false); } }); }); } /** * Prüfen ob Tabelle leer ist */ function checkEmptyTable() { if ($('tbody tr').length === 0) { location.reload(); } } })(jQuery);