From 0c124d8d195a7213189155f279b9cd08d52ccf0f Mon Sep 17 00:00:00 2001 From: Thomas Nordquist Date: Tue, 2 Apr 2019 19:30:21 +0200 Subject: [PATCH] Extract value renderer panel --- app/src/components/Sidebar/Sidebar.tsx | 104 +--------- .../{ => ValueRenderer}/MessageHistory.tsx | 8 +- .../Sidebar/ValueRenderer/Panel.tsx | 178 ++++++++++++++++++ .../{ => ValueRenderer}/PlotHistory.tsx | 4 +- .../{ => ValueRenderer}/ValueRenderer.tsx | 8 +- 5 files changed, 190 insertions(+), 112 deletions(-) rename app/src/components/Sidebar/{ => ValueRenderer}/MessageHistory.tsx (92%) create mode 100644 app/src/components/Sidebar/ValueRenderer/Panel.tsx rename app/src/components/Sidebar/{ => ValueRenderer}/PlotHistory.tsx (94%) rename app/src/components/Sidebar/{ => ValueRenderer}/ValueRenderer.tsx (93%) diff --git a/app/src/components/Sidebar/Sidebar.tsx b/app/src/components/Sidebar/Sidebar.tsx index c2b3ac5..ebee73e 100644 --- a/app/src/components/Sidebar/Sidebar.tsx +++ b/app/src/components/Sidebar/Sidebar.tsx @@ -1,28 +1,20 @@ import * as q from '../../../../backend/src/Model' import * as React from 'react' -import Clear from '@material-ui/icons/Clear' -import Code from '@material-ui/icons/Code' import Copy from '../Copy' import CustomIconButton from '../CustomIconButton' -import DateFormatter from '../helper/DateFormatter' import Delete from '@material-ui/icons/Delete' import ExpandMore from '@material-ui/icons/ExpandMore' -import MessageHistory from './MessageHistory' import NodeStats from './NodeStats' -import Reorder from '@material-ui/icons/Reorder' -import ToggleButton from '@material-ui/lab/ToggleButton' -import ToggleButtonGroup from '@material-ui/lab/ToggleButtonGroup' import Topic from './Topic' +import ValueRendererPanel from './ValueRenderer/Panel' import { AppState } from '../../reducers' import { bindActionCreators } from 'redux' import { connect } from 'react-redux' import { settingsActions, sidebarActons } from '../../actions' import { StyleRulesCallback, Theme, withStyles } from '@material-ui/core/styles' import { TopicViewModel } from '../../TopicViewModel' -import { ValueRendererDisplayMode } from '../../reducers/Settings' import { - Button, ExpansionPanel, ExpansionPanelDetails, ExpansionPanelSummary, @@ -34,13 +26,11 @@ import { const throttle = require('lodash.throttle') const Publish = React.lazy(() => import('./Publish/Publish')) -const ValueRenderer = React.lazy(() => import('./ValueRenderer')) interface Props { node?: q.TreeNode actions: typeof sidebarActons settingsActions: typeof settingsActions - valueRendererDisplayMode: ValueRendererDisplayMode classes: any connectionId?: string } @@ -52,7 +42,6 @@ interface State { } class Sidebar extends React.Component { - private valueRef: any = React.createRef() private updateNode = throttle(() => { this.setState(this.state) }, 300) @@ -141,34 +130,12 @@ class Sidebar extends React.Component { this.props.actions.clearTopic(topic, recursive, maxCount) } - private renderActionButtons() { - const handleValue = (_e: React.MouseEvent, value: any) => { - this.props.settingsActions.setValueDisplayMode(value) - } - - return ( - - - - - - - - - - - - - ) - } - private renderNode() { const { classes, node } = this.props const copyTopic = node ? : null const deleteTopic = this.renderTopicDeleteButton() const deleteRecursiveTopic = this.renderRecursiveTopicDeleteButton() - const copyValue = node && node.message ? : null const summaryStyle = { minHeight: '0' } return (
@@ -180,20 +147,7 @@ class Sidebar extends React.Component { - - } style={summaryStyle}> - Value {copyValue} - - - {this.messageMetaInfo()} -
- Loading...
}> - {this.renderValue()} - -
-
- - + {} } style={summaryStyle}> Publish @@ -214,59 +168,6 @@ class Sidebar extends React.Component { ) } - private renderValue() { - const node = this.props.node - if (!node || !node.message) { - return null - } - - return ( - - ) - } - - private messageMetaInfo() { - if (!this.props.node || !this.props.node.message || !this.props.node.mqttMessage) { - return null - } - - const retainedButton = ( - - - - ) - - return ( -
-
QoS: {this.props.node.mqttMessage.qos}
- {this.renderActionButtons()} -
- {this.props.node.mqttMessage.retain ? retainedButton : null} -
-
-
- ) - } - - private handleMessageHistorySelect = (message: q.Message) => { - if (message !== this.state.compareMessage) { - this.setState({ compareMessage: message }) - } else { - this.setState({ compareMessage: undefined }) - } - } - private renderNodeStats() { if (!this.props.node) { return null @@ -283,7 +184,6 @@ class Sidebar extends React.Component { const mapStateToProps = (state: AppState) => { return { node: state.tree.selectedTopic, - valueRendererDisplayMode: state.settings.valueRendererDisplayMode, } } diff --git a/app/src/components/Sidebar/MessageHistory.tsx b/app/src/components/Sidebar/ValueRenderer/MessageHistory.tsx similarity index 92% rename from app/src/components/Sidebar/MessageHistory.tsx rename to app/src/components/Sidebar/ValueRenderer/MessageHistory.tsx index f0bf8e5..9da6fd4 100644 --- a/app/src/components/Sidebar/MessageHistory.tsx +++ b/app/src/components/Sidebar/ValueRenderer/MessageHistory.tsx @@ -1,9 +1,9 @@ -import * as q from '../../../../backend/src/Model' +import * as q from '../../../../../backend/src/Model' import * as React from 'react' import BarChart from '@material-ui/icons/BarChart' -import DateFormatter from '../helper/DateFormatter' -import History from './History' -import { TopicViewModel } from '../../TopicViewModel' +import DateFormatter from '../../helper/DateFormatter' +import History from '../History' +import { TopicViewModel } from '../../../TopicViewModel' const PlotHistory = React.lazy(() => import('./PlotHistory')) diff --git a/app/src/components/Sidebar/ValueRenderer/Panel.tsx b/app/src/components/Sidebar/ValueRenderer/Panel.tsx new file mode 100644 index 0000000..b0ecab1 --- /dev/null +++ b/app/src/components/Sidebar/ValueRenderer/Panel.tsx @@ -0,0 +1,178 @@ +import * as q from '../../../../../backend/src/Model' +import * as React from 'react' +import Clear from '@material-ui/icons/Clear' +import Code from '@material-ui/icons/Code' +import Copy from '../../Copy' +import DateFormatter from '../../helper/DateFormatter' +import ExpandMore from '@material-ui/icons/ExpandMore' +import MessageHistory from './MessageHistory' +import Reorder from '@material-ui/icons/Reorder' +import ToggleButton from '@material-ui/lab/ToggleButton' +import ToggleButtonGroup from '@material-ui/lab/ToggleButtonGroup' +import ValueRenderer from './ValueRenderer' +import { AppState } from '../../../reducers' +import { bindActionCreators } from 'redux' +import { connect } from 'react-redux' +import { settingsActions, sidebarActons } from '../../../actions' +import { ValueRendererDisplayMode } from '../../../reducers/Settings' + +import { + Button, + ExpansionPanel, + ExpansionPanelDetails, + ExpansionPanelSummary, + Tooltip, + Typography, + StyleRulesCallback, + withStyles, + Theme, + } from '@material-ui/core' + +interface Props { + node?: q.TreeNode + valueRendererDisplayMode: ValueRendererDisplayMode + sidebarActions: typeof sidebarActons + settingsActions: typeof settingsActions + classes: any +} + +interface State { + compareMessage?: q.Message +} + +class Panel extends React.Component { + constructor(props: Props) { + super(props) + this.state = { } + } + + public render() { + const { node, classes } = this.props + const { detailsStyle, summaryStyle } = this.panelStyle() + + const copyValue = node && node.message ? : null + + return ( + + } style={summaryStyle}> + Value {copyValue} + + + {this.messageMetaInfo()} +
+ Loading...
}> + {this.renderValue()} + + +
+
+
+ ) + } + + private renderValue() { + const node = this.props.node + if (!node || !node.message) { + return null + } + + return ( + + ) + } + + private messageMetaInfo() { + if (!this.props.node || !this.props.node.message || !this.props.node.mqttMessage) { + return null + } + + const retainedButton = ( + + + + ) + + return ( +
+
QoS: {this.props.node.mqttMessage.qos}
+ {this.renderActionButtons()} +
+ {this.props.node.mqttMessage.retain ? retainedButton : null} +
+
+
+ ) + } + + private renderActionButtons() { + const handleValue = (_e: React.MouseEvent, value: any) => { + this.props.settingsActions.setValueDisplayMode(value) + } + + return ( + + + + + + + + + + + + + ) + } + + private panelStyle() { + return { + detailsStyle: { padding: '0px 16px 8px 8px', display: 'block' }, + summaryStyle: { minHeight: '0' }, + } + } + + private handleMessageHistorySelect = (message: q.Message) => { + if (message !== this.state.compareMessage) { + this.setState({ compareMessage: message }) + } else { + this.setState({ compareMessage: undefined }) + } + } +} + +const mapDispatchToProps = (dispatch: any) => { + return { + sidebarActions: bindActionCreators(sidebarActons, dispatch), + settingsActions: bindActionCreators(settingsActions, dispatch), + } +} + +const mapStateToProps = (state: AppState) => { + return { + valueRendererDisplayMode: state.settings.valueRendererDisplayMode, + node: state.tree.selectedTopic, + } +} + +const styles: StyleRulesCallback = (theme: Theme) => { + return { + heading: { + fontSize: theme.typography.pxToRem(15), + fontWeight: theme.typography.fontWeightRegular, + }, + } +} + +export default withStyles(styles)(connect(mapStateToProps, mapDispatchToProps)(Panel)) diff --git a/app/src/components/Sidebar/PlotHistory.tsx b/app/src/components/Sidebar/ValueRenderer/PlotHistory.tsx similarity index 94% rename from app/src/components/Sidebar/PlotHistory.tsx rename to app/src/components/Sidebar/ValueRenderer/PlotHistory.tsx index 778bb21..6a9b846 100644 --- a/app/src/components/Sidebar/PlotHistory.tsx +++ b/app/src/components/Sidebar/ValueRenderer/PlotHistory.tsx @@ -1,6 +1,6 @@ -import * as q from '../../../../backend/src/Model' +import * as q from '../../../../../backend/src/Model' import * as React from 'react' -import DateFormatter from '../helper/DateFormatter' +import DateFormatter from '../../helper/DateFormatter' import { default as ReactResizeDetector } from 'react-resize-detector' import 'react-vis/dist/style.css' const { XYPlot, LineMarkSeries, Hint, YAxis, HorizontalGridLines } = require('react-vis') diff --git a/app/src/components/Sidebar/ValueRenderer.tsx b/app/src/components/Sidebar/ValueRenderer/ValueRenderer.tsx similarity index 93% rename from app/src/components/Sidebar/ValueRenderer.tsx rename to app/src/components/Sidebar/ValueRenderer/ValueRenderer.tsx index 0d3714b..7b8c177 100644 --- a/app/src/components/Sidebar/ValueRenderer.tsx +++ b/app/src/components/Sidebar/ValueRenderer/ValueRenderer.tsx @@ -1,10 +1,10 @@ -import * as q from '../../../../backend/src/Model' +import * as q from '../../../../../backend/src/Model' import * as React from 'react' -import CodeDiff from '../CodeDiff' -import { AppState } from '../../reducers' +import CodeDiff from '../../CodeDiff' +import { AppState } from '../../../reducers' import { connect } from 'react-redux' import { default as ReactResizeDetector } from 'react-resize-detector' -import { ValueRendererDisplayMode } from '../../reducers/Settings' +import { ValueRendererDisplayMode } from '../../../reducers/Settings' interface Props { message: q.Message