@@ -70,7 +70,9 @@ export function captureCurrentFilterState() {
7070 licenseType : getSelectValues ( 'licenseType' ) ,
7171 vehRegState : getSelectValues ( 'vehRegState' ) ,
7272 directionTravel : getSelectValues ( 'directionTravel' ) ,
73- unitMovement : getSelectValues ( 'unitMovement' )
73+ unitMovement : getSelectValues ( 'unitMovement' ) ,
74+ // Capture draw area state for proper change detection
75+ drawnArea : drawState . drawnLayer ? JSON . stringify ( drawState . drawnLayer . toGeoJSON ( ) ) : null
7476 } ;
7577 return state ;
7678}
@@ -712,47 +714,20 @@ export function matchesUnitsFilters(row, filters) {
712714 const hasRegStateFilter = ! filters . selectedRegStates . includes ( 'all' ) ;
713715 const hasDirectionFilter = ! filters . selectedDirections . includes ( 'all' ) ;
714716 const hasMovementFilter = ! filters . selectedMovements . includes ( 'all' ) ;
717+ const hasHeavyVehicleFilter = filters . heavyVehicle !== 'all' ;
718+ const hasTowingFilter = filters . towing !== 'all' ;
719+ const hasRolloverFilter = filters . rollover !== 'all' ;
720+ const hasFireFilter = filters . fire !== 'all' ;
715721
716- const hasAnyMultiSelectUnitFilter = hasVehicleTypeFilter || hasVehicleYearFilter ||
717- hasOccupantsFilter || hasLicenseTypeFilter ||
718- hasRegStateFilter || hasDirectionFilter || hasMovementFilter ;
722+ const hasAnyUnitFilter = hasVehicleTypeFilter || hasVehicleYearFilter ||
723+ hasOccupantsFilter || hasLicenseTypeFilter ||
724+ hasRegStateFilter || hasDirectionFilter || hasMovementFilter ||
725+ hasHeavyVehicleFilter || hasTowingFilter || hasRolloverFilter || hasFireFilter ;
719726
720- // Handle Heavy Vehicle filter
721- if ( filters . heavyVehicle !== 'all' ) {
722- if ( units . length === 0 ) return filters . heavyVehicle !== 'yes' ;
723- const hasHeavyVehicle = units . some ( u => HEAVY_VEHICLE_TYPES . includes ( u [ 'Unit Type' ] ) ) ;
724- if ( filters . heavyVehicle === 'yes' && ! hasHeavyVehicle ) return false ;
725- if ( filters . heavyVehicle === 'no' && hasHeavyVehicle ) return false ;
726- }
727-
728- // Handle Towing filter
729- if ( filters . towing !== 'all' ) {
730- if ( units . length === 0 ) return filters . towing !== 'Yes' ;
731- const hasTowing = units . some ( u => {
732- const val = ( u . Towing || '' ) . trim ( ) ;
733- return val !== '' && val !== 'Not Towing' && val !== 'Unknown' ;
734- } ) ;
735- if ( filters . towing === 'Yes' && ! hasTowing ) return false ;
736- if ( filters . towing === 'No' && hasTowing ) return false ;
737- }
738-
739- // Handle Rollover filter
740- if ( filters . rollover !== 'all' ) {
741- if ( units . length === 0 ) return filters . rollover !== 'Yes' ;
742- const hasRollover = units . some ( u => u . Rollover && u . Rollover . trim ( ) !== '' ) ;
743- if ( filters . rollover === 'Yes' && ! hasRollover ) return false ;
744- if ( filters . rollover === 'No' && hasRollover ) return false ;
745- }
746-
747- // Handle Fire filter
748- if ( filters . fire !== 'all' ) {
749- if ( units . length === 0 ) return filters . fire !== 'Yes' ;
750- const hasFire = units . some ( u => u . Fire && u . Fire . trim ( ) !== '' ) ;
751- if ( filters . fire === 'Yes' && ! hasFire ) return false ;
752- if ( filters . fire === 'No' && hasFire ) return false ;
753- }
727+ // If no unit filters are active, pass all crashes
728+ if ( ! hasAnyUnitFilter ) return true ;
754729
755- if ( ! hasAnyMultiSelectUnitFilter ) return true ;
730+ // If filters are active but crash has no units, reject
756731 if ( units . length === 0 ) return false ;
757732
758733 // Create Sets for O(1) lookups
@@ -764,12 +739,43 @@ export function matchesUnitsFilters(row, filters) {
764739 const directionSet = hasDirectionFilter ? new Set ( filters . selectedDirections ) : null ;
765740 const movementSet = hasMovementFilter ? new Set ( filters . selectedMovements ) : null ;
766741
767- // Check if ANY unit matches ALL active multi-select filters
742+ // Check if ANY unit matches ALL active filters (including yes/no filters)
768743 return units . some ( unit => {
744+ // Heavy Vehicle filter - must be checked per unit
745+ if ( hasHeavyVehicleFilter ) {
746+ const isHeavyVehicle = HEAVY_VEHICLE_TYPES . includes ( unit [ 'Unit Type' ] ) ;
747+ if ( filters . heavyVehicle === 'yes' && ! isHeavyVehicle ) return false ;
748+ if ( filters . heavyVehicle === 'no' && isHeavyVehicle ) return false ;
749+ }
750+
751+ // Towing filter - must be checked per unit
752+ if ( hasTowingFilter ) {
753+ const val = ( unit . Towing || '' ) . trim ( ) ;
754+ const hasTowing = val !== '' && val !== 'Not Towing' && val !== 'Unknown' ;
755+ if ( filters . towing === 'Yes' && ! hasTowing ) return false ;
756+ if ( filters . towing === 'No' && hasTowing ) return false ;
757+ }
758+
759+ // Rollover filter - must be checked per unit
760+ if ( hasRolloverFilter ) {
761+ const hasRollover = unit . Rollover && unit . Rollover . trim ( ) !== '' ;
762+ if ( filters . rollover === 'Yes' && ! hasRollover ) return false ;
763+ if ( filters . rollover === 'No' && hasRollover ) return false ;
764+ }
765+
766+ // Fire filter - must be checked per unit
767+ if ( hasFireFilter ) {
768+ const hasFire = unit . Fire && unit . Fire . trim ( ) !== '' ;
769+ if ( filters . fire === 'Yes' && ! hasFire ) return false ;
770+ if ( filters . fire === 'No' && hasFire ) return false ;
771+ }
772+
773+ // Vehicle Type filter
769774 if ( hasVehicleTypeFilter && ! vehicleTypeSet . has ( unit [ 'Unit Type' ] ) ) {
770775 return false ;
771776 }
772777
778+ // Vehicle Year filter
773779 if ( hasVehicleYearFilter ) {
774780 const year = parseInt ( unit [ 'Veh Year' ] ) ;
775781 if ( isNaN ( year ) ) return false ;
@@ -783,6 +789,7 @@ export function matchesUnitsFilters(row, filters) {
783789 if ( ! matchesAnyYear ) return false ;
784790 }
785791
792+ // Occupants filter
786793 if ( hasOccupantsFilter ) {
787794 const occupantsStr = unit [ 'Number Occupants' ] ;
788795 if ( occupantsStr !== undefined && occupantsStr !== null ) {
@@ -806,18 +813,22 @@ export function matchesUnitsFilters(row, filters) {
806813 }
807814 }
808815
816+ // License Type filter
809817 if ( hasLicenseTypeFilter && ! licenseTypeSet . has ( unit [ 'Licence Type' ] ) ) {
810818 return false ;
811819 }
812820
821+ // Registration State filter
813822 if ( hasRegStateFilter && ! regStateSet . has ( unit [ 'Veh Reg State' ] ) ) {
814823 return false ;
815824 }
816825
826+ // Direction of Travel filter
817827 if ( hasDirectionFilter && ! directionSet . has ( unit [ 'Direction Of Travel' ] ) ) {
818828 return false ;
819829 }
820830
831+ // Unit Movement filter
821832 if ( hasMovementFilter && ! movementSet . has ( unit [ 'Unit Movement' ] ) ) {
822833 return false ;
823834 }
0 commit comments