75 lines
2.5 KiB
JavaScript
75 lines
2.5 KiB
JavaScript
import * as GlobalStatusPage from './globalstatuspage.js';
|
|
import * as Utils from './utils.js';
|
|
|
|
export let sections = {};
|
|
export let sectionNames = [];
|
|
|
|
/// \brief 'main()' function which initializes the single page app.
|
|
export function initPage(pageSections)
|
|
{
|
|
sections = pageSections;
|
|
sectionNames = Object.keys(sections);
|
|
handleHashChange();
|
|
document.body.onhashchange = handleHashChange;
|
|
document.getElementById('logo-link').onclick = function () {
|
|
document.getElementById('about-dialog').style.display = 'block';
|
|
return false;
|
|
};
|
|
GlobalStatusPage.queryGlobalStatus();
|
|
}
|
|
|
|
let preventHandlingHashChange = false;
|
|
let preventSectionInitializer = false;
|
|
|
|
/// \brief Shows the current section and hides other sections.
|
|
function handleHashChange()
|
|
{
|
|
if (preventHandlingHashChange) {
|
|
return;
|
|
}
|
|
|
|
const hashParts = Utils.splitHashParts();
|
|
const currentSectionName = hashParts.shift() || 'global-section';
|
|
if (!currentSectionName.endsWith('-section')) {
|
|
return;
|
|
}
|
|
|
|
sectionNames.forEach(function (sectionName) {
|
|
const sectionData = sections[sectionName];
|
|
const sectionElement = document.getElementById(sectionName + '-section');
|
|
if (sectionElement.id === currentSectionName) {
|
|
const sectionInitializer = sectionData.initializer;
|
|
if (sectionInitializer === undefined || preventSectionInitializer || sectionInitializer(sectionElement, sectionData, hashParts)) {
|
|
sectionElement.style.display = 'block';
|
|
}
|
|
} else {
|
|
const sectionDestructor = sectionData.destructor;
|
|
if (sectionDestructor === undefined || sectionDestructor(sectionElement, sectionData, hashParts)) {
|
|
sectionElement.style.display = 'none';
|
|
}
|
|
}
|
|
const navLinkElement = document.getElementById(sectionName + '-nav-link');
|
|
if (sectionElement.id === currentSectionName) {
|
|
navLinkElement.classList.add('active');
|
|
} else {
|
|
navLinkElement.classList.remove('active');
|
|
}
|
|
});
|
|
}
|
|
|
|
/// \brief Updates the #hash without triggering the handler.
|
|
export function updateHashPreventingChangeHandler(newHash)
|
|
{
|
|
preventHandlingHashChange = true;
|
|
window.location.hash = newHash;
|
|
preventHandlingHashChange = false;
|
|
}
|
|
|
|
/// \brief Updates the #hash without triggering the section initializer.
|
|
export function updateHashPreventingSectionInitializer(newHash)
|
|
{
|
|
preventSectionInitializer = true;
|
|
window.location.hash = newHash;
|
|
preventSectionInitializer = false;
|
|
}
|