Newer
Older
import FontAwesomeIcon from "@/components/FontAwesomeIcon.vue";
import { useAuthStore } from "@/stores/users";
import { useRoute } from "vue-router";
import { useCookies } from "vue3-cookies";
import { watch, ref, computed } from "vue";
import BootstrapModal from "@/components/modals/BootstrapModal.vue";
import { OpenAPI as S3ProxyOpenAPI } from "@/client/s3proxy";
import { OpenAPI as AuthOpenAPI } from "@/client/auth";
import { OpenAPI as WorkflowOpenAPI } from "@/client/workflow";
import CopyToClipboardIcon from "@/components/CopyToClipboardIcon.vue";
const store = useAuthStore();
const { cookies } = useCookies();
function logout() {
store.logout();
cookies.remove("bearer");
const activeRoute = ref("");
const objectStorageActive = computed<boolean>(
() => activeRoute.value == "buckets" || activeRoute.value == "s3_keys",
() => activeRoute.value == "workflows",
watch(
() => route.name,
(to) => {
if (typeof to === "string") {
if (to.startsWith("bucket")) {
activeRoute.value = "buckets";
} else if (to.startsWith("workflow")) {
activeRoute.value = "workflows";
}
} else {
activeRoute.value = "";
}
</script>
<template>
class="navbar navbar-expand-lg bd-navbar sticky-top border-bottom border-secondary"
<nav class="container-xxl bd-gutter flex-wrap flex-lg-nowrap text-light">
<router-link
class="navbar-brand ms-3 text-white d-flex align-items-center"
to="/"
>
src="/src/assets/images/clowm.svg"
alt="CloWM Icon"
width="32"
height="32"
class="d-inline-block align-text-top me-2"
/>
<div class="d-flex me-auto w-fit" v-if="store.authenticated">
<ul class="navbar-nav">
<li class="nav-item dropdown">
<a
class="nav-link dropdown-toggle"
id=""
:class="{ 'text-black': objectStorageActive }"
href="#"
role="button"
data-bs-toggle="dropdown"
aria-expanded="false"
<ul
class="dropdown-menu shadow m-0"
aria-labelledby="objectStoreDropdown"
>
<router-link class="dropdown-item" :to="{ name: 'buckets' }"
<router-link class="dropdown-item" :to="{ name: 's3_keys' }"
</li>
</ul>
</li>
<li class="nav-item dropdown">
<a
class="nav-link dropdown-toggle"
:class="{ 'text-black': workflowActive }"
id="workflowDropdown"
href="#"
role="button"
data-bs-toggle="dropdown"
aria-expanded="false"
<ul
class="dropdown-menu shadow m-0"
aria-labelledby="workflowDropdown"
>
<router-link class="dropdown-item" :to="{ name: 'workflows' }"
<router-link
class="dropdown-item"
:to="{ name: 'workflow-executions' }"
>My Workflow Executions
</router-link>
<li
v-if="
store.workflowDev || store.workflowReviewer || store.admin
"
>
<hr class="dropdown-divider" />
</li>
<li v-if="store.workflowDev || store.admin">
<router-link
class="dropdown-item"
:to="{ name: 'workflows-developer' }"
<li v-if="store.workflowReviewer || store.admin">
<router-link
class="dropdown-item"
:to="{ name: 'workflows-reviewer' }"
<div class="dropdown" v-if="store.authenticated && store.user != null">
<a
href="#"
class="d-flex align-items-center text-white text-decoration-none dropdown-toggle-split"
id="dropdownUser1"
data-bs-toggle="dropdown"
aria-expanded="false"
>
<strong class="me-2">{{ store.user.display_name }}</strong>
<font-awesome-icon icon="fa-solid fa-circle-user" class="fs-5" />
class="dropdown-menu text-small shadow"
aria-labelledby="dropdownUser1"
>
<li>
<a
href="#"
class="dropdown-item"
data-bs-toggle="modal"
data-bs-target="#advancedUsageModal"
>Advanced Usage</a
>
</li>
<li>
<hr class="dropdown-divider" />
</li>
<li><h6 class="dropdown-header">Roles</h6></li>
<li
v-for="role in store.roles"
:key="role"
class="dropdown-item text-capitalize disabled"
<li>
<hr class="dropdown-divider" />
</li>
<router-link
:to="{ name: 'login' }"
class="dropdown-item"
@click="logout"
>
Sign out
</router-link>
<bootstrap-modal
static-backdrop
modal-i-d="advancedUsageModal"
modal-label="Advanced Usage Modal"
>
<template v-slot:header>
<h3>Advanced Usage</h3>
</template>
<template v-slot:body>
<table class="table table-borderless table-sm">
<tbody>
<tr>
<td class="text-end">Auth Service:</td>
<td>
<a :href="AuthOpenAPI.BASE + '/docs'" target="_blank">
<font-awesome-icon
class="me-1"
icon="fa-solid fa-arrow-up-right-from-square"
>
</td>
</tr>
<tr>
<td class="text-end">S3Proxy Service:</td>
<td>
<a :href="S3ProxyOpenAPI.BASE + '/docs'" target="_blank">
<font-awesome-icon
class="me-1"
icon="fa-solid fa-arrow-up-right-from-square"
>
</td>
</tr>
<tr>
<td class="text-end">Workflow Service:</td>
<td>
<a :href="WorkflowOpenAPI.BASE + '/docs'" target="_blank">
<font-awesome-icon
class="me-1"
icon="fa-solid fa-arrow-up-right-from-square"
>
</td>
</tr>
</tbody>
</table>
<div class="mt-4">
<label for="clowm-jwt" class="form-label"
>JWT for Services (expires at
{{
dayjs.unix(store.decodedToken!.exp).format("DD.MM.YYYY HH:mm")
}})</label
>
<div class="input-group">
<input
type="text"
readonly
id="clowm-jwt"
:value="store.token"
aria-describedby="clowm-jwt-copy"
/>
<span class="input-group-text" id="clowm-jwt-copy"
><copy-to-clipboard-icon :text="store.token ?? ''"
/></span>
</div>
</div>
</template>
<template v-slot:footer>
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">
Close
</button>
</template>
</bootstrap-modal>
<style scoped>
header {
}
</style>