Skip to content

Commit ddbe269

Browse files
committed
dev: Refactor tooltips and other small things
1 parent 1d45d25 commit ddbe269

21 files changed

+212
-117
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
"react-dom": "^18.2.0",
1717
"react-i18next": "^12.2.2",
1818
"react-router-dom": "^5.2.0",
19-
"react-tooltip": "^4.2.17",
19+
"react-tooltip": "5.28.0",
2020
"react-virtualized": "^9.22.5",
2121
"reconnecting-websocket": "^4.4.0",
2222
"spacetime": "^7.4.7",

src/components/DAG/components/DAGContent.tsx

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -191,8 +191,7 @@ const DocstringTooltip: React.FC<{ stepName: string; docs: string }> = ({ stepNa
191191
return (
192192
<>
193193
<StepInfoMarker
194-
data-tip
195-
data-for={stepName}
194+
data-tooltip-id={stepName}
196195
onClick={(e) => {
197196
e.preventDefault();
198197
e.stopPropagation();

src/components/FilterInput/AutoCompleteFilter.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ const AutoCompleteFilter: React.FC<Props> = ({
6060
),
6161
)}
6262

63-
{autoCompleteResult.data
63+
{(!inputValue ? [] : autoCompleteResult.data)
6464
.filter((item) => !selected.includes(item.value))
6565
.map((item) => (
6666
<FilterOptionRow key={item.value} onClick={() => props.onSelect(item.value)} selected={false}>

src/components/Table/index.tsx

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ interface HeaderColumnProps {
124124
currentOrder: string;
125125
onSort: (ord: string) => void;
126126
sortable: boolean;
127-
maxWidth?: string;
127+
width?: string;
128128
alignment?: 'left' | 'right' | 'center';
129129
}
130130

@@ -134,7 +134,7 @@ export const HeaderColumn: React.FC<HeaderColumnProps> = ({
134134
currentOrder,
135135
sortable = true,
136136
onSort,
137-
maxWidth,
137+
width,
138138
alignment = 'left',
139139
...rest
140140
}) => {
@@ -147,14 +147,7 @@ export const HeaderColumn: React.FC<HeaderColumnProps> = ({
147147
onClick={() => (sortable ? onSort(queryKey) : null)}
148148
{...rest}
149149
clickable={sortable}
150-
style={
151-
maxWidth
152-
? {
153-
maxWidth: maxWidth + (maxWidth.indexOf('%') > -1 ? '' : 'px'),
154-
// width: maxWidth + (maxWidth.indexOf('%') > -1 ? '' : 'px'),
155-
}
156-
: {}
157-
}
150+
style={width ? { width } : {}}
158151
>
159152
<HeaderColumnWrapper alignment={alignment}>
160153
{label}

src/components/Text/index.tsx

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,3 +25,9 @@ export const ForceNoBreakText = styled.span`
2525
export const ForceNoWrapText = styled.span`
2626
white-space: nowrap;
2727
`;
28+
29+
export const NoWrapOverflowText = styled.div`
30+
white-space: nowrap;
31+
overflow: hidden;
32+
text-overflow: ellipsis;
33+
`;

src/components/Tooltip/index.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,24 @@
11
import React from 'react';
2-
import ReactTooltip, { TooltipProps } from 'react-tooltip';
2+
import { Tooltip as ReactTooltip, ITooltip } from 'react-tooltip';
33
import styled from 'styled-components';
44

55
//
66
// Component
77
// Basically custom styles wrapper for react-tooltip. Use by giving the trigger component data-tip and data-for=[name]
88
// attributes and then giving id=[name] for Tooltip component. eg:
99
//
10-
// <button data-tip data-for="my-tooltip">This has tooltip</button>
10+
// <button data-tooltip-content data-tooltip-id="my-tooltip">This has tooltip</button>
1111
// <Tooltip id="my-tooltip">Tooltip content</Tooltip>
1212
//
1313

14-
const Tooltip: React.FC<TooltipProps> = ({ children, ...props }) => {
14+
const Tooltip: React.FC<ITooltip> = ({ children, ...props }) => {
1515
return (
1616
<CustomTooltip>
1717
<ReactTooltip
1818
className="custom-tooltip"
1919
delayHide={250}
2020
delayShow={25}
2121
place="bottom"
22-
effect="solid"
2322
arrowColor="transparent"
2423
{...props}
2524
>
@@ -44,6 +43,7 @@ const CustomTooltip = styled.div`
4443
border-radius: var(--radius-primary);
4544
white-space: pre;
4645
pointer-events: auto;
46+
z-index: 9999;
4747
4848
&::before {
4949
display: none;

src/components/Trigger/TriggeredByBadge.tsx

Lines changed: 27 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -11,47 +11,49 @@ type TriggerBadgeInfo =
1111
| { type: 'trigger'; data: TriggerEventsValue[] };
1212

1313
type Props = {
14-
id: number;
1514
content: TriggerBadgeInfo;
1615
};
1716

18-
const TriggeredByBadge: React.FC<Props> = ({ id, content }) => {
19-
const tooltipId = `trigger-tooltip-${id}`;
20-
21-
if (content.type === 'user') {
22-
return (
23-
<>
24-
<Badge badgeType="user" data-tip data-for={tooltipId}>
25-
{content.data}
26-
</Badge>
27-
<Tooltip id={tooltipId} place="bottom">
28-
<div>{content.data}</div>
29-
</Tooltip>
30-
</>
31-
);
17+
const TriggeredByBadge: React.FC<Props> = ({ content }) => {
18+
if (!content.data) {
19+
return;
3220
}
3321

22+
const badges =
23+
content.type === 'user'
24+
? [
25+
{
26+
type: 'user' as const,
27+
name: content.data,
28+
},
29+
]
30+
: content.data.map((item) => ({ type: item.type, name: item.name }));
31+
32+
const tooltipProps = {
33+
'data-tooltip-content': badges.map((item) => item.name).join(', '),
34+
'data-tooltip-id': 'triggered-by-tooltip',
35+
};
36+
3437
return (
3538
<Badges>
36-
{content.data.slice(0, 1).map((item) => (
37-
<Badge key={item.name} badgeType={item.type} data-tip data-for={tooltipId}>
39+
{badges.slice(0, 1).map((item) => (
40+
<Badge key={item.name} badgeType={item.type} {...tooltipProps}>
3841
{item.name}
3942
</Badge>
4043
))}
41-
{content.data.length > 1 && (
42-
<Badge badgeType="event" data-tip data-for={tooltipId}>
43-
+{content.data.length - 1}
44+
{badges.length > 1 && (
45+
<Badge badgeType="event" {...tooltipProps}>
46+
+{badges.length - 1}
4447
</Badge>
4548
)}
46-
<Tooltip id={tooltipId} place="bottom">
47-
{content.data.map((item) => (
48-
<div key={item.name}>{item.name}</div>
49-
))}
50-
</Tooltip>
5149
</Badges>
5250
);
5351
};
5452

53+
export const TriggeredByTooltip = () => {
54+
return <Tooltip id="triggered-by-tooltip" place="left" />;
55+
};
56+
5557
const Badges = styled.div`
5658
display: flex;
5759
flex-wrap: nowrap;

src/components/Trigger/index.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ const Trigger: React.FC<Props> = ({ triggerEventsValue, className, showToolTip =
4444
const tooltipId = `label-tooltip-${id}`;
4545

4646
return (
47-
<TriggerLine key={id} data-tip data-for={tooltipId} className={className}>
47+
<TriggerLine key={id} data-tooltip-id={tooltipId} className={className}>
4848
{link ? (
4949
<TriggerLink to={link}>
5050
<StyledIcon name="arrow" linkToRun={linkToRun} />

src/pages/Home/Content/Tooltips.tsx

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import React from 'react';
2+
import { TagTooltip } from '@pages/Home/ResultGroup/Cells/TagCell';
3+
import Tooltip from '@components/Tooltip';
4+
import { TriggeredByTooltip } from '@components/Trigger/TriggeredByBadge';
5+
6+
const HomeTooltips: React.FC<{
7+
updateListValue: (key: string, value: string) => void;
8+
}> = ({ updateListValue }) => {
9+
return (
10+
<>
11+
<TagTooltip updateListValue={updateListValue} />
12+
<TriggeredByTooltip />
13+
<Tooltip id="general-table-tooltip" />
14+
</>
15+
);
16+
};
17+
18+
export default HomeTooltips;

src/pages/Home/Content/index.tsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { useTranslation } from 'react-i18next';
33
import styled from 'styled-components';
44
import { APIError, AsyncStatus, Run as IRun } from '@/types';
55
import AutoLoadTrigger from '@pages/Home/Content/AutoLoadTrigger';
6+
import HomeTooltips from '@pages/Home/Content/Tooltips';
67
import ResultGroup from '@pages/Home/ResultGroup';
78
import GenericError, { APIErrorRenderer } from '@components/GenericError';
89
import Spinner from '@components/Spinner';
@@ -64,7 +65,7 @@ const HomeContentArea: React.FC<Props> = ({
6465
<GenericError icon="searchNotFound" message={t('error.no-results')} />
6566
</ItemRow>
6667
)}
67-
{/* TODO */}
68+
6869
<BigLoader visible={showLoader && resultAmount > 0}>
6970
<Spinner md />
7071
</BigLoader>
@@ -82,6 +83,8 @@ const HomeContentArea: React.FC<Props> = ({
8283
}}
8384
resultAmount={resultAmount}
8485
/>
86+
87+
<HomeTooltips updateListValue={updateListValue} />
8588
</Content>
8689
);
8790
};

src/pages/Home/ResultGroup/Cells/ExpandToggle.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ const ExpandToggle: React.FC<ExpandToggleProps> = (props) => {
1818

1919
const ToggleContainer = styled.div`
2020
position: absolute;
21-
left: -1.5rem;
21+
left: var(--expand-toggle-left);
2222
top: 0;
2323
height: 100%;
2424
display: flex;

src/pages/Home/ResultGroup/Cells/TagCell.tsx

Lines changed: 37 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ import Tooltip from '@components/Tooltip';
99
//
1010

1111
type ResultGroupTagsProps = {
12-
id: string;
1312
tags: string[];
1413
updateListValue: (key: string, value: string) => void;
1514
};
@@ -18,9 +17,12 @@ type ResultGroupTagsProps = {
1817
// Component
1918
//
2019

21-
const ResultGroupTags: React.FC<ResultGroupTagsProps> = ({ id, tags, updateListValue }) => {
20+
const ResultGroupTags: React.FC<ResultGroupTagsProps> = ({ tags, updateListValue }) => {
2221
const sortedTags = tags.sort((a, b) => a.localeCompare(b));
23-
const tooltipId = `tag-tooltip-${id}`;
22+
const tooltipProps = {
23+
'data-tooltip-content': JSON.stringify(sortedTags),
24+
'data-tooltip-id': 'tag-tooltip',
25+
};
2426

2527
return (
2628
<TagsCell
@@ -35,28 +37,46 @@ const ResultGroupTags: React.FC<ResultGroupTagsProps> = ({ id, tags, updateListV
3537
</Tag>
3638
))}
3739

38-
{sortedTags.length > 1 && (
39-
<Tag data-tip data-for={tooltipId}>
40-
+{sortedTags.length - 1}
41-
</Tag>
42-
)}
40+
{sortedTags.length > 1 && <Tag {...tooltipProps}>+{sortedTags.length - 1}</Tag>}
4341
</TagContainer>
4442

45-
<TagContainerSmallScreen data-tip data-for={tooltipId}>
43+
<TagContainerSmallScreen {...tooltipProps}>
4644
<Icon name="tag" size="sm" />
4745
</TagContainerSmallScreen>
48-
<Tooltip id={tooltipId} place="bottom">
49-
{sortedTags.map((tag, index) => (
50-
<span key={tag}>
51-
<TagInTooltip onClick={() => updateListValue('_tags', tag)}>{tag}</TagInTooltip>
52-
{index !== sortedTags.length - 1 && ', '}
53-
</span>
54-
))}
55-
</Tooltip>
5646
</TagsCell>
5747
);
5848
};
5949

50+
export const TagTooltip: React.FC<{ updateListValue: (key: string, value: string) => void }> = ({
51+
updateListValue,
52+
}) => {
53+
return (
54+
<Tooltip
55+
id="tag-tooltip"
56+
place="left"
57+
clickable={true}
58+
render={(data) => {
59+
if (!data.content) return;
60+
const tags = JSON.parse(data.content || '');
61+
if (!Array.isArray(tags) || tags.length === 0) {
62+
return;
63+
}
64+
65+
return (
66+
<>
67+
{tags.map((tag, index) => (
68+
<span key={tag}>
69+
<TagInTooltip onClick={() => updateListValue('_tags', tag)}>{tag}</TagInTooltip>
70+
{index !== tags.length - 1 && ', '}
71+
</span>
72+
))}
73+
</>
74+
);
75+
}}
76+
/>
77+
);
78+
};
79+
6080
//
6181
// Styles
6282
//

src/pages/Home/ResultGroup/Cells/TriggeredByCell.tsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,6 @@ const TriggeredByCell: React.FC<Props> = ({ run }) => {
3939
<TD>
4040
{status !== 'Loading' && (
4141
<TriggeredByBadge
42-
id={run.run_number}
4342
content={
4443
hasTrigger ? { type: 'trigger', data: triggerEventsValue } : { type: 'user', data: getUsername(run) }
4544
}

src/pages/Home/ResultGroup/Cells/index.tsx

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import ResultGroupTags from '@pages/Home/ResultGroup/Cells/TagCell';
99
import TriggeredByCell from '@pages/Home/ResultGroup/Cells/TriggeredByCell';
1010
import AutoUpdating from '@components/AutoUpdating';
1111
import { TD } from '@components/Table';
12+
import { NoWrapOverflowText } from '@components/Text';
1213
import { getRunDuration, getTagOfType } from '@utils/run';
1314

1415
//
@@ -36,11 +37,13 @@ const ResultGroupCells: React.FC<ResultGroupCellsProps> = React.memo(
3637
{/* FLOW ID */}
3738
{params._group !== 'flow_id' && (
3839
<TDWithLink link={link}>
39-
<div>{r.flow_id}</div>
40+
<NoWrapOverflowText>{r.flow_id}</NoWrapOverflowText>
4041
</TDWithLink>
4142
)}
4243
{/* PROJECT */}
43-
<TDWithLink link={link}>{projectString(r)}</TDWithLink>
44+
<TDWithLink link={link}>
45+
<NoWrapOverflowText>{projectString(r)}</NoWrapOverflowText>
46+
</TDWithLink>
4447
{/* STARTED AT */}
4548
<DateTimeCell date={new Date(r.ts_epoch)} link={link} />
4649
{/* DURATION */}
@@ -55,7 +58,7 @@ const ResultGroupCells: React.FC<ResultGroupCellsProps> = React.memo(
5558
<TriggeredByCell run={r} />
5659
{/* USER TAGS */}
5760
{(r.tags || []).length > 0 ? (
58-
<ResultGroupTags id={r.run_number.toString()} tags={r.tags || []} updateListValue={updateListValue} />
61+
<ResultGroupTags tags={r.tags || []} updateListValue={updateListValue} />
5962
) : (
6063
<TDWithLink link={link}></TDWithLink>
6164
)}

0 commit comments

Comments
 (0)