Skip to content

Commit ac8c73e

Browse files
author
Dylan Huang
committed
DRY things
1 parent a8ee89e commit ac8c73e

1 file changed

Lines changed: 3 additions & 95 deletions

File tree

vite-app/src/GlobalState.tsx

Lines changed: 3 additions & 95 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import type { EvaluationRow } from "./types/eval-protocol";
33
import type { PivotConfig, FilterGroup } from "./types/filters";
44
import flattenJson from "./util/flatten-json";
55
import type { FlatJson } from "./util/flatten-json";
6+
import { createFilterFunction } from "./util/filter-utils";
67

78
// Default pivot configuration
89
const 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

Comments
 (0)