diff --git a/Sources/NextcloudFileProviderKit/Item/Item.swift b/Sources/NextcloudFileProviderKit/Item/Item.swift index b775f43d..cdae8169 100644 --- a/Sources/NextcloudFileProviderKit/Item/Item.swift +++ b/Sources/NextcloudFileProviderKit/Item/Item.swift @@ -204,6 +204,12 @@ public class Item: NSObject, NSFileProviderItem { } else { userInfoDict["displayEvict"] = metadata.downloaded } + // https://docs.nextcloud.com/server/latest/developer_manual/client_apis/WebDAV/basic.html + if metadata.permissions.uppercased().contains("R"), // Shareable + ![.rootContainer, .trashContainer].contains(itemIdentifier) + { + userInfoDict["displayShare"] = true + } return userInfoDict } diff --git a/Tests/NextcloudFileProviderKitTests/ItemPropertyTests.swift b/Tests/NextcloudFileProviderKitTests/ItemPropertyTests.swift index 4a754349..50081e93 100644 --- a/Tests/NextcloudFileProviderKitTests/ItemPropertyTests.swift +++ b/Tests/NextcloudFileProviderKitTests/ItemPropertyTests.swift @@ -322,6 +322,28 @@ final class ItemPropertyTests: XCTestCase { XCTAssertEqual(itemD.userInfo?["displayEvict"] as? Bool, true) } + func testItemUserInfoDisplayShare() { + var metadata = + SendableItemMetadata(ocId: "test-id", fileName: "test.txt", account: Self.account) + metadata.permissions = "GDNVW" // No "R" for shareable + + let item = Item( + metadata: metadata, + parentItemIdentifier: .rootContainer, + account: Self.account, + remoteInterface: MockRemoteInterface(), + dbManager: Self.dbManager + ) + + XCTAssertNil(item.userInfo?["displayShare"]) + + let fileproviderItems = ["fileproviderItems": [item]] + let lockPredicate = NSPredicate( + format: "SUBQUERY ( fileproviderItems, $fileproviderItem, $fileproviderItem.userInfo.displayShare == nil ).@count > 0" + ) + XCTAssertTrue(lockPredicate.evaluate(with: fileproviderItems)) + } + func testItemLockFileUntrashable() { let metadata = SendableItemMetadata( ocId: "test-id", fileName: ".~lock.test.doc#", account: Self.account