filterDeadlines method

List<PlanDeadline> filterDeadlines({
  1. Set<int>? taskIds,
  2. DateTime? start,
  3. DateTime? end,
  4. DateTime? betweenStart,
  5. DateTime? betweenEnd,
  6. bool? plannedForToday,
})

Returns a list of deadlines that match the given filters.

If no filters are provided, all deadlines are returned.

Implementation

List<PlanDeadline> filterDeadlines({
  Set<int>? taskIds,
  DateTime? start,
  DateTime? end,
  DateTime? betweenStart,
  DateTime? betweenEnd,
  bool? plannedForToday,
}) {
  if (!state.hasData) {
    log('Cannot filter deadlines: No plan loaded.');

    return [];
  }

  final now = DateTime(DateTime.now().year, DateTime.now().month, DateTime.now().day);

  return state.requireData.deadlines.where((deadline) {
    final _start = DateTime(deadline.start.year, deadline.start.month, deadline.start.day);
    final _end = DateTime(deadline.end.year, deadline.end.month, deadline.end.day);

    if (taskIds != null && taskIds.contains(deadline.id)) return false;
    if (start != null && _start != start) return false;
    if (end != null && _end != end) return false;

    if (betweenStart != null && _start.isBefore(betweenStart)) return false;
    if (betweenEnd != null && _end.isAfter(betweenEnd)) return false;

    if (plannedForToday != null) {
      final startsBeforeToday = _start.isBefore(now) || _start.isSameDate(now);
      final endsAfterToday = _end.isAfter(now) || _end.isSameDate(now);

      if (plannedForToday && !(startsBeforeToday && endsAfterToday)) return false;
    }

    return true;
  }).toList();
}