06/22 Fix Medium impact items
This commit is contained in:
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user