Skip to content

Commit 175fe4d

Browse files
feat(tooltip): ✨ Handle tooltip config as value instead of modifiers
1 parent c912a04 commit 175fe4d

File tree

1 file changed

+27
-5
lines changed

1 file changed

+27
-5
lines changed

packages/bootstrap-vue-3/src/directives/BTooltip.ts

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,14 @@
22
import {Directive, DirectiveBinding} from 'vue'
33
import {Tooltip} from 'bootstrap'
44

5-
const resolveTrigger = (modifiers: DirectiveBinding['modifiers']): Tooltip.Options['trigger'] => {
5+
const resolveTrigger = (
6+
modifiers: DirectiveBinding['modifiers'],
7+
value: DirectiveBinding['value']
8+
): Tooltip.Options['trigger'] => {
9+
if (value?.trigger) {
10+
return value.trigger
11+
}
12+
613
if (modifiers.manual) {
714
return 'manual'
815
}
@@ -29,8 +36,13 @@ const resolveTrigger = (modifiers: DirectiveBinding['modifiers']): Tooltip.Optio
2936
}
3037

3138
const resolvePlacement = (
32-
modifiers: DirectiveBinding['modifiers']
39+
modifiers: DirectiveBinding['modifiers'],
40+
value: DirectiveBinding['value']
3341
): Tooltip.Options['placement'] => {
42+
if (value?.placement) {
43+
return value.placement
44+
}
45+
3446
if (modifiers.left) {
3547
return 'left'
3648
}
@@ -54,16 +66,22 @@ const resolveDelay = (values: DirectiveBinding['value']): Tooltip.Options['delay
5466
return 0
5567
}
5668

69+
const resolveTitle = (values: DirectiveBinding['value']): Tooltip.Options['title'] =>
70+
typeof values === 'object' ? values?.title : values
71+
5772
/**
5873
* @external
5974
*/
6075
const BTooltip: Directive<HTMLElement> = {
6176
beforeMount(el, binding) {
6277
el.setAttribute('data-bs-toggle', 'tooltip')
78+
if (!el.getAttribute('title')) {
79+
el.setAttribute('title', resolveTitle(binding.value).toString())
80+
}
6381

6482
const isHtml = /<("[^"]*"|'[^']*'|[^'">])*>/.test(el.title)
65-
const trigger = resolveTrigger(binding.modifiers)
66-
const placement = resolvePlacement(binding.modifiers)
83+
const trigger = resolveTrigger(binding.modifiers, binding.value)
84+
const placement = resolvePlacement(binding.modifiers, binding.value)
6785
const delay = resolveDelay(binding.value)
6886
const title = el.getAttribute('title')
6987

@@ -78,7 +96,11 @@ const BTooltip: Directive<HTMLElement> = {
7896
el.setAttribute('data-bs-original-title', title)
7997
}
8098
},
81-
updated(el) {
99+
updated(el, binding) {
100+
if (!el.getAttribute('title')) {
101+
el.setAttribute('title', resolveTitle(binding.value).toString())
102+
}
103+
82104
const title = el.getAttribute('title')
83105
const originalTitle = el.getAttribute('data-bs-original-title')
84106
const instance = Tooltip.getInstance(el)

0 commit comments

Comments
 (0)