06/22 Fix Medium impact items

This commit is contained in:
Nguyen Ngo
2026-06-22 11:40:05 -04:00
parent e68a702bf9
commit 93ee02ea18
6 changed files with 297 additions and 7 deletions
@@ -18,6 +18,16 @@ struct InspectionHistoryView: View {
private let limit = 30
@State private var searchText = ""
@State private var showFilterSheet = false
@State private var filterFromDate: Date? = nil
@State private var filterToDate: Date? = nil
// Draft values edited in the sheet before applying
@State private var draftFromDate: Date = Calendar.current.date(byAdding: .month, value: -1, to: Date()) ?? Date()
@State private var draftToDate: Date = Date()
@State private var draftFromEnabled = false
@State private var draftToEnabled = false
private var hasActiveFilter: Bool { filterFromDate != nil || filterToDate != nil }
/// Date formatter for search matching formats to e.g. "Jun 19, 2026 4:55 PM"
/// so partial strings like "jun", "2026", "19" all match.
@@ -121,6 +131,39 @@ struct InspectionHistoryView: View {
.navigationTitle("Inspection History")
.searchable(text: $searchText,
prompt: "Search ID, date, facility, area…")
.toolbar {
ToolbarItem(placement: .primaryAction) {
Button {
showFilterSheet = true
} label: {
Image(systemName: hasActiveFilter
? "line.3.horizontal.decrease.circle.fill"
: "line.3.horizontal.decrease.circle")
.foregroundStyle(hasActiveFilter ? .orange : .primary)
}
}
}
.sheet(isPresented: $showFilterSheet) {
DateFilterSheet(
fromEnabled: $draftFromEnabled,
fromDate: $draftFromDate,
toEnabled: $draftToEnabled,
toDate: $draftToDate
) {
// Apply update active filters and reload from server
filterFromDate = draftFromEnabled ? draftFromDate : nil
filterToDate = draftToEnabled ? draftToDate : nil
showFilterSheet = false
Task { await load(reset: true) }
} onClear: {
draftFromEnabled = false
draftToEnabled = false
filterFromDate = nil
filterToDate = nil
showFilterSheet = false
Task { await load(reset: true) }
}
}
.task {
if sync.isOnline {
await load(reset: true)
@@ -141,7 +184,10 @@ struct InspectionHistoryView: View {
do {
let result = try await APIClient.shared.fetchInspectionHistory(
limit: limit, offset: reset ? 0 : offset
limit: limit,
offset: reset ? 0 : offset,
fromDate: filterFromDate,
toDate: filterToDate
)
if reset {
inspections = result.inspections
@@ -160,6 +206,55 @@ struct InspectionHistoryView: View {
}
}
// MARK: - Date Filter Sheet
struct DateFilterSheet: View {
@Binding var fromEnabled: Bool
@Binding var fromDate: Date
@Binding var toEnabled: Bool
@Binding var toDate: Date
let onApply: () -> Void
let onClear: () -> Void
var body: some View {
NavigationStack {
Form {
Section("From Date") {
Toggle("Filter by start date", isOn: $fromEnabled)
if fromEnabled {
DatePicker("From", selection: $fromDate,
displayedComponents: .date)
.datePickerStyle(.compact)
}
}
Section("To Date") {
Toggle("Filter by end date", isOn: $toEnabled)
if toEnabled {
DatePicker("To", selection: $toDate,
displayedComponents: .date)
.datePickerStyle(.compact)
}
}
Section {
Button("Clear Filters", role: .destructive, action: onClear)
}
}
.navigationTitle("Date Filter")
.navigationBarTitleDisplayMode(.inline)
.toolbar {
ToolbarItem(placement: .cancellationAction) {
Button("Cancel") { onClear() }
}
ToolbarItem(placement: .confirmationAction) {
Button("Apply", action: onApply)
.bold()
}
}
}
.presentationDetents([.medium])
}
}
// MARK: - History Row
struct HistoryRowView: View {