blob: 8ad33d1896e4d21cfd983b2d9f656ab78d4325eb [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.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