示例#1
0
        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);
            }
        }
示例#2
0
            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);
                }
            }
示例#3
0
 internal void RemoveShare(AvailableFolder folder)
 {
     if (_currentShares.Remove(folder.BackendId))
     {
         CheckDirty();
     }
 }
示例#4
0
 /// <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);
 }
示例#5
0
        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);
        }
示例#6
0
        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);
        }
示例#7
0
        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;
        }
示例#8
0
        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);
        }
示例#9
0
        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;
        }
示例#10
0
 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);
     }
 }
示例#11
0
        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();
            }
        }
示例#13
0
 public async Task UpdateFolderAccess(AvailableFolder availableFolder) => await AccessFolders.ReplaceOneAsync(new BsonDocument("_id", new ObjectId(availableFolder.Id)), availableFolder);