diff --git a/app/admin/clients/[id]/storage/page.tsx b/app/admin/clients/[id]/storage/page.tsx
new file mode 100644
index 0000000..a68515f
--- /dev/null
+++ b/app/admin/clients/[id]/storage/page.tsx
@@ -0,0 +1,20 @@
+import { Params } from "@/modules/shared/types/user"
+import { DocumentsPanel } from "@/modules/shared/ui/views/documents-panel"
+
+type SearchParams = Promise<{ folder?: string | string[] }>
+
+const StorageAdminPage = async ({ params, searchParams }: { params: Params; searchParams: SearchParams }) => {
+ const { id } = await params
+ const { folder } = await searchParams
+
+ return (
+
{session.email}
-{state.error}
; + return state.message ?{state.message}
: null; +} + +export function ProfileForm({ name, email }: { name: string; email: string }) { + const [state, formAction, pending] = useActionState(updateOwnProfile, undefined); + + return ( + + ); +} + +function PasswordInput({ id, name, label, autoComplete }: { id: string; name: string; label: string; autoComplete: string }) { + const [visible, setVisible] = useState(false); + + return ( ++ Noch keine Vorlagen. Vorlagen lassen sich beim Erstellen einer Rechnung als Position auswählen. +
+ ) : ( +
+
Alles Wichtige über alle Clients auf einen Blick.
+{description}
+
+ {text ?? "Wird geladen..."}
+
+ );
+ default:
+ return null;
+ }
+}
+
+function PreviewDialog({
+ doc,
+ profileId,
+ isAdmin,
+ onClose,
+ onDownload,
+}: {
+ doc: DocumentItem | null;
+ profileId: string;
+ isAdmin: boolean;
+ onClose: () => void;
+ onDownload: (ids: string[]) => void;
+}) {
+ const [url, setUrl] = useState<{ id: string; value: string } | null>(null);
+ const [error, setError] = useState+ {message.text} +
+ )} + + {documents.length === 0 ? ( + + ) : ( +{children}
+} + +export async function DocumentsPanel({ + profileId, + isAdmin, + basePath, + folderId, +}: { + profileId: string + isAdmin: boolean + basePath: string + folderId?: string +}) { + const clientId = await getClientId(profileId) + + if (!clientId) { + return ( +