From 2b1e7f7dac0fa5d7bb3bdf415cec1b3c67ed77b0 Mon Sep 17 00:00:00 2001 From: GitLab Bot Date: Tue, 27 Oct 2020 15:08:39 +0000 Subject: Add latest changes from gitlab-org/gitlab@master --- .../javascripts/popovers/components/popovers.vue | 92 ++++++++++++++++++++++ app/assets/javascripts/popovers/index.js | 51 ++++++++++++ 2 files changed, 143 insertions(+) create mode 100644 app/assets/javascripts/popovers/components/popovers.vue create mode 100644 app/assets/javascripts/popovers/index.js (limited to 'app/assets/javascripts/popovers') diff --git a/app/assets/javascripts/popovers/components/popovers.vue b/app/assets/javascripts/popovers/components/popovers.vue new file mode 100644 index 00000000000..3bb6d284264 --- /dev/null +++ b/app/assets/javascripts/popovers/components/popovers.vue @@ -0,0 +1,92 @@ + + + diff --git a/app/assets/javascripts/popovers/index.js b/app/assets/javascripts/popovers/index.js new file mode 100644 index 00000000000..bfb61f02a3a --- /dev/null +++ b/app/assets/javascripts/popovers/index.js @@ -0,0 +1,51 @@ +import Vue from 'vue'; +import { toArray } from 'lodash'; +import PopoversComponent from './components/popovers.vue'; + +let app; + +const APP_ELEMENT_ID = 'gl-popovers-app'; + +const getPopoversApp = () => { + if (!app) { + const container = document.createElement('div'); + container.setAttribute('id', APP_ELEMENT_ID); + document.body.appendChild(container); + + const Popovers = Vue.extend(PopoversComponent); + app = new Popovers(); + app.$mount(`#${APP_ELEMENT_ID}`); + } + + return app; +}; + +const isPopover = (node, selector) => node.matches && node.matches(selector); + +const handlePopoverEvent = (rootTarget, e, selector) => { + for (let { target } = e; target && target !== rootTarget; target = target.parentNode) { + if (isPopover(target, selector)) { + getPopoversApp().addPopovers([target]); + break; + } + } +}; + +export const initPopovers = () => { + ['mouseenter', 'focus', 'click'].forEach(event => { + document.addEventListener( + event, + e => handlePopoverEvent(document, e, '[data-toggle="popover"]'), + true, + ); + }); + + return getPopoversApp(); +}; + +export const dispose = elements => toArray(elements).forEach(getPopoversApp().dispose); + +export const destroy = () => { + getPopoversApp().$destroy(); + app = null; +}; -- cgit v1.2.1