From 15ed7aaf2f4d766080865f8ea35f38fd491ff8f4 Mon Sep 17 00:00:00 2001 From: Yishi Lin Date: Sat, 28 Oct 2017 15:32:30 +0800 Subject: [PATCH] Update Safari extension search logic #138 - Match the entered text in each pathname levels --- passExtension/ExtensionViewController.swift | 25 ++++++++++++++------- passKit/Models/PasswordEntity.swift | 6 ++++- 2 files changed, 22 insertions(+), 9 deletions(-) diff --git a/passExtension/ExtensionViewController.swift b/passExtension/ExtensionViewController.swift index a37912d..6e2d67e 100644 --- a/passExtension/ExtensionViewController.swift +++ b/passExtension/ExtensionViewController.swift @@ -12,10 +12,14 @@ import passKit fileprivate class PasswordsTableEntry : NSObject { var title: String + var categoryText: String + var categoryArray: [String] var passwordEntity: PasswordEntity? - init(title: String, passwordEntity: PasswordEntity?) { - self.title = title - self.passwordEntity = passwordEntity + init(_ entity: PasswordEntity) { + self.title = entity.name! + self.categoryText = entity.getCategoryText() + self.categoryArray = entity.getCategoryArray() + self.passwordEntity = entity } } @@ -46,7 +50,7 @@ class ExtensionViewController: UIViewController, UITableViewDataSource, UITableV var passwordEntities = [PasswordEntity]() passwordEntities = self.passwordStore.fetchPasswordEntityCoreData(withDir: false) passwordsTableEntries = passwordEntities.map { - PasswordsTableEntry(title: $0.name!, passwordEntity: $0) + PasswordsTableEntry($0) } } @@ -141,7 +145,7 @@ class ExtensionViewController: UIViewController, UITableViewDataSource, UITableV } cell.accessoryType = .none cell.detailTextLabel?.font = UIFont.preferredFont(forTextStyle: .footnote) - cell.detailTextLabel?.text = entry.passwordEntity?.getCategoryText() + cell.detailTextLabel?.text = entry.categoryText return cell } @@ -241,10 +245,15 @@ class ExtensionViewController: UIViewController, UITableViewDataSource, UITableV func searchBarSearchButtonClicked(_ searchBar: UISearchBar) { if let searchText = searchBar.text, searchText.isEmpty == false { - let searchTextLowerCased = searchText.lowercased() filteredPasswordsTableEntries = passwordsTableEntries.filter { entry in - let entryTitle = entry.title.lowercased() - return entryTitle.contains(searchTextLowerCased) || searchTextLowerCased.contains(entryTitle) + var matched = false + matched = matched || entry.title.range(of: searchText, options: .caseInsensitive) != nil + matched = matched || searchText.range(of: entry.title, options: .caseInsensitive) != nil + entry.categoryArray.forEach({ (category) in + matched = matched || category.range(of: searchText, options: .caseInsensitive) != nil + matched = matched || searchText.range(of: category, options: .caseInsensitive) != nil + }) + return matched } searchActive = true } else { diff --git a/passKit/Models/PasswordEntity.swift b/passKit/Models/PasswordEntity.swift index 645dba8..5678ce4 100644 --- a/passKit/Models/PasswordEntity.swift +++ b/passKit/Models/PasswordEntity.swift @@ -22,6 +22,10 @@ extension PasswordEntity { } public func getCategoryText() -> String { + return getCategoryArray().joined(separator: " > ") + } + + public func getCategoryArray() -> [String] { var parentEntity = parent var passwordCategoryArray: [String] = [] while parentEntity != nil { @@ -29,7 +33,7 @@ extension PasswordEntity { parentEntity = parentEntity!.parent } passwordCategoryArray.reverse() - return passwordCategoryArray.joined(separator: " > ") + return passwordCategoryArray } public func getURL() -> URL? {