@@ -1453,7 +1453,7 @@ function getTreeNodes(nodeList: NodeList|Node[]): HTMLLIElement[] {
14531453 return nodeList . values ( )
14541454 . flatMap ( node => {
14551455 if ( node instanceof HTMLLIElement && node . role === 'treeitem' ) {
1456- return [ node ] ;
1456+ return [ node , ... node . querySelectorAll < HTMLLIElement > ( 'ul[role="group"] li[role="treeitem"]' ) ] ;
14571457 }
14581458 if ( node instanceof HTMLElement ) {
14591459 return node . querySelectorAll < HTMLLIElement > ( 'li[role="treeitem"]' ) ;
@@ -1508,20 +1508,23 @@ export class TreeViewElement extends HTMLElementWithLightDOMTemplate {
15081508
15091509 constructor ( ) {
15101510 super ( ) ;
1511- this . #treeOutline. addEventListener (
1512- Events . ElementSelected ,
1513- event =>
1514- this . dispatchEvent ( new TreeViewElement . SelectEvent ( ( event . data as TreeViewTreeElement ) . configElement ) ) ) ;
1515- this . #treeOutline. addEventListener (
1516- Events . ElementExpanded ,
1517- event => ( event . data as TreeViewTreeElement )
1518- . configElement . dispatchEvent ( new TreeViewElement . ExpandEvent (
1519- { expanded : true , target : ( event . data as TreeViewTreeElement ) . configElement } ) ) ) ;
1520- this . #treeOutline. addEventListener (
1521- Events . ElementCollapsed ,
1522- event => ( event . data as TreeViewTreeElement )
1523- . configElement . dispatchEvent ( new TreeViewElement . ExpandEvent (
1524- { expanded : false , target : ( event . data as TreeViewTreeElement ) . configElement } ) ) ) ;
1511+ this . #treeOutline. addEventListener ( Events . ElementSelected , event => {
1512+ if ( event . data instanceof TreeViewTreeElement ) {
1513+ this . dispatchEvent ( new TreeViewElement . SelectEvent ( event . data . configElement ) ) ;
1514+ }
1515+ } ) ;
1516+ this . #treeOutline. addEventListener ( Events . ElementExpanded , event => {
1517+ if ( event . data instanceof TreeViewTreeElement ) {
1518+ event . data . configElement . dispatchEvent ( new TreeViewElement . ExpandEvent (
1519+ { expanded : true , target : ( event . data as TreeViewTreeElement ) . configElement } ) ) ;
1520+ }
1521+ } ) ;
1522+ this . #treeOutline. addEventListener ( Events . ElementCollapsed , event => {
1523+ if ( event . data instanceof TreeViewTreeElement ) {
1524+ event . data . configElement . dispatchEvent ( new TreeViewElement . ExpandEvent (
1525+ { expanded : false , target : ( event . data as TreeViewTreeElement ) . configElement } ) ) ;
1526+ }
1527+ } ) ;
15251528 this . addNodes ( getTreeNodes ( [ this ] ) ) ;
15261529 }
15271530
@@ -1545,12 +1548,29 @@ export class TreeViewElement extends HTMLElementWithLightDOMTemplate {
15451548 return treeElement ? { expanded, treeElement} : null ;
15461549 }
15471550
1548- protected override updateNodes ( node : Node , _attributeName : string | null ) : void {
1551+ protected override updateNodes ( node : Node , attributeName : string | null ) : void {
15491552 while ( node ?. parentNode && ! ( node instanceof HTMLElement ) ) {
15501553 node = node . parentNode ;
15511554 }
15521555 const treeNode = node instanceof HTMLElement ? node . closest ( 'li[role="treeitem"]' ) : null ;
1553- treeNode && TreeViewTreeElement . get ( treeNode ) ?. refresh ( ) ;
1556+ if ( ! treeNode ) {
1557+ return ;
1558+ }
1559+ const treeElement = TreeViewTreeElement . get ( treeNode ) ;
1560+ if ( ! treeElement ) {
1561+ return ;
1562+ }
1563+ treeElement . refresh ( ) ;
1564+ if ( node === treeNode && attributeName === 'selected' && hasBooleanAttribute ( treeNode , 'selected' ) ) {
1565+ treeElement . revealAndSelect ( true ) ;
1566+ }
1567+ if ( attributeName === 'hidden' && node instanceof HTMLUListElement && node . role === 'group' ) {
1568+ if ( hasBooleanAttribute ( node , 'hidden' ) ) {
1569+ treeElement . collapse ( ) ;
1570+ } else {
1571+ treeElement . expand ( ) ;
1572+ }
1573+ }
15541574 }
15551575
15561576 protected override addNodes ( nodes : NodeList | Node [ ] ) : void {
0 commit comments