diff --git a/src/components/parameter-schema/form-mode/ParameterGroupForm.vue b/src/components/parameter-schema/form-mode/ParameterGroupForm.vue index e66ef66d0dfdaaa8468d303dd18325a22e7fafe5..2f45dc9c08ce436ba9a7939c75df0a8df8cfa6aa 100644 --- a/src/components/parameter-schema/form-mode/ParameterGroupForm.vue +++ b/src/components/parameter-schema/form-mode/ParameterGroupForm.vue @@ -65,7 +65,6 @@ function parameterRequired( watch( formInput, (newVal) => { - //console.log("Group", props.parameterGroupName, newVal); emit("update:modelValue", newVal); }, { diff --git a/src/components/resources/modals/CreateResourceModal.vue b/src/components/resources/modals/CreateResourceModal.vue index 93f6cab3fb1e9395ab03d9c945daebfad117ef56..8bf7a012971ac41ea5a94865e3018333f417986c 100644 --- a/src/components/resources/modals/CreateResourceModal.vue +++ b/src/components/resources/modals/CreateResourceModal.vue @@ -60,7 +60,6 @@ function createResource() { error.body["detail"] === `Resource with name '${resource.name}' already exists` ) { - console.log(`Resource with name ${resource.name} already exists`); formState.resourceNameTaken = true; resourceNameElement.value?.setCustomValidity( "Resource name is already taken", diff --git a/src/stores/resources.ts b/src/stores/resources.ts index 662c5139bfc64336aab6c478bfc568adfd9ce6bb..03f153a607db56a037c47928699ce8ca18dc643d 100644 --- a/src/stores/resources.ts +++ b/src/stores/resources.ts @@ -37,6 +37,25 @@ export const useResourceStore = defineStore({ }, }, actions: { + fetchResource( + resource_id: string, + versionStatus?: Status[], + ): Promise<ResourceOut> { + return ResourceService.resourceGetResource( + resource_id, + versionStatus, + ).then((resource) => { + const nameStore = useNameStore(); + nameStore.addNameToMapping(resource.resource_id, resource.name); + for (const version of resource.versions) { + nameStore.addNameToMapping( + version.resource_version_id, + version.release, + ); + } + return resource; + }); + }, fetchResources( maintainerId?: string, versionStatus?: Status[], @@ -100,20 +119,9 @@ export const useResourceStore = defineStore({ if (this.ownResourceMapping[resource_id]) { onFinally?.(); } - return ResourceService.resourceGetResource( - resource_id, - Object.values(Status), - ) + return this.fetchResource(resource_id, Object.values(Status)) .then((resource) => { this.ownResourceMapping[resource.resource_id] = resource; - const nameStore = useNameStore(); - nameStore.addNameToMapping(resource.resource_id, resource.name); - for (const version of resource.versions) { - nameStore.addNameToMapping( - version.resource_version_id, - version.release, - ); - } return resource; }) .finally(onFinally); @@ -236,5 +244,29 @@ export const useResourceStore = defineStore({ return changedVersion; }); }, + setLatestResource( + resourceVersion: ResourceVersionOut, + ): Promise<ResourceVersionOut> { + return ResourceVersionService.resourceVersionResourceVersionLatest( + resourceVersion.resource_id, + resourceVersion.resource_version_id, + ); + }, + deleteOnCluster( + resourceVersion: ResourceVersionOut, + ): Promise<ResourceVersionOut> { + return ResourceVersionService.resourceVersionDeleteResourceVersionCluster( + resourceVersion.resource_id, + resourceVersion.resource_version_id, + ); + }, + deleteInS3( + resourceVersion: ResourceVersionOut, + ): Promise<ResourceVersionOut> { + return ResourceVersionService.resourceVersionDeleteResourceVersionS3( + resourceVersion.resource_id, + resourceVersion.resource_version_id, + ); + }, }, }); diff --git a/src/views/admin/AdminResourcesView.vue b/src/views/admin/AdminResourcesView.vue index 380187ca549819e46b7a5cf52e7dbb167515f2bf..d75b3f5b528271328d3fc1aa9cec59cc1d02ca88 100644 --- a/src/views/admin/AdminResourcesView.vue +++ b/src/views/admin/AdminResourcesView.vue @@ -3,6 +3,7 @@ import { useResourceStore } from "@/stores/resources"; import { reactive } from "vue"; import { type ResourceOut, + type ResourceVersionOut, Status, } from "@/client/resource"; import SearchUserModal from "@/components/modals/SearchUserModal.vue"; @@ -53,6 +54,66 @@ function searchResources() { }); } +function replaceResourceVersion( + resourceVersion: ResourceVersionOut, +): ResourceVersionOut { + const resourceIndex = resourceState.resources.findIndex( + (r) => r.resource_id == resourceVersion.resource_id, + ); + if (resourceIndex > -1) { + const versionIndex = resourceState.resources[ + resourceIndex + ].versions.findIndex( + (r) => r.resource_version_id == resourceVersion.resource_version_id, + ); + if (versionIndex > -1) { + resourceState.resources[resourceIndex].versions[versionIndex] = + resourceVersion; + } + } + return resourceVersion; +} + +function setLatest(resourceVersion: ResourceVersionOut) { + resourceState.loading = true; + resourceRepository + .setLatestResource(resourceVersion) + .then(replaceResourceVersion) + .finally(() => { + resourceState.loading = false; + }); +} + +function deleteOnCluster(resourceVersion: ResourceVersionOut) { + resourceState.loading = true; + resourceRepository + .deleteOnCluster(resourceVersion) + .then(replaceResourceVersion) + .finally(() => { + resourceState.loading = false; + }); +} + +function deleteInS3(resourceVersion: ResourceVersionOut) { + resourceState.loading = true; + resourceRepository + .deleteInS3(resourceVersion) + .then(replaceResourceVersion) + .finally(() => { + resourceState.loading = false; + }); +} + +function syncToCluster(resourceVersion: ResourceVersionOut) { + resourceState.loading = true; + resourceRepository + .syncResource(resourceVersion) + .then(replaceResourceVersion) + .finally(() => { + resourceState.loading = false; + }); +} + function resetForm() { resourceState.maintainerId = ""; resourceState.searchString = ""; @@ -136,7 +197,12 @@ function resetForm() { > Search </button> - <button type="button" class="btn-primary btn w-fit ms-4" @click="resetForm"> + <button + type="button" + class="btn-primary btn w-fit ms-4" + :disabled="resourceState.loading" + @click="resetForm" + > Reset </button> </form> @@ -213,21 +279,61 @@ function resetForm() { class="btn btn-secondary dropdown-toggle dropdown-toggle-split" data-bs-toggle="dropdown" aria-expanded="false" + :disabled="resourceState.loading" > <span class="visually-hidden">Toggle Dropdown</span> </button> <ul class="dropdown-menu"> - <li><a class="dropdown-item" href="#">Action</a></li> - <li> - <a class="dropdown-item" href="#">Another action</a> + <li v-if="version.status === Status.SYNCHRONIZED"> + <button + class="dropdown-item" + type="button" + @click="setLatest(version)" + > + Set to Latest + </button> + </li> + <li + v-if=" + version.status === Status.CLUSTER_DELETED || + version.status === Status.SYNC_REQUESTED + " + > + <button + class="dropdown-item" + type="button" + @click="syncToCluster(version)" + > + <font-awesome-icon + icon="fa-solid fa-cloud-arrow-down" + /> + <span class="ms-1">Sync to Cluster</span> + </button> </li> - <li> - <a class="dropdown-item" href="#" - >Something else here</a + <li + v-if=" + version.status === Status.SYNCHRONIZED || + version.status === Status.LATEST + " + > + <button + class="dropdown-item text-danger align-middle" + type="button" + @click="deleteOnCluster(version)" > + <font-awesome-icon icon="fa-solid fa-trash" /> + <span class="ms-1">Delete on Cluster</span> + </button> </li> - <li> - <a class="dropdown-item" href="#">Separated link</a> + <li v-if="version.status === Status.CLUSTER_DELETED"> + <button + class="dropdown-item text-danger align-middle" + type="button" + @click="deleteInS3(version)" + > + <font-awesome-icon icon="fa-solid fa-trash" /> + <span class="ms-1">Delete in S3</span> + </button> </li> </ul> </div> diff --git a/src/views/resources/ReviewResourceView.vue b/src/views/resources/ReviewResourceView.vue index b1477b56a4c2dfdeca38b2ea188089348b0c6206..f9dc9ead18cd0fed5686ae3c52fa7b8bcb7d7a79 100644 --- a/src/views/resources/ReviewResourceView.vue +++ b/src/views/resources/ReviewResourceView.vue @@ -161,8 +161,8 @@ onMounted(() => { </template> </tbody> </table> - <div v-else> - <p>Hello</p> + <div v-else class="text-center mt-5 fs-4"> + There are currently no Resources to review </div> </template>