diff --git a/src/lib/stores.ts b/src/lib/stores.ts index 55eba30..67598cd 100644 --- a/src/lib/stores.ts +++ b/src/lib/stores.ts @@ -1,4 +1,7 @@ import { persisted } from 'svelte-local-storage-store'; import type { Writable } from 'svelte/store'; +import { writable } from 'svelte/store'; export const playAudio: Writable<boolean> = persisted('playAudio', false); + +export const adminCount: Writable<number> = writable(0); diff --git a/src/routes/admin/+layout.server.ts b/src/routes/admin/+layout.server.ts new file mode 100644 index 0000000..638b14d --- /dev/null +++ b/src/routes/admin/+layout.server.ts @@ -0,0 +1,12 @@ +import type { LayoutServerLoad } from './$types'; +import { Admin, User } from '$lib/server/database'; +import { getSession } from '$lib/server/session'; + +export const load: LayoutServerLoad = async ({ cookies }) => { + const session = getSession(cookies); + + return { + userCount: session?.permissions.userRead() ? await User.count() : 0, + adminCount: session?.permissions.adminRead() ? await Admin.count() : 0 + }; +}; diff --git a/src/routes/admin/+layout.svelte b/src/routes/admin/+layout.svelte index 7f5110f..18e652f 100644 --- a/src/routes/admin/+layout.svelte +++ b/src/routes/admin/+layout.svelte @@ -4,6 +4,8 @@ import { IconOutline } from 'svelte-heros-v2'; import { buttonTriggeredRequest } from '$lib/components/utils'; import { goto } from '$app/navigation'; + import type { LayoutData } from './$types'; + import { adminCount } from '$lib/stores'; async function logout() { const response = await fetch(`${env.PUBLIC_BASE_PATH}/admin/logout`, { @@ -15,6 +17,9 @@ throw new Error(); } } + + export let data: LayoutData; + $adminCount = data.adminCount; </script> {#if $page.url.pathname !== `${env.PUBLIC_BASE_PATH}/admin/login`} @@ -25,12 +30,14 @@ <a href="{env.PUBLIC_BASE_PATH}/admin/users"> <IconOutline name="user-group-outline" /> <span class="ml-1">Registrierte Nutzer</span> + <div class="badge">{data.userCount}</div> </a> </li> <li> <a href="{env.PUBLIC_BASE_PATH}/admin/admin"> <IconOutline name="users-outline" /> <span class="ml-1">Website Admins</span> + <div class="badge">{$adminCount}</div> </a> </li> <li class="mt-auto"> diff --git a/src/routes/admin/admin/+page.svelte b/src/routes/admin/admin/+page.svelte index e8e4bef..61d7cdb 100644 --- a/src/routes/admin/admin/+page.svelte +++ b/src/routes/admin/admin/+page.svelte @@ -8,6 +8,7 @@ import ErrorToast from '$lib/components/Toast/ErrorToast.svelte'; import { buttonTriggeredRequest, resizeTableColumn } from '$lib/components/utils'; import { goto } from '$app/navigation'; + import { adminCount } from '$lib/stores'; let allPermissionBadges = { 'Admin Read': Permissions.AdminRead, @@ -31,6 +32,7 @@ }); if (response.ok) { let res = await response.json(); + $adminCount += 1; res.permissions = new Permissions(res.permissions).asArray(); data.admins.push(res); data.admins = data.admins; @@ -74,6 +76,7 @@ if (id === data.id) { await goto(`${env.PUBLIC_BASE_PATH}/`); } else { + $adminCount -= 1; data.admins.splice( data.admins.findIndex((v) => v.id == id), 1 @@ -193,7 +196,7 @@ </tr> {/each} <tr> - <td>{data.admins.length}</td> + <td>{data.admins.length + 1}</td> <td><Input type="text" bind:value={newAdminUsername} size="sm" /></td> <td><Input type="password" bind:value={newAdminPassword} size="sm" /></td> <td