From 8bee6e2185d3150365c78ab9f5a80423502a4fef Mon Sep 17 00:00:00 2001 From: Aliaksandr Baranau Date: Fri, 27 Dec 2024 12:48:42 +0100 Subject: [PATCH] feat(disasters panel): 20511 Added config-based filters by last N days (updatedAt and startedAt fields) --- .../events_list/atoms/sortedEventList.ts | 7 +++ .../events_list/helpers/localEventFilters.ts | 46 ++++++++++++++++--- src/features/events_list/types.ts | 4 ++ 3 files changed, 51 insertions(+), 6 deletions(-) diff --git a/src/features/events_list/atoms/sortedEventList.ts b/src/features/events_list/atoms/sortedEventList.ts index 7f9f26267..fc45fa4df 100644 --- a/src/features/events_list/atoms/sortedEventList.ts +++ b/src/features/events_list/atoms/sortedEventList.ts @@ -6,6 +6,8 @@ import { sortEventsBySingleProperty } from '../helpers/singlePropertySort'; import { sortEventsByMcda } from '../helpers/eventsMcdaSort'; import { filterByExcludedEventTypes, + filterByLastNDaysStartedAt, + filterByLastNDaysUpdatedAt, filterByMinAffectedPopulation, filterByMinSeverity, filterByMinStartedAt, @@ -56,11 +58,16 @@ function applyLocalEventListFilters( if (filtersConfig.excludedEventTypes) { result = filterByExcludedEventTypes(result, filtersConfig.excludedEventTypes); } + // date filters if (filtersConfig.minUpdatedAt) { result = filterByMinUpdatedAt(result, filtersConfig.minUpdatedAt); + } else if (isNumber(filtersConfig.lastNDaysUpdatedAt)) { + result = filterByLastNDaysUpdatedAt(result, filtersConfig.lastNDaysUpdatedAt); } if (filtersConfig.minStartedAt) { result = filterByMinStartedAt(result, filtersConfig.minStartedAt); + } else if (isNumber(filtersConfig.lastNDaysStartedAt)) { + result = filterByLastNDaysStartedAt(result, filtersConfig.lastNDaysStartedAt); } return result; } diff --git a/src/features/events_list/helpers/localEventFilters.ts b/src/features/events_list/helpers/localEventFilters.ts index 1d05f7602..4fa8eb8fd 100644 --- a/src/features/events_list/helpers/localEventFilters.ts +++ b/src/features/events_list/helpers/localEventFilters.ts @@ -1,12 +1,26 @@ import { SEVERITY_SORTING_SCORES } from '../constants'; import type { Event, EventType, Severity } from '~core/types'; +export function filterByLastNDaysUpdatedAt(events: Event[], days: number): Event[] { + const minTime = getNDaysBack(days).getTime(); + if (minTime > 0) { + return filterByMinTime(events, minTime, (event) => event.updatedAt); + } + return events; +} + +export function filterByLastNDaysStartedAt(events: Event[], days: number): Event[] { + const minTime = getNDaysBack(days).getTime(); + if (minTime > 0) { + return filterByMinTime(events, minTime, (event) => event.startedAt); + } + return events; +} + export function filterByMinUpdatedAt(events: Event[], minDateString: string): Event[] { const minTime = new Date(minDateString).getTime(); if (minTime) { - return events.filter((event) => { - return event.updatedAt && new Date(event.updatedAt).getTime() >= minTime; - }); + return filterByMinTime(events, minTime, (event) => event.updatedAt); } return events; } @@ -14,9 +28,7 @@ export function filterByMinUpdatedAt(events: Event[], minDateString: string): Ev export function filterByMinStartedAt(events: Event[], minDateString: string): Event[] { const minTime = new Date(minDateString).getTime(); if (minTime) { - return events.filter((event) => { - return event.startedAt && new Date(event.startedAt).getTime() >= minTime; - }); + return filterByMinTime(events, minTime, (event) => event.startedAt); } return events; } @@ -59,3 +71,25 @@ export function filterByExcludedEventTypes( } return events; } + +function filterByMinTime( + events: Event[], + minTimeMs: number, + fieldExtractor: (event: Event) => string, +): Event[] { + return events.filter((event) => { + return ( + fieldExtractor(event) && new Date(fieldExtractor(event)).getTime() >= minTimeMs + ); + }); +} + +function getNDaysBack(days: number): Date { + const date = new Date(); + date.setDate(date.getDate() - days); + date.setHours(0); + date.setMinutes(0); + date.setSeconds(0); + date.setMilliseconds(0); + return date; +} diff --git a/src/features/events_list/types.ts b/src/features/events_list/types.ts index ab2500675..0de2412bd 100644 --- a/src/features/events_list/types.ts +++ b/src/features/events_list/types.ts @@ -8,6 +8,10 @@ export type LocalEventListFilters = { minSeverity?: Severity; minStartedAt?: string; minUpdatedAt?: string; + // minUpdatedAt has priority + lastNDaysUpdatedAt?: number; + // minStartedAt has priority + lastNDaysStartedAt?: number; }; export type EventsListFeatureConfig = {