Skip to content

Commit 2ed52ae

Browse files
committed
Temporary patch for coreui/coreui-vue#203
1 parent 1c53633 commit 2ed52ae

File tree

2 files changed

+105
-1
lines changed

2 files changed

+105
-1
lines changed
Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
// Copied from https://github.com/coreui/coreui-vue/blob/v4.2.0/packages/coreui-vue/src/directives/v-c-tooltip.ts
2+
// And patched -> https://github.com/coreui/coreui-vue/pull/203
3+
4+
import { DirectiveBinding } from 'vue'
5+
import { createPopper } from '@popperjs/core'
6+
7+
const getUID = (prefix: string) => {
8+
do {
9+
prefix += Math.floor(Math.random() * 1000000)
10+
} while (document.getElementById(prefix))
11+
12+
return prefix
13+
}
14+
15+
const createTooltipElement = (id: string, content: string): HTMLDivElement => {
16+
const tooltip = document.createElement('div')
17+
tooltip.id = id
18+
tooltip.classList.add('tooltip', 'bs-tooltip-auto', 'fade')
19+
tooltip.setAttribute('role', 'tooltip')
20+
tooltip.innerHTML = `<div class="tooltip-arrow" data-popper-arrow></div>
21+
<div class="tooltip-inner" id="">${content}</div>`
22+
return tooltip
23+
}
24+
25+
const addTooltipElement = (tooltip: HTMLDivElement, el: HTMLElement, popperOptions: any) => {
26+
document.body.appendChild(tooltip)
27+
createPopper(el, tooltip, popperOptions)
28+
setTimeout(() => {
29+
tooltip.classList.add('show')
30+
}, 1)
31+
}
32+
33+
const removeTooltipElement = (tooltip: HTMLDivElement) => {
34+
tooltip.classList.remove('show')
35+
setTimeout(() => {
36+
document.body.removeChild(tooltip)
37+
}, 300)
38+
}
39+
40+
const toggleTooltipElement = (tooltip: HTMLDivElement, el: HTMLElement, popperOptions: any) => {
41+
const popperElement = document.getElementById(tooltip.id)
42+
if (popperElement && popperElement.classList.contains('show')) {
43+
removeTooltipElement(tooltip)
44+
return
45+
}
46+
addTooltipElement(tooltip, el, popperOptions)
47+
}
48+
49+
const vctooltip = {
50+
mounted(el: HTMLElement, binding: DirectiveBinding): void {
51+
const value = binding.value
52+
const content = typeof value === 'string' ? value : value.content ? value.content : ''
53+
const trigger = value.trigger ? value.trigger : 'hover'
54+
55+
// Popper Config
56+
const offset = value.offset ? value.offset : [0, 0]
57+
const placement = value.placement ? value.placement : 'top'
58+
59+
const popperOptions = {
60+
placement: placement,
61+
modifiers: [
62+
{
63+
name: 'offset',
64+
options: {
65+
offset: offset,
66+
},
67+
},
68+
],
69+
}
70+
71+
const tooltipUID = getUID('tooltip')
72+
binding.arg = tooltipUID
73+
const tooltip = createTooltipElement(tooltipUID, content)
74+
75+
trigger.includes('click') &&
76+
el.addEventListener('click', () => {
77+
toggleTooltipElement(tooltip, el, popperOptions)
78+
})
79+
80+
if (trigger.includes('focus')) {
81+
el.addEventListener('focus', () => {
82+
addTooltipElement(tooltip, el, popperOptions)
83+
})
84+
el.addEventListener('blur', () => {
85+
removeTooltipElement(tooltip)
86+
})
87+
}
88+
89+
if (trigger.includes('hover')) {
90+
el.addEventListener('mouseenter', () => {
91+
addTooltipElement(tooltip, el, popperOptions)
92+
})
93+
el.addEventListener('mouseleave', () => {
94+
removeTooltipElement(tooltip)
95+
})
96+
}
97+
},
98+
beforeUnmount(_el: HTMLElement, binding: DirectiveBinding): void {
99+
const tooltip = binding.arg && document.getElementById(binding.arg)
100+
tooltip && tooltip.remove();
101+
}
102+
}
103+
104+
export { vctooltip };

frontend/src/ts/setup-coreui.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ import {
1919

2020
import {
2121
vctooltip
22-
} from "@coreui/vue";
22+
} from "./patches/coreui-tooltip";
2323

2424
import { CIcon } from "@coreui/icons-vue";
2525
import {

0 commit comments

Comments
 (0)