import * as q from '../../../../../backend/src/Model' import React from 'react' 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 { treeNode: q.TreeNode lastUpdate: number name?: string | undefined collapsed?: boolean | undefined didSelectNode: any toggleCollapsed: any classes: any } class TreeNodeTitle extends React.PureComponent { private renderSourceEdge() { const name = this.props.name || (this.props.treeNode.sourceEdge && this.props.treeNode.sourceEdge.name) return ( {name} ) } 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() { return this.props.treeNode.message && this.props.treeNode.message.value && this.props.treeNode.message.length > 0 ? ( {' '} = {this.truncatedMessage()} ) : null } private renderExpander() { if (this.props.treeNode.edgeCount() === 0) { return null } return ( {this.props.collapsed ? '▶' : '▼'} ) } private renderMetadata() { if (this.props.treeNode.edgeCount() === 0 || !this.props.collapsed) { return null } const messages = this.props.treeNode.leafMessageCount() return ( {`(${this.props.treeNode.childTopicCount()} topics, ${messages} messages)`} ) } public render() { return [this.renderExpander(), this.renderSourceEdge(), this.renderMetadata(), this.renderValue()] } } const styles = (theme: Theme) => ({ value: { whiteSpace: 'nowrap' as 'nowrap', overflow: 'hidden' as 'hidden', textOverflow: 'ellipsis' as 'ellipsis', padding: '0', }, sourceEdge: { fontWeight: 'bold' as 'bold', overflow: 'hidden' as 'hidden', }, expander: { color: theme.palette.type === 'light' ? '#222' : '#eee', cursor: 'pointer' as 'pointer', paddingRight: theme.spacing(0.25), userSelect: 'none' as 'none', }, collapsedSubnodes: { color: theme.palette.text.secondary, userSelect: 'none' as 'none', }, }) export default withStyles(styles)(TreeNodeTitle)