Skip to content
This repository was archived by the owner on Mar 27, 2025. It is now read-only.

Commit 764685d

Browse files
committed
fix(BNavItemDropdown): all props and emits from dropdown
1 parent 2583c0e commit 764685d

File tree

4 files changed

+112
-74
lines changed

4 files changed

+112
-74
lines changed

packages/bootstrap-vue-next/src/components/BAccordion/BAccordionItem.vue

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,10 @@
1111
:horizontal="horizontal"
1212
:visible="visible"
1313
:is-nav="isNav"
14-
@show="$emit('show', $event)"
15-
@shown="emit('shown', $event)"
14+
@show="emit('show', $event)"
15+
@shown="emit('shown')"
1616
@hide="emit('hide', $event)"
17-
@hidden="emit('hidden', $event)"
17+
@hidden="emit('hidden')"
1818
@hide-prevented="emit('hide-prevented')"
1919
@show-prevented="emit('show-prevented')"
2020
>
@@ -78,9 +78,9 @@ const props = withDefaults(
7878
7979
const emit = defineEmits<{
8080
'show': [value: BvTriggerableEvent]
81-
'shown': [value: BvTriggerableEvent]
81+
'shown': []
8282
'hide': [value: BvTriggerableEvent]
83-
'hidden': [value: BvTriggerableEvent]
83+
'hidden': []
8484
'hide-prevented': []
8585
'show-prevented': []
8686
'update:modelValue': [value: boolean]

packages/bootstrap-vue-next/src/components/BCollapse.vue

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -64,9 +64,9 @@ const props = withDefaults(
6464
6565
const emit = defineEmits<{
6666
'show': [value: BvTriggerableEvent]
67-
'shown': [value: BvTriggerableEvent]
67+
'shown': []
6868
'hide': [value: BvTriggerableEvent]
69-
'hidden': [value: BvTriggerableEvent]
69+
'hidden': []
7070
'hide-prevented': []
7171
'show-prevented': []
7272
'update:modelValue': [value: boolean]
@@ -161,7 +161,7 @@ const reveal = () => {
161161
}
162162
setTimeout(() => {
163163
isCollapsing.value = false
164-
emit('shown', buildTriggerableEvent('shown'))
164+
emit('shown')
165165
if (element.value === null) return
166166
element.value.style.height = ''
167167
element.value.style.width = ''
@@ -192,7 +192,7 @@ const hide = () => {
192192
setTimeout(() => {
193193
show.value = false
194194
isCollapsing.value = false
195-
emit('hidden', buildTriggerableEvent('hidden'))
195+
emit('hidden')
196196
}, getTransitionDelay(element.value))
197197
})
198198
}

packages/bootstrap-vue-next/src/components/BDropdown/BDropdown.vue

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ import {onClickOutside, onKeyStroke, useToNumber, useVModel} from '@vueuse/core'
7474
import {computed, provide, readonly, ref, toRef, watch} from 'vue'
7575
import {useBooleanish, useId} from '../../composables'
7676
import type {Booleanish, ButtonType, ButtonVariant, ClassValue, Size} from '../../types'
77-
import {BvEvent, dropdownInjectionKey, resolveFloatingPlacement} from '../../utils'
77+
import {BvTriggerableEvent, dropdownInjectionKey, resolveFloatingPlacement} from '../../utils'
7878
import BButton from '../BButton/BButton.vue'
7979
import type {RouteLocationRaw} from 'vue-router'
8080
@@ -160,9 +160,9 @@ const props = withDefaults(
160160
)
161161
162162
const emit = defineEmits<{
163-
'show': [value: BvEvent]
163+
'show': [value: BvTriggerableEvent]
164164
'shown': []
165-
'hide': [value: BvEvent]
165+
'hide': [value: BvTriggerableEvent]
166166
'hidden': []
167167
'hide-prevented': []
168168
'show-prevented': []
@@ -290,16 +290,7 @@ const buttonClasses = computed(() => [
290290
const dropdownMenuClasses = computed(() => props.menuClass)
291291
292292
const onButtonClick = () => {
293-
emit('toggle')
294-
const currentModelValue = modelValueBoolean.value
295-
const e = new BvEvent(currentModelValue ? 'hide' : 'show')
296-
currentModelValue ? emit('hide', e) : emit('show', e)
297-
if (e.defaultPrevented) {
298-
currentModelValue ? emit('hide-prevented') : emit('show-prevented')
299-
return
300-
}
301-
modelValue.value = !currentModelValue
302-
currentModelValue ? emit('hidden') : emit('shown')
293+
toggle()
303294
}
304295
305296
const onSplitClick = (event: MouseEvent) => {
@@ -322,13 +313,22 @@ const onClickInside = () => {
322313
}
323314
324315
const close = () => {
325-
modelValue.value = false
316+
modelValue.value && toggle()
326317
}
327318
const open = () => {
328-
modelValue.value = true
319+
modelValue.value || toggle()
329320
}
330321
const toggle = () => {
331-
modelValue.value = !modelValueBoolean.value
322+
emit('toggle')
323+
const currentModelValue = modelValueBoolean.value
324+
const e = new BvTriggerableEvent(currentModelValue ? 'hide' : 'show')
325+
currentModelValue ? emit('hide', e) : emit('show', e)
326+
if (e.defaultPrevented) {
327+
currentModelValue ? emit('hide-prevented') : emit('show-prevented')
328+
return
329+
}
330+
modelValue.value = !currentModelValue
331+
currentModelValue ? emit('hidden') : emit('shown')
332332
}
333333
334334
watch(modelValueBoolean, update)

packages/bootstrap-vue-next/src/components/BNav/BNavItemDropdown.vue

Lines changed: 87 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,19 @@
11
<template>
22
<li class="nav-item dropdown">
3-
<BDropdown v-model="dropdownValue" v-bind="computedDropdownProps" is-nav>
3+
<BDropdown
4+
ref="dropdown"
5+
v-bind="props"
6+
is-nav
7+
@show="emit('show', $event)"
8+
@shown="emit('shown')"
9+
@hide="emit('hide', $event)"
10+
@hidden="emit('hidden')"
11+
@hide-prevented="emit('hide-prevented')"
12+
@show-prevented="emit('show-prevented')"
13+
@click="emit('click', $event)"
14+
@toggle="emit('toggle')"
15+
@update:model-value="emit('update:modelValue', $event)"
16+
>
417
<template #button-content>
518
<slot name="button-content" />
619
</template>
@@ -15,65 +28,101 @@
1528
</template>
1629

1730
<script setup lang="ts">
18-
import type {Middleware, Strategy} from '@floating-ui/vue'
19-
import {useVModel} from '@vueuse/core'
20-
import {computed} from 'vue'
21-
import {useBooleanish} from '../../composables'
22-
import type {Booleanish, ButtonVariant, ClassValue, Size} from '../../types'
23-
import {omit} from '../../utils'
31+
import type {Boundary, Middleware, RootBoundary, Strategy} from '@floating-ui/vue'
32+
import {ref} from 'vue'
33+
import type {Booleanish, ButtonType, ButtonVariant, ClassValue, Size} from '../../types'
34+
import {BvTriggerableEvent} from '../../utils'
2435
import BDropdown from '../BDropdown/BDropdown.vue'
36+
import type {RouteLocationRaw} from 'vue-router'
2537
2638
// TODO share props with BDropdown
2739
const props = withDefaults(
2840
defineProps<{
41+
ariaLabel?: string
2942
id?: string
43+
menuClass?: ClassValue
44+
size?: Size
45+
splitClass?: ClassValue
46+
splitVariant?: ButtonVariant | null
3047
text?: string
3148
toggleClass?: ClassValue
32-
size?: Size
33-
offset?: string
3449
autoClose?: boolean | 'inside' | 'outside'
35-
splitVariant?: ButtonVariant | null
50+
block?: Booleanish
51+
disabled?: Booleanish
52+
isNav?: Booleanish
53+
dropup?: Booleanish
54+
dropend?: Booleanish
55+
dropstart?: Booleanish
56+
center?: Booleanish
57+
end?: Booleanish
58+
noFlip?: Booleanish
59+
noShift?: Booleanish
60+
offset?:
61+
| number
62+
| string
63+
| {mainAxis?: number; crossAxis?: number; alignmentAxis?: number | null}
64+
role?: string
65+
split?: Booleanish
66+
splitButtonType?: ButtonType
67+
splitHref?: string
68+
splitDisabled?: Booleanish
3669
noCaret?: Booleanish
70+
toggleText?: string
3771
variant?: ButtonVariant | null
3872
modelValue?: Booleanish
3973
lazy?: Booleanish
4074
strategy?: Strategy
4175
floatingMiddleware?: Middleware[]
42-
noFlip?: Booleanish
43-
noShift?: Booleanish
44-
dropup?: Booleanish
45-
dropend?: Booleanish
46-
dropstart?: Booleanish
47-
center?: Booleanish
48-
end?: Booleanish
49-
menuClass?: ClassValue
76+
splitTo?: RouteLocationRaw
77+
boundary?: Boundary | RootBoundary
5078
}>(),
5179
{
52-
lazy: undefined,
53-
strategy: undefined,
54-
floatingMiddleware: undefined,
55-
noFlip: undefined,
56-
noShift: undefined,
57-
dropup: undefined,
58-
dropend: undefined,
59-
dropstart: undefined,
60-
center: undefined,
61-
end: undefined,
62-
menuClass: undefined,
80+
ariaLabel: undefined,
6381
id: undefined,
64-
text: undefined,
65-
toggleClass: undefined,
82+
menuClass: undefined,
6683
size: 'md',
67-
offset: undefined,
68-
autoClose: undefined,
84+
splitClass: undefined,
6985
splitVariant: undefined,
70-
noCaret: undefined,
86+
text: undefined,
87+
toggleClass: undefined,
88+
floatingMiddleware: undefined,
89+
splitDisabled: undefined,
90+
autoClose: true,
91+
block: false,
92+
disabled: false,
93+
isNav: false,
94+
dropup: false,
95+
dropend: false,
96+
dropstart: false,
97+
center: false,
98+
end: false,
99+
noFlip: false,
100+
lazy: false,
101+
noShift: false,
102+
offset: 0,
103+
role: 'menu',
104+
split: false,
105+
splitButtonType: 'button',
106+
splitHref: undefined,
107+
noCaret: false,
108+
toggleText: 'Toggle dropdown',
71109
variant: 'link',
72110
modelValue: false,
111+
strategy: 'absolute',
112+
splitTo: undefined,
113+
boundary: 'clippingAncestors',
73114
}
74115
)
75116
76117
const emit = defineEmits<{
118+
'show': [value: BvTriggerableEvent]
119+
'shown': []
120+
'hide': [value: BvTriggerableEvent]
121+
'hidden': []
122+
'hide-prevented': []
123+
'show-prevented': []
124+
'click': [event: MouseEvent]
125+
'toggle': []
77126
'update:modelValue': [value: boolean]
78127
}>()
79128
@@ -85,27 +134,16 @@ defineSlots<{
85134
// eslint-disable-next-line @typescript-eslint/no-explicit-any
86135
'button-content'?: (props: Record<string, never>) => any
87136
}>()
88-
89-
const modelValue = useVModel(props, 'modelValue', emit, {passive: true})
90-
91-
const modelValueBoolean = useBooleanish(modelValue)
92-
93-
const dropdownValue = computed({
94-
get: () => modelValueBoolean.value,
95-
set: (value: boolean) => {
96-
modelValue.value = value
97-
},
98-
})
99-
const computedDropdownProps = computed(() => omit(props, ['modelValue']))
137+
const dropdown = ref<InstanceType<typeof BDropdown>>()
100138
101139
const close = () => {
102-
modelValue.value = false
140+
dropdown.value?.close()
103141
}
104142
const open = () => {
105-
modelValue.value = true
143+
dropdown.value?.open()
106144
}
107145
const toggle = () => {
108-
modelValue.value = !modelValueBoolean.value
146+
dropdown.value?.toggle()
109147
}
110148
111149
defineExpose({

0 commit comments

Comments
 (0)