-
Notifications
You must be signed in to change notification settings - Fork 332
/
paper-sidenav-inner.js
119 lines (101 loc) · 3.19 KB
/
paper-sidenav-inner.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
/**
* @module ember-paper
*/
/* globals FastBoot */
import { inject as service } from '@ember/service';
import Component from '@ember/component';
import { computed } from '@ember/object';
import { run } from '@ember/runloop';
import TransitionMixin from 'ember-css-transitions/mixins/transition-mixin';
import { invokeAction } from 'ember-invoke-action';
/**
* @class PaperSidenavInner
* @extends Ember.Component
* @uses TransitionMixin
*/
export default Component.extend(TransitionMixin, {
tagName: 'md-sidenav',
attributeBindings: ['tabindex'],
classNameBindings: ['positionClass'],
// eslint-disable-next-line ember/avoid-leaking-state-in-ember-objects
transitionClassNameBindings: ['isLockedOpen:md-locked-open', 'closed:md-closed'],
constants: service(),
paperSidenav: service(),
name: 'default',
position: 'left',
lockedOpen: 'gt-sm',
closed: true,
closeOnClick: true,
tabindex: -1,
positionClass: computed('position', function() {
return `md-sidenav-${this.get('position')}`;
}),
init() {
// need to updateLockedOpen() first because otherwise the transition classes
// would be applied due to transition mixin's `init`
if (typeof FastBoot === 'undefined') {
this.updateLockedOpen();
}
this._super(...arguments);
this.get('paperSidenav').register(this.get('name'), this);
},
didInsertElement() {
this._super(...arguments);
this._updateOnResize = run.bind(this, this.updateLockedOpen);
window.addEventListener('resize', this._updateOnResize);
this.updateLockedOpen();
},
didReceiveAttrs() {
this._super(...arguments);
if (typeof FastBoot === 'undefined') {
this.updateLockedOpen();
}
},
willDestroyElement() {
this._super(...arguments);
window.removeEventListener('resize', this._updateOnResize);
this.get('paperSidenav').unregister(this.get('name'), this);
this._updateOnResize = null;
},
updateLockedOpen() {
let lockedOpen = this.get('lockedOpen');
let isLockedOpen;
// if `true` or `false` is specified, always/never "lock open"
// otherwise proceed with normal matchMedia test
if (typeof lockedOpen === 'boolean') {
isLockedOpen = lockedOpen;
} else {
let mediaQuery = this.get('constants').MEDIA[lockedOpen] || lockedOpen;
isLockedOpen = window.matchMedia(mediaQuery).matches;
}
let coercedIsLockedOpen = !!this.get('isLockedOpen');
if (coercedIsLockedOpen !== isLockedOpen) {
this.set('isLockedOpen', isLockedOpen);
// if sidenav is open and we enter lockedOpen,
// make the sidenav enter the "closed" state
if (!this.get('closed') && isLockedOpen) {
invokeAction(this, 'onToggle', false);
}
}
},
click() {
if (this.get('closeOnClick') && !this.get('isLockedOpen')) {
invokeAction(this, 'onToggle', false);
}
},
open() {
if (this.get('closed') && this.get('isLockedOpen')) {
invokeAction(this, 'onToggle', true);
}
},
close() {
if (!this.get('closed') && !this.get('isLockedOpen')) {
invokeAction(this, 'onToggle', false);
}
},
toggle() {
if (!this.get('isLockedOpen')) {
invokeAction(this, 'onToggle', this.get('closed'));
}
}
});