/** * @licstart The following is the entire license notice for the * Javascript code in this page * * Copyright 2020 Mozilla Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * @licend The above is the entire license notice for the * Javascript code in this page */ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.OverlayManager = void 0; class OverlayManager { constructor() { this._overlays = {}; this._active = null; this._keyDownBound = this._keyDown.bind(this); } get active() { return this._active; } async register(name, element, callerCloseMethod = null, canForceClose = false) { let container; if (!name || !element || !(container = element.parentNode)) { throw new Error("Not enough parameters."); } else if (this._overlays[name]) { throw new Error("The overlay is already registered."); } this._overlays[name] = { element, container, callerCloseMethod, canForceClose }; } async unregister(name) { if (!this._overlays[name]) { throw new Error("The overlay does not exist."); } else if (this._active === name) { throw new Error("The overlay cannot be removed while it is active."); } delete this._overlays[name]; } async open(name) { if (!this._overlays[name]) { throw new Error("The overlay does not exist."); } else if (this._active) { if (this._overlays[name].canForceClose) { this._closeThroughCaller(); } else if (this._active === name) { throw new Error("The overlay is already active."); } else { throw new Error("Another overlay is currently active."); } } this._active = name; this._overlays[this._active].element.classList.remove("hidden"); this._overlays[this._active].container.classList.remove("hidden"); window.addEventListener("keydown", this._keyDownBound); } async close(name) { if (!this._overlays[name]) { throw new Error("The overlay does not exist."); } else if (!this._active) { throw new Error("The overlay is currently not active."); } else if (this._active !== name) { throw new Error("Another overlay is currently active."); } this._overlays[this._active].container.classList.add("hidden"); this._overlays[this._active].element.classList.add("hidden"); this._active = null; window.removeEventListener("keydown", this._keyDownBound); } _keyDown(evt) { if (this._active && evt.keyCode === 27) { this._closeThroughCaller(); evt.preventDefault(); } } _closeThroughCaller() { if (this._overlays[this._active].callerCloseMethod) { this._overlays[this._active].callerCloseMethod(); } if (this._active) { this.close(this._active); } } } exports.OverlayManager = OverlayManager;