1
- import { cloneVNode , defineComponent , h , inject , onMounted , Ref , ref } from 'vue'
1
+ import { cloneVNode , defineComponent , h , inject , onMounted , PropType , Ref , ref } from 'vue'
2
2
import { CButton } from '../button'
3
3
import { Color , Shape } from '../props'
4
+ import { Triggers } from '../Types'
4
5
5
6
const CDropdownToggle = defineComponent ( {
6
7
name : 'CDropdownToggle' ,
@@ -70,6 +71,16 @@ const CDropdownToggle = defineComponent({
70
71
type : Boolean ,
71
72
required : false ,
72
73
} ,
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
+ } ,
73
84
/**
74
85
* Set the button variant to an outlined button or a ghost button.
75
86
*
@@ -89,7 +100,8 @@ const CDropdownToggle = defineComponent({
89
100
const dropdownToggleRef = inject ( 'dropdownToggleRef' ) as Ref < HTMLElement >
90
101
const dropdownVariant = inject ( 'variant' ) as string
91
102
const visible = inject ( 'visible' ) as Ref < boolean >
92
- const toggleMenu = inject ( 'toggleMenu' ) as ( ) => void
103
+ const toggleMenu = inject ( 'toggleMenu' ) as ( _visible ?: boolean ) => void
104
+
93
105
const className = [
94
106
{
95
107
'dropdown-toggle' : props . caret ,
@@ -99,6 +111,18 @@ const CDropdownToggle = defineComponent({
99
111
} ,
100
112
]
101
113
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
+
102
126
onMounted ( ( ) => {
103
127
if ( buttonRef . value ) {
104
128
dropdownToggleRef . value = buttonRef . value . $el
@@ -110,8 +134,8 @@ const CDropdownToggle = defineComponent({
110
134
? slots . default &&
111
135
slots . default ( ) . map ( ( slot ) =>
112
136
cloneVNode ( slot , {
113
- onClick : ( ) => toggleMenu ( ) ,
114
137
ref : dropdownToggleRef ,
138
+ ...triggers ,
115
139
} ) ,
116
140
)
117
141
: dropdownVariant === 'nav-item'
@@ -128,11 +152,8 @@ const CDropdownToggle = defineComponent({
128
152
] ,
129
153
disabled : props . disabled ,
130
154
href : '#' ,
131
- onClick : ( event : Event ) => {
132
- event . preventDefault ( )
133
- toggleMenu ( )
134
- } ,
135
155
ref : dropdownToggleRef ,
156
+ ...triggers ,
136
157
} ,
137
158
{ default : ( ) => slots . default && slots . default ( ) } ,
138
159
)
@@ -148,13 +169,13 @@ const CDropdownToggle = defineComponent({
148
169
active : props . active ,
149
170
color : props . color ,
150
171
disabled : props . disabled ,
151
- onClick : ( ) => toggleMenu ( ) ,
152
- ...( props . component === 'button' && { type : 'button' } ) ,
153
172
ref : ( el ) => {
154
173
buttonRef . value = el
155
174
} ,
156
175
shape : props . shape ,
157
176
size : props . size ,
177
+ ...triggers ,
178
+ ...( props . component === 'button' && { type : 'button' } ) ,
158
179
variant : props . variant ,
159
180
} ,
160
181
( ) =>
0 commit comments