Skip to content

Commit 0b6e64d

Browse files
committed
[Feature]: Add showing information balloon for Run status #2752
1 parent fb2b53c commit 0b6e64d

5 files changed

Lines changed: 79 additions & 47 deletions

File tree

frontend/src/libs/run.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { get as _get } from 'lodash';
22
import { StatusIndicatorProps } from '@cloudscape-design/components';
33

44
import { capitalize } from 'libs';
5+
56
import { finishedRunStatuses } from '../pages/Runs/constants';
67

78
import { IModelExtended } from '../pages/Models/List/types';
@@ -45,7 +46,7 @@ export const getStatusIconColor = (
4546
switch (status) {
4647
case 'submitted':
4748
case 'pending':
48-
return 'blue';
49+
return 'blue';
4950
case 'pulling':
5051
return 'green';
5152
case 'aborted':

frontend/src/pages/Runs/Details/RunDetails/index.tsx

Lines changed: 5 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,14 @@ import { useParams } from 'react-router-dom';
44
import { get as _get } from 'lodash';
55
import { format } from 'date-fns';
66

7-
import { Box, ColumnLayout, Container, Header, Loader, NavigateLink, StatusIndicator } from 'components';
7+
import { Box, ColumnLayout, Container, Header, Loader, NavigateLink } from 'components';
88

99
import { DATE_TIME_FORMAT } from 'consts';
10-
import { getRunError, getRunPriority, getRunStatusMessage, getStatusIconColor, getStatusIconType } from 'libs/run';
10+
import { getRunError, getRunPriority } from 'libs/run';
11+
import { ROUTES } from 'routes';
1112
import { useGetRunQuery } from 'services/run';
1213

13-
import { finishedRunStatuses } from 'pages/Runs/constants';
14-
15-
import { ROUTES } from '../../../../routes';
14+
import { RunStatusIndicator } from '../../components/RunStatusIndicator';
1615
import {
1716
getRunListItemBackend,
1817
getRunListItemInstanceId,
@@ -50,13 +49,6 @@ export const RunDetails = () => {
5049

5150
if (!runData) return null;
5251

53-
const status = finishedRunStatuses.includes(runData.status)
54-
? runData.latest_job_submission?.status ?? runData.status
55-
: runData.status;
56-
const terminationReason = finishedRunStatuses.includes(runData.status)
57-
? runData.latest_job_submission?.termination_reason
58-
: null;
59-
6052
return (
6153
<>
6254
<Container header={<Header variant="h2">{t('common.general')}</Header>}>
@@ -105,12 +97,7 @@ export const RunDetails = () => {
10597
<div>
10698
<Box variant="awsui-key-label">{t('projects.run.status')}</Box>
10799
<div>
108-
<StatusIndicator
109-
type={getStatusIconType(status, terminationReason)}
110-
colorOverride={getStatusIconColor(status, terminationReason)}
111-
>
112-
{getRunStatusMessage(runData)}
113-
</StatusIndicator>
100+
<RunStatusIndicator run={runData} />
114101
</div>
115102
</div>
116103

frontend/src/pages/Runs/List/hooks/useColumnsDefinitions.tsx

Lines changed: 4 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -2,21 +2,13 @@ import React from 'react';
22
import { useTranslation } from 'react-i18next';
33
import { format } from 'date-fns';
44

5-
import { NavigateLink, StatusIndicator } from 'components';
5+
import { NavigateLink } from 'components';
66

77
import { DATE_TIME_FORMAT } from 'consts';
8-
import {
9-
getRepoNameFromRun,
10-
getRunError,
11-
getRunPriority,
12-
getRunStatusMessage,
13-
getStatusIconColor,
14-
getStatusIconType,
15-
} from 'libs/run';
8+
import { getRepoNameFromRun, getRunError, getRunPriority } from 'libs/run';
169
import { ROUTES } from 'routes';
1710

18-
import { finishedRunStatuses } from 'pages/Runs/constants';
19-
11+
import { RunStatusIndicator } from '../../components/RunStatusIndicator';
2012
import {
2113
getRunListItemBackend,
2214
getRunListItemInstance,
@@ -73,23 +65,7 @@ export const useColumnsDefinitions = () => {
7365
{
7466
id: 'status',
7567
header: t('projects.run.status'),
76-
cell: (item: IRun) => {
77-
const status = finishedRunStatuses.includes(item.status)
78-
? item.latest_job_submission?.status ?? item.status
79-
: item.status;
80-
const terminationReason = finishedRunStatuses.includes(item.status)
81-
? item.latest_job_submission?.termination_reason
82-
: null;
83-
84-
return (
85-
<StatusIndicator
86-
type={getStatusIconType(status, terminationReason)}
87-
colorOverride={getStatusIconColor(status, terminationReason)}
88-
>
89-
{getRunStatusMessage(item)}
90-
</StatusIndicator>
91-
);
92-
},
68+
cell: (item: IRun) => <RunStatusIndicator run={item} />,
9369
},
9470
{
9571
id: 'error',
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
import React, { useRef } from 'react';
2+
3+
import { Box, Icon, Popover, StatusIndicator } from 'components';
4+
5+
import { getRunStatusMessage, getStatusIconColor, getStatusIconType } from 'libs/run';
6+
7+
import { finishedRunStatuses } from '../../constants';
8+
9+
import styles from './styles.module.scss';
10+
11+
type RunStatusIndicatorProps = {
12+
run: IRun;
13+
};
14+
15+
export const RunStatusIndicator: React.FC<RunStatusIndicatorProps> = ({ run }) => {
16+
const buttonRef = useRef<HTMLButtonElement>(null);
17+
const status = finishedRunStatuses.includes(run.status) ? run.latest_job_submission?.status ?? run.status : run.status;
18+
19+
const terminationReason = finishedRunStatuses.includes(run.status) ? run.latest_job_submission?.termination_reason : null;
20+
21+
const isShowInfo = ['no offers', 'error'].includes(run.latest_job_submission?.status_message ?? '');
22+
23+
return (
24+
<div className={styles.runStatus}>
25+
<StatusIndicator
26+
type={getStatusIconType(status, terminationReason)}
27+
colorOverride={getStatusIconColor(status, terminationReason)}
28+
>
29+
{getRunStatusMessage(run)}
30+
</StatusIndicator>
31+
32+
{isShowInfo && (
33+
<div
34+
className={styles.infoIcon}
35+
onMouseEnter={() => buttonRef.current?.click()}
36+
onMouseLeave={() => document.dispatchEvent(new MouseEvent('mousedown'))}
37+
>
38+
<Icon name="status-info" />
39+
40+
<Popover
41+
dismissButton={false}
42+
position="top"
43+
size="medium"
44+
triggerType="custom"
45+
content={<Box>Type your text here</Box>}
46+
>
47+
<button ref={buttonRef} style={{ display: 'none' }} aria-hidden="true" />
48+
</Popover>
49+
</div>
50+
)}
51+
</div>
52+
);
53+
};
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
.runStatus {
2+
display: flex;
3+
align-items: center;
4+
gap: 10px
5+
}
6+
7+
.infoIcon {
8+
position: relative;
9+
10+
[class*="awsui_popover"] {
11+
& > div {
12+
transform: translate(-8px, -14px);
13+
}
14+
}
15+
}

0 commit comments

Comments
 (0)