Skip to content
Snippets Groups Projects
Verified Commit 80b9c37c authored by Daniel Göbel's avatar Daniel Göbel
Browse files

Create advanced usage modal with service urls and JWT

#47
parent 1b4ba160
No related branches found
No related tags found
2 merge requests!84Remove development branch,!39Resolve "Create Modal to show endpoints and JWT"
Pipeline #27358 passed
<script setup lang="ts">
import FontAwesomeIcon from "@/components/FontAwesomeIcon.vue";
import { onMounted } from "vue";
import { Toast, Tooltip } from "bootstrap";
const props = defineProps<{
text: string;
}>();
let successToast: Toast | null = null;
let failToast: Toast | null = null;
const randomIDSuffix = Math.random().toString(16).substr(2, 8);
function copyToClipboard() {
if (!navigator.clipboard) {
failToast?.show();
}
navigator.clipboard
.writeText(props.text)
.then(() => {
successToast?.show();
})
.catch(() => {
failToast?.show();
});
}
onMounted(() => {
new Tooltip("#tooltip-" + randomIDSuffix);
successToast = new Toast("#successToast-" + randomIDSuffix);
failToast = new Toast("#failToast-" + randomIDSuffix);
});
</script>
<template>
<div class="toast-container position-fixed top-toast end-0 p-3">
<div
role="alert"
aria-live="assertive"
aria-atomic="true"
class="toast text-bg-success align-items-center border-0"
data-bs-autohide="true"
:id="'successToast-' + randomIDSuffix"
>
<div class="d-flex">
<div class="toast-body">Successfully copied to clipboard</div>
<button
type="button"
class="btn-close btn-close-white me-2 m-auto"
data-bs-dismiss="toast"
aria-label="Close"
></button>
</div>
</div>
<div
role="alert"
aria-live="assertive"
aria-atomic="true"
class="toast text-bg-danger align-items-center border-0"
data-bs-autohide="true"
:id="'failToast-' + randomIDSuffix"
>
<div class="d-flex">
<div class="toast-body">Can't copy to clipboard</div>
<button
type="button"
class="btn-close btn-close-white me-2 m-auto"
data-bs-dismiss="toast"
aria-label="Close"
></button>
</div>
</div>
</div>
<span
class="hover-info cursor-pointer"
data-bs-toggle="tooltip"
data-bs-title="Copy to Clipboard"
:id="'tooltip-' + randomIDSuffix"
>
<font-awesome-icon icon="fa-solid fa-clipboard" @click="copyToClipboard" />
</span>
</template>
<style scoped>
.hover-info:hover {
color: var(--bs-info) !important;
}
</style>
<script setup lang="ts"> <script setup lang="ts">
import FontAwesomeIcon from "@/components/FontAwesomeIcon.vue"; import FontAwesomeIcon from "@/components/FontAwesomeIcon.vue";
import { useAuthStore } from "@/stores/auth"; import { useAuthStore } from "@/stores/auth";
import { useRoute, useRouter } from "vue-router"; import { useRoute } from "vue-router";
import { useCookies } from "vue3-cookies"; import { useCookies } from "vue3-cookies";
import { watch, ref, computed } from "vue"; 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 router = useRouter();
const store = useAuthStore(); const store = useAuthStore();
const { cookies } = useCookies(); const { cookies } = useCookies();
const route = useRoute(); const route = useRoute();
...@@ -13,7 +17,6 @@ const route = useRoute(); ...@@ -13,7 +17,6 @@ const route = useRoute();
function logout() { function logout() {
store.logout(); store.logout();
cookies.remove("bearer"); cookies.remove("bearer");
router.push({ name: "login" });
} }
const activeRoute = ref(""); const activeRoute = ref("");
...@@ -162,14 +165,98 @@ watch( ...@@ -162,14 +165,98 @@ watch(
class="dropdown-menu dropdown-menu-dark text-small shadow" class="dropdown-menu dropdown-menu-dark text-small shadow"
aria-labelledby="dropdownUser1" 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><hr class="dropdown-divider" /></li>
<li> <li>
<a class="dropdown-item cursor-pointer" @click="logout">Sign out</a> <router-link
:to="{ name: 'login' }"
class="dropdown-item"
@click="logout"
>
Sign out
</router-link>
</li> </li>
</ul> </ul>
</div> </div>
</nav> </nav>
</header> </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> </template>
<style scoped></style> <style scoped></style>
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment