File size: 2,882 Bytes
b27eb78
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
// grouped tabsets

export function init() {
  window.addEventListener("pageshow", (_event) => {
    function getTabSettings() {
      const data = localStorage.getItem("quarto-persistent-tabsets-data");
      if (!data) {
        localStorage.setItem("quarto-persistent-tabsets-data", "{}");
        return {};
      }
      if (data) {
        return JSON.parse(data);
      }
    }

    function setTabSettings(data) {
      localStorage.setItem(
        "quarto-persistent-tabsets-data",
        JSON.stringify(data)
      );
    }

    function setTabState(groupName, groupValue) {
      const data = getTabSettings();
      data[groupName] = groupValue;
      setTabSettings(data);
    }

    function toggleTab(tab, active) {
      const tabPanelId = tab.getAttribute("aria-controls");
      const tabPanel = document.getElementById(tabPanelId);
      if (active) {
        tab.classList.add("active");
        tabPanel.classList.add("active");
      } else {
        tab.classList.remove("active");
        tabPanel.classList.remove("active");
      }
    }

    function toggleAll(selectedGroup, selectorsToSync) {
      for (const [thisGroup, tabs] of Object.entries(selectorsToSync)) {
        const active = selectedGroup === thisGroup;
        for (const tab of tabs) {
          toggleTab(tab, active);
        }
      }
    }

    function findSelectorsToSyncByLanguage() {
      const result = {};
      const tabs = Array.from(
        document.querySelectorAll(`div[data-group] a[id^='tabset-']`)
      );
      for (const item of tabs) {
        const div = item.parentElement.parentElement.parentElement;
        const group = div.getAttribute("data-group");
        if (!result[group]) {
          result[group] = {};
        }
        const selectorsToSync = result[group];
        const value = item.innerHTML;
        if (!selectorsToSync[value]) {
          selectorsToSync[value] = [];
        }
        selectorsToSync[value].push(item);
      }
      return result;
    }

    function setupSelectorSync() {
      const selectorsToSync = findSelectorsToSyncByLanguage();
      Object.entries(selectorsToSync).forEach(([group, tabSetsByValue]) => {
        Object.entries(tabSetsByValue).forEach(([value, items]) => {
          items.forEach((item) => {
            item.addEventListener("click", (_event) => {
              setTabState(group, value);
              toggleAll(value, selectorsToSync[group]);
            });
          });
        });
      });
      return selectorsToSync;
    }

    const selectorsToSync = setupSelectorSync();
    for (const [group, selectedName] of Object.entries(getTabSettings())) {
      const selectors = selectorsToSync[group];
      // it's possible that stale state gives us empty selections, so we explicitly check here.
      if (selectors) {
        toggleAll(selectedName, selectors);
      }
    }
  });
}