Newer
Older
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();
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>
<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"
width="24"
height="24"
class="d-inline-block align-text-top me-2"
/>
<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>
<a class="dropdown-item" href="#">Executions</a>
</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
>
<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>
<router-link
:to="{ name: 'login' }"
class="dropdown-item"
@click="logout"
>
Sign out
</router-link>
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
<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>