diff options
Diffstat (limited to 'Hutch/Views/Builds/BuildListViewModel.swift')
| -rw-r--r-- | Hutch/Views/Builds/BuildListViewModel.swift | 28 |
1 files changed, 25 insertions, 3 deletions
diff --git a/Hutch/Views/Builds/BuildListViewModel.swift b/Hutch/Views/Builds/BuildListViewModel.swift index cf5d786..14f50fd 100644 --- a/Hutch/Views/Builds/BuildListViewModel.swift +++ b/Hutch/Views/Builds/BuildListViewModel.swift @@ -45,6 +45,7 @@ enum AutoRefreshInterval: Int, CaseIterable, Sendable { @MainActor final class BuildListViewModel { private static let searchHistoryScopeID = "builds" + nonisolated static let defaultLookbackDays = HomeViewModel.defaultFailedBuildLookbackDays private(set) var jobs: [JobSummary] = [] { didSet { updateFilteredJobs() } @@ -68,6 +69,9 @@ final class BuildListViewModel { updateFilteredJobs() } } + var lookbackDays = defaultLookbackDays { + didSet { updateFilteredJobs() } + } // Cached filtered result. Updated whenever jobs, filter, searchText, or // repoFilter changes. Only notifies observers when the content actually // differs, which prevents the list from re-rendering on auto-refresh when @@ -99,7 +103,7 @@ final class BuildListViewModel { } private func updateFilteredJobs() { - var result = Self.filterJobs(jobs, filter: filter) + var result = Self.filterJobs(jobs, filter: filter, lookbackDays: lookbackDays) if !repoFilter.isEmpty { result = result.filter { $0.tags.contains(repoFilter) } } @@ -382,8 +386,14 @@ final class BuildListViewModel { let cancel: CancelResult } - nonisolated static func filterJobs(_ jobs: [JobSummary], filter: BuildListFilter) -> [JobSummary] { - jobs.filter { job in + nonisolated static func filterJobs( + _ jobs: [JobSummary], + filter: BuildListFilter, + lookbackDays: Int, + now: Date = .now, + calendar: Calendar = .current + ) -> [JobSummary] { + let filteredByStatus = jobs.filter { job in switch filter { case .attention: switch job.status { @@ -403,6 +413,18 @@ final class BuildListViewModel { return true } } + + let normalizedLookbackDays = HomeViewModel.allowedFailedBuildLookbackDays.contains(lookbackDays) + ? lookbackDays + : defaultLookbackDays + let startOfToday = calendar.startOfDay(for: now) + let windowStart = calendar.date( + byAdding: .day, + value: -(normalizedLookbackDays - 1), + to: startOfToday + ) ?? startOfToday + + return filteredByStatus.filter { $0.updated >= windowStart } } nonisolated static func searchJobs(_ jobs: [JobSummary], matching query: String) -> [JobSummary] { |
