11import PFElement from "../pfelement/pfelement.js" ;
22
3+ // StartsWith polyfill
4+ if ( ! String . prototype . startsWith ) {
5+ String . prototype . startsWith = function ( searchString , position ) {
6+ return this . substr ( position || 0 , searchString . length ) === searchString ;
7+ } ;
8+ }
9+
310class PfeModal extends PFElement {
411 static get tag ( ) {
512 return "pfe-modal" ;
@@ -29,7 +36,7 @@ class PfeModal extends PFElement {
2936 openModal ( event ) {
3037 event . preventDefault ( ) ;
3138
32- this . trigger = event . target ;
39+ this . trigger = event ? event . target : window . event . srcElement ;
3340
3441 this . dispatchEvent (
3542 new CustomEvent ( `${ this . tag } :open` , {
@@ -88,7 +95,9 @@ class PfeModal extends PFElement {
8895 this . addEventListener ( `${ this . tag } :close` , this . _toggleModal ) ;
8996
9097 this . addEventListener ( "keydown" , this . _keydownHandler ) ;
98+ this . _modalCloseButton . addEventListener ( "keydown" , this . _keydownHandler ) ;
9199 this . _modalCloseButton . addEventListener ( "click" , this . closeModal ) ;
100+ this . _overlay . addEventListener ( "click" , this . closeModal ) ;
92101
93102 this . _observer . observe ( this , { childList : true } ) ;
94103 }
@@ -98,8 +107,9 @@ class PfeModal extends PFElement {
98107 this . removeEventListener ( `${ this . tag } :close` , this . _toggleModal ) ;
99108
100109 this . removeEventListener ( "keydown" , this . _keydownHandler ) ;
101-
102110 this . _modalCloseButton . removeEventListener ( "click" , this . closeModal ) ;
111+ this . _modalCloseButton . removeEventListener ( "click" , this . closeModal ) ;
112+ this . _overlay . removeEventListener ( "click" , this . closeModal ) ;
103113
104114 if ( this . trigger ) {
105115 this . trigger . removeEventListener ( "click" , this . openModal ) ;
@@ -125,8 +135,7 @@ class PfeModal extends PFElement {
125135 this . header . setAttribute ( "id" , this . header_id ) ;
126136 this . _modalWindow . setAttribute ( "aria-labelledby" , this . header_id ) ;
127137 } else {
128- // @TODO Do something else to assign the label
129- this . _container . setAttribute ( "no_header" , "" ) ;
138+ // Get the first heading in the modal if it exists
130139 const headings = this . body . filter ( el => el . tagName . startsWith ( "H" ) ) ;
131140 if ( headings . length > 0 ) {
132141 headings [ 0 ] . setAttribute ( "id" , this . header_id ) ;
@@ -135,24 +144,27 @@ class PfeModal extends PFElement {
135144 this . _modalWindow . setAttribute ( "aria-label" , this . trigger . innerText ) ;
136145 }
137146 }
138-
139- this . _overlay . addEventListener ( "click" , this . closeModal ) ;
140- this . _modalCloseButton . addEventListener ( "keydown" , this . _keydownHandler ) ;
141147 }
142148
143149 _keydownHandler ( event ) {
144- switch ( event . key ) {
150+ let target = event . target || window . event . srcElement ;
151+ let key = event . key || event . keyCode ;
152+ switch ( key ) {
145153 case "Tab" :
146- if ( event . target === this . _modalCloseButton ) {
154+ case 9 :
155+ if ( target === this . _modalCloseButton ) {
147156 event . preventDefault ( ) ;
148157 this . _modalWindow . focus ( ) ;
149158 }
150159 return ;
151160 case "Escape" :
161+ case "Esc" :
162+ case 27 :
152163 this . closeModal ( event ) ;
153164 return ;
154165 case "Enter" :
155- if ( event . target === this . trigger ) {
166+ case 13 :
167+ if ( target === this . trigger ) {
156168 this . openModal ( event ) ;
157169 }
158170 return ;
0 commit comments