From 384432d31e7bee6bf35d8af6b7165410303ffda4 Mon Sep 17 00:00:00 2001 From: Mohamed Bassem Date: Sun, 6 Jul 2025 15:54:49 +0000 Subject: feat: Add per user storage quota --- apps/web/components/admin/UpdateUserDialog.tsx | 26 ++++++++++++++++++++++++++ apps/web/components/admin/UserList.tsx | 7 +++++++ 2 files changed, 33 insertions(+) (limited to 'apps/web/components') diff --git a/apps/web/components/admin/UpdateUserDialog.tsx b/apps/web/components/admin/UpdateUserDialog.tsx index 82a239ca..7093ccda 100644 --- a/apps/web/components/admin/UpdateUserDialog.tsx +++ b/apps/web/components/admin/UpdateUserDialog.tsx @@ -41,12 +41,14 @@ interface UpdateUserDialogProps { userId: string; currentRole: "user" | "admin"; currentQuota: number | null; + currentStorageQuota: number | null; children?: React.ReactNode; } export default function UpdateUserDialog({ userId, currentRole, currentQuota, + currentStorageQuota, children, }: UpdateUserDialogProps) { const apiUtils = api.useUtils(); @@ -55,6 +57,7 @@ export default function UpdateUserDialog({ userId, role: currentRole, bookmarkQuota: currentQuota, + storageQuota: currentStorageQuota, }; const form = useForm({ resolver: zodResolver(updateUserSchema), @@ -147,6 +150,29 @@ export default function UpdateUserDialog({ )} /> + ( + + Storage Quota (bytes) + + { + const value = e.target.value; + field.onChange(value === "" ? null : parseInt(value)); + }} + /> + + + + )} + /> {t("common.email")} {t("admin.users_list.num_bookmarks")} {t("common.quota")} + Storage Quota {t("admin.users_list.asset_sizes")} {t("common.role")} {t("admin.users_list.local_user")} @@ -88,6 +89,11 @@ export default function UsersSection() { {u.bookmarkQuota ?? t("admin.users_list.unlimited")} + + {u.storageQuota + ? toHumanReadableSize(u.storageQuota) + : t("admin.users_list.unlimited")} + {toHumanReadableSize(userStats[u.id].assetSizes)} @@ -140,6 +146,7 @@ export default function UsersSection() { userId={u.id} currentRole={u.role!} currentQuota={u.bookmarkQuota} + currentStorageQuota={u.storageQuota} >