Skip to content

Commit 9eefd4d

Browse files
committed
Implemented showing timestamp for logs
1 parent 64533db commit 9eefd4d

3 files changed

Lines changed: 91 additions & 9 deletions

File tree

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
import React, { useEffect, useRef, useState } from 'react';
2+
import cn from 'classnames';
3+
4+
import { Icon } from 'components';
5+
6+
import styles from '../../styles.module.scss';
7+
8+
export const LogRow: React.FC<{
9+
logItem: ILogItem;
10+
isShowTimestamp?: boolean;
11+
}> = ({ logItem, isShowTimestamp }) => {
12+
const [collapsed, setCollapsed] = useState(true);
13+
const [showChevron, setShowChevron] = useState(true);
14+
const messageInnerRef = useRef(null);
15+
16+
const toggleCollapsed = () => setCollapsed((val) => !val);
17+
18+
useEffect(() => {
19+
const observeTarget = messageInnerRef.current;
20+
if (!observeTarget) return;
21+
22+
const resizeObserver = new ResizeObserver((entries) => {
23+
const entry = entries[0];
24+
if (entry) {
25+
const { height } = entry.contentRect;
26+
27+
setShowChevron(height > 32);
28+
}
29+
});
30+
31+
resizeObserver.observe(observeTarget);
32+
33+
return () => {
34+
resizeObserver.unobserve(observeTarget);
35+
};
36+
}, []);
37+
38+
return (
39+
<tr className={styles.logItem}>
40+
{isShowTimestamp && (
41+
<td className={styles.timestamp}>
42+
<span className={cn(styles.toggleCollapse, { [styles.hidden]: !showChevron })} onClick={toggleCollapsed}>
43+
<Icon name={collapsed ? 'caret-right-filled' : 'caret-down-filled'} />
44+
</span>{' '}
45+
{logItem.timestamp}
46+
</td>
47+
)}
48+
<td className={styles.messageCol}>
49+
<div className={cn(styles.message, { [styles.collapsed]: collapsed && isShowTimestamp })}>
50+
<div ref={messageInnerRef} className={styles.messageInner}>
51+
{logItem.message}
52+
</div>
53+
</div>
54+
</td>
55+
</tr>
56+
);
57+
};

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

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import { Box, Button, Code, Container, Header, ListEmptyMessage, Loader, TextCon
77
import { useLocalStorageState } from 'hooks/useLocalStorageState';
88
import { useLazyGetProjectLogsQuery } from 'services/project';
99

10+
import { LogRow } from './components/LogRow';
1011
import { decodeLogs } from './helpers';
1112

1213
import { IProps } from './types';
@@ -201,12 +202,13 @@ export const Logs: React.FC<IProps> = ({ className, projectName, runName, jobSub
201202

202203
{Boolean(logsForView.length) && (
203204
<Code className={styles.terminal} ref={codeRef}>
204-
{logsForView.map((log, i) => (
205-
<p key={i}>
206-
{isShowTimestamp && <span className={styles.timestamp}>{log.timestamp}</span>}
207-
{log.message}
208-
</p>
209-
))}
205+
<table>
206+
<tbody>
207+
{logsForView.map((log, i) => (
208+
<LogRow logItem={log} key={i} isShowTimestamp={isShowTimestamp} />
209+
))}
210+
</tbody>
211+
</table>
210212
</Code>
211213
)}
212214
</TextContent>

frontend/src/pages/Runs/Details/Logs/styles.module.scss

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -85,13 +85,36 @@
8585
color: awsui.$color-text-body-default !important;
8686
}
8787

88-
p {
89-
padding: 0 !important;
88+
.logItem {
9089
font-size: awsui.$font-size-body-s !important;
9190
line-height: awsui.$line-height-body-s !important;
9291

92+
.toggleCollapse {
93+
position: relative;
94+
top: -3px;
95+
vertical-align: middle;
96+
cursor: pointer;
97+
98+
&.hidden {
99+
opacity: 0;
100+
pointer-events: none;
101+
}
102+
}
103+
93104
.timestamp {
94-
padding-right: 8px;
105+
vertical-align: top;
106+
padding-right: 16px;
107+
}
108+
109+
.messageCol {
110+
vertical-align: top;
111+
}
112+
113+
.message {
114+
overflow-y: hidden;
115+
&.collapsed {
116+
max-height: calc(awsui.$line-height-body-s * 2);
117+
}
95118
}
96119
}
97120
}

0 commit comments

Comments
 (0)