1
1
import {
2
2
AfterViewInit ,
3
3
Component ,
4
+ ContentChildren ,
4
5
ElementRef ,
5
6
EventEmitter ,
6
7
HostBinding ,
7
8
Input ,
8
- Output ,
9
9
OnDestroy ,
10
+ Output ,
10
11
QueryList ,
11
12
Renderer2 ,
12
13
ViewChild ,
13
- ViewChildren ,
14
14
ViewEncapsulation
15
15
} from '@angular/core' ;
16
16
import { MDCMenuAdapter } from './menu-adapter' ;
17
- import { MenuItemDirective } from './menu-item' ;
17
+ import { MenuItemDirective } from './menu-item.directive ' ;
18
18
19
- const { MDCSimpleMenuFoundation } = require ( '@material/menu' ) ;
19
+ const { MDCSimpleMenuFoundation } = require ( '@material/menu/simple ' ) ;
20
20
const { getTransformPropertyName } = require ( '@material/menu/util' ) ;
21
21
const MDC_MENU_STYLES = require ( '@material/menu/mdc-menu.scss' ) ;
22
22
const MDC_LIST_STYLES = require ( '@material/list/mdc-list.scss' ) ;
@@ -25,18 +25,19 @@ type UnlistenerMap = WeakMap<EventListener, Function>;
25
25
26
26
@Component ( {
27
27
selector : 'mdc-menu' ,
28
- templateUrl : './menu.html' ,
29
- styles : [ String ( MDC_MENU_STYLES ) ] ,
28
+ templateUrl : './menu.component. html' ,
29
+ styles : [ String ( MDC_MENU_STYLES ) , String ( MDC_LIST_STYLES ) ] ,
30
30
encapsulation : ViewEncapsulation . None
31
31
} )
32
32
export class MenuComponent implements AfterViewInit , OnDestroy {
33
- @Input ( ) items : MenuItemDirective [ ] ;
33
+ private previousFocus_ : any ;
34
+
34
35
@Output ( ) cancel : EventEmitter < void > = new EventEmitter < void > ( ) ;
35
36
@Output ( ) select : EventEmitter < number > = new EventEmitter < number > ( ) ;
36
37
@HostBinding ( 'class' ) className : string = 'mdc-simple-menu' ;
37
38
@HostBinding ( 'tabindex' ) tabindex : number = - 1 ;
38
- @ViewChild ( 'itemsContainer ' ) public itemsContainerEl : ElementRef ;
39
- @ViewChildren ( MenuItemDirective ) menuItems : QueryList < MenuItemDirective > ;
39
+ @ViewChild ( 'menuContainer ' ) public menuContainerEl : ElementRef ;
40
+ @ContentChildren ( MenuItemDirective ) menuItems : QueryList < MenuItemDirective > ;
40
41
41
42
private _unlisteners : Map < string , UnlistenerMap > = new Map < string , UnlistenerMap > ( ) ;
42
43
@@ -49,11 +50,14 @@ export class MenuComponent implements AfterViewInit, OnDestroy {
49
50
const { _renderer : renderer , _root : root } = this ;
50
51
renderer . removeClass ( root . nativeElement , className ) ;
51
52
} ,
53
+ getAttributeForEventTarget : ( target : any , attributeName ) => {
54
+ return target . getAttribute ( attributeName ) ;
55
+ } ,
52
56
hasClass : ( className : string ) => {
53
57
const { _root : root } = this ;
54
58
return root . nativeElement . classList . contains ( className ) ;
55
59
} ,
56
- hasNecessaryDom : ( ) => Boolean ( this . itemsContainerEl ) ,
60
+ hasNecessaryDom : ( ) => Boolean ( this . menuContainerEl ) ,
57
61
getInnerDimensions : ( ) => {
58
62
const { _root : root } = this ;
59
63
return {
@@ -80,13 +84,11 @@ export class MenuComponent implements AfterViewInit, OnDestroy {
80
84
renderer . setStyle ( root . nativeElement , getTransformPropertyName ( window ) , `scale(${ x } , ${ y } )` ) ;
81
85
} ,
82
86
setInnerScale : ( x : number , y : number ) => {
83
- if ( this . itemsContainerEl ) {
84
- const { _renderer : renderer , _root : root } = this ;
85
- renderer . setStyle ( this . itemsContainerEl . nativeElement , getTransformPropertyName ( window ) , `scale(${ x } , ${ y } )` ) ;
86
- }
87
+ const { _renderer : renderer , _root : root } = this ;
88
+ renderer . setStyle ( this . menuContainerEl . nativeElement , getTransformPropertyName ( window ) , `scale(${ x } , ${ y } )` ) ;
87
89
} ,
88
90
getNumberOfItems : ( ) => {
89
- return this . items ? this . items . length : 0 ;
91
+ return this . menuItems ? this . menuItems . length : 0 ;
90
92
} ,
91
93
registerInteractionHandler : ( type : string , handler : EventListener ) => {
92
94
if ( this . _root ) {
@@ -96,36 +98,37 @@ export class MenuComponent implements AfterViewInit, OnDestroy {
96
98
deregisterInteractionHandler : ( type : string , handler : EventListener ) => {
97
99
this . unlisten_ ( type , handler ) ;
98
100
} ,
99
- registerDocumentClickHandler : ( handler : EventListener ) => {
101
+ registerBodyClickHandler : ( handler : EventListener ) => {
100
102
if ( this . _root ) {
101
103
this . listen_ ( 'click' , handler , this . _root . nativeElement . ownerDocument ) ;
102
104
}
103
105
} ,
104
- deregisterDocumentClickHandler : ( handler : EventListener ) => {
106
+ deregisterBodyClickHandler : ( handler : EventListener ) => {
105
107
this . unlisten_ ( 'click' , handler ) ;
106
108
} ,
107
109
getYParamsForItemAtIndex : ( index : number ) => {
108
- const { offsetTop : top , offsetHeight : height } = this . menuItems . toArray ( ) [ index ] . root . nativeElement ;
110
+ const { offsetTop : top , offsetHeight : height } = this . menuItems . toArray ( ) [ index ] . itemEl . nativeElement ;
109
111
return { top, height } ;
110
112
} ,
111
113
setTransitionDelayForItemAtIndex : ( index : number , value : string ) => {
112
114
const { _renderer : renderer , _root : root } = this ;
113
- renderer . setStyle ( this . menuItems . toArray ( ) [ index ] . root . nativeElement , 'transition-delay' , value ) ;
115
+ renderer . setStyle ( this . menuItems . toArray ( ) [ index ] . itemEl . nativeElement , 'transition-delay' , value ) ;
114
116
} ,
115
- getIndexForEventTarget : ( target : any ) => {
116
- if ( ! target . attributes . id ) {
117
- return - 1 ;
118
- }
119
- return this . items . findIndex ( _ => _ . id == target . attributes . id . value ) ;
117
+ getIndexForEventTarget : ( target : EventTarget ) => {
118
+ return this . menuItems . toArray ( ) . findIndex ( ( _ ) => _ . itemEl . nativeElement === target ) ;
120
119
} ,
121
120
notifySelected : ( evtData ) => {
122
121
this . select . emit ( evtData . index ) ;
123
122
} ,
124
123
notifyCancel : ( ) => {
125
124
this . cancel . emit ( ) ;
126
125
} ,
127
- saveFocus : ( ) => { } , /* TODO */
128
- restoreFocus : ( ) => { } , /* TODO */
126
+ saveFocus : ( ) => this . previousFocus_ = document . activeElement ,
127
+ restoreFocus : ( ) => {
128
+ if ( this . previousFocus_ ) {
129
+ this . previousFocus_ . focus ( )
130
+ }
131
+ } ,
129
132
isFocused : ( ) => {
130
133
const { _root : root } = this ;
131
134
return root . nativeElement . ownerDocument . activeElement === root . nativeElement ;
@@ -136,12 +139,12 @@ export class MenuComponent implements AfterViewInit, OnDestroy {
136
139
getFocusedItemIndex : ( ) => {
137
140
const { _root : root } = this ;
138
141
return this . menuItems . length ? this . menuItems . toArray ( ) . findIndex ( _ =>
139
- _ . root . nativeElement === root . nativeElement . ownerDocument . activeElement ) : - 1 ;
142
+ _ . itemEl . nativeElement === root . nativeElement . ownerDocument . activeElement ) : - 1 ;
140
143
} ,
141
144
focusItemAtIndex : ( index : number ) => {
142
145
const { _root : root } = this ;
143
146
if ( this . menuItems . toArray ( ) [ index ] !== undefined ) {
144
- this . menuItems . toArray ( ) [ index ] . root . nativeElement . focus ( ) ;
147
+ this . menuItems . toArray ( ) [ index ] . itemEl . nativeElement . focus ( ) ;
145
148
} else {
146
149
// set focus back to root element when index is undefined
147
150
root . nativeElement . focus ( ) ;
0 commit comments