feat(frontend): Dokumente-Upload-Widget (Modul 29 Frontend)

Backend war bereits fertig, das Frontend fehlte bislang. Neue
gemeinsame DocumentUploadCard-Komponente (Liste hochgeladener Dateien,
Upload per Dateiauswahl, Download, Löschen mit Bestätigungsdialog da
unumkehrbar) plus dazugehöriges src/lib/documents/ API-Modul.

apiFetch erzwingt bislang immer Content-Type: application/json, was
multipart-Uploads verhindert hätte – daher neue apiFetchFormData-
Hilfsfunktion in api-client.ts ergänzt (kein manuell gesetzter
Content-Type, damit der Browser die multipart-Boundary selbst setzt).

Eingebunden auf allen Detailseiten, die laut TASKS.md Modul 29 vorsehen
und tatsächlich eine eigene Route haben: Bienenstand, Volk, Königin,
Honigcharge. Durchsicht hat keine eigene Detailseite (nur Einträge in
der Volk-Unterliste) und wird daher vorerst ausgelassen.

Live verifiziert: Upload, Download und Löschen (inkl. Bestätigungsdialog)
funktionieren End-to-End gegen das Backend, zero Konsolenfehler auf
allen vier Detailseiten.
This commit is contained in:
Nick Szaunig committed 2026-08-24 16:43:18 +02:00
1 parent 9a32c6c11d
commit a21563cc76
9 files changed
+242 -1

No files matched your search

@@ -5,6 +5,7 @@ import { useParams } from "next/navigation";
import { useQuery } from "@tanstack/react-query";
import { fetchApiary } from "@/lib/apiaries/api";
import { QrCodeDialog } from "@/components/qr-code-dialog";
import { DocumentUploadCard } from "@/components/document-upload-card";
import { Button } from "@/components/ui/button";
import { ApiaryEditCard } from "./apiary-edit-card";
@@ -32,6 +33,7 @@ export default function ApiaryDetailPage() {
<QrCodeDialog entityType="apiaries" id={apiary.id} />
</div>
<ApiaryEditCard key={apiary.id} apiary={apiary} />
<DocumentUploadCard entityType="APIARY" entityId={apiary.id} />
<Button
className="w-fit"
nativeButton={false}