98 lines
3.8 KiB
Swift
98 lines
3.8 KiB
Swift
import UIKit
|
|
import RxDataSources
|
|
import RxSwift
|
|
import RxCocoa
|
|
|
|
class SearchController: UIViewController, UISearchResultsUpdating {
|
|
|
|
@IBOutlet weak var tableView: UITableView!
|
|
|
|
let bag = DisposeBag()
|
|
let searchController = UISearchController(searchResultsController: nil)
|
|
|
|
var filterRelay = BehaviorRelay<Filter>(value: Filter())
|
|
var filter = Filter()
|
|
|
|
override func viewDidLoad() {
|
|
super.viewDidLoad()
|
|
|
|
searchController.searchResultsUpdater = self
|
|
searchController.obscuresBackgroundDuringPresentation = false
|
|
searchController.searchBar.placeholder = "Search plate numbers"
|
|
navigationItem.searchController = searchController
|
|
definesPresentationContext = true
|
|
|
|
let ds = RxTableViewSectionedAnimatedDataSource<DateSection<Vehicle>>(configureCell: { dataSource, tableView, indexPath, item in
|
|
if let cell = tableView.dequeueReusableCell(withIdentifier: "VehicleCell", for: indexPath) as? VehicleCell {
|
|
cell.configure(with: item)
|
|
return cell
|
|
} else {
|
|
return UITableViewCell()
|
|
}
|
|
})
|
|
|
|
ds.titleForHeaderInSection = { dataSourse, index in
|
|
return dataSourse.sectionModels[index].header
|
|
}
|
|
|
|
self.tableView.rx.modelSelected(Vehicle.self)
|
|
.subscribe(onNext: self.updateDetailController(with:))
|
|
.disposed(by: self.bag)
|
|
|
|
self.filterRelay
|
|
//.throttle(.seconds(2), scheduler: MainScheduler.instance)
|
|
.debounce(.milliseconds(500), scheduler: MainScheduler.instance)
|
|
.flatMap(Api.getVehicles)
|
|
.observeOn(MainScheduler.instance)
|
|
.do(onNext: { self.navigationItem.title = "\($0.count) vehicles found" })
|
|
.map { $0.groupedByDate() }
|
|
.bind(to: self.tableView.rx.items(dataSource: ds))
|
|
.disposed(by: self.bag)
|
|
}
|
|
|
|
// FIXME: Code duplication
|
|
func updateDetailController(with vehicle: Vehicle) {
|
|
if let splitViewController = self.view.window?.rootViewController as? UISplitViewController
|
|
{
|
|
var detail: UINavigationController?
|
|
if splitViewController.viewControllers.count == 2 {
|
|
detail = splitViewController.viewControllers.last as? UINavigationController
|
|
} else {
|
|
let storyboard = UIStoryboard(name: "Main", bundle: nil)
|
|
detail = storyboard.instantiateViewController(identifier: "ReportNavController")
|
|
}
|
|
|
|
if let detail = detail {
|
|
detail.popToRootViewController(animated: true)
|
|
let report = detail.viewControllers.first as? ReportController
|
|
report?.vehicle = vehicle
|
|
splitViewController.showDetailViewController(detail, sender: self)
|
|
//self.performSegue(withIdentifier: "OpenDetailSegue", sender: self)
|
|
}
|
|
}
|
|
}
|
|
|
|
// MARK: - UISearchResultsUpdating
|
|
|
|
func updateSearchResults(for searchController: UISearchController) {
|
|
let newQuery = searchController.searchBar.text?.uppercased() ?? ""
|
|
guard self.filter.searchString != newQuery else { return }
|
|
|
|
self.filter.searchString = newQuery
|
|
self.filterRelay.accept(self.filter)
|
|
}
|
|
|
|
// MARK: -
|
|
|
|
@IBAction func onFilter(_ sender: UIBarButtonItem) {
|
|
let sb = UIStoryboard(name: "Main", bundle: nil)
|
|
let controller = sb.instantiateViewController(identifier: "FiltersController") as FiltersController
|
|
controller.filter = self.filter
|
|
controller.onDone = {
|
|
self.filter = controller.filter
|
|
self.filterRelay.accept(self.filter)
|
|
}
|
|
self.navigationController?.pushViewController(controller, animated: true)
|
|
}
|
|
}
|