// @ts-check // Extra JS capability for selected tabs to be synced // The selection is stored in local storage so that it persists across page loads. /** * @type {Record} */ let sd_id_to_elements = {}; const storageKeyPrefix = "sphinx-design-tab-id-"; /** * Create a key for a tab element. * @param {HTMLElement} el - The tab element. * @returns {[string, string, string] | null} - The key. * */ function create_key(el) { let syncId = el.getAttribute("data-sync-id"); let syncGroup = el.getAttribute("data-sync-group"); if (!syncId || !syncGroup) return null; return [syncGroup, syncId, syncGroup + "--" + syncId]; } /** * Initialize the tab selection. * */ function ready() { // Find all tabs with sync data /** @type {string[]} */ let groups = []; document.querySelectorAll(".sd-tab-label").forEach((label) => { if (label instanceof HTMLElement) { let data = create_key(label); if (data) { let [group, id, key] = data; // add click event listener // @ts-ignore label.onclick = onSDLabelClick; // store map of key to elements if (!sd_id_to_elements[key]) { sd_id_to_elements[key] = []; } sd_id_to_elements[key].push(label); if (groups.indexOf(group) === -1) { groups.push(group); // Check if a specific tab has been selected via URL parameter const tabParam = new URLSearchParams(window.location.search).get( group ); if (tabParam) { console.log( "sphinx-design: Selecting tab id for group '" + group + "' from URL parameter: " + tabParam ); window.sessionStorage.setItem(storageKeyPrefix + group, tabParam); } } // Check is a specific tab has been selected previously let previousId = window.sessionStorage.getItem( storageKeyPrefix + group ); if (previousId === id) { // console.log( // "sphinx-design: Selecting tab from session storage: " + id // ); // @ts-ignore label.previousElementSibling.checked = true; } } } }); } /** * Activate other tabs with the same sync id. * * @this {HTMLElement} - The element that was clicked. */ function onSDLabelClick() { let data = create_key(this); if (!data) return; let [group, id, key] = data; for (const label of sd_id_to_elements[key]) { if (label === this) continue; // @ts-ignore label.previousElementSibling.checked = true; } window.sessionStorage.setItem(storageKeyPrefix + group, id); } document.addEventListener("DOMContentLoaded", ready, false);