21
21
* THE SOFTWARE.
22
22
*/
23
23
24
- import MDCDrawerAdapter from '../adapter' ;
25
24
import { MDCFoundation } from '@material/base/foundation' ;
25
+ import { MDCDrawerAdapter } from '../adapter' ;
26
26
import { cssClasses , strings } from '../constants' ;
27
27
28
- /**
29
- * @extends {MDCFoundation<!MDCDrawerAdapter> }
30
- */
31
- class MDCDismissibleDrawerFoundation extends MDCFoundation {
32
- /** @return enum {string} */
28
+ class MDCDismissibleDrawerFoundation extends MDCFoundation < MDCDrawerAdapter > {
33
29
static get strings ( ) {
34
30
return strings ;
35
31
}
36
32
37
- /** @return enum {string} */
38
33
static get cssClasses ( ) {
39
34
return cssClasses ;
40
35
}
41
36
42
- static get defaultAdapter ( ) {
43
- return /** @type {!MDCDrawerAdapter } */ ( {
44
- addClass : ( /* className: string */ ) => { } ,
45
- removeClass : ( /* className: string */ ) => { } ,
46
- hasClass : ( /* className: string */ ) => { } ,
47
- elementHasClass : ( /* element: !Element, className: string */ ) => { } ,
48
- notifyClose : ( ) => { } ,
49
- notifyOpen : ( ) => { } ,
50
- saveFocus : ( ) => { } ,
51
- restoreFocus : ( ) => { } ,
52
- focusActiveNavigationItem : ( ) => { } ,
53
- trapFocus : ( ) => { } ,
54
- releaseFocus : ( ) => { } ,
55
- } ) ;
37
+ static get defaultAdapter ( ) : MDCDrawerAdapter {
38
+ // tslint:disable:object-literal-sort-keys
39
+ return {
40
+ addClass : ( ) => undefined ,
41
+ removeClass : ( ) => undefined ,
42
+ hasClass : ( ) => false ,
43
+ elementHasClass : ( ) => false ,
44
+ notifyClose : ( ) => undefined ,
45
+ notifyOpen : ( ) => undefined ,
46
+ saveFocus : ( ) => undefined ,
47
+ restoreFocus : ( ) => undefined ,
48
+ focusActiveNavigationItem : ( ) => undefined ,
49
+ trapFocus : ( ) => undefined ,
50
+ releaseFocus : ( ) => undefined ,
51
+ } ;
52
+ // tslint:enable:object-literal-sort-keys
56
53
}
57
54
58
- constructor ( adapter ) {
59
- super ( Object . assign ( MDCDismissibleDrawerFoundation . defaultAdapter , adapter ) ) ;
60
-
61
- /** @private {number} */
62
- this . animationFrame_ = 0 ;
55
+ private animationFrame_ = 0 ;
56
+ private animationTimer_ = 0 ;
63
57
64
- /** @private {number} */
65
- this . animationTimer_ = 0 ;
58
+ constructor ( adapter ?: Partial < MDCDrawerAdapter > ) {
59
+ super ( { ... MDCDismissibleDrawerFoundation . defaultAdapter , ... adapter } ) ;
66
60
}
67
61
68
62
destroy ( ) {
@@ -74,9 +68,6 @@ class MDCDismissibleDrawerFoundation extends MDCFoundation {
74
68
}
75
69
}
76
70
77
- /**
78
- * Function to open the drawer.
79
- */
80
71
open ( ) {
81
72
if ( this . isOpen ( ) || this . isOpening ( ) || this . isClosing ( ) ) {
82
73
return ;
@@ -93,9 +84,6 @@ class MDCDismissibleDrawerFoundation extends MDCFoundation {
93
84
this . adapter_ . saveFocus ( ) ;
94
85
}
95
86
96
- /**
97
- * Function to close the drawer.
98
- */
99
87
close ( ) {
100
88
if ( ! this . isOpen ( ) || this . isOpening ( ) || this . isClosing ( ) ) {
101
89
return ;
@@ -105,48 +93,31 @@ class MDCDismissibleDrawerFoundation extends MDCFoundation {
105
93
}
106
94
107
95
/**
108
- * Extension point for when drawer finishes open animation.
109
- * @protected
96
+ * @return true if drawer is in open state.
110
97
*/
111
- opened ( ) { }
112
-
113
- /**
114
- * Extension point for when drawer finishes close animation.
115
- * @protected
116
- */
117
- closed ( ) { }
118
-
119
- /**
120
- * Returns true if drawer is in open state.
121
- * @return {boolean }
122
- */
123
- isOpen ( ) {
98
+ isOpen ( ) : boolean {
124
99
return this . adapter_ . hasClass ( cssClasses . OPEN ) ;
125
100
}
126
101
127
102
/**
128
- * Returns true if drawer is animating open.
129
- * @return {boolean }
103
+ * @return true if drawer is animating open.
130
104
*/
131
- isOpening ( ) {
105
+ isOpening ( ) : boolean {
132
106
return this . adapter_ . hasClass ( cssClasses . OPENING ) || this . adapter_ . hasClass ( cssClasses . ANIMATE ) ;
133
107
}
134
108
135
109
/**
136
- * Returns true if drawer is animating closed.
137
- * @return {boolean }
110
+ * @return true if drawer is animating closed.
138
111
*/
139
- isClosing ( ) {
112
+ isClosing ( ) : boolean {
140
113
return this . adapter_ . hasClass ( cssClasses . CLOSING ) ;
141
114
}
142
115
143
116
/**
144
117
* Keydown handler to close drawer when key is escape.
145
- * @param evt
146
118
*/
147
- handleKeydown ( evt ) {
119
+ handleKeydown ( evt : KeyboardEvent ) {
148
120
const { keyCode, key} = evt ;
149
-
150
121
const isEscape = key === 'Escape' || keyCode === 27 ;
151
122
if ( isEscape ) {
152
123
this . close ( ) ;
@@ -155,14 +126,13 @@ class MDCDismissibleDrawerFoundation extends MDCFoundation {
155
126
156
127
/**
157
128
* Handles a transition end event on the root element.
158
- * @param {!Event } evt
159
129
*/
160
- handleTransitionEnd ( evt ) {
130
+ handleTransitionEnd ( evt : TransitionEvent ) {
161
131
const { OPENING , CLOSING , OPEN , ANIMATE , ROOT } = cssClasses ;
162
132
163
133
// In Edge, transitionend on ripple pseudo-elements yields a target without classList, so check for Element first.
164
- const isElement = evt . target instanceof Element ;
165
- if ( ! isElement || ! this . adapter_ . elementHasClass ( /** @type { !Element } */ ( evt . target ) , ROOT ) ) {
134
+ const isRootElement = this . isElement_ ( evt . target ) && this . adapter_ . elementHasClass ( evt . target , ROOT ) ;
135
+ if ( ! isRootElement ) {
166
136
return ;
167
137
}
168
138
@@ -182,19 +152,32 @@ class MDCDismissibleDrawerFoundation extends MDCFoundation {
182
152
this . adapter_ . removeClass ( CLOSING ) ;
183
153
}
184
154
155
+ /**
156
+ * Extension point for when drawer finishes open animation.
157
+ */
158
+ protected opened ( ) { } // tslint:disable-line:no-empty
159
+
160
+ /**
161
+ * Extension point for when drawer finishes close animation.
162
+ */
163
+ protected closed ( ) { } // tslint:disable-line:no-empty
164
+
185
165
/**
186
166
* Runs the given logic on the next animation frame, using setTimeout to factor in Firefox reflow behavior.
187
- * @param {Function } callback
188
- * @private
189
167
*/
190
- runNextAnimationFrame_ ( callback ) {
168
+ private runNextAnimationFrame_ ( callback : ( ) => void ) {
191
169
cancelAnimationFrame ( this . animationFrame_ ) ;
192
170
this . animationFrame_ = requestAnimationFrame ( ( ) => {
193
171
this . animationFrame_ = 0 ;
194
172
clearTimeout ( this . animationTimer_ ) ;
195
173
this . animationTimer_ = setTimeout ( callback , 0 ) ;
196
174
} ) ;
197
175
}
176
+
177
+ private isElement_ ( element : unknown ) : element is Element {
178
+ // In Edge, transitionend on ripple pseudo-elements yields a target without classList.
179
+ return Boolean ( ( element as Element ) . classList ) ;
180
+ }
198
181
}
199
182
200
- export default MDCDismissibleDrawerFoundation ;
183
+ export { MDCDismissibleDrawerFoundation as default , MDCDismissibleDrawerFoundation } ;
0 commit comments