@@ -98,8 +98,15 @@ function Example(props) {
9898 ) ;
9999}
100100
101+ interface ReorderableTreebleItem {
102+ id : string ,
103+ title : string ,
104+ type : string ,
105+ date : string ,
106+ children ?: ReorderableTreebleItem [ ]
107+ }
101108function ReorderableTreeble ( props ) {
102- let tree = useTreeData ( {
109+ let tree = useTreeData < ReorderableTreebleItem > ( {
103110 initialItems : [
104111 { id : '1' , title : 'Documents' , type : 'Directory' , date : '10/20/2025' , children : [
105112 { id : '2' , title : 'Project' , type : 'Directory' , date : '8/2/2025' , children : [
@@ -114,7 +121,7 @@ function ReorderableTreeble(props) {
114121 ]
115122 } ) ;
116123
117- let { dragAndDropHooks} = useDragAndDrop ( {
124+ let { dragAndDropHooks} = useDragAndDrop < { value : ReorderableTreebleItem } > ( {
118125 getItems : ( keys , items ) => items . map ( item => ( { 'text/plain' : item . value . title } ) ) ,
119126 onMove ( e ) {
120127 if ( e . target . dropPosition === 'before' ) {
@@ -239,7 +246,7 @@ describe('Treeble', () => {
239246 expect ( tester . rowHeaders [ 3 ] ) . toHaveTextContent ( 'Job Posting' ) ;
240247 } ) ;
241248
242- it . each ( [ 'mouse' , 'touch' , 'keyboard' ] ) ( 'should expand a row with %s' , async ( interactionType ) => {
249+ it . each ( [ 'mouse' , 'touch' , 'keyboard' ] as const ) ( 'should expand a row with %s' , async ( interactionType ) => {
243250 let tree = render ( < Example /> ) ;
244251 let tester = utils . createTester ( 'Table' , { root : tree . getByTestId ( 'treeble' ) } ) ;
245252
@@ -529,6 +536,39 @@ describe('Treeble', () => {
529536 expect ( onSelectionChange ) . toHaveBeenLastCalledWith ( new Set ( [ 'games' , 'mario' , 'tetris' ] ) ) ;
530537 } ) ;
531538
539+ it ( 'supports expansion on disabled items with no action in disabledBehavior="selection" multiple selection' , async ( ) => {
540+ let tree = render ( < Example disabledKeys = { [ 'apps' ] } selectionMode = "multiple" disabledBehavior = "selection" /> ) ;
541+ let tester = utils . createTester ( 'Table' , { root : tree . getByTestId ( 'treeble' ) } ) ;
542+
543+ await user . hover ( tester . rows [ 1 ] ) ;
544+ expect ( tester . rows [ 1 ] ) . toHaveAttribute ( 'data-hovered' , 'true' ) ;
545+
546+ await user . click ( tester . rows [ 1 ] ) ;
547+ expect ( tester . rows [ 1 ] ) . toHaveAttribute ( 'aria-expanded' , 'true' ) ;
548+ } ) ;
549+
550+ it ( 'supports expansion on disabled items with no action in disabledBehavior="selection" single selection' , async ( ) => {
551+ let tree = render ( < Example disabledKeys = { [ 'apps' ] } selectionMode = "single" disabledBehavior = "selection" /> ) ;
552+ let tester = utils . createTester ( 'Table' , { root : tree . getByTestId ( 'treeble' ) } ) ;
553+
554+ await user . hover ( tester . rows [ 1 ] ) ;
555+ expect ( tester . rows [ 1 ] ) . toHaveAttribute ( 'data-hovered' , 'true' ) ;
556+
557+ await user . click ( tester . rows [ 1 ] ) ;
558+ expect ( tester . rows [ 1 ] ) . toHaveAttribute ( 'aria-expanded' , 'true' ) ;
559+ } ) ;
560+
561+ it ( 'supports expansion on disabled items with no action in disabledBehavior="selection" no selection' , async ( ) => {
562+ let tree = render ( < Example disabledKeys = { [ 'apps' ] } selectionMode = "none" disabledBehavior = "selection" /> ) ;
563+ let tester = utils . createTester ( 'Table' , { root : tree . getByTestId ( 'treeble' ) } ) ;
564+
565+ await user . hover ( tester . rows [ 1 ] ) ;
566+ expect ( tester . rows [ 1 ] ) . toHaveAttribute ( 'data-hovered' , 'true' ) ;
567+
568+ await user . click ( tester . rows [ 1 ] ) ;
569+ expect ( tester . rows [ 1 ] ) . toHaveAttribute ( 'aria-expanded' , 'true' ) ;
570+ } ) ;
571+
532572 it ( 'should support drag and drop' , async ( ) => {
533573 let tree = render ( < ReorderableTreeble /> ) ;
534574 let tester = utils . createTester ( 'Table' , { root : tree . getByRole ( 'treegrid' ) } ) ;
0 commit comments