@@ -346,6 +346,19 @@ class CDSTable extends HostListenerMixin(LitElement) {
346346 unfilteredRows . push ( elem ) ;
347347 }
348348
349+ if ( this . isSelectable ) {
350+ const unfilteredSelectableLength = unfilteredRows . filter ( ( elem ) => {
351+ return ! elem . hasAttribute ( 'disabled' ) ;
352+ } ) . length ;
353+
354+ const headerCheckbox = this . _tableHeaderRow . shadowRoot
355+ ?. querySelector ( `${ prefix } -checkbox` )
356+ . shadowRoot . querySelector ( `.${ prefix } --checkbox` ) ;
357+
358+ headerCheckbox . disabled =
359+ unfilteredSelectableLength === 0 ? true : false ;
360+ }
361+
349362 if ( this . expandable ) {
350363 // eslint-disable-next-line @typescript-eslint/no-explicit-any -- https://github.com/carbon-design-system/carbon/issues/20452
351364 ( elem as any ) . nextElementSibling . filtered = filtered ;
@@ -529,15 +542,15 @@ class CDSTable extends HostListenerMixin(LitElement) {
529542 }
530543 }
531544
532- const totalRows = [ ...this . _tableRows ] . filter (
533- ( elem ) => ! elem . hasAttribute ( 'filtered' )
545+ const totalSelectableRows = [ ...this . _tableRows ] . filter (
546+ ( elem ) => ! elem . hasAttribute ( 'filtered' ) && ! elem . hasAttribute ( 'disabled' )
534547 ) . length ;
535548
536549 // selected header checkbox upon all rows being selected
537550 const headerCheckbox = tableHeaderRow . shadowRoot
538551 ?. querySelector ( `${ prefix } -checkbox` )
539552 . shadowRoot . querySelector ( `.${ prefix } --checkbox` ) ;
540- const allRowsSelected = this . _selectedRows . length === totalRows ;
553+ const allRowsSelected = this . _selectedRows . length === totalSelectableRows ;
541554 headerCheckbox . checked = ! this . _selectedRows . length ? false : true ;
542555 headerCheckbox . indeterminate =
543556 ! allRowsSelected && this . _selectedRows . length > 0 ;
@@ -580,7 +593,7 @@ class CDSTable extends HostListenerMixin(LitElement) {
580593
581594 let totalRows = 0 ;
582595 forEach ( tableRows , ( elem ) => {
583- if ( ! ( elem as CDSTableRow ) . filtered ) {
596+ if ( ! ( elem as CDSTableRow ) . filtered && ! ( elem as CDSTableRow ) . disabled ) {
584597 ( elem as CDSTableRow ) . selected = selected ;
585598 if ( this . radio ) {
586599 // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- https://github.com/carbon-design-system/carbon/issues/20452
0 commit comments