server/bo_client/app/mixins/click-outside-mixin.js
changeset 28 b0b56e0f8c7f
child 537 d2e6ee099125
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/server/bo_client/app/mixins/click-outside-mixin.js	Fri Jan 15 15:35:00 2016 +0100
@@ -0,0 +1,56 @@
+import Ember from 'ember';
+
+/**
+ * Mixin to detect outside click for a component.
+ * taken from http://stackoverflow.com/a/32115231
+ */
+export default Ember.Mixin.create({
+  onOutsideClick: Ember.K,
+  onOutsideClickEnabled: true,
+
+  handleOutsideClick: function(event) {
+    var element = this.$();
+    var target = Ember.$(event.target);
+    if(element && target) {
+      console.log("OUTSIDE CLICK", element.has(target).length, element.is(target));
+      if (!(element.has(target).length || element.is(target))) {
+        this.onOutsideClick();
+      }
+    }
+  },
+
+  _registerOutsideClickListener() {
+    let clickHandler = this.get('handleOutsideClick').bind(this);
+
+    return Ember.$(document).on('click', clickHandler);
+  },
+
+  _unregisterOutsideClickListener() {
+    let clickHandler = this.get('handleOutsideClick').bind(this);
+
+    return Ember.$(document).off('click', clickHandler);
+  },
+
+  _onOutsideClickEnabledChanged: Ember.observer('onOutsideClickEnabled', function() {
+    if(this.get('onOutsideClickEnabled')) {
+      this._registerOutsideClickListener();
+    }
+    else {
+      this._unregisterOutsideClickListener();
+    }
+  }),
+
+  setupOutsideClickListener: Ember.on('didInsertElement', function() {
+    this._super(...arguments);
+    if(this.get('onOutsideClickEnabled')) {
+      return this._registerOutsideClickListener();
+    }
+    else {
+      return Ember.$(document);
+    }
+  }),
+
+  removeOutsideClickListener: Ember.on('willDestroyElement', function() {
+    return this._unregisterOutsideClickListener();
+  })
+});