Improve payload truncation in tree
This commit is contained in:
@@ -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}
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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>
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -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,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user