From 18fa33e072ba94ead0d79a9804889941805e4a07 Mon Sep 17 00:00:00 2001 From: Marino Faggiana Date: Wed, 22 Apr 2026 09:50:38 +0200 Subject: [PATCH 1/3] code Signed-off-by: Marino Faggiana --- .../Data/NCManageDatabase+Metadata.swift | 16 +++++++++ ...ctionViewCommon+SelectTabBarDelegate.swift | 1 - iOSClient/Media/NCMedia+Command.swift | 25 ++++++++++++- iOSClient/Media/NCMediaSelectTabBar.swift | 36 +++++++++++-------- 4 files changed, 62 insertions(+), 16 deletions(-) diff --git a/iOSClient/Data/NCManageDatabase+Metadata.swift b/iOSClient/Data/NCManageDatabase+Metadata.swift index 415d9c10d1..bf9a829c4b 100644 --- a/iOSClient/Data/NCManageDatabase+Metadata.swift +++ b/iOSClient/Data/NCManageDatabase+Metadata.swift @@ -1004,6 +1004,22 @@ extension NCManageDatabase { } } + /// Returns detached (unmanaged) copies of `tableMetadata` objects matching the provided ocIds. + /// + /// - Parameter ocIds: Array of ocId strings used to fetch corresponding metadata. + /// - Returns: An array of detached `tableMetadata` objects. Empty if no matches are found. + func getMetadatasFromOcIdsAsync(_ ocIds: [String]) async -> [tableMetadata] { + guard !ocIds.isEmpty else { return [] } + + return await core.performRealmReadAsync { realm in + realm.objects(tableMetadata.self) + .where { + $0.ocId.in(ocIds) + } + .map { $0.detachedCopy() } + } ?? [] + } + func getMetadataFromOcIdAndocIdTransferAsync(_ ocId: String?) async -> tableMetadata? { guard let ocId else { return nil diff --git a/iOSClient/Main/Collection Common/NCCollectionViewCommon+SelectTabBarDelegate.swift b/iOSClient/Main/Collection Common/NCCollectionViewCommon+SelectTabBarDelegate.swift index 5cf44d2705..063f90b611 100644 --- a/iOSClient/Main/Collection Common/NCCollectionViewCommon+SelectTabBarDelegate.swift +++ b/iOSClient/Main/Collection Common/NCCollectionViewCommon+SelectTabBarDelegate.swift @@ -126,7 +126,6 @@ extension NCCollectionViewCommon: NCCollectionViewCommonSelectTabBarDelegate { NCSelectOpen.shared.openView(items: metadatas, controller: self.controller) } - } func share() { diff --git a/iOSClient/Media/NCMedia+Command.swift b/iOSClient/Media/NCMedia+Command.swift index acc6596ba1..38733c2260 100644 --- a/iOSClient/Media/NCMedia+Command.swift +++ b/iOSClient/Media/NCMedia+Command.swift @@ -75,6 +75,30 @@ extension NCMedia { } extension NCMedia: NCMediaSelectTabBarDelegate { + func move() { + Task { + let ocIds = self.fileSelect.map { $0 } + let metadatas = await database.getMetadatasFromOcIdsAsync(ocIds) + + setEditMode(false) + + NCSelectOpen.shared.openView(items: metadatas, controller: self.controller) + } + } + + func share() { + Task { + let ocIds = self.fileSelect.map { $0 } + let metadatas = await database.getMetadatasFromOcIdsAsync(ocIds) + + setEditMode(false) + await NCCreate().createActivityViewController( + selectedMetadata: metadatas, + controller: self.controller, + sender: nil) + } + } + func delete() { let ocIds = self.fileSelect.map { $0 } var alertStyle = UIAlertController.Style.actionSheet @@ -140,5 +164,4 @@ extension NCMedia: NCMediaSelectTabBarDelegate { } } } - } diff --git a/iOSClient/Media/NCMediaSelectTabBar.swift b/iOSClient/Media/NCMediaSelectTabBar.swift index 6b97fb7e69..bf6d4d664a 100644 --- a/iOSClient/Media/NCMediaSelectTabBar.swift +++ b/iOSClient/Media/NCMediaSelectTabBar.swift @@ -7,6 +7,8 @@ import SwiftUI protocol NCMediaSelectTabBarDelegate: AnyObject { func delete() + func move() + func share() } class NCMediaSelectTabBar: ObservableObject { @@ -86,21 +88,27 @@ struct MediaTabBarSelectView: View { var body: some View { VStack { Spacer().frame(height: sizeClass == .compact ? 5 : 10) + HStack { - Spacer().frame(maxWidth: .infinity) - Group { - if tabBarSelect.selectCount == 0 { - Text(NSLocalizedString("_select_photos_", comment: "")) - .cappedFont(.body, maxDynamicType: .accessibility2) - } else if tabBarSelect.selectCount == 1 { - Text(String(tabBarSelect.selectCount) + " " + NSLocalizedString("_selected_photo_", comment: "")) - .cappedFont(.body, maxDynamicType: .accessibility2) - } else { - Text(String(tabBarSelect.selectCount) + " " + NSLocalizedString("_selected_photos_", comment: "")) - .cappedFont(.body, maxDynamicType: .accessibility2) - } + Button { + tabBarSelect.delegate?.share() + } label: { + Image(systemName: "square.and.arrow.up") + .font(.icon()) } - .frame(minWidth: 250, maxWidth: .infinity) + .tint(Color(NCBrandColor.shared.iconImageColor)) + .frame(maxWidth: .infinity) + .disabled(tabBarSelect.selectCount == 0) + + Button { + tabBarSelect.delegate?.move() + } label: { + Image(systemName: "rectangle.portrait.and.arrow.right") + .font(.icon()) + } + .tint(Color(NCBrandColor.shared.iconImageColor)) + .frame(maxWidth: .infinity) + .disabled(tabBarSelect.selectCount == 0) Button { tabBarSelect.delegate?.delete() @@ -109,8 +117,8 @@ struct MediaTabBarSelectView: View { .font(.icon()) } .tint(.red) - .disabled(tabBarSelect.selectCount == 0) .frame(maxWidth: .infinity) + .disabled(tabBarSelect.selectCount == 0) } .frame(maxWidth: .infinity) } From c5a9b1a8cdae06dd8a6f1299548decd26a23484f Mon Sep 17 00:00:00 2001 From: Marino Faggiana Date: Wed, 22 Apr 2026 10:01:28 +0200 Subject: [PATCH 2/3] clean Signed-off-by: Marino Faggiana --- iOSClient/Media/NCMediaSelectTabBar.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iOSClient/Media/NCMediaSelectTabBar.swift b/iOSClient/Media/NCMediaSelectTabBar.swift index bf6d4d664a..19c979eb9b 100644 --- a/iOSClient/Media/NCMediaSelectTabBar.swift +++ b/iOSClient/Media/NCMediaSelectTabBar.swift @@ -6,9 +6,9 @@ import UIKit import SwiftUI protocol NCMediaSelectTabBarDelegate: AnyObject { - func delete() func move() func share() + func delete() } class NCMediaSelectTabBar: ObservableObject { From d0bae60f7bfc0ad018ad1464dd956558cf4e9c6a Mon Sep 17 00:00:00 2001 From: Marino Faggiana Date: Wed, 22 Apr 2026 10:04:46 +0200 Subject: [PATCH 3/3] update project Signed-off-by: Marino Faggiana --- Nextcloud.xcodeproj/project.pbxproj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Nextcloud.xcodeproj/project.pbxproj b/Nextcloud.xcodeproj/project.pbxproj index 8c403d47c1..f2322a7214 100644 --- a/Nextcloud.xcodeproj/project.pbxproj +++ b/Nextcloud.xcodeproj/project.pbxproj @@ -5798,7 +5798,7 @@ CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 0; + CURRENT_PROJECT_VERSION = 1; DEAD_CODE_STRIPPING = YES; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = NKUJUXUJ3B; @@ -5866,7 +5866,7 @@ CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 0; + CURRENT_PROJECT_VERSION = 1; DEAD_CODE_STRIPPING = YES; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = NKUJUXUJ3B;