public async Task CreateNewFolderAccess(string userId, string folderId, string role) { IEnumerable <Note> notesInFolder = await new NoteService().GetAllNotesFromFolder(folderId); IEnumerable <Folder> childFolders = await new FolderService().GetAllChildFolder(folderId); foreach (Folder folder in childFolders) { await CreateNewFolderAccess(userId, folder.Id, role); } foreach (Note note in notesInFolder) { await CreateNewNoteAccess(userId, note.Id, role); } AvailableFolder availableFolder = await GetAvailableFolder(folderId, userId); if (availableFolder == null) { availableFolder = new AvailableFolder() { UserId = userId, FolderId = folderId, Role = role }; await AccessFolders.InsertOneAsync(availableFolder); } else if (availableFolder.Role != role) { availableFolder.Role = role; await UpdateFolderAccess(availableFolder); } }
private void AddFolderNode(KTreeNode node, KTreeNodes children, AvailableFolder folder) { StoreTreeNode rootNode = (StoreTreeNode)this.Children.Parent; // Create the tree node SharedFolder share = rootNode.GetInitialShareState(folder); FolderTreeNode child = new FolderTreeNode(rootNode, folder, share); ApplyReadOnly(child, child.IsReadOnly); // Add children.Add(child); // Add the children foreach (AvailableFolder childFolder in folder.Children.OrderBy(f => f, new FolderComparer(false))) { AddFolderNode(child, child.Children, childFolder); } // Set the initial share state if (share != null) { child.IsChecked = true; } // Add the share; it might have become checked by any of the child nodes if (child.IsShared) { rootNode.AddShare(folder, share); } }
internal void RemoveShare(AvailableFolder folder) { if (_currentShares.Remove(folder.BackendId)) { CheckDirty(); } }
/// <summary> /// Adds a share. /// </summary> /// <param name="folder">The folder to share.</param> /// <param name="state">The share state. This may be null to add a default share</param> /// <returns>The share information</returns> internal SharedFolder AddShare(AvailableFolder folder, SharedFolder state) { state = state ?? CreateDefaultShare(folder); _currentShares[folder.BackendId] = state; CheckDirty(); return(state); }
private SharedFolder CreateDefaultShare(AvailableFolder folder) { SharedFolder share = new SharedFolder(folder, DefaultNameForFolder(folder)); // Default send as for mail folders if (folder.Type.IsMail()) { share = share.WithFlagSendAsOwner(true); } return(share); }
private SharedFolder GetInitialShareState(AvailableFolder folder) { SharedFolder state; if (_initialShares.TryGetValue(folder.BackendId, out state)) { // If the folder has been renamed, update if we're tracing it. if (state.Name != DefaultNameForFolder(folder)) { if (state.FlagUpdateShareName) { state = state.WithName(DefaultNameForFolder(folder)); } } return(state); } return(null); }
public FolderTreeNode(StoreTreeNode store, AvailableFolder folder, SharedFolder share) { this._store = store; this._folder = folder; this._share = share; this.Text = folder.Name; // Image // TODO: clean this up int index = ((int)OutlookConstants.BASIC_SYNC_TYPES[(int)folder.Type]) - 1; if (index < 0 || index >= store.Owner.Images.Images.Count - 1) { index = 0; } ImageIndex = index; }
private SharedFolder CreateDefaultShare(AvailableFolder folder) { SharedFolder share = new SharedFolder(folder, DefaultNameForFolder(folder)); // Default send as for mail folders if the address can be determined /*using (IRecipient sendAs = _featureSendAs?.FindSendAsSender(_account, null, folder.BackendId, null, _sendAsAddress)) * { * if (sendAs != null) * { * share = share.WithFlagSendAsOwner(true).WithSendAsAddress(sendAs.Address); * } * else * { * share = share.WithFlagSendAsOwner(false).WithSendAsAddress(null); * } * }*/ return(share); }
public FolderTreeNode(StoreTreeNode store, AvailableFolder folder, SharedFolder share) { this._store = store; this._folder = folder; this._share = share; this.Text = folder.Name; IsReadOnly = share?.SyncId?.Kind == SyncKind.Configured; HasCheckBox = true; CheckBoxEnabled = !IsReadOnly; // Image // TODO: clean this up int index = ((int)OutlookConstants.BASIC_SYNC_TYPES[(int)folder.Type]) - 1; if (index < 0 || index >= store.Owner.Images.Images.Count - 1) { index = 0; } ImageIndex = index; }
internal string DefaultNameForFolder(AvailableFolder folder) { // Default include the store name in root folders if (folder.ParentId.IsNone) { if (folder.DefaultName == null) { using (ContactStringReplacer replacer = ContactStringReplacer.FromGAB(_gab, _user)) { if (replacer == null) { // No gab available, default to old folder.DefaultName = folder.Name + " - " + folder.Store.UserName; } else { replacer.TokenOpen = "%"; replacer.TokenClose = "%"; replacer.UnknownReplacer = (token) => { if (token == "foldername") { return(folder.Name); } return(""); }; folder.DefaultName = replacer.Replace(_feature.DefaultFolderNameFormat); } } } return(folder.DefaultName); } else { return(folder.Name); } }
private void ShowOptions(KTreeNode[] nodes) { try { _layoutOptions.SuspendLayout(); _optionNameNode = null; _optionSendAsNodes.Clear(); _optionSendAsInitial.Clear(); _optionRemindersNodes.Clear(); _optionRemindersInitial.Clear(); _optionPermissionNodes.Clear(); OptionName = null; OptionTrackName = null; OptionSendAs = null; OptionReminders = null; OptionPermissions = null; foreach (KTreeNode node in nodes) { // Ignore the root nodes if (node is StoreTreeNode) { continue; } FolderTreeNode folderNode = (FolderTreeNode)node; // Can only set options for shared folders if (!folderNode.IsShared) { continue; } SharedFolder share = folderNode.SharedFolder; AvailableFolder folder = folderNode.AvailableFolder; // Assume we will edit the name for this node; cleared below if there are multiple _optionNameNode = folderNode; if (folder.Type.IsMail()) { // Show send as if there are any mail folders _optionSendAsNodes.Add(folderNode); _optionSendAsInitial.Add(folderNode.SharedFolder.FlagSendAsOwner); } else if (folder.Type.IsAppointment()) { // Show reminders for appointment folders _optionRemindersNodes.Add(folderNode); _optionRemindersInitial.Add(folderNode.SharedFolder.FlagCalendarReminders); } // Show permissions for all shared nodes _optionPermissionNodes.Add(folderNode); } // Now check consistency of the options // Only show the name if there is a single node. // We do that here so there doesn't have to be duplication if testing if it's sharedd, // ect if (_optionNameNode != null && nodes.Length == 1) { OptionName = _optionNameNode.SharedFolder.Name; OptionTrackName = _optionNameNode.SharedFolder.FlagUpdateShareName; } else { _optionNameNode = null; } // Permissions shown if all are the same if (_optionPermissionNodes.Count > 0) { Permission?permissions = _optionPermissionNodes.First().SharedFolder.Permissions; if (_optionPermissionNodes.All(x => x.SharedFolder.Permissions == permissions)) { OptionPermissions = permissions; } } // Send as shown if any node supports it if (_optionSendAsNodes.Count > 0) { bool sendAs = _optionSendAsNodes.First().SharedFolder.FlagSendAsOwner; if (_optionSendAsNodes.All(x => x.SharedFolder.FlagSendAsOwner == sendAs)) { OptionSendAs = sendAs ? CheckState.Checked : CheckState.Unchecked; checkSendAs.ThreeState = false; } else { OptionSendAs = CheckState.Indeterminate; checkSendAs.ThreeState = true; } } // Reminders shown if any node supports it if (_optionRemindersNodes.Count > 0) { bool reminders = _optionRemindersNodes.First().SharedFolder.FlagCalendarReminders; if (_optionRemindersNodes.All(x => x.SharedFolder.FlagCalendarReminders == reminders)) { OptionReminders = reminders ? CheckState.Checked : CheckState.Unchecked; checkReminders.ThreeState = false; } else { OptionReminders = CheckState.Indeterminate; checkReminders.ThreeState = true; } } } finally { _layoutOptions.ResumeLayout(); } }
private void ShowOptions(KTreeNode[] nodes) { try { _layoutOptions.SuspendLayout(); _optionNameNode = null; _optionSendAsNodes.Clear(); _optionSendAsInitial.Clear(); _optionRemindersNodes.Clear(); _optionRemindersInitial.Clear(); _optionPermissionNodes.Clear(); _optionWholeStoreNodes.Clear(); _optionWholeStoreNodesInitial.Clear(); OptionName = null; OptionTrackName = null; OptionSendAs = null; OptionReminders = null; OptionPermissions = null; OptionWholeStore = null; OptionWholeStoreReminders = null; bool readOnly = false; bool haveStoreNodes = false; bool haveFolderNodes = false; foreach (KTreeNode node in nodes) { // Ignore the root nodes if (node is StoreTreeNode) { if (!_folders.SupportsWholeStore || !node.HasCheckBox) { continue; } StoreTreeNode storeNode = (StoreTreeNode)node; haveStoreNodes = true; _optionWholeStoreNodes.Add(storeNode); _optionWholeStoreNodesInitial.Add(storeNode.IsShared); } else { FolderTreeNode folderNode = (FolderTreeNode)node; // Can only set options for shared folders if (!folderNode.IsShared) { continue; } haveFolderNodes = true; // Set all controls to read-only if any of the nodes is read-only if (folderNode.IsReadOnly) { readOnly = true; } SharedFolder share = folderNode.SharedFolder; AvailableFolder folder = folderNode.AvailableFolder; // Assume we will edit the name for this node; cleared below if there are multiple _optionNameNode = folderNode; if (folder.Type.IsMail()) { // Show send as if there are any mail folders _optionSendAsNodes.Add(folderNode); _optionSendAsInitial.Add(folderNode.SharedFolder.FlagSendAsOwner); } else if (folder.Type.IsAppointment()) { // Show reminders for appointment folders _optionRemindersNodes.Add(folderNode); _optionRemindersInitial.Add(folderNode.SharedFolder.FlagCalendarReminders); } // Show permissions for all shared nodes _optionPermissionNodes.Add(folderNode); } } // Now check consistency of the options if (haveFolderNodes && haveStoreNodes) { // Mixed nodes, no options return; } if (haveStoreNodes) { if (_optionWholeStoreNodes.Count > 0) { bool isShared = _optionWholeStoreNodes.First().WantShare; bool wasShared = _optionWholeStoreNodes.First().IsShared; if (_optionWholeStoreNodes.All(x => x.WantShare == isShared)) { OptionWholeStore = isShared ? CheckState.Checked : CheckState.Unchecked; checkWholeStore.ThreeState = false; } else { OptionWholeStore = CheckState.Indeterminate; checkWholeStore.ThreeState = true; } _labelRestartRequired.Visible = isShared && !wasShared; } } else { // Only show the name if there is a single node. // We do that here so there doesn't have to be duplication if testing if it's sharedd, // ect if (_optionNameNode != null && nodes.Length == 1) { OptionName = _optionNameNode.SharedFolder.Name; OptionTrackName = _optionNameNode.SharedFolder.FlagUpdateShareName; } else { _optionNameNode = null; } // Permissions shown if all are the same if (_optionPermissionNodes.Count > 0) { Permission?permissions = _optionPermissionNodes.First().SharedFolder.Permissions; if (_optionPermissionNodes.All(x => x.SharedFolder.Permissions == permissions)) { OptionPermissions = permissions; } } // Send as shown if any node supports it if (_optionSendAsNodes.Count > 0) { bool sendAs = _optionSendAsNodes.First().SharedFolder.FlagSendAsOwner; if (_optionSendAsNodes.All(x => x.SharedFolder.FlagSendAsOwner == sendAs)) { OptionSendAs = sendAs ? CheckState.Checked : CheckState.Unchecked; checkSendAs.ThreeState = false; } else { OptionSendAs = CheckState.Indeterminate; checkSendAs.ThreeState = true; } textSendAsAddress.Text = TryInitSendAsAddress(); EnableSendAsAddress(); } // Reminders shown if any node supports it if (_optionRemindersNodes.Count > 0) { bool reminders = _optionRemindersNodes.First().SharedFolder.FlagCalendarReminders; if (_optionRemindersNodes.All(x => x.SharedFolder.FlagCalendarReminders == reminders)) { OptionReminders = reminders ? CheckState.Checked : CheckState.Unchecked; checkReminders.ThreeState = false; } else { OptionReminders = CheckState.Indeterminate; checkReminders.ThreeState = true; } } } // Apply read-only state _layoutOptions.Enabled = !readOnly; } finally { _layoutOptions.ResumeLayout(); } }
public async Task UpdateFolderAccess(AvailableFolder availableFolder) => await AccessFolders.ReplaceOneAsync(new BsonDocument("_id", new ObjectId(availableFolder.Id)), availableFolder);