123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102 |
- // @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<string, HTMLElement[]>}
- */
- 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);
|