@@ -6,56 +6,45 @@ export default class extends Controller {
66 static targets = [ "tab" ] ;
77
88 connect ( ) {
9+ // Get all available tabs (both via Stimulus targets and manual selection)
10+ this . allTabs = this . tabTargets . length > 0 ? this . tabTargets :
11+ Array . from ( this . element . querySelectorAll ( '[data-bs-toggle="tab"]' ) ) ;
12+
913 this . activateTabFromHash ( ) ;
1014 this . setupTabChangeListener ( ) ;
1115 }
1216
1317 activateTabFromHash ( ) {
1418 const hash = window . location . hash ;
1519 if ( hash ) {
16- let selectedTab = this . element . querySelector ( `[data-bs-target="${ hash } "]` ) ;
17- while ( selectedTab ) {
18- // Skip tabs inside the localized-fields class
19- if ( selectedTab . closest ( '.localized-fields' ) ) break ;
20-
21- const tabTarget = this . element . querySelector ( `${ selectedTab . dataset . bsTarget } ` ) ;
22- const tabPanes = this . element . querySelectorAll ( '.nav-tab-pane' ) ;
23-
24- this . tabTargets . forEach ( ( tab ) => {
25- tab . classList . remove ( 'active' ) ;
26- } ) ;
27- selectedTab . classList . add ( 'active' ) ;
28-
29- tabPanes . forEach ( ( pane ) => {
30- pane . classList . remove ( 'active' ) ;
31- pane . classList . remove ( 'show' ) ;
32- } ) ;
33-
34- if ( tabTarget ) {
35- tabTarget . classList . add ( 'active' ) ;
36- tabTarget . classList . add ( 'show' ) ;
37- }
38-
39- // Check if the selected tab is nested and activate its parent tab
40- const parentTabPane = selectedTab . closest ( '.nav-tab-pane' ) ;
41- if ( parentTabPane ) {
42- const parentTab = this . element . querySelector ( `[data-bs-target="#${ parentTabPane . id } "]` ) ;
43- selectedTab = parentTab ; // Move up to the parent tab for the next iteration
44- } else {
45- selectedTab = null ; // Exit the loop if no parent tab exists
46- }
20+ // Look for tabs that target this hash with either href or data-bs-target
21+ let selectedTab = this . element . querySelector ( `[href="${ hash } "]` ) ||
22+ this . element . querySelector ( `[data-bs-target="${ hash } "]` ) ;
23+
24+ if ( selectedTab && ! selectedTab . closest ( '.localized-fields' ) ) {
25+ console . log ( 'Activating tab from hash:' , hash , selectedTab ) ;
26+
27+ // Let Bootstrap handle the tab activation
28+ const tabInstance = new bootstrap . Tab ( selectedTab ) ;
29+ tabInstance . show ( ) ;
4730 }
4831 }
4932 }
5033
5134 setupTabChangeListener ( ) {
52- this . tabTargets . forEach ( ( link ) => {
35+ // Use the unified collection of all available tabs
36+ const tabsToSetup = this . allTabs || [ ] ;
37+
38+ tabsToSetup . forEach ( ( link ) => {
5339 if ( link . closest ( '.localized-fields' ) ) return ;
5440
55- link . addEventListener ( "shown.bs.tab" , ( event ) => {
56- const targetHash = event . target . getAttribute ( "data-bs-target" ) ;
57- if ( targetHash ) {
58- history . pushState ( { } , "" , targetHash ) ; // Add the hash to the address bar
41+ // Primary: Listen for click events
42+ link . addEventListener ( "click" , ( event ) => {
43+ const targetHash = event . target . getAttribute ( "href" ) || event . target . getAttribute ( "data-bs-target" ) ;
44+
45+ if ( targetHash && targetHash . startsWith ( '#' ) ) {
46+ // Update immediately - no delay needed
47+ history . pushState ( { } , "" , targetHash ) ;
5948 }
6049 } ) ;
6150 } ) ;
0 commit comments