change alter zu geburtsdatum

This commit is contained in:
Carsten Graf
2025-06-10 10:03:53 +02:00
parent 9305ef6d5f
commit 7856bb229b
2 changed files with 127 additions and 76 deletions

View File

@@ -130,49 +130,6 @@
transform: translateY(-2px); transform: translateY(-2px);
} }
.data-table {
margin-top: 30px;
background: #f8f9fa;
border-radius: 10px;
padding: 20px;
max-height: 300px;
overflow-y: auto;
}
.data-table h3 {
color: #333;
margin-bottom: 15px;
text-align: center;
}
.data-entry {
background: white;
padding: 15px;
margin-bottom: 10px;
border-radius: 8px;
border-left: 4px solid #667eea;
animation: fadeIn 0.3s ease-out;
}
@keyframes fadeIn {
from {
opacity: 0;
transform: translateX(-20px);
}
to {
opacity: 1;
transform: translateX(0);
}
}
.data-entry strong {
color: #333;
}
.data-entry span {
color: #666;
}
.success-message { .success-message {
background: #d4edda; background: #d4edda;
color: #155724; color: #155724;
@@ -183,13 +140,6 @@
animation: fadeIn 0.3s ease-out; animation: fadeIn 0.3s ease-out;
} }
.counter {
text-align: center;
margin-top: 15px;
color: #666;
font-weight: 600;
}
.read-uid-btn { .read-uid-btn {
background: linear-gradient(135deg, #28a745 0%, #20c997 100%); background: linear-gradient(135deg, #28a745 0%, #20c997 100%);
color: white; color: white;
@@ -228,6 +178,52 @@
50% { transform: scale(1.05); } 50% { transform: scale(1.05); }
100% { transform: scale(1); } 100% { transform: scale(1); }
} }
@keyframes fadeIn {
from {
opacity: 0;
transform: translateX(-20px);
}
to {
opacity: 1;
transform: translateX(0);
}
}
/* Geburtsdatum Styling */
.date-input-group {
position: relative;
}
.date-input-group input[type="date"] {
position: relative;
color-scheme: light;
}
.date-input-group input[type="date"]::-webkit-calendar-picker-indicator {
background: url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="%23667eea" viewBox="0 0 16 16"><path d="M3.5 0a.5.5 0 0 1 .5.5V1h8V.5a.5.5 0 0 1 1 0V1h1a2 2 0 0 1 2 2v11a2 2 0 0 1-2 2H2a2 2 0 0 1-2-2V3a2 2 0 0 1 2-2h1V.5a.5.5 0 0 1 .5-.5zM1 4v10a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1V4H1z"/></svg>') no-repeat;
background-size: contain;
width: 20px;
height: 20px;
cursor: pointer;
}
.age-display {
position: absolute;
right: 15px;
top: 50%;
transform: translateY(-50%);
color: #667eea;
font-weight: 600;
font-size: 0.9em;
pointer-events: none;
background: rgba(255, 255, 255, 0.9);
padding: 2px 8px;
border-radius: 4px;
border: 1px solid #e1e5e9;
}
@media (max-width: 600px) {
.container { .container {
padding: 30px 20px; padding: 30px 20px;
margin: 10px; margin: 10px;
@@ -236,4 +232,4 @@
.btn-container { .btn-container {
flex-direction: column; flex-direction: column;
} }
}

View File

@@ -47,8 +47,11 @@
</div> </div>
<div class="form-group"> <div class="form-group">
<label for="alter">Alter <span class="required">*</span></label> <label for="geburtsdatum">Geburtsdatum <span class="required">*</span></label>
<input type="number" id="alter" name="alter" placeholder="Alter eingeben" min="1" max="120" required> <div class="date-input-group">
<input type="date" id="geburtsdatum" name="geburtsdatum" required max="">
<div id="ageDisplay" class="age-display" style="display: none;"></div>
</div>
</div> </div>
<div class="btn-container"> <div class="btn-container">
@@ -60,11 +63,55 @@
</div> </div>
<script> <script>
// Globale Variablen // Globale Variablen
let rfidData = []; let rfidData = [];
let isLoading = false; let isLoading = false;
// Maximales Datum auf heute setzen
document.addEventListener('DOMContentLoaded', function() {
const today = new Date().toISOString().split('T')[0];
document.getElementById('geburtsdatum').setAttribute('max', today);
});
// Alter berechnen und anzeigen
function calculateAge(birthDate) {
const today = new Date();
const birth = new Date(birthDate);
let age = today.getFullYear() - birth.getFullYear();
const monthDiff = today.getMonth() - birth.getMonth();
if (monthDiff < 0 || (monthDiff === 0 && today.getDate() < birth.getDate())) {
age--;
}
return age;
}
// Geburtsdatum Change Event
document.getElementById('geburtsdatum').addEventListener('change', function(e) {
const birthDate = e.target.value;
const ageDisplay = document.getElementById('ageDisplay');
if (birthDate) {
const age = calculateAge(birthDate);
if (age >= 0 && age <= 150) {
ageDisplay.textContent = `${age} Jahre`;
ageDisplay.style.display = 'block';
} else {
ageDisplay.style.display = 'none';
if (age < 0) {
showErrorMessage('Das Geburtsdatum kann nicht in der Zukunft liegen!');
e.target.value = '';
} else {
showErrorMessage('Bitte überprüfen Sie das Geburtsdatum!');
e.target.value = '';
}
}
} else {
ageDisplay.style.display = 'none';
}
});
// Form Submit Handler // Form Submit Handler
document.getElementById('rfidForm').addEventListener('submit', async function(e) { document.getElementById('rfidForm').addEventListener('submit', async function(e) {
e.preventDefault(); e.preventDefault();
@@ -75,14 +122,21 @@
const uid = document.getElementById('uid').value.trim(); const uid = document.getElementById('uid').value.trim();
const vorname = document.getElementById('vorname').value.trim(); const vorname = document.getElementById('vorname').value.trim();
const nachname = document.getElementById('nachname').value.trim(); const nachname = document.getElementById('nachname').value.trim();
const alter = parseInt(document.getElementById('alter').value); const geburtsdatum = document.getElementById('geburtsdatum').value;
// Validierung // Validierung
if (!uid || !vorname || !nachname || !alter) { if (!uid || !vorname || !nachname || !geburtsdatum) {
showErrorMessage('Bitte füllen Sie alle Pflichtfelder aus!'); showErrorMessage('Bitte füllen Sie alle Pflichtfelder aus!');
return; return;
} }
// Alter berechnen
const alter = calculateAge(geburtsdatum);
if (alter < 0) {
showErrorMessage('Das Geburtsdatum kann nicht in der Zukunft liegen!');
return;
}
// Loading State // Loading State
setLoadingState(true); setLoadingState(true);
@@ -97,7 +151,8 @@
uid: uid, uid: uid,
vorname: vorname, vorname: vorname,
nachname: nachname, nachname: nachname,
alter: alter geburtsdatum: geburtsdatum,
alter: alter // Berechnetes Alter wird mit gesendet
}) })
}); });
@@ -127,7 +182,6 @@
} }
}); });
function showSuccessMessage(message = 'Daten erfolgreich gespeichert!') { function showSuccessMessage(message = 'Daten erfolgreich gespeichert!') {
const successMsg = document.getElementById('successMessage'); const successMsg = document.getElementById('successMessage');
successMsg.textContent = `${message}`; successMsg.textContent = `${message}`;
@@ -182,6 +236,7 @@
function clearForm() { function clearForm() {
document.getElementById('rfidForm').reset(); document.getElementById('rfidForm').reset();
document.getElementById('ageDisplay').style.display = 'none';
document.getElementById('uid').focus(); document.getElementById('uid').focus();
} }
@@ -272,7 +327,7 @@
// Button Status zurücksetzen // Button Status zurücksetzen
readBtn.disabled = false; readBtn.disabled = false;
readBtn.className = 'read-uid-btn'; readBtn.className = 'read-uid-btn';
readBtn.innerHTML = '📡 Read UID'; readBtn.innerHTML = '📡 Read Chip';
} }
} }