({
height,
searchAddonAfter,
searchStyle,
dataSource,
onAddVariable = noop,
onDeleteVariable = noop,
onDeleteStore = noop,
getPreviewValue = noop,
onSelect = noop,
onSave = noop,
modes = ['add', 'preview', 'define'],
defaultMode = 'preview',
}: EditableVariableTreeProps)
| 134 | ]; |
| 135 | |
| 136 | export function EditableVariableTree({ |
| 137 | height, |
| 138 | searchAddonAfter, |
| 139 | searchStyle, |
| 140 | dataSource, |
| 141 | onAddVariable = noop, |
| 142 | onDeleteVariable = noop, |
| 143 | onDeleteStore = noop, |
| 144 | getPreviewValue = noop, |
| 145 | onSelect = noop, |
| 146 | onSave = noop, |
| 147 | modes = ['add', 'preview', 'define'], |
| 148 | defaultMode = 'preview', |
| 149 | }: EditableVariableTreeProps) { |
| 150 | const [keyword, setKeyword] = useState(''); |
| 151 | const [node, setNode] = useState<IVariableTreeNode>(); |
| 152 | const [mode, setMode] = useState<EditableVariableTreeProps['defaultMode']>(defaultMode); |
| 153 | const hasPanelSwitch = modes.includes('define') && modes.includes('preview'); |
| 154 | |
| 155 | const treeData = useMemo(() => { |
| 156 | const pattern = new RegExp(keyword, 'ig'); |
| 157 | return keyword |
| 158 | ? filterTreeData(dataSource, (leaf) => pattern.test(leaf.title), 'children', true) |
| 159 | : dataSource; |
| 160 | }, [keyword, dataSource]); |
| 161 | |
| 162 | return ( |
| 163 | <Box |
| 164 | className="EditableVariableTree" |
| 165 | display="flex" |
| 166 | overflow="auto" |
| 167 | height={height} |
| 168 | position="relative" |
| 169 | > |
| 170 | <Box p="l" width="40%"> |
| 171 | <Box mb="m" position="sticky" top="0" bg="white" zIndex={2}> |
| 172 | <Input.Group compact> |
| 173 | <Search |
| 174 | placeholder="请输入变量名" |
| 175 | onChange={(val) => setKeyword(val?.trim())} |
| 176 | style={searchStyle} |
| 177 | /> |
| 178 | {searchAddonAfter} |
| 179 | </Input.Group> |
| 180 | </Box> |
| 181 | <VariableTree |
| 182 | dataSource={treeData} |
| 183 | showViewIcon |
| 184 | onSelect={(item) => { |
| 185 | setNode(item); |
| 186 | mode === 'add' && setMode(defaultMode); |
| 187 | onSelect(item); |
| 188 | }} |
| 189 | onView={(item) => { |
| 190 | setNode(item); |
| 191 | mode === 'add' && setMode(defaultMode); |
| 192 | }} |
| 193 | onAdd={(item) => { |
nothing calls this directly
no test coverage detected