filterTimeline function

List<TimelineItem> filterTimeline(
  1. List<TimelineItem> timeline,
  2. String? filterText,
  3. DateTimeRange? filterDateRange,
  4. List<AppEventFilterType>? selectedFilters,
)

Returns the given list of timeline items, but filtered to only include the given filter text and date range.

The filters do not apply if the filter itself is null or empty.

Implementation

List<TimelineItem> filterTimeline(
  List<TimelineItem> timeline,
  String? filterText,
  DateTimeRange? filterDateRange,
  List<AppEventFilterType>? selectedFilters,
) {
  bool containsFilterText(TimelineItem item) {
    return filterText == null ||
        filterText.isEmpty ||
        (item.name != null &&
            item.name!.toLowerCase().contains(filterText.toLowerCase()));
  }

  bool isWithinDateRange(TimelineItem item) {
    final date = item.date;

    if (filterDateRange == null) return true;
    if (date == null) return false;

    return date.isAfter(filterDateRange.start) &&
        date.isBefore(filterDateRange.end);
  }

  bool matchesSelectedFilters(TimelineItem item) {
    if (selectedFilters == null || selectedFilters.isEmpty) return true;

    final typeMapping = {
      TimelineItemType.shutdown: AppEventFilterType.shutdown,
      TimelineItemType.warning: AppEventFilterType.warning,
      TimelineItemType.runningNotice: AppEventFilterType.notice,
      TimelineItemType.notice: AppEventFilterType.notice,
    };

    final eventMapping = {
      TimelineItemEvent.engineStarted: AppEventFilterType.engineStarted,
      TimelineItemEvent.engineStopped: AppEventFilterType.engineStopped,
      TimelineItemEvent.exerciseStarted: AppEventFilterType.exerciseStarted,
      TimelineItemEvent.exerciseStopped: AppEventFilterType.exerciseStopped,
      TimelineItemEvent.maintenanceDue: AppEventFilterType.maintenanceDue,
    };

    return selectedFilters.any(
      (filter) =>
          typeMapping[item.type] == filter ||
          eventMapping[item.event] == filter,
    );
  }

  return timeline
      .where(containsFilterText)
      .where(isWithinDateRange)
      .where(matchesSelectedFilters)
      .toList();
}