arch-repo-manager/srv/static/js/singlepage.js

81 lines
2.5 KiB
JavaScript

/// \brief 'main()' function which initializes the single page app.
function initPage()
{
handleHashChange();
queryGlobalStatus();
}
/// \brief Shows the current section and hides other sections.
function handleHashChange()
{
if (window.preventHandlingHashChange) {
return;
}
const hashParts = 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 || window.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.
function updateHashPreventingChangeHandler(newHash)
{
window.preventHandlingHashChange = true;
window.location.hash = newHash;
window.preventHandlingHashChange = false;
}
/// \brief Updates the #hash without triggering the section initializer.
function updateHashPreventingSectionInitializer(newHash)
{
window.preventSectionInitializer = true;
window.location.hash = newHash;
window.preventSectionInitializer = false;
}
const sections = {
'global': {
},
'package-search': {
initializer: initPackageSearch,
state: {params: undefined},
},
'package-details': {
initializer: initPackageDetails,
state: {package: undefined},
},
'build-action': {
initializer: initBuildActionsForm,
},
'build-action-details': {
initializer: initBuildActionDetails,
state: {id: undefined},
},
};
const sectionNames = Object.keys(sections);
const status = {repoNames: undefined};