Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuke Bennett <lukeeeebennettplus@gmail.com>2018-03-21 21:23:33 +0300
committerLuke Bennett <lukeeeebennettplus@gmail.com>2018-03-21 21:23:33 +0300
commit0488d44cc2cc55808cf5aa17cb1b0c5423c958db (patch)
treeb1ca8d2a7cd14012539ebf8334509b59fd13925c /app/assets/javascripts/shared
parenta5ab67228f07f6fa1a5db7da07601643b87f23ff (diff)
Add popover
Diffstat (limited to 'app/assets/javascripts/shared')
-rw-r--r--app/assets/javascripts/shared/popover.js84
1 files changed, 84 insertions, 0 deletions
diff --git a/app/assets/javascripts/shared/popover.js b/app/assets/javascripts/shared/popover.js
new file mode 100644
index 00000000000..48894c2b100
--- /dev/null
+++ b/app/assets/javascripts/shared/popover.js
@@ -0,0 +1,84 @@
+export default class Popover {
+ constructor(trigger, content) {
+ this.isOpen = false;
+
+ this.$popover = $(trigger).popover({
+ content,
+ html: true,
+ placement: 'bottom',
+ trigger: 'manual',
+ });
+ }
+
+ init() {
+ this.registerClickOpenListener();
+ }
+
+ openPopover() {
+ if (this.isOpen) return;
+
+ this.$popover.popover('show');
+ this.$popover.one('shown.bs.popover', this.enableClose.bind(this));
+ this.isOpen = true;
+ }
+
+ closePopover() {
+ if (!this.isOpen) return;
+
+ this.$popover.popover('hide');
+ this.disableClose();
+ this.isOpen = false;
+ }
+
+ closePopoverClick(event) {
+ const $target = $(event.target);
+
+ if ($target.is(this.$popover) ||
+ $target.is('.popover') ||
+ $target.parents('.popover').length > 0) return;
+
+ this.closePopover();
+ }
+
+ closePopoverMouseleave() {
+ setTimeout(() => {
+ if (this.$popover.is(':hover') ||
+ (this.$popover.siblings('.popover').length > 0 &&
+ this.$popover.siblings('.popover').is(':hover'))) return;
+
+ this.closePopover();
+ }, 1500);
+ }
+
+ registerClickOpenListener() {
+ this.$popover.on('click.glPopover.open', this.openPopover.bind(this));
+ }
+
+ registerClickCloseListener() {
+ $(document.body).on('click.glPopover.close', this.closePopoverClick.bind(this));
+ }
+
+ registerMouseleaveCloseListener() {
+ this.$popover.on('mouseleave.glPopover.close', this.closePopoverMouseleave.bind(this));
+ this.$popover.siblings('.popover').on('mouseleave.glPopover.close', this.closePopoverMouseleave.bind(this));
+ }
+
+ destroyMouseleaveCloseListener() {
+ this.$popover.off('mouseleave.glPopover.close');
+ this.$popover.siblings('.popover').on('mouseleave.glPopover.close');
+ }
+
+ enableClose() {
+ this.registerClickCloseListener();
+ this.registerMouseleaveCloseListener();
+ }
+
+ disableClose() {
+ Popover.destroyClickCloseListener();
+ this.destroyMouseleaveCloseListener();
+ }
+
+ static destroyClickCloseListener() {
+ $(document.body).off('click.glPopover.close');
+ }
+}