Skip to content

Commit 93c8895

Browse files
committed
feat(sidebar): mobile clickout behaviour
1 parent d4fca8c commit 93c8895

File tree

1 file changed

+51
-0
lines changed

1 file changed

+51
-0
lines changed

js/src/sidebar.js

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import $ from 'jquery'
22
import PerfectScrollbar from 'perfect-scrollbar'
3+
import getStyle from './utilities/get-style'
34
import toggleClasses from './toggle-classes'
45

56
/**
@@ -78,10 +79,14 @@ const Sidebar = (($) => {
7879
class Sidebar {
7980
constructor(element) {
8081
this._element = element
82+
this.mobile = false
8183
this.ps = null
8284
this.perfectScrollbar(Event.INIT)
8385
this.setActiveLink()
86+
this._breakpointTest = this._breakpointTest.bind(this)
87+
this._clickOutListener = this._clickOutListener.bind(this)
8488
this._addEventListeners()
89+
this._addMediaQuery()
8590
}
8691

8792
// Getters
@@ -163,6 +168,50 @@ const Sidebar = (($) => {
163168

164169
// Private
165170

171+
_addMediaQuery() {
172+
const sm = getStyle('--breakpoint-sm')
173+
if (!sm) {
174+
return
175+
}
176+
const smVal = parseInt(sm, 10) - 1
177+
const mediaQueryList = window.matchMedia(`(max-width: ${smVal}px)`)
178+
179+
this._breakpointTest(mediaQueryList)
180+
181+
mediaQueryList.addListener(this._breakpointTest)
182+
}
183+
184+
_breakpointTest(e) {
185+
this.mobile = Boolean(e.matches)
186+
this._toggleClickOut()
187+
}
188+
189+
_clickOutListener(event) {
190+
if (!this._element.contains(event.target)) { // or use: event.target.closest(Selector.SIDEBAR) === null
191+
event.preventDefault()
192+
event.stopPropagation()
193+
this._removeClickOut()
194+
document.body.classList.remove('sidebar-show')
195+
}
196+
}
197+
198+
_addClickOut() {
199+
document.addEventListener(Event.CLICK, this._clickOutListener, true)
200+
}
201+
202+
_removeClickOut() {
203+
document.removeEventListener(Event.CLICK, this._clickOutListener, true)
204+
}
205+
206+
_toggleClickOut() {
207+
if (this.mobile && document.body.classList.contains('sidebar-show')) {
208+
document.body.classList.remove('aside-menu-show')
209+
this._addClickOut()
210+
} else {
211+
this._removeClickOut()
212+
}
213+
}
214+
166215
_addEventListeners() {
167216
$(Selector.BRAND_MINIMIZER).on(Event.CLICK, (event) => {
168217
event.preventDefault()
@@ -190,9 +239,11 @@ const Sidebar = (($) => {
190239
event.stopPropagation()
191240
const toggle = event.currentTarget.dataset.toggle
192241
toggleClasses(toggle, ShowClassNames)
242+
this._toggleClickOut()
193243
})
194244

195245
$(`${Selector.NAVIGATION} > ${Selector.NAV_ITEM} ${Selector.NAV_LINK}:not(${Selector.NAV_DROPDOWN_TOGGLE})`).on(Event.CLICK, () => {
246+
this._removeClickOut()
196247
document.body.classList.remove('sidebar-show')
197248
})
198249
}

0 commit comments

Comments
 (0)