Add responsive width for canvas
This commit is contained in:
parent
f22c0f5baa
commit
7443faf883
|
@ -115,4 +115,6 @@ html, body {
|
||||||
&:active {
|
&:active {
|
||||||
cursor: move;
|
cursor: move;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
border: 1px solid @border-color-split;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
import {
|
import {
|
||||||
|
useCallback,
|
||||||
useEffect,
|
useEffect,
|
||||||
|
useRef,
|
||||||
useState,
|
useState,
|
||||||
} from 'react';
|
} from 'react';
|
||||||
import {
|
import {
|
||||||
|
@ -16,25 +18,42 @@ import {
|
||||||
DashboardOutlined,
|
DashboardOutlined,
|
||||||
} from '@ant-design/icons';
|
} from '@ant-design/icons';
|
||||||
import { CheckboxValueType } from 'antd/lib/checkbox/Group';
|
import { CheckboxValueType } from 'antd/lib/checkbox/Group';
|
||||||
|
import { connect } from 'react-redux';
|
||||||
import { Parser } from 'mlg-converter';
|
import { Parser } from 'mlg-converter';
|
||||||
import { Field, Result as ParserResult } from 'mlg-converter/dist/types';
|
import { Field, Result as ParserResult } from 'mlg-converter/dist/types';
|
||||||
import PerfectScrollbar from 'react-perfect-scrollbar';
|
import PerfectScrollbar from 'react-perfect-scrollbar';
|
||||||
import { loadLogs } from '../utils/api';
|
import { loadLogs } from '../utils/api';
|
||||||
import Canvas, { LogEntry } from './Log/Canvas';
|
import Canvas, { LogEntry } from './Log/Canvas';
|
||||||
|
import { AppState, UIState } from '../types/state';
|
||||||
|
import { Config } from '../types/config';
|
||||||
|
import store from '../store';
|
||||||
|
|
||||||
// const { SubMenu } = Menu;
|
// const { SubMenu } = Menu;
|
||||||
const { TabPane } = Tabs;
|
const { TabPane } = Tabs;
|
||||||
const { Content } = Layout;
|
const { Content } = Layout;
|
||||||
|
|
||||||
const Log = () => {
|
const mapStateToProps = (state: AppState) => ({
|
||||||
|
ui: state.ui,
|
||||||
|
status: state.status,
|
||||||
|
config: state.config,
|
||||||
|
});
|
||||||
|
|
||||||
|
const Log = ({ ui, config }: { ui: UIState, config: Config }) => {
|
||||||
const { Sider } = Layout;
|
const { Sider } = Layout;
|
||||||
|
const contentRef = useRef<HTMLDivElement | null>(null);
|
||||||
|
const margin = 30;
|
||||||
|
const [canvasWidth, setCanvasWidth] = useState(0);
|
||||||
const sidebarWidth = 250;
|
const sidebarWidth = 250;
|
||||||
|
const calculateCanvasWidth = useCallback(() => setCanvasWidth((contentRef.current?.clientWidth || 0) - margin), []);
|
||||||
const siderProps = {
|
const siderProps = {
|
||||||
width: sidebarWidth,
|
width: sidebarWidth,
|
||||||
collapsible: true,
|
collapsible: true,
|
||||||
breakpoint: 'xl',
|
breakpoint: 'xl',
|
||||||
// collapsed: ui.sidebarCollapsed,
|
collapsed: ui.sidebarCollapsed,
|
||||||
// onCollapse: (collapsed: boolean) => store.dispatch({ type: 'ui/sidebarCollapsed', payload: collapsed }),
|
onCollapse: (collapsed: boolean) => {
|
||||||
|
store.dispatch({ type: 'ui/sidebarCollapsed', payload: collapsed });
|
||||||
|
setTimeout(calculateCanvasWidth, 1);
|
||||||
|
},
|
||||||
} as any;
|
} as any;
|
||||||
const [isLoading, setIsLoading] = useState(true);
|
const [isLoading, setIsLoading] = useState(true);
|
||||||
const [logs, setLogs] = useState<ParserResult>();
|
const [logs, setLogs] = useState<ParserResult>();
|
||||||
|
@ -58,7 +77,12 @@ const Log = () => {
|
||||||
|
|
||||||
console.log(parsed);
|
console.log(parsed);
|
||||||
});
|
});
|
||||||
}, []);
|
|
||||||
|
window.addEventListener('resize', calculateCanvasWidth);
|
||||||
|
calculateCanvasWidth();
|
||||||
|
|
||||||
|
return () => window.removeEventListener('resize', calculateCanvasWidth);
|
||||||
|
}, [calculateCanvasWidth]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
|
@ -66,7 +90,8 @@ const Log = () => {
|
||||||
{isLoading ?
|
{isLoading ?
|
||||||
<Skeleton />
|
<Skeleton />
|
||||||
:
|
:
|
||||||
<Tabs defaultActiveKey="fields" style={{ marginLeft: 20 }}>
|
!ui.sidebarCollapsed &&
|
||||||
|
<Tabs defaultActiveKey="fields" style={{ marginLeft: 20 }}>
|
||||||
<TabPane tab={<EditOutlined />} key="fields">
|
<TabPane tab={<EditOutlined />} key="fields">
|
||||||
<PerfectScrollbar options={{ suppressScrollX: true }}>
|
<PerfectScrollbar options={{ suppressScrollX: true }}>
|
||||||
<Checkbox.Group onChange={setSelectedFields} value={selectedFields}>
|
<Checkbox.Group onChange={setSelectedFields} value={selectedFields}>
|
||||||
|
@ -81,25 +106,31 @@ const Log = () => {
|
||||||
<TabPane tab={<FileTextOutlined />} key="files">
|
<TabPane tab={<FileTextOutlined />} key="files">
|
||||||
<PerfectScrollbar options={{ suppressScrollX: true }}>
|
<PerfectScrollbar options={{ suppressScrollX: true }}>
|
||||||
Files
|
Files
|
||||||
</PerfectScrollbar>
|
</PerfectScrollbar>
|
||||||
</TabPane>
|
</TabPane>
|
||||||
<TabPane tab={<DashboardOutlined />} key="gauges">
|
<TabPane tab={<DashboardOutlined />} key="gauges">
|
||||||
Gauges
|
Gauges
|
||||||
</TabPane>
|
</TabPane>
|
||||||
</Tabs>
|
</Tabs>
|
||||||
}
|
}
|
||||||
</Sider>
|
</Sider>
|
||||||
<Layout style={{ width: '100%', textAlign: 'center', marginTop: 50 }}>
|
<Layout style={{ width: '100%', textAlign: 'center', marginTop: 50 }}>
|
||||||
<Content>
|
<Content>
|
||||||
{isLoading ?
|
<div ref={contentRef} style={{ width: '100%', marginRight: margin }}>
|
||||||
<Spin size="large" />
|
{isLoading ?
|
||||||
:
|
<Spin size="large" />
|
||||||
<Canvas data={logs!.records as LogEntry[]} />
|
:
|
||||||
}
|
<Canvas
|
||||||
|
data={logs!.records as LogEntry[]}
|
||||||
|
width={canvasWidth}
|
||||||
|
height={600}
|
||||||
|
/>
|
||||||
|
}
|
||||||
|
</div>
|
||||||
</Content>
|
</Content>
|
||||||
</Layout>
|
</Layout>
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
export default Log;
|
export default connect(mapStateToProps)(Log);
|
||||||
|
|
|
@ -24,7 +24,15 @@ enum Colors {
|
||||||
WHITE = '#fff',
|
WHITE = '#fff',
|
||||||
}
|
}
|
||||||
|
|
||||||
const Canvas = ({ data }: { data: LogEntry[] }) => {
|
const Canvas = ({
|
||||||
|
data,
|
||||||
|
width,
|
||||||
|
height,
|
||||||
|
}: {
|
||||||
|
data: LogEntry[],
|
||||||
|
width: number,
|
||||||
|
height: number,
|
||||||
|
}) => {
|
||||||
const [zoom, setZoom] = useState(1);
|
const [zoom, setZoom] = useState(1);
|
||||||
const [pan, setPan] = useState(0);
|
const [pan, setPan] = useState(0);
|
||||||
const [isMouseDown, setIsMouseDown] = useState(false);
|
const [isMouseDown, setIsMouseDown] = useState(false);
|
||||||
|
@ -32,7 +40,7 @@ const Canvas = ({ data }: { data: LogEntry[] }) => {
|
||||||
const [previousTouch, setPreviousTouch] = useState<Touch | null>(null);
|
const [previousTouch, setPreviousTouch] = useState<Touch | null>(null);
|
||||||
const leftBoundary = 0;
|
const leftBoundary = 0;
|
||||||
const [rightBoundary, setRightBoundary] = useState(0);
|
const [rightBoundary, setRightBoundary] = useState(0);
|
||||||
const canvasRef = useRef<HTMLCanvasElement>();
|
const canvasRef = useRef<HTMLCanvasElement | null>(null);
|
||||||
const checkPan = (current: number, value: number) => {
|
const checkPan = (current: number, value: number) => {
|
||||||
if (current > leftBoundary) {
|
if (current > leftBoundary) {
|
||||||
return leftBoundary;
|
return leftBoundary;
|
||||||
|
@ -139,14 +147,14 @@ const Canvas = ({ data }: { data: LogEntry[] }) => {
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
plot();
|
plot();
|
||||||
}, [plot]);
|
}, [plot, width, height]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<canvas
|
<canvas
|
||||||
ref={canvasRef as any}
|
ref={canvasRef as any}
|
||||||
className="plot"
|
className="plot"
|
||||||
width="1200px"
|
width={width}
|
||||||
height="600px"
|
height={height}
|
||||||
onWheel={onWheel}
|
onWheel={onWheel}
|
||||||
onMouseMove={onMouseMove}
|
onMouseMove={onMouseMove}
|
||||||
onTouchMove={onTouchMove}
|
onTouchMove={onTouchMove}
|
||||||
|
|
Loading…
Reference in New Issue