From c82ca12a1c5a359325cb45aaf01b483d1fa0efcb Mon Sep 17 00:00:00 2001 From: GitLab Bot Date: Wed, 26 Aug 2020 15:10:29 +0000 Subject: Add latest changes from gitlab-org/gitlab@master --- .../javascripts/tooltips/components/tooltips.vue | 70 ++++++++++++++++++++++ app/assets/javascripts/tooltips/index.js | 58 ++++++++++++++++++ 2 files changed, 128 insertions(+) create mode 100644 app/assets/javascripts/tooltips/components/tooltips.vue create mode 100644 app/assets/javascripts/tooltips/index.js (limited to 'app/assets/javascripts/tooltips') diff --git a/app/assets/javascripts/tooltips/components/tooltips.vue b/app/assets/javascripts/tooltips/components/tooltips.vue new file mode 100644 index 00000000000..4edfddd0f85 --- /dev/null +++ b/app/assets/javascripts/tooltips/components/tooltips.vue @@ -0,0 +1,70 @@ + + diff --git a/app/assets/javascripts/tooltips/index.js b/app/assets/javascripts/tooltips/index.js new file mode 100644 index 00000000000..985f3350a62 --- /dev/null +++ b/app/assets/javascripts/tooltips/index.js @@ -0,0 +1,58 @@ +import Vue from 'vue'; +import Tooltips from './components/tooltips.vue'; + +let app; + +const EVENTS_MAP = { + hover: 'mouseenter', + click: 'click', + focus: 'focus', +}; + +const DEFAULT_TRIGGER = 'hover focus'; + +const tooltipsApp = () => { + if (!app) { + app = new Vue({ + render(h) { + return h(Tooltips, { + props: { + elements: this.elements, + }, + ref: 'tooltips', + }); + }, + }).$mount(); + } + + return app; +}; + +const isTooltip = (node, selector) => node.matches && node.matches(selector); + +const addTooltips = (elements, config) => { + tooltipsApp().$refs.tooltips.addTooltips(Array.from(elements), config); +}; + +const handleTooltipEvent = (rootTarget, e, selector, config = {}) => { + for (let { target } = e; target && target !== rootTarget; target = target.parentNode) { + if (isTooltip(target, selector)) { + addTooltips([target], { + show: true, + ...config, + }); + break; + } + } +}; + +export const initTooltips = (selector, config = {}) => { + const triggers = config?.triggers || DEFAULT_TRIGGER; + const events = triggers.split(' ').map(trigger => EVENTS_MAP[trigger]); + + events.forEach(event => { + document.addEventListener(event, e => handleTooltipEvent(document, e, selector, config), true); + }); + + return tooltipsApp(); +}; -- cgit v1.2.3