diff --git a/products/ASC.Files/Core/Utils/EntryManager.cs b/products/ASC.Files/Core/Utils/EntryManager.cs index 60a6577b97..709844a6ef 100644 --- a/products/ASC.Files/Core/Utils/EntryManager.cs +++ b/products/ASC.Files/Core/Utils/EntryManager.cs @@ -469,7 +469,7 @@ public class EntryManager } var fileSecurity = _fileSecurity; - var entries = Enumerable.Empty(); + var entries = new List(); searchInContent = searchInContent && !filterTypes.Contains(FilterType.ByExtension) && !Equals(parent.Id, _globalFolderHelper.FolderTrash); @@ -578,14 +578,14 @@ public class EntryManager //share var shared = await fileSecurity.GetSharesForMeAsync(filterTypes.FirstOrDefault(), subjectGroup, subjectId, searchText, searchInContent, withSubfolders); - entries = entries.Concat(shared); + entries.AddRange(shared); CalculateTotal(); } else if (parent.FolderType == FolderType.Recent) { var files = await GetRecentAsyncEnumerable(filterTypes.FirstOrDefault(), subjectGroup, subjectId, searchText, searchInContent); - entries = entries.Concat(files); + entries.AddRange(files); CalculateTotal(); } @@ -593,8 +593,8 @@ public class EntryManager { var (files, folders) = await GetFavoritesAsync(filterTypes.FirstOrDefault(), subjectGroup, subjectId, searchText, searchInContent); - entries = entries.Concat(folders); - entries = entries.Concat(files); + entries.AddRange(folders); + entries.AddRange(files); CalculateTotal(); } @@ -603,7 +603,7 @@ public class EntryManager var folderDao = _daoFactory.GetFolderDao(); var fileDao = _daoFactory.GetFileDao(); var files = await GetTemplatesAsyncEnumerable(folderDao, fileDao, filterTypes.FirstOrDefault(), subjectGroup, subjectId, searchText, searchInContent).ToListAsync(); - entries = entries.Concat(files); + entries.AddRange(files); CalculateTotal(); } @@ -621,10 +621,9 @@ public class EntryManager var task2 = fileSecurity.FilterReadAsync(files).ToListAsync(); var task3 = shared.ToListAsync(); - - entries = entries.Concat(await task1); - entries = entries.Concat(await task2); - entries = entries.Concat(await task3); + entries.AddRange(await task1); + entries.AddRange(await task2); + entries.AddRange(await task3); CalculateTotal(); } @@ -654,23 +653,23 @@ public class EntryManager var task3 = thirdPartyFolder.ToListAsync(); - entries = entries.Concat(await task1); - entries = entries.Concat(await task2); - entries = entries.Concat(await task3); + entries.AddRange(await task1); + entries.AddRange(await task2); + entries.AddRange(await task3); } else { - entries = entries.Concat(await task1); - entries = entries.Concat(await task2); + entries.AddRange(await task1); + entries.AddRange(await task2); } } + + total = entries.Count; - IEnumerable data = entries.ToList(); + IEnumerable data = entries; if (orderBy.SortedBy != SortedByType.New) { - total = data.Count(); - if (parent.FolderType != FolderType.Recent) { data = SortEntries(data, orderBy); @@ -694,8 +693,6 @@ public class EntryManager //sorting after marking if (orderBy.SortedBy == SortedByType.New) { - total = data.Count(); - data = SortEntries(data, orderBy); if (0 < from) @@ -1239,9 +1236,12 @@ public class EntryManager , _ => (x, y) => c * x.Title.EnumerableComparer(y.Title), }; + + var comparer = Comparer.Create(sorter); + if (orderBy.SortedBy != SortedByType.New) { - var pinnedRooms = new List(); + IEnumerable pinnedRooms = new List(); if (!_coreBaseSettings.DisableDocSpace) { @@ -1264,20 +1264,16 @@ public class EntryManager } // folders on top - var folders = entries.Where(r => r.FileEntryType == FileEntryType.Folder).Except(pinnedRooms).ToList(); - var files = entries.Where(r => r.FileEntryType == FileEntryType.File).ToList(); - pinnedRooms.Sort(sorter); - folders.Sort(sorter); - files.Sort(sorter); + var folders = entries.Where(r => r.FileEntryType == FileEntryType.Folder).Except(pinnedRooms); + var files = entries.Where(r => r.FileEntryType == FileEntryType.File); + pinnedRooms = pinnedRooms.OrderBy(r => r, comparer); + folders = folders.OrderBy(r => r, comparer); + files = files.OrderBy(r => r, comparer); return pinnedRooms.Concat(folders).Concat(files); } - var result = entries.ToList(); - - result.Sort(sorter); - - return result; + return entries.OrderBy(r => r, comparer); } public IAsyncEnumerable SortEntriesAsync(IAsyncEnumerable entries, OrderBy orderBy) diff --git a/products/ASC.Files/Core/Utils/FileMarker.cs b/products/ASC.Files/Core/Utils/FileMarker.cs index 79430defca..458ca9399d 100644 --- a/products/ASC.Files/Core/Utils/FileMarker.cs +++ b/products/ASC.Files/Core/Utils/FileMarker.cs @@ -890,124 +890,122 @@ public class FileMarker var folderDao = _daoFactory.GetFolderDao(); var totalTags = await tagDao.GetNewTagsAsync(_authContext.CurrentAccount.ID, parent, false).ToListAsync(); - if (totalTags.Count() > 0) + if (totalTags.Count <= 0) { - var parentFolderTag = Equals(await _globalFolder.GetFolderShareAsync(_daoFactory), parent.Id) - ? await tagDao.GetNewTagsAsync(_authContext.CurrentAccount.ID, await folderDao.GetFolderAsync(await _globalFolder.GetFolderShareAsync(_daoFactory))).FirstOrDefaultAsync() - : totalTags.FirstOrDefault(tag => tag.EntryType == FileEntryType.Folder && Equals(tag.EntryId, parent.Id)); - - totalTags = totalTags.Where(e => e != parentFolderTag).ToList(); - var countSubNew = 0; - totalTags.ForEach(tag => countSubNew += tag.Count); - - if (parentFolderTag == null) + return; + } + + var parentFolderTag = Equals(await _globalFolder.GetFolderShareAsync(_daoFactory), parent.Id) + ? await tagDao.GetNewTagsAsync(_authContext.CurrentAccount.ID, await folderDao.GetFolderAsync(await _globalFolder.GetFolderShareAsync(_daoFactory))).FirstOrDefaultAsync() + : totalTags.FirstOrDefault(tag => tag.EntryType == FileEntryType.Folder && Equals(tag.EntryId, parent.Id)); + + totalTags = totalTags.Where(e => e != parentFolderTag).ToList(); + var countSubNew = 0; + totalTags.ForEach(tag => countSubNew += tag.Count); + + if (parentFolderTag == null) + { + parentFolderTag = Tag.New(_authContext.CurrentAccount.ID, parent, 0); + parentFolderTag.Id = -1; + } + + if (parentFolderTag.Count != countSubNew) + { + if (countSubNew > 0) { - parentFolderTag = Tag.New(_authContext.CurrentAccount.ID, parent, 0); - parentFolderTag.Id = -1; - } - - if (parentFolderTag.Count != countSubNew) - { - if (countSubNew > 0) + var diff = parentFolderTag.Count - countSubNew; + + parentFolderTag.Count -= diff; + if (parentFolderTag.Id == -1) { - var diff = parentFolderTag.Count - countSubNew; - - parentFolderTag.Count -= diff; - if (parentFolderTag.Id == -1) - { - tagDao.SaveTags(parentFolderTag); - } - else - { - tagDao.UpdateNewTags(parentFolderTag); - } - - var cacheFolderId = parent.Id; - var parentsList = await _daoFactory.GetFolderDao().GetParentFoldersAsync(parent.Id); - parentsList.Reverse(); - parentsList.Remove(parent); - - if (parentsList.Count > 0) - { - var rootFolder = parentsList.Last(); - T rootFolderId = default; - cacheFolderId = rootFolder.Id; - if (rootFolder.RootFolderType == FolderType.BUNCH) - { - cacheFolderId = rootFolderId = await _globalFolder.GetFolderProjectsAsync(_daoFactory); - } - else if (rootFolder.RootFolderType == FolderType.USER && !Equals(rootFolder.RootId, _globalFolder.GetFolderMy(this, _daoFactory))) - { - cacheFolderId = rootFolderId = await _globalFolder.GetFolderShareAsync(_daoFactory); - } - - if (rootFolderId != null) - { - parentsList.Add(await _daoFactory.GetFolderDao().GetFolderAsync(rootFolderId)); - } - - var fileSecurity = _fileSecurity; - - foreach (var folderFromList in parentsList) - { - var parentTreeTag = await tagDao.GetNewTagsAsync(_authContext.CurrentAccount.ID, folderFromList).FirstOrDefaultAsync(); - - if (parentTreeTag == null) - { - if (await fileSecurity.CanReadAsync(folderFromList)) - { - tagDao.SaveTags(Tag.New(_authContext.CurrentAccount.ID, folderFromList, -diff)); - } - } - else - { - parentTreeTag.Count -= diff; - tagDao.UpdateNewTags(parentTreeTag); - } - } - } - - if (cacheFolderId != null) - { - RemoveFromCahce(cacheFolderId); - } + tagDao.SaveTags(parentFolderTag); } else { - await RemoveMarkAsNewAsync(parent); + tagDao.UpdateNewTags(parentFolderTag); + } + + var cacheFolderId = parent.Id; + var parentsList = await _daoFactory.GetFolderDao().GetParentFoldersAsync(parent.Id); + parentsList.Reverse(); + parentsList.Remove(parent); + + if (parentsList.Count > 0) + { + var rootFolder = parentsList.Last(); + T rootFolderId = default; + cacheFolderId = rootFolder.Id; + if (rootFolder.RootFolderType == FolderType.BUNCH) + { + cacheFolderId = rootFolderId = await _globalFolder.GetFolderProjectsAsync(_daoFactory); + } + else if (rootFolder.RootFolderType == FolderType.USER && !Equals(rootFolder.RootId, _globalFolder.GetFolderMy(this, _daoFactory))) + { + cacheFolderId = rootFolderId = await _globalFolder.GetFolderShareAsync(_daoFactory); + } + + if (rootFolderId != null) + { + parentsList.Add(await _daoFactory.GetFolderDao().GetFolderAsync(rootFolderId)); + } + + var fileSecurity = _fileSecurity; + + foreach (var folderFromList in parentsList) + { + var parentTreeTag = await tagDao.GetNewTagsAsync(_authContext.CurrentAccount.ID, folderFromList).FirstOrDefaultAsync(); + + if (parentTreeTag == null) + { + if (await fileSecurity.CanReadAsync(folderFromList)) + { + tagDao.SaveTags(Tag.New(_authContext.CurrentAccount.ID, folderFromList, -diff)); + } + } + else + { + parentTreeTag.Count -= diff; + tagDao.UpdateNewTags(parentTreeTag); + } + } + } + + if (cacheFolderId != null) + { + RemoveFromCahce(cacheFolderId); } } - - foreach (var e in entries) + else { - if (e is FileEntry) - { - var entry = (FileEntry)e; - var curTag = totalTags.FirstOrDefault(tag => tag.EntryType == entry.FileEntryType && tag.EntryId.Equals(entry.Id)); + await RemoveMarkAsNewAsync(parent); + } + } - if (entry.FileEntryType == FileEntryType.Folder) - { - ((IFolder)entry).NewForMe = curTag != null ? curTag.Count : 0; - } - else if (curTag != null) - { - entry.IsNew = true; - } + foreach (var e in entries) + { + if (e is FileEntry entry) + { + SatTagNewForEntry(entry); + } + else if (e is FileEntry thirdPartyEntry) + { + SatTagNewForEntry(thirdPartyEntry); + } + } + + void SatTagNewForEntry(FileEntry entry) + { + var curTag = totalTags.FirstOrDefault(tag => tag.EntryType == entry.FileEntryType && tag.EntryId.Equals(entry.Id)); + + if (curTag != null) + { + if (entry.FileEntryType == FileEntryType.Folder) + { + ((IFolder)entry).NewForMe = curTag.Count; } - - if (e is FileEntry) + else { - var entry = (FileEntry)e; - var curTag = totalTags.FirstOrDefault(tag => tag.EntryType == entry.FileEntryType && tag.EntryId.Equals(entry.Id)); - - if (entry.FileEntryType == FileEntryType.Folder) - { - ((IFolder)entry).NewForMe = curTag != null ? curTag.Count : 0; - } - else if (curTag != null) - { - entry.IsNew = true; - } + entry.IsNew = true; } } }