fix: Umlaute, Foto-404, Account-Menu responsive

Bugs:
- nginx: /uploads/ wurde von der .jpg/.png-Regex-Location geschluckt
  -> ^~ Prefix gibt /uploads/ und /api/ Vorrang vor Regex
  -> Fotos werden jetzt korrekt vom Backend ausgeliefert
- TopNav menu-item Klasse war via <style>@apply definiert -
  Tailwind verarbeitet @apply nur in .css-Dateien, nicht in JSX-style-Tags
  -> alle Klassen direkt am Element + neuer responsive Aufbau
- TopNav mobile-friendlier: Brand-Truncate, Demo-Badge erst ab sm,
  Dropdown max-w fuer Viewport, Touch-Outside-Close, groessere Touch-Targets

Umlaute:
- Alle ASCII-Substitutionen (fuer, ueber, aendern, loeschen, Stueck, Geraete,
  Ruecknahme, Hintertuer, Schluessel, Kuehlschrank, Pruefe, gueltig, etc.)
  konsequent auf Unicode (für, über, ä, ö, ü, ß) umgestellt.
- 26 Dateien betroffen, SQL-Identifier + Import-Pfade + API-Routen ASCII gelassen.
- seed.js: Baeckerei -> Baeckerei.. ah Baeckerei -> Bäckerei
This commit is contained in:
christian
2026-05-26 14:01:30 +00:00
parent 9726d70c41
commit 0535fbe72a
55 changed files with 178 additions and 141 deletions

View File

@@ -1,12 +1,12 @@
import crypto from 'crypto';
// Befuellt einen frischen Demo-Tenant mit Beispieldaten
// (5 Kunden, 3 Artikel, 6 Lieferungen, 2 Geraete).
// Befüllt einen frischen Demo-Tenant mit Beispieldaten
// (5 Kunden, 3 Artikel, 6 Lieferungen, 2 Geräte).
export async function seedDemoTenant(conn, tenantId) {
// Artikel
const artikel = [
{ id: crypto.randomUUID(), name: 'Brotkorb klein', pfand: 2.50 },
{ id: crypto.randomUUID(), name: 'Brotkorb gross', pfand: 5.00 },
{ id: crypto.randomUUID(), name: 'Brotkorb groß', pfand: 5.00 },
{ id: crypto.randomUUID(), name: 'Transportbox', pfand: 10.00 }
];
for (const a of artikel) {
@@ -18,11 +18,11 @@ export async function seedDemoTenant(conn, tenantId) {
// Kunden
const kunden = [
{ name: 'Cafe Sonnenschein', adresse: 'Bahnhofstr. 12, 10115 Berlin', zeit: '05:00', hinweis: 'Anlieferung Hintertuer. Code 1234#.' },
{ name: 'Restaurant Roma', adresse: 'Hauptstr. 88, 10117 Berlin', zeit: '06:30', hinweis: 'Schluesselkasten links neben Eingang.' },
{ name: 'Hotel Adlerhorst', adresse: 'Seestrasse 5, 14193 Berlin', zeit: '05:30', hinweis: 'Anlieferung Tiefgarage Ebene -1, Tor 3.' },
{ name: 'Cafe Sonnenschein', adresse: 'Bahnhofstr. 12, 10115 Berlin', zeit: '05:00', hinweis: 'Anlieferung Hintertür. Code 1234#.' },
{ name: 'Restaurant Roma', adresse: 'Hauptstr. 88, 10117 Berlin', zeit: '06:30', hinweis: 'Schlüsselkasten links neben Eingang.' },
{ name: 'Hotel Adlerhorst', adresse: 'Seestraße 5, 14193 Berlin', zeit: '05:30', hinweis: 'Anlieferung Tiefgarage Ebene -1, Tor 3.' },
{ name: 'Kantine Werk Nord', adresse: 'Industriestr. 200, 13407 Berlin', zeit: '06:00', hinweis: 'Werkschutz Bescheid geben, Tor B.' },
{ name: 'Baeckerei Schmitt', adresse: 'Marktplatz 4, 10178 Berlin', zeit: '04:45', hinweis: 'Direkt in den Verkaufsraum stellen.' }
{ name: 'Bäckerei Schmitt', adresse: 'Marktplatz 4, 10178 Berlin', zeit: '04:45', hinweis: 'Direkt in den Verkaufsraum stellen.' }
];
const kundenIds = [];
for (const k of kunden) {
@@ -35,7 +35,7 @@ export async function seedDemoTenant(conn, tenantId) {
);
}
// Lieferungen (verteilt ueber die letzten 14 Tage)
// Lieferungen (verteilt über die letzten 14 Tage)
for (let i = 0; i < 6; i++) {
const kid = kundenIds[i % kundenIds.length];
const aid = artikel[i % artikel.length].id;
@@ -47,12 +47,12 @@ export async function seedDemoTenant(conn, tenantId) {
);
}
// Geraete
const geraete = [
// Geräte
const geraeteList = [
{ sn: 'OF-2024-001', typ: 'Ofen', bez: 'Miwe Condo 3-Etagen', kid: kundenIds[0] },
{ sn: 'KS-2024-007', typ: 'Kuehlschrank', bez: 'Liebherr GKv 5710', kid: kundenIds[2] }
{ sn: 'KS-2024-007', typ: 'Kühlschrank', bez: 'Liebherr GKv 5710', kid: kundenIds[2] }
];
for (const g of geraete) {
for (const g of geraeteList) {
await conn.query(
`INSERT INTO geraete (id, tenant_id, seriennummer, typ, bezeichnung, kunde_id, status)
VALUES (UUID(), ?, ?, ?, ?, ?, 'aktiv')`,