From 65d78c12d8afa41de1c8afdfbbdd650d217f47ae Mon Sep 17 00:00:00 2001 From: Selim Mustafaev Date: Fri, 9 Oct 2020 00:49:20 +0300 Subject: [PATCH] Context menu for history list items --- AutoCat/Controllers/CheckController.swift | 71 +++++++++++++++-------- AutoCat/Utils/RxRealmDataSource.swift | 14 ++++- 2 files changed, 59 insertions(+), 26 deletions(-) diff --git a/AutoCat/Controllers/CheckController.swift b/AutoCat/Controllers/CheckController.swift index a34bcb4..65975c6 100644 --- a/AutoCat/Controllers/CheckController.swift +++ b/AutoCat/Controllers/CheckController.swift @@ -160,36 +160,14 @@ class CheckController: UIViewController, UITableViewDelegate, UITextFieldDelegat let vehicle = self.historyDataSource.item(at: indexPath) let updateAction = UIContextualAction(style: .normal, title: "Update") { action, view, completion in - IHProgressHUD.show() - - var eventAction: EventAction = .doNotSend - if vehicle.unrecognized, let savedEvent = vehicle.events.first { - eventAction = .sendSpecific(savedEvent) - } - - self.check(number: vehicle.getNumber(), action: eventAction, force: true).subscribe { vehicle in - self.updateDetailController(with: vehicle) - IHProgressHUD.dismiss() - } onError: { error in - IHProgressHUD.show(error: error) - } - .disposed(by: self.bag) - + self.update(vehicle: vehicle) completion(true) } updateAction.image = UIImage(systemName: "arrow.2.circlepath") updateAction.backgroundColor = .systemBlue let removeAction = UIContextualAction(style: .destructive, title: "Remove") { action, view, completion in - if let realm = vehicle.realm { - do { - try realm.write { - realm.delete(vehicle) - } - } catch { - print(error) - } - } + self.remove(vehicle: vehicle) } removeAction.image = UIImage(systemName: "trash") @@ -203,6 +181,51 @@ class CheckController: UIViewController, UITableViewDelegate, UITextFieldDelegat self.updateDetailController(with: vehicle) } + func tableView(_ tableView: UITableView, contextMenuConfigurationForRowAt indexPath: IndexPath, point: CGPoint) -> UIContextMenuConfiguration? { + let vehicle = self.historyDataSource.item(at: indexPath) + return UIContextMenuConfiguration(identifier: nil, previewProvider: nil) { _ in + let update = UIAction(title: "Update", image: UIImage(systemName: "arrow.2.circlepath")) { action in + self.update(vehicle: vehicle) + } + let remove = UIAction(title: "Remove", image: UIImage(systemName: "trash"), attributes: [.destructive]) { action in + self.remove(vehicle: vehicle) + } + + return UIMenu(title: "Actions", children: [update, remove]) + } + } + + // MARK: - Contextual actions + + func update(vehicle: Vehicle) { + IHProgressHUD.show() + + var eventAction: EventAction = .doNotSend + if vehicle.unrecognized, let savedEvent = vehicle.events.first { + eventAction = .sendSpecific(savedEvent) + } + + self.check(number: vehicle.getNumber(), action: eventAction, force: true).subscribe { vehicle in + self.updateDetailController(with: vehicle) + IHProgressHUD.dismiss() + } onError: { error in + IHProgressHUD.show(error: error) + } + .disposed(by: self.bag) + } + + func remove(vehicle: Vehicle) { + if let realm = vehicle.realm { + do { + try realm.write { + realm.delete(vehicle) + } + } catch { + print(error) + } + } + } + // MARK: - Checking number func save(vehicle: Vehicle) throws { diff --git a/AutoCat/Utils/RxRealmDataSource.swift b/AutoCat/Utils/RxRealmDataSource.swift index f31b12d..4b58955 100644 --- a/AutoCat/Utils/RxRealmDataSource.swift +++ b/AutoCat/Utils/RxRealmDataSource.swift @@ -22,7 +22,9 @@ class RealmSectionedDataSource: NSObject, UITableViewDataSource where case .initial: self.sections = self.data.groupedByDate() self.tv.reloadData() - case .update(_, let deletions, let insertions, let modifications): + case .update(_, let deletions, let insertions, let modifications): + print("====== Deletes: \(deletions.count), Inserts: \(insertions.count), Mods: \(modifications.count)") + let oldSectionsCount = self.sections.count self.tv.beginUpdates() let delPaths = deletions.map(self.indexPath) self.tv.deleteRows(at: deletions.map(self.indexPath), with: .automatic) @@ -35,7 +37,15 @@ class RealmSectionedDataSource: NSObject, UITableViewDataSource where self.tv.insertSections(IndexSet(integer: insPath.section), with: .automatic) } self.tv.insertRows(at: insPaths, with: .automatic) - self.tv.reloadRows(at: modifications.map(self.indexPath), with: .automatic) + let modPaths = modifications.map(self.indexPath) + if let modPath = modPaths.first { + if oldSectionsCount > self.sections.count { + self.tv.deleteSections(IndexSet(integer: modPath.section), with: .automatic) + } else if oldSectionsCount < self.sections.count { + self.tv.insertSections(IndexSet(integer: modPath.section), with: .automatic) + } + } + self.tv.reloadRows(at: modPaths, with: .automatic) self.tv.endUpdates() case .error(let err): print("Realm observer error: \(err)")