Skip to content

Commit b295f71

Browse files
committed
refactor: CDropdown: optimize dropdown hiding, update tests
1 parent a78fd14 commit b295f71

File tree

5 files changed

+30
-60
lines changed

5 files changed

+30
-60
lines changed

package-lock.json

Lines changed: 3 additions & 9 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,6 @@
7575
"perfect-scrollbar": "~1.5.0",
7676
"tooltip.js": "~1.3.3",
7777
"vue": "~2.6.11",
78-
"vue-clickaway2": "~2.3.1",
7978
"vue-functional-data-merge": "~3.1.0"
8079
},
8180
"devDependencies": {

src/components/dropdown/CDropdown.vue

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
<component
33
:is="inNav ? 'li' : 'div'"
44
:class="computedDropdownClasses"
5-
v-on-clickaway="hide"
5+
v-c-clickaway="visible ? hide : null"
66
@click="checkClick($event)"
77
>
88
<slot name="toggler">
@@ -34,11 +34,13 @@
3434
<script>
3535
import CLink from '../link/CLink'
3636
import { createPopper } from '@popperjs/core'
37-
import { mixin as clickaway } from 'vue-clickaway2'
37+
import { CClickaway } from '../../directives'
3838
3939
export default {
4040
name: 'CDropdown',
41-
mixins: [ clickaway ],
41+
directives: {
42+
CClickaway
43+
},
4244
components: {
4345
CLink
4446
},

src/components/dropdown/tests/CDropdown.spec.js

Lines changed: 22 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -6,24 +6,15 @@ const localVue = new createLocalVue()
66
localVue.use(VueRouter)
77
const router = new VueRouter()
88

9-
//needed for @popperjs/core
10-
global.document.createRange = () => ({
11-
setStart: () => {},
12-
setEnd: () => {},
13-
commonAncestorContainer: {
14-
nodeName: 'BODY',
15-
ownerDocument: document,
16-
},
17-
})
18-
19-
const ComponentName = 'CDropdown'
209
const wrapper = mount(Component, {
2110
router,
2211
localVue
2312
})
2413

25-
const customWrapper = mount(Component, {
14+
const ComponentName = 'CDropdown'
2615

16+
const generateWrapper = () => mount(Component, {
17+
attachToDocument: true,
2718
propsData: {
2819
togglerText: 'Dropdown button',
2920
show: true,
@@ -43,7 +34,7 @@ const customWrapper = mount(Component, {
4334
}
4435
})
4536

46-
const navWrapper = mount(Component, {
37+
const generateNavWrapper = () => mount(Component, {
4738
propsData: {
4839
addMenuClasses: 'additional-menu-class',
4940
addTogglerClasses: 'additional-toggler-class',
@@ -68,31 +59,10 @@ describe(ComponentName, () => {
6859
expect(wrapper.element).toMatchSnapshot()
6960
})
7061
it('renders custom wrapper correctly', () => {
71-
expect(customWrapper.element).toMatchSnapshot()
62+
expect(generateWrapper().element).toMatchSnapshot()
7263
})
7364
it('renders correctly inNav', () => {
74-
expect(navWrapper.element).toMatchSnapshot()
75-
})
76-
it('properly toggle dropdown', () => {
77-
const toggle = () => {
78-
jest.useFakeTimers()
79-
wrapper.find('button').trigger('click')
80-
jest.runAllTimers()
81-
}
82-
const hide = () => {
83-
jest.useFakeTimers()
84-
wrapper.vm.hide()
85-
jest.runAllTimers()
86-
}
87-
88-
expect(wrapper.vm.visible).toBe(false)
89-
toggle()
90-
expect(wrapper.vm.visible).toBe(true)
91-
//mimics v-on-clickaway
92-
hide()
93-
expect(wrapper.vm.visible).toBe(false)
94-
hide()
95-
expect(wrapper.vm.visible).toBe(false)
65+
expect(generateNavWrapper().element).toMatchSnapshot()
9666
})
9767
it('toggles when show prop is changed', () => {
9868
expect(wrapper.vm.visible).toBe(false)
@@ -104,25 +74,34 @@ describe(ComponentName, () => {
10474
wrapper.vm.$router.push('new-route-name')
10575
expect(wrapper.vm.visible).toBe(false)
10676
})
107-
it('does not open when dropdown is disabled', () => {
77+
it('close, but does not open on click when dropdown is disabled', () => {
78+
const customWrapper = generateWrapper()
10879
const toggle = () => {
109-
jest.useFakeTimers()
11080
customWrapper.find('.dropdown-toggle-split').trigger('click')
111-
jest.runAllTimers()
11281
}
113-
82+
11483
expect(customWrapper.vm.visible).toBe(true)
115-
customWrapper.setProps({ disabled: true })
84+
customWrapper.setProps({
85+
disabled: true
86+
})
11687
toggle()
11788
expect(customWrapper.vm.visible).toBe(false)
11889
toggle()
11990
expect(customWrapper.vm.visible).toBe(false)
91+
})
92+
it('Closes dropdown on outside click', () => {
93+
const customWrapper = generateWrapper()
94+
95+
expect(customWrapper.vm.visible).toBe(true)
96+
customWrapper.vm.$el.getElementsByClassName('dropdown-menu')[0].click()
97+
expect(customWrapper.vm.visible).toBe(true)
98+
document.body.click()
99+
expect(customWrapper.vm.visible).toBe(false)
120100
})
121101
it('opens then toggler is passed by slot', () => {
102+
const navWrapper = generateNavWrapper()
122103
const toggle = () => {
123-
jest.useFakeTimers()
124104
navWrapper.find('.toggler').trigger('click')
125-
jest.runAllTimers()
126105
}
127106

128107
expect(navWrapper.vm.visible).toBe(false)

src/components/dropdown/tests/__snapshots__/CDropdown.spec.js.snap

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -58,10 +58,6 @@ exports[`CDropdown renders custom wrapper correctly 1`] = `
5858
5959
<div
6060
class="additional-menu-class dropdown-menu show"
61-
data-popper-escaped=""
62-
data-popper-placement="right-end"
63-
data-popper-reference-hidden=""
64-
style="position: absolute; left: 0px; top: 0px; margin: 0px; transform: translate(0px, 20px);"
6561
>
6662
CDropdown subcomponents
6763
</div>

0 commit comments

Comments
 (0)