Kaynağa Gözat

coding

Signed-off-by: marinofaggiana <ios@nextcloud.com>
marinofaggiana 2 yıl önce
ebeveyn
işleme
88b3e39b03

+ 8 - 2
iOSClient/Main/Collection Common/NCCollectionViewCommon.swift

@@ -892,8 +892,13 @@ class NCCollectionViewCommon: UIViewController, UIGestureRecognizerDelegate, UIS
         }
     }
 
-    func tapButtonSection(_ sender: Any) {
-        
+    func tapButtonSection(_ sender: Any, metadataForSection: NCMetadataForSection?) {
+
+        if let metadataForSection = metadataForSection, let searchResult = metadataForSection.searchResult, let cursor = searchResult.cursor, let term = literalSearch {
+            NCNetworking.shared.unifiedSearchFilesProvider(urlBase: appDelegate, id: searchResult.id, term: term, cursor: cursor) { searchResult, metadatas, errorCode, ErrorDescription in
+                //
+            }
+        }
     }
 
     func longPressListItem(with objectId: String, gestureRecognizer: UILongPressGestureRecognizer) {
@@ -1782,6 +1787,7 @@ extension NCCollectionViewCommon: UICollectionViewDataSource {
             let isPaginated = metadataForSection?.searchResult?.isPaginated ?? false
 
             footer.delegate = self
+            footer.metadataForSection = metadataForSection
 
             footer.setTitleLabel("")
             footer.setButtonText(NSLocalizedString("_show_more_results_", comment: ""))

+ 4 - 3
iOSClient/Main/Section Header Footer/NCSectionHeaderFooter.swift

@@ -324,6 +324,7 @@ class NCSectionFooter: UICollectionReusableView, NCSectionFooterDelegate {
     @IBOutlet weak var buttonSectionHeightConstraint: NSLayoutConstraint!
 
     weak var delegate: NCSectionFooterDelegate?
+    var metadataForSection: NCMetadataForSection?
 
     override func awakeFromNib() {
         super.awakeFromNib()
@@ -392,15 +393,15 @@ class NCSectionFooter: UICollectionReusableView, NCSectionFooterDelegate {
     // MARK: - Action
 
     @IBAction func touchUpInsideButton(_ sender: Any) {
-        delegate?.tapButtonSection(sender)
+        delegate?.tapButtonSection(sender, metadataForSection: metadataForSection)
     }
 }
 
 protocol NCSectionFooterDelegate: AnyObject {
-    func tapButtonSection(_ sender: Any)
+    func tapButtonSection(_ sender: Any, metadataForSection: NCMetadataForSection?)
 }
 
 // optional func
 extension NCSectionFooterDelegate {
-    func tapButtonSection(_ sender: Any) {}
+    func tapButtonSection(_ sender: Any, metadataForSection: NCMetadataForSection?) {}
 }

+ 50 - 3
iOSClient/Networking/NCNetworking.swift

@@ -1017,6 +1017,53 @@ import Queuer
         }
     }
 
+    func unifiedSearchFilesProvider(urlBase: NCUserBaseUrl, id: String, term: String, cursor: Int, completion: @escaping (NCCSearchResult?, _ metadatas: [tableMetadata]?, _ errorCode: Int, _ errorDescription: String) -> ()) {
+
+        var metadatas: [tableMetadata] = []
+
+        NCCommunication.shared.searchProvider(id, term: term, limit: 5, cursor: cursor, timeout: 60) { searchResult, errorCode, errorDescription in
+            guard let searchResult = searchResult else {
+                completion(nil, metadatas, errorCode, errorDescription)
+                return
+            }
+
+            switch id {
+            case "files":
+                searchResult.entries.forEach({ entry in
+                    if let fileId = entry.fileId, let newMetadata = NCManageDatabase.shared.getMetadata(predicate: NSPredicate(format: "account == %@ && fileId == %@", urlBase.userAccount, String(fileId))) {
+                        metadatas.append(newMetadata)
+                    } else if let filePath = entry.filePath {
+                        self.loadMetadata(urlBase: urlBase, filePath: filePath, dispatchGroup: nil) { newMetadata in
+                            metadatas.append(newMetadata)
+                        }
+                    } else { print(#function, "[ERROR]: File search entry has no path: \(entry)") }
+                })
+                break
+            case "fulltextsearch":
+                // NOTE: FTS could also return attributes like files
+                // https://github.com/nextcloud/files_fulltextsearch/issues/143
+                searchResult.entries.forEach({ entry in
+                    let url = URLComponents(string: entry.resourceURL)
+                    guard let dir = url?.queryItems?["dir"]?.value, let filename = url?.queryItems?["scrollto"]?.value else { return }
+                    if let newMetadata = NCManageDatabase.shared.getMetadata(predicate: NSPredicate(format: "account == %@ && path == %@ && fileName == %@", urlBase.userAccount, "/remote.php/dav/files/" + urlBase.user + dir, filename)) {
+                        metadatas.append(newMetadata)
+                    } else {
+                        self.loadMetadata(urlBase: urlBase, filePath: dir + filename, dispatchGroup: nil) { newMetadata in
+                            metadatas.append(newMetadata)
+                        }
+                    }
+                })
+            default:
+                searchResult.entries.forEach({ entry in
+                    let newMetadata = NCManageDatabase.shared.createMetadata(account: urlBase.account, user: urlBase.user, userId: urlBase.userId, fileName: entry.title, fileNameView: entry.title, ocId: NSUUID().uuidString, serverUrl: urlBase.urlBase, urlBase: urlBase.urlBase, url: entry.resourceURL, contentType: "", isUrl: true, name: searchResult.name.lowercased(), subline: entry.subline, iconName: entry.icon, iconUrl: entry.thumbnailURL)
+                    metadatas.append(newMetadata)
+                })
+            }
+
+            completion(searchResult, metadatas, errorCode, errorDescription)
+        }
+    }
+
     func cancelUnifiedSearchFiles() {
         for request in requestsUnifiedSearch {
             request.cancel()
@@ -1024,11 +1071,11 @@ import Queuer
         requestsUnifiedSearch.removeAll()
     }
 
-    func loadMetadata(urlBase: NCUserBaseUrl, filePath: String, dispatchGroup: DispatchGroup, completion: @escaping (tableMetadata) -> Void) {
+    func loadMetadata(urlBase: NCUserBaseUrl, filePath: String, dispatchGroup: DispatchGroup? = nil, completion: @escaping (tableMetadata) -> Void) {
         let urlPath = urlBase.urlBase + "/remote.php/dav/files/" + urlBase.user + filePath
-        dispatchGroup.enter()
+        dispatchGroup?.enter()
         self.readFile(serverUrlFileName: urlPath) { account, metadata, errorCode, errorDescription in
-            defer { dispatchGroup.leave() }
+            defer { dispatchGroup?.leave() }
             guard let metadata = metadata else { return }
             DispatchQueue.main.async {
                 NCManageDatabase.shared.addMetadata(metadata)