deploy: a329453873
This commit is contained in:
101
_static/design-tabs.js
Normal file
101
_static/design-tabs.js
Normal file
@@ -0,0 +1,101 @@
|
||||
// @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);
|
||||
Reference in New Issue
Block a user