-
-
Notifications
You must be signed in to change notification settings - Fork 34
Expand file tree
/
Copy pathNavTreeNode.jsx
More file actions
136 lines (127 loc) · 3.75 KB
/
NavTreeNode.jsx
File metadata and controls
136 lines (127 loc) · 3.75 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
import PropTypes from 'prop-types'
import React, {ReactElement} from 'react'
import {reifyName} from '@bldrs-ai/ifclib'
import {useTheme} from '@mui/material/styles'
import HideToggleButton from '../HideToggleButton'
import {
KeyboardArrowDown as NodeOpenIcon,
KeyboardArrowRight as NodeClosedIcon,
} from '@mui/icons-material'
/** @return {ReactElement} */
export default function NavTreeNode({
node,
depth,
isExpanded,
isSelected,
hasChildren,
handleToggle,
handleSelect,
hasHideIcon,
model,
style,
}) {
const handleLabelClick = (event) => handleSelect(event)
const handleExpandClick = (event) => {
event.stopPropagation()
handleToggle(event)
}
// The HideToggleButton handles the hide/show logic internally
const handleHideClick = (event) => event.stopPropagation()
// Determine the label based on whether it's a type node or an element node
const label = node.label || reifyName({properties: model}, node)
const paddingLeft = 20 // Indentation for each tree depth
const theme = useTheme()
return (
<div
style={{
...style,
paddingLeft: depth * paddingLeft,
display: 'flex',
alignItems: 'flex-start', // Align items at the top for multiline labels
backgroundColor: isSelected ? theme.palette.secondary.selected : 'transparent',
cursor: 'pointer',
userSelect: 'none', // Prevent text selection to avoid Google Translate popup
}}
>
{/* Expand/Collapse Icon */}
{hasChildren ? (
<div
onClick={handleExpandClick}
onKeyDown={(event) => {
if (event.key === 'Enter' || event.key === ' ') {
handleExpandClick(event)
}
}}
role='button'
tabIndex={0}
style={{
display: 'flex',
alignItems: 'center',
}}
>
{isExpanded ? (
<NodeOpenIcon className='icon-share icon-nav-caret'/>
) : (
<NodeClosedIcon className='icon-share icon-nav-caret'/>
)}
</div>
) : (
<div style={{width: 24, marginRight: 8}}/>
)}
{/* Label */}
<div
id='NavTreeNodeLabelId'
onClick={handleLabelClick}
onKeyDown={(event) => {
if (event.key === 'Enter' || event.key === ' ') {
handleLabelClick(event)
}
}}
role='button'
tabIndex={0}
style={{
flexGrow: 1,
wordBreak: 'break-word', // Allow breaking long words
whiteSpace: 'normal', // Enable multiline wrapping
overflow: 'visible', // Ensure full rendering of the content
}}
>
{label}
</div>
{/* Hide Icon */}
{hasHideIcon && (
<div
style={{
marginLeft: 'auto',
paddingRight: '0.5rem',
display: 'flex',
alignItems: 'center',
}}
onClick={handleHideClick}
onKeyDown={(event) => {
if (event.key === 'Enter' || event.key === ' ') {
handleHideClick(event)
}
}}
role='button'
tabIndex={0}
>
<HideToggleButton elementId={parseInt(node.expressID, 10)}/>
</div>
)}
</div>
)
}
NavTreeNode.propTypes = {
node: PropTypes.object.isRequired,
depth: PropTypes.number.isRequired,
isExpanded: PropTypes.bool.isRequired,
isSelected: PropTypes.bool.isRequired,
hasChildren: PropTypes.bool.isRequired,
handleToggle: PropTypes.func.isRequired,
handleSelect: PropTypes.func.isRequired,
hasHideIcon: PropTypes.bool.isRequired,
model: PropTypes.object.isRequired,
style: PropTypes.object.isRequired,
isNavTree: PropTypes.bool.isRequired, // Added isNavTree to propTypes
}