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