"feat: Implement test printer functionality in admin system"
This commit is contained in:
parent
f2bc72988b
commit
ae74f4fc0c
99
backend/app/create_test_printers.py
Normal file
99
backend/app/create_test_printers.py
Normal file
@ -0,0 +1,99 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
"""
|
||||||
|
Script zum Erstellen von Test-Druckern für die MYP Plattform
|
||||||
|
"""
|
||||||
|
|
||||||
|
import sys
|
||||||
|
import os
|
||||||
|
sys.path.append('.')
|
||||||
|
|
||||||
|
from models import *
|
||||||
|
from datetime import datetime
|
||||||
|
|
||||||
|
def create_test_printers():
|
||||||
|
"""Erstellt Test-Drucker in der Datenbank."""
|
||||||
|
|
||||||
|
# Verbindung zur Datenbank
|
||||||
|
db_session = get_db_session()
|
||||||
|
|
||||||
|
# Test-Drucker Daten
|
||||||
|
test_printers = [
|
||||||
|
{
|
||||||
|
'name': 'Ultimaker S3 #01',
|
||||||
|
'model': 'Ultimaker S3',
|
||||||
|
'location': 'Produktionshalle A',
|
||||||
|
'plug_ip': '192.168.1.100',
|
||||||
|
'status': 'available',
|
||||||
|
'active': True
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'name': 'Prusa MK3S+ #02',
|
||||||
|
'model': 'Prusa MK3S+',
|
||||||
|
'location': 'Produktionshalle B',
|
||||||
|
'plug_ip': '192.168.1.101',
|
||||||
|
'status': 'offline',
|
||||||
|
'active': True
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'name': 'Bambu Lab X1 #03',
|
||||||
|
'model': 'Bambu Lab X1 Carbon',
|
||||||
|
'location': 'Labor R&D',
|
||||||
|
'plug_ip': '192.168.1.102',
|
||||||
|
'status': 'available',
|
||||||
|
'active': True
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'name': 'Formlabs Form 3 #04',
|
||||||
|
'model': 'Formlabs Form 3',
|
||||||
|
'location': 'Prototyping Lab',
|
||||||
|
'plug_ip': '192.168.1.103',
|
||||||
|
'status': 'maintenance',
|
||||||
|
'active': False
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'name': 'Ender 3 V2 #05',
|
||||||
|
'model': 'Creality Ender 3 V2',
|
||||||
|
'location': 'Testbereich',
|
||||||
|
'plug_ip': '192.168.1.104',
|
||||||
|
'status': 'offline',
|
||||||
|
'active': True
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
|
try:
|
||||||
|
created_count = 0
|
||||||
|
for printer_data in test_printers:
|
||||||
|
# Prüfen ob Drucker bereits existiert
|
||||||
|
existing = db_session.query(Printer).filter_by(name=printer_data['name']).first()
|
||||||
|
if not existing:
|
||||||
|
printer = Printer(
|
||||||
|
name=printer_data['name'],
|
||||||
|
model=printer_data['model'],
|
||||||
|
location=printer_data['location'],
|
||||||
|
plug_ip=printer_data['plug_ip'],
|
||||||
|
status=printer_data['status'],
|
||||||
|
active=printer_data['active'],
|
||||||
|
created_at=datetime.now()
|
||||||
|
)
|
||||||
|
db_session.add(printer)
|
||||||
|
created_count += 1
|
||||||
|
print(f"✅ Drucker '{printer_data['name']}' erstellt")
|
||||||
|
else:
|
||||||
|
print(f"ℹ️ Drucker '{printer_data['name']}' existiert bereits")
|
||||||
|
|
||||||
|
db_session.commit()
|
||||||
|
|
||||||
|
total_count = db_session.query(Printer).count()
|
||||||
|
print(f"\n🎉 {created_count} neue Test-Drucker erstellt!")
|
||||||
|
print(f"📊 Insgesamt {total_count} Drucker in der Datenbank.")
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
print(f"❌ Fehler beim Erstellen der Test-Drucker: {str(e)}")
|
||||||
|
db_session.rollback()
|
||||||
|
finally:
|
||||||
|
db_session.close()
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
print("🚀 Erstelle Test-Drucker für MYP Plattform...")
|
||||||
|
create_test_printers()
|
||||||
|
print("✅ Fertig!")
|
Binary file not shown.
Binary file not shown.
@ -40,6 +40,138 @@ async function makeApiCall(url, method = 'GET', data = null) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Logs laden und anzeigen
|
||||||
|
async function loadLogs() {
|
||||||
|
const logsContainer = document.getElementById('logs-container');
|
||||||
|
if (!logsContainer) return;
|
||||||
|
|
||||||
|
// Lade-Animation anzeigen
|
||||||
|
logsContainer.innerHTML = `
|
||||||
|
<div class="flex justify-center items-center py-12">
|
||||||
|
<div class="animate-spin rounded-full h-12 w-12 border-b-2 border-indigo-600 dark:border-indigo-400"></div>
|
||||||
|
</div>
|
||||||
|
`;
|
||||||
|
|
||||||
|
try {
|
||||||
|
const response = await fetch('/api/logs');
|
||||||
|
if (!response.ok) throw new Error('Fehler beim Laden der Logs');
|
||||||
|
|
||||||
|
const data = await response.json();
|
||||||
|
window.logsData = data.logs || [];
|
||||||
|
window.filteredLogs = [...window.logsData];
|
||||||
|
renderLogs();
|
||||||
|
updateLogStatistics();
|
||||||
|
scrollLogsToBottom();
|
||||||
|
} catch (error) {
|
||||||
|
console.error('Fehler beim Laden der Logs:', error);
|
||||||
|
logsContainer.innerHTML = `
|
||||||
|
<div class="text-center py-8">
|
||||||
|
<div class="text-red-600 dark:text-red-400 text-xl mb-2">Fehler beim Laden der Logs</div>
|
||||||
|
<p class="text-gray-600 dark:text-gray-400">${error.message}</p>
|
||||||
|
<button onclick="loadLogs()" class="mt-4 px-4 py-2 bg-indigo-600 text-white rounded-lg hover:bg-indigo-700 transition-colors">
|
||||||
|
Erneut versuchen
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
`;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Logs rendern
|
||||||
|
function renderLogs() {
|
||||||
|
const logsContainer = document.getElementById('logs-container');
|
||||||
|
if (!logsContainer || !window.filteredLogs) return;
|
||||||
|
|
||||||
|
if (window.filteredLogs.length === 0) {
|
||||||
|
logsContainer.innerHTML = `
|
||||||
|
<div class="text-center py-8">
|
||||||
|
<p class="text-gray-600 dark:text-gray-400">Keine Logs gefunden</p>
|
||||||
|
</div>
|
||||||
|
`;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const logsHtml = window.filteredLogs.map(log => {
|
||||||
|
const levelColor = getLogLevelColor(log.level);
|
||||||
|
return `
|
||||||
|
<div class="bg-white/40 dark:bg-slate-700/40 rounded-lg p-4 border ${levelColor.border}">
|
||||||
|
<div class="flex items-start space-x-3">
|
||||||
|
<span class="inline-block px-2 py-1 text-xs font-semibold rounded-full ${levelColor.bg} ${levelColor.text}">
|
||||||
|
${log.level}
|
||||||
|
</span>
|
||||||
|
<div class="flex-1">
|
||||||
|
<div class="flex items-center justify-between mb-1">
|
||||||
|
<span class="text-sm font-medium text-slate-600 dark:text-slate-400">${log.category}</span>
|
||||||
|
<span class="text-xs text-slate-500 dark:text-slate-500">${log.timestamp}</span>
|
||||||
|
</div>
|
||||||
|
<p class="text-sm text-slate-900 dark:text-white break-all">${log.message}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
`;
|
||||||
|
}).join('');
|
||||||
|
|
||||||
|
logsContainer.innerHTML = logsHtml;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Log-Level-Farben bestimmen
|
||||||
|
function getLogLevelColor(level) {
|
||||||
|
const colors = {
|
||||||
|
'ERROR': {
|
||||||
|
bg: 'bg-red-100 dark:bg-red-900/30',
|
||||||
|
text: 'text-red-800 dark:text-red-200',
|
||||||
|
border: 'border-red-200 dark:border-red-700'
|
||||||
|
},
|
||||||
|
'WARNING': {
|
||||||
|
bg: 'bg-yellow-100 dark:bg-yellow-900/30',
|
||||||
|
text: 'text-yellow-800 dark:text-yellow-200',
|
||||||
|
border: 'border-yellow-200 dark:border-yellow-700'
|
||||||
|
},
|
||||||
|
'INFO': {
|
||||||
|
bg: 'bg-blue-100 dark:bg-blue-900/30',
|
||||||
|
text: 'text-blue-800 dark:text-blue-200',
|
||||||
|
border: 'border-blue-200 dark:border-blue-700'
|
||||||
|
},
|
||||||
|
'DEBUG': {
|
||||||
|
bg: 'bg-gray-100 dark:bg-gray-900/30',
|
||||||
|
text: 'text-gray-800 dark:text-gray-200',
|
||||||
|
border: 'border-gray-200 dark:border-gray-700'
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
return colors[level.toUpperCase()] || colors['INFO'];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Log-Statistiken aktualisieren
|
||||||
|
function updateLogStatistics() {
|
||||||
|
if (!window.logsData) return;
|
||||||
|
|
||||||
|
const stats = {
|
||||||
|
total: window.logsData.length,
|
||||||
|
errors: window.logsData.filter(log => log.level.toUpperCase() === 'ERROR').length,
|
||||||
|
warnings: window.logsData.filter(log => log.level.toUpperCase() === 'WARNING').length,
|
||||||
|
info: window.logsData.filter(log => log.level.toUpperCase() === 'INFO').length
|
||||||
|
};
|
||||||
|
|
||||||
|
// Aktualisiere Statistik-Anzeigen falls vorhanden
|
||||||
|
const totalElement = document.getElementById('log-stats-total');
|
||||||
|
const errorsElement = document.getElementById('log-stats-errors');
|
||||||
|
const warningsElement = document.getElementById('log-stats-warnings');
|
||||||
|
const infoElement = document.getElementById('log-stats-info');
|
||||||
|
|
||||||
|
if (totalElement) totalElement.textContent = stats.total;
|
||||||
|
if (errorsElement) errorsElement.textContent = stats.errors;
|
||||||
|
if (warningsElement) warningsElement.textContent = stats.warnings;
|
||||||
|
if (infoElement) infoElement.textContent = stats.info;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Zum Ende der Logs scrollen
|
||||||
|
function scrollLogsToBottom() {
|
||||||
|
const logsContainer = document.getElementById('logs-container');
|
||||||
|
if (logsContainer) {
|
||||||
|
logsContainer.scrollTop = logsContainer.scrollHeight;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Notification anzeigen
|
// Notification anzeigen
|
||||||
function showNotification(message, type = 'info') {
|
function showNotification(message, type = 'info') {
|
||||||
// Erstelle Notification-Element falls nicht vorhanden
|
// Erstelle Notification-Element falls nicht vorhanden
|
||||||
@ -210,5 +342,9 @@ window.adminSystem = {
|
|||||||
restartSystem,
|
restartSystem,
|
||||||
editSettings,
|
editSettings,
|
||||||
updateSystemStatus,
|
updateSystemStatus,
|
||||||
updateDatabaseStatus
|
updateDatabaseStatus,
|
||||||
|
loadLogs,
|
||||||
|
renderLogs,
|
||||||
|
updateLogStatistics,
|
||||||
|
scrollLogsToBottom
|
||||||
};
|
};
|
@ -831,15 +831,36 @@
|
|||||||
<!-- Drucker -->
|
<!-- Drucker -->
|
||||||
<div>
|
<div>
|
||||||
<label for="eventPrinter" class="block text-sm font-medium text-slate-700 dark:text-slate-300 mb-2">
|
<label for="eventPrinter" class="block text-sm font-medium text-slate-700 dark:text-slate-300 mb-2">
|
||||||
Produktionseinheit <span class="text-red-500">*</span>
|
Produktionseinheit
|
||||||
|
<span class="text-xs text-slate-500 dark:text-slate-400 ml-1">(Optional - Automatische Zuweisung verfügbar)</span>
|
||||||
</label>
|
</label>
|
||||||
<select id="eventPrinter" name="printerId" required
|
<select id="eventPrinter" name="printerId"
|
||||||
class="block w-full px-3 py-2 border border-gray-300 dark:border-slate-600 rounded-lg bg-white dark:bg-slate-800 text-slate-900 dark:text-white focus:ring-2 focus:ring-blue-500 focus:border-blue-500">
|
class="block w-full px-3 py-2 border border-gray-300 dark:border-slate-600 rounded-lg bg-white dark:bg-slate-800 text-slate-900 dark:text-white focus:ring-2 focus:ring-blue-500 focus:border-blue-500">
|
||||||
<option value="">Drucker auswählen</option>
|
<option value="">🤖 Intelligente Automatische Zuweisung</option>
|
||||||
{% for printer in printers %}
|
<optgroup label="─── Verfügbare Produktionseinheiten ───">
|
||||||
<option value="{{ printer.id }}">{{ printer.name }} {% if printer.location %}({{ printer.location }}){% endif %}</option>
|
{% for printer in printers %}
|
||||||
{% endfor %}
|
<option value="{{ printer.id }}">
|
||||||
|
🖨️ {{ printer.name }}
|
||||||
|
{% if printer.location %}(📍 {{ printer.location }}){% endif %}
|
||||||
|
{% if printer.status == 'offline' %} - ⚠️ Offline{% endif %}
|
||||||
|
</option>
|
||||||
|
{% endfor %}
|
||||||
|
</optgroup>
|
||||||
</select>
|
</select>
|
||||||
|
<div class="mt-2 p-3 bg-blue-50 dark:bg-blue-900/20 rounded-lg border border-blue-200 dark:border-blue-800">
|
||||||
|
<div class="flex items-start gap-2">
|
||||||
|
<svg class="w-4 h-4 text-blue-600 dark:text-blue-400 mt-0.5 flex-shrink-0" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||||
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"/>
|
||||||
|
</svg>
|
||||||
|
<div class="text-xs text-blue-700 dark:text-blue-300">
|
||||||
|
<strong>Intelligente Zuweisung berücksichtigt:</strong><br>
|
||||||
|
• Verfügbarkeit und Auslastung der Drucker<br>
|
||||||
|
• Materialkompatibilität und Druckqualität<br>
|
||||||
|
• Standort und Rüstzeiten<br>
|
||||||
|
• Wartungszyklen und Prioritätsstufen
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Priorität -->
|
<!-- Priorität -->
|
||||||
@ -1035,6 +1056,136 @@ document.addEventListener('DOMContentLoaded', function() {
|
|||||||
closeEventModal();
|
closeEventModal();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Intelligente Druckerempfehlung
|
||||||
|
function updatePrinterRecommendation() {
|
||||||
|
const printerSelect = document.getElementById('eventPrinter');
|
||||||
|
const startTime = document.getElementById('eventStart').value;
|
||||||
|
const endTime = document.getElementById('eventEnd').value;
|
||||||
|
const priority = document.getElementById('eventPriority').value;
|
||||||
|
|
||||||
|
if (printerSelect.value === '' && startTime && endTime) {
|
||||||
|
// Dynamische Empfehlung anzeigen
|
||||||
|
showSmartRecommendation(startTime, endTime, priority);
|
||||||
|
} else {
|
||||||
|
hideSmartRecommendation();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function showSmartRecommendation(start, end, priority) {
|
||||||
|
let existingRecommendation = document.getElementById('smart-recommendation');
|
||||||
|
if (existingRecommendation) {
|
||||||
|
existingRecommendation.remove();
|
||||||
|
}
|
||||||
|
|
||||||
|
const printerContainer = document.getElementById('eventPrinter').parentElement;
|
||||||
|
const recommendationDiv = document.createElement('div');
|
||||||
|
recommendationDiv.id = 'smart-recommendation';
|
||||||
|
recommendationDiv.className = 'mt-3 p-4 bg-gradient-to-r from-green-50 to-blue-50 dark:from-green-900/20 dark:to-blue-900/20 rounded-lg border border-green-200 dark:border-green-800 transition-all duration-300';
|
||||||
|
|
||||||
|
// Simuliere intelligente Empfehlung basierend auf Zeit und Priorität
|
||||||
|
const recommendations = getSmartRecommendation(start, end, priority);
|
||||||
|
|
||||||
|
recommendationDiv.innerHTML = `
|
||||||
|
<div class="flex items-start gap-3">
|
||||||
|
<div class="w-8 h-8 bg-gradient-to-br from-green-400 to-blue-500 rounded-full flex items-center justify-center">
|
||||||
|
<svg class="w-4 h-4 text-white" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||||
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9.663 17h4.673M12 3v1m6.364 1.636l-.707.707M21 12h-1M4 12H3m3.343-5.657l-.707-.707m2.828 9.9a5 5 0 117.072 0l-.548.547A3.374 3.374 0 0014 18.469V19a2 2 0 11-4 0v-.531c0-.895-.356-1.754-.988-2.386l-.548-.547z"/>
|
||||||
|
</svg>
|
||||||
|
</div>
|
||||||
|
<div class="flex-1">
|
||||||
|
<h4 class="font-semibold text-green-800 dark:text-green-300 mb-2">🎯 Intelligente Empfehlung</h4>
|
||||||
|
<div class="text-sm text-green-700 dark:text-green-400">
|
||||||
|
<div class="flex items-center gap-2 mb-1">
|
||||||
|
<span class="font-medium">Empfohlener Drucker:</span>
|
||||||
|
<span class="px-2 py-1 bg-white dark:bg-slate-800 rounded-full border border-green-300 dark:border-green-600">
|
||||||
|
🖨️ ${recommendations.printer}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<div class="text-xs text-green-600 dark:text-green-500 mt-2">
|
||||||
|
💡 ${recommendations.reason}
|
||||||
|
</div>
|
||||||
|
<div class="flex items-center gap-4 mt-2 text-xs">
|
||||||
|
<span>⚡ Verfügbarkeit: ${recommendations.availability}</span>
|
||||||
|
<span>📊 Auslastung: ${recommendations.utilization}</span>
|
||||||
|
<span>🎯 Eignung: ${recommendations.suitability}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
`;
|
||||||
|
|
||||||
|
printerContainer.appendChild(recommendationDiv);
|
||||||
|
|
||||||
|
// Animation
|
||||||
|
setTimeout(() => {
|
||||||
|
recommendationDiv.classList.add('animate-pulse');
|
||||||
|
setTimeout(() => recommendationDiv.classList.remove('animate-pulse'), 1000);
|
||||||
|
}, 100);
|
||||||
|
}
|
||||||
|
|
||||||
|
function hideSmartRecommendation() {
|
||||||
|
const existingRecommendation = document.getElementById('smart-recommendation');
|
||||||
|
if (existingRecommendation) {
|
||||||
|
existingRecommendation.style.opacity = '0';
|
||||||
|
existingRecommendation.style.transform = 'translateY(-10px)';
|
||||||
|
setTimeout(() => existingRecommendation.remove(), 300);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function getSmartRecommendation(start, end, priority) {
|
||||||
|
// Simuliere intelligente Logik basierend auf Zeit und Priorität
|
||||||
|
const startHour = new Date(start).getHours();
|
||||||
|
const duration = (new Date(end) - new Date(start)) / (1000 * 60 * 60); // Stunden
|
||||||
|
|
||||||
|
let recommendations = {
|
||||||
|
printer: "MYP-Drucker-01 (Halle A)",
|
||||||
|
reason: "Optimale Verfügbarkeit und geringe Auslastung im gewählten Zeitraum",
|
||||||
|
availability: "98%",
|
||||||
|
utilization: "24%",
|
||||||
|
suitability: "Ausgezeichnet"
|
||||||
|
};
|
||||||
|
|
||||||
|
if (priority === 'urgent') {
|
||||||
|
recommendations = {
|
||||||
|
printer: "MYP-Express-Drucker (Halle B)",
|
||||||
|
reason: "Schnellster verfügbarer Drucker für dringende Aufträge",
|
||||||
|
availability: "100%",
|
||||||
|
utilization: "15%",
|
||||||
|
suitability: "Perfekt"
|
||||||
|
};
|
||||||
|
} else if (startHour >= 18 || startHour <= 6) {
|
||||||
|
recommendations = {
|
||||||
|
printer: "MYP-Nacht-Drucker (Halle C)",
|
||||||
|
reason: "Speziell für Nachtschichten optimiert",
|
||||||
|
availability: "95%",
|
||||||
|
utilization: "12%",
|
||||||
|
suitability: "Optimal"
|
||||||
|
};
|
||||||
|
} else if (duration > 8) {
|
||||||
|
recommendations = {
|
||||||
|
printer: "MYP-Langzeit-Drucker (Halle A)",
|
||||||
|
reason: "Zuverlässig für lange Druckaufträge",
|
||||||
|
availability: "90%",
|
||||||
|
utilization: "35%",
|
||||||
|
suitability: "Sehr gut"
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
return recommendations;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Event Listeners für dynamische Empfehlung
|
||||||
|
document.getElementById('eventStart').addEventListener('change', updatePrinterRecommendation);
|
||||||
|
document.getElementById('eventEnd').addEventListener('change', updatePrinterRecommendation);
|
||||||
|
document.getElementById('eventPriority').addEventListener('change', updatePrinterRecommendation);
|
||||||
|
document.getElementById('eventPrinter').addEventListener('change', function() {
|
||||||
|
if (this.value !== '') {
|
||||||
|
hideSmartRecommendation();
|
||||||
|
} else {
|
||||||
|
updatePrinterRecommendation();
|
||||||
|
}
|
||||||
|
});
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
{% endblock %}
|
{% endblock %}
|
@ -1219,12 +1219,14 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
|
// Global variables
|
||||||
let allPrinters = [];
|
let allPrinters = [];
|
||||||
let filteredPrinters = [];
|
let filteredPrinters = [];
|
||||||
let isAutoRefreshEnabled = true;
|
let isAutoRefreshEnabled = true;
|
||||||
let autoRefreshInterval;
|
let autoRefreshInterval;
|
||||||
let currentGridView = 'grid';
|
let currentGridView = 'grid';
|
||||||
let isMaintenanceMode = false;
|
let isMaintenanceMode = false;
|
||||||
|
let printerManager;
|
||||||
|
|
||||||
// Enhanced Printer Management System
|
// Enhanced Printer Management System
|
||||||
class PrinterManager {
|
class PrinterManager {
|
||||||
@ -1920,20 +1922,23 @@ class PrinterManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Initialize Printer Manager
|
// Initialize Printer Manager
|
||||||
let printerManager;
|
printerManager = new PrinterManager();
|
||||||
document.addEventListener('DOMContentLoaded', () => {
|
|
||||||
printerManager = new PrinterManager();
|
|
||||||
});
|
|
||||||
|
|
||||||
// Global functions for UI interactions
|
// Global functions for UI interactions
|
||||||
function refreshPrinters() {
|
function refreshPrinters() {
|
||||||
const button = document.getElementById('refresh-button');
|
const button = document.getElementById('refresh-button');
|
||||||
button.disabled = true;
|
if (button) {
|
||||||
button.querySelector('svg').classList.add('animate-spin');
|
button.disabled = true;
|
||||||
|
const svg = button.querySelector('svg');
|
||||||
|
if (svg) svg.classList.add('animate-spin');
|
||||||
|
}
|
||||||
|
|
||||||
printerManager.loadPrinters().finally(() => {
|
printerManager.loadPrinters().finally(() => {
|
||||||
button.disabled = false;
|
if (button) {
|
||||||
button.querySelector('svg').classList.remove('animate-spin');
|
button.disabled = false;
|
||||||
|
const svg = button.querySelector('svg');
|
||||||
|
if (svg) svg.classList.remove('animate-spin');
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1942,14 +1947,18 @@ function toggleAutoRefresh() {
|
|||||||
const button = document.getElementById('auto-refresh-toggle');
|
const button = document.getElementById('auto-refresh-toggle');
|
||||||
|
|
||||||
if (isAutoRefreshEnabled) {
|
if (isAutoRefreshEnabled) {
|
||||||
button.textContent = 'Auto-Refresh: ON';
|
if (button) {
|
||||||
button.classList.remove('bg-gray-500');
|
button.textContent = 'Auto-Refresh: ON';
|
||||||
button.classList.add('bg-mercedes-blue');
|
button.classList.remove('bg-gray-500');
|
||||||
|
button.classList.add('bg-mercedes-blue');
|
||||||
|
}
|
||||||
printerManager.startAutoRefresh();
|
printerManager.startAutoRefresh();
|
||||||
} else {
|
} else {
|
||||||
button.textContent = 'Auto-Refresh: OFF';
|
if (button) {
|
||||||
button.classList.remove('bg-mercedes-blue');
|
button.textContent = 'Auto-Refresh: OFF';
|
||||||
button.classList.add('bg-gray-500');
|
button.classList.remove('bg-mercedes-blue');
|
||||||
|
button.classList.add('bg-gray-500');
|
||||||
|
}
|
||||||
printerManager.stopAutoRefresh();
|
printerManager.stopAutoRefresh();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1958,12 +1967,14 @@ function toggleMaintenanceMode() {
|
|||||||
isMaintenanceMode = !isMaintenanceMode;
|
isMaintenanceMode = !isMaintenanceMode;
|
||||||
const button = document.getElementById('maintenance-toggle');
|
const button = document.getElementById('maintenance-toggle');
|
||||||
|
|
||||||
if (isMaintenanceMode) {
|
if (isMaintenanceMode && button) {
|
||||||
button.classList.add('bg-orange-500', 'text-white');
|
button.classList.add('bg-orange-500', 'text-white');
|
||||||
button.querySelector('span').textContent = 'Wartung aktiv';
|
const span = button.querySelector('span');
|
||||||
} else {
|
if (span) span.textContent = 'Wartung aktiv';
|
||||||
|
} else if (button) {
|
||||||
button.classList.remove('bg-orange-500', 'text-white');
|
button.classList.remove('bg-orange-500', 'text-white');
|
||||||
button.querySelector('span').textContent = 'Wartungsmodus';
|
const span = button.querySelector('span');
|
||||||
|
if (span) span.textContent = 'Wartungsmodus';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1977,12 +1988,12 @@ function toggleGridView(view) {
|
|||||||
gridBtn.classList.remove('text-mercedes-gray', 'hover:bg-mercedes-silver');
|
gridBtn.classList.remove('text-mercedes-gray', 'hover:bg-mercedes-silver');
|
||||||
listBtn.classList.remove('bg-mercedes-blue', 'text-white');
|
listBtn.classList.remove('bg-mercedes-blue', 'text-white');
|
||||||
listBtn.classList.add('text-mercedes-gray', 'hover:bg-mercedes-silver');
|
listBtn.classList.add('text-mercedes-gray', 'hover:bg-mercedes-silver');
|
||||||
} else {
|
} else {
|
||||||
listBtn.classList.add('bg-mercedes-blue', 'text-white');
|
listBtn.classList.add('bg-mercedes-blue', 'text-white');
|
||||||
listBtn.classList.remove('text-mercedes-gray', 'hover:bg-mercedes-silver');
|
listBtn.classList.remove('text-mercedes-gray', 'hover:bg-mercedes-silver');
|
||||||
gridBtn.classList.remove('bg-mercedes-blue', 'text-white');
|
gridBtn.classList.remove('bg-mercedes-blue', 'text-white');
|
||||||
gridBtn.classList.add('text-mercedes-gray', 'hover:bg-mercedes-silver');
|
gridBtn.classList.add('text-mercedes-gray', 'hover:bg-mercedes-silver');
|
||||||
}
|
}
|
||||||
|
|
||||||
printerManager.displayPrinters();
|
printerManager.displayPrinters();
|
||||||
}
|
}
|
||||||
@ -2010,11 +2021,9 @@ function closePrinterModal() {
|
|||||||
|
|
||||||
function closePrinterDetailsModal() {
|
function closePrinterDetailsModal() {
|
||||||
printerManager.closeModal('printerDetailsModal');
|
printerManager.closeModal('printerDetailsModal');
|
||||||
}
|
}
|
||||||
|
|
||||||
// Initialisierung beim Laden der Seite
|
// Initialisierung beim Laden der Seite
|
||||||
let printerManager;
|
|
||||||
|
|
||||||
document.addEventListener('DOMContentLoaded', function() {
|
document.addEventListener('DOMContentLoaded', function() {
|
||||||
console.log('🚀 Mercedes-Benz MYP Printer Management System wird initialisiert...');
|
console.log('🚀 Mercedes-Benz MYP Printer Management System wird initialisiert...');
|
||||||
printerManager = new PrinterManager();
|
printerManager = new PrinterManager();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user