ano-mr-site/lib/js/page-manager.js

67 lines
1.9 KiB
JavaScript

/**
* @typedef {Object} Page
* @property {HTMLElement} element
* @property {(...args: any[]) => void} init
* @property {boolean} always_mode
* @property {boolean} [first_init]
*/
/**
* @param {string | HTMLElement} element
* @returns {HTMLElement}
*/
const get_element = recovery((element) => {
if(element instanceof HTMLElement)
return element
else if(typeof element === 'string')
return document.getElementById(element)
else
throw new Error(`element is not correct: ${element}`)
})
/**
* @class PageManager
* @property {Object<string, Page>} pages
* @property {HTMLElement} page_space
*/
class PageManager {
/**
* @param {string | HTMLElement} page_space_id
* @param {...Page} args
*/
constructor(page_space_id, ...args) {
recovery((page_space_id_f, ...args_f) => {
this.pages = {}
this.page_space = get_element(page_space_id_f)
let first_id
args_f.forEach((arg, index) => {
const {element, init = () => {}, always_mode = false} = arg
const el = get_element(element)
if(el instanceof HTMLElement){
const id = el.id?.trim() || `_page_${index}`
this.pages[id] = {element: el, init, always_mode}
if(first_id == null) first_id = id
} else
logger.wprint(`${element} is not html-element or id`)
})
}, logger.eprint) (page_space_id, ...args)
}
/**
* @param {string} page_id
* @param {...*} args
*/
set_page = recovery((page_id, ...args) => {
const page = this.pages[page_id]
this.page_space.innerHTML = ''
this.page_space.appendChild(page.element)
if(!page.first_init || page.always_mode) {
page.init(...args)
if(!page.first_init) page.first_init = true
}
}, logger.eprint)
}