Skip to content

Commit 2d38862

Browse files
committed
refactor(CDropdown): update triggers
1 parent 8c6f47b commit 2d38862

File tree

2 files changed

+36
-10
lines changed

2 files changed

+36
-10
lines changed

packages/coreui-vue/src/components/dropdown/CDropdown.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -197,11 +197,16 @@ const CDropdown = defineComponent({
197197
popper.value = undefined
198198
}
199199

200-
const toggleMenu = () => {
200+
const toggleMenu = (_visible?: boolean) => {
201201
if (props.disabled) {
202202
return
203203
}
204204

205+
if (typeof _visible == 'boolean') {
206+
visible.value = _visible
207+
return
208+
}
209+
205210
if (visible.value === true) {
206211
visible.value = false
207212
return

packages/coreui-vue/src/components/dropdown/CDropdownToggle.ts

Lines changed: 30 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
1-
import { cloneVNode, defineComponent, h, inject, onMounted, Ref, ref } from 'vue'
1+
import { cloneVNode, defineComponent, h, inject, onMounted, PropType, Ref, ref } from 'vue'
22
import { CButton } from '../button'
33
import { Color, Shape } from '../props'
4+
import { Triggers } from '../Types'
45

56
const CDropdownToggle = defineComponent({
67
name: 'CDropdownToggle',
@@ -70,6 +71,16 @@ const CDropdownToggle = defineComponent({
7071
type: Boolean,
7172
required: false,
7273
},
74+
/**
75+
* Sets which event handlers you’d like provided to your toggle prop. You can specify one trigger or an array of them.
76+
*
77+
* @type 'hover' | 'focus' | 'click'
78+
*/
79+
trigger: {
80+
type: String as PropType<Triggers>,
81+
default: 'click',
82+
required: false,
83+
},
7384
/**
7485
* Set the button variant to an outlined button or a ghost button.
7586
*
@@ -89,7 +100,8 @@ const CDropdownToggle = defineComponent({
89100
const dropdownToggleRef = inject('dropdownToggleRef') as Ref<HTMLElement>
90101
const dropdownVariant = inject('variant') as string
91102
const visible = inject('visible') as Ref<boolean>
92-
const toggleMenu = inject('toggleMenu') as () => void
103+
const toggleMenu = inject('toggleMenu') as (_visible?: boolean) => void
104+
93105
const className = [
94106
{
95107
'dropdown-toggle': props.caret,
@@ -99,6 +111,18 @@ const CDropdownToggle = defineComponent({
99111
},
100112
]
101113

114+
const triggers = {
115+
...((props.trigger === 'click' || props.trigger.includes('click')) &&
116+
!props.disabled && {
117+
onClick: () => toggleMenu(),
118+
}),
119+
...((props.trigger === 'focus' || props.trigger.includes('focus')) &&
120+
!props.disabled && {
121+
onfocus: () => toggleMenu(true),
122+
onblur: () => toggleMenu(false),
123+
}),
124+
}
125+
102126
onMounted(() => {
103127
if (buttonRef.value) {
104128
dropdownToggleRef.value = buttonRef.value.$el
@@ -110,8 +134,8 @@ const CDropdownToggle = defineComponent({
110134
? slots.default &&
111135
slots.default().map((slot) =>
112136
cloneVNode(slot, {
113-
onClick: () => toggleMenu(),
114137
ref: dropdownToggleRef,
138+
...triggers,
115139
}),
116140
)
117141
: dropdownVariant === 'nav-item'
@@ -128,11 +152,8 @@ const CDropdownToggle = defineComponent({
128152
],
129153
disabled: props.disabled,
130154
href: '#',
131-
onClick: (event: Event) => {
132-
event.preventDefault()
133-
toggleMenu()
134-
},
135155
ref: dropdownToggleRef,
156+
...triggers,
136157
},
137158
{ default: () => slots.default && slots.default() },
138159
)
@@ -148,13 +169,13 @@ const CDropdownToggle = defineComponent({
148169
active: props.active,
149170
color: props.color,
150171
disabled: props.disabled,
151-
onClick: () => toggleMenu(),
152-
...(props.component === 'button' && { type: 'button' }),
153172
ref: (el) => {
154173
buttonRef.value = el
155174
},
156175
shape: props.shape,
157176
size: props.size,
177+
...triggers,
178+
...(props.component === 'button' && { type: 'button' }),
158179
variant: props.variant,
159180
},
160181
() =>

0 commit comments

Comments
 (0)