@@ -3,6 +3,7 @@ import type { EvaluationRow } from "./types/eval-protocol";
33import type { PivotConfig , FilterGroup } from "./types/filters" ;
44import flattenJson from "./util/flatten-json" ;
55import type { FlatJson } from "./util/flatten-json" ;
6+ import { createFilterFunction } from "./util/filter-utils" ;
67
78// Default pivot configuration
89const DEFAULT_PIVOT_CONFIG : PivotConfig = {
@@ -318,9 +319,7 @@ export class GlobalState {
318319 return this . flattenedDataset ;
319320 }
320321
321- const filterFunction = this . createFilterFunction (
322- this . appliedTableFilterConfig
323- ) ;
322+ const filterFunction = createFilterFunction ( this . appliedTableFilterConfig ) ! ;
324323 return this . flattenedDataset . filter ( filterFunction ) ;
325324 }
326325
@@ -329,9 +328,7 @@ export class GlobalState {
329328 return this . sortedDataset ;
330329 }
331330
332- const filterFunction = this . createFilterFunction (
333- this . appliedTableFilterConfig
334- ) ;
331+ const filterFunction = createFilterFunction ( this . appliedTableFilterConfig ) ! ;
335332 return this . sortedIds
336333 . filter ( ( id ) => filterFunction ( this . flattenedById [ id ] ) )
337334 . map ( ( id ) => this . dataset [ id ] ) ;
@@ -364,93 +361,4 @@ export class GlobalState {
364361 get endRow ( ) {
365362 return Math . min ( this . currentPage * this . pageSize , this . totalCount ) ;
366363 }
367-
368- // Create filter function from filter group configuration
369- private createFilterFunction ( filterGroups : FilterGroup [ ] ) {
370- if ( filterGroups . length === 0 ) return ( ) => true ;
371-
372- return ( record : any ) => {
373- return filterGroups . every ( ( group ) => {
374- if ( group . filters . length === 0 ) return true ;
375-
376- if ( group . logic === "OR" ) {
377- // For OR logic, at least one filter must pass
378- return group . filters . some ( ( filter ) =>
379- this . evaluateFilter ( filter , record )
380- ) ;
381- } else {
382- // For AND logic, all filters must pass
383- return group . filters . every ( ( filter ) =>
384- this . evaluateFilter ( filter , record )
385- ) ;
386- }
387- } ) ;
388- } ;
389- }
390-
391- // Helper function to evaluate a single filter
392- private evaluateFilter ( filter : any , record : any ) : boolean {
393- if ( ! filter . field || ! filter . value ) return true ; // Skip incomplete filters
394-
395- const fieldValue = record [ filter . field ] ;
396- const filterValue = filter . value ;
397- const filterValue2 = filter . value2 ;
398-
399- // Handle date filtering
400- if ( filter . type === "date" || filter . type === "date-range" ) {
401- const fieldDate = new Date ( fieldValue ) ;
402- const valueDate = new Date ( filterValue ) ;
403-
404- if ( isNaN ( fieldDate . getTime ( ) ) || isNaN ( valueDate . getTime ( ) ) ) {
405- return true ; // Skip invalid dates
406- }
407-
408- switch ( filter . operator ) {
409- case "==" :
410- return fieldDate . toDateString ( ) === valueDate . toDateString ( ) ;
411- case "!=" :
412- return fieldDate . toDateString ( ) !== valueDate . toDateString ( ) ;
413- case ">=" :
414- return fieldDate >= valueDate ;
415- case "<=" :
416- return fieldDate <= valueDate ;
417- case "between" :
418- if ( filterValue2 ) {
419- const valueDate2 = new Date ( filterValue2 ) ;
420- if ( ! isNaN ( valueDate2 . getTime ( ) ) ) {
421- return fieldDate >= valueDate && fieldDate <= valueDate2 ;
422- }
423- }
424- return true ; // Skip incomplete between filter
425- default :
426- return true ;
427- }
428- }
429-
430- // Handle text/numeric filtering
431- switch ( filter . operator ) {
432- case "==" :
433- return String ( fieldValue ) === filterValue ;
434- case "!=" :
435- return String ( fieldValue ) !== filterValue ;
436- case ">" :
437- return Number ( fieldValue ) > Number ( filterValue ) ;
438- case "<" :
439- return Number ( fieldValue ) < Number ( filterValue ) ;
440- case ">=" :
441- return Number ( fieldValue ) >= Number ( filterValue ) ;
442- case "<=" :
443- return Number ( fieldValue ) <= Number ( filterValue ) ;
444- case "contains" :
445- return String ( fieldValue )
446- . toLowerCase ( )
447- . includes ( filterValue . toLowerCase ( ) ) ;
448- case "!contains" :
449- return ! String ( fieldValue )
450- . toLowerCase ( )
451- . includes ( filterValue . toLowerCase ( ) ) ;
452- default :
453- return true ;
454- }
455- }
456364}
0 commit comments