208 lines
10 KiB
HTML
208 lines
10 KiB
HTML
{% extends "base.html" %}
|
|
|
|
{% block title %}Drucker hinzufügen - MYP Admin{% endblock %}
|
|
|
|
{% block extra_css %}
|
|
<!-- Zusätzliche Styles für diese Seite -->
|
|
<style>
|
|
.form-container {
|
|
background: rgba(255, 255, 255, 0.95);
|
|
backdrop-filter: blur(10px);
|
|
border: 1px solid rgba(255, 255, 255, 0.2);
|
|
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.1);
|
|
}
|
|
|
|
.dark .form-container {
|
|
background: rgba(30, 41, 59, 0.95);
|
|
border: 1px solid rgba(255, 255, 255, 0.1);
|
|
}
|
|
</style>
|
|
{% endblock %}
|
|
|
|
{% block content %}
|
|
<div class="min-h-screen py-8">
|
|
<div class="max-w-2xl mx-auto px-4">
|
|
<!-- Header -->
|
|
<div class="form-container rounded-lg p-6 mb-6">
|
|
<div class="flex items-center justify-between">
|
|
<div class="flex items-center space-x-3">
|
|
<i class="fas fa-print text-blue-600 dark:text-blue-400 text-2xl"></i>
|
|
<h1 class="text-2xl font-bold text-slate-800 dark:text-white">Neuen Drucker hinzufügen</h1>
|
|
</div>
|
|
<a href="{{ url_for('admin_page', tab='printers') }}"
|
|
class="bg-slate-500 hover:bg-slate-600 text-white px-4 py-2 rounded-lg transition-colors">
|
|
<i class="fas fa-arrow-left mr-2"></i>Zurück
|
|
</a>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Formular -->
|
|
<div class="form-container rounded-lg p-6">
|
|
<form action="{{ url_for('admin_create_printer_form') }}" method="POST" class="space-y-6">
|
|
<!-- CSRF Token -->
|
|
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}"/>
|
|
|
|
<!-- Name -->
|
|
<div>
|
|
<label for="name" class="block text-sm font-medium text-slate-700 dark:text-slate-300 mb-2">
|
|
<i class="fas fa-tag mr-2"></i>Drucker-Name *
|
|
</label>
|
|
<input type="text"
|
|
id="name"
|
|
name="name"
|
|
required
|
|
class="w-full px-3 py-2 border border-slate-300 dark:border-slate-600 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent bg-white dark:bg-slate-800 text-slate-900 dark:text-white"
|
|
placeholder="3D-Drucker Raum A001">
|
|
</div>
|
|
|
|
<!-- IP-Adresse -->
|
|
<div>
|
|
<label for="ip_address" class="block text-sm font-medium text-slate-700 dark:text-slate-300 mb-2">
|
|
<i class="fas fa-network-wired mr-2"></i>IP-Adresse *
|
|
</label>
|
|
<input type="text"
|
|
id="ip_address"
|
|
name="ip_address"
|
|
required
|
|
pattern="^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$"
|
|
class="w-full px-3 py-2 border border-slate-300 dark:border-slate-600 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent bg-white dark:bg-slate-800 text-slate-900 dark:text-white"
|
|
placeholder="192.168.1.100">
|
|
<p class="text-sm text-slate-500 dark:text-slate-400 mt-1">IP-Adresse der Tapo-Steckdose</p>
|
|
</div>
|
|
|
|
<!-- Modell -->
|
|
<div>
|
|
<label for="model" class="block text-sm font-medium text-slate-700 dark:text-slate-300 mb-2">
|
|
<i class="fas fa-cogs mr-2"></i>Drucker-Modell
|
|
</label>
|
|
<input type="text"
|
|
id="model"
|
|
name="model"
|
|
class="w-full px-3 py-2 border border-slate-300 dark:border-slate-600 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent bg-white dark:bg-slate-800 text-slate-900 dark:text-white"
|
|
placeholder="Ender 3 V2">
|
|
</div>
|
|
|
|
<!-- Standort -->
|
|
<div>
|
|
<label for="location" class="block text-sm font-medium text-slate-700 dark:text-slate-300 mb-2">
|
|
<i class="fas fa-map-marker-alt mr-2"></i>Standort
|
|
</label>
|
|
<input type="text"
|
|
id="location"
|
|
name="location"
|
|
class="w-full px-3 py-2 border border-slate-300 dark:border-slate-600 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent bg-white dark:bg-slate-800 text-slate-900 dark:text-white"
|
|
placeholder="Raum A001, Erdgeschoss">
|
|
</div>
|
|
|
|
<!-- Beschreibung -->
|
|
<div>
|
|
<label for="description" class="block text-sm font-medium text-slate-700 dark:text-slate-300 mb-2">
|
|
<i class="fas fa-comment mr-2"></i>Beschreibung
|
|
</label>
|
|
<textarea id="description"
|
|
name="description"
|
|
rows="3"
|
|
class="w-full px-3 py-2 border border-slate-300 dark:border-slate-600 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent bg-white dark:bg-slate-800 text-slate-900 dark:text-white"
|
|
placeholder="Zusätzliche Informationen zum Drucker..."></textarea>
|
|
</div>
|
|
|
|
<!-- Status -->
|
|
<div>
|
|
<label for="status" class="block text-sm font-medium text-slate-700 dark:text-slate-300 mb-2">
|
|
<i class="fas fa-circle mr-2"></i>Anfangsstatus
|
|
</label>
|
|
<select id="status"
|
|
name="status"
|
|
class="w-full px-3 py-2 border border-slate-300 dark:border-slate-600 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent bg-white dark:bg-slate-800 text-slate-900 dark:text-white">
|
|
<option value="available">Verfügbar</option>
|
|
<option value="offline">Offline</option>
|
|
<option value="maintenance">Wartung</option>
|
|
</select>
|
|
</div>
|
|
|
|
<!-- Hinweise -->
|
|
<div class="bg-blue-50 dark:bg-blue-900/20 border border-blue-200 dark:border-blue-800 rounded-lg p-4">
|
|
<div class="flex">
|
|
<i class="fas fa-info-circle text-blue-500 dark:text-blue-400 mt-0.5 mr-3"></i>
|
|
<div class="text-sm text-blue-700 dark:text-blue-300">
|
|
<p class="font-semibold mb-1">Hinweise:</p>
|
|
<ul class="list-disc list-inside space-y-1">
|
|
<li>Felder mit * sind Pflichtfelder</li>
|
|
<li>Die IP-Adresse sollte die Adresse der Tapo-Steckdose sein</li>
|
|
<li>Der Drucker wird automatisch mit Standard-Tapo-Einstellungen konfiguriert</li>
|
|
<li>Status "Verfügbar" bedeutet bereit für Druckaufträge</li>
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Aktionen -->
|
|
<div class="flex space-x-3 pt-4">
|
|
<button type="submit"
|
|
class="flex-1 bg-blue-600 hover:bg-blue-700 text-white px-4 py-2 rounded-lg transition-colors">
|
|
<i class="fas fa-save mr-2"></i>Drucker erstellen
|
|
</button>
|
|
<a href="{{ url_for('admin_page', tab='printers') }}"
|
|
class="flex-1 bg-slate-500 hover:bg-slate-600 text-white px-4 py-2 rounded-lg text-center transition-colors">
|
|
<i class="fas fa-times mr-2"></i>Abbrechen
|
|
</a>
|
|
</div>
|
|
</form>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
{% endblock %}
|
|
|
|
{% block extra_js %}
|
|
<!-- JavaScript für Form-Validierung -->
|
|
<script>
|
|
document.addEventListener('DOMContentLoaded', function() {
|
|
const form = document.querySelector('form');
|
|
const nameInput = document.getElementById('name');
|
|
const ipInput = document.getElementById('ip_address');
|
|
|
|
// IP-Adresse-Validierung
|
|
ipInput.addEventListener('blur', function() {
|
|
const ip = this.value;
|
|
const ipRegex = /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/;
|
|
|
|
if (ip && !ipRegex.test(ip)) {
|
|
this.classList.add('border-red-500');
|
|
this.classList.remove('border-slate-300', 'dark:border-slate-600');
|
|
} else {
|
|
this.classList.remove('border-red-500');
|
|
this.classList.add('border-slate-300', 'dark:border-slate-600');
|
|
}
|
|
});
|
|
|
|
// Form-Submit-Validierung
|
|
form.addEventListener('submit', function(e) {
|
|
const name = nameInput.value.trim();
|
|
const ip = ipInput.value.trim();
|
|
const ipRegex = /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/;
|
|
|
|
if (!name) {
|
|
e.preventDefault();
|
|
if (typeof showFlashMessage === 'function') {
|
|
showFlashMessage('Bitte geben Sie einen Drucker-Namen ein.', 'error');
|
|
} else {
|
|
alert('Bitte geben Sie einen Drucker-Namen ein.');
|
|
}
|
|
nameInput.focus();
|
|
return;
|
|
}
|
|
|
|
if (!ip || !ipRegex.test(ip)) {
|
|
e.preventDefault();
|
|
if (typeof showFlashMessage === 'function') {
|
|
showFlashMessage('Bitte geben Sie eine gültige IP-Adresse ein.', 'error');
|
|
} else {
|
|
alert('Bitte geben Sie eine gültige IP-Adresse ein.');
|
|
}
|
|
ipInput.focus();
|
|
return;
|
|
}
|
|
});
|
|
});
|
|
</script>
|
|
{% endblock %} |