From e83fe78755a6ee4ca83dd46ce0523c0bbc9597c9 Mon Sep 17 00:00:00 2001 From: Thomas Nordquist Date: Sat, 12 Jan 2019 21:39:18 +0100 Subject: [PATCH] Add "diff" for historic messages --- app/src/components/Sidebar/History.tsx | 16 ++++--- app/src/components/Sidebar/MessageHistory.tsx | 33 ++++++++++++-- app/src/components/Sidebar/Sidebar.tsx | 41 +++++++++++++++-- app/src/components/Sidebar/ValueRenderer.tsx | 45 +++++-------------- 4 files changed, 86 insertions(+), 49 deletions(-) diff --git a/app/src/components/Sidebar/History.tsx b/app/src/components/Sidebar/History.tsx index 9597e8d..e96e077 100644 --- a/app/src/components/Sidebar/History.tsx +++ b/app/src/components/Sidebar/History.tsx @@ -11,7 +11,7 @@ interface HistoryItem { interface Props { items: HistoryItem[] - onClick?: (index: number) => void + onClick?: (index: number, element: EventTarget) => void classes: any } @@ -38,7 +38,7 @@ class MessageHistory extends React.Component { padding: '8px 8px 0 8px', cursor: this.props.onClick ? 'pointer' : 'inherit', }} - onClick={() => this.props.onClick && this.props.onClick(index)} + onClick={(event: React.MouseEvent) => this.props.onClick && this.props.onClick(index, event.target)} >
{element.title}
@@ -55,7 +55,9 @@ class MessageHistory extends React.Component { > {this.state.collapsed ? '▶' : '▼'} History - {this.state.collapsed ? null : elements} +
+ {this.state.collapsed ? null : elements} +
) } @@ -64,11 +66,11 @@ class MessageHistory extends React.Component { const visible = this.props.items.length > 0 && this.state.collapsed return ( {this.renderHistory()} @@ -81,7 +83,7 @@ class MessageHistory extends React.Component { } const styles = (theme: Theme) => ({ - badge: {top: '-8px', left:'64px'} -}); + badge: { top: '-8px', left:'64px' }, +}) export default withStyles(styles)(MessageHistory) diff --git a/app/src/components/Sidebar/MessageHistory.tsx b/app/src/components/Sidebar/MessageHistory.tsx index fff7a64..5a8d91b 100644 --- a/app/src/components/Sidebar/MessageHistory.tsx +++ b/app/src/components/Sidebar/MessageHistory.tsx @@ -3,16 +3,27 @@ import * as q from '../../../../backend/src/Model' import { Theme, withTheme } from '@material-ui/core/styles' +import Fade from '@material-ui/core/Fade' import History from './History' +import Paper from '@material-ui/core/Paper' +import Popper from '@material-ui/core/Popper' +import ValueRenderer from './ValueRenderer' interface Props { node?: q.TreeNode theme: Theme + onSelect: (message: q.Message) => void } -class MessageHistory extends React.Component { +interface State { + displayMessage?: q.Message, + anchorEl?: HTMLElement +} + +class MessageHistory extends React.Component { constructor(props: any) { super(props) + this.state = { } } private updateNode = () => { @@ -33,16 +44,30 @@ class MessageHistory extends React.Component { } public render() { - if (!this.props.node) { + const { node } = this.props + if (!node) { return null } - const history = this.props.node.messageHistory.toArray() + + const history = node.messageHistory.toArray() const historyElements = history.map(message => ({ title: message.received.toGMTString(), value: message.value, })) - return + return ( +
+ +
+ ) + } + + private displayMessage = (index: number, eventTarget: EventTarget) => { + const message = this.props.node && this.props.node.messageHistory.toArray()[index] + this.props.onSelect(message) } } diff --git a/app/src/components/Sidebar/Sidebar.tsx b/app/src/components/Sidebar/Sidebar.tsx index 905c542..6743419 100644 --- a/app/src/components/Sidebar/Sidebar.tsx +++ b/app/src/components/Sidebar/Sidebar.tsx @@ -1,12 +1,21 @@ import * as React from 'react' import * as q from '../../../../backend/src/Model' -import { ExpansionPanel, ExpansionPanelDetails, ExpansionPanelSummary, Typography } from '@material-ui/core' +import { + ExpansionPanel, + ExpansionPanelDetails, + ExpansionPanelSummary, + Fade, + Paper, + Popper, + Typography, +} from '@material-ui/core' import { StyleRulesCallback, Theme, withStyles } from '@material-ui/core/styles' import { AppState } from '../../reducers' import Copy from '../Copy' import ExpandMore from '@material-ui/icons/ExpandMore' +import MessageHistory from './MessageHistory' import NodeStats from './NodeStats' import Publish from './Publish/Publish' import Topic from './Topic' @@ -22,16 +31,18 @@ interface Props { interface State { node: q.TreeNode, + compareMessage?: q.Message } class Sidebar extends React.Component { + private valueRef: any = React.createRef() private updateNode = () => { this.setState(this.state) } constructor(props: any) { super(props) - console.warn('Find and fix me #state') + console.error('Find and fix me #state') this.state = { node: new q.Tree() } } @@ -55,6 +66,10 @@ class Sidebar extends React.Component { this.props.node && this.removeUpdateListener(this.props.node) nextProps.node && this.registerUpdateListener(nextProps.node) this.props.node && this.setState({ node: this.props.node }) + + if (this.props.node !== nextProps.node) { + this.setState({ compareMessage: undefined }) + } } private registerUpdateListener(node: q.TreeNode) { @@ -75,7 +90,7 @@ class Sidebar extends React.Component { ) } - private detailsStyle = { padding: '0px 16px 8px 8px' } + private detailsStyle = { padding: '0px 16px 8px 8px', display: 'block' } private renderNode() { const { classes, node } = this.props @@ -98,7 +113,17 @@ class Sidebar extends React.Component { Value {copyValue} - +
+
+ + {({ TransitionProps }) => ( + + + + + + )} +
@@ -119,6 +144,14 @@ class Sidebar extends React.Component { ) } + 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 diff --git a/app/src/components/Sidebar/ValueRenderer.tsx b/app/src/components/Sidebar/ValueRenderer.tsx index c2826de..402bb40 100644 --- a/app/src/components/Sidebar/ValueRenderer.tsx +++ b/app/src/components/Sidebar/ValueRenderer.tsx @@ -3,61 +3,37 @@ import * as q from '../../../../backend/src/Model' import { Theme, withTheme } from '@material-ui/core/styles' -import MessageHistory from './MessageHistory' import { default as ReactJson } from 'react-json-view' interface Props { - node?: q.TreeNode + message?: q.Message theme: Theme } -interface State { - node?: q.TreeNode -} - -class ValueRenderer extends React.Component { - private updateNode: () => void - constructor(props: any) { - super(props) - this.state = {} - this.updateNode = () => { - this.setState(this.state) - } - } - - public componentWillReceiveProps(nextProps: Props) { - this.props.node && this.props.node.onMessage.unsubscribe(this.updateNode) - nextProps.node && nextProps.node.onMessage.subscribe(this.updateNode) - } - +class ValueRenderer extends React.Component { public render() { - return ( -
- {this.renderValue()} - -
- ) + return
{this.renderValue()}
} public renderValue() { - const node = this.props.node - if (!node || !node.message) { + const { message } = this.props + if (!message) { return null } let json try { - json = JSON.parse(node.message.value) + json = JSON.parse(message.value) } catch (error) { - return this.renderRawValue(node.message.value) + return this.renderRawValue(message.value) } if (typeof json === 'string') { - return this.renderRawValue(node.message.value) + return this.renderRawValue(message.value) } else if (typeof json === 'number') { - return this.renderRawValue(node.message.value) + return this.renderRawValue(message.value) } else if (typeof json === 'boolean') { - return this.renderRawValue(node.message.value) + return this.renderRawValue(message.value) } else { const theme = (this.props.theme.palette.type === 'dark') ? 'monokai' : 'bright:inverted' return ( @@ -79,6 +55,7 @@ class ValueRenderer extends React.Component { display: 'block', lineHeight: '1.2em', padding: '12px 5px 12px 5px', + color: this.props.theme.palette.text.primary } return
{value}