Skip to content

Commit 10cb184

Browse files
committed
fix(dropdown): fix dropdown popup when inside modal
1 parent 3a5a754 commit 10cb184

File tree

3 files changed

+24
-9
lines changed

3 files changed

+24
-9
lines changed

src/components/dropdown/Dropdown.vue

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333

3434
<Transition name="fade">
3535
<div
36-
v-show="isOpen"
36+
v-show="isOpen && !isHidden"
3737
ref="menu"
3838
data-testid="dropdown-menu"
3939
class="dropdown__menu"
@@ -57,6 +57,7 @@ import {
5757
toRef,
5858
watchEffect,
5959
computed,
60+
ref,
6061
} from 'vue-demi'
6162
import {
6263
templateRef,
@@ -73,6 +74,7 @@ import {
7374
offset,
7475
flip,
7576
shift,
77+
hide,
7678
} from '@floating-ui/dom'
7779
import { useVModel } from '../input'
7880
import IconArrow from '@carbon/icons-vue/lib/chevron--down/16'
@@ -175,6 +177,7 @@ export default defineComponent({
175177
const wizard = templateRef<DropdownSubitemElement>('wizard')
176178
const placement = toRef(props, 'placement')
177179
const isOpen = useVModel(props)
180+
const isHidden = ref(false)
178181
179182
const { next: nextFocus, prev: prevFocus } = useFocus(menu)
180183
@@ -280,13 +283,16 @@ export default defineComponent({
280283
flip(),
281284
shift(),
282285
offset(8),
286+
hide(),
283287
],
284-
}).then(({ x, y, placement }) => {
288+
}).then(({ x, y, placement, middlewareData }) => {
285289
if (menu.value) {
286290
menu.value.dataset.popperPlacement = placement
287291
288292
menu.value.style.left = `${x || 0}px`
289293
menu.value.style.top = `${y || 0}px`
294+
295+
isHidden.value = middlewareData.hide.referenceHidden
290296
}
291297
})
292298
})
@@ -309,6 +315,7 @@ export default defineComponent({
309315
310316
return {
311317
isOpen,
318+
isHidden,
312319
classNames,
313320
containerSize,
314321
toggle,
@@ -327,7 +334,7 @@ export default defineComponent({
327334
--p-dropdown-size-sm: 15rem; /* 240px */
328335
--p-dropdown-max-height: theme(spacing.64);
329336
330-
@apply relative inline-flex;
337+
@apply inline-flex;
331338
332339
&__menu {
333340
@apply max-h-[var(--p-dropdown-max-height)] border rounded bg-default z-[var(--p-dropdown-z-index)] border-default shadow-xl overflow-x-hidden overflow-y-auto absolute;

src/components/modal/index.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ description: ase component for modal dialog.
1010
import pHeading from '../heading/Heading.vue'
1111
import pBanner from '../banner/Banner.vue'
1212
import pCheckbox from '../checkbox/Checkbox.vue'
13+
import pFormGroup from '../form-group/FormGroup.vue'
14+
import pDatepicker from '../datepicker/Datepicker.vue'
1315

1416
const basicModal = ref(true)
1517
const showModal = ref(false)
@@ -370,6 +372,9 @@ When modals content become too long, modal body can scroll itself by adding prop
370372
<p>
371373
I am alone, and feel the charm of existence in this spot, which was created for the bliss of souls like mine. I am so happy, my dear friend, so absorbed in the exquisite sense of mere tranquil existence, that I neglect my talents.
372374
</p>
375+
<p-form-group label="Select Date">
376+
<p-datepicker />
377+
</p-form-group>
373378
</div>
374379
<template #footer="{ close }">
375380
<p-button @click="close" color="info">

src/components/select/Select.vue

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,19 @@
77
:disabled="disabled"
88
:class="classNames">
99
<template #activator>
10-
<Input
10+
<p-input
1111
v-model="search"
1212
data-testid="select-search"
1313
class="select__search"
1414
:size="size"
1515
:placeholder="placeholder"
1616
:disabled="disabled"
1717
:readonly="readonly"
18-
@focus="onFocus" />
19-
<IconArrow class="select__caret" />
18+
@focus="onFocus">
19+
<template #append>
20+
<IconArrow class="select__caret" />
21+
</template>
22+
</p-input>
2023
</template>
2124

2225
<template v-if="!isLoading && items.length === 0">
@@ -69,7 +72,7 @@
6972
<script lang="ts">
7073
import Dropdown from '../dropdown/Dropdown.vue'
7174
import DropdownItem from '../dropdown/DropdownItem.vue'
72-
import Input from '../input/Input.vue'
75+
import pInput from '../input/Input.vue'
7376
import IconArrow from '@carbon/icons-vue/lib/chevron--down/16'
7477
import IconCheck from '@carbon/icons-vue/lib/checkmark--filled/16'
7578
import IconLoading from '../spinner/SpinnerRing.vue'
@@ -94,7 +97,7 @@ export default defineComponent({
9497
components: {
9598
Dropdown,
9699
DropdownItem,
97-
Input,
100+
pInput,
98101
IconArrow,
99102
IconCheck,
100103
IconLoading,
@@ -288,7 +291,7 @@ export default defineComponent({
288291
}
289292
290293
&__caret {
291-
@apply absolute right-3 top-0 bottom-0 my-auto transition-transform duration-150 text-subtle pointer-events-none;
294+
@apply transition-transform duration-150 text-subtle pointer-events-none;
292295
@apply dark:text-dark-subtle;
293296
}
294297

0 commit comments

Comments
 (0)