Ver Fonte

coding

Signed-off-by: marinofaggiana <ios@nextcloud.com>
marinofaggiana há 2 anos atrás
pai
commit
b3eec9e422

+ 1 - 1
Nextcloud.xcodeproj/project.pbxproj

@@ -3270,7 +3270,7 @@
 			isa = XCRemoteSwiftPackageReference;
 			repositoryURL = "https://github.com/nextcloud/ios-communication-library/";
 			requirement = {
-				branch = develop;
+				branch = unifiedsearchimprovement;
 				kind = branch;
 			};
 		};

+ 11 - 2
iOSClient/Data/NCDataSource.swift

@@ -31,6 +31,7 @@ class NCDataSource: NSObject {
 
     private var sectionsValue: [String] = []
     private var providers: [NCCSearchProvider]?
+    private var searchResults: [NCCSearchResult]?
     private var shares: [tableShare] = []
     private var localFiles: [tableLocalFile] = []
 
@@ -45,7 +46,7 @@ class NCDataSource: NSObject {
         super.init()
     }
 
-    init(metadatasSource: [tableMetadata], account: String, sort: String? = "none", ascending: Bool? = false, directoryOnTop: Bool? = true, favoriteOnTop: Bool? = true, filterLivePhoto: Bool? = true, groupByField: String = "name", providers: [NCCSearchProvider]? = nil) {
+    init(metadatasSource: [tableMetadata], account: String, sort: String? = "none", ascending: Bool? = false, directoryOnTop: Bool? = true, favoriteOnTop: Bool? = true, filterLivePhoto: Bool? = true, groupByField: String = "name", providers: [NCCSearchProvider]? = nil, searchResults: [NCCSearchResult]? = nil) {
         super.init()
 
         self.metadatasSource = metadatasSource
@@ -58,6 +59,7 @@ class NCDataSource: NSObject {
         self.filterLivePhoto = filterLivePhoto ?? true
         self.groupByField = groupByField
         self.providers = providers
+        self.searchResults = searchResults
 
         createSections()
 
@@ -124,11 +126,16 @@ class NCDataSource: NSObject {
 
     internal func createMetadataForSection(sectionValue: String) {
 
+        var searchResult: NCCSearchResult?
+        if let providers = self.providers, !providers.isEmpty, let searchResults = self.searchResults {
+            searchResult = searchResults.filter({ $0.name == sectionValue}).first
+        }
         let metadatas = metadatasSource.filter({ getSectionValue(metadata: $0) == sectionValue})
         let metadataForSection = NCMetadatasForSection.init(sectionValue: sectionValue,
                                                             metadatas: metadatas,
                                                             shares: self.shares,
                                                             localFiles: self.localFiles,
+                                                            searchResult: searchResult,
                                                             sort: self.sort,
                                                             ascending: self.ascending,
                                                             directoryOnTop: self.directoryOnTop,
@@ -336,6 +343,7 @@ class NCMetadatasForSection: NSObject {
     var metadatas: [tableMetadata]
     var shares: [tableShare]
     var localFiles: [tableLocalFile]
+    var searchResult: NCCSearchResult?
 
     private var sort : String
     private var ascending: Bool
@@ -356,12 +364,13 @@ class NCMetadatasForSection: NSObject {
     public var metadataOffLine: [String] = []
 
 
-    init(sectionValue: String, metadatas: [tableMetadata], shares: [tableShare], localFiles: [tableLocalFile], sort: String, ascending: Bool, directoryOnTop: Bool, favoriteOnTop: Bool, filterLivePhoto: Bool) {
+    init(sectionValue: String, metadatas: [tableMetadata], shares: [tableShare], localFiles: [tableLocalFile], searchResult: NCCSearchResult?, sort: String, ascending: Bool, directoryOnTop: Bool, favoriteOnTop: Bool, filterLivePhoto: Bool) {
 
         self.sectionValue = sectionValue
         self.metadatas = metadatas
         self.shares = shares
         self.localFiles = localFiles
+        self.searchResult = searchResult
         self.sort = sort
         self.ascending = ascending
         self.directoryOnTop = directoryOnTop

+ 29 - 15
iOSClient/Main/Collection Common/NCCollectionViewCommon.swift

@@ -53,6 +53,7 @@ class NCCollectionViewCommon: UIViewController, UIGestureRecognizerDelegate, UIS
 
     internal var groupByField = "name"
     internal var providers: [NCCSearchProvider]?
+    internal var searchResults: [NCCSearchResult]?
 
     internal var listLayout: NCListLayout!
     internal var gridLayout: NCGridLayout!
@@ -750,6 +751,7 @@ class NCCollectionViewCommon: UIViewController, UIGestureRecognizerDelegate, UIS
         self.isSearching = true
 
         self.providers?.removeAll()
+        self.searchResults?.removeAll()
         self.metadatasSource.removeAll()
         self.dataSource.clearDataSource()
 
@@ -771,6 +773,7 @@ class NCCollectionViewCommon: UIViewController, UIGestureRecognizerDelegate, UIS
         self.isSearching = false
         self.literalSearch = ""
         self.providers?.removeAll()
+        self.searchResults?.removeAll()
 
         reloadDataSource()
     }
@@ -1029,16 +1032,6 @@ class NCCollectionViewCommon: UIViewController, UIGestureRecognizerDelegate, UIS
             DispatchQueue.main.async { self.refreshControl.endRefreshing() }
             return
         }
-        let completionHandler: ([tableMetadata]?, Int, String) ->  Void =  { metadatas, errorCode, errorDescription in
-            DispatchQueue.main.async {
-                if self.searchController?.isActive == true, errorCode == 0, let metadatas = metadatas {
-                    self.metadatasSource = metadatas
-                }
-                self.refreshControl.endRefreshing()
-                self.isReloadDataSourceNetworkInProgress = false
-                self.reloadDataSource()
-            }
-        }
 
         isReloadDataSourceNetworkInProgress = true
         self.metadatasSource.removeAll()
@@ -1050,8 +1043,10 @@ class NCCollectionViewCommon: UIViewController, UIGestureRecognizerDelegate, UIS
             self.refreshControl.beginRefreshing()
             NCNetworking.shared.unifiedSearchFiles(urlBase: appDelegate, literal: literalSearch) { allProviders in
                 self.providers = allProviders
-            } update: { metadatas in
+            } update: { searchResults, metadatas in
                 guard let metadatas = metadatas, metadatas.count > 0 else { return }
+                self.searchResults = searchResults
+
                 DispatchQueue.main.async {
                     if self.searchController?.isActive == true {
                         self.metadatasSource = metadatas
@@ -1062,15 +1057,34 @@ class NCCollectionViewCommon: UIViewController, UIGestureRecognizerDelegate, UIS
                                                        directoryOnTop: self.layoutForView?.directoryOnTop,
                                                        favoriteOnTop: true,
                                                        filterLivePhoto: true,
-                                                       providers: self.providers)
+                                                       providers: self.providers,
+                                                       searchResults: self.searchResults)
                         self.collectionView.reloadData()
                     }
                 }
-            } completion: { metadatas, errorCode, errorDescription in
-                completionHandler(metadatas, errorCode, errorDescription)
+            } completion: { searchResults, metadatas, errorCode, errorDescription in
+                DispatchQueue.main.async {
+                    if self.searchController?.isActive == true, errorCode == 0, let metadatas = metadatas {
+                        self.searchResults = searchResults
+                        self.metadatasSource = metadatas
+                    }
+                    self.refreshControl.endRefreshing()
+                    self.isReloadDataSourceNetworkInProgress = false
+                    self.reloadDataSource()
+                }
             }
         } else {
-            NCNetworking.shared.searchFiles(urlBase: appDelegate, literal: literalSearch, completion: completionHandler)
+            NCNetworking.shared.searchFiles(urlBase: appDelegate, literal: literalSearch) { metadatas, errorCode, errorDescription in
+                DispatchQueue.main.async {
+                    if self.searchController?.isActive == true, errorCode == 0, let metadatas = metadatas {
+                        self.searchResults = nil
+                        self.metadatasSource = metadatas
+                    }
+                    self.refreshControl.endRefreshing()
+                    self.isReloadDataSourceNetworkInProgress = false
+                    self.reloadDataSource()
+                }
+            }
         }
     }
 

+ 14 - 9
iOSClient/Networking/NCNetworking.swift

@@ -931,16 +931,17 @@ import Queuer
 
     /// Unified Search (NC>=20)
     ///
-    func unifiedSearchFiles(urlBase: NCUserBaseUrl, literal: String, providers: @escaping ([NCCSearchProvider]?) -> Void, update: @escaping ([tableMetadata]?) -> Void, completion: @escaping (_ metadatas: [tableMetadata]?, _ errorCode: Int, _ errorDescription: String) -> ()) {
+    func unifiedSearchFiles(urlBase: NCUserBaseUrl, literal: String, providers: @escaping ([NCCSearchProvider]?) -> Void, update: @escaping ([NCCSearchResult]?, [tableMetadata]?) -> Void, completion: @escaping ([NCCSearchResult]?, _ metadatas: [tableMetadata]?, _ errorCode: Int, _ errorDescription: String) -> ()) {
 
+        var searchResults: [NCCSearchResult] = []
         var searchFiles: [tableMetadata] = []
-        var errCode = 0
-        var errDescr = ""
+        var errorCode = 0
+        var errorDescription = ""
         let concurrentQueue = DispatchQueue(label: "com.nextcloud.requestUnifiedSearch.concurrentQueue", attributes: .concurrent)
         let dispatchGroup = DispatchGroup()
         dispatchGroup.enter()
         dispatchGroup.notify(queue: .main) {
-            completion(Array(searchFiles), errCode, errDescr)
+            completion(searchResults, Array(searchFiles), errorCode, errorDescription)
         }
 
         NCCommunication.shared.unifiedSearch(term: literal, timeout: 30, timeoutProvider: 90) { provider in
@@ -955,7 +956,8 @@ import Queuer
             providers(allProviders)
         } update: { partialResult, provider, errorCode, errorDescription in
             guard let partialResult = partialResult else { return }
-            
+            searchResults.append(partialResult)
+
             switch provider.id {
             case "files":
                 partialResult.entries.forEach({ entry in
@@ -1003,12 +1005,15 @@ import Queuer
                     }
                 })
             }
-            update(searchFiles)
-        } completion: { results, errorCode, errorDescription in
+            update(searchResults, searchFiles)
+        } completion: { results, code, description in
             self.requestsUnifiedSearch.removeAll()
             dispatchGroup.leave()
-            errCode = errorCode
-            errDescr = errorDescription
+            if let results = results {
+                searchResults = results
+            }
+            errorCode = code
+            errorDescription = description
         }
     }