@@ -9,23 +9,21 @@ import { CatalogIcon, DeleteIcon, DragIcon, EditIcon, EllipsisIcon, PlusCircleIc
99import CatalogueTree , { ICatalogueTree } from './tree' ;
1010
1111interface ICatalogue
12- extends Pick < IBlockHeaderProps , 'tooltip' | 'addonAfter' > ,
13- Partial < Pick < ReturnType < typeof useTreeData > , 'onChange' > > ,
12+ extends Pick < IBlockHeaderProps , 'tooltip' | 'addonAfter' | 'addonBefore' | 'title' > ,
13+ Pick < ReturnType < typeof useTreeData > , 'onChange' > ,
1414 ICatalogueTree {
15- icon ?: React . ReactNode ;
16- title ?: string ;
1715 showSearch ?: boolean ;
1816 edit ?: boolean ;
1917 placeholder ?: string ;
2018 loading ?: boolean ;
2119 onSearch ?: ( value : string ) => void ;
22- onSave ?: ( data : ITreeNode , value : string ) => Promise < void > ;
23- onDelete ?: ( data : ITreeNode ) => Promise < void > ;
20+ onSave ?: ( data : ITreeNode , value : string ) => void ;
21+ onDelete ?: ( data : ITreeNode ) => void ;
2422}
2523
2624const Catalogue = ( {
2725 title,
28- icon = < CatalogIcon style = { { fontSize : 20 } } /> ,
26+ addonBefore = < CatalogIcon style = { { fontSize : 20 } } /> ,
2927 tooltip = false ,
3028 showSearch = false ,
3129 placeholder = '搜索目录名称' ,
@@ -43,18 +41,24 @@ const Catalogue = ({
4341} : ICatalogue ) => {
4442 const [ form ] = Form . useForm ( ) ;
4543
46- const loopTree = ( data : DataNode [ ] ) : DataNode [ ] => {
44+ const loopTree = ( data : ITreeNode [ ] ) : ITreeNode [ ] => {
4745 return data ?. map ( ( item ) => {
46+ const reset : ITreeNode = {
47+ ...item ,
48+ editable : item ?. editable === undefined ? true : item ?. editable ,
49+ addable : item ?. addable === undefined ? true : item ?. addable ,
50+ deletable : item ?. deletable === undefined ? true : item ?. deletable ,
51+ } ;
4852 if ( item . children ) {
4953 return {
50- ...item ,
51- title : renderTitle ( item ) ,
54+ ...reset ,
55+ title : renderTitle ( reset ) ,
5256 children : loopTree ( item . children ) ,
5357 } ;
5458 }
5559 return {
56- ...item ,
57- title : renderTitle ( item ) ,
60+ ...reset ,
61+ title : renderTitle ( reset ) ,
5862 children : undefined ,
5963 } ;
6064 } ) ;
@@ -67,7 +71,7 @@ const Catalogue = ({
6771 title = { title }
6872 tooltip = { tooltip }
6973 background = { false }
70- addonBefore = { icon }
74+ addonBefore = { addonBefore }
7175 addonAfter = { addonAfter }
7276 spaceBottom = { 12 }
7377 />
@@ -165,7 +169,7 @@ const Catalogue = ({
165169 ) ;
166170 } ;
167171
168- const renderNodeHover = ( item : DataNode ) => {
172+ const renderNodeHover = ( item : ITreeNode ) => {
169173 const menu = (
170174 < Menu
171175 className = "tree__title--menu"
@@ -176,23 +180,26 @@ const Catalogue = ({
176180 < Menu . Item
177181 key = "add"
178182 className = "title__menu--item"
179- onClick = { ( ) => onChange ?.( item , InputStatus . Append ) }
183+ disabled = { ! item . addable }
184+ onClick = { ( ) => item . addable && onChange ?.( item , InputStatus . Append ) }
180185 >
181186 < PlusCircleIcon />
182187 < span > 新建目录</ span >
183188 </ Menu . Item >
184189 < Menu . Item
185190 key = "edit"
186191 className = "title__menu--item"
187- onClick = { ( ) => onChange ?.( item , InputStatus . Edit ) }
192+ disabled = { ! item . editable }
193+ onClick = { ( ) => item . editable && onChange ?.( item , InputStatus . Edit ) }
188194 >
189195 < EditIcon />
190196 < span > 编辑</ span >
191197 </ Menu . Item >
192198 < Menu . Item
193199 key = "delete"
194200 className = "title__menu--item"
195- onClick = { ( ) => onDelete ?.( item ) }
201+ disabled = { ! item . deletable }
202+ onClick = { ( ) => item . deletable && onDelete ?.( item ) }
196203 >
197204 < DeleteIcon />
198205 < span > 删除</ span >
@@ -204,19 +211,19 @@ const Catalogue = ({
204211 className = "tree__title--operation"
205212 onMouseDown = { ( e ) => {
206213 e . stopPropagation ( ) ;
207- // this.setState({ isSelected: false, draggable: false });
208214 } }
209215 >
210216 < Dropdown
211217 overlay = { menu }
212218 trigger = { [ 'click' ] }
213219 placement = "bottomRight"
214220 arrow
215- getPopupContainer = { ( triggerNode ) => triggerNode . parentElement }
221+ destroyPopupOnHide
222+ getPopupContainer = { ( triggerNode ) => triggerNode . parentElement as HTMLElement }
216223 >
217224 < EllipsisIcon onClick = { ( e ) => e . stopPropagation ( ) } />
218225 </ Dropdown >
219- < DragIcon />
226+ { draggable && < DragIcon /> }
220227 </ div >
221228 ) ;
222229 } ;
0 commit comments