This repository has been archived on 2023-03-18. You can view files and clone it, but cannot push or open issues or pull requests.
osr-discourse-src/app/assets/javascripts/discourse/widgets/click-hook.js.es6
2016-02-26 16:53:56 -05:00

64 lines
1.4 KiB
JavaScript

/*eslint no-loop-func:0*/
const CLICK_ATTRIBUTE_NAME = '_discourse_click_widget';
const CLICK_OUTSIDE_ATTRIBUTE_NAME = '_discourse_click_outside_widget';
export class WidgetClickHook {
constructor(widget) {
this.widget = widget;
}
hook(node) {
node[CLICK_ATTRIBUTE_NAME] = this.widget;
}
unhook(node) {
node[CLICK_ATTRIBUTE_NAME] = null;
}
};
export class WidgetClickOutsideHook {
constructor(widget) {
this.widget = widget;
}
hook(node) {
node.setAttribute('data-click-outside', true);
node[CLICK_OUTSIDE_ATTRIBUTE_NAME] = this.widget;
}
unhook(node) {
node.removeAttribute('data-click-outside');
node[CLICK_OUTSIDE_ATTRIBUTE_NAME] = null;
}
};
let _watchingDocument = false;
WidgetClickHook.setupDocumentCallback = function() {
if (_watchingDocument) { return; }
$(document).on('click.discourse-widget', e => {
let node = e.target;
while (node) {
const widget = node[CLICK_ATTRIBUTE_NAME];
if (widget) {
return widget.rerenderResult(() => widget.click(e));
}
node = node.parentNode;
}
node = e.target;
const $outside = $('[data-click-outside]');
$outside.each((i, outNode) => {
if (outNode.contains(node)) { return; }
const widget = outNode[CLICK_OUTSIDE_ATTRIBUTE_NAME];
if (widget) {
return widget.clickOutside(e);
}
});
});
_watchingDocument = true;
};