102 lines
3.4 KiB
Swift
102 lines
3.4 KiB
Swift
//
|
|
// HistoryScreen.swift
|
|
// AutoCat
|
|
//
|
|
// Created by Selim Mustafaev on 15.01.2025.
|
|
// Copyright © 2025 Selim Mustafaev. All rights reserved.
|
|
//
|
|
|
|
import SwiftUI
|
|
import AutoCatCore
|
|
|
|
struct HistoryScreen: View {
|
|
|
|
@State var viewModel: HistoryViewModel
|
|
@State var filterSheetPresented = false
|
|
@State var exportSheetPresented = false
|
|
|
|
var body: some View {
|
|
List {
|
|
ForEach(viewModel.vehicleSections) { section in
|
|
Section(header: Text(section.header)) {
|
|
ForEach(section.elements) { vehicle in
|
|
VehicleCellView(vehicle: vehicle)
|
|
.onTapGesture {
|
|
Task { await viewModel.openReport(vehicle: vehicle) }
|
|
}
|
|
.swipeActions(allowsFullSwipe: false) {
|
|
makeActions(for: vehicle)
|
|
}
|
|
.contextMenu {
|
|
makeActions(for: vehicle, useLabels: true)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
.onAppear {
|
|
Task { await viewModel.onAppear() }
|
|
}
|
|
.hud($viewModel.hud)
|
|
.listStyle(.plain)
|
|
.navigationTitle(String.localizedStringWithFormat(NSLocalizedString("vehicles found", comment: ""),
|
|
viewModel.vehiclesCount))
|
|
.searchable(text: $viewModel.searchText, prompt: "Search plate numbers")
|
|
.autocorrectionDisabled()
|
|
.textInputAutocapitalization(.never)
|
|
.keyboardType(.asciiCapable)
|
|
.toolbar {
|
|
ToolbarItem(placement: .primaryAction) {
|
|
Button("", systemImage: "square.and.arrow.up") {
|
|
exportSheetPresented = true
|
|
}
|
|
}
|
|
ToolbarItem(placement: .primaryAction) {
|
|
Button("", systemImage: "line.horizontal.3.decrease") {
|
|
filterSheetPresented = true
|
|
}
|
|
}
|
|
}
|
|
.confirmationDialog("Filter check history", isPresented: $filterSheetPresented, titleVisibility: .visible) {
|
|
ForEach(HistoryFilter.allCases) { filter in
|
|
Button(filter.title) {
|
|
viewModel.filter = filter
|
|
viewModel.applyFilters()
|
|
}
|
|
}
|
|
}
|
|
.confirmationDialog("Export history as", isPresented: $exportSheetPresented, titleVisibility: .visible) {
|
|
|
|
ShareLink(item: viewModel.vehiclesArchive, preview: SharePreview(VehiclesArchive.fileName)) {
|
|
Text("CSV table")
|
|
}
|
|
|
|
if let dbUrl = viewModel.dbFileURL {
|
|
ShareLink(item: dbUrl) {
|
|
Text("Database file")
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
@ViewBuilder
|
|
func makeActions(for vehicle: VehicleDto, useLabels: Bool = false) -> some View {
|
|
|
|
Button {
|
|
Task { await viewModel.updateVehicle(vehicle) }
|
|
} label: {
|
|
Label(useLabels ? "Update" : "", systemImage: "arrow.2.circlepath")
|
|
}
|
|
|
|
Button(role: .destructive) {
|
|
Task { await viewModel.deleteVehicle(vehicle) }
|
|
} label: {
|
|
Label(useLabels ? "Delete" : "", systemImage: "trash")
|
|
}
|
|
}
|
|
}
|
|
|
|
//#Preview {
|
|
// HistoryScreen(viewModel: .init())
|
|
//}
|