From 7c18343a95b7eb08e663e44f28b1f2595d03a433 Mon Sep 17 00:00:00 2001 From: duffyduck Date: Wed, 3 Jun 2026 16:37:09 +0200 Subject: [PATCH] Bugfixes: Adresse-Modal + Upload-Limit auf 25 MB MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. AddressModal: Straße-Feld ließ sich nicht editieren. setFormData wurde im Render-Body aufgerufen, wenn formData.street !== address.street → Reset bei jedem Tastendruck. In useEffect mit [address?.id]-Dependency umgezogen. 2. Multer-Limit von 10 MB auf 25 MB in upload.routes.ts, gdpr.routes.ts, contract.routes.ts. Zwei Handy-Fotos zu PDF kratzten am alten Limit. FileUpload-Hinweistext angepasst. --- backend/src/routes/contract.routes.ts | 2 +- backend/src/routes/gdpr.routes.ts | 2 +- backend/src/routes/upload.routes.ts | 5 ++++- docs/todo.md | 15 +++++++++++++++ frontend/src/components/ui/FileUpload.tsx | 2 +- frontend/src/pages/customers/CustomerDetail.tsx | 9 ++++++--- 6 files changed, 28 insertions(+), 7 deletions(-) diff --git a/backend/src/routes/contract.routes.ts b/backend/src/routes/contract.routes.ts index 1725e374..32cc29f3 100644 --- a/backend/src/routes/contract.routes.ts +++ b/backend/src/routes/contract.routes.ts @@ -31,7 +31,7 @@ const docUpload = multer({ if (allowed.includes(file.mimetype)) cb(null, true); else cb(new Error('Nur PDF, JPG, PNG, GIF oder WebP-Dateien sind erlaubt')); }, - limits: { fileSize: 10 * 1024 * 1024 }, + limits: { fileSize: 25 * 1024 * 1024 }, }); router.get('/', authenticate, requirePermission('contracts:read'), contractController.getContracts); diff --git a/backend/src/routes/gdpr.routes.ts b/backend/src/routes/gdpr.routes.ts index 804594a2..0f7f8b99 100644 --- a/backend/src/routes/gdpr.routes.ts +++ b/backend/src/routes/gdpr.routes.ts @@ -28,7 +28,7 @@ const authUpload = multer({ cb(new Error('Nur PDF-Dateien sind erlaubt')); } }, - limits: { fileSize: 10 * 1024 * 1024 }, + limits: { fileSize: 25 * 1024 * 1024 }, }); // Alle Routen erfordern Authentifizierung diff --git a/backend/src/routes/upload.routes.ts b/backend/src/routes/upload.routes.ts index bbf76fd2..07986a4d 100644 --- a/backend/src/routes/upload.routes.ts +++ b/backend/src/routes/upload.routes.ts @@ -83,7 +83,10 @@ const upload = multer({ storage, fileFilter, limits: { - fileSize: 10 * 1024 * 1024, // 10MB max + // 25 MB – passt für Ausweis-Scans, Handy-Photos im JpgToPdf-Flow, + // mehrseitige PDFs aus dem Modal (bis ~5-7 Seiten je nach Auflösung). + // Vorher 10 MB → Multer brach bei zwei Smartphone-Fotos ab. + fileSize: 25 * 1024 * 1024, }, }); diff --git a/docs/todo.md b/docs/todo.md index 37fed902..df169222 100644 --- a/docs/todo.md +++ b/docs/todo.md @@ -97,6 +97,21 @@ isolierte Instanz (keine Multi-Tenancy im Code), Provisioning + Abrechnung ## ✅ Erledigt +- [x] **🐞 AddressModal: Straße-Feld ließ sich nicht editieren** + - `setFormData` wurde unbedingt im Render-Body aufgerufen, wenn + `formData.street !== address.street`. Jeder Tastendruck löste neu + aus → Reset auf DB-Wert → Cursor sprang zurück → keine Eingabe + möglich. + - Fix: in `useEffect` mit `[address?.id]`-Dependency umgezogen. + Re-Init nur beim Wechsel/Open, nicht bei jedem Render. + +- [x] **🐞 Upload-Limit: Multer 10 MB → 25 MB (Ausweis-Scans, JPGs→PDF)** + - Zwei Smartphone-Fotos zu PDF kombiniert kratzten am 10-MB-Limit + (auch mit Original-Bytes-Optimierung aus 431792e). Limits in + `upload.routes.ts`, `gdpr.routes.ts`, `contract.routes.ts` auf + 25 MB hochgezogen. `pdfTemplate.routes.ts` war eh schon bei 20 MB. + - Frontend: `FileUpload`-Hinweis „max. 10 MB" → „max. 25 MB". + - [x] **🆕 SIM-Karten: Checkbox „eSIM" zwischen „Hauptkarte" und „Multisim"** - Hardware-Plastikkarte vs. eSIM-Profil ist eine eigene Eigenschaft – eSIM kann sowohl Hauptkarte als auch Multisim sein, also zusätzlich diff --git a/frontend/src/components/ui/FileUpload.tsx b/frontend/src/components/ui/FileUpload.tsx index ddcfa103..a30745c0 100644 --- a/frontend/src/components/ui/FileUpload.tsx +++ b/frontend/src/components/ui/FileUpload.tsx @@ -119,7 +119,7 @@ export default function FileUpload({ <>

{label}

-

PDF, JPG oder PNG (max. 10MB)

+

PDF, JPG oder PNG (max. 25 MB)

)} diff --git a/frontend/src/pages/customers/CustomerDetail.tsx b/frontend/src/pages/customers/CustomerDetail.tsx index 83d5289a..7d77e75f 100644 --- a/frontend/src/pages/customers/CustomerDetail.tsx +++ b/frontend/src/pages/customers/CustomerDetail.tsx @@ -2451,10 +2451,13 @@ function AddressModal({ const isPending = createMutation.isPending || updateMutation.isPending; - // Update form when address prop changes - if (isEditing && formData.street !== address.street) { + // Beim Öffnen / Wechsel zwischen Adressen aus den Props re-initialisieren. + // Vorher als unbedingte if-setState im Render-Body → Reset bei jedem + // Tastendruck, Straße ließ sich nicht eintippen. + useEffect(() => { setFormData(getInitialFormData()); - } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [address?.id]); return (