@@ -36,16 +36,18 @@ export class HXTabsetElement extends HXElement {
3636 this . $defaultAttribute ( 'id' , `tabset-${ generateId ( ) } ` ) ;
3737 this . _setupIds ( ) ;
3838 this . currentTab = Number ( this . getAttribute ( 'current-tab' ) ) || 0 ;
39+ // FIXME: convert this.$tablist to private getter as this._tablist
3940 this . $tablist = this . querySelector ( 'hx-tablist' ) ;
4041 this . $tablist . addEventListener ( 'keyup' , this . _onKeyUp ) ;
4142 this . $tablist . addEventListener ( 'keydown' , preventKeyScroll ) ;
4243 this . tabs . forEach ( tab => {
4344 tab . addEventListener ( 'click' , this . _onTabClick ) ;
4445 } ) ;
46+
47+ // FIXME: if current-tab set, ensure the associated tab and tabpanel is open
4548 }
4649
4750 $onDisconnect ( ) {
48- // FIXME: convert this.$tablist to getter
4951 this . $tablist . removeEventListener ( 'keyup' , this . _onKeyUp ) ;
5052 this . $tablist . removeEventListener ( 'keydown' , preventKeyScroll ) ;
5153 this . tabs . forEach ( tab => {
@@ -59,7 +61,6 @@ export class HXTabsetElement extends HXElement {
5961
6062 $onAttributeChange ( attr , oldVal , newVal ) {
6163 if ( attr === 'current-tab' ) {
62- // FIXME: only run if connected
6364 if ( ! isNaN ( newVal ) ) {
6465 this . _activateTab ( Number ( newVal ) ) ;
6566 this . $emit ( 'tabchange' ) ;
@@ -75,6 +76,10 @@ export class HXTabsetElement extends HXElement {
7576 return Number ( this . getAttribute ( 'current-tab' ) || 0 ) ;
7677 }
7778 set currentTab ( idx ) {
79+ // NOTE: Keep an eye on this logic for React compatibility
80+ // React _may_ set the currentTab property before connect
81+ // if so, we'll need to check if isConnected before continuing
82+
7883 if ( isNaN ( idx ) ) {
7984 throw new TypeError ( `'currentTab' expects an numeric index. Got ${ typeof idx } instead.` ) ;
8085 }
@@ -108,6 +113,9 @@ export class HXTabsetElement extends HXElement {
108113 * Select next tab in tabset.
109114 */
110115 selectNext ( ) {
116+ // FIXME: this.tabs might return an empty array
117+ // maybe short-circuit if not connected
118+
111119 // if current tab is the last tab
112120 if ( this . currentTab === ( this . tabs . length - 1 ) ) {
113121 // select first
@@ -116,14 +124,16 @@ export class HXTabsetElement extends HXElement {
116124 // select next
117125 this . currentTab += 1 ;
118126 }
119- // FIXME: this.tabs might return an empty array
120127 this . tabs [ this . currentTab ] . focus ( ) ;
121128 }
122129
123130 /**
124131 * Select previous tab in tabset.
125132 */
126133 selectPrevious ( ) {
134+ // FIXME: this.tabs might return an empty array
135+ // maybe short-circuit if not connected
136+
127137 // if current tab is the first tab
128138 if ( this . currentTab === 0 ) {
129139 // select last
@@ -132,13 +142,13 @@ export class HXTabsetElement extends HXElement {
132142 // select previous
133143 this . currentTab -= 1 ;
134144 }
135- // FIXME: this.tabs might return an empty array
136145 this . tabs [ this . currentTab ] . focus ( ) ;
137146 }
138147
139148 /**
140149 * Handle navigating the tabs via arrow keys
141150 * @private
151+ * @todo migrate keyup listener logic to HXTablistElement
142152 */
143153 _onKeyUp ( evt ) {
144154 if ( evt . keyCode === KEYS . Right ) {
@@ -150,14 +160,16 @@ export class HXTabsetElement extends HXElement {
150160 }
151161 }
152162
153- /** @private */
163+ /**
164+ * @private
165+ * @todo migrate tab click listener logic to HXTabElement
166+ */
154167 _onTabClick ( evt ) {
155168 this . currentTab = this . tabs . indexOf ( evt . target ) ;
156169 }
157170
158171 /** @private */
159172 _activateTab ( idx ) {
160- // FIXME: this.tabs will return empty array before tabset connects
161173 this . tabs . forEach ( ( tab , tabIdx ) => {
162174 if ( idx === tabIdx ) {
163175 tab . current = true ;
@@ -169,7 +181,6 @@ export class HXTabsetElement extends HXElement {
169181 }
170182 } ) ;
171183
172- // FIXME: this.tabpanels will return empty array before tabset connects
173184 this . tabpanels . forEach ( ( tabpanel , panelIdx ) => {
174185 tabpanel . open = ( idx === panelIdx ) ;
175186 } ) ;
@@ -178,7 +189,6 @@ export class HXTabsetElement extends HXElement {
178189 /** @private */
179190 _setupIds ( ) {
180191 let tabsetId = this . getAttribute ( 'id' ) ;
181- // FIXME: this.tabs will return empty array before connect
182192 this . tabs . forEach ( ( tab , idx ) => {
183193 let tabpanel = this . tabpanels [ idx ] ;
184194 // Default tab and panel ID
0 commit comments