add automatic tabs save and recall
This commit is contained in:
		
							parent
							
								
									8cfb3a5b6d
								
							
						
					
					
						commit
						a93f7b0bdb
					
				
					 2 changed files with 125 additions and 1 deletions
				
			
		|  | @ -14,7 +14,7 @@ | ||||||
| 			</ul> | 			</ul> | ||||||
| 		</nav> | 		</nav> | ||||||
| 		<main class="container"> | 		<main class="container"> | ||||||
| 			<ul class="collapsible" tab-recall="true" data-collapsible="accordion"> | 			<ul class="collapsible" tabs-group="settings" data-collapsible="accordion"> | ||||||
| 				<li> | 				<li> | ||||||
| 					<header class="collapsible-header waves-effect" accesskey="1"><h1 class="flow-text" for="general" data-icon="cog"></h1></header> | 					<header class="collapsible-header waves-effect" accesskey="1"><h1 class="flow-text" for="general" data-icon="cog"></h1></header> | ||||||
| 					<section class="collapsible-body"> | 					<section class="collapsible-body"> | ||||||
|  |  | ||||||
							
								
								
									
										124
									
								
								scripts/GUI/builder/windowman.tabs.js
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										124
									
								
								scripts/GUI/builder/windowman.tabs.js
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,124 @@ | ||||||
|  | import {global} from "/scripts/secretariat.js"; | ||||||
|  | import nested from "/scripts/utils/nested.js"; | ||||||
|  | 
 | ||||||
|  | /* | ||||||
|  | Collapsibles are also tabs.  | ||||||
|  | */ | ||||||
|  | class Tabs { | ||||||
|  | 	status = {}; | ||||||
|  | 
 | ||||||
|  | 	/* | ||||||
|  | 	Initialize the tabs.  | ||||||
|  | 
 | ||||||
|  | 	@param {string} location The URL of the page. | ||||||
|  | 	*/ | ||||||
|  | 	constructor(options = {}) { | ||||||
|  | 		this.#get(); | ||||||
|  | 		this.#set(); | ||||||
|  | 	}; | ||||||
|  | 
 | ||||||
|  | 	/* | ||||||
|  | 	Get the relevant elements.  | ||||||
|  | 	*/ | ||||||
|  | 	#get() { | ||||||
|  | 		(document.querySelector(`ul.collapsible[tabs-group]`)) | ||||||
|  | 			? (document.querySelectorAll(`ul[tabs-group]`).forEach((CONTAINER) => { | ||||||
|  | 				let NAME = CONTAINER.getAttribute("tabs-group"); | ||||||
|  | 
 | ||||||
|  | 				if (!Object.keys(this).includes(NAME)) { | ||||||
|  | 					// Get the tabs.
 | ||||||
|  | 					this[NAME] = {}; | ||||||
|  | 	 | ||||||
|  | 					// Reference the elements in this object. 
 | ||||||
|  | 					this[NAME][`elements`] = {}; | ||||||
|  | 					this[NAME][`elements`][`container`] = CONTAINER; | ||||||
|  | 					this[NAME][`elements`][`tabs`] = {}; | ||||||
|  | 					 | ||||||
|  | 					(CONTAINER.querySelector(`:scope > li`)) | ||||||
|  | 						? CONTAINER.querySelectorAll(`:scope > li`).forEach((TAB, INDEX) => { | ||||||
|  | 							let ID = (TAB.getAttribute(`id`)) | ||||||
|  | 								? TAB.getAttribute(`id`) | ||||||
|  | 								: ((TAB.getAttribute(`tab-name`)) | ||||||
|  | 									? TAB.getAttribute(`tab-name`) | ||||||
|  | 									: INDEX); | ||||||
|  | 	 | ||||||
|  | 							this[NAME][`elements`][`tabs`][ID] = {}; | ||||||
|  | 							this[NAME][`elements`][`tabs`][ID][`container`] = TAB; | ||||||
|  | 							[`header`, `body`].forEach((ELEMENT) => { | ||||||
|  | 								this[NAME][`elements`][`tabs`][ID][ELEMENT] = TAB.querySelector(`:scope > .collapsible-${ELEMENT}`); | ||||||
|  | 							}); | ||||||
|  | 	 | ||||||
|  | 							// Get the active state. 
 | ||||||
|  | 							TAB.classList.contains(`active`) | ||||||
|  | 								? this[NAME][`selected`] = ID | ||||||
|  | 								: false; | ||||||
|  | 	 | ||||||
|  | 							// Remove the attributes. 
 | ||||||
|  | 							TAB.removeAttribute(`tab-name`); | ||||||
|  | 						}) | ||||||
|  | 						: false; | ||||||
|  | 	 | ||||||
|  | 					// Delete the attribute. 
 | ||||||
|  | 					CONTAINER.removeAttribute("tabs-group"); | ||||||
|  | 				} | ||||||
|  | 			})) | ||||||
|  | 			: false; | ||||||
|  | 	}; | ||||||
|  | 
 | ||||||
|  | 	/* | ||||||
|  | 	Set the properties of the tabs.  | ||||||
|  | 	*/ | ||||||
|  | 	#set() { | ||||||
|  | 		(Object.keys(this).length > 1) | ||||||
|  | 			? (Object.keys(this).forEach((NAME) => { | ||||||
|  | 				if (NAME != `status`) { | ||||||
|  | 					// Add the events to each tab. 
 | ||||||
|  | 					(Object.keys(this[NAME][`elements`][`tabs`]).length) | ||||||
|  | 						? (Object.keys(this[NAME][`elements`][`tabs`]).forEach((ID) => { | ||||||
|  | 							this[NAME][`elements`][`tabs`][ID][`header`].addEventListener(`click`, () => { | ||||||
|  | 								this.open(NAME, ID); | ||||||
|  | 							}); | ||||||
|  | 						})) | ||||||
|  | 						: false; | ||||||
|  | 	 | ||||||
|  | 					// Open the last selected tab. 
 | ||||||
|  | 					(global.read([`view`, `tabs`, NAME, `selected`])).then((SELECTED) => { | ||||||
|  | 						if (SELECTED != null) { | ||||||
|  | 							// Wait until page load is complete. 
 | ||||||
|  | 							this.open(NAME, SELECTED, {"don't save": true, "automatic": true}); | ||||||
|  | 						}; | ||||||
|  | 					}); | ||||||
|  | 				} | ||||||
|  | 				 | ||||||
|  | 			})) | ||||||
|  | 			: false; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/* | ||||||
|  | 	Open a particular tab.  | ||||||
|  | 
 | ||||||
|  | 	@param {string} name The name of the tab group. | ||||||
|  | 	@param {string} ID The ID of the tab. | ||||||
|  | 	@param {object} options The options to be used. | ||||||
|  | 	*/ | ||||||
|  | 	async open (name, ID, options) { | ||||||
|  | 		if ((name && ID) && Object.keys(this).includes(name)) { | ||||||
|  | 			// Update the variable. 
 | ||||||
|  | 			this[name][`selected`] = ID; | ||||||
|  | 
 | ||||||
|  | 			(((typeof options).includes(`obj`) && options) ? options[`don't save`] : false) | ||||||
|  | 				? false | ||||||
|  | 				: this[`status`][`last`] = await global.write([`view`, `tabs`, name, `selected`], ID, 1, {"silent": true}); | ||||||
|  | 
 | ||||||
|  | 			// Select the tab. 
 | ||||||
|  | 			(((typeof options).includes(`obj`) && options) ? options[`automatic`] : false) | ||||||
|  | 				? ((nested.dictionary.get(this, [name, `elements`, `tabs`, ID, `header`])) | ||||||
|  | 					? this[name][`elements`][`tabs`][ID][`header`].click() | ||||||
|  | 					: false) | ||||||
|  | 				: false;		 | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | export {Tabs}; | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue