Improve payload truncation in tree

This commit is contained in:
Thomas Nordquist
2019-07-13 12:40:47 +02:00
parent ff148a8e3c
commit 0b6a1e42d6
4 changed files with 34 additions and 20 deletions

View File

@@ -53,7 +53,6 @@ function TreeNodeSubnodes(props: Props) {
<TreeNode <TreeNode
key={`${node.hash()}-${props.filter}`} key={`${node.hash()}-${props.filter}`}
treeNode={node} treeNode={node}
className={props.classes.listItem}
lastUpdate={node.lastUpdate} lastUpdate={node.lastUpdate}
selectTopicAction={props.selectTopicAction} selectTopicAction={props.selectTopicAction}
settings={props.settings} settings={props.settings}

View File

@@ -1,11 +1,12 @@
import * as React from 'react'
import * as q from '../../../../../backend/src/Model' import * as q from '../../../../../backend/src/Model'
import { withStyles, Theme } from '@material-ui/core' import React from 'react'
import { TopicViewModel } from '../../../model/TopicViewModel'
import { Base64Message } from '../../../../../backend/src/Model/Base64Message' import { Base64Message } from '../../../../../backend/src/Model/Base64Message'
import { Theme, withStyles } from '@material-ui/core'
import { TopicViewModel } from '../../../model/TopicViewModel'
export interface TreeNodeProps extends React.HTMLAttributes<HTMLElement> { export interface TreeNodeProps extends React.HTMLAttributes<HTMLElement> {
treeNode: q.TreeNode<TopicViewModel> treeNode: q.TreeNode<TopicViewModel>
lastUpdate: number
name?: string | undefined name?: string | undefined
collapsed?: boolean | undefined collapsed?: boolean | undefined
didSelectNode: any didSelectNode: any
@@ -13,7 +14,7 @@ export interface TreeNodeProps extends React.HTMLAttributes<HTMLElement> {
classes: any classes: any
} }
class TreeNodeTitle extends React.Component<TreeNodeProps, {}> { class TreeNodeTitle extends React.PureComponent<TreeNodeProps, {}> {
private renderSourceEdge() { private renderSourceEdge() {
const name = this.props.name || (this.props.treeNode.sourceEdge && this.props.treeNode.sourceEdge.name) const name = this.props.name || (this.props.treeNode.sourceEdge && this.props.treeNode.sourceEdge.name)
@@ -24,13 +25,23 @@ class TreeNodeTitle extends React.Component<TreeNodeProps, {}> {
) )
} }
private truncatedMessage() {
const limit = 350
if (!this.props.treeNode.message || !this.props.treeNode.message.value) {
return ''
}
const str = Base64Message.toUnicodeString(this.props.treeNode.message.value)
return str.length > limit ? `${str.slice(0, limit)}` : str
}
private renderValue() { private renderValue() {
return this.props.treeNode.message && return this.props.treeNode.message &&
this.props.treeNode.message.value && this.props.treeNode.message.value &&
this.props.treeNode.message.length > 0 ? ( this.props.treeNode.message.length > 0 ? (
<span key="value" className={this.props.classes.value}> <span key="value" className={this.props.classes.value}>
{' '} {' '}
= {Base64Message.toUnicodeString(this.props.treeNode.message.value).slice(0, 120)} = {this.truncatedMessage()}
</span> </span>
) : null ) : null
} }

View File

@@ -19,7 +19,6 @@ export interface Props {
name?: string | undefined name?: string | undefined
collapsed?: boolean | undefined collapsed?: boolean | undefined
classes: any classes: any
className?: string
lastUpdate: number lastUpdate: number
actions: typeof treeActions actions: typeof treeActions
selectTopicAction: (treeNode: q.TreeNode<any>) => void selectTopicAction: (treeNode: q.TreeNode<any>) => void
@@ -28,7 +27,7 @@ export interface Props {
} }
function TreeNodeComponent(props: Props) { function TreeNodeComponent(props: Props) {
const { actions, classes, className, settings, theme, treeNode, lastUpdate, name } = props const { actions, classes, settings, theme, treeNode, lastUpdate, name } = props
const [collapsedOverride, setCollapsedOverride] = useState<boolean | undefined>(undefined) const [collapsedOverride, setCollapsedOverride] = useState<boolean | undefined>(undefined)
const [selected, selectionLastUpdate, setSelected] = useSelectionState(false) const [selected, selectionLastUpdate, setSelected] = useSelectionState(false)
const nodeRef = useRef<HTMLDivElement>() const nodeRef = useRef<HTMLDivElement>()
@@ -112,25 +111,26 @@ function TreeNodeComponent(props: Props) {
const highlightClass = selected ? classes.selected : '' const highlightClass = selected ? classes.selected : ''
return ( return (
<div> <div className={classes.node}>
<div <span
ref={nodeRef as any}
key={treeNode.hash()} key={treeNode.hash()}
className={`${classes.node} ${className} ${highlightClass} ${classes.title}`} className={`${classes.title} ${highlightClass}`}
onMouseEnter={mouseOver} onMouseEnter={mouseOver}
onFocus={didObtainFocus} onFocus={didObtainFocus}
onClick={didClickTitle} onClick={didClickTitle}
ref={nodeRef as any}
tabIndex={-1} tabIndex={-1}
onKeyDown={deleteTopicCallback} onKeyDown={deleteTopicCallback}
> >
<TreeNodeTitle <TreeNodeTitle
lastUpdate={treeNode.lastUpdate}
toggleCollapsed={toggleCollapsed} toggleCollapsed={toggleCollapsed}
didSelectNode={didSelectTopic} didSelectNode={didSelectTopic}
collapsed={isCollapsed} collapsed={isCollapsed}
treeNode={treeNode} treeNode={treeNode}
name={name} name={name}
/> />
</div> </span>
{renderNodes()} {renderNodes()}
</div> </div>
) )

View File

@@ -17,14 +17,15 @@ export const styles = (theme: Theme) => {
color: theme.palette.text.secondary, color: theme.palette.text.secondary,
}, },
displayBlock: { displayBlock: {
display: 'block', display: 'block' as 'block',
}, },
node: { node: {
display: 'block', display: 'block' as 'block',
marginLeft: '10px', width: '100%',
'&:hover': { overflow: 'hidden' as 'hidden',
backgroundColor: theme.palette.type === 'light' ? blueGrey[100] : theme.palette.primary.light, textOverflow: 'ellipsis' as 'ellipsis',
}, whiteSpace: 'nowrap' as 'nowrap',
padding: '1px 0px 0px 0px',
}, },
topicSelect: { topicSelect: {
float: 'right' as 'right', float: 'right' as 'right',
@@ -44,9 +45,12 @@ export const styles = (theme: Theme) => {
lineHeight: '1em', lineHeight: '1em',
display: 'inline-block' as 'inline-block', display: 'inline-block' as 'inline-block',
whiteSpace: 'nowrap' as 'nowrap', whiteSpace: 'nowrap' as 'nowrap',
padding: '1px 4px 0px 4px',
height: '14px', height: '14px',
padding: '0 4px',
margin: '1px 0px 2px 0px', margin: '1px 0px 2px 0px',
'&:hover': {
backgroundColor: theme.palette.type === 'light' ? blueGrey[100] : theme.palette.primary.light,
},
}, },
} }
} }