@@ -12,29 +12,61 @@ import DirectiveUtilities from '../directiveUtilities';
1212interface ExpandOnClickArgs {
1313 // input (specified by user)
1414 expander : string | HTMLElement ,
15- onClosed ?: ( ) => void ;
15+ onClosed ?: ( event : MouseEvent | KeyboardEvent ) => void ;
16+ onExpand ?: ( event : MouseEvent | KeyboardEvent ) => void ;
1617
1718 // state
1819 isMouseDown ?: boolean ;
1920 hasScrolled ?: boolean ;
2021
21- // event handlers
22- onExpand ?: ( ) => void ;
22+ // internal event handlers
23+ onClickOnExpander ?: ( event : MouseEvent | KeyboardEvent ) => void ;
2324 onClickOutsideElement ?: ( event : MouseEvent ) => void ;
2425 onScroll ?: ( ) => void ;
2526 onMouseDown ?: ( ) => void ;
2627 onEscapeHandler ?: ( event : KeyboardEvent ) => void ;
2728}
2829
29- function onExpand ( element : HTMLElement ) {
30- element . classList . toggle ( 'expanded' ) ;
30+ function expand (
31+ element : HTMLElement ,
32+ binding : DirectiveBinding < ExpandOnClickArgs > ,
33+ event : MouseEvent | KeyboardEvent ,
34+ ) {
35+ element . classList . add ( 'expanded' ) ;
36+ if ( binding . value ?. onExpand ) {
37+ binding . value . onExpand ( event ) ;
38+ }
3139
3240 const positionElement = element . querySelector ( '.dropdown.positionInViewport' ) ;
3341 if ( positionElement ) {
3442 Matomo . helper . setMarginLeftToBeInViewport ( positionElement ) ;
3543 }
3644}
3745
46+ function close (
47+ element : HTMLElement ,
48+ binding : DirectiveBinding < ExpandOnClickArgs > ,
49+ event : MouseEvent | KeyboardEvent ,
50+ ) {
51+ element . classList . remove ( 'expanded' ) ;
52+
53+ if ( binding . value ?. onClosed ) {
54+ binding . value . onClosed ( event ) ;
55+ }
56+ }
57+
58+ function onClickOnExpander (
59+ element : HTMLElement ,
60+ binding : DirectiveBinding < ExpandOnClickArgs > ,
61+ event : MouseEvent | KeyboardEvent ,
62+ ) {
63+ if ( element . classList . contains ( 'expanded' ) ) {
64+ close ( element , binding , event ) ;
65+ } else {
66+ expand ( element , binding , event ) ;
67+ }
68+ }
69+
3870function onClickOutsideElement (
3971 element : HTMLElement ,
4072 binding : DirectiveBinding < ExpandOnClickArgs > ,
@@ -49,11 +81,7 @@ function onClickOutsideElement(
4981 }
5082
5183 if ( ! element . contains ( event . target as HTMLElement ) ) {
52- element . classList . remove ( 'expanded' ) ;
53-
54- if ( binding . value ?. onClosed ) {
55- binding . value . onClosed ( ) ;
56- }
84+ close ( element , binding , event ) ;
5785 }
5886}
5987
@@ -71,15 +99,14 @@ function onEscapeHandler(
7199 binding : DirectiveBinding < ExpandOnClickArgs > ,
72100 event : KeyboardEvent ,
73101) {
74- if ( event . which === 27 ) {
102+ if ( event . key === 'Escape' ) {
75103 binding . value . isMouseDown = false ;
76104 binding . value . hasScrolled = false ;
77- element . classList . remove ( 'expanded' ) ;
105+ close ( element , binding , event ) ;
78106 }
79107}
80108
81109const doc = document . documentElement ;
82- const { $ } = window ;
83110
84111/**
85112 * Usage (in a component):
@@ -93,7 +120,7 @@ export default {
93120 mounted ( el : HTMLElement , binding : DirectiveBinding < ExpandOnClickArgs > ) : void {
94121 binding . value . isMouseDown = false ;
95122 binding . value . hasScrolled = false ;
96- binding . value . onExpand = onExpand . bind ( null , el ) ;
123+ binding . value . onClickOnExpander = onClickOnExpander . bind ( null , el , binding ) ;
97124 binding . value . onEscapeHandler = onEscapeHandler . bind ( null , el , binding ) ;
98125 binding . value . onMouseDown = onMouseDown . bind ( null , binding ) ;
99126 binding . value . onClickOutsideElement = onClickOutsideElement . bind ( null , el , binding ) ;
@@ -102,7 +129,7 @@ export default {
102129 setTimeout ( ( ) => {
103130 const expander = DirectiveUtilities . getRef ( binding . value . expander , binding ) ;
104131 if ( expander ) {
105- $ ( expander ) . on ( 'click' , binding . value . onExpand ! ) ;
132+ expander . addEventListener ( 'click' , binding . value . onClickOnExpander ! ) ;
106133 }
107134 } ) ;
108135 doc . addEventListener ( 'keyup' , binding . value . onEscapeHandler ) ;
@@ -113,7 +140,7 @@ export default {
113140 unmounted ( el : HTMLElement , binding : DirectiveBinding < ExpandOnClickArgs > ) : void {
114141 const expander = DirectiveUtilities . getRef ( binding . value . expander , binding ) ;
115142 if ( expander ) {
116- $ ( expander ) . off ( 'click' , binding . value . onExpand ! ) ;
143+ doc . removeEventListener ( 'click' , binding . value . onClickOnExpander ! ) ;
117144 }
118145 doc . removeEventListener ( 'keyup' , binding . value . onEscapeHandler ! ) ;
119146 doc . removeEventListener ( 'mousedown' , binding . value . onMouseDown ! ) ;
0 commit comments