mirror of
https://github.com/nextcloud/desktop.git
synced 2024-11-26 15:06:08 +03:00
15f03d6417
Signed-off-by: Claudio Cambra <claudio.cambra@nextcloud.com>
141 lines
5.4 KiB
Swift
141 lines
5.4 KiB
Swift
//
|
|
// ShareOptionsView.swift
|
|
// FileProviderUIExt
|
|
//
|
|
// Created by Claudio Cambra on 28/2/24.
|
|
//
|
|
|
|
import AppKit
|
|
import Combine
|
|
import NextcloudKit
|
|
|
|
class ShareOptionsView: NSView {
|
|
@IBOutlet private weak var labelTextField: NSTextField!
|
|
@IBOutlet private weak var uploadEditPermissionCheckbox: NSButton!
|
|
@IBOutlet private weak var hideDownloadCheckbox: NSButton!
|
|
@IBOutlet private weak var passwordProtectCheckbox: NSButton!
|
|
@IBOutlet private weak var passwordSecureField: NSSecureTextField!
|
|
@IBOutlet private weak var expirationDateCheckbox: NSButton!
|
|
@IBOutlet private weak var expirationDatePicker: NSDatePicker!
|
|
@IBOutlet private weak var noteForRecipientCheckbox: NSButton!
|
|
@IBOutlet private weak var noteTextField: NSTextField!
|
|
@IBOutlet private weak var saveButton: NSButton!
|
|
@IBOutlet private weak var deleteButton: NSButton!
|
|
|
|
var dataSource: ShareTableViewDataSource?
|
|
var controller: ShareController? {
|
|
didSet {
|
|
cancellable?.cancel()
|
|
createMode = false
|
|
update()
|
|
cancellable = controller.publisher.sink { _ in self.update() }
|
|
}
|
|
}
|
|
private var cancellable: AnyCancellable?
|
|
|
|
private func update() {
|
|
guard let share = controller?.share else {
|
|
reset()
|
|
setAllFields(enabled: false)
|
|
saveButton.isEnabled = false
|
|
deleteButton.isEnabled = false
|
|
return
|
|
}
|
|
|
|
deleteButton.isEnabled = share.canDelete
|
|
saveButton.isEnabled = share.canEdit
|
|
|
|
if share.canEdit {
|
|
setAllFields(enabled: true)
|
|
labelTextField.stringValue = share.label
|
|
uploadEditPermissionCheckbox.state = share.shareesCanEdit ? .on : .off
|
|
hideDownloadCheckbox.state = share.hideDownload ? .on : .off
|
|
passwordProtectCheckbox.state = share.password.isEmpty ? .off : .on
|
|
passwordSecureField.isHidden = passwordProtectCheckbox.state == .off
|
|
expirationDateCheckbox.state = share.expirationDate == nil ? .off : .on
|
|
expirationDatePicker.isHidden = expirationDateCheckbox.state == .off
|
|
noteForRecipientCheckbox.state = share.note.isEmpty ? .off : .on
|
|
noteTextField.isHidden = noteForRecipientCheckbox.state == .off
|
|
} else {
|
|
setAllFields(enabled: false)
|
|
reset()
|
|
}
|
|
}
|
|
|
|
func reset() {
|
|
labelTextField.stringValue = ""
|
|
uploadEditPermissionCheckbox.state = .off
|
|
hideDownloadCheckbox.state = .off
|
|
passwordProtectCheckbox.state = .off
|
|
passwordSecureField.isHidden = true
|
|
expirationDateCheckbox.state = .off
|
|
expirationDatePicker.isHidden = true
|
|
noteForRecipientCheckbox.state = .off
|
|
noteTextField.isHidden = true
|
|
}
|
|
|
|
func setAllFields(enabled: Bool) {
|
|
labelTextField.isEnabled = enabled
|
|
uploadEditPermissionCheckbox.isEnabled = enabled
|
|
hideDownloadCheckbox.isEnabled = enabled
|
|
passwordProtectCheckbox.isEnabled = enabled
|
|
passwordSecureField.isEnabled = enabled
|
|
expirationDateCheckbox.isEnabled = enabled
|
|
expirationDatePicker.isEnabled = enabled
|
|
noteForRecipientCheckbox.isEnabled = enabled
|
|
noteTextField.isEnabled = enabled
|
|
saveButton.isEnabled = enabled
|
|
deleteButton.isEnabled = enabled
|
|
}
|
|
|
|
@IBAction func save(_ sender: Any) {
|
|
Task { @MainActor in
|
|
guard let controller = controller else { return }
|
|
let share = controller.share
|
|
let password = passwordProtectCheckbox.state == .on
|
|
? passwordSecureField.stringValue
|
|
: ""
|
|
let expireDate = expirationDateCheckbox.state == .on
|
|
? NKShare.formattedDateString(date: expirationDatePicker.dateValue)
|
|
: ""
|
|
let note = noteForRecipientCheckbox.state == .on
|
|
? noteTextField.stringValue
|
|
: ""
|
|
let label = labelTextField.stringValue
|
|
let hideDownload = hideDownloadCheckbox.state == .on
|
|
let uploadAndEdit = uploadEditPermissionCheckbox.state == .on
|
|
let permissions = uploadAndEdit
|
|
? share.permissions | NKShare.PermissionValues.updateShare.rawValue
|
|
: share.permissions & ~NKShare.PermissionValues.updateShare.rawValue
|
|
|
|
setAllFields(enabled: false)
|
|
deleteButton.isEnabled = false
|
|
saveButton.isEnabled = false
|
|
let error = await controller.save(
|
|
password: password,
|
|
expireDate: expireDate,
|
|
permissions: permissions,
|
|
note: note,
|
|
label: label,
|
|
hideDownload: hideDownload
|
|
)
|
|
if let error = error, error != .success {
|
|
dataSource?.uiDelegate?.showError("Error updating share: \(error.errorDescription)")
|
|
}
|
|
await dataSource?.reload()
|
|
}
|
|
}
|
|
|
|
@IBAction func delete(_ sender: Any) {
|
|
Task { @MainActor in
|
|
setAllFields(enabled: false)
|
|
deleteButton.isEnabled = false
|
|
saveButton.isEnabled = false
|
|
let error = await controller?.delete()
|
|
if let error = error, error != .success {
|
|
dataSource?.uiDelegate?.showError("Error deleting share: \(error.errorDescription)")
|
|
}
|
|
await dataSource?.reload()
|
|
}
|
|
}
|
|
}
|