diff --git a/backend/app/database/myp.db b/backend/app/database/myp.db index 4b78cad4..b891c9f4 100644 Binary files a/backend/app/database/myp.db and b/backend/app/database/myp.db differ diff --git a/backend/app/templates/admin_guest_requests_overview.html b/backend/app/templates/admin_guest_requests_overview.html index c7e7f102..35fc7cdd 100644 --- a/backend/app/templates/admin_guest_requests_overview.html +++ b/backend/app/templates/admin_guest_requests_overview.html @@ -558,6 +558,12 @@ let currentPage = 0; let pageSize = 20; let totalRequests = 0; let currentRequestId = null; +let allPrinters = []; + +// Prüfung der Admin-Berechtigung - zeige Inline-Aktionen nur für Admins +const userIsAdmin = {{ current_user.is_admin|tojson if current_user.is_authenticated else 'false' }}; +const userCanApprove = {{ (current_user.permissions and current_user.permissions.can_approve_jobs)|tojson if current_user.is_authenticated and current_user.permissions else 'false' }}; +const showInlineActions = userIsAdmin || userCanApprove; // Initialisierung document.addEventListener('DOMContentLoaded', function() { @@ -641,29 +647,24 @@ async function loadGuestRequests() { const params = new URLSearchParams({ page: currentPage, - page_size: pageSize + page_size: pageSize, + status: status !== 'all' ? status : '', + sort: sort, + search: search }); - if (status !== 'all') params.append('status', status); - if (urgent !== 'all') params.append('urgent', urgent); - if (sort) params.append('sort', sort); - if (search) params.append('search', search); + if (urgent !== 'all') { + params.append('urgent', urgent === 'urgent'); + } const response = await fetch(`/api/admin/guest-requests?${params}`); - // Enhanced error handling for JSON parsing - let data; - try { - const text = await response.text(); - if (!text.trim()) { - throw new Error('Leere Antwort vom Server'); - } - data = JSON.parse(text); - } catch (parseError) { - console.error('JSON Parse Error:', parseError, 'Response text:', text); - throw new Error(`JSON-Parsing-Fehler beim Laden der Anträge: ${parseError.message}`); + if (!response.ok) { + throw new Error(`HTTP ${response.status}: ${response.statusText}`); } + const data = await response.json(); + if (data.success) { currentRequests = data.requests; totalRequests = data.total; @@ -671,11 +672,15 @@ async function loadGuestRequests() { renderRequestsTable(data.requests); updatePagination(); } else { - showNotification('Fehler beim Laden der Anträge: ' + (data.message || 'Unbekannter Fehler'), 'error'); + throw new Error(data.message || 'Unbekannter Fehler beim Laden der Daten'); } } catch (error) { - console.error('Fehler beim Laden der Anträge:', error); - showNotification('Fehler beim Laden der Anträge: ' + error.message, 'error'); + console.error('Fehler beim Laden der Gastanträge:', error); + showNotification(`Fehler beim Laden der Gastanträge: ${error.message}`, 'error'); + + // Zeige leere Tabelle bei Fehler + renderRequestsTable([]); + updateStatistics({}); } finally { showLoading(false); } @@ -687,6 +692,8 @@ async function loadAvailablePrinters() { const data = await response.json(); if (data.success) { + allPrinters = data.printers; + const select = document.getElementById('assignedPrinter'); select.innerHTML = ''; @@ -772,12 +779,13 @@ function createRequestRow(request) { ${request.duration_minutes || 0} Min, ${request.copies || 1} Kopien + ${request.reason ? `
${escapeHtml(request.reason.substring(0, 100))}${request.reason.length > 100 ? '...' : ''}
` : ''} ${getStatusIcon(request.status)} ${getStatusText(request.status)} - ${request.status === 'pending' ? ` + ${request.status === 'pending' && showInlineActions ? `
-