|
1 import Ember from 'ember'; |
|
2 |
|
3 /** |
|
4 * Mixin to detect outside click for a component. |
|
5 * taken from http://stackoverflow.com/a/32115231 |
|
6 */ |
|
7 export default Ember.Mixin.create({ |
|
8 onOutsideClick: Ember.K, |
|
9 onOutsideClickEnabled: true, |
|
10 |
|
11 handleOutsideClick: function(event) { |
|
12 var element = this.$(); |
|
13 var target = Ember.$(event.target); |
|
14 if(element && target) { |
|
15 console.log("OUTSIDE CLICK", element.has(target).length, element.is(target)); |
|
16 if (!(element.has(target).length || element.is(target))) { |
|
17 this.onOutsideClick(); |
|
18 } |
|
19 } |
|
20 }, |
|
21 |
|
22 _registerOutsideClickListener() { |
|
23 let clickHandler = this.get('handleOutsideClick').bind(this); |
|
24 |
|
25 return Ember.$(document).on('click', clickHandler); |
|
26 }, |
|
27 |
|
28 _unregisterOutsideClickListener() { |
|
29 let clickHandler = this.get('handleOutsideClick').bind(this); |
|
30 |
|
31 return Ember.$(document).off('click', clickHandler); |
|
32 }, |
|
33 |
|
34 _onOutsideClickEnabledChanged: Ember.observer('onOutsideClickEnabled', function() { |
|
35 if(this.get('onOutsideClickEnabled')) { |
|
36 this._registerOutsideClickListener(); |
|
37 } |
|
38 else { |
|
39 this._unregisterOutsideClickListener(); |
|
40 } |
|
41 }), |
|
42 |
|
43 setupOutsideClickListener: Ember.on('didInsertElement', function() { |
|
44 this._super(...arguments); |
|
45 if(this.get('onOutsideClickEnabled')) { |
|
46 return this._registerOutsideClickListener(); |
|
47 } |
|
48 else { |
|
49 return Ember.$(document); |
|
50 } |
|
51 }), |
|
52 |
|
53 removeOutsideClickListener: Ember.on('willDestroyElement', function() { |
|
54 return this._unregisterOutsideClickListener(); |
|
55 }) |
|
56 }); |