From d6c696589dac7a7609d4b645c867c6e37301d353 Mon Sep 17 00:00:00 2001 From: Paul Calderon Date: Fri, 21 Jun 2024 13:50:35 -0500 Subject: [PATCH] Add sorting functionality to recycle bin items --- .../Recyclebin/IRecyclebinController.cs | 6 +-- .../Recyclebin/RecyclebinController.cs | 46 ++++++++++++++++-- .../Services/RecyclebinController.cs | 12 ++--- .../App_LocalResources/Recyclebin.resx | 2 +- .../personaBar/Dnn.Recyclebin/Recyclebin.html | 16 +++---- .../Dnn.Recyclebin/css/RecycleBin.css | 17 +++++++ .../scripts/RecycleBin.ViewModel.js | 48 ++++++++++++++----- 7 files changed, 113 insertions(+), 34 deletions(-) diff --git a/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Components/Recyclebin/IRecyclebinController.cs b/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Components/Recyclebin/IRecyclebinController.cs index 8147f220d26..dd773b11712 100644 --- a/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Components/Recyclebin/IRecyclebinController.cs +++ b/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Components/Recyclebin/IRecyclebinController.cs @@ -36,10 +36,10 @@ public interface IRecyclebinController bool RestoreUser(UserInfo user, out string resultmessage); - List GetDeletedTabs(out int totalRecords, int pageIndex = -1, int pageSize = -1); + List GetDeletedTabs(out int totalRecords, int pageIndex = -1, int pageSize = -1, string sortType = "", string sortDirection = ""); - List GetDeletedModules(out int totalRecords, int pageIndex = -1, int pageSize = -1); + List GetDeletedModules(out int totalRecords, int pageIndex = -1, int pageSize = -1, string sortType = "", string sortDirection = ""); - List GetDeletedUsers(out int totalRecords, int pageIndex = -1, int pageSize = -1); + List GetDeletedUsers(out int totalRecords, int pageIndex = -1, int pageSize = -1, string sortType = "", string sortDirection = ""); } } diff --git a/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Components/Recyclebin/RecyclebinController.cs b/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Components/Recyclebin/RecyclebinController.cs index a6efc6f214d..cea4f5cf09a 100644 --- a/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Components/Recyclebin/RecyclebinController.cs +++ b/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Components/Recyclebin/RecyclebinController.cs @@ -214,24 +214,49 @@ public bool RestoreModule(int moduleId, int tabId, out string errorMessage) } /// - public List GetDeletedTabs(out int totalRecords, int pageIndex = -1, int pageSize = -1) + public List GetDeletedTabs(out int totalRecords, int pageIndex = -1, int pageSize = -1, string sortType = "", string sortDirection = "") { var adminTabId = PortalSettings.AdminTabId; var tabs = TabController.GetPortalTabs(PortalSettings.PortalId, adminTabId, true, true, true, true); var deletedtabs = tabs.Where(t => t.ParentId != adminTabId && t.IsDeleted && TabPermissionController.CanDeletePage(t)); + if (sortType == "tab") + { + deletedtabs = sortDirection == "asc" ? deletedtabs = deletedtabs.OrderBy(tab => tab.TabName) : deletedtabs = deletedtabs.OrderByDescending(tab => tab.TabName); + } + + if (sortType == "date") + { + deletedtabs = sortDirection == "asc" ? deletedtabs = deletedtabs.OrderBy(tab => tab.LastModifiedOnDate) : deletedtabs = deletedtabs.OrderByDescending(tab => tab.LastModifiedOnDate); + } + totalRecords = deletedtabs.Count(); return pageIndex == -1 || pageSize == -1 ? deletedtabs.ToList() : deletedtabs.Skip(pageIndex * pageSize).Take(pageSize).ToList(); } /// - public List GetDeletedModules(out int totalRecords, int pageIndex = -1, int pageSize = -1) + public List GetDeletedModules(out int totalRecords, int pageIndex = -1, int pageSize = -1, string sortType = "", string sortDirection = "") { var deletedModules = this.moduleController.GetModules(PortalSettings.PortalId) .Cast() .Where(module => module.IsDeleted && ( TabPermissionController.CanAddContentToPage(TabController.Instance.GetTab(module.TabID, module.PortalID)) || ModulePermissionController.CanDeleteModule(module))); + if (sortType == "title") + { + deletedModules = sortDirection == "asc" ? deletedModules = deletedModules.OrderBy(module => module.ModuleTitle) : deletedModules = deletedModules.OrderByDescending(module => module.ModuleTitle); + } + + if (sortType == "tab") + { + deletedModules = sortDirection == "asc" ? deletedModules = deletedModules.OrderBy(module => module.ParentTab.TabName) : deletedModules = deletedModules.OrderByDescending(module => module.ParentTab.TabName); + } + + if (sortType == "date") + { + deletedModules = sortDirection == "asc" ? deletedModules = deletedModules.OrderBy(module => module.LastModifiedOnDate) : deletedModules = deletedModules.OrderByDescending(module => module.LastModifiedOnDate); + } + totalRecords = deletedModules.Count(); return pageIndex == -1 || pageSize == -1 ? deletedModules.ToList() : deletedModules.Skip(pageIndex * pageSize).Take(pageSize).ToList(); } @@ -248,9 +273,24 @@ public string GetTabStatus(TabInfo tab) } /// - public List GetDeletedUsers(out int totalRecords, int pageIndex = -1, int pageSize = -1) + public List GetDeletedUsers(out int totalRecords, int pageIndex = -1, int pageSize = -1, string sortType = "", string sortDirection = "") { var deletedusers = UserController.GetDeletedUsers(PortalSettings.PortalId).Cast().Where(this.CanManageUser); + if (sortType == "username") + { + deletedusers = sortDirection == "asc" ? deletedusers = deletedusers.OrderBy(user => user.Username) : deletedusers = deletedusers.OrderByDescending(user => user.Username); + } + + if (sortType == "displayname") + { + deletedusers = sortDirection == "asc" ? deletedusers = deletedusers.OrderBy(user => user.DisplayName) : deletedusers = deletedusers.OrderByDescending(user => user.DisplayName); + } + + if (sortType == "date") + { + deletedusers = sortDirection == "asc" ? deletedusers = deletedusers.OrderBy(user => user.LastModifiedOnDate) : deletedusers = deletedusers.OrderByDescending(user => user.LastModifiedOnDate); + } + totalRecords = deletedusers.Count(); return pageIndex == -1 || pageSize == -1 ? deletedusers.ToList() : deletedusers.Skip(pageIndex * pageSize).Take(pageSize).ToList(); } diff --git a/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Services/RecyclebinController.cs b/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Services/RecyclebinController.cs index db030af3662..93fdcdc167e 100644 --- a/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Services/RecyclebinController.cs +++ b/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Services/RecyclebinController.cs @@ -34,10 +34,10 @@ public class RecyclebinController : PersonaBarApiController [HttpGet] [AdvancedPermission(MenuName = Components.Constants.MenuName, Permission = Components.Constants.RecycleBinPagesView)] - public HttpResponseMessage GetDeletedPageList(int pageIndex = -1, int pageSize = -1) + public HttpResponseMessage GetDeletedPageList(int pageIndex = -1, int pageSize = -1, string sortType = "", string sortDirection = "") { var totalRecords = 0; - var tabs = Components.RecyclebinController.Instance.GetDeletedTabs(out totalRecords, pageIndex, pageSize); + var tabs = Components.RecyclebinController.Instance.GetDeletedTabs(out totalRecords, pageIndex, pageSize, sortType, sortDirection); var deletedtabs = from t in tabs select this.ConvertToPageItem(t, tabs); var response = new @@ -52,10 +52,10 @@ public HttpResponseMessage GetDeletedPageList(int pageIndex = -1, int pageSize = [HttpGet] [AdvancedPermission(MenuName = Components.Constants.MenuName, Permission = Components.Constants.RecycleBinModulesView)] - public HttpResponseMessage GetDeletedModuleList(int pageIndex = -1, int pageSize = -1) + public HttpResponseMessage GetDeletedModuleList(int pageIndex = -1, int pageSize = -1, string sortType = "", string sortDirection = "") { var totalRecords = 0; - var mods = Components.RecyclebinController.Instance.GetDeletedModules(out totalRecords, pageIndex, pageSize); + var mods = Components.RecyclebinController.Instance.GetDeletedModules(out totalRecords, pageIndex, pageSize, sortType, sortDirection); var deletedmodules = from t in mods select this.ConvertToModuleItem(t); var response = new { @@ -69,10 +69,10 @@ public HttpResponseMessage GetDeletedModuleList(int pageIndex = -1, int pageSize [HttpGet] [AdvancedPermission(MenuName = Components.Constants.MenuName, Permission = Components.Constants.RecycleBinUsersView)] - public HttpResponseMessage GetDeletedUserList(int pageIndex = -1, int pageSize = -1) + public HttpResponseMessage GetDeletedUserList(int pageIndex = -1, int pageSize = -1, string sortType = "", string sortDirection = "") { var totalRecords = 0; - var users = Components.RecyclebinController.Instance.GetDeletedUsers(out totalRecords, pageIndex, pageSize); + var users = Components.RecyclebinController.Instance.GetDeletedUsers(out totalRecords, pageIndex, pageSize, sortType, sortDirection); var deletedusers = from t in users select this.ConvertToUserItem(t); var response = new { diff --git a/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/admin/personaBar/Dnn.Recyclebin/App_LocalResources/Recyclebin.resx b/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/admin/personaBar/Dnn.Recyclebin/App_LocalResources/Recyclebin.resx index 26b157e60f6..1e7a9faa630 100644 --- a/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/admin/personaBar/Dnn.Recyclebin/App_LocalResources/Recyclebin.resx +++ b/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/admin/personaBar/Dnn.Recyclebin/App_LocalResources/Recyclebin.resx @@ -133,7 +133,7 @@ Yes - Date + Deletion Date Empty Recycle Bin diff --git a/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/admin/personaBar/Dnn.Recyclebin/Recyclebin.html b/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/admin/personaBar/Dnn.Recyclebin/Recyclebin.html index 672fc4b4e0a..3a34af87650 100644 --- a/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/admin/personaBar/Dnn.Recyclebin/Recyclebin.html +++ b/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/admin/personaBar/Dnn.Recyclebin/Recyclebin.html @@ -32,8 +32,8 @@

- - + + @@ -54,9 +54,9 @@

- - - + + + @@ -77,9 +77,9 @@

- - - + + + diff --git a/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/admin/personaBar/Dnn.Recyclebin/css/RecycleBin.css b/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/admin/personaBar/Dnn.Recyclebin/css/RecycleBin.css index aa1c5a537ab..7b59d69253e 100644 --- a/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/admin/personaBar/Dnn.Recyclebin/css/RecycleBin.css +++ b/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/admin/personaBar/Dnn.Recyclebin/css/RecycleBin.css @@ -457,6 +457,23 @@ div#recycleBin-header.socialpanelheader .actions { background: #F2F2F2; } + .recycleBinContainer #pages table.dnnRBGrid tr.dnnRBGridHeader td.pagename, + .recycleBinContainer #pages table.dnnRBGrid tr.dnnRBGridHeader td.deleteddate { + cursor: pointer; + } + + .recycleBinContainer #modules table.dnnRBGrid tr.dnnRBGridHeader td.mtitle, + .recycleBinContainer #modules table.dnnRBGrid tr.dnnRBGridHeader td.mpage, + .recycleBinContainer #modules table.dnnRBGrid tr.dnnRBGridHeader td.deleteddate { + cursor: pointer; + } + + .recycleBinContainer #users table.dnnRBGrid tr.dnnRBGridHeader td.username, + .recycleBinContainer #users table.dnnRBGrid tr.dnnRBGridHeader td.displayname, + .recycleBinContainer #users table.dnnRBGrid tr.dnnRBGridHeader td.deleteddate { + cursor: pointer; + } + .recycleBinContainer table.dnnRBGrid tr.dnnRBGridBody td.thumbnail, .recycleBinContainer table.dnnRBGrid tr.dnnRBGridBody td.title, .recycleBinContainer table.dnnRBGrid tr.dnnRBGridBody td.pagename, diff --git a/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/admin/personaBar/Dnn.Recyclebin/scripts/RecycleBin.ViewModel.js b/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/admin/personaBar/Dnn.Recyclebin/scripts/RecycleBin.ViewModel.js index e706fbaef99..fdc8bf13422 100644 --- a/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/admin/personaBar/Dnn.Recyclebin/scripts/RecycleBin.ViewModel.js +++ b/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/admin/personaBar/Dnn.Recyclebin/scripts/RecycleBin.ViewModel.js @@ -233,7 +233,7 @@ define(['jquery', 'knockout', restorePageHandler, removePageHandler, restoreModuleHandler, removeModuleHandler, emptyRecycleBinHandler, restoreUserHandler, removeUserHandler, restoreSelectedUsersHandler, removeSelectedUsersHandler, userRestoreRevomeOperationsCallback, Paginate, getDeletedPageList, getDeletedModuleList, getDeletedUserList, - getService, getViewModel, tabActivated; + getService, getViewModel, tabActivated, sortBy; /* Class properties */ DnnPageRecycleBin.class = 'DnnPageRecycleBin'; @@ -671,7 +671,7 @@ define(['jquery', 'knockout', var TotalResults = {} var timeout = null; - var pageSize=15; + var pageSize=20; Paginate = function(API_METHOD, viewModelProp, elementId){ var element = $(elementId).jScrollPane(); @@ -697,7 +697,7 @@ define(['jquery', 'knockout', TotalResults[viewModelProp].paginationRequestCount = TotalResults[viewModelProp].paginationRequestCount || 1; - getService().get(API_METHOD, {pageIndex: TotalResults[viewModelProp].paginationRequestCount++, pageSize: pageSize }, function (data) { + getService().get(API_METHOD, {pageIndex: TotalResults[viewModelProp].paginationRequestCount++, pageSize: pageSize, sortType: viewModel.sortType(), sortDirection: viewModel.sortDirection() }, function (data) { var results = data.Results; var conditional = TotalResults[viewModelProp].remainingPages-results.length > 0; @@ -713,29 +713,29 @@ define(['jquery', 'knockout', var treeOfPages = getTreesOfPages(temp); treeOfPages.forEach(function(pageTemp) { viewModel[viewModelProp].push(pageTemp); - }); - break; + }); + break; case 'deletedusersList': results.forEach(function(tempUser){ var user = new UserInfo(tempUser); viewModel[viewModelProp].push(user) }); - break; + break; case 'deletedtemplatesList': results.forEach(function(tempTemplate){ var template = new TemplateInfo(tempTemplate); viewModel[viewModelProp].push(template); }); - break; + break; case 'deletedmodulesList': results.forEach(function(tempModule){ var module = new ModuleInfo(tempModule); viewModel[viewModelProp].push(module); }); - break; + break; } api.reinitialise(); @@ -772,7 +772,7 @@ define(['jquery', 'knockout', viewModel.deletedpagesList.removeAll(); - getService().get('GetDeletedPageList', {pageIndex:0, pageSize:pageSize}, function (data) { + getService().get('GetDeletedPageList', {pageIndex:0, pageSize:pageSize, sortType:viewModel.sortType(), sortDirection:viewModel.sortDirection() }, function (data) { var results = data.Results; var viewModelProp = "deletedpagesList"; TotalResults[viewModelProp]={}; @@ -807,7 +807,7 @@ define(['jquery', 'knockout', viewModel.deletedmodulesList.removeAll(); - getService().get('GetDeletedModuleList', {pageIndex:0, pageSize:pageSize}, function (data) { + getService().get('GetDeletedModuleList', {pageIndex:0, pageSize:pageSize, sortType:viewModel.sortType(), sortDirection:viewModel.sortDirection()}, function (data) { var results = data.Results; var viewModelPropName = 'deletedmodulesList'; @@ -841,7 +841,7 @@ define(['jquery', 'knockout', viewModel.deletedUsersReady(false); viewModel.deletedusersList.removeAll(); - getService().get('GetDeletedUserList', {pageIndex:0, pageSize:pageSize}, function (data) { + getService().get('GetDeletedUserList', {pageIndex:0, pageSize:pageSize, sortType:viewModel.sortType(), sortDirection:viewModel.sortDirection()}, function (data) { var results = data.Results; var viewModelPropName = "deletedusersList"; TotalResults[viewModelPropName]={}; @@ -879,12 +879,31 @@ define(['jquery', 'knockout', getViewModel().activeTab(activeTab); }; + sortBy = function (section, type, direction) { + getViewModel().sortDirection(direction); + getViewModel().sortType(type); + switch (section) { + case "pages": + getDeletedPageList(false); + break; + case "modules": + getDeletedModuleList(false); + break; + case "users": + getDeletedUserList(false); + break; + } + } + getViewModel = function () { if (!_viewModel) { _viewModel = { resx: _resx, settings: _settings, + sortType: ko.observable(""), + sortDirection: ko.observable(""), + activeTab: ko.observable(0), deletedPagesReady: ko.observable(false), deletedModulesReady: ko.observable(false), @@ -922,7 +941,10 @@ define(['jquery', 'knockout', emptyRecycleBin: emptyRecycleBinHandler, - tabActivated: tabActivated + tabActivated: tabActivated, + + sortBy: sortBy + }; if (_settings.canViewPages && _settings.canManagePages) { _viewModel.selectAllPages.subscribe(function (newValue) { @@ -955,7 +977,7 @@ define(['jquery', 'knockout', _options = $.extend({}, RECYCLE_BIN_DEFAULT_OPTIONS, _options); var viewModel = getViewModel(); ko.applyBindings(viewModel, wrapper[0]); - initPagination(); + initPagination(); }; DnnPageRecycleBin.prototype.show = function () {