| /* |
| * Licensed to the Apache Software Foundation (ASF) under one or more |
| * contributor license agreements. See the NOTICE file distributed with |
| * this work for additional information regarding copyright ownership. |
| * The ASF licenses this file to You under the Apache License, Version 2.0 |
| * (the "License"); you may not use this file except in compliance with |
| * the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| * |
| */ |
| import React, { useEffect, useRef } from 'react' |
| import { Providers, ProviderLabels, ProviderIcons } from '@/data/Providers' |
| import { |
| Icon, |
| Colors, |
| Position, |
| Popover, |
| TextArea, |
| Button, |
| H3, |
| Classes |
| } from '@blueprintjs/core' |
| import dayjs from '@/utils/time' |
| |
| const StageTaskName = (props) => { |
| const { task, showDetails = null, onClose = () => {} } = props |
| |
| const popoverTriggerRef = useRef() |
| |
| useEffect(() => { |
| if (showDetails !== null && popoverTriggerRef.current) { |
| popoverTriggerRef.current.click() |
| } |
| }, [showDetails]) |
| |
| return ( |
| <> |
| <Popover |
| className='trigger-pipeline-activity-help' |
| popoverClassName='popover-help-pipeline-activity' |
| // isOpen={false} |
| onClosed={onClose} |
| position={Position.RIGHT} |
| autoFocus={false} |
| enforceFocus={false} |
| usePortal={true} |
| // disabled |
| > |
| <span |
| className='task-plugin-text' |
| ref={popoverTriggerRef} |
| style={{ display: 'block', margin: '5px 0 5px 0' }} |
| > |
| <strong>Task ID {task.id}</strong>{' '} |
| {ProviderLabels[task?.plugin?.toUpperCase()]}{' '} |
| {task.plugin === Providers.GITHUB && |
| task.plugin !== Providers.JENKINS && ( |
| <> |
| @{task.options.owner}/{task.options.repo} |
| </> |
| )} |
| {task.plugin === Providers.JIRA && ( |
| <>Board ID {task.options.boardId}</> |
| )} |
| {task.plugin === Providers.GITLAB && ( |
| <>Project ID {task.options.projectId}</> |
| )} |
| {task.plugin === Providers.GITEXTRACTOR || |
| (task.plugin === Providers.DORA && <>{task.options.repoId}</>)} |
| </span> |
| <> |
| <div |
| style={{ |
| textShadow: 'none', |
| fontSize: '12px', |
| padding: '12px', |
| maxWidth: '400px' |
| }} |
| > |
| <div style={{ display: 'flex', justifyContent: 'space-between' }}> |
| <div |
| style={{ |
| marginBottom: '10px', |
| color: Colors.GRAY2, |
| fontWeight: 700, |
| fontSize: '14px', |
| maxWidth: '60%' |
| }} |
| > |
| <H3 |
| style={{ |
| margin: 0, |
| fontSize: '18px', |
| color: Colors.BLACK, |
| textOverflow: 'ellipsis', |
| overflow: 'hidden', |
| whiteSpace: 'nowrap' |
| }} |
| > |
| {task.plugin === Providers.REFDIFF && ( |
| <>{ProviderLabels.REFDIFF}</> |
| )} |
| {task.plugin === Providers.GITEXTRACTOR && ( |
| <>{ProviderLabels.GITEXTRACTOR}</> |
| )} |
| {task.plugin === Providers.FEISHU && ( |
| <>{ProviderLabels.FEISHU}</> |
| )} |
| {task.plugin === Providers.JENKINS && ( |
| <>{ProviderLabels.JENKINS}</> |
| )} |
| {task.plugin === Providers.TAPD && <>{ProviderLabels.TAPD}</>} |
| {task.plugin === Providers.JIRA && ( |
| <>Board ID {task.options.boardId}</> |
| )} |
| {task.plugin === Providers.GITLAB && ( |
| <>Project ID {task.options.projectId}</> |
| )} |
| {task.plugin === Providers.GITHUB && |
| task.plugin !== Providers.JENKINS && ( |
| <> |
| @{task.options.owner}/{task.options.repo} |
| </> |
| )} |
| </H3> |
| {![ |
| Providers.JENKINS, |
| Providers.REFDIFF, |
| Providers.GITEXTRACTOR |
| ].includes(task.plugin) && ( |
| <> |
| {ProviderLabels[task.plugin?.toUpperCase()] || |
| 'System Task'} |
| <br /> |
| </> |
| )} |
| </div> |
| <div |
| style={{ |
| fontWeight: 800, |
| displays: 'flex', |
| alignItems: 'center', |
| justifyContent: 'flex-start', |
| alignSelf: 'flex-start', |
| padding: '0 0 0 40px', |
| fontSize: '18px', |
| marginLeft: 'auto' |
| }} |
| > |
| {Number( |
| task.status === 'TASK_COMPLETED' |
| ? 100 |
| : (task.progress / 1) * 100 |
| ).toFixed(0)} |
| % |
| </div> |
| <div style={{ padding: '0 0 10px 20px' }}> |
| {ProviderIcons[task.plugin?.toLowerCase()] |
| ? ProviderIcons[task.plugin?.toLowerCase()](24, 24) |
| : null} |
| </div> |
| </div> |
| {task.status === 'TASK_CREATED' && ( |
| <div style={{ fontSize: '10px' }}> |
| <p style={{ fontSize: '12px' }}> |
| Task #{task.id} is <strong>pending</strong> and has not yet |
| started. |
| </p> |
| </div> |
| )} |
| {task.status !== 'TASK_CREATED' && ( |
| <div style={{ fontSize: '10px' }}> |
| <div |
| style={{ |
| display: 'flex', |
| flexDirection: 'row', |
| justifyContent: 'space-between' |
| }} |
| > |
| <div> |
| <label style={{ color: Colors.GRAY2 }}>ID</label> |
| <br /> |
| <span>{task.id}</span> |
| </div> |
| <div style={{ marginLeft: '20px' }}> |
| <label style={{ color: Colors.GRAY2 }}>Created</label> |
| <br /> |
| <span>{dayjs(task.createdAt).format('L LT')}</span> |
| </div> |
| {task.finishedAt && ( |
| <div style={{ marginLeft: '20px' }}> |
| <label style={{ color: Colors.GRAY2 }}>Finished</label> |
| <br /> |
| <span>{dayjs(task.finishedAt).format('L LT')}</span> |
| </div> |
| )} |
| </div> |
| <div style={{ marginTop: '6px' }}> |
| <label style={{ color: Colors.GRAY2 }}>Status</label> |
| <br /> |
| <strong>{task.status}</strong>{' '} |
| </div> |
| {task.message !== '' && ( |
| <div style={{ marginTop: '6px' }}> |
| <label style={{ color: Colors.DARK_GRAY1 }}>Message</label> |
| <br /> |
| <span |
| style={{ |
| color: |
| task.status === 'TASK_FAILED' |
| ? Colors.RED3 |
| : Colors.BLACK |
| }} |
| > |
| {task.status === 'TASK_FAILED' && ( |
| <Icon |
| icon='warning-sign' |
| color={Colors.RED5} |
| size={10} |
| style={{ marginRight: '3px' }} |
| /> |
| )} |
| {task.message} |
| </span> |
| </div> |
| )} |
| <div style={{ marginTop: '6px' }}> |
| <label style={{ color: Colors.GRAY2 }}>Updated</label> |
| <br /> |
| <span> |
| {task.updatedAt |
| ? dayjs(task.updatedAt).format('L LT') |
| : '-'} |
| </span> |
| </div> |
| </div> |
| )} |
| <div |
| style={{ |
| marginTop: '10px', |
| display: 'flex', |
| justifyContent: 'flex-end' |
| }} |
| > |
| <Button |
| className={Classes.POPOVER_DISMISS} |
| text='OK' |
| intent='primary' |
| small |
| /> |
| </div> |
| </div> |
| </> |
| </Popover> |
| </> |
| ) |
| } |
| |
| export default StageTaskName |