initial commit
Some checks failed
deploy / build-and-deploy (push) Failing after 21s

This commit is contained in:
2025-05-18 13:16:20 +02:00
commit 60f3f8a096
148 changed files with 17900 additions and 0 deletions

View 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>

View 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>

View 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>

View 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>

View 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>