@@ -5,11 +5,12 @@ import {
55import { NodeRenderer } from '../../plugin-renderer/src/NodeRenderer' ;
66import { ActionableGroupNode } from '../../plugin-layout/src/ActionableGroupNode' ;
77import { ActionableNode } from '../../plugin-layout/src/ActionableNode' ;
8+ import { Predicate } from '../../core/src/VNodes/VNode' ;
89
910export class ActionableGroupDomObjectRenderer extends NodeRenderer < DomObject > {
1011 static id = DomObjectRenderingEngine . id ;
1112 engine : DomObjectRenderingEngine ;
12- predicate = ActionableGroupNode ;
13+ predicate : Predicate = ActionableGroupNode ;
1314
1415 actionableGroupNodes = new Map < ActionableGroupNode , HTMLElement > ( ) ;
1516
@@ -28,19 +29,41 @@ export class ActionableGroupDomObjectRenderer extends NodeRenderer<DomObject> {
2829 ) {
2930 return { children : [ ] } ;
3031 } else if ( group . ancestor ( ActionableGroupNode ) ) {
31- return this . _renderSelect ( group ) ;
32+ return this . _renderBlockSelect ( group ) ;
3233 } else {
3334 return this . _renderGroup ( group ) ;
3435 }
3536 }
36- private _renderSelect ( group : ActionableGroupNode ) : DomObject {
37+ private _renderBlockSelect ( group : ActionableGroupNode ) : DomObject {
38+ const mousedownHandler = ( ev : MouseEvent ) : void => ev . preventDefault ( ) ;
39+
40+ let clickHandler : ( ev : MouseEvent ) => void ;
41+ let open = false ;
3742 const objectSelect : DomObject = {
38- tag : 'SELECT' ,
39- children : [ { tag : 'OPTION' } , ...group . children ( ) ] ,
40- attach : ( el : HTMLSelectElement ) : void => {
43+ tag : 'JW-SELECT' ,
44+ children : [
45+ { tag : 'JW-BUTTON' , children : [ { text : '\u00A0' } ] } ,
46+ { tag : 'JW-GROUP' , children : group . children ( ) } ,
47+ ] ,
48+ attach : ( el : HTMLElement ) : void => {
49+ clickHandler = ( ev : MouseEvent ) : void => {
50+ const inSelect =
51+ ( ev . target as Node ) . nodeType === Node . ELEMENT_NODE &&
52+ ( ev . target as Element ) . closest ( 'jw-select' ) === el ;
53+ if ( ( ! inSelect && open ) || ev . currentTarget !== document ) {
54+ open = ! open ;
55+ el . setAttribute ( 'aria-pressed' , open . toString ( ) ) ;
56+ }
57+ } ;
58+ el . addEventListener ( 'mousedown' , mousedownHandler ) ;
59+ el . addEventListener ( 'click' , clickHandler ) ;
60+ document . addEventListener ( 'click' , clickHandler ) ;
4161 this . actionableGroupNodes . set ( group , el ) ;
4262 } ,
43- detach : ( ) : void => {
63+ detach : ( el : HTMLElement ) : void => {
64+ el . removeEventListener ( 'mousedown' , mousedownHandler ) ;
65+ el . removeEventListener ( 'click' , clickHandler ) ;
66+ document . removeEventListener ( 'click' , clickHandler ) ;
4467 this . actionableGroupNodes . delete ( group ) ;
4568 } ,
4669 } ;
@@ -72,7 +95,7 @@ export class ActionableGroupDomObjectRenderer extends NodeRenderer<DomObject> {
7295 if ( invisible ) {
7396 element . style . display = 'none' ;
7497 } else {
75- element . style . display = 'inline-block ' ;
98+ element . style . display = '' ;
7699 }
77100 }
78101 }
0 commit comments