Add responsive width for canvas

This commit is contained in:
Piotr Rogowski 2021-03-29 22:47:58 +02:00
parent f22c0f5baa
commit 7443faf883
No known key found for this signature in database
GPG Key ID: F40F61D5587F5673
3 changed files with 59 additions and 18 deletions

View File

@ -115,4 +115,6 @@ html, body {
&:active { &:active {
cursor: move; cursor: move;
} }
border: 1px solid @border-color-split;
} }

View File

@ -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);

View File

@ -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}