mirror of
https://github.com/tenrok/bootstrap.git
synced 2026-06-14 18:42:30 +03:00
feat: add Hash/History helper to handle ref:#36647
This commit is contained in:
@@ -18,6 +18,7 @@ import SelectorEngine from './dom/selector-engine'
|
|||||||
import Backdrop from './util/backdrop'
|
import Backdrop from './util/backdrop'
|
||||||
import FocusTrap from './util/focustrap'
|
import FocusTrap from './util/focustrap'
|
||||||
import { enableDismissTrigger } from './util/component-functions'
|
import { enableDismissTrigger } from './util/component-functions'
|
||||||
|
import HistoryHelper from './util/history'
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constants
|
* Constants
|
||||||
@@ -70,6 +71,7 @@ class Offcanvas extends BaseComponent {
|
|||||||
this._isShown = false
|
this._isShown = false
|
||||||
this._backdrop = this._initializeBackDrop()
|
this._backdrop = this._initializeBackDrop()
|
||||||
this._focustrap = this._initializeFocusTrap()
|
this._focustrap = this._initializeFocusTrap()
|
||||||
|
this._historyHelper = new HistoryHelper(this._element, { prefix: this.constructor.NAME })
|
||||||
this._addEventListeners()
|
this._addEventListeners()
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -112,6 +114,7 @@ class Offcanvas extends BaseComponent {
|
|||||||
this._element.setAttribute('aria-modal', true)
|
this._element.setAttribute('aria-modal', true)
|
||||||
this._element.setAttribute('role', 'dialog')
|
this._element.setAttribute('role', 'dialog')
|
||||||
this._element.classList.add(CLASS_NAME_SHOWING)
|
this._element.classList.add(CLASS_NAME_SHOWING)
|
||||||
|
this._historyHelper.add()
|
||||||
|
|
||||||
const completeCallBack = () => {
|
const completeCallBack = () => {
|
||||||
if (!this._config.scroll || this._config.backdrop) {
|
if (!this._config.scroll || this._config.backdrop) {
|
||||||
@@ -152,6 +155,7 @@ class Offcanvas extends BaseComponent {
|
|||||||
new ScrollBarHelper().reset()
|
new ScrollBarHelper().reset()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
this._historyHelper.remove()
|
||||||
EventHandler.trigger(this._element, EVENT_HIDDEN)
|
EventHandler.trigger(this._element, EVENT_HIDDEN)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -272,6 +276,17 @@ EventHandler.on(window, EVENT_RESIZE, () => {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
HistoryHelper.onChange(Offcanvas, (newUrl, oldUrl) => {
|
||||||
|
if (oldUrl) {
|
||||||
|
Offcanvas.getOrCreateInstance(oldUrl).hide()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if (newUrl) {
|
||||||
|
Offcanvas.getOrCreateInstance(newUrl).show()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
enableDismissTrigger(Offcanvas)
|
enableDismissTrigger(Offcanvas)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -0,0 +1,90 @@
|
|||||||
|
/**
|
||||||
|
* --------------------------------------------------------------------------
|
||||||
|
* Bootstrap (v5.2.0-beta1): util/history.js
|
||||||
|
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
|
||||||
|
* --------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
import Config from './config'
|
||||||
|
import EventHandler from '../dom/event-handler'
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constants
|
||||||
|
*/
|
||||||
|
|
||||||
|
const NAME = 'history'
|
||||||
|
|
||||||
|
const Default = {
|
||||||
|
prefix: null
|
||||||
|
}
|
||||||
|
|
||||||
|
const DefaultType = {
|
||||||
|
prefix: 'string'
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class definition
|
||||||
|
*/
|
||||||
|
|
||||||
|
class HistoryHelper extends Config {
|
||||||
|
constructor(element, config) {
|
||||||
|
super()
|
||||||
|
this._element = element
|
||||||
|
this._config = this._getConfig(config)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Getters
|
||||||
|
static get Default() {
|
||||||
|
return Default
|
||||||
|
}
|
||||||
|
|
||||||
|
static get DefaultType() {
|
||||||
|
return DefaultType
|
||||||
|
}
|
||||||
|
|
||||||
|
static get NAME() {
|
||||||
|
return NAME
|
||||||
|
}
|
||||||
|
|
||||||
|
add() {
|
||||||
|
const url = new window.URL(window.location)
|
||||||
|
url.hash = this._getHash()
|
||||||
|
window.history.pushState({}, '', url)
|
||||||
|
}
|
||||||
|
|
||||||
|
remove() {
|
||||||
|
if (window.location.hash === `#${this._getHash()}`) {
|
||||||
|
const url = new window.URL(window.location)
|
||||||
|
url.hash = ''
|
||||||
|
window.history.replaceState({}, '', url)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static onChange(plugin, callback) {
|
||||||
|
const prefix = `bs-${plugin.NAME}-`
|
||||||
|
const getHash = url => new window.URL(url)?.hash
|
||||||
|
const sanitize = hash => hash.replace(prefix, '')
|
||||||
|
|
||||||
|
EventHandler.on(window, 'load', () => {
|
||||||
|
const hash = getHash(window.location)
|
||||||
|
if (hash.includes(prefix)) {
|
||||||
|
callback(sanitize(hash), '')
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
EventHandler.on(window, 'hashchange', ev => {
|
||||||
|
const oldHash = getHash(ev.oldURL)
|
||||||
|
const newHash = getHash(ev.newURL)
|
||||||
|
|
||||||
|
if (oldHash.includes(prefix) || newHash.includes(prefix)) {
|
||||||
|
callback(sanitize(newHash), sanitize(oldHash))
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
_getHash() {
|
||||||
|
return `bs-${this._config.prefix}-${this._element.id}`
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default HistoryHelper
|
||||||
Reference in New Issue
Block a user