blob: cb84f8818c0108f3978d662cf93649899315af9d [file] [log] [blame]
/*
* 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.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>{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