@@ -15,24 +15,48 @@ export class LocalOverlayController {
1515 this . trapsKeyboardFocus = finalParams . trapsKeyboardFocus ;
1616 this . placement = finalParams . placement ;
1717 this . position = finalParams . position ;
18+ /**
19+ * A wrapper to render into the invokerTemplate
20+ *
21+ * @property {HTMLElement }
22+ */
1823 this . invoker = document . createElement ( 'div' ) ;
1924 this . invoker . style . display = 'inline-block' ;
25+ this . invokerTemplate = finalParams . invokerTemplate ;
26+ /**
27+ * The actual invoker element we work with - it get's all the events and a11y
28+ *
29+ * @property {HTMLElement }
30+ */
31+ this . invokerNode = this . invoker ;
32+ if ( finalParams . invokerNode ) {
33+ this . invokerNode = finalParams . invokerNode ;
34+ this . invoker = this . invokerNode ;
35+ }
36+
37+ /**
38+ * A wrapper the contentTemplate renders into
39+ *
40+ * @property {HTMLElement }
41+ */
2042 this . content = document . createElement ( 'div' ) ;
2143 this . content . style . display = 'inline-block' ;
44+ this . contentTemplate = finalParams . contentTemplate ;
45+ this . contentNode = this . content ;
46+ if ( finalParams . contentNode ) {
47+ this . contentNode = finalParams . contentNode ;
48+ this . content = this . contentNode ;
49+ }
50+
2251 this . contentId = `overlay-content-${ Math . random ( )
2352 . toString ( 36 )
2453 . substr ( 2 , 10 ) } `;
2554 this . _contentData = { } ;
26- this . invokerTemplate = finalParams . invokerTemplate ;
27- this . invokerNode = finalParams . invokerNode ;
28- this . contentTemplate = finalParams . contentTemplate ;
29- this . contentNode = finalParams . contentNode ;
3055 this . syncInvoker ( ) ;
3156 this . _updateContent ( ) ;
3257 this . _prevShown = false ;
3358 this . _prevData = { } ;
34-
35- if ( this . hidesOnEsc ) this . _setupHidesOnEsc ( ) ;
59+ this . __boundEscKeyHandler = this . __escKeyHandler . bind ( this ) ;
3660 }
3761
3862 get isShown ( ) {
@@ -109,10 +133,12 @@ export class LocalOverlayController {
109133
110134 if ( this . trapsKeyboardFocus ) this . _setupTrapsKeyboardFocus ( ) ;
111135 if ( this . hidesOnOutsideClick ) this . _setupHidesOnOutsideClick ( ) ;
136+ if ( this . hidesOnEsc ) this . _setupHidesOnEsc ( ) ;
112137 } else {
113138 this . _updateContent ( ) ;
114139 this . invokerNode . setAttribute ( 'aria-expanded' , false ) ;
115140 if ( this . hidesOnOutsideClick ) this . _teardownHidesOnOutsideClick ( ) ;
141+ if ( this . hidesOnEsc ) this . _teardownHidesOnEsc ( ) ;
116142 }
117143 this . _prevShown = shown ;
118144 this . _prevData = data ;
@@ -127,15 +153,15 @@ export class LocalOverlayController {
127153 this . _containFocusHandler . disconnect ( ) ;
128154 this . _containFocusHandler = undefined ; // eslint-disable-line no-param-reassign
129155 }
130- this . _containFocusHandler = containFocus ( this . content . firstElementChild ) ;
156+ this . _containFocusHandler = containFocus ( this . contentNode ) ;
131157 }
132158
133159 _setupHidesOnEsc ( ) {
134- this . content . addEventListener ( 'keyup' , event => {
135- if ( event . keyCode === keyCodes . escape ) {
136- this . hide ( ) ;
137- }
138- } ) ;
160+ this . contentNode . addEventListener ( 'keyup' , this . __boundEscKeyHandler ) ;
161+ }
162+
163+ _teardownHidesOnEsc ( ) {
164+ this . contentNode . removeEventListener ( 'keyup' , this . __boundEscKeyHandler ) ;
139165 }
140166
141167 _setupHidesOnOutsideClick ( ) {
@@ -162,14 +188,14 @@ export class LocalOverlayController {
162188 } ) ;
163189 } ;
164190
165- this . content . addEventListener ( 'click' , this . __preventCloseOutsideClick , true ) ;
166- this . invoker . addEventListener ( 'click' , this . __preventCloseOutsideClick , true ) ;
191+ this . contentNode . addEventListener ( 'click' , this . __preventCloseOutsideClick , true ) ;
192+ this . invokerNode . addEventListener ( 'click' , this . __preventCloseOutsideClick , true ) ;
167193 document . documentElement . addEventListener ( 'click' , this . __onCaptureHtmlClick , true ) ;
168194 }
169195
170196 _teardownHidesOnOutsideClick ( ) {
171- this . content . removeEventListener ( 'click' , this . __preventCloseOutsideClick , true ) ;
172- this . invoker . removeEventListener ( 'click' , this . __preventCloseOutsideClick , true ) ;
197+ this . contentNode . removeEventListener ( 'click' , this . __preventCloseOutsideClick , true ) ;
198+ this . invokerNode . removeEventListener ( 'click' , this . __preventCloseOutsideClick , true ) ;
173199 document . documentElement . removeEventListener ( 'click' , this . __onCaptureHtmlClick , true ) ;
174200 this . __preventCloseOutsideClick = null ;
175201 this . __onCaptureHtmlClick = null ;
@@ -182,4 +208,10 @@ export class LocalOverlayController {
182208 this . contentNode . style . display = 'none' ;
183209 }
184210 }
211+
212+ __escKeyHandler ( e ) {
213+ if ( e . keyCode === keyCodes . escape ) {
214+ this . hide ( ) ;
215+ }
216+ }
185217}
0 commit comments