lasthourcloud/apps/ui/src/routes/__layout.svelte

470 lines
15 KiB
Svelte
Raw Normal View History

<script context="module" lang="ts">
2022-02-10 15:47:44 +01:00
import type { Load } from '@sveltejs/kit';
2022-07-06 11:02:36 +02:00
export const load: Load = async ({ url }) => {
const baseSettings = await get('/base');
2022-07-06 11:02:36 +02:00
try {
if (Cookies.get('token')) {
const response = await get(`/user`);
return {
props: {
...response,
baseSettings
2022-07-06 11:02:36 +02:00
},
stuff: {
...response
}
};
} else {
if (url.pathname !== '/login' && url.pathname !== '/register') {
return {
status: 302,
redirect: '/login',
props: {
baseSettings
}
2022-07-06 11:02:36 +02:00
};
}
return {
props: {
baseSettings
}
};
2022-07-06 11:02:36 +02:00
}
} catch (error: any) {
if (error?.code?.startsWith('FAST_JWT') || error.status === 401) {
Cookies.remove('token');
if (url.pathname !== '/login') {
return {
status: 302,
redirect: '/login',
props: {
baseSettings
}
2022-07-06 11:02:36 +02:00
};
2022-02-10 15:47:44 +01:00
}
2022-07-06 11:02:36 +02:00
}
if (url.pathname !== '/login') {
return {
status: 302,
redirect: '/login',
props: {
baseSettings
}
2022-07-06 11:02:36 +02:00
};
}
return {
status: 500,
error: new Error(error),
props: {
baseSettings
}
};
}
2022-02-10 15:47:44 +01:00
};
</script>
2022-07-06 11:02:36 +02:00
<script lang="ts">
export let baseSettings: any;
export let supportedServiceTypesAndVersions: any;
2022-10-02 08:55:36 +00:00
export let pendingInvitations: any = 0;
2022-09-29 15:46:52 +02:00
2022-09-07 15:59:37 +02:00
$appSession.isRegistrationEnabled = baseSettings.isRegistrationEnabled;
2022-07-22 20:48:04 +00:00
$appSession.ipv4 = baseSettings.ipv4;
$appSession.ipv6 = baseSettings.ipv6;
$appSession.version = baseSettings.version;
$appSession.whiteLabeled = baseSettings.whiteLabeled;
$appSession.whiteLabeledDetails.icon = baseSettings.whiteLabeledIcon;
2022-08-31 01:02:33 -03:00
$appSession.supportedServiceTypesAndVersions = supportedServiceTypesAndVersions;
2022-09-29 15:46:52 +02:00
$appSession.pendingInvitations = pendingInvitations;
2022-07-06 11:02:36 +02:00
export let userId: string;
export let teamId: string;
export let permission: string;
export let isAdmin: boolean;
2022-09-29 15:46:52 +02:00
2022-02-10 15:47:44 +01:00
import '../tailwind.css';
2022-07-06 11:02:36 +02:00
import Cookies from 'js-cookie';
2022-05-17 11:16:58 +02:00
import { fade } from 'svelte/transition';
2022-07-06 11:02:36 +02:00
import { navigating, page } from '$app/stores';
2022-03-02 11:00:08 +01:00
2022-07-06 11:02:36 +02:00
import { get } from '$lib/api';
import UpdateAvailable from '$lib/components/UpdateAvailable.svelte';
import PageLoader from '$lib/components/PageLoader.svelte';
import { errorNotification } from '$lib/common';
2022-07-26 12:26:45 +00:00
import { appSession } from '$lib/store';
2022-08-09 15:28:26 +00:00
import Toasts from '$lib/components/Toasts.svelte';
2022-09-01 11:20:22 +02:00
import Tooltip from '$lib/components/Tooltip.svelte';
2022-05-11 16:15:34 +02:00
2022-07-06 11:02:36 +02:00
if (userId) $appSession.userId = userId;
if (teamId) $appSession.teamId = teamId;
if (permission) $appSession.permission = permission;
if (isAdmin) $appSession.isAdmin = isAdmin;
2022-05-09 12:45:17 +02:00
2022-07-06 11:02:36 +02:00
async function logout() {
2022-02-11 09:00:45 +01:00
try {
2022-07-06 11:02:36 +02:00
Cookies.remove('token');
return window.location.replace('/login');
} catch (error) {
2022-02-15 10:42:26 +01:00
return errorNotification(error);
2022-02-10 15:47:44 +01:00
}
}
</script>
2022-02-10 15:47:44 +01:00
<svelte:head>
2022-07-06 11:02:36 +02:00
{#if !$appSession.whiteLabeled}
2022-09-19 12:05:47 +02:00
<title>Coolify</title>
2022-04-06 22:01:41 +02:00
<link rel="icon" href="/favicon.png" />
2022-07-06 11:02:36 +02:00
{:else if $appSession.whiteLabeledDetails.icon}
2022-09-19 12:05:47 +02:00
<title>Coolify</title>
2022-07-06 11:02:36 +02:00
<link rel="icon" href={$appSession.whiteLabeledDetails.icon} />
2022-04-06 22:01:41 +02:00
{/if}
2022-02-10 15:47:44 +01:00
</svelte:head>
2022-08-09 15:28:26 +00:00
<Toasts />
2022-05-17 11:16:58 +02:00
{#if $navigating}
<div out:fade={{ delay: 100 }}>
<PageLoader />
</div>
{/if}
<div class="drawer">
<input id="main-drawer" type="checkbox" class="drawer-toggle" />
<div class="drawer-content">
{#if $appSession.userId}
<nav class="nav-main hidden lg:block z-20">
<div class="flex h-screen w-full flex-col items-center transition-all duration-100">
{#if !$appSession.whiteLabeled}
<div class="mb-2 mt-4 h-10 w-10">
<img src="/favicon.png" alt="coolLabs logo" />
</div>
{:else if $appSession.whiteLabeledDetails.icon}
<div class="mb-2 mt-4 h-10 w-10">
<img src={$appSession.whiteLabeledDetails.icon} alt="White labeled logo" />
</div>
{/if}
<div class="flex flex-col space-y-2 py-2" class:mt-2={$appSession.whiteLabeled}>
<a
id="dashboard"
sveltekit:prefetch
href="/"
2022-09-19 12:14:14 +02:00
class="icons hover:text-pink-500"
class:text-pink-500={$page.url.pathname === '/'}
class:bg-coolgray-500={$page.url.pathname === '/'}
class:bg-coolgray-200={!($page.url.pathname === '/')}
>
<svg
xmlns="http://www.w3.org/2000/svg"
class="h-9 w-9"
viewBox="0 0 24 24"
stroke-width="1.5"
stroke="currentColor"
fill="none"
stroke-linecap="round"
stroke-linejoin="round"
>
<path stroke="none" d="M0 0h24v24H0z" fill="none" />
<path
d="M19 8.71l-5.333 -4.148a2.666 2.666 0 0 0 -3.274 0l-5.334 4.148a2.665 2.665 0 0 0 -1.029 2.105v7.2a2 2 0 0 0 2 2h12a2 2 0 0 0 2 -2v-7.2c0 -.823 -.38 -1.6 -1.03 -2.105"
/>
<path d="M16 15c-2.21 1.333 -5.792 1.333 -8 0" />
</svg>
</a>
{#if $appSession.teamId === '0'}
<a
id="servers"
sveltekit:prefetch
href="/servers"
2022-09-19 12:14:14 +02:00
class="icons hover:text-sky-500"
class:text-sky-500={$page.url.pathname === '/servers'}
class:bg-coolgray-500={$page.url.pathname === '/servers'}
class:bg-coolgray-200={!($page.url.pathname === '/servers')}
>
<svg
xmlns="http://www.w3.org/2000/svg"
class="w-8 h-8 mx-auto"
viewBox="0 0 24 24"
stroke-width="1.5"
stroke="currentColor"
fill="none"
stroke-linecap="round"
stroke-linejoin="round"
>
<path stroke="none" d="M0 0h24v24H0z" fill="none" />
<rect x="3" y="4" width="18" height="8" rx="3" />
<rect x="3" y="12" width="18" height="8" rx="3" />
<line x1="7" y1="8" x2="7" y2="8.01" />
<line x1="7" y1="16" x2="7" y2="16.01" />
</svg>
</a>
{/if}
</div>
<Tooltip triggeredBy="#dashboard" placement="right">Dashboard</Tooltip>
<Tooltip triggeredBy="#servers" placement="right">Servers</Tooltip>
<div class="flex-1" />
2022-09-19 14:05:25 +02:00
<div class="lg:block hidden">
<UpdateAvailable />
</div>
<div class="flex flex-col space-y-2 py-2">
<a
id="iam"
sveltekit:prefetch
2022-09-29 15:46:52 +02:00
href={$appSession.pendingInvitations.length > 0 ? '/iam/pending' : '/iam'}
class="icons hover:text-iam indicator"
class:text-iam={$page.url.pathname.startsWith('/iam')}
class:bg-coolgray-500={$page.url.pathname.startsWith('/iam')}
2022-09-29 15:46:52 +02:00
>
{#if $appSession.pendingInvitations.length > 0}
<span class="indicator-item badge badge-error font-mono"
>{pendingInvitations.length}</span
>
{/if}<svg
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 24 24"
class="h-9 w-9"
stroke-width="1.5"
stroke="currentColor"
fill="none"
stroke-linecap="round"
stroke-linejoin="round"
>
<path stroke="none" d="M0 0h24v24H0z" fill="none" />
<circle cx="9" cy="7" r="4" />
<path d="M3 21v-2a4 4 0 0 1 4 -4h4a4 4 0 0 1 4 4v2" />
<path d="M16 3.13a4 4 0 0 1 0 7.75" />
<path d="M21 21v-2a4 4 0 0 0 -3 -3.85" />
</svg>
</a>
<a
id="settings"
sveltekit:prefetch
2022-09-21 15:48:32 +02:00
href={$appSession.teamId === '0' ? '/settings/coolify' : '/settings/ssh'}
2022-09-19 12:14:14 +02:00
class="icons hover:text-settings"
class:text-settings={$page.url.pathname.startsWith('/settings')}
class:bg-coolgray-500={$page.url.pathname.startsWith('/settings')}
>
<svg
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 24 24"
class="h-9 w-9"
stroke-width="1.5"
stroke="currentColor"
fill="none"
stroke-linecap="round"
stroke-linejoin="round"
>
<path stroke="none" d="M0 0h24v24H0z" fill="none" />
<path
d="M10.325 4.317c.426 -1.756 2.924 -1.756 3.35 0a1.724 1.724 0 0 0 2.573 1.066c1.543 -.94 3.31 .826 2.37 2.37a1.724 1.724 0 0 0 1.065 2.572c1.756 .426 1.756 2.924 0 3.35a1.724 1.724 0 0 0 -1.066 2.573c.94 1.543 -.826 3.31 -2.37 2.37a1.724 1.724 0 0 0 -2.572 1.065c-.426 1.756 -2.924 1.756 -3.35 0a1.724 1.724 0 0 0 -2.573 -1.066c-1.543 .94 -3.31 -.826 -2.37 -2.37a1.724 1.724 0 0 0 -1.065 -2.572c-1.756 -.426 -1.756 -2.924 0 -3.35a1.724 1.724 0 0 0 1.066 -2.573c-.94 -1.543 .826 -3.31 2.37 -2.37c1 .608 2.296 .07 2.572 -1.065z"
/>
<circle cx="12" cy="12" r="3" />
</svg>
</a>
2022-09-19 12:14:14 +02:00
<div
id="logout"
class="icons bg-coolgray-200 hover:text-error cursor-pointer"
on:click={logout}
>
<svg
xmlns="http://www.w3.org/2000/svg"
class="ml-1 h-8 w-8"
viewBox="0 0 24 24"
stroke-width="1.5"
stroke="currentColor"
fill="none"
stroke-linecap="round"
stroke-linejoin="round"
>
<path stroke="none" d="M0 0h24v24H0z" fill="none" />
<path
d="M14 8v-2a2 2 0 0 0 -2 -2h-7a2 2 0 0 0 -2 2v12a2 2 0 0 0 2 2h7a2 2 0 0 0 2 -2v-2"
/>
<path d="M7 12h14l-3 -3m0 6l3 -3" />
</svg>
</div>
<div
class="w-full text-center font-bold text-stone-400 hover:bg-coolgray-200 hover:text-white"
>
<a
class="text-[10px] no-underline"
href={`https://github.com/coollabsio/coolify/releases/tag/v${$appSession.version}`}
target="_blank">v{$appSession.version}</a
>
</div>
</div>
2022-08-27 10:30:07 +00:00
</div>
</nav>
{#if $appSession.whiteLabeled}
<span class="fixed bottom-0 left-[50px] z-50 m-2 px-4 text-xs text-stone-700"
>Powered by <a href="https://coolify.io" target="_blank">Coolify</a></span
>
2022-04-06 22:01:41 +02:00
{/if}
{/if}
<div
2022-09-19 12:05:47 +02:00
class="navbar lg:hidden space-x-2 flex flex-row items-center bg-coollabs"
class:hidden={!$appSession.userId}
>
2022-09-19 12:05:47 +02:00
<label for="main-drawer" class="drawer-button btn btn-square btn-ghost flex-col">
<span class="burger bg-white" />
<span class="burger bg-white" />
<span class="burger bg-white" />
</label>
<div class="prose flex flex-row justify-between space-x-1 w-full items-center pr-3">
2022-09-19 12:05:47 +02:00
{#if !$appSession.whiteLabeled}
2022-09-19 12:14:14 +02:00
<h3 class="mb-0 text-white">Coolify</h3>
2022-09-19 12:05:47 +02:00
{/if}
</div>
</div>
<main>
2022-09-10 17:23:55 +00:00
<div class={$appSession.userId ? 'lg:pl-16' : null}>
<slot />
</div>
</main>
</div>
<div class="drawer-side">
<label for="main-drawer" class="drawer-overlay w-full" />
<ul class="menu bg-coolgray-200 w-60 p-2 space-y-3 pt-4 ">
<li>
2022-02-10 15:47:44 +01:00
<a
2022-09-19 12:14:14 +02:00
class="no-underline icons hover:text-white hover:bg-pink-500"
2022-02-10 15:47:44 +01:00
sveltekit:prefetch
href="/"
2022-09-19 12:14:14 +02:00
class:bg-pink-500={$page.url.pathname === '/'}
2022-02-10 15:47:44 +01:00
>
<svg
xmlns="http://www.w3.org/2000/svg"
2022-09-19 12:05:47 +02:00
class="h-8 w-8"
2022-02-10 15:47:44 +01:00
viewBox="0 0 24 24"
stroke-width="1.5"
stroke="currentColor"
fill="none"
stroke-linecap="round"
stroke-linejoin="round"
>
<path stroke="none" d="M0 0h24v24H0z" fill="none" />
<path
d="M19 8.71l-5.333 -4.148a2.666 2.666 0 0 0 -3.274 0l-5.334 4.148a2.665 2.665 0 0 0 -1.029 2.105v7.2a2 2 0 0 0 2 2h12a2 2 0 0 0 2 -2v-7.2c0 -.823 -.38 -1.6 -1.03 -2.105"
/>
<path d="M16 15c-2.21 1.333 -5.792 1.333 -8 0" />
</svg>
Dashboard
2022-02-10 15:47:44 +01:00
</a>
</li>
2022-09-19 12:05:47 +02:00
<li>
2022-02-10 15:47:44 +01:00
<a
2022-09-19 12:14:14 +02:00
class="no-underline icons hover:text-white hover:bg-sky-500"
2022-02-10 15:47:44 +01:00
sveltekit:prefetch
2022-09-10 01:23:17 +00:00
href="/servers"
2022-09-19 12:14:14 +02:00
class:bg-sky-500={$page.url.pathname.startsWith('/servers')}
2022-02-10 15:47:44 +01:00
>
<svg
xmlns="http://www.w3.org/2000/svg"
2022-09-10 01:23:17 +00:00
class="w-8 h-8"
2022-02-10 15:47:44 +01:00
viewBox="0 0 24 24"
stroke-width="1.5"
stroke="currentColor"
fill="none"
stroke-linecap="round"
stroke-linejoin="round"
>
<path stroke="none" d="M0 0h24v24H0z" fill="none" />
2022-09-10 01:23:17 +00:00
<rect x="3" y="4" width="18" height="8" rx="3" />
<rect x="3" y="12" width="18" height="8" rx="3" />
<line x1="7" y1="8" x2="7" y2="8.01" />
<line x1="7" y1="16" x2="7" y2="16.01" />
2022-02-10 15:47:44 +01:00
</svg>
2022-09-10 01:23:17 +00:00
Servers
2022-02-10 15:47:44 +01:00
</a>
</li>
<li>
2022-09-19 12:14:14 +02:00
<a
class="no-underline icons hover:text-white hover:bg-iam"
href="/iam"
class:bg-iam={$page.url.pathname.startsWith('/iam')}
2022-04-07 23:26:06 +02:00
><svg
2022-02-10 15:47:44 +01:00
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 24 24"
2022-09-19 12:05:47 +02:00
class="h-8 w-8"
2022-02-10 15:47:44 +01:00
stroke-width="1.5"
stroke="currentColor"
fill="none"
stroke-linecap="round"
stroke-linejoin="round"
>
2022-02-10 15:47:44 +01:00
<path stroke="none" d="M0 0h24v24H0z" fill="none" />
<circle cx="9" cy="7" r="4" />
<path d="M3 21v-2a4 4 0 0 1 4 -4h4a4 4 0 0 1 4 4v2" />
<path d="M16 3.13a4 4 0 0 1 0 7.75" />
<path d="M21 21v-2a4 4 0 0 0 -3 -3.85" />
</svg>
2022-09-29 15:46:52 +02:00
IAM {#if $appSession.pendingInvitations.length > 0}
2022-10-02 08:55:36 +00:00
<span class="indicator-item rounded-full badge badge-error font-mono">{pendingInvitations}</span>
2022-09-29 15:46:52 +02:00
{/if}
2022-02-10 15:47:44 +01:00
</a>
</li>
<li>
2022-07-26 12:26:45 +00:00
<a
2022-09-19 12:14:14 +02:00
class="no-underline icons hover:text-black hover:bg-settings"
2022-09-21 15:48:32 +02:00
href={$appSession.teamId === '0' ? '/settings/coolify' : '/settings/ssh'}
class:bg-settings={$page.url.pathname.startsWith('/settings')}
class:text-black={$page.url.pathname.startsWith('/settings')}
2022-07-26 12:26:45 +00:00
>
<svg
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 24 24"
2022-09-19 12:05:47 +02:00
class="h-8 w-8"
2022-07-26 12:26:45 +00:00
stroke-width="1.5"
stroke="currentColor"
fill="none"
stroke-linecap="round"
stroke-linejoin="round"
>
2022-07-26 12:26:45 +00:00
<path stroke="none" d="M0 0h24v24H0z" fill="none" />
<path
d="M10.325 4.317c.426 -1.756 2.924 -1.756 3.35 0a1.724 1.724 0 0 0 2.573 1.066c1.543 -.94 3.31 .826 2.37 2.37a1.724 1.724 0 0 0 1.065 2.572c1.756 .426 1.756 2.924 0 3.35a1.724 1.724 0 0 0 -1.066 2.573c.94 1.543 -.826 3.31 -2.37 2.37a1.724 1.724 0 0 0 -2.572 1.065c-.426 1.756 -2.924 1.756 -3.35 0a1.724 1.724 0 0 0 -2.573 -1.066c-1.543 .94 -3.31 -.826 -2.37 -2.37a1.724 1.724 0 0 0 -1.065 -2.572c-1.756 -.426 -1.756 -2.924 0 -3.35a1.724 1.724 0 0 0 1.066 -2.573c-.94 -1.543 .826 -3.31 2.37 -2.37c1 .608 2.296 .07 2.572 -1.065z"
/>
<circle cx="12" cy="12" r="3" />
</svg>
Settings
2022-07-26 12:26:45 +00:00
</a>
</li>
2022-09-19 14:05:25 +02:00
<li class="flex-1 bg-transparent" />
<div class="block lg:hidden">
<UpdateAvailable />
</div>
<li>
2022-09-19 12:05:47 +02:00
<div class="no-underline icons hover:bg-error" on:click={logout}>
2022-02-10 15:47:44 +01:00
<svg
xmlns="http://www.w3.org/2000/svg"
2022-09-05 09:29:58 +02:00
class="ml-1 h-8 w-8"
2022-02-10 15:47:44 +01:00
viewBox="0 0 24 24"
stroke-width="1.5"
stroke="currentColor"
fill="none"
stroke-linecap="round"
stroke-linejoin="round"
>
2022-02-10 15:47:44 +01:00
<path stroke="none" d="M0 0h24v24H0z" fill="none" />
<path
d="M14 8v-2a2 2 0 0 0 -2 -2h-7a2 2 0 0 0 -2 2v12a2 2 0 0 0 2 2h7a2 2 0 0 0 2 -2v-2"
/>
<path d="M7 12h14l-3 -3m0 6l3 -3" />
</svg>
2022-09-19 12:05:47 +02:00
<div class="-ml-1">Logout</div>
2022-02-10 15:47:44 +01:00
</div>
</li>
2022-09-19 14:05:25 +02:00
<li class="w-full">
2022-09-19 12:05:47 +02:00
<a
2022-09-19 14:05:25 +02:00
class="text-xs hover:bg-coolgray-200 no-underline hover:text-white text-right"
2022-09-19 12:05:47 +02:00
href={`https://github.com/coollabsio/coolify/releases/tag/v${$appSession.version}`}
2022-09-19 14:05:25 +02:00
target="_blank">v{$appSession.version}</a
2022-09-19 12:05:47 +02:00
>
</li>
</ul>
</div>
</div>
2022-09-19 12:14:14 +02:00
<Tooltip triggeredBy="#iam" placement="right" color="bg-iam">IAM</Tooltip>
<Tooltip triggeredBy="#settings" placement="right" color="bg-settings text-black">Settings</Tooltip>
<Tooltip triggeredBy="#logout" placement="right" color="bg-red-600">Logout</Tooltip>