Skip to content

Commit 1b43afa

Browse files
committed
fix: always close overlaid sidebar on outside click
1 parent ad9f36c commit 1b43afa

File tree

2 files changed

+34
-10
lines changed

2 files changed

+34
-10
lines changed

src/components/template/CSidebar.vue

Lines changed: 24 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -66,15 +66,18 @@ export default {
6666
show (val) {
6767
this.open = val
6868
},
69-
open (val) {
70-
val === true ? this.createBackdrop() : this.removeBackdrop()
71-
}
72-
},
73-
mounted () {
74-
if (this.open === true) {
75-
this.createBackdrop()
69+
open: {
70+
immediate: true,
71+
handler (val) {
72+
val === true ? this.createBackdrop() : this.removeBackdrop()
73+
}
7674
}
7775
},
76+
// mounted () {
77+
// if (this.open === true) {
78+
// this.createBackdrop()
79+
// }
80+
// },
7881
beforeDestroy () {
7982
this.removeBackdrop()
8083
},
@@ -110,16 +113,29 @@ export default {
110113
isOnMobile () {
111114
return Boolean(getComputedStyle(this.$el).getPropertyValue('--is-mobile'))
112115
},
116+
sidebarCloseListener (e) {
117+
if (
118+
document.getElementById(this._uid + 'backdrop') &&
119+
!this.$el.contains(e.target)
120+
) {
121+
this.closeSidebar()
122+
}
123+
},
113124
createBackdrop () {
114125
const backdrop = document.createElement('div')
126+
if (this.overlaid) {
127+
document.addEventListener('click', this.sidebarCloseListener, true)
128+
} else {
129+
backdrop.addEventListener('click', this.closeSidebar)
130+
}
115131
backdrop.className = 'c-sidebar-backdrop c-show'
116132
backdrop.id = this._uid + 'backdrop'
117133
document.body.appendChild(backdrop)
118-
backdrop.addEventListener('click', this.closeSidebar)
119134
},
120135
removeBackdrop () {
121136
const backdrop = document.getElementById(this._uid + 'backdrop')
122137
if (backdrop) {
138+
document.removeEventListener('click', this.sidebarCloseListener)
123139
backdrop.removeEventListener('click', this.closeSidebar)
124140
document.body.removeChild(backdrop)
125141
}

src/components/template/tests/CSidebar.spec.js

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -85,16 +85,24 @@ describe(`${ComponentName} .vue`, () => {
8585
sidebarClick('link')
8686
expect(sidebarComponent.open).toBe('responsive')
8787
})
88-
it('closes sidebar on backdrop click', () => {
88+
it('closes sidebar on outside click when overlaid', () => {
8989
const customWrapper = generateWrapper()
9090
const customComponent = customWrapper.vm.$children[0]
91+
customWrapper.setData({
92+
props: {
93+
show: false
94+
}
95+
})
9196
customWrapper.setData({
9297
props: {
9398
overlaid: true,
99+
show: true
94100
}
95101
})
96102
expect(customComponent.open).toBe(true)
97-
document.getElementById(customComponent._uid + 'backdrop').click()
103+
customComponent.$el.click()
104+
expect(customComponent.open).toBe(true)
105+
document.body.click()
98106
expect(customComponent.open).toBe(false)
99107
})
100108
it('watches for prop changes', () => {

0 commit comments

Comments
 (0)