94 lines
No EOL
1.6 KiB
JavaScript
94 lines
No EOL
1.6 KiB
JavaScript
import Modal from "./modal.js";
|
|
|
|
export default class ModalsManager {
|
|
/**
|
|
* @type {Modal}
|
|
*/
|
|
modals = {};
|
|
|
|
/**
|
|
* @type {Function}
|
|
*/
|
|
updateModals = () => {};
|
|
|
|
/**
|
|
* @param {Modal} modal
|
|
* @param {boolean} closeOthers
|
|
*/
|
|
open(modal, closeOthers = true) {
|
|
if (closeOthers) {
|
|
this.modalIds.forEach((id) => {
|
|
this.close(id, false);
|
|
});
|
|
}
|
|
|
|
let id = 0;
|
|
while (this.modalIds.includes(id.toString())) {
|
|
id++;
|
|
}
|
|
|
|
modal.id = id;
|
|
modal.modalsManager = this;
|
|
|
|
this.modals[id] = modal;
|
|
this.updateModals(this.modals);
|
|
}
|
|
|
|
/**
|
|
* @param {string} modalId
|
|
* @param {boolean} sendModalsUpdate
|
|
*/
|
|
close(modalId, sendModalsUpdate = true) {
|
|
modalId = modalId.toString();
|
|
|
|
if (!this.modalIds.includes(modalId)) {
|
|
console.warn(`Failed to close modal ${modalId}: modal not found`);
|
|
return;
|
|
}
|
|
|
|
console.info(`Closing modal ${modalId}`);
|
|
delete this.modals[modalId];
|
|
|
|
if (sendModalsUpdate)
|
|
this.updateModals(this.modals);
|
|
}
|
|
|
|
/**
|
|
* @param {string} modalId
|
|
*/
|
|
focus(modalId) {
|
|
modalId = modalId.toString();
|
|
|
|
if (!this.modalIds.includes(modalId)) {
|
|
console.warn(`Failed to focus modal ${modalId}: modal not found`);
|
|
return;
|
|
}
|
|
|
|
const modal = this.modals[modalId];
|
|
modal.focus();
|
|
|
|
this.updateModals(this.modals);
|
|
}
|
|
|
|
/**
|
|
* @param {Function} updateModals
|
|
*/
|
|
setUpdateModals(updateModals) {
|
|
this.updateModals = updateModals;
|
|
}
|
|
|
|
/**
|
|
* @returns {string[]}
|
|
*/
|
|
get modalIds() {
|
|
return Object.keys(this.modals);
|
|
}
|
|
|
|
/**
|
|
* @param {string} name
|
|
* @returns {string}
|
|
*/
|
|
static getModalIconUrl(name) {
|
|
return `${process.env.PUBLIC_URL}/assets/modals/icons/${name}.svg`;
|
|
}
|
|
} |