summaryrefslogtreecommitdiff
path: root/Hutch/Views/Builds/BuildListViewModel.swift
diff options
context:
space:
mode:
authorChristian Cleberg <[email protected]>2026-04-12 00:34:54 -0500
committerChristian Cleberg <[email protected]>2026-04-12 00:34:54 -0500
commit5f6d545eb3455a9e4da5a3cb4460811e3a48d939 (patch)
tree7b7591146da4e02bd617ddb9f26e47b1c4474ef6 /Hutch/Views/Builds/BuildListViewModel.swift
parentcb1ea5ea4f163d87053285d3fb7999b12a3558b9 (diff)
downloadhutch-2.14.0.tar.gz
hutch-2.14.0.tar.bz2
hutch-2.14.0.zip
improve home attention flows and cross-linkingv2.14.0
Diffstat (limited to 'Hutch/Views/Builds/BuildListViewModel.swift')
-rw-r--r--Hutch/Views/Builds/BuildListViewModel.swift35
1 files changed, 33 insertions, 2 deletions
diff --git a/Hutch/Views/Builds/BuildListViewModel.swift b/Hutch/Views/Builds/BuildListViewModel.swift
index 0757ad8..8468cff 100644
--- a/Hutch/Views/Builds/BuildListViewModel.swift
+++ b/Hutch/Views/Builds/BuildListViewModel.swift
@@ -19,6 +19,12 @@ private struct SubmittedJob: Decodable, Sendable {
let id: Int
}
+enum BuildListFilter: String, CaseIterable, Sendable {
+ case attention = "Attention"
+ case active = "Active"
+ case all = "All"
+}
+
// MARK: - View Model
@Observable
@@ -31,6 +37,7 @@ final class BuildListViewModel {
private(set) var isRefreshing = false
private(set) var isSubmitting = false
var error: String?
+ var filter: BuildListFilter = .attention
var searchText = ""
private var cursor: String?
@@ -44,9 +51,10 @@ final class BuildListViewModel {
}
var filteredJobs: [JobSummary] {
+ let statusFiltered = Self.filterJobs(jobs, filter: filter)
let q = searchText.trimmingCharacters(in: .whitespacesAndNewlines).lowercased()
- guard !q.isEmpty else { return jobs }
- return jobs.filter {
+ guard !q.isEmpty else { return statusFiltered }
+ return statusFiltered.filter {
String($0.id).contains(q) ||
$0.tags.contains { $0.lowercased().contains(q) } ||
($0.note?.lowercased().contains(q) == true) ||
@@ -272,4 +280,27 @@ final class BuildListViewModel {
let cancel: CancelResult
}
+
+ nonisolated static func filterJobs(_ jobs: [JobSummary], filter: BuildListFilter) -> [JobSummary] {
+ jobs.filter { job in
+ switch filter {
+ case .attention:
+ switch job.status {
+ case .failed, .timeout, .running, .queued, .pending:
+ return true
+ case .success, .cancelled:
+ return false
+ }
+ case .active:
+ switch job.status {
+ case .running, .queued, .pending:
+ return true
+ case .success, .failed, .cancelled, .timeout:
+ return false
+ }
+ case .all:
+ return true
+ }
+ }
+ }
}