/** * Render Cell in Tree Node * * @author Brauer Ilya * @date 2020-10-29 */ import {AbstractModel} from '@unidata/core'; import * as React from 'react'; import {ITreeColumn, ITreeNode} from './TreeType'; import {Button, Icon, Input, PLACEMENT, POPOVER_THEME, safeInvoke, SIZE, Tooltip} from '../../index'; import * as styles from './tree.m.scss'; import {ConditionFunc} from './Node'; interface IProps { node: ITreeNode; column: ITreeColumn; isEdited?: boolean; isEditable?: boolean | ConditionFunc; onEdit?: (node: ITreeNode, newValue: string, cellId: string) => void; } interface IState { isEditable: boolean; editableCell: string; isCellHovered: boolean; showTooltip: boolean; } const tooltipModify = [ { name: 'offset', options: { offset: [-4, -19] } } ]; export class Cell extends React.PureComponent, IState> { titleRef = React.createRef(); override state: IState = { isEditable: false, editableCell: '', isCellHovered: false, showTooltip: false }; override componentDidMount () { this.calcTooltip(); } calcTooltip () { const titleElement = this.titleRef.current; if (titleElement !== null && titleElement.scrollWidth > titleElement.offsetWidth) { this.setState({showTooltip: true}); } } setEditable = (e: React.SyntheticEvent) => { e.stopPropagation(); this.setState({ isEditable: true, editableCell: this.props.column.name }); }; renderInput = (value: string, node: ITreeNode, column: ITreeColumn) => { const me = this; return ( ); }; onMouseEnter = () => { this.setState({isCellHovered: true}); }; onMouseLeave = () => { this.setState({isCellHovered: false}); }; override render () { const {node, column} = this.props; const clsName = styles.column; const isEditable = typeof this.props.isEditable === 'function' ? this.props.isEditable(node, column) : this.props.isEditable; let value = node.row instanceof AbstractModel ? node.row.getField(column.name)?.getValue() : (node.row as any)[column.name]; if (column.renderer) { value = column.renderer(node); } return (
{this.props.children} {(this.state.isEditable && this.state.editableCell === column.name) || this.props.isEdited === true ? ( this.renderInput(value, node, column) ) : ( <> {node.icon && } {this.state.showTooltip === false ? ( {value} ) : ( {value}
)} placement={PLACEMENT.BOTTOM_START} theme={POPOVER_THEME.LIGHT} hasArrow={false} hasPaddings={false} mouseEnterDelay={600} modifiers={tooltipModify} > {value} )} {isEditable === true && this.state.isCellHovered && (