<script setup lang="ts"> import FontAwesomeIcon from "@/components/FontAwesomeIcon.vue"; import { useAuthStore } from "@/stores/auth"; 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(); const route = useRoute(); function logout() { store.logout(); cookies.remove("bearer"); } const activeRoute = ref(""); const objectStorageActive = computed<boolean>( () => activeRoute.value == "buckets" || activeRoute.value == "s3_keys" ); const workflowActive = computed<boolean>( () => 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 = to; } } else { activeRoute.value = ""; } } ); </script> <template> <header class="navbar navbar-expand-lg navbar-dark bd-navbar bg-dark sticky-top border-bottom border-secondary" > <nav class="container-xxl bd-gutter flex-wrap flex-lg-nowrap text-light"> <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navDropdown" aria-controls="navDropdown" aria-expanded="false" aria-label="Toggle navigation" v-if="store.authenticated" > <span class="navbar-toggler-icon"></span> </button> <router-link class="navbar-brand ms-3" to="/"> <img src="/src/assets/images/denbi.svg" alt="Denbi Icon" width="24" height="24" class="d-inline-block align-text-top me-2" /> CloWM </router-link> <div class="collapse navbar-collapse" id="navDropdown" v-if="store.authenticated" > <ul id="objectStorageNav" class="navbar-nav"> <li class="nav-item dropdown"> <a class="nav-link dropdown-toggle" :class="{ active: objectStorageActive }" href="#" role="button" data-bs-toggle="dropdown" aria-expanded="false" > Object Storage </a> <ul class="dropdown-menu dropdown-menu-dark"> <li> <router-link class="dropdown-item" :to="{ name: 'buckets' }" >Buckets</router-link > </li> <li> <router-link class="dropdown-item" :to="{ name: 's3_keys' }" >S3 Keys</router-link > </li> </ul> </li> </ul> <ul id="workflowNav" class="navbar-nav"> <li class="nav-item dropdown"> <a class="nav-link dropdown-toggle" :class="{ active: workflowActive }" href="#" role="button" data-bs-toggle="dropdown" aria-expanded="false" > Workflows </a> <ul class="dropdown-menu dropdown-menu-dark"> <li> <router-link class="dropdown-item" :to="{ name: 'workflows' }" >Workflows</router-link > </li> <li> <router-link class="dropdown-item" :to="{ name: 'workflow-executions' }" >My Executions</router-link > </li> <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' }" >My Workflows</router-link > </li> <li v-if="store.workflowReviewer || store.admin"> <router-link class="dropdown-item" :to="{ name: 'workflows-reviewer' }" >Reviews</router-link > </li> </ul> </li> </ul> </div> <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" /> </a> <ul class="dropdown-menu dropdown-menu-dark 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> <router-link :to="{ name: 'login' }" class="dropdown-item" @click="logout" > Sign out </router-link> </li> </ul> </div> </nav> </header> <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" />{{ AuthOpenAPI.BASE }}</a > </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" />{{ S3ProxyOpenAPI.BASE }}</a > </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" />{{ WorkflowOpenAPI.BASE }}</a > </td> </tr> </tbody> </table> <div class="mt-4"> <label for="clowm-jwt" class="form-label">JWT for Services</label> <div class="input-group"> <input type="text" readonly class="form-control" 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> </template> <style scoped></style>