Unify date display to DD.MM.YYYY across the UI
Previously two formats showed up next to each other: raw ISO
(YYYY-MM-DD) where DB values were interpolated directly, and
toLocaleDateString('de-DE') output (D.M.YYYY without leading
zeros) where formatDate was used.
- formatDate / formatDateTime now build the string explicitly with
zero-padded day and month, so dates render as DD.MM.YYYY (and
DD.MM.YYYY HH:MM for timestamps) regardless of locale.
- Replaced the remaining raw uses (Anbieter-Admin createdAt,
Mitarbeiter-Prozentsätze gueltig_ab, the new Benutzer tab's
createdAt, PDF export date filters and footer).
- Native <input type=\"date\"> fields are unchanged — they require
the ISO value internally and render localized in the picker.
This commit is contained in:
1 parent
e308c1a7b7
commit
ea3a3fc12c
1 file changed
+25
-11
+25
-11
@@ -601,9 +601,16 @@ async function loadSchaltungen() {
|
||||
}
|
||||
}
|
||||
|
||||
// Format any ISO-like date string (YYYY-MM-DD or full timestamp) as DD.MM.YYYY
|
||||
// with leading zeros. Returns the original string unchanged if it cannot be parsed.
|
||||
function formatDate(dateString) {
|
||||
if (!dateString) return '';
|
||||
const date = new Date(dateString);
|
||||
return date.toLocaleDateString('de-DE');
|
||||
if (isNaN(date.getTime())) return String(dateString);
|
||||
const dd = String(date.getDate()).padStart(2, '0');
|
||||
const mm = String(date.getMonth() + 1).padStart(2, '0');
|
||||
const yyyy = date.getFullYear();
|
||||
return `${dd}.${mm}.${yyyy}`;
|
||||
}
|
||||
|
||||
async function showDocuments(schaltungId) {
|
||||
@@ -848,7 +855,7 @@ async function loadAnbieterAdmin() {
|
||||
}
|
||||
|
||||
anbieter.forEach(a => {
|
||||
const createdAt = new Date(a.created_at).toLocaleDateString('de-DE');
|
||||
const createdAt = formatDate(a.created_at);
|
||||
const tr = document.createElement('tr');
|
||||
tr.innerHTML = `
|
||||
<td>${a.id}</td>
|
||||
@@ -1844,8 +1851,15 @@ async function loadGeloeschteSchaltungen() {
|
||||
}
|
||||
|
||||
function formatDateTime(dateTimeString) {
|
||||
const date = new Date(dateTimeString);
|
||||
return date.toLocaleDateString('de-DE') + ' ' + date.toLocaleTimeString('de-DE', {hour: '2-digit', minute: '2-digit'});
|
||||
if (!dateTimeString) return '';
|
||||
const d = new Date(dateTimeString);
|
||||
if (isNaN(d.getTime())) return String(dateTimeString);
|
||||
const dd = String(d.getDate()).padStart(2, '0');
|
||||
const mm = String(d.getMonth() + 1).padStart(2, '0');
|
||||
const yyyy = d.getFullYear();
|
||||
const HH = String(d.getHours()).padStart(2, '0');
|
||||
const MM = String(d.getMinutes()).padStart(2, '0');
|
||||
return `${dd}.${mm}.${yyyy} ${HH}:${MM}`;
|
||||
}
|
||||
|
||||
// Filter functionality
|
||||
@@ -3096,7 +3110,7 @@ async function loadMitarbeiterProzentsaetzeAdmin() {
|
||||
<div>
|
||||
<strong>${escapeHtml(String(p.prozentsatz))}%</strong>
|
||||
${p.beschreibung ? `- ${escapeHtml(p.beschreibung)}` : ''}
|
||||
<br><small class="text-muted">Gültig ab: ${escapeHtml(p.gueltig_ab)}</small>
|
||||
<br><small class="text-muted">Gültig ab: ${escapeHtml(formatDate(p.gueltig_ab))}</small>
|
||||
</div>
|
||||
<div>
|
||||
<button data-mp-action="delete" data-id="${p.id}" class="btn-danger">
|
||||
@@ -3577,18 +3591,18 @@ function exportProvisionenToPdf() {
|
||||
yPos += 5;
|
||||
}
|
||||
if (datumVon) {
|
||||
doc.text(`• Von: ${new Date(datumVon).toLocaleDateString('de-DE')}`, 25, yPos);
|
||||
doc.text(`• Von: ${formatDate(datumVon)}`, 25, yPos);
|
||||
yPos += 5;
|
||||
}
|
||||
if (datumBis) {
|
||||
doc.text(`• Bis: ${new Date(datumBis).toLocaleDateString('de-DE')}`, 25, yPos);
|
||||
doc.text(`• Bis: ${formatDate(datumBis)}`, 25, yPos);
|
||||
yPos += 5;
|
||||
}
|
||||
yPos += 5;
|
||||
}
|
||||
|
||||
// Add generation date
|
||||
doc.text(`Erstellt am: ${new Date().toLocaleDateString('de-DE')} um ${new Date().toLocaleTimeString('de-DE')}`, 20, yPos);
|
||||
doc.text(`Erstellt am: ${formatDateTime(new Date())}`, 20, yPos);
|
||||
yPos += 15;
|
||||
|
||||
// Table headers
|
||||
@@ -3678,8 +3692,8 @@ function exportProvisionenToPdf() {
|
||||
// Prepare row data
|
||||
const rawData = [
|
||||
schaltung.schaltungs_id || '',
|
||||
schaltung.eingabe_datum ? new Date(schaltung.eingabe_datum).toLocaleDateString('de-DE') : '',
|
||||
schaltung.schaltungs_datum ? new Date(schaltung.schaltungs_datum).toLocaleDateString('de-DE') : '',
|
||||
schaltung.eingabe_datum ? formatDate(schaltung.eingabe_datum) : '',
|
||||
schaltung.schaltungs_datum ? formatDate(schaltung.schaltungs_datum) : '',
|
||||
`${schaltung.vorname || ''} ${schaltung.nachname || ''}`.trim() + (schaltung.firma ? ` (${schaltung.firma})` : ''),
|
||||
schaltung.anbieter_name || '',
|
||||
schaltung.tarif_name || '',
|
||||
@@ -3780,7 +3794,7 @@ async function loadUsers() {
|
||||
<td>${escapeHtml(u.username)}${isSelf ? ' <small style="color:#3498db;">(Sie)</small>' : ''}</td>
|
||||
<td>${escapeHtml(u.displayName || '')}</td>
|
||||
<td>${u.isAdmin ? '<span style="color:#27ae60;">✓</span>' : ''}</td>
|
||||
<td>${escapeHtml(u.createdAt || '')}</td>
|
||||
<td>${escapeHtml(formatDateTime(u.createdAt))}</td>
|
||||
<td>
|
||||
<button data-user-action="edit" data-uuid="${escapeHtml(u.uuid)}" class="btn-success" style="margin-right:5px;">Bearbeiten</button>
|
||||
<button data-user-action="delete" data-uuid="${escapeHtml(u.uuid)}" data-username="${escapeHtml(u.username)}" class="btn-danger" ${isSelf ? 'disabled title="Eigener Account kann nicht gelöscht werden"' : ''}>Löschen</button>
|
||||
|
||||
Reference in new issue
Block a user