Skip to content

Commit 5e47c5a

Browse files
committed
WIP: Improve nested tab activation
1 parent faab037 commit 5e47c5a

File tree

1 file changed

+65
-1
lines changed

1 file changed

+65
-1
lines changed

app/javascript/controllers/better_together/tabs_controller.js

Lines changed: 65 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,17 +7,55 @@ export default class extends Controller {
77
static targets = ["tab"];
88

99
connect() {
10+
// this.initializeFirstTabs();
1011
this.activateTabFromHash();
1112
this.setupTabChangeListener();
1213
}
1314

15+
// initializeFirstTabs() {
16+
// // Ensure the first tab in each group is active and shown
17+
// const tabGroups = this.element.querySelectorAll('[data-bs-target]');
18+
// tabGroups.forEach((tab) => {
19+
// // Skip tabs inside the localized-fields class
20+
// if (tab.closest('.localized-fields')) return;
21+
22+
// const tabPane = this.element.querySelector(tab.dataset.bsTarget);
23+
// if (tabPane) {
24+
// const nestedTabs = tabPane.querySelectorAll('[data-bs-target]');
25+
// if (nestedTabs.length > 0) {
26+
// const firstNestedTab = nestedTabs[0];
27+
// const firstNestedTabTarget = tabPane.querySelector(firstNestedTab.dataset.bsTarget);
28+
29+
// nestedTabs.forEach((nestedTab) => {
30+
// nestedTab.classList.remove('active');
31+
// });
32+
// firstNestedTab.classList.add('active');
33+
34+
// if (firstNestedTabTarget) {
35+
// const nestedTabPanes = tabPane.querySelectorAll('.tab-pane');
36+
// nestedTabPanes.forEach((nestedPane) => {
37+
// nestedPane.classList.remove('active');
38+
// nestedPane.classList.remove('show');
39+
// });
40+
41+
// firstNestedTabTarget.classList.add('active');
42+
// firstNestedTabTarget.classList.add('show');
43+
// }
44+
// }
45+
// }
46+
// });
47+
// }
48+
1449
activateTabFromHash() {
1550
const hash = window.location.hash;
1651
if (hash) {
1752
let selectedTab = this.element.querySelector(`[data-bs-target="${hash}"]`);
1853
while (selectedTab) {
54+
// Skip tabs inside the localized-fields class
55+
if (selectedTab.closest('.localized-fields')) break;
56+
1957
const tabTarget = this.element.querySelector(`${selectedTab.dataset.bsTarget}`);
20-
const tabPanes = this.element.querySelectorAll('.nav-tab-pane');
58+
const tabPanes = this.element.querySelectorAll('.tab-pane');
2159

2260
this.tabTargets.forEach((pane) => {
2361
pane.classList.remove('active');
@@ -32,6 +70,29 @@ export default class extends Controller {
3270
if (tabTarget) {
3371
tabTarget.classList.add('active');
3472
tabTarget.classList.add('show');
73+
74+
// // Activate the first tab inside the activated tab pane
75+
// const nestedTabs = tabTarget.querySelectorAll('[data-bs-target]');
76+
// if (nestedTabs.length > 0) {
77+
// const firstNestedTab = nestedTabs[0];
78+
// const firstNestedTabTarget = tabTarget.querySelector(firstNestedTab.dataset.bsTarget);
79+
80+
// nestedTabs.forEach((nestedTab) => {
81+
// nestedTab.classList.remove('active');
82+
// });
83+
// firstNestedTab.classList.add('active');
84+
85+
// if (firstNestedTabTarget) {
86+
// const nestedTabPanes = tabTarget.querySelectorAll('.tab-pane');
87+
// nestedTabPanes.forEach((nestedPane) => {
88+
// nestedPane.classList.remove('active');
89+
// nestedPane.classList.remove('show');
90+
// });
91+
92+
// firstNestedTabTarget.classList.add('active');
93+
// firstNestedTabTarget.classList.add('show');
94+
// }
95+
// }
3596
}
3697

3798
// Check if the selected tab is nested and activate its parent tab
@@ -49,6 +110,9 @@ export default class extends Controller {
49110
setupTabChangeListener() {
50111
const tabLinks = this.tabTargets;
51112
tabLinks.forEach((link) => {
113+
// Skip tabs inside the localized-fields class
114+
if (link.closest('.localized-fields')) return;
115+
52116
link.addEventListener("shown.bs.tab", (event) => {
53117
history.pushState({}, "", event.target.getAttribute("data-bs-target"))
54118
});

0 commit comments

Comments
 (0)