This commit is contained in:
29
src/layouts/BaseLayout.astro
Normal file
29
src/layouts/BaseLayout.astro
Normal file
@ -0,0 +1,29 @@
|
||||
---
|
||||
import { ClientRouter } from 'astro:transitions';
|
||||
|
||||
interface Props {
|
||||
title: string;
|
||||
description?: string;
|
||||
keywords?: string[];
|
||||
viewTransition?: boolean;
|
||||
}
|
||||
|
||||
const { title, description, keywords, viewTransition } = Astro.props;
|
||||
---
|
||||
|
||||
<!doctype html>
|
||||
<html lang="en" transition:name="root" transition:animate="none">
|
||||
<head>
|
||||
{viewTransition && <ClientRouter />}
|
||||
<meta charset="UTF-8" />
|
||||
<meta name="viewport" content="width=device-width" />
|
||||
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
|
||||
<title>{title}</title>
|
||||
<meta name="og:title" content={title} />
|
||||
<meta name="description" content={description} />
|
||||
{keywords && <meta name="keywords" content={keywords.join(', ')} />}
|
||||
</head>
|
||||
<body>
|
||||
<slot />
|
||||
</body>
|
||||
</html>
|
125
src/layouts/admin/AdminLayout.astro
Normal file
125
src/layouts/admin/AdminLayout.astro
Normal file
@ -0,0 +1,125 @@
|
||||
---
|
||||
import '@assets/admin_layout.css';
|
||||
import BaseLayout from '../BaseLayout.astro';
|
||||
import { ClientRouter } from 'astro:transitions';
|
||||
import { Icon } from 'astro-icon/components';
|
||||
import { BASE_PATH } from 'astro:env/client';
|
||||
import Popup from '@components/popup/Popup.svelte';
|
||||
import ConfirmPopup from '@components/popup/ConfirmPopup.svelte';
|
||||
import { Session } from '@util/session.ts';
|
||||
|
||||
interface Props {
|
||||
title: string;
|
||||
}
|
||||
|
||||
const { title } = Astro.props;
|
||||
|
||||
const session = Session.sessionFromCookies(Astro.cookies);
|
||||
|
||||
const preTabs = [
|
||||
{
|
||||
href: `${BASE_PATH}`,
|
||||
name: 'Varo Startseite',
|
||||
icon: 'heroicons:computer-desktop-20-solid'
|
||||
}
|
||||
];
|
||||
const adminTabs = [
|
||||
{
|
||||
href: `${BASE_PATH}/admin/users`,
|
||||
name: 'Registrierte Nutzer',
|
||||
icon: 'heroicons:user',
|
||||
enabled: session?.permissions.users
|
||||
},
|
||||
{
|
||||
href: `${BASE_PATH}/admin/teams`,
|
||||
name: 'Teams',
|
||||
icon: 'heroicons:users',
|
||||
enabled: session?.permissions.users
|
||||
},
|
||||
{
|
||||
href: `${BASE_PATH}/admin/reports`,
|
||||
name: 'Reports',
|
||||
icon: 'heroicons:flag',
|
||||
enabled: session?.permissions.reports
|
||||
},
|
||||
{
|
||||
href: `${BASE_PATH}/admin/feedback`,
|
||||
name: 'Feedback',
|
||||
icon: 'heroicons:book-open',
|
||||
enabled: session?.permissions.feedback
|
||||
},
|
||||
{
|
||||
href: `${BASE_PATH}/admin/admins`,
|
||||
name: 'Website Admins',
|
||||
icon: 'heroicons:code-bracket-16-solid',
|
||||
enabled: session?.permissions.admin
|
||||
},
|
||||
{
|
||||
href: `${BASE_PATH}/admin/settings`,
|
||||
name: 'Einstellungen',
|
||||
icon: 'heroicons:adjustments-horizontal',
|
||||
enabled: session?.permissions.settings
|
||||
}
|
||||
];
|
||||
---
|
||||
|
||||
<BaseLayout title={title}>
|
||||
<ClientRouter />
|
||||
<div class="flex flex-row max-h-[100vh]">
|
||||
<ul class="menu bg-base-200 w-64 h-[100vh] flex">
|
||||
{
|
||||
preTabs.map((tab) => (
|
||||
<li>
|
||||
<a href={tab.href}>
|
||||
<Icon name={tab.icon} />
|
||||
<span>{tab.name}</span>
|
||||
</a>
|
||||
</li>
|
||||
))
|
||||
}
|
||||
<div class="divider mx-1 my-1"></div>
|
||||
{
|
||||
adminTabs.map((tab) => (
|
||||
<li>
|
||||
<a href={tab.href}>
|
||||
<Icon name={tab.icon} />
|
||||
<span>{tab.name}</span>
|
||||
</a>
|
||||
</li>
|
||||
))
|
||||
}
|
||||
{
|
||||
Astro.slots.has('actions') && (
|
||||
<fieldset class="fieldset bg-base-300 border-base-100 rounded-box border p-2 -ml-1.5 -mr-1.5 mt-auto">
|
||||
<slot name="actions" />
|
||||
</fieldset>
|
||||
)
|
||||
}
|
||||
<li class:list={[Astro.slots.has('actions') ? null : 'mt-auto']}>
|
||||
<button id="logout">
|
||||
<Icon name="heroicons:arrow-left-end-on-rectangle" />
|
||||
<span>Ausloggen</span>
|
||||
</button>
|
||||
</li>
|
||||
</ul>
|
||||
<div class="w-full overflow-scroll relative">
|
||||
<slot />
|
||||
</div>
|
||||
</div>
|
||||
</BaseLayout>
|
||||
|
||||
<Popup client:idle />
|
||||
<ConfirmPopup client:idle />
|
||||
|
||||
<script>
|
||||
import { actions } from 'astro:actions';
|
||||
import { BASE_PATH } from 'astro:env/client';
|
||||
|
||||
document.addEventListener('astro:page-load', () => {
|
||||
const logout = document.getElementById('logout') as HTMLButtonElement;
|
||||
logout.addEventListener('click', async () => {
|
||||
await actions.session.logout();
|
||||
window.location.href = `${BASE_PATH}/admin/login`;
|
||||
});
|
||||
});
|
||||
</script>
|
16
src/layouts/admin/AdminLoginLayout.astro
Normal file
16
src/layouts/admin/AdminLoginLayout.astro
Normal file
@ -0,0 +1,16 @@
|
||||
---
|
||||
import '@assets/admin_layout.css';
|
||||
import BaseLayout from '../BaseLayout.astro';
|
||||
import { ClientRouter } from 'astro:transitions';
|
||||
|
||||
interface Props {
|
||||
title: string;
|
||||
}
|
||||
|
||||
const { title } = Astro.props;
|
||||
---
|
||||
|
||||
<BaseLayout title={title}>
|
||||
<ClientRouter />
|
||||
<slot />
|
||||
</BaseLayout>
|
20
src/layouts/website/SignupLayout.astro
Normal file
20
src/layouts/website/SignupLayout.astro
Normal file
@ -0,0 +1,20 @@
|
||||
---
|
||||
import WebsiteLayout from './WebsiteLayout.astro';
|
||||
|
||||
interface Props {
|
||||
signupEnabled: boolean;
|
||||
}
|
||||
|
||||
const { signupEnabled } = Astro.props;
|
||||
---
|
||||
|
||||
<WebsiteLayout title="Anmeldung">
|
||||
<div
|
||||
class="flex justify-center w-full min-h-screen bg-base-200"
|
||||
class:list={[!signupEnabled ? 'max-h-screen overflow-hidden' : undefined]}
|
||||
>
|
||||
<div class="relative grid card w-11/12 xl:w-2/3 2xl:w-1/2 p-6 my-12 bg-base-100 shadow-lg h-min">
|
||||
<slot />
|
||||
</div>
|
||||
</div>
|
||||
</WebsiteLayout>
|
41
src/layouts/website/WebsiteLayout.astro
Normal file
41
src/layouts/website/WebsiteLayout.astro
Normal file
@ -0,0 +1,41 @@
|
||||
---
|
||||
import '@assets/website_layout.css';
|
||||
import BaseLayout from '../BaseLayout.astro';
|
||||
import { Icon } from 'astro-icon/components';
|
||||
import Menu from '@components/website/layout/Menu.svelte';
|
||||
|
||||
interface Props {
|
||||
title: string;
|
||||
description?: string;
|
||||
}
|
||||
|
||||
const { title, description } = Astro.props;
|
||||
---
|
||||
|
||||
<BaseLayout title={title} description={description} viewTransition>
|
||||
<main class="min-h-[calc(100vh-3.5rem)] h-full w-full">
|
||||
<slot />
|
||||
</main>
|
||||
<nav>
|
||||
<Menu client:load transition:persist />
|
||||
</nav>
|
||||
<footer class="flex justify-around items-center h-14 w-full bg-base-300 relative">
|
||||
<div class="hidden sm:block">
|
||||
<p>© {new Date().getFullYear()} mhsl.eu</p>
|
||||
</div>
|
||||
<div class="flex gap-12">
|
||||
<div class="flex gap-4">
|
||||
<a class="link" href="https://mhsl.eu/id.html" target="_blank">Impressum</a>
|
||||
<a class="link" href="https://mhsl.eu/datenschutz.html" target="_blank">Datenschutz</a>
|
||||
</div>
|
||||
<div class="flex gap-2 items-center">
|
||||
<a href="ts3server://mhsl.eu?port=9987" target="_blank">
|
||||
<Icon name="fa-brands:teamspeak" />
|
||||
</a>
|
||||
<a href="https://discord.gg/EBGefWPc2K" target="_blank">
|
||||
<Icon name="fa-brands:discord" />
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
</BaseLayout>
|
Reference in New Issue
Block a user