Path: blob/main/src/resources/formats/html/tabsets/tabsets.js
12923 views
// grouped tabsets12export function init() {3window.addEventListener("pageshow", (_event) => {4function getTabSettings() {5const data = localStorage.getItem("quarto-persistent-tabsets-data");6if (!data) {7localStorage.setItem("quarto-persistent-tabsets-data", "{}");8return {};9}10if (data) {11return JSON.parse(data);12}13}1415function setTabSettings(data) {16localStorage.setItem(17"quarto-persistent-tabsets-data",18JSON.stringify(data)19);20}2122function setTabState(groupName, groupValue) {23const data = getTabSettings();24data[groupName] = groupValue;25setTabSettings(data);26}2728function toggleTab(tab, active) {29const tabPanelId = tab.getAttribute("aria-controls");30const tabPanel = document.getElementById(tabPanelId);31if (active) {32tab.classList.add("active");33tabPanel.classList.add("active");34} else {35tab.classList.remove("active");36tabPanel.classList.remove("active");37}38}3940function toggleAll(selectedGroup, selectorsToSync) {41for (const [thisGroup, tabs] of Object.entries(selectorsToSync)) {42const active = selectedGroup === thisGroup;43for (const tab of tabs) {44toggleTab(tab, active);45}46}47}4849function findSelectorsToSyncByLanguage() {50const result = {};51const tabs = Array.from(52document.querySelectorAll(`div[data-group] a[id^='tabset-']`)53);54for (const item of tabs) {55const div = item.parentElement.parentElement.parentElement;56const group = div.getAttribute("data-group");57if (!result[group]) {58result[group] = {};59}60const selectorsToSync = result[group];61const value = item.innerHTML;62if (!selectorsToSync[value]) {63selectorsToSync[value] = [];64}65selectorsToSync[value].push(item);66}67return result;68}6970function setupSelectorSync() {71const selectorsToSync = findSelectorsToSyncByLanguage();72Object.entries(selectorsToSync).forEach(([group, tabSetsByValue]) => {73Object.entries(tabSetsByValue).forEach(([value, items]) => {74items.forEach((item) => {75item.addEventListener("click", (_event) => {76setTabState(group, value);77toggleAll(value, selectorsToSync[group]);78});79});80});81});82return selectorsToSync;83}8485const selectorsToSync = setupSelectorSync();86for (const [group, selectedName] of Object.entries(getTabSettings())) {87const selectors = selectorsToSync[group];88// it's possible that stale state gives us empty selections, so we explicitly check here.89if (selectors) {90toggleAll(selectedName, selectors);91}92}93});94}959697