cc-backend/web/frontend/src/Header.svelte

179 lines
5.5 KiB
Svelte
Raw Normal View History

2022-06-22 11:20:57 +02:00
<script>
import {
Icon,
Collapse,
Navbar,
NavbarBrand,
Nav,
NavbarToggler,
Dropdown,
DropdownToggle,
2023-08-31 14:18:33 +02:00
DropdownMenu,
} from "sveltestrap";
2023-08-24 09:22:12 +02:00
import NavbarLinks from "./NavbarLinks.svelte";
import NavbarTools from "./NavbarTools.svelte";
2022-06-22 11:20:57 +02:00
export let username; // empty string if auth. is disabled, otherwise the username as string
export let authlevel; // Integer
export let clusters; // array of names
export let roles; // Role Enum-Like
2022-06-22 11:20:57 +02:00
let isOpen = false;
let screenSize;
2022-06-22 11:20:57 +02:00
const jobsTitle = new Map();
jobsTitle.set(2, "Job Search");
jobsTitle.set(3, "Managed Jobs");
jobsTitle.set(4, "Jobs");
jobsTitle.set(5, "Jobs");
const usersTitle = new Map();
usersTitle.set(3, "Managed Users");
usersTitle.set(4, "Users");
usersTitle.set(5, "Users");
const views = [
{
title: "My Jobs",
requiredRole: roles.user,
href: `/monitoring/user/${username}`,
icon: "bar-chart-line-fill",
perCluster: false,
menu: "none",
},
{
title: jobsTitle.get(authlevel),
requiredRole: roles.user,
2023-08-25 09:51:33 +02:00
href: `/monitoring/jobs/`,
icon: "card-list",
perCluster: false,
menu: "none",
},
{
title: usersTitle.get(authlevel),
requiredRole: roles.manager,
href: "/monitoring/users/",
icon: "people-fill",
perCluster: false,
menu: "Groups",
},
{
title: "Projects",
requiredRole: roles.support,
href: "/monitoring/projects/",
icon: "folder",
perCluster: false,
menu: "Groups",
},
{
title: "Tags",
requiredRole: roles.user,
href: "/monitoring/tags/",
icon: "tags",
perCluster: false,
menu: "Groups",
},
{
title: "Analysis",
requiredRole: roles.support,
href: "/monitoring/analysis/",
icon: "graph-up",
perCluster: true,
menu: "Stats",
},
{
title: "Nodes",
requiredRole: roles.admin,
href: "/monitoring/systems/",
icon: "cpu",
perCluster: true,
menu: "Groups",
},
{
title: "Status",
requiredRole: roles.admin,
href: "/monitoring/status/",
icon: "cpu",
perCluster: true,
menu: "Stats",
},
];
2022-06-22 11:20:57 +02:00
</script>
<svelte:window bind:innerWidth={screenSize} />
<Navbar color="light" light expand="md" fixed="top">
2022-06-22 11:20:57 +02:00
<NavbarBrand href="/">
<img alt="ClusterCockpit Logo" src="/img/logo.png" height="25rem" />
2022-06-22 11:20:57 +02:00
</NavbarBrand>
<NavbarToggler on:click={() => (isOpen = !isOpen)} />
<Collapse
2023-08-31 14:18:33 +02:00
style="justify-content: space-between"
{isOpen}
navbar
expand="md"
on:update={({ detail }) => (isOpen = detail.isOpen)}
>
2023-08-31 14:18:33 +02:00
<Nav navbar>
{#if screenSize > 1500 || screenSize < 768}
2023-08-24 09:22:12 +02:00
<NavbarLinks
{clusters}
links={views.filter(
(item) => item.requiredRole <= authlevel
)}
/>
{:else if screenSize > 1300}
2023-08-24 09:22:12 +02:00
<NavbarLinks
{clusters}
links={views.filter(
(item) =>
item.requiredRole <= authlevel &&
item.menu != "Stats"
)}
/>
<Dropdown nav>
<DropdownToggle nav caret>
<Icon name="graph-up" />
Stats
</DropdownToggle>
<DropdownMenu class="dropdown-menu-lg-end">
2023-08-24 09:22:12 +02:00
<NavbarLinks
{clusters}
links={views.filter(
(item) =>
item.requiredRole <= authlevel &&
item.menu == "Stats"
)}
/>
</DropdownMenu>
</Dropdown>
{:else}
2023-08-24 09:22:12 +02:00
<NavbarLinks
{clusters}
links={views.filter(
(item) =>
item.requiredRole <= authlevel &&
item.menu == "none"
)}
/>
{#each Array("Groups", "Stats") as menu}
<Dropdown nav>
2022-06-22 11:20:57 +02:00
<DropdownToggle nav caret>
{menu}
2022-06-22 11:20:57 +02:00
</DropdownToggle>
<DropdownMenu class="dropdown-menu-lg-end">
2023-08-24 09:22:12 +02:00
<NavbarLinks
{clusters}
links={views.filter(
(item) =>
item.requiredRole <= authlevel &&
item.menu == menu
)}
/>
2022-06-22 11:20:57 +02:00
</DropdownMenu>
</Dropdown>
{/each}
{/if}
2022-06-22 11:20:57 +02:00
</Nav>
2023-08-31 14:18:33 +02:00
<NavbarTools {username} {authlevel} {roles} {screenSize} />
2022-06-22 11:20:57 +02:00
</Collapse>
</Navbar>