Skip to content

Commit 1a9ff50

Browse files
feat(panel): Resizable side panel
Resolves: flyteorg/flyte#5102 Signed-off-by: Chi-Sheng Liu <[email protected]>
1 parent eb7fe2b commit 1a9ff50

File tree

3 files changed

+69
-4
lines changed

3 files changed

+69
-4
lines changed

packages/oss-console/src/components/common/DetailsPanel.tsx

+17-3
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,25 @@ import Paper from '@mui/material/Paper';
44
import { useTheme } from '@mui/material/styles';
55
import styled from '@mui/system/styled';
66
import { detailsPanelId } from '@clients/common/constants';
7-
import { detailsPanelWidth } from './constants';
7+
import classnames from 'classnames';
8+
import useResize from '@clients/oss-console/components/hooks/useResize';
9+
import { defaultDetailsPanelWidth } from './constants';
810

911
const StyledPaper = styled(Paper)(({ theme }) => ({
1012
display: 'flex',
1113
flex: '1 1 100%',
1214
maxHeight: '100%',
1315
paddingBottom: theme.spacing(2),
1416
pointerEvents: 'initial',
15-
width: detailsPanelWidth,
17+
'& .dragger': {
18+
width: '3px',
19+
cursor: 'ew-resize',
20+
position: 'absolute',
21+
top: 0,
22+
left: 0,
23+
bottom: 0,
24+
zIndex: 100,
25+
},
1626
}));
1727

1828
interface DetailsPanelProps {
@@ -29,6 +39,9 @@ export const DetailsPanel: React.FC<PropsWithChildren<DetailsPanelProps>> = ({
2939
open = false,
3040
}) => {
3141
const theme = useTheme();
42+
43+
const { width, enableResize } = useResize({ minWidth: defaultDetailsPanelWidth });
44+
3245
return (
3346
<Drawer
3447
anchor="right"
@@ -50,7 +63,8 @@ export const DetailsPanel: React.FC<PropsWithChildren<DetailsPanelProps>> = ({
5063
open={open}
5164
key="detailsPanel"
5265
>
53-
<StyledPaper id={detailsPanelId} square>
66+
<StyledPaper id={detailsPanelId} square sx={{ width }}>
67+
<div onMouseDown={enableResize} className={classnames('dragger')} />
5468
{children}
5569
</StyledPaper>
5670
</Drawer>

packages/oss-console/src/components/common/constants.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { env } from '@clients/common/environment';
22
import { InterpreterOptions } from 'xstate';
33

4-
export const detailsPanelWidth = 432;
4+
export const defaultDetailsPanelWidth = 432;
55

66
export const labels = {
77
moreOptionsButton: 'Display more options',
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
// Reference: https://stackoverflow.com/a/68742668
2+
3+
import { useCallback, useEffect, useState } from 'react';
4+
5+
type UseResizeProps = {
6+
minWidth: number;
7+
};
8+
9+
type UseResizeReturn = {
10+
width: number;
11+
enableResize: () => void;
12+
};
13+
14+
const useResize = ({ minWidth }: UseResizeProps): UseResizeReturn => {
15+
const [isResizing, setIsResizing] = useState(false);
16+
const [width, setWidth] = useState(minWidth);
17+
18+
const enableResize = useCallback(() => {
19+
setIsResizing(true);
20+
}, [setIsResizing]);
21+
22+
const disableResize = useCallback(() => {
23+
setIsResizing(false);
24+
}, [setIsResizing]);
25+
26+
const resize = useCallback(
27+
(e: MouseEvent) => {
28+
if (isResizing) {
29+
const newWidth = document.body.offsetWidth - e.clientX; // You may want to add some offset here from props
30+
if (newWidth >= minWidth) {
31+
setWidth(newWidth);
32+
}
33+
}
34+
},
35+
[minWidth, isResizing, setWidth],
36+
);
37+
38+
useEffect(() => {
39+
document.addEventListener('mousemove', resize);
40+
document.addEventListener('mouseup', disableResize);
41+
42+
return () => {
43+
document.removeEventListener('mousemove', resize);
44+
document.removeEventListener('mouseup', disableResize);
45+
};
46+
}, [disableResize, resize]);
47+
48+
return { width, enableResize };
49+
};
50+
51+
export default useResize;

0 commit comments

Comments
 (0)