@@ -146,6 +146,7 @@ function createCheckboxChangeHandler(checkbox, references) {
146146 }
147147 }
148148 writeStorage ( "checkbox_" + checkbox , [ ...refsSet ] . join ( "," ) ) ;
149+ updateCheckboxStats ( checkbox ) ;
149150 }
150151}
151152
@@ -300,7 +301,6 @@ function populateBomHeader() {
300301 var th = document . createElement ( "TH" ) ;
301302 th . classList . add ( "numCol" ) ;
302303 tr . appendChild ( th ) ;
303- checkboxes = bomCheckboxes . split ( "," ) . filter ( ( e ) => e ) ;
304304 var checkboxCompareClosure = function ( checkbox ) {
305305 return ( a , b ) => {
306306 var stateA = getCheckboxState ( checkbox , a [ 3 ] ) ;
@@ -548,6 +548,38 @@ function populateMetadata() {
548548 if ( pcbdata . metadata . title != "" ) {
549549 document . title = pcbdata . metadata . title + " BOM" ;
550550 }
551+ var fp_f = 0 , fp_b = 0 , pads_f = 0 , pads_b = 0 , pads_th = 0 ;
552+ for ( var i = 0 ; i < pcbdata . modules . length ; i ++ ) {
553+ if ( pcbdata . bom . skipped . includes ( i ) ) continue ;
554+ var mod = pcbdata . modules [ i ] ;
555+ if ( mod . layer == "F" ) {
556+ fp_f ++ ;
557+ } else {
558+ fp_b ++ ;
559+ }
560+ for ( var pad of mod . pads ) {
561+ if ( pad . type == "th" ) {
562+ pads_th ++ ;
563+ } else {
564+ if ( pad . layers . includes ( "F" ) ) {
565+ pads_f ++ ;
566+ }
567+ if ( pad . layers . includes ( "B" ) ) {
568+ pads_b ++ ;
569+ }
570+ }
571+ }
572+ }
573+ document . getElementById ( "stats-components-front" ) . innerHTML = fp_f ;
574+ document . getElementById ( "stats-components-back" ) . innerHTML = fp_b ;
575+ document . getElementById ( "stats-components-total" ) . innerHTML = fp_f + fp_b ;
576+ document . getElementById ( "stats-groups-front" ) . innerHTML = pcbdata . bom . F . length ;
577+ document . getElementById ( "stats-groups-back" ) . innerHTML = pcbdata . bom . B . length ;
578+ document . getElementById ( "stats-groups-total" ) . innerHTML = pcbdata . bom . both . length ;
579+ document . getElementById ( "stats-smd-pads-front" ) . innerHTML = pads_f ;
580+ document . getElementById ( "stats-smd-pads-back" ) . innerHTML = pads_b ;
581+ document . getElementById ( "stats-smd-pads-total" ) . innerHTML = pads_f + pads_b ;
582+ document . getElementById ( "stats-th-pads" ) . innerHTML = pads_th ;
551583}
552584
553585function changeBomLayout ( layout ) {
@@ -664,9 +696,49 @@ function checkBomCheckbox(bomrowid, checkboxname) {
664696function setBomCheckboxes ( value ) {
665697 bomCheckboxes = value ;
666698 writeStorage ( "bomCheckboxes" , value ) ;
699+ prepCheckboxes ( ) ;
667700 populateBomTable ( ) ;
668701}
669702
703+ function prepCheckboxes ( ) {
704+ checkboxes = bomCheckboxes . split ( "," ) . filter ( ( e ) => e ) ;
705+ var table = document . getElementById ( "checkbox-stats" ) ;
706+ while ( table . childElementCount > 1 ) {
707+ table . removeChild ( table . lastChild ) ;
708+ }
709+ if ( checkboxes . length ) {
710+ table . style . display = "" ;
711+ } else {
712+ table . style . display = "none" ;
713+ }
714+ for ( var checkbox of checkboxes ) {
715+ var tr = document . createElement ( "TR" ) ;
716+ var td = document . createElement ( "TD" ) ;
717+ td . innerHTML = checkbox ;
718+ tr . appendChild ( td ) ;
719+ td = document . createElement ( "TD" ) ;
720+ td . id = "checkbox-stats-" + checkbox ;
721+ var progressbar = document . createElement ( "div" ) ;
722+ progressbar . classList . add ( "bar" ) ;
723+ td . appendChild ( progressbar ) ;
724+ var text = document . createElement ( "div" ) ;
725+ text . classList . add ( "text" ) ;
726+ td . appendChild ( text ) ;
727+ tr . appendChild ( td ) ;
728+ table . appendChild ( tr ) ;
729+ updateCheckboxStats ( checkbox ) ;
730+ }
731+ }
732+
733+ function updateCheckboxStats ( checkbox ) {
734+ var checked = getStoredCheckboxRefs ( checkbox ) . size ;
735+ var total = pcbdata . modules . length - pcbdata . bom . skipped . length ;
736+ var percent = checked * 100.0 / total ;
737+ var td = document . getElementById ( "checkbox-stats-" + checkbox ) ;
738+ td . firstChild . style . width = percent + "%" ;
739+ td . lastChild . innerHTML = checked + "/" + total + " (" + Math . round ( percent ) + "%)" ;
740+ }
741+
670742document . onkeydown = function ( e ) {
671743 switch ( e . key ) {
672744 case "n" :
@@ -820,6 +892,7 @@ window.onload = function(e) {
820892 filter = "" ;
821893 reflookup = "" ;
822894 initDone = true ;
895+ prepCheckboxes ( ) ;
823896 // Triggers render
824897 changeBomLayout ( bomlayout ) ;
825898}
0 commit comments