aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Hotline.xcodeproj/project.pbxproj20
-rw-r--r--Hotline.xcodeproj/xcshareddata/xcschemes/Hotline.xcscheme2
-rw-r--r--Hotline/Hotline.entitlements10
-rw-r--r--Hotline/macOS/Accounts/AccountDetailsView.swift204
-rw-r--r--Hotline/macOS/Accounts/AccountManagerView.swift203
5 files changed, 223 insertions, 216 deletions
diff --git a/Hotline.xcodeproj/project.pbxproj b/Hotline.xcodeproj/project.pbxproj
index 7032420..28b30f8 100644
--- a/Hotline.xcodeproj/project.pbxproj
+++ b/Hotline.xcodeproj/project.pbxproj
@@ -88,6 +88,7 @@
DAB4D8822B4C8FED0048A05C /* FileIconView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAB4D8812B4C8FED0048A05C /* FileIconView.swift */; };
DAB4D8842B4CABEF0048A05C /* Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAB4D8832B4CABEF0048A05C /* Extensions.swift */; };
DAB4D8872B4CB3610048A05C /* MarkdownUI in Frameworks */ = {isa = PBXBuildFile; productRef = DAB4D8862B4CB3610048A05C /* MarkdownUI */; };
+ DABAFBEA2EC58C170015E889 /* AccountDetailsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DABAFBE92EC58C170015E889 /* AccountDetailsView.swift */; };
DABE8BF42B55DC0A00884D28 /* transfer-complete.aiff in Resources */ = {isa = PBXBuildFile; fileRef = DABE8BF32B55DC0A00884D28 /* transfer-complete.aiff */; };
DABE8BF62B55DC2E00884D28 /* chat-message.aiff in Resources */ = {isa = PBXBuildFile; fileRef = DABE8BF52B55DC2E00884D28 /* chat-message.aiff */; };
DABE8BF82B55DC6100884D28 /* logged-in.aiff in Resources */ = {isa = PBXBuildFile; fileRef = DABE8BF72B55DC6100884D28 /* logged-in.aiff */; };
@@ -201,6 +202,7 @@
DAB4D87D2B4C8BCA0048A05C /* FilePreviewTextView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FilePreviewTextView.swift; sourceTree = "<group>"; };
DAB4D8812B4C8FED0048A05C /* FileIconView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FileIconView.swift; sourceTree = "<group>"; };
DAB4D8832B4CABEF0048A05C /* Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Extensions.swift; sourceTree = "<group>"; };
+ DABAFBE92EC58C170015E889 /* AccountDetailsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountDetailsView.swift; sourceTree = "<group>"; };
DABE8BF32B55DC0A00884D28 /* transfer-complete.aiff */ = {isa = PBXFileReference; lastKnownFileType = audio.aiff; path = "transfer-complete.aiff"; sourceTree = "<group>"; };
DABE8BF52B55DC2E00884D28 /* chat-message.aiff */ = {isa = PBXFileReference; lastKnownFileType = audio.aiff; path = "chat-message.aiff"; sourceTree = "<group>"; };
DABE8BF72B55DC6100884D28 /* logged-in.aiff */ = {isa = PBXFileReference; lastKnownFileType = audio.aiff; path = "logged-in.aiff"; sourceTree = "<group>"; };
@@ -363,6 +365,7 @@
isa = PBXGroup;
children = (
11F8288A2BF9428100216BA0 /* AccountManagerView.swift */,
+ DABAFBE92EC58C170015E889 /* AccountDetailsView.swift */,
);
path = Accounts;
sourceTree = "<group>";
@@ -579,7 +582,7 @@
attributes = {
BuildIndependentTargetsInParallel = 1;
LastSwiftUpdateCheck = 1500;
- LastUpgradeCheck = 1500;
+ LastUpgradeCheck = 2600;
TargetAttributes = {
DA9CAFB62B126D5700CDA197 = {
CreatedOnToolsVersion = 15.0.1;
@@ -642,6 +645,7 @@
DA52689E2EB073A400DCB941 /* IconSettingsView.swift in Sources */,
DAC3D9832BC33FD000A727C9 /* AppState.swift in Sources */,
DA65499C2BEC3FBD00EDB697 /* ServerAgreementView.swift in Sources */,
+ DABAFBEA2EC58C170015E889 /* AccountDetailsView.swift in Sources */,
DA5268BC2EB95A7700DCB941 /* HotlineFolderDownloadClient.swift in Sources */,
DA2863DD2B3E8B7000A7D050 /* FilePreview.swift in Sources */,
DA3429B02EBA70790010784E /* HotlineFolderUploadClient.swift in Sources */,
@@ -772,6 +776,7 @@
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = dwarf;
+ DEVELOPMENT_TEAM = 5AEEV7QB2U;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
ENABLE_USER_SCRIPT_SANDBOXING = YES;
@@ -795,6 +800,7 @@
MTL_FAST_MATH = YES;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = iphoneos;
+ STRING_CATALOG_GENERATE_SYMBOLS = YES;
SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)";
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
};
@@ -835,6 +841,7 @@
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ DEVELOPMENT_TEAM = 5AEEV7QB2U;
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_USER_SCRIPT_SANDBOXING = YES;
@@ -851,6 +858,7 @@
MTL_ENABLE_DEBUG_INFO = NO;
MTL_FAST_MATH = YES;
SDKROOT = iphoneos;
+ STRING_CATALOG_GENERATE_SYMBOLS = YES;
SWIFT_COMPILATION_MODE = wholemodule;
VALIDATE_PRODUCT = YES;
};
@@ -866,9 +874,12 @@
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 24;
DEVELOPMENT_ASSET_PATHS = "\"Hotline/Preview Content\"";
- DEVELOPMENT_TEAM = 5AEEV7QB2U;
+ ENABLE_APP_SANDBOX = YES;
+ ENABLE_FILE_ACCESS_DOWNLOADS_FOLDER = readwrite;
"ENABLE_HARDENED_RUNTIME[sdk=macosx*]" = YES;
+ ENABLE_OUTGOING_NETWORK_CONNECTIONS = YES;
ENABLE_PREVIEWS = YES;
+ ENABLE_USER_SELECTED_FILES = readonly;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = Hotline/Info.plist;
INFOPLIST_KEY_CFBundleDisplayName = Hotline;
@@ -903,9 +914,12 @@
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 24;
DEVELOPMENT_ASSET_PATHS = "\"Hotline/Preview Content\"";
- DEVELOPMENT_TEAM = 5AEEV7QB2U;
+ ENABLE_APP_SANDBOX = YES;
+ ENABLE_FILE_ACCESS_DOWNLOADS_FOLDER = readwrite;
"ENABLE_HARDENED_RUNTIME[sdk=macosx*]" = YES;
+ ENABLE_OUTGOING_NETWORK_CONNECTIONS = YES;
ENABLE_PREVIEWS = YES;
+ ENABLE_USER_SELECTED_FILES = readonly;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = Hotline/Info.plist;
INFOPLIST_KEY_CFBundleDisplayName = Hotline;
diff --git a/Hotline.xcodeproj/xcshareddata/xcschemes/Hotline.xcscheme b/Hotline.xcodeproj/xcshareddata/xcschemes/Hotline.xcscheme
index 91934ce..0fe9b50 100644
--- a/Hotline.xcodeproj/xcshareddata/xcschemes/Hotline.xcscheme
+++ b/Hotline.xcodeproj/xcshareddata/xcschemes/Hotline.xcscheme
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
- LastUpgradeVersion = "1540"
+ LastUpgradeVersion = "2600"
version = "1.7">
<BuildAction
parallelizeBuildables = "YES"
diff --git a/Hotline/Hotline.entitlements b/Hotline/Hotline.entitlements
index 074bc56..87c863a 100644
--- a/Hotline/Hotline.entitlements
+++ b/Hotline/Hotline.entitlements
@@ -10,15 +10,5 @@
<array>
<string>CloudKit</string>
</array>
- <key>com.apple.security.app-sandbox</key>
- <true/>
- <key>com.apple.security.files.downloads.read-write</key>
- <true/>
- <key>com.apple.security.files.user-selected.read-only</key>
- <true/>
- <key>com.apple.security.files.user-selected.read-write</key>
- <true/>
- <key>com.apple.security.network.client</key>
- <true/>
</dict>
</plist>
diff --git a/Hotline/macOS/Accounts/AccountDetailsView.swift b/Hotline/macOS/Accounts/AccountDetailsView.swift
new file mode 100644
index 0000000..d4eab4e
--- /dev/null
+++ b/Hotline/macOS/Accounts/AccountDetailsView.swift
@@ -0,0 +1,204 @@
+import SwiftUI
+
+fileprivate let PASSWORD_PLACEHOLDER = "xxxxxxxxxxxxxxxxxx"
+
+struct AccountDetailsView: View {
+ @Environment(HotlineState.self) private var model: HotlineState
+ @Environment(\.dismiss) private var dismiss
+
+ @State var account: HotlineAccount = HotlineAccount(DEFAULT_ACCOUNT_NAME, "", HotlineUserAccessOptions.defaultAccess)
+
+ let saved: ((HotlineAccount) -> Void)?
+
+ @State private var password: String = ""
+ @State private var saving: Bool = false
+
+ var body: some View {
+ self.accountDetails
+ .onAppear {
+ // Display a placeholder for accounts that have been saved to the server
+ // because we don't have the account password on hand to display.
+ if self.account.persisted {
+ self.password = PASSWORD_PLACEHOLDER
+ }
+ }
+ .toolbar {
+ if self.saving {
+ ToolbarItem {
+ ProgressView()
+ .controlSize(.small)
+ }
+ }
+
+ ToolbarItem(placement: .cancellationAction) {
+ Button {
+ self.dismiss()
+ } label: {
+ Text("Cancel")
+ }
+ }
+
+ ToolbarItem(placement: .confirmationAction) {
+ Button {
+ Task {
+ do {
+ try await self.save()
+ self.dismiss()
+ }
+ catch {
+ print("ERROR SAVING ACCOUNT: \(error)")
+ }
+ }
+ } label: {
+ Text(self.account.persisted ? "Save" : "Create")
+ }
+ .disabled(self.saving)
+ }
+ }
+ }
+
+ private func save() async throws {
+ self.saving = true
+ defer { self.saving = false }
+
+ var accountName: String = self.account.name
+ if accountName.isBlank {
+ accountName = DEFAULT_ACCOUNT_NAME
+ }
+
+ // Update existing account
+ if self.account.persisted {
+ if self.password == PASSWORD_PLACEHOLDER {
+ try await self.model.setUser(name: accountName, login: self.account.login, newLogin: nil, password: nil, access: self.account.access.rawValue)
+ } else {
+ try await model.setUser(name: accountName, login: self.account.login, newLogin: nil, password: self.password, access: self.account.access.rawValue)
+ }
+
+ } else {
+ // Create new existing account
+ try await model.createUser(name: accountName, login: self.account.login, password: self.password, access: self.account.access.rawValue)
+
+// self.password = PASSWORD_PLACEHOLDER
+ self.account.persisted = true
+ }
+
+ self.account.name = accountName
+ self.saved?(self.account)
+ }
+
+ var accountDetails: some View {
+ Form {
+ Section {
+ TextField(text: self.$account.name, prompt: Text(DEFAULT_ACCOUNT_NAME)) {
+ Text("Account")
+ }
+ }
+
+ Section {
+ TextField("Login", text: self.$account.login, prompt: Text("Required"))
+ .disabled(self.account.persisted)
+
+ if self.account.persisted {
+ SecureField("Password", text: self.$password, prompt: Text("Optional"))
+ } else {
+ TextField("Password", text: self.$password, prompt: Text("Optional"))
+ }
+ }
+
+ Section("Files") {
+ Toggle("Download Files", isOn: self.$account.access.bind(.canDownloadFiles))
+ .disabled(self.model.access?.contains(.canDownloadFiles) == false)
+ Toggle("Download Folders", isOn: self.$account.access.bind(.canDownloadFolders))
+ .disabled(model.access?.contains(.canDownloadFolders) == false)
+ Toggle("Upload Files", isOn: self.$account.access.bind(.canUploadFiles))
+ .disabled(model.access?.contains(.canUploadFiles) == false)
+ Toggle("Upload Folders", isOn: self.$account.access.bind(.canUploadFolders))
+ .disabled(model.access?.contains(.canUploadFolders) == false)
+ Toggle("Upload Anywhere", isOn: self.$account.access.bind(.canUploadAnywhere))
+ .disabled(model.access?.contains(.canUploadAnywhere) == false)
+ Toggle("Delete Files", isOn: self.$account.access.bind(.canDeleteFiles))
+ .disabled(model.access?.contains(.canDeleteFiles) == false)
+ Toggle("Rename Files", isOn: self.$account.access.bind(.canRenameFiles))
+ .disabled(model.access?.contains(.canRenameFiles) == false)
+ Toggle("Move Files", isOn: self.$account.access.bind(.canMoveFiles))
+ .disabled(model.access?.contains(.canMoveFiles) == false)
+ Toggle("Comment Files", isOn: self.$account.access.bind(.canSetFileComment))
+ .disabled(model.access?.contains(.canSetFileComment) == false)
+ Toggle("Create Folders", isOn: self.$account.access.bind(.canCreateFolders))
+ .disabled(model.access?.contains(.canCreateFolders) == false)
+ Toggle("Delete Folders", isOn: self.$account.access.bind(.canDeleteFolders))
+ .disabled(model.access?.contains(.canDeleteFolders) == false)
+ Toggle("Rename Folders", isOn: self.$account.access.bind(.canRenameFolders))
+ .disabled(model.access?.contains(.canRenameFolders) == false)
+ Toggle("Move Folders", isOn: self.$account.access.bind(.canMoveFolders))
+ .disabled(model.access?.contains(.canMoveFolders) == false)
+ Toggle("Comment Folders", isOn: self.$account.access.bind(.canSetFolderComment))
+ .disabled(model.access?.contains(.canSetFolderComment) == false)
+ Toggle("View Drop Boxes", isOn: self.$account.access.bind(.canViewDropBoxes))
+ .disabled(model.access?.contains(.canViewDropBoxes) == false)
+ Toggle("Make Aliases", isOn: self.$account.access.bind(.canMakeAliases))
+ .disabled(model.access?.contains(.canMakeAliases) == false)
+ }
+
+ Section("User Maintenance") {
+ Toggle("Create Accounts", isOn: self.$account.access.bind(.canCreateUsers))
+ .disabled(model.access?.contains(.canCreateUsers) == false)
+ Toggle("Delete Accounts", isOn: self.$account.access.bind(.canDeleteUsers))
+ .disabled(model.access?.contains(.canDeleteUsers) == false)
+ Toggle("Read Accounts", isOn: self.$account.access.bind(.canOpenUsers))
+ .disabled(model.access?.contains(.canOpenUsers) == false)
+ Toggle("Modify Accounts", isOn: self.$account.access.bind(.canModifyUsers))
+ .disabled(model.access?.contains(.canModifyUsers) == false)
+ Toggle("Get User Info", isOn: self.$account.access.bind(.canGetClientInfo))
+ .disabled(model.access?.contains(.canGetClientInfo) == false)
+
+ Toggle("Disconnect Users", isOn: self.$account.access.bind(.canDisconnectUsers))
+ .disabled(model.access?.contains(.canDisconnectUsers) == false)
+ Toggle("Cannot be Disconnected", isOn: self.$account.access.bind(.cantBeDisconnected))
+ .disabled(model.access?.contains(.cantBeDisconnected) == false)
+ }
+
+ Section("Messaging") {
+ Toggle("Send Messages", isOn: self.$account.access.bind(.canSendMessages))
+ .disabled(model.access?.contains(.canSendMessages) == false)
+ Toggle("Broadcast", isOn: self.$account.access.bind(.canBroadcast))
+ .disabled(model.access?.contains(.canBroadcast) == false)
+ }
+
+ Section("News") {
+ Toggle("Read Articles", isOn: self.$account.access.bind(.canReadMessageBoard))
+ .disabled(model.access?.contains(.canReadMessageBoard) == false)
+ Toggle("Post Articles", isOn: self.$account.access.bind(.canPostMessageBoard))
+ .disabled(model.access?.contains(.canPostMessageBoard) == false)
+ Toggle("Delete Articles", isOn: self.$account.access.bind(.canDeleteNewsArticles))
+ .disabled(model.access?.contains(.canDeleteNewsArticles) == false)
+ Toggle("Create Categories", isOn: self.$account.access.bind(.canCreateNewsCategories))
+ .disabled(model.access?.contains(.canCreateNewsCategories) == false)
+ Toggle("Delete Categories", isOn: self.$account.access.bind(.canDeleteNewsCategories))
+ .disabled(model.access?.contains(.canDeleteNewsCategories) == false)
+ Toggle("Create News Bundles", isOn: self.$account.access.bind(.canCreateNewsFolders))
+ .disabled(model.access?.contains(.canCreateNewsFolders) == false)
+ Toggle("Delete News Bundles", isOn: self.$account.access.bind(.canDeleteNewsFolders))
+ .disabled(model.access?.contains(.canDeleteNewsFolders) == false)
+ }
+
+ Section("Chat") {
+ Toggle("Initiate Private Chat", isOn: self.$account.access.bind(.canCreateChat))
+ .disabled(model.access?.contains(.canCreateChat) == false)
+ Toggle("Read Chat", isOn: self.$account.access.bind(.canReadChat))
+ .disabled(model.access?.contains(.canReadChat) == false)
+ Toggle("Send Chat", isOn: self.$account.access.bind(.canSendChat))
+ .disabled(model.access?.contains(.canSendChat) == false)
+ }
+
+ Section("Miscellaneous") {
+ Toggle("Use Any Name", isOn: self.$account.access.bind(.canUseAnyName))
+ .disabled(model.access?.contains(.canUseAnyName) == false)
+ Toggle("Don't Show Agreement", isOn: self.$account.access.bind(.canSkipAgreement))
+ .disabled(model.access?.contains(.canSkipAgreement) == false)
+ }
+ }
+ .disabled(self.model.access?.contains(.canModifyUsers) == false)
+ .formStyle(.grouped)
+ }
+}
diff --git a/Hotline/macOS/Accounts/AccountManagerView.swift b/Hotline/macOS/Accounts/AccountManagerView.swift
index bbb909b..d288196 100644
--- a/Hotline/macOS/Accounts/AccountManagerView.swift
+++ b/Hotline/macOS/Accounts/AccountManagerView.swift
@@ -1,7 +1,6 @@
import SwiftUI
-fileprivate let DEFAULT_ACCOUNT_NAME = "Untitled Account"
-fileprivate let PASSWORD_PLACEHOLDER = "xxxxxxxxxxxxxxxxxx"
+let DEFAULT_ACCOUNT_NAME = "Untitled Account"
struct AccountManagerView: View {
@Environment(HotlineState.self) private var model: HotlineState
@@ -216,203 +215,3 @@ struct AccountManagerView: View {
}
-struct AccountDetailsView: View {
- @Environment(HotlineState.self) private var model: HotlineState
- @Environment(\.dismiss) private var dismiss
-
- @State var account: HotlineAccount = HotlineAccount("Untitled Account", "", HotlineUserAccessOptions.defaultAccess)
-
- let saved: ((HotlineAccount) -> Void)?
-
- @State private var password: String = ""
- @State private var saving: Bool = false
-
- var body: some View {
- self.accountDetails
- .onAppear {
- // Display a placeholder for accounts that have been saved to the server
- // because we don't have the account password on hand to display.
- if self.account.persisted {
- self.password = PASSWORD_PLACEHOLDER
- }
- }
- .toolbar {
- if self.saving {
- ToolbarItem {
- ProgressView()
- .controlSize(.small)
- }
- }
-
- ToolbarItem(placement: .cancellationAction) {
- Button {
- self.dismiss()
- } label: {
- Text("Cancel")
- }
- }
-
- ToolbarItem(placement: .confirmationAction) {
- Button {
- Task {
- do {
- try await self.save()
- self.dismiss()
- }
- catch {
- print("ERROR SAVING ACCOUNT: \(error)")
- }
- }
- } label: {
- Text(self.account.persisted ? "Save" : "Create")
- }
- .disabled(self.saving)
- }
- }
- }
-
- private func save() async throws {
- self.saving = true
- defer { self.saving = false }
-
- var accountName: String = self.account.name
- if accountName.isBlank {
- accountName = DEFAULT_ACCOUNT_NAME
- }
-
- // Update existing account
- if self.account.persisted {
- if self.password == PASSWORD_PLACEHOLDER {
- try await self.model.setUser(name: accountName, login: self.account.login, newLogin: nil, password: nil, access: self.account.access.rawValue)
- } else {
- try await model.setUser(name: accountName, login: self.account.login, newLogin: nil, password: self.password, access: self.account.access.rawValue)
- }
-
- } else {
- // Create new existing account
- try await model.createUser(name: accountName, login: self.account.login, password: self.password, access: self.account.access.rawValue)
-
-// self.password = PASSWORD_PLACEHOLDER
- self.account.persisted = true
- }
-
- self.account.name = accountName
- self.saved?(self.account)
- }
-
- var accountDetails: some View {
- Form {
- Section {
- TextField(text: self.$account.name, prompt: Text(DEFAULT_ACCOUNT_NAME)) {
- Text("Account")
- }
- }
-
- Section {
- TextField("Login", text: self.$account.login, prompt: Text("Required"))
- .disabled(self.account.persisted)
-
- if self.account.persisted {
- SecureField("Password", text: self.$password, prompt: Text("Optional"))
- } else {
- TextField("Password", text: self.$password, prompt: Text("Optional"))
- }
- }
-
- Section("Files") {
- Toggle("Download Files", isOn: self.$account.access.bind(.canDownloadFiles))
- .disabled(self.model.access?.contains(.canDownloadFiles) == false)
- Toggle("Download Folders", isOn: self.$account.access.bind(.canDownloadFolders))
- .disabled(model.access?.contains(.canDownloadFolders) == false)
- Toggle("Upload Files", isOn: self.$account.access.bind(.canUploadFiles))
- .disabled(model.access?.contains(.canUploadFiles) == false)
- Toggle("Upload Folders", isOn: self.$account.access.bind(.canUploadFolders))
- .disabled(model.access?.contains(.canUploadFolders) == false)
- Toggle("Upload Anywhere", isOn: self.$account.access.bind(.canUploadAnywhere))
- .disabled(model.access?.contains(.canUploadAnywhere) == false)
- Toggle("Delete Files", isOn: self.$account.access.bind(.canDeleteFiles))
- .disabled(model.access?.contains(.canDeleteFiles) == false)
- Toggle("Rename Files", isOn: self.$account.access.bind(.canRenameFiles))
- .disabled(model.access?.contains(.canRenameFiles) == false)
- Toggle("Move Files", isOn: self.$account.access.bind(.canMoveFiles))
- .disabled(model.access?.contains(.canMoveFiles) == false)
- Toggle("Comment Files", isOn: self.$account.access.bind(.canSetFileComment))
- .disabled(model.access?.contains(.canSetFileComment) == false)
- Toggle("Create Folders", isOn: self.$account.access.bind(.canCreateFolders))
- .disabled(model.access?.contains(.canCreateFolders) == false)
- Toggle("Delete Folders", isOn: self.$account.access.bind(.canDeleteFolders))
- .disabled(model.access?.contains(.canDeleteFolders) == false)
- Toggle("Rename Folders", isOn: self.$account.access.bind(.canRenameFolders))
- .disabled(model.access?.contains(.canRenameFolders) == false)
- Toggle("Move Folders", isOn: self.$account.access.bind(.canMoveFolders))
- .disabled(model.access?.contains(.canMoveFolders) == false)
- Toggle("Comment Folders", isOn: self.$account.access.bind(.canSetFolderComment))
- .disabled(model.access?.contains(.canSetFolderComment) == false)
- Toggle("View Drop Boxes", isOn: self.$account.access.bind(.canViewDropBoxes))
- .disabled(model.access?.contains(.canViewDropBoxes) == false)
- Toggle("Make Aliases", isOn: self.$account.access.bind(.canMakeAliases))
- .disabled(model.access?.contains(.canMakeAliases) == false)
- }
-
- Section("User Maintenance") {
- Toggle("Create Accounts", isOn: self.$account.access.bind(.canCreateUsers))
- .disabled(model.access?.contains(.canCreateUsers) == false)
- Toggle("Delete Accounts", isOn: self.$account.access.bind(.canDeleteUsers))
- .disabled(model.access?.contains(.canDeleteUsers) == false)
- Toggle("Read Accounts", isOn: self.$account.access.bind(.canOpenUsers))
- .disabled(model.access?.contains(.canOpenUsers) == false)
- Toggle("Modify Accounts", isOn: self.$account.access.bind(.canModifyUsers))
- .disabled(model.access?.contains(.canModifyUsers) == false)
- Toggle("Get User Info", isOn: self.$account.access.bind(.canGetClientInfo))
- .disabled(model.access?.contains(.canGetClientInfo) == false)
-
- Toggle("Disconnect Users", isOn: self.$account.access.bind(.canDisconnectUsers))
- .disabled(model.access?.contains(.canDisconnectUsers) == false)
- Toggle("Cannot be Disconnected", isOn: self.$account.access.bind(.cantBeDisconnected))
- .disabled(model.access?.contains(.cantBeDisconnected) == false)
- }
-
- Section("Messaging") {
- Toggle("Send Messages", isOn: self.$account.access.bind(.canSendMessages))
- .disabled(model.access?.contains(.canSendMessages) == false)
- Toggle("Broadcast", isOn: self.$account.access.bind(.canBroadcast))
- .disabled(model.access?.contains(.canBroadcast) == false)
- }
-
- Section("News") {
- Toggle("Read Articles", isOn: self.$account.access.bind(.canReadMessageBoard))
- .disabled(model.access?.contains(.canReadMessageBoard) == false)
- Toggle("Post Articles", isOn: self.$account.access.bind(.canPostMessageBoard))
- .disabled(model.access?.contains(.canPostMessageBoard) == false)
- Toggle("Delete Articles", isOn: self.$account.access.bind(.canDeleteNewsArticles))
- .disabled(model.access?.contains(.canDeleteNewsArticles) == false)
- Toggle("Create Categories", isOn: self.$account.access.bind(.canCreateNewsCategories))
- .disabled(model.access?.contains(.canCreateNewsCategories) == false)
- Toggle("Delete Categories", isOn: self.$account.access.bind(.canDeleteNewsCategories))
- .disabled(model.access?.contains(.canDeleteNewsCategories) == false)
- Toggle("Create News Bundles", isOn: self.$account.access.bind(.canCreateNewsFolders))
- .disabled(model.access?.contains(.canCreateNewsFolders) == false)
- Toggle("Delete News Bundles", isOn: self.$account.access.bind(.canDeleteNewsFolders))
- .disabled(model.access?.contains(.canDeleteNewsFolders) == false)
- }
-
- Section("Chat") {
- Toggle("Initiate Private Chat", isOn: self.$account.access.bind(.canCreateChat))
- .disabled(model.access?.contains(.canCreateChat) == false)
- Toggle("Read Chat", isOn: self.$account.access.bind(.canReadChat))
- .disabled(model.access?.contains(.canReadChat) == false)
- Toggle("Send Chat", isOn: self.$account.access.bind(.canSendChat))
- .disabled(model.access?.contains(.canSendChat) == false)
- }
-
- Section("Miscellaneous") {
- Toggle("Use Any Name", isOn: self.$account.access.bind(.canUseAnyName))
- .disabled(model.access?.contains(.canUseAnyName) == false)
- Toggle("Don't Show Agreement", isOn: self.$account.access.bind(.canSkipAgreement))
- .disabled(model.access?.contains(.canSkipAgreement) == false)
- }
- }
- .disabled(self.model.access?.contains(.canModifyUsers) == false)
- .formStyle(.grouped)
- }
-}