All files / modules/70-pipeline/components/execution/StepDetails/tabs/JiraApprovalTab JiraApprovalTab.tsx

100% Statements 16/16
77.53% Branches 69/89
100% Functions 1/1
100% Lines 16/16

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111              2x     2x 2x 2x                         2x 2x 2x 2x   2x 4x 4x   4x 4x 4x 4x   4x                                                                                                                                              
/*
 * Copyright 2021 Harness Inc. All rights reserved.
 * Use of this source code is governed by the PolyForm Shield 1.0.0 license
 * that can be found in the licenses directory at the root of this repository, also available at
 * https://polyformproject.org/wp-content/uploads/2020/06/PolyForm-Shield-1.0.0.txt.
 */
 
import React from 'react'
 
import type { ApprovalInstanceResponse, JiraApprovalInstanceDetails } from 'services/pipeline-ng'
import { Duration } from '@common/exports'
import { ApprovalStatus } from '@pipeline/utils/approvalUtils'
import { String } from 'framework/strings'
 
export type ApprovalData =
  | (ApprovalInstanceResponse & {
      details: JiraApprovalInstanceDetails
    })
  | null
 
export interface JiraApprovalTabProps {
  approvalData: ApprovalData
  isWaiting: boolean
}
 
import ExecutionStatusLabel from '@pipeline/components/ExecutionStatusLabel/ExecutionStatusLabel'
import { JiraCriteria } from './JiraCriteria/JiraCriteria'
import headerCss from '@pipeline/pages/execution/ExecutionPipelineView/ExecutionGraphView/ExecutionStageDetailsHeader/ExecutionStageDetailsHeader.module.scss'
import css from './JiraApprovalTab.module.scss'
 
export function JiraApprovalTab(props: JiraApprovalTabProps): React.ReactElement {
  const { approvalData, isWaiting } = props
  const wasApproved = !isWaiting && approvalData?.status === ApprovalStatus.APPROVED
  const wasRejected =
    !isWaiting && (approvalData?.status === ApprovalStatus.REJECTED || approvalData?.status === ApprovalStatus.EXPIRED)
  const wasFailed = !isWaiting && approvalData?.status === ApprovalStatus.FAILED
  const jiraKey = approvalData?.details.issue.key
  const jiraUrl = approvalData?.details.issue.url
 
  return (
    <React.Fragment>
      {wasFailed ? (
        <div className={headerCss.errorMsgWrapper}>
          <ExecutionStatusLabel status={'Failed'} />
          <div className={headerCss.errorMsg}>
            <String className={headerCss.errorTitle} stringID="errorSummaryText" tagName="div" />
            <p>{approvalData?.errorMessage}</p>
          </div>
        </div>
      ) : (
        <div className={css.info} data-type="jira">
          {isWaiting ? (
            <>
              <div className={css.timer}>
                <Duration
                  className={css.duration}
                  durationText=""
                  icon="hourglass"
                  startTime={approvalData?.deadline}
                  iconProps={{ size: 8 }}
                />
                <String stringID="pipeline.timeRemainingSuffix" />
              </div>
              {jiraKey && jiraUrl ? (
                <div className={css.jiraTicket}>
                  <String stringID="pipeline.jiraApprovalStep.execution.jiraTicket" />
 
                  <a href={jiraUrl} target="_blank" rel="noopener noreferrer">
                    {jiraKey}
                  </a>
                </div>
              ) : null}
            </>
          ) : null}
          {wasApproved && jiraUrl && jiraKey ? (
            <div className={css.jiraTicket}>
              <String stringID="pipeline.jiraApprovalStep.execution.wasApproved" />
 
              <a href={jiraUrl} target="_blank" rel="noopener noreferrer">
                {jiraKey}
              </a>
            </div>
          ) : null}
 
          {wasRejected && jiraUrl && jiraKey ? (
            <div className={css.jiraTicket}>
              {approvalData?.status === ApprovalStatus.REJECTED ? (
                <String stringID="pipeline.jiraApprovalStep.execution.wasRejected" />
              ) : null}
              {approvalData?.status === ApprovalStatus.EXPIRED ? (
                <String stringID="pipeline.jiraApprovalStep.execution.wasExpired" />
              ) : null}
              <a href={jiraUrl} target="_blank" rel="noopener noreferrer">
                {jiraKey}
              </a>
            </div>
          ) : null}
        </div>
      )}
      <div className={css.jiraApproval}>
        {approvalData?.details?.approvalCriteria ? (
          <JiraCriteria type="approval" criteria={approvalData.details.approvalCriteria} />
        ) : null}
        {approvalData?.details?.rejectionCriteria ? (
          <JiraCriteria type="rejection" criteria={approvalData.details.rejectionCriteria} />
        ) : null}
      </div>
    </React.Fragment>
  )
}