@@ -5,23 +5,37 @@ import {NavState, MAX_WIDTH_MOBILE_NAV} from './nav-state';
5
5
@customElement ( 'navigation' )
6
6
@inject ( BindingEngine , NavState , Element )
7
7
export class Navigation {
8
- showNavigationEvent = ( ) => {
8
+ constructor ( bindingEngine , navState , element ) {
9
+ this . navState = navState ;
10
+ this . element = element ;
11
+ this . windowResizeListener = ( ) => this . handleResize ( ) ;
12
+ this . outsideClickListener = event => this . handleBlur ( event ) ;
13
+
14
+ bindingEngine . propertyObserver ( this . navState , 'navToggled' ) . subscribe ( this . navStateChanged . bind ( this ) ) ;
15
+ bindingEngine . propertyObserver ( this . navState , 'mobileNavToggled' ) . subscribe ( this . mobileNavStateChanged . bind ( this ) ) ;
16
+ }
17
+
18
+ handleResize ( ) {
9
19
if ( window . innerWidth < MAX_WIDTH_MOBILE_NAV ) {
10
- this . navState . setMobileNav ( true ) ;
11
20
this . element . classList . remove ( 'navigation-pinned' ) ;
21
+ this . navState . setMobileNav ( true ) ;
22
+ this . navState . setMobileNavToggled ( false ) ;
23
+ this . mobileNavStateChanged ( ) ;
12
24
} else {
13
- this . navState . setMobileNav ( false ) ;
14
25
this . element . classList . add ( 'navigation-pinned' ) ;
26
+ this . navState . setMobileNav ( false ) ;
27
+ this . navStateChanged ( ) ;
15
28
}
16
- } ;
29
+ }
17
30
18
- constructor ( bindingEngine , navState , element ) {
19
- this . navState = navState ;
20
- this . element = element ;
31
+ handleBlur ( event ) {
32
+ if ( this . navState . isMobileNav ( ) === false || event . defaultPrevented === true ) {
33
+ return ;
34
+ }
21
35
22
- bindingEngine . propertyObserver ( this . navState , 'navToggled' ) . subscribe ( this . navStateChanged . bind ( this ) ) ;
23
- bindingEngine . propertyObserver ( this . navState , 'mobileNavToggled' ) . subscribe ( this . mobileNavStateChanged . bind ( this ) ) ;
24
- this . showNavigationEvent ( ) ;
36
+ if ( this . element . contains ( event . target ) === false && this . navState . mobileNavToggled === true ) {
37
+ this . navState . toggle ( ) ;
38
+ }
25
39
}
26
40
27
41
navStateChanged ( ) {
@@ -36,15 +50,18 @@ export class Navigation {
36
50
if ( this . navState . isMobileNav ( ) === true && this . navState . mobileNavToggled === true ) {
37
51
this . element . classList . add ( 'show-navigation' ) ;
38
52
} else if ( this . navState . isMobileNav ( ) === true && this . navState . mobileNavToggled === false ) {
39
- this . element . classList . remove ( 'show-navigation' )
53
+ this . element . classList . remove ( 'show-navigation' ) ;
40
54
}
41
55
}
42
56
43
57
attached ( ) {
44
- window . addEventListener ( 'resize' , this . showNavigationEvent ) ;
58
+ window . addEventListener ( 'resize' , this . windowResizeListener ) ;
59
+ document . addEventListener ( 'click' , this . outsideClickListener ) ;
60
+ this . handleResize ( ) ;
45
61
}
46
62
47
63
detached ( ) {
48
- window . removeEventListener ( 'resize' , this . showNavigationEvent ) ;
64
+ window . removeEventListener ( 'resize' , this . windowResizeListener ) ;
65
+ document . removeEventListener ( 'click' , this . outsideClickListener ) ;
49
66
}
50
67
}
0 commit comments