server/bo_client/app/mixins/click-outside-mixin.js
author ymh <ymh.work@gmail.com>
Mon, 06 Feb 2017 15:22:39 +0100
changeset 500 4f507ba2bb4c
parent 28 b0b56e0f8c7f
child 537 d2e6ee099125
permissions -rw-r--r--
add alternativeTitle. Prepare #0025746

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();
  })
});