diff --git a/src/client/workflow/services/WorkflowService.ts b/src/client/workflow/services/WorkflowService.ts index 38cff146c281736c70bf1cb46312fc3144fc943c..d54923bfaedc72a2a47454d860926c0920b43bc6 100644 --- a/src/client/workflow/services/WorkflowService.ts +++ b/src/client/workflow/services/WorkflowService.ts @@ -260,4 +260,35 @@ export class WorkflowService { }); } + /** + * Deprecate a workflow version + * Deprecate a workflow version. + * + * Permission "workflow:update" required if you are the developer of the workflow, + * otherwise "workflow:read_status"" + * @param gitCommitHash Git commit git_commit_hash of specific version. + * @param wid ID of a workflow + * @returns WorkflowVersionFull Successful Response + * @throws ApiError + */ + public static workflowVersionDeprecateWorkflowVersion( + gitCommitHash: string, + wid: string, + ): CancelablePromise<WorkflowVersionFull> { + return __request(OpenAPI, { + method: 'POST', + url: '/workflows/{wid}/versions/{git_commit_hash}/deprecate', + path: { + 'git_commit_hash': gitCommitHash, + 'wid': wid, + }, + errors: { + 400: `Error decoding JWT Token`, + 403: `Not authenticated`, + 404: `Entity not Found`, + 422: `Validation Error`, + }, + }); + } + } diff --git a/src/client/workflow/services/WorkflowVersionService.ts b/src/client/workflow/services/WorkflowVersionService.ts index 18b29709be80b138bf6437c022d5f98fbf8e281b..25687b7b5fc92b1cb50a952ac391398461950a42 100644 --- a/src/client/workflow/services/WorkflowVersionService.ts +++ b/src/client/workflow/services/WorkflowVersionService.ts @@ -108,4 +108,35 @@ export class WorkflowVersionService { }); } + /** + * Deprecate a workflow version + * Deprecate a workflow version. + * + * Permission "workflow:update" required if you are the developer of the workflow, + * otherwise "workflow:read_status"" + * @param gitCommitHash Git commit git_commit_hash of specific version. + * @param wid ID of a workflow + * @returns WorkflowVersionFull Successful Response + * @throws ApiError + */ + public static workflowVersionDeprecateWorkflowVersion( + gitCommitHash: string, + wid: string, + ): CancelablePromise<WorkflowVersionFull> { + return __request(OpenAPI, { + method: 'POST', + url: '/workflows/{wid}/versions/{git_commit_hash}/deprecate', + path: { + 'git_commit_hash': gitCommitHash, + 'wid': wid, + }, + errors: { + 400: `Error decoding JWT Token`, + 403: `Not authenticated`, + 404: `Entity not Found`, + 422: `Validation Error`, + }, + }); + } + } diff --git a/src/components/object-storage/modals/CopyObjectModal.vue b/src/components/object-storage/modals/CopyObjectModal.vue index b7221031f678f5dcbebdd215a4c4341900a6dcdc..cfc05ee4f80c98386578d9acd9ab2c58b88f5fcb 100644 --- a/src/components/object-storage/modals/CopyObjectModal.vue +++ b/src/components/object-storage/modals/CopyObjectModal.vue @@ -187,7 +187,7 @@ onMounted(() => { </div> </form> <div class="col-5"> - You can copy objects. You have to create destination container prior + You can copy objects. You have to create destination buckets prior to copy.<br /> You can specify folder by using '/' at destination object field. For example, if you want to copy object under the folder named diff --git a/src/views/workflows/WorkflowView.vue b/src/views/workflows/WorkflowView.vue index efff5466d9dd065f3d1e049bad9927dade635bbb..583efb68d2fbec43f11752e7d306772c96613a1e 100644 --- a/src/views/workflows/WorkflowView.vue +++ b/src/views/workflows/WorkflowView.vue @@ -1,7 +1,11 @@ <script setup lang="ts"> import { computed, onMounted, reactive, watch } from "vue"; import type { WorkflowOut, WorkflowVersionReduced } from "@/client/workflow"; -import { Status, WorkflowService } from "@/client/workflow"; +import { + Status, + WorkflowService, + WorkflowVersionService, +} from "@/client/workflow"; import { useRoute, useRouter } from "vue-router"; import FontAwesomeIcon from "@/components/FontAwesomeIcon.vue"; import { @@ -9,6 +13,9 @@ import { sortedVersions, } from "@/utils/Workflow"; import { determineGitIcon } from "@/utils/GitRepository"; +import { useAuthStore } from "@/stores/auth"; + +const userRepository = useAuthStore(); // Props // ============================================================================= @@ -98,6 +105,20 @@ const gitIcon = computed<string>(() => determineGitIcon(workflowState.workflow?.repository_url) ); +const allowVersionDeprecation = computed<boolean>(() => { + if (activeVersion.value?.status === Status.PUBLISHED) { + if (userRepository.workflowReviewer || userRepository.admin) { + return true; + } else if ( + userRepository.workflowDev && + workflowState.workflow?.developer_id === userRepository.currentUID + ) { + return true; + } + } + return false; +}); + // Functions // ============================================================================= function updateWorkflow(workflowId: string) { @@ -121,6 +142,24 @@ function updateWorkflow(workflowId: string) { }); } +function deprecateCurrentWorkflowVersion() { + if (props.versionId) { + WorkflowVersionService.workflowVersionDeprecateWorkflowVersion( + props.versionId, + props.workflowId + ).then((version) => { + if (workflowState.workflow) { + const versionIndex = workflowState.workflow.versions.findIndex( + (v) => v.git_commit_hash === version.git_commit_hash + ); + if (versionIndex > -1) { + workflowState.workflow.versions[versionIndex].status = version.status; + } + } + }); + } +} + // Lifecycle Events // ============================================================================= onMounted(() => { @@ -183,6 +222,16 @@ onMounted(() => { > </div> <div class="row align-items-center"> + <div class="w-fit position-absolute start-0"> + <button + v-if="props.versionId && allowVersionDeprecation" + type="button" + class="btn btn-warning" + @click="deprecateCurrentWorkflowVersion" + > + Deprecate version + </button> + </div> <router-link role="button" class="btn btn-success btn-lg w-fit mx-auto"