1- import { cloneVNode , defineComponent , h , inject , onMounted , Ref , ref } from 'vue'
1+ import { cloneVNode , defineComponent , h , inject , onMounted , PropType , Ref , ref } from 'vue'
22import { CButton } from '../button'
33import { Color , Shape } from '../props'
4+ import { Triggers } from '../Types'
45
56const 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