Spaces:
Running
Running
| /** | |
| * -------------------------------------------------------------------------- | |
| * Bootstrap (v5.1.3): util/backdrop.js | |
| * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) | |
| * -------------------------------------------------------------------------- | |
| */ | |
| import EventHandler from '../dom/event-handler' | |
| import { | |
| execute, | |
| executeAfterTransition, | |
| getElement, | |
| reflow, | |
| typeCheckConfig | |
| } from './index' | |
| const Default = { | |
| className: 'modal-backdrop', | |
| isVisible: true, // if false, we use the backdrop helper without adding any element to the dom | |
| isAnimated: false, | |
| rootElement: 'body', // give the choice to place backdrop under different elements | |
| clickCallback: null | |
| } | |
| const DefaultType = { | |
| className: 'string', | |
| isVisible: 'boolean', | |
| isAnimated: 'boolean', | |
| rootElement: '(element|string)', | |
| clickCallback: '(function|null)' | |
| } | |
| const NAME = 'backdrop' | |
| const CLASS_NAME_FADE = 'fade' | |
| const CLASS_NAME_SHOW = 'show' | |
| const EVENT_MOUSEDOWN = `mousedown.bs.${NAME}` | |
| class Backdrop { | |
| constructor(config) { | |
| this._config = this._getConfig(config) | |
| this._isAppended = false | |
| this._element = null | |
| } | |
| show(callback) { | |
| if (!this._config.isVisible) { | |
| execute(callback) | |
| return | |
| } | |
| this._append() | |
| if (this._config.isAnimated) { | |
| reflow(this._getElement()) | |
| } | |
| this._getElement().classList.add(CLASS_NAME_SHOW) | |
| this._emulateAnimation(() => { | |
| execute(callback) | |
| }) | |
| } | |
| hide(callback) { | |
| if (!this._config.isVisible) { | |
| execute(callback) | |
| return | |
| } | |
| this._getElement().classList.remove(CLASS_NAME_SHOW) | |
| this._emulateAnimation(() => { | |
| this.dispose() | |
| execute(callback) | |
| }) | |
| } | |
| // Private | |
| _getElement() { | |
| if (!this._element) { | |
| const backdrop = document.createElement('div') | |
| backdrop.className = this._config.className | |
| if (this._config.isAnimated) { | |
| backdrop.classList.add(CLASS_NAME_FADE) | |
| } | |
| this._element = backdrop | |
| } | |
| return this._element | |
| } | |
| _getConfig(config) { | |
| config = { | |
| ...Default, | |
| ...(typeof config === 'object' ? config : {}) | |
| } | |
| // use getElement() with the default "body" to get a fresh Element on each instantiation | |
| config.rootElement = getElement(config.rootElement) | |
| typeCheckConfig(NAME, config, DefaultType) | |
| return config | |
| } | |
| _append() { | |
| if (this._isAppended) { | |
| return | |
| } | |
| this._config.rootElement.append(this._getElement()) | |
| EventHandler.on(this._getElement(), EVENT_MOUSEDOWN, () => { | |
| execute(this._config.clickCallback) | |
| }) | |
| this._isAppended = true | |
| } | |
| dispose() { | |
| if (!this._isAppended) { | |
| return | |
| } | |
| EventHandler.off(this._element, EVENT_MOUSEDOWN) | |
| this._element.remove() | |
| this._isAppended = false | |
| } | |
| _emulateAnimation(callback) { | |
| executeAfterTransition(callback, this._getElement(), this._config.isAnimated) | |
| } | |
| } | |
| export default Backdrop |