-
Daniel Göbel authored
#100
Daniel Göbel authored#100
MyResourcesView.vue 5.15 KiB
<script setup lang="ts">
import { onMounted, reactive } from "vue";
import { useResourceStore } from "@/stores/resources";
import CardTransitionGroup from "@/components/transitions/CardTransitionGroup.vue";
import ResourceCard from "@/components/resources/ResourceCard.vue";
import CreateResourceModal from "@/components/resources/modals/CreateResourceModal.vue";
import UploadResourceInfoModal from "@/components/resources/modals/UploadResourceInfoModal.vue";
import { useS3KeyStore } from "@/stores/s3keys";
import type { ResourceVersionOut, ResourceOut } from "@/client/resource";
import FontAwesomeIcon from "@/components/FontAwesomeIcon.vue";
import UpdateResourceModal from "@/components/resources/modals/UpdateResourceModal.vue";
import ReasonModal from "@/components/modals/ReasonModal.vue";
import BootstrapToast from "@/components/BootstrapToast.vue";
import { Modal, Toast } from "bootstrap";
const resourceRepository = useResourceStore();
const s3KeyRepository = useS3KeyStore();
let requestReasonModal: Modal | null = null;
let syncRequestSuccessToast: Toast | null = null;
const resourceState = reactive<{
loading: boolean;
resourceVersionInfo?: ResourceVersionOut;
updateResource: ResourceOut;
syncResourceVersion?: ResourceVersionOut;
}>({
loading: true,
resourceVersionInfo: undefined,
syncResourceVersion: undefined,
updateResource: {
name: "",
description: "",
source: "",
resource_id: "",
versions: [],
maintainer_id: "",
},
});
function setResourceVersionInfo(resourceVersionInfo?: ResourceVersionOut) {
resourceState.resourceVersionInfo = resourceVersionInfo;
}
function setResourceUpdate(resource: ResourceOut) {
resourceState.updateResource = resource;
}
function setResourceSync(version: ResourceVersionOut) {
resourceState.syncResourceVersion = version;
}
function requestResourceSync(
reason: string,
resourceVersion?: ResourceVersionOut,
) {
if (resourceVersion != undefined) {
resourceRepository
.requestSynchronization(resourceVersion, {
reason: reason,
})
.then(() => {
requestReasonModal?.hide();
syncRequestSuccessToast?.show();
});
}
}
onMounted(() => {
let fetchedResources = false;
requestReasonModal = new Modal("#request-synchronization-modal");
syncRequestSuccessToast = new Toast("#request-sync-toast");
s3KeyRepository.fetchS3Keys(() => {
if (!fetchedResources) {
fetchedResources = true;
resourceRepository.fetchOwnResources(() => {
resourceState.loading = false;
});
}
});
});
</script>
<template>
<bootstrap-toast toast-id="request-sync-toast" color-class="success">
Requested resource synchronization
</bootstrap-toast>
<reason-modal
modal-id="request-synchronization-modal"
modal-label=""
:loading="false"
purpose="request"
@save="
(reason) => requestResourceSync(reason, resourceState.syncResourceVersion)
"
>
<template #header> Request resource synchronization</template>
</reason-modal>
<create-resource-modal modal-id="createResourceModal" />
<upload-resource-info-modal
modal-id="uploadResourceInfoModal"
:resource-version="resourceState.resourceVersionInfo"
/>
<update-resource-modal
:resource="resourceState.updateResource"
modal-id="updateResourceModal"
/>
<div
class="row border-bottom mb-4 justify-content-between align-items-center pb-2"
>
<h2 class="w-fit">My Resources</h2>
<div class="w-fit">
<button
type="button"
class="btn btn-info btn-lg w-fit me-3"
data-bs-toggle="modal"
data-bs-target="#uploadResourceInfoModal"
@click="setResourceVersionInfo(undefined)"
>
Tutorial
</button>
<button
class="btn btn-lg btn-primary w-fit"
data-bs-toggle="modal"
data-bs-target="#createResourceModal"
>
Create Resource
</button>
</div>
</div>
<div v-if="!resourceState.loading">
<div
v-if="resourceRepository.ownResources.length === 0"
class="text-center fs-2 mt-5"
>
<font-awesome-icon
icon="fa-solid fa-x"
class="my-5 fs-0"
style="color: var(--bs-secondary)"
/>
<p>You don't have any resources registered in the system.</p>
</div>
<CardTransitionGroup
v-else
class="d-flex flex-wrap align-items-center justify-content-between"
>
<resource-card
v-for="resource in resourceRepository.ownResources"
:key="resource.resource_id"
:resource="resource"
:loading="false"
style="width: 48%"
extended
@click-info="setResourceVersionInfo"
@click-update="setResourceUpdate"
@click-request-sync="setResourceSync"
/>
</CardTransitionGroup>
</div>
<div
v-else
class="d-flex flex-wrap align-items-center justify-content-between"
>
<resource-card
v-for="resource in 4"
:key="resource"
:resource="{
name: '',
description: '',
source: '',
resource_id: '',
versions: [],
maintainer_id: '',
}"
style="min-width: 48%"
loading
extended
/>
</div>
</template>
<style scoped></style>