diff --git a/src/directives/tooltip/tooltip.test.ts b/src/directives/tooltip/tooltip.test.ts index 46e522076c..c705f89f6e 100644 --- a/src/directives/tooltip/tooltip.test.ts +++ b/src/directives/tooltip/tooltip.test.ts @@ -15,13 +15,21 @@ jest.useFakeTimers(); const localVue = createLocalVue(); localVue.use(VueCompositionAPI); localVue.component('v-button', VButton); -localVue.directive('tooltip', Tooltip); describe('Tooltip', () => { afterEach(() => { document.getElementsByTagName('html')[0].innerHTML = ''; }); + describe('Directive', () => { + it('Registers onmouseenter and onmouseleave event handlers', () => { + const element = document.createElement('div'); + element.addEventListener = jest.fn(); + Tooltip.bind!(element, {} as any, null as any, null as any); + expect(element.addEventListener).toHaveBeenCalledTimes(2); + }); + }); + describe('onEnterTooltip', () => { it('Instant does not wait to show the tooltip', () => { const div = document.createElement('div'); @@ -35,7 +43,7 @@ describe('Tooltip', () => { top: true, instant: true } - }); + })(); expect(tooltip.className).toBe('visible enter top'); }); @@ -52,7 +60,7 @@ describe('Tooltip', () => { top: true, instant: false } - }); + })(); expect(tooltip.className).toBe(''); jest.advanceTimersByTime(650); @@ -60,6 +68,13 @@ describe('Tooltip', () => { }); }); + describe('onLeaveTooltip', () => { + it('Clears the timeout', () => { + onLeaveTooltip()(); + expect(clearTimeout).toHaveBeenCalled(); + }); + }); + describe('updateTooltip', () => { describe('Styles and classes', () => { type Modifier = { @@ -279,13 +294,6 @@ describe('Tooltip', () => { }); }); - describe('onLeaveTooltip', () => { - it('Clears the timeout', () => { - onLeaveTooltip(); - expect(clearTimeout).toHaveBeenCalled(); - }); - }); - describe('animateIn / animateOut', () => { it('Adds the appropriate classes on entering', () => { const div = document.createElement('div'); diff --git a/src/directives/tooltip/tooltip.ts b/src/directives/tooltip/tooltip.ts index e337935660..7dbd8e4b17 100644 --- a/src/directives/tooltip/tooltip.ts +++ b/src/directives/tooltip/tooltip.ts @@ -2,9 +2,9 @@ import { DirectiveOptions } from 'vue'; import { DirectiveBinding } from 'vue/types/options'; const Tooltip: DirectiveOptions = { - inserted(element, binding) { - element.onmouseenter = () => onEnterTooltip(element, binding); - element.onmouseleave = () => onLeaveTooltip(); + bind(element, binding) { + element.addEventListener('onmouseenter', onEnterTooltip(element, binding)); + element.addEventListener('onmouseleave', onLeaveTooltip()); } }; @@ -13,17 +13,28 @@ export default Tooltip; let tooltipTimer: number; export function onEnterTooltip(element: HTMLElement, binding: DirectiveBinding) { - const tooltip = getTooltip(); + return () => { + const tooltip = getTooltip(); - if (binding.modifiers.instant) { - animateIn(tooltip); - updateTooltip(element, binding, tooltip); - } else { - tooltipTimer = setTimeout(() => { + if (binding.modifiers.instant) { animateIn(tooltip); updateTooltip(element, binding, tooltip); - }, 600); - } + } else { + tooltipTimer = setTimeout(() => { + animateIn(tooltip); + updateTooltip(element, binding, tooltip); + }, 600); + } + }; +} + +export function onLeaveTooltip() { + return () => { + const tooltip = getTooltip(); + + clearTimeout(tooltipTimer); + animateOut(tooltip); + }; } export function updateTooltip( @@ -119,13 +130,6 @@ export function updateTooltip( } } -export function onLeaveTooltip() { - const tooltip = getTooltip(); - - clearTimeout(tooltipTimer); - animateOut(tooltip); -} - export function animateIn(tooltip: HTMLElement) { tooltip.classList.add('visible', 'enter'); tooltip.classList.remove('leave', 'leave-active'); diff --git a/src/main.ts b/src/main.ts index c79dc42a9d..061a8d879d 100644 --- a/src/main.ts +++ b/src/main.ts @@ -5,10 +5,12 @@ import './plugins'; import './directives/register'; import './components/register'; import './views/register'; - +import { registerGlobalModules } from './modules/register'; import router from './router'; import i18n from './lang/'; +registerGlobalModules(); + Vue.config.productionTip = false; const app = new Vue({ diff --git a/src/modules/collections/collections.vue b/src/modules/collections/collections.vue index 75982f8419..16d3bd46ae 100644 --- a/src/modules/collections/collections.vue +++ b/src/modules/collections/collections.vue @@ -1,5 +1,15 @@