From af4cfec4519b8d42ce3ee07e3d5aebed51f77d72 Mon Sep 17 00:00:00 2001 From: Thomas Nordquist Date: Wed, 17 Jul 2019 17:25:12 +0200 Subject: [PATCH] Auto-open publish history drawer --- app/src/components/Sidebar/HistoryDrawer.tsx | 77 ++++++++++--------- .../components/Sidebar/Publish/Publish.tsx | 2 +- .../Sidebar/Publish/PublishHistory.tsx | 2 +- .../Sidebar/ValueRenderer/ValueRenderer.tsx | 15 ++-- 4 files changed, 46 insertions(+), 50 deletions(-) diff --git a/app/src/components/Sidebar/HistoryDrawer.tsx b/app/src/components/Sidebar/HistoryDrawer.tsx index e036c02..0df619e 100644 --- a/app/src/components/Sidebar/HistoryDrawer.tsx +++ b/app/src/components/Sidebar/HistoryDrawer.tsx @@ -1,4 +1,4 @@ -import * as React from 'react' +import React, { useCallback, useState, useEffect, memo } from 'react' import { Badge, Typography } from '@material-ui/core' import { selectTextWithCtrlA } from '../../utils/handleTextSelectWithCtrlA' import { Theme, withStyles, emphasize } from '@material-ui/core/styles' @@ -15,51 +15,49 @@ interface Props { onClick?: (index: number, element: EventTarget) => void classes: any contentTypeIndicator?: JSX.Element + autoOpen?: boolean theme: Theme + children: any } -interface State { - collapsed: boolean -} +function HistoryDrawer(props: Props) { + const handleCtrlA = selectTextWithCtrlA({ targetSelector: 'pre' }) + const [expanded, setExpanded] = useState(undefined) -class HistoryDrawer extends React.Component { - private handleCtrlA = selectTextWithCtrlA({ targetSelector: 'pre' }) + const toggle = useCallback(() => { + setExpanded(!expanded) + }, [expanded]) - constructor(props: any) { - super(props) - this.state = { - collapsed: true, + useEffect(() => { + if (props.autoOpen && expanded === undefined && props.items.length > 0) { + setExpanded(true) } - } + }, [props.autoOpen, expanded, props.items]) - private toggle = () => { - this.setState({ collapsed: !this.state.collapsed }) - } - - private createSelectionHandler = (index: number) => (event: React.MouseEvent) => { - this.props.onClick && this.props.onClick(index, event.target) + const createSelectionHandler = (index: number) => (event: React.MouseEvent) => { + props.onClick && props.onClick(index, event.target) event.preventDefault() event.stopPropagation() } - public renderHistory() { + function renderHistory() { const style = (element: HistoryItem) => ({ backgroundColor: element.selected - ? emphasize(this.props.theme.palette.background.default, 0.2) - : emphasize(this.props.theme.palette.background.default, 0.07), + ? emphasize(props.theme.palette.background.default, 0.2) + : emphasize(props.theme.palette.background.default, 0.07), margin: '8px', padding: '8px 8px 0 8px', - cursor: this.props.onClick ? 'pointer' : 'inherit', + cursor: props.onClick ? 'pointer' : 'inherit', }) const messageStyle: React.CSSProperties = { textOverflow: 'ellipsis', whiteSpace: 'nowrap', overflow: 'hidden' } - const elements = this.props.items.map((element, index) => ( + const elements = props.items.map((element, index) => (
{element.title} @@ -72,36 +70,39 @@ class HistoryDrawer extends React.Component {
)) - const visible = this.props.items.length > 0 && this.state.collapsed + const visible = props.items.length > 0 && !expanded return ( -
-
- +
+
+ - {this.state.collapsed ? '▶ History' : '▼ History'} + {expanded ? '▼ History' : '▶ History'} - {this.props.contentTypeIndicator} + {props.contentTypeIndicator}
- {this.state.collapsed ? null : this.props.children} - {this.state.collapsed ? null : elements} + {expanded ? props.children : null} + {expanded ? elements : null}
) } - public render() { - return
{this.renderHistory()}
- } + return
{renderHistory()}
} const styles = (theme: Theme) => ({ @@ -112,4 +113,4 @@ const styles = (theme: Theme) => ({ badge: { right: '-25px' }, }) -export default withStyles(styles, { withTheme: true })(HistoryDrawer) +export default withStyles(styles, { withTheme: true })(memo(HistoryDrawer)) diff --git a/app/src/components/Sidebar/Publish/Publish.tsx b/app/src/components/Sidebar/Publish/Publish.tsx index 09be797..2ee9c4d 100644 --- a/app/src/components/Sidebar/Publish/Publish.tsx +++ b/app/src/components/Sidebar/Publish/Publish.tsx @@ -70,7 +70,7 @@ function Publish(props: Props) { return useMemo( () => ( -
+
; actions: typeof publis value: message.payload || '', })) - return + return }, [props.history]) } diff --git a/app/src/components/Sidebar/ValueRenderer/ValueRenderer.tsx b/app/src/components/Sidebar/ValueRenderer/ValueRenderer.tsx index 953ae1d..84aa274 100644 --- a/app/src/components/Sidebar/ValueRenderer/ValueRenderer.tsx +++ b/app/src/components/Sidebar/ValueRenderer/ValueRenderer.tsx @@ -6,7 +6,7 @@ import { Base64Message } from '../../../../../backend/src/Model/Base64Message' import { connect } from 'react-redux' import { default as ReactResizeDetector } from 'react-resize-detector' import { ValueRendererDisplayMode } from '../../../reducers/Settings' -import { Typography } from '@material-ui/core' +import { Typography, Fade, Grow } from '@material-ui/core' interface Props { message: q.Message @@ -67,19 +67,14 @@ class ValueRenderer extends React.Component { return } const value = this.convertMessage(message.value) - if (!compare) { - return this.renderDiff(value, value) - } - - if (!compare.value) { - return - } - const compareStr = this.convertMessage(compare.value) + const compareStr = compare && compare.value ? this.convertMessage(compare.value) : undefined return (
{this.renderDiff(value, value)} - {this.renderDiff(compareStr, compareStr, 'selected')} + +
{Boolean(compareStr) ? this.renderDiff(compareStr, compareStr, 'selected') : null}
+
) }