create navigation bar elements manager
This commit is contained in:
parent
6a415e8aa6
commit
6c62f67f4c
1 changed files with 128 additions and 0 deletions
128
src/scripts/GUI/builder/navigation.js
Normal file
128
src/scripts/GUI/builder/navigation.js
Normal file
|
@ -0,0 +1,128 @@
|
|||
/*
|
||||
|
||||
*/
|
||||
|
||||
import nested from "/scripts/utils/nested.js";
|
||||
|
||||
class NavigationBar {
|
||||
options = {};
|
||||
|
||||
constructor () {
|
||||
this.#get();
|
||||
};
|
||||
|
||||
#get () {
|
||||
let NAVIGATION_ELEMENTS = document.querySelectorAll(`nav.nav-wrapper`);
|
||||
|
||||
// If there are navigation elements, then proceed.
|
||||
(NAVIGATION_ELEMENTS.length)
|
||||
? (NAVIGATION_ELEMENTS.forEach((ELEMENT) => {
|
||||
// Set the name, or generate one if it doesn't exist.
|
||||
let NAME = (ELEMENT.getAttribute(`id`) || ELEMENT.getAttribute(`nav-name`) || Object.keys(this).length);
|
||||
|
||||
if (!([`options`].includes(NAME))) {
|
||||
this[NAME] = (this[NAME]) ? this[NAME] : {};
|
||||
|
||||
// Set the elements.
|
||||
this[NAME][`elements`] = nested.dictionary.set(this[NAME][`elements`], `container`, ELEMENT);
|
||||
|
||||
/*
|
||||
Get elements expected to only have one in existence.
|
||||
*/
|
||||
const get_constant_elements = () => {
|
||||
// Define the attributes to look for
|
||||
const ELEMENTS_ATTRIBUTES = [`brand-logo`];
|
||||
|
||||
const add_elements = (list_classes) => {
|
||||
list_classes.forEach((CLASS) => {
|
||||
let ELEMENTS = ELEMENT.querySelectorAll(`:scope .${CLASS}`);
|
||||
|
||||
// If the element exists, then proceed.
|
||||
(ELEMENTS.length)
|
||||
? this[NAME][`elements`][CLASS] = ELEMENTS
|
||||
: false;
|
||||
})
|
||||
};
|
||||
add_elements(ELEMENTS_ATTRIBUTES);
|
||||
}
|
||||
|
||||
const set_elements_groups = () => {
|
||||
let GROUPS = ELEMENT.querySelectorAll(`:scope > ul`);
|
||||
|
||||
(GROUPS.length)
|
||||
? GROUPS.forEach((GROUP) => {
|
||||
// Get the name.
|
||||
let NAME_GROUP = (GROUP.getAttribute(`nav-group-name`) || GROUP.getAttribute(`id`) || ((this[NAME][`elements`][`groups`] ? Object.keys(this[NAME][`elements`][`groups`]).length + 1 : 0) + 1));
|
||||
|
||||
// Set the elements.
|
||||
this[NAME][`elements`][`groups`] = nested.dictionary.set(this[NAME][`elements`][`groups`], NAME_GROUP, {"container": GROUP, "items": GROUP.querySelectorAll(`:scope > li`)});
|
||||
|
||||
// Set the element properties.
|
||||
this[NAME][`group`] = nested.dictionary.set(this[NAME][`group`], NAME_GROUP, {"hidden": GROUP.hidden});
|
||||
|
||||
// Remove the attributes.
|
||||
GROUP.removeAttribute(`nav-group-name`)
|
||||
})
|
||||
: false;
|
||||
};
|
||||
|
||||
const set_default_properties = () => {
|
||||
this[NAME].hidden = this[NAME][`elements`][`container`].hidden;
|
||||
};
|
||||
|
||||
get_constant_elements();
|
||||
set_elements_groups();
|
||||
};
|
||||
|
||||
// Remove the attributes.
|
||||
ELEMENT.removeAttribute(`nav-name`);
|
||||
}))
|
||||
: false;
|
||||
};
|
||||
|
||||
/*
|
||||
Show the navigation bar or one of its groups.
|
||||
|
||||
@param {string} name the name of the navigation bar
|
||||
@param {string} group the name of the group to show
|
||||
@return {boolean} the operation state
|
||||
*/
|
||||
show(name, group) {
|
||||
if ((name && group) ? ((Object.keys(this).includes(name)) ? ((this[name][`group`]) ? Object.keys(this[name][`group`]).includes(group) : false) : false) : false) {
|
||||
this[name][`elements`][`groups`][group][`container`].hidden = false;
|
||||
this[name][`group`][group][`hidden`] = this[name][`elements`][`groups`][group][`container`].hidden;
|
||||
|
||||
return (this[name][`group`][group][`hidden`] == false);
|
||||
} else if (name ? Object.keys(this).includes(name) : false) {
|
||||
this[name][`elements`][`container`].hidden = false;
|
||||
this[name][`elements`][`container`].classList.remove(`hidden`);
|
||||
this[name].hidden = this[name][`elements`][`container`].hidden;
|
||||
|
||||
return (this[name].hidden == false);
|
||||
};
|
||||
};
|
||||
|
||||
/*
|
||||
Hide the navigation bar or one of its groups.
|
||||
|
||||
@param {string} name the name of the navigation bar
|
||||
@param {string} group the name of the group to show
|
||||
@return {boolean} the operation state
|
||||
*/
|
||||
hide(name, group) {
|
||||
if ((name && group) ? ((Object.keys(this).includes(name)) ? ((this[name][`group`]) ? Object.keys(this[name][`group`]).includes(group) : false) : false) : false) {
|
||||
this[name][`elements`][`groups`][group][`container`].hidden = true;
|
||||
this[name][`group`][group][`hidden`] = this[name][`elements`][`groups`][group][`container`].hidden;
|
||||
|
||||
return (this[name][`group`][group][`hidden`] == true);
|
||||
} else if (name ? Object.keys(this).includes(name) : false) {
|
||||
this[name][`elements`][`container`].hidden = true;
|
||||
this[name][`elements`][`container`].classList.add(`hidden`);
|
||||
this[name].hidden = this[name][`elements`][`container`].hidden;
|
||||
|
||||
return (this[name].hidden == true);
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
export {NavigationBar};
|
Loading…
Add table
Add a link
Reference in a new issue