diff --git a/__tests__/shared/components/SubmissionManagement/__snapshots__/SubmissionsTable.jsx.snap b/__tests__/shared/components/SubmissionManagement/__snapshots__/SubmissionsTable.jsx.snap index ab31d14b9..e5b7d8ccd 100644 --- a/__tests__/shared/components/SubmissionManagement/__snapshots__/SubmissionsTable.jsx.snap +++ b/__tests__/shared/components/SubmissionManagement/__snapshots__/SubmissionsTable.jsx.snap @@ -30,6 +30,7 @@ exports[`Matches shallow shapshot 1`] = ` "id": "test-challenge", } } + hasPendingWorkflowRuns={null} onDelete={[Function]} onDownload={[Function]} onOpenDownloadArtifactsModal={[Function]} diff --git a/src/shared/components/SubmissionManagement/Submission/index.jsx b/src/shared/components/SubmissionManagement/Submission/index.jsx index 93829d147..56506e323 100644 --- a/src/shared/components/SubmissionManagement/Submission/index.jsx +++ b/src/shared/components/SubmissionManagement/Submission/index.jsx @@ -42,6 +42,7 @@ export default function Submission(props) { onOpenRatingsListModal, status, allowDelete, + hasPendingWorkflowRuns, } = props; const formatDate = date => moment(+new Date(date)).format('MMM DD, YYYY hh:mm A'); const onDownloadSubmission = onDownload.bind(1, submissionObject.id); @@ -66,6 +67,12 @@ export default function Submission(props) { } } + const showDeleteButton = status !== CHALLENGE_STATUS.COMPLETED + && track === COMPETITION_TRACKS.DES + && safeForDownloadCheck === true; + + const showPendingTooltip = !allowDelete && hasPendingWorkflowRuns; + return ( @@ -146,17 +153,32 @@ export default function Submission(props) { onClick={() => onDownload(submissionObject.id)} > */ } - {status !== CHALLENGE_STATUS.COMPLETED - && track === COMPETITION_TRACKS.DES - && safeForDownloadCheck === true && ( - + {showDeleteButton && ( + !showPendingTooltip ? ( + + ) : ( + // Disabled delete button with tooltip when workflow run is pending + ( +
+ You can delete this submission only after the review is complete. +
+ )} + > + +
+ ) ) } { !isTopCrowdChallenge @@ -217,4 +239,5 @@ Submission.propTypes = { allowDelete: PT.bool.isRequired, onOpenDownloadArtifactsModal: PT.func, onOpenRatingsListModal: PT.func, + hasPendingWorkflowRuns: PT.bool.isRequired, }; diff --git a/src/shared/components/SubmissionManagement/SubmissionsTable/index.jsx b/src/shared/components/SubmissionManagement/SubmissionsTable/index.jsx index 9f36dfedd..19faec324 100644 --- a/src/shared/components/SubmissionManagement/SubmissionsTable/index.jsx +++ b/src/shared/components/SubmissionManagement/SubmissionsTable/index.jsx @@ -74,8 +74,32 @@ export default function SubmissionsTable(props) { submissionObjects.forEach((subObject) => { // submissionPhaseStartDate will be the start date of // the current submission/checkpoint or empty string if any other phase + + const TERMINAL_STATUSES = [ + 'COMPLETED', + 'FAILURE', + 'CANCELLED', + 'SUCCESS', + ]; + + const workflowRunsForSubmission = submissionWorkflowRuns + && submissionWorkflowRuns[subObject.id] + ? submissionWorkflowRuns[subObject.id] + : null; + + let isWorkflowRunComplete = true; // allow delete if no runs + + if (workflowRunsForSubmission && workflowRunsForSubmission.length > 0) { + isWorkflowRunComplete = workflowRunsForSubmission.length === 0 + || workflowRunsForSubmission.every(run => TERMINAL_STATUSES.includes(run.status)); + } + const allowDelete = submissionPhaseStartDate - && moment(subObject.submissionDate).isAfter(submissionPhaseStartDate); + && moment(subObject.submissionDate).isAfter(submissionPhaseStartDate) + && isWorkflowRunComplete; + + const hasPendingWorkflowRuns = workflowRunsForSubmission + && workflowRunsForSubmission.some(run => !TERMINAL_STATUSES.includes(run.status)); const submission = ( ); submissionsWithDetails.push(submission); - const workflowRunsForSubmission = submissionWorkflowRuns - && submissionWorkflowRuns[subObject.id] - ? submissionWorkflowRuns[subObject.id] - : null; const submissionDetail = (