From d3eb901ef90b31782ce1f767f411ecb0d1a43423 Mon Sep 17 00:00:00 2001 From: Alex Jackson Date: Fri, 25 Jun 2021 10:59:38 +0100 Subject: [PATCH 01/26] HEEDLS-532 Initial no javascript filtering --- .../DataServices/UserDataService.cs | 40 ++++++++------- .../Models/User/AdminUser.cs | 2 + .../Extensions/QueryableExtensionsTests.cs | 29 +++++++++++ .../CentreAdministratorsViewModelTests.cs | 2 + .../Administrator/AdministratorController.cs | 20 +++++++- .../Extensions/QueryableExtensions.cs | 14 ++++++ .../Helpers/FilteringHelper.cs | 49 +++++++++++++++++++ .../Common/BaseSearchablePageViewModel.cs | 17 +++++-- .../Frameworks/AllFrameworksViewModel.cs | 2 +- .../Frameworks/MyFrameworksViewModel.cs | 2 +- .../Available/AvailablePageViewModel.cs | 2 +- .../Completed/CompletedPageViewModel.cs | 2 +- .../Current/CurrentPageViewModel.cs | 2 +- .../CentreAdministratorsViewModel.cs | 30 ++++++++++-- .../Administrator/SearchableAdminViewModel.cs | 3 ++ .../Centre/Administrator/Index.cshtml | 34 ++++++++++--- 16 files changed, 209 insertions(+), 41 deletions(-) create mode 100644 DigitalLearningSolutions.Web/Helpers/FilteringHelper.cs diff --git a/DigitalLearningSolutions.Data/DataServices/UserDataService.cs b/DigitalLearningSolutions.Data/DataServices/UserDataService.cs index 9a2f3700d0..4231e1c207 100644 --- a/DigitalLearningSolutions.Data/DataServices/UserDataService.cs +++ b/DigitalLearningSolutions.Data/DataServices/UserDataService.cs @@ -138,25 +138,27 @@ public List GetAdminUsersByCentreId(int centreId) { var users = connection.Query( @"SELECT - AdminID AS Id, - CentreID, - Email AS EmailAddress, - Forename AS FirstName, - Surname AS LastName, - Password, - CentreAdmin AS IsCentreAdmin, - IsCentreManager, - ContentCreator AS IsContentCreator, - ContentManager AS IsContentManager, - PublishToAll, - SummaryReports, - UserAdmin AS IsUserAdmin, - CategoryID, - Supervisor AS IsSupervisor, - Trainer AS IsTrainer, - ImportOnly - FROM AdminUsers - WHERE Active = 1 AND Approved = 1 AND CentreId = @centreId", + au.AdminID AS Id, + au.CentreID, + au.Email AS EmailAddress, + au.Forename AS FirstName, + au.Surname AS LastName, + au.Password, + au.CentreAdmin AS IsCentreAdmin, + au.IsCentreManager, + au.ContentCreator AS IsContentCreator, + au.ContentManager AS IsContentManager, + au.PublishToAll, + au.SummaryReports, + au.UserAdmin AS IsUserAdmin, + au.CategoryID, + cc.CategoryName, + au.Supervisor AS IsSupervisor, + au.Trainer AS IsTrainer, + au.ImportOnly + FROM AdminUsers AS au + LEFT JOIN CourseCategories AS cc ON cc.CourseCategoryID = au.CategoryID + WHERE au.Active = 1 AND au.Approved = 1 AND au.CentreId = @centreId", new { centreId } ).ToList(); diff --git a/DigitalLearningSolutions.Data/Models/User/AdminUser.cs b/DigitalLearningSolutions.Data/Models/User/AdminUser.cs index 2826064564..0179072477 100644 --- a/DigitalLearningSolutions.Data/Models/User/AdminUser.cs +++ b/DigitalLearningSolutions.Data/Models/User/AdminUser.cs @@ -33,6 +33,8 @@ public class AdminUser : User public bool IsLocalWorkforceManager { get; set; } public bool ImportOnly { get; set; } + public bool IsCmsAdministrator => ImportOnly && IsContentManager; + public override UserReference ToUserReference() { return new UserReference(Id, UserType.AdminUser); diff --git a/DigitalLearningSolutions.Web.Tests/Extensions/QueryableExtensionsTests.cs b/DigitalLearningSolutions.Web.Tests/Extensions/QueryableExtensionsTests.cs index 9fa1bfbac5..b08d90fd87 100644 --- a/DigitalLearningSolutions.Web.Tests/Extensions/QueryableExtensionsTests.cs +++ b/DigitalLearningSolutions.Web.Tests/Extensions/QueryableExtensionsTests.cs @@ -1,5 +1,6 @@ namespace DigitalLearningSolutions.Web.Tests.Extensions { + using System.Linq; using DigitalLearningSolutions.Web.Extensions; using DigitalLearningSolutions.Web.Tests.TestHelpers; using FluentAssertions; @@ -90,5 +91,33 @@ public void SortAllItems_by_name_then_number_descending_returns_item_in_expected // Then result.Should().BeEquivalentTo(expectedItems); } + + [Test] + public void Where_returns_expected_items_for_string_property() + { + // Given + var inputItems = QueryableHelper.GetListOfSortableItems("a", 1, "a", 3, "b", 2); + var expectedItems = new[] { new SortableItem("a", 1), new SortableItem("a", 3) }.AsQueryable(); + + // When + var result = inputItems.Where("Name", "a"); + + // Then + result.Should().BeEquivalentTo(expectedItems); + } + + [Test] + public void Where_returns_expected_items_for_int_property() + { + // Given + var inputItems = QueryableHelper.GetListOfSortableItems("a", 1, "a", 3, "b", 3); + var expectedItems = new[] { new SortableItem("a", 3), new SortableItem("b", 3) }.AsQueryable(); + + // When + var result = inputItems.Where("Number", 3); + + // Then + result.Should().BeEquivalentTo(expectedItems); + } } } diff --git a/DigitalLearningSolutions.Web.Tests/ViewModels/TrackingSystem/Centre/Administrator/CentreAdministratorsViewModelTests.cs b/DigitalLearningSolutions.Web.Tests/ViewModels/TrackingSystem/Centre/Administrator/CentreAdministratorsViewModelTests.cs index 419be5ad85..9f3f35d288 100644 --- a/DigitalLearningSolutions.Web.Tests/ViewModels/TrackingSystem/Centre/Administrator/CentreAdministratorsViewModelTests.cs +++ b/DigitalLearningSolutions.Web.Tests/ViewModels/TrackingSystem/Centre/Administrator/CentreAdministratorsViewModelTests.cs @@ -37,6 +37,7 @@ public void Centre_administrators_should_default_to_returning_the_first_ten_admi null, "SearchableName", "Ascending", + null, 1 ); @@ -53,6 +54,7 @@ public void Centre_administrators_should_correctly_return_the_second_page_of_adm null, "SearchableName", "Ascending", + null, 2 ); diff --git a/DigitalLearningSolutions.Web/Controllers/TrackingSystem/Centre/Administrator/AdministratorController.cs b/DigitalLearningSolutions.Web/Controllers/TrackingSystem/Centre/Administrator/AdministratorController.cs index 001680aba0..8f7a2fd6d5 100644 --- a/DigitalLearningSolutions.Web/Controllers/TrackingSystem/Centre/Administrator/AdministratorController.cs +++ b/DigitalLearningSolutions.Web/Controllers/TrackingSystem/Centre/Administrator/AdministratorController.cs @@ -1,5 +1,6 @@ namespace DigitalLearningSolutions.Web.Controllers.TrackingSystem.Centre.Administrator { + using System.Collections.Generic; using DigitalLearningSolutions.Data.DataServices; using DigitalLearningSolutions.Web.Helpers; using DigitalLearningSolutions.Web.ViewModels.Common; @@ -21,16 +22,33 @@ public AdministratorController(IUserDataService userDataService) [Route("{page=1:int}")] public IActionResult Index( string? searchString = null, - int page = 1 + int page = 1, + string? filterBy = null, + string? filterValue = null ) { + if (filterValue != null) + { + filterBy += NewlineSeparatedStringListHelper.AddStringToNewlineSeparatedList(filterBy, filterValue); + } + var adminUsersAtCentre = userDataService.GetAdminUsersByCentreId(User.GetCentreId()); + var categories = new List { + "Undefined", + "Office 2007", + "Office 2010", + "Digital Workplace", + "test", + "Clinical Skills" + }; var model = new CentreAdministratorsViewModel( User.GetCentreId(), adminUsersAtCentre, + categories, searchString, DefaultSortByOptions.Name.PropertyName, BaseSearchablePageViewModel.Ascending, + filterBy, page ); diff --git a/DigitalLearningSolutions.Web/Extensions/QueryableExtensions.cs b/DigitalLearningSolutions.Web/Extensions/QueryableExtensions.cs index 519ecdf2b7..54e8aac615 100644 --- a/DigitalLearningSolutions.Web/Extensions/QueryableExtensions.cs +++ b/DigitalLearningSolutions.Web/Extensions/QueryableExtensions.cs @@ -26,6 +26,11 @@ public static IOrderedQueryable ThenByDescending(this IOrderedQueryable return source.ThenByDescending(ToLambda(propertyName)); } + public static IQueryable Where(this IQueryable source, string propertyName, object? propertyValue) + { + return source.Where(ToEqualityLambda(propertyName, propertyValue)); + } + private static Expression> ToLambda(string propertyName) { var parameter = Expression.Parameter(typeof(T)); @@ -34,5 +39,14 @@ private static Expression> ToLambda(string propertyName) return Expression.Lambda>(propAsObject, parameter); } + + private static Expression> ToEqualityLambda(string propertyName, object? comparisonValue) + { + var parameter = Expression.Parameter(typeof(T)); + var property = Expression.Property(parameter, propertyName); + var objectEquality = Expression.Equal(property, Expression.Constant(comparisonValue)); + + return Expression.Lambda>(objectEquality, parameter); + } } } diff --git a/DigitalLearningSolutions.Web/Helpers/FilteringHelper.cs b/DigitalLearningSolutions.Web/Helpers/FilteringHelper.cs new file mode 100644 index 0000000000..78b2389ff8 --- /dev/null +++ b/DigitalLearningSolutions.Web/Helpers/FilteringHelper.cs @@ -0,0 +1,49 @@ +namespace DigitalLearningSolutions.Web.Helpers +{ + using System.Collections.Generic; + using System.ComponentModel; + using System.Linq; + using DigitalLearningSolutions.Web.Extensions; + using DigitalLearningSolutions.Data.Models; + using DigitalLearningSolutions.Data.Models.User; + + public static class FilteringHelper + { + public static IEnumerable FilterItems( + IQueryable items, + string? filterBy + ) where T : BaseSearchableItem + { + var listOfFilters = NewlineSeparatedStringListHelper.SplitNewlineSeparatedList(filterBy); + + foreach (var filter in listOfFilters) + { + var splitFilter = filter.Split('|'); + var propertyName = splitFilter[0]; + var propertyValueString = splitFilter[1]; + var propertyType = typeof(T).GetProperty(propertyName)!.PropertyType; + var propertyValue = TypeDescriptor.GetConverter(propertyType).ConvertFromString(propertyValueString); + + items = items.Where(propertyName, propertyValue); + } + + return items; + } + } + + public static class AdminFilterOptions + { + public static readonly (string DisplayText, string Filter) CentreAdministrator = + ("Centre administrator", nameof(AdminUser.IsCentreAdmin) + "|true"); + public static readonly (string DisplayText, string Filter) Supervisor = + ("Supervisor", nameof(AdminUser.IsSupervisor) + "|true"); + public static readonly (string DisplayText, string Filter) Trainer = + ("Trainer", nameof(AdminUser.IsTrainer) + "|true"); + public static readonly (string DisplayText, string Filter) ContentCreatorLicense = + ("Content Creator license", nameof(AdminUser.IsContentCreator) + "|true"); + public static readonly (string DisplayText, string Filter) CmsAdministrator = + ("CMS administrator", nameof(AdminUser.IsCmsAdministrator) + "|true"); + public static readonly (string DisplayText, string Filter) CmsManager = + ("CMS manager", nameof(AdminUser.IsContentManager) + "|true"); + } +} diff --git a/DigitalLearningSolutions.Web/ViewModels/Common/BaseSearchablePageViewModel.cs b/DigitalLearningSolutions.Web/ViewModels/Common/BaseSearchablePageViewModel.cs index f92e3cdf3a..007c0737b4 100644 --- a/DigitalLearningSolutions.Web/ViewModels/Common/BaseSearchablePageViewModel.cs +++ b/DigitalLearningSolutions.Web/ViewModels/Common/BaseSearchablePageViewModel.cs @@ -4,7 +4,6 @@ using System.Collections.Generic; using System.Linq; using DigitalLearningSolutions.Web.Helpers; - using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Rendering; public abstract class BaseSearchablePageViewModel @@ -12,6 +11,8 @@ public abstract class BaseSearchablePageViewModel public const string Descending = "Descending"; public const string Ascending = "Ascending"; + public readonly string? FilterString; + private readonly int itemsPerPage; public readonly string? SearchString; @@ -22,6 +23,7 @@ protected BaseSearchablePageViewModel( string? searchString, string sortBy, string sortDirection, + string? filterString, int page, int itemsPerPage = 10 ) @@ -29,22 +31,27 @@ protected BaseSearchablePageViewModel( SortBy = sortBy; SortDirection = sortDirection; SearchString = searchString; + FilterString = filterString; Page = page; + Filters = new List<(string, IEnumerable<(string, string)>)>(); this.itemsPerPage = itemsPerPage; } - + public string SortDirection { get; set; } - + public string SortBy { get; set; } - + public int Page { get; protected set; } public int TotalPages { get; protected set; } - public IEnumerable SortBySelectListItems => SelectListHelper.MapOptionsToSelectListItems(SortOptions); + public IEnumerable SortBySelectListItems => + SelectListHelper.MapOptionsToSelectListItems(SortOptions); public abstract IEnumerable<(string, string)> SortOptions { get; } + public IEnumerable<(string, IEnumerable<(string, string)>)> Filters { get; set; } + protected IEnumerable GetItemsOnCurrentPage(IList items) { if (items.Count > itemsPerPage) diff --git a/DigitalLearningSolutions.Web/ViewModels/Frameworks/AllFrameworksViewModel.cs b/DigitalLearningSolutions.Web/ViewModels/Frameworks/AllFrameworksViewModel.cs index c39b66285a..5b4d316175 100644 --- a/DigitalLearningSolutions.Web/ViewModels/Frameworks/AllFrameworksViewModel.cs +++ b/DigitalLearningSolutions.Web/ViewModels/Frameworks/AllFrameworksViewModel.cs @@ -16,7 +16,7 @@ public AllFrameworksViewModel( string sortBy, string sortDirection, int page - ) : base(searchString, sortBy, sortDirection, page, 12) + ) : base(searchString, sortBy, sortDirection, null, page, 12) { var sortedItems = GenericSortingHelper.SortAllItems( brandedFrameworks.AsQueryable(), diff --git a/DigitalLearningSolutions.Web/ViewModels/Frameworks/MyFrameworksViewModel.cs b/DigitalLearningSolutions.Web/ViewModels/Frameworks/MyFrameworksViewModel.cs index 2a5f9ee530..66a2924305 100644 --- a/DigitalLearningSolutions.Web/ViewModels/Frameworks/MyFrameworksViewModel.cs +++ b/DigitalLearningSolutions.Web/ViewModels/Frameworks/MyFrameworksViewModel.cs @@ -18,7 +18,7 @@ public MyFrameworksViewModel( string sortDirection, int page, bool isFrameworkDeveloper - ) : base(searchString, sortBy, sortDirection, page, 12) + ) : base(searchString, sortBy, sortDirection, null, page, 12) { var sortedItems = GenericSortingHelper.SortAllItems( brandedFrameworks.AsQueryable(), diff --git a/DigitalLearningSolutions.Web/ViewModels/LearningPortal/Available/AvailablePageViewModel.cs b/DigitalLearningSolutions.Web/ViewModels/LearningPortal/Available/AvailablePageViewModel.cs index 004e05d550..9bca59ae46 100644 --- a/DigitalLearningSolutions.Web/ViewModels/LearningPortal/Available/AvailablePageViewModel.cs +++ b/DigitalLearningSolutions.Web/ViewModels/LearningPortal/Available/AvailablePageViewModel.cs @@ -18,7 +18,7 @@ public AvailablePageViewModel( string sortDirection, string? bannerText, int page - ) : base(searchString, sortBy, sortDirection, page) + ) : base(searchString, sortBy, sortDirection, null, page) { BannerText = bannerText; var sortedItems = GenericSortingHelper.SortAllItems( diff --git a/DigitalLearningSolutions.Web/ViewModels/LearningPortal/Completed/CompletedPageViewModel.cs b/DigitalLearningSolutions.Web/ViewModels/LearningPortal/Completed/CompletedPageViewModel.cs index 7659dc5f20..641d3d8dea 100644 --- a/DigitalLearningSolutions.Web/ViewModels/LearningPortal/Completed/CompletedPageViewModel.cs +++ b/DigitalLearningSolutions.Web/ViewModels/LearningPortal/Completed/CompletedPageViewModel.cs @@ -19,7 +19,7 @@ public CompletedPageViewModel( string sortDirection, string? bannerText, int page - ) : base(searchString, sortBy, sortDirection, page) + ) : base(searchString, sortBy, sortDirection, null, page) { BannerText = bannerText; var sortedItems = GenericSortingHelper.SortAllItems( diff --git a/DigitalLearningSolutions.Web/ViewModels/LearningPortal/Current/CurrentPageViewModel.cs b/DigitalLearningSolutions.Web/ViewModels/LearningPortal/Current/CurrentPageViewModel.cs index a405f31f99..d8a754d743 100644 --- a/DigitalLearningSolutions.Web/ViewModels/LearningPortal/Current/CurrentPageViewModel.cs +++ b/DigitalLearningSolutions.Web/ViewModels/LearningPortal/Current/CurrentPageViewModel.cs @@ -21,7 +21,7 @@ public CurrentPageViewModel( IEnumerable selfAssessments, string? bannerText, int page - ) : base(searchString, sortBy, sortDirection, page) + ) : base(searchString, sortBy, sortDirection, null, page) { BannerText = bannerText; var allItems = currentCourses.Cast().ToList(); diff --git a/DigitalLearningSolutions.Web/ViewModels/TrackingSystem/Centre/Administrator/CentreAdministratorsViewModel.cs b/DigitalLearningSolutions.Web/ViewModels/TrackingSystem/Centre/Administrator/CentreAdministratorsViewModel.cs index 3b59311a98..2bc86bbc89 100644 --- a/DigitalLearningSolutions.Web/ViewModels/TrackingSystem/Centre/Administrator/CentreAdministratorsViewModel.cs +++ b/DigitalLearningSolutions.Web/ViewModels/TrackingSystem/Centre/Administrator/CentreAdministratorsViewModel.cs @@ -5,17 +5,31 @@ using DigitalLearningSolutions.Data.Models.User; using DigitalLearningSolutions.Web.Helpers; using DigitalLearningSolutions.Web.ViewModels.Common; + using Microsoft.AspNetCore.Authorization.Infrastructure; + using Microsoft.CodeAnalysis.Operations; public class CentreAdministratorsViewModel : BaseSearchablePageViewModel { + private static readonly IEnumerable<(string, string)> RoleOptions = new[] + { + AdminFilterOptions.CentreAdministrator, + AdminFilterOptions.Supervisor, + AdminFilterOptions.Trainer, + AdminFilterOptions.ContentCreatorLicense, + AdminFilterOptions.CmsAdministrator, + AdminFilterOptions.CmsManager + }; + public CentreAdministratorsViewModel( int centreId, IEnumerable adminUsers, + IEnumerable categories, string? searchString, string sortBy, string sortDirection, + string? filterString, int page - ) : base(searchString, sortBy, sortDirection, page) + ) : base(searchString, sortBy, sortDirection, filterString, page) { CentreId = centreId; var sortedItems = GenericSortingHelper.SortAllItems( @@ -23,11 +37,19 @@ int page sortBy, sortDirection ); - var searchedItems = GenericSearchHelper.SearchItems(sortedItems, SearchString).ToList(); - MatchingSearchResults = searchedItems.Count; + var searchedItems = GenericSearchHelper.SearchItems(sortedItems, SearchString); + var filteredItems = FilteringHelper.FilterItems(searchedItems.AsQueryable(), filterString).ToList(); + MatchingSearchResults = filteredItems.Count; SetTotalPages(); - var paginatedItems = GetItemsOnCurrentPage(searchedItems); + var paginatedItems = GetItemsOnCurrentPage(filteredItems); Admins = paginatedItems.Select(adminUser => new SearchableAdminViewModel(adminUser)); + IEnumerable<(string, string)> categoryOptions = categories.Select(c => (c, $"{nameof(AdminUser.CategoryName)}|{c}")); + + Filters = new[] + { + ("Role", RoleOptions), + (nameof(AdminUser.CategoryName), categoryOptions) + }; } public int CentreId { get; set; } diff --git a/DigitalLearningSolutions.Web/ViewModels/TrackingSystem/Centre/Administrator/SearchableAdminViewModel.cs b/DigitalLearningSolutions.Web/ViewModels/TrackingSystem/Centre/Administrator/SearchableAdminViewModel.cs index 8ac7ffcf61..1a03fe42aa 100644 --- a/DigitalLearningSolutions.Web/ViewModels/TrackingSystem/Centre/Administrator/SearchableAdminViewModel.cs +++ b/DigitalLearningSolutions.Web/ViewModels/TrackingSystem/Centre/Administrator/SearchableAdminViewModel.cs @@ -8,10 +8,13 @@ public SearchableAdminViewModel(AdminUser adminUser) { Id = adminUser.Id; Name = adminUser.SearchableName; + CategoryName = adminUser.CategoryName; } public int Id { get; set; } public string Name { get; set; } + + public string? CategoryName { get; set; } } } diff --git a/DigitalLearningSolutions.Web/Views/TrackingSystem/Centre/Administrator/Index.cshtml b/DigitalLearningSolutions.Web/Views/TrackingSystem/Centre/Administrator/Index.cshtml index 120c0765df..a70b87459a 100644 --- a/DigitalLearningSolutions.Web/Views/TrackingSystem/Centre/Administrator/Index.cshtml +++ b/DigitalLearningSolutions.Web/Views/TrackingSystem/Centre/Administrator/Index.cshtml @@ -1,4 +1,5 @@ @inject IConfiguration Configuration +@using DigitalLearningSolutions.Data.Models.User @using DigitalLearningSolutions.Web.Models.Enums @using DigitalLearningSolutions.Web.ViewModels.TrackingSystem.Centre.Administrator @using Microsoft.Extensions.Configuration @@ -33,13 +34,31 @@ + +
+
+ + +
+ -
- + @foreach (var filter in Model.Filters) {
- + + + +
+ } +
@if (!Model.Admins.Any()) { @@ -50,6 +69,7 @@ +
@foreach (var admin in Model.Admins) { @@ -64,10 +84,10 @@
- - + +
From 90d9800d6deac2ef652f7a220d285864e98f3cc7 Mon Sep 17 00:00:00 2001 From: Alex Jackson Date: Fri, 25 Jun 2021 13:41:48 +0100 Subject: [PATCH 02/26] HEEDLS-532 Add some styling to filters --- .../Styles/shared/searchableElements.scss | 62 +++++++++++++++++++ .../Centre/Administrator/Index.cshtml | 45 ++++++++------ 2 files changed, 87 insertions(+), 20 deletions(-) diff --git a/DigitalLearningSolutions.Web/Styles/shared/searchableElements.scss b/DigitalLearningSolutions.Web/Styles/shared/searchableElements.scss index c80caee98f..935ec43a9a 100644 --- a/DigitalLearningSolutions.Web/Styles/shared/searchableElements.scss +++ b/DigitalLearningSolutions.Web/Styles/shared/searchableElements.scss @@ -116,6 +116,68 @@ div#search { } } +.filter-dropdown { + border: 2px solid $nhsuk-form-border-color; + border-radius: 4px 0 0 4px !important; + border-right: 0; + height: 52px; + padding: 0 12px; + font-size: 16px; + width: 80%; + float: left; + margin-bottom: nhsuk-spacing(4); + outline: none; + + &:focus { + border: 4px solid $color_nhsuk_black; + box-shadow: 0 0 0 4px $nhsuk-focus-color; + margin-right: 4px; + } + + &::-webkit-search-cancel-button { + -webkit-appearance: none; + display: none; + } + + @include mq($from: tablet) { + height: 40px; + width: 70%; + } + + @include mq($from: desktop) { + width: 80%; + } + + .js-enabled & { + border-right: 2px solid $nhsuk-form-border-color; + border-radius: 4px; + + &:focus { + border-right: 4px solid $color_nhsuk-black; + } + + @include mq($until: tablet) { + width: 100%; + } + } +} + +.filter-dropdown__submit { + background-color: #003d78; + float: left; + width: 15%; + color: $color_nhsuk-white; + min-width: 100px; + + .nhsuk-icon__search { + fill: #fff; + } + + &:hover { + background-color: #4c6272; + } +} + .sort-row { display: flex; flex-direction: row; diff --git a/DigitalLearningSolutions.Web/Views/TrackingSystem/Centre/Administrator/Index.cshtml b/DigitalLearningSolutions.Web/Views/TrackingSystem/Centre/Administrator/Index.cshtml index a70b87459a..36f0b50891 100644 --- a/DigitalLearningSolutions.Web/Views/TrackingSystem/Centre/Administrator/Index.cshtml +++ b/DigitalLearningSolutions.Web/Views/TrackingSystem/Centre/Administrator/Index.cshtml @@ -1,5 +1,4 @@ @inject IConfiguration Configuration -@using DigitalLearningSolutions.Data.Models.User @using DigitalLearningSolutions.Web.Models.Enums @using DigitalLearningSolutions.Web.ViewModels.TrackingSystem.Centre.Administrator @using Microsoft.Extensions.Configuration @@ -34,31 +33,40 @@ - +
+
- + @foreach (var filter in Model.Filters) {
-
- - -
+
+
+ + + + +
+
}
+ + + +
@if (!Model.Admins.Any()) { @@ -67,9 +75,6 @@

} else { - - -
@foreach (var admin in Model.Admins) { @@ -85,9 +90,9 @@ - +
From 9c154afce87d909b25cd3b345565b2d46c80e22c Mon Sep 17 00:00:00 2001 From: Alex Jackson Date: Mon, 28 Jun 2021 16:55:36 +0100 Subject: [PATCH 03/26] HEEDLS-532 Working filter and basic applied filter display --- .../Administrator/AdministratorController.cs | 2 +- .../Helpers/SortingHelper.cs | 90 +++++++++---------- .../Styles/shared/searchableElements.scss | 2 +- .../CurrentFiltersViewComponent.cs | 35 ++++++++ .../ViewComponents/SearchBoxViewComponent.cs | 5 +- .../Common/AppliedFilterViewModel.cs | 15 ++++ .../Common/BaseSearchablePageViewModel.cs | 4 +- .../Common/CurrentFiltersViewModel.cs | 14 +++ .../ViewModels/Common/SearchBoxViewModel.cs | 5 +- .../CentreAdministratorsViewModel.cs | 9 +- .../Components/CurrentFilters/Default.cshtml | 6 ++ .../Components/SearchBox/Default.cshtml | 2 +- .../SearchablePage/_SearchResultsCount.cshtml | 2 +- .../Centre/Administrator/Index.cshtml | 64 +++++++------ 14 files changed, 171 insertions(+), 84 deletions(-) create mode 100644 DigitalLearningSolutions.Web/ViewComponents/CurrentFiltersViewComponent.cs create mode 100644 DigitalLearningSolutions.Web/ViewModels/Common/AppliedFilterViewModel.cs create mode 100644 DigitalLearningSolutions.Web/ViewModels/Common/CurrentFiltersViewModel.cs create mode 100644 DigitalLearningSolutions.Web/Views/Shared/Components/CurrentFilters/Default.cshtml diff --git a/DigitalLearningSolutions.Web/Controllers/TrackingSystem/Centre/Administrator/AdministratorController.cs b/DigitalLearningSolutions.Web/Controllers/TrackingSystem/Centre/Administrator/AdministratorController.cs index 8f7a2fd6d5..90f55617ab 100644 --- a/DigitalLearningSolutions.Web/Controllers/TrackingSystem/Centre/Administrator/AdministratorController.cs +++ b/DigitalLearningSolutions.Web/Controllers/TrackingSystem/Centre/Administrator/AdministratorController.cs @@ -29,7 +29,7 @@ public IActionResult Index( { if (filterValue != null) { - filterBy += NewlineSeparatedStringListHelper.AddStringToNewlineSeparatedList(filterBy, filterValue); + filterBy = NewlineSeparatedStringListHelper.AddStringToNewlineSeparatedList(filterBy, filterValue); } var adminUsersAtCentre = userDataService.GetAdminUsersByCentreId(User.GetCentreId()); diff --git a/DigitalLearningSolutions.Web/Helpers/SortingHelper.cs b/DigitalLearningSolutions.Web/Helpers/SortingHelper.cs index 0dea47d075..983670785d 100644 --- a/DigitalLearningSolutions.Web/Helpers/SortingHelper.cs +++ b/DigitalLearningSolutions.Web/Helpers/SortingHelper.cs @@ -1,48 +1,48 @@ -namespace DigitalLearningSolutions.Web.Helpers -{ - using System.Collections.Generic; - using System.Linq; - using DigitalLearningSolutions.Data.Models.RoleProfiles; - using DigitalLearningSolutions.Web.ViewModels.RoleProfiles; +namespace DigitalLearningSolutions.Web.Helpers +{ + using System.Collections.Generic; + using System.Linq; + using DigitalLearningSolutions.Data.Models.RoleProfiles; + using DigitalLearningSolutions.Web.ViewModels.RoleProfiles; /// - /// This is the older version of the SortingHelper. For future search/sort implementations we should - /// be using the generic version and implementing BaseSearchableItem + /// This is the older version of the SortingHelper. For future search/sort implementations we should + /// be using the generic version and implementing BaseSearchableItem /// on the entity to be sorted - /// - public static class SortingHelper - { - public static IEnumerable SortRoleProfileItems( - IEnumerable roleProfiles, - string sortBy, - string sortDirection - ) - { - return sortBy switch - { - RoleProfileSortByOptionTexts.RoleProfileName => sortDirection == BaseRoleProfilesPageViewModel.DescendingText - ? roleProfiles.OrderByDescending(roleProfile => roleProfile.RoleProfileName) - : roleProfiles.OrderBy(roleProfile => roleProfile.RoleProfileName), - RoleProfileSortByOptionTexts.RoleProfileOwner => sortDirection == BaseRoleProfilesPageViewModel.DescendingText - ? roleProfiles.OrderByDescending(roleProfile => roleProfile.Owner) - : roleProfiles.OrderBy(roleProfile => roleProfile.Owner), - RoleProfileSortByOptionTexts.RoleProfileCreatedDate => sortDirection == BaseRoleProfilesPageViewModel.DescendingText - ? roleProfiles.OrderByDescending(roleProfile => roleProfile.CreatedDate) - : roleProfiles.OrderBy(roleProfile => roleProfile.CreatedDate), - RoleProfileSortByOptionTexts.RoleProfilePublishStatus => sortDirection == BaseRoleProfilesPageViewModel.DescendingText - ? roleProfiles.OrderByDescending(roleProfile => roleProfile.PublishStatusID) - : roleProfiles.OrderBy(roleProfile => roleProfile.PublishStatusID), - RoleProfileSortByOptionTexts.RoleProfileBrand => sortDirection == BaseRoleProfilesPageViewModel.DescendingText - ? roleProfiles.OrderByDescending(roleProfile => roleProfile.Brand) - : roleProfiles.OrderBy(roleProfile => roleProfile.Brand), - RoleProfileSortByOptionTexts.RoleProfileNationalRoleProfile => sortDirection == BaseRoleProfilesPageViewModel.DescendingText - ? roleProfiles.OrderByDescending(roleProfile => roleProfile.NRPRole) - : roleProfiles.OrderBy(roleProfile => roleProfile.NRPRole), - RoleProfileSortByOptionTexts.RoleProfileNationalRoleGroup => sortDirection == BaseRoleProfilesPageViewModel.DescendingText - ? roleProfiles.OrderByDescending(roleProfile => roleProfile.NRPProfessionalGroup) - : roleProfiles.OrderBy(roleProfile => roleProfile.NRPProfessionalGroup), - _ => roleProfiles - }; - } - } -} + /// + public static class SortingHelper + { + public static IEnumerable SortRoleProfileItems( + IEnumerable roleProfiles, + string sortBy, + string sortDirection + ) + { + return sortBy switch + { + RoleProfileSortByOptionTexts.RoleProfileName => sortDirection == BaseRoleProfilesPageViewModel.DescendingText + ? roleProfiles.OrderByDescending(roleProfile => roleProfile.RoleProfileName) + : roleProfiles.OrderBy(roleProfile => roleProfile.RoleProfileName), + RoleProfileSortByOptionTexts.RoleProfileOwner => sortDirection == BaseRoleProfilesPageViewModel.DescendingText + ? roleProfiles.OrderByDescending(roleProfile => roleProfile.Owner) + : roleProfiles.OrderBy(roleProfile => roleProfile.Owner), + RoleProfileSortByOptionTexts.RoleProfileCreatedDate => sortDirection == BaseRoleProfilesPageViewModel.DescendingText + ? roleProfiles.OrderByDescending(roleProfile => roleProfile.CreatedDate) + : roleProfiles.OrderBy(roleProfile => roleProfile.CreatedDate), + RoleProfileSortByOptionTexts.RoleProfilePublishStatus => sortDirection == BaseRoleProfilesPageViewModel.DescendingText + ? roleProfiles.OrderByDescending(roleProfile => roleProfile.PublishStatusID) + : roleProfiles.OrderBy(roleProfile => roleProfile.PublishStatusID), + RoleProfileSortByOptionTexts.RoleProfileBrand => sortDirection == BaseRoleProfilesPageViewModel.DescendingText + ? roleProfiles.OrderByDescending(roleProfile => roleProfile.Brand) + : roleProfiles.OrderBy(roleProfile => roleProfile.Brand), + RoleProfileSortByOptionTexts.RoleProfileNationalRoleProfile => sortDirection == BaseRoleProfilesPageViewModel.DescendingText + ? roleProfiles.OrderByDescending(roleProfile => roleProfile.NRPRole) + : roleProfiles.OrderBy(roleProfile => roleProfile.NRPRole), + RoleProfileSortByOptionTexts.RoleProfileNationalRoleGroup => sortDirection == BaseRoleProfilesPageViewModel.DescendingText + ? roleProfiles.OrderByDescending(roleProfile => roleProfile.NRPProfessionalGroup) + : roleProfiles.OrderBy(roleProfile => roleProfile.NRPProfessionalGroup), + _ => roleProfiles + }; + } + } +} diff --git a/DigitalLearningSolutions.Web/Styles/shared/searchableElements.scss b/DigitalLearningSolutions.Web/Styles/shared/searchableElements.scss index 935ec43a9a..9eeda7adcc 100644 --- a/DigitalLearningSolutions.Web/Styles/shared/searchableElements.scss +++ b/DigitalLearningSolutions.Web/Styles/shared/searchableElements.scss @@ -165,7 +165,7 @@ div#search { .filter-dropdown__submit { background-color: #003d78; float: left; - width: 15%; + width: 18%; color: $color_nhsuk-white; min-width: 100px; diff --git a/DigitalLearningSolutions.Web/ViewComponents/CurrentFiltersViewComponent.cs b/DigitalLearningSolutions.Web/ViewComponents/CurrentFiltersViewComponent.cs new file mode 100644 index 0000000000..e3bd326195 --- /dev/null +++ b/DigitalLearningSolutions.Web/ViewComponents/CurrentFiltersViewComponent.cs @@ -0,0 +1,35 @@ +namespace DigitalLearningSolutions.Web.ViewComponents +{ + using System.Linq; + using DigitalLearningSolutions.Web.Helpers; + using DigitalLearningSolutions.Web.ViewModels.Common; + using Microsoft.AspNetCore.Mvc; + + public class CurrentFiltersViewComponent : ViewComponent + { + public IViewComponentResult Invoke( + string aspController, + string aspAction, + BaseSearchablePageViewModel searchablePageViewModel, + string label, + string? cssClass + ) + { + var currentFilters = + NewlineSeparatedStringListHelper.SplitNewlineSeparatedList(searchablePageViewModel.FilterString); + + var appliedFilters = currentFilters.Select( + currentFilter => new AppliedFilterViewModel( + searchablePageViewModel.Filters + .Single(filter => filter.FilterOptions.Any(filterValue => filterValue.Filter == currentFilter)) + .FilterOptions.Single(filterValue => filterValue.Filter == currentFilter).DisplayText, + searchablePageViewModel.Filters.Single( + filter => filter.FilterOptions.Any(filterValue => filterValue.Filter == currentFilter) + ).Filter.FilterName + ) + ); + + return View(new CurrentFiltersViewModel(appliedFilters)); + } + } +} diff --git a/DigitalLearningSolutions.Web/ViewComponents/SearchBoxViewComponent.cs b/DigitalLearningSolutions.Web/ViewComponents/SearchBoxViewComponent.cs index 8f1d208d49..ca4c02b7cc 100644 --- a/DigitalLearningSolutions.Web/ViewComponents/SearchBoxViewComponent.cs +++ b/DigitalLearningSolutions.Web/ViewComponents/SearchBoxViewComponent.cs @@ -9,10 +9,11 @@ public IViewComponentResult Invoke( string aspController, string aspAction, BaseSearchablePageViewModel searchablePageViewModel, - string label + string label, + string? cssClass ) { - return View(new SearchBoxViewModel(aspController, aspAction, searchablePageViewModel, label)); + return View(new SearchBoxViewModel(aspController, aspAction, searchablePageViewModel, label, cssClass)); } } } diff --git a/DigitalLearningSolutions.Web/ViewModels/Common/AppliedFilterViewModel.cs b/DigitalLearningSolutions.Web/ViewModels/Common/AppliedFilterViewModel.cs new file mode 100644 index 0000000000..fac5c7f029 --- /dev/null +++ b/DigitalLearningSolutions.Web/ViewModels/Common/AppliedFilterViewModel.cs @@ -0,0 +1,15 @@ +namespace DigitalLearningSolutions.Web.ViewModels.Common +{ + public class AppliedFilterViewModel + { + public AppliedFilterViewModel(string displayText, string filterCategory) + { + DisplayText = displayText; + FilterCategory = filterCategory; + } + + public string DisplayText { get; set; } + + public string FilterCategory { get; set; } + } +} diff --git a/DigitalLearningSolutions.Web/ViewModels/Common/BaseSearchablePageViewModel.cs b/DigitalLearningSolutions.Web/ViewModels/Common/BaseSearchablePageViewModel.cs index 007c0737b4..32729b211e 100644 --- a/DigitalLearningSolutions.Web/ViewModels/Common/BaseSearchablePageViewModel.cs +++ b/DigitalLearningSolutions.Web/ViewModels/Common/BaseSearchablePageViewModel.cs @@ -33,7 +33,7 @@ protected BaseSearchablePageViewModel( SearchString = searchString; FilterString = filterString; Page = page; - Filters = new List<(string, IEnumerable<(string, string)>)>(); + Filters = new List<((string, string), IEnumerable<(string, string)>)>(); this.itemsPerPage = itemsPerPage; } @@ -50,7 +50,7 @@ protected BaseSearchablePageViewModel( public abstract IEnumerable<(string, string)> SortOptions { get; } - public IEnumerable<(string, IEnumerable<(string, string)>)> Filters { get; set; } + public IEnumerable<((string FilterProperty, string FilterName) Filter, IEnumerable<(string DisplayText, string Filter)> FilterOptions)> Filters { get; set; } protected IEnumerable GetItemsOnCurrentPage(IList items) { diff --git a/DigitalLearningSolutions.Web/ViewModels/Common/CurrentFiltersViewModel.cs b/DigitalLearningSolutions.Web/ViewModels/Common/CurrentFiltersViewModel.cs new file mode 100644 index 0000000000..fcd3cfcb3b --- /dev/null +++ b/DigitalLearningSolutions.Web/ViewModels/Common/CurrentFiltersViewModel.cs @@ -0,0 +1,14 @@ +namespace DigitalLearningSolutions.Web.ViewModels.Common +{ + using System.Collections.Generic; + + public class CurrentFiltersViewModel + { + public CurrentFiltersViewModel(IEnumerable filters) + { + AppliedFilters = filters; + } + + public IEnumerable AppliedFilters { get; set; } + } +} diff --git a/DigitalLearningSolutions.Web/ViewModels/Common/SearchBoxViewModel.cs b/DigitalLearningSolutions.Web/ViewModels/Common/SearchBoxViewModel.cs index 68838b8532..7872deed35 100644 --- a/DigitalLearningSolutions.Web/ViewModels/Common/SearchBoxViewModel.cs +++ b/DigitalLearningSolutions.Web/ViewModels/Common/SearchBoxViewModel.cs @@ -6,18 +6,21 @@ public class SearchBoxViewModel public readonly string AspController; public readonly BaseSearchablePageViewModel SearchablePageViewModel; public readonly string Label; + public readonly string? Class; public SearchBoxViewModel( string aspController, string aspAction, BaseSearchablePageViewModel searchablePageViewModel, - string label + string label, + string? cssClass ) { AspAction = aspAction; AspController = aspController; SearchablePageViewModel = searchablePageViewModel; Label = label; + Class = cssClass; } } } diff --git a/DigitalLearningSolutions.Web/ViewModels/TrackingSystem/Centre/Administrator/CentreAdministratorsViewModel.cs b/DigitalLearningSolutions.Web/ViewModels/TrackingSystem/Centre/Administrator/CentreAdministratorsViewModel.cs index 2bc86bbc89..61af076b22 100644 --- a/DigitalLearningSolutions.Web/ViewModels/TrackingSystem/Centre/Administrator/CentreAdministratorsViewModel.cs +++ b/DigitalLearningSolutions.Web/ViewModels/TrackingSystem/Centre/Administrator/CentreAdministratorsViewModel.cs @@ -5,8 +5,6 @@ using DigitalLearningSolutions.Data.Models.User; using DigitalLearningSolutions.Web.Helpers; using DigitalLearningSolutions.Web.ViewModels.Common; - using Microsoft.AspNetCore.Authorization.Infrastructure; - using Microsoft.CodeAnalysis.Operations; public class CentreAdministratorsViewModel : BaseSearchablePageViewModel { @@ -43,12 +41,13 @@ int page SetTotalPages(); var paginatedItems = GetItemsOnCurrentPage(filteredItems); Admins = paginatedItems.Select(adminUser => new SearchableAdminViewModel(adminUser)); - IEnumerable<(string, string)> categoryOptions = categories.Select(c => (c, $"{nameof(AdminUser.CategoryName)}|{c}")); + IEnumerable<(string, string)> categoryOptions = + categories.Select(c => (c, $"{nameof(AdminUser.CategoryName)}|{c}")); Filters = new[] { - ("Role", RoleOptions), - (nameof(AdminUser.CategoryName), categoryOptions) + (("Role","Role"), RoleOptions), + ((nameof(AdminUser.CategoryName), "Category"), categoryOptions) }; } diff --git a/DigitalLearningSolutions.Web/Views/Shared/Components/CurrentFilters/Default.cshtml b/DigitalLearningSolutions.Web/Views/Shared/Components/CurrentFilters/Default.cshtml new file mode 100644 index 0000000000..9dfe4464a9 --- /dev/null +++ b/DigitalLearningSolutions.Web/Views/Shared/Components/CurrentFilters/Default.cshtml @@ -0,0 +1,6 @@ +@using DigitalLearningSolutions.Web.ViewModels.Common +@model CurrentFiltersViewModel + +@foreach (var filter in Model.AppliedFilters) { +

@filter.FilterCategory : @filter.DisplayText

+} diff --git a/DigitalLearningSolutions.Web/Views/Shared/Components/SearchBox/Default.cshtml b/DigitalLearningSolutions.Web/Views/Shared/Components/SearchBox/Default.cshtml index 98976fea8b..8285b24d62 100644 --- a/DigitalLearningSolutions.Web/Views/Shared/Components/SearchBox/Default.cshtml +++ b/DigitalLearningSolutions.Web/Views/Shared/Components/SearchBox/Default.cshtml @@ -1,7 +1,7 @@ @using DigitalLearningSolutions.Web.ViewModels.Common @model SearchBoxViewModel - +
- @foreach (var filter in Model.Filters) { -
-
-
- - - - -
-
+
+
+
- } +
- +
From 9081857b1fe3f5f08970a71d1e908a9b8560e334 Mon Sep 17 00:00:00 2001 From: Alex Jackson Date: Tue, 29 Jun 2021 13:42:29 +0100 Subject: [PATCH 04/26] HEEDLS-532 Add applied filter display and clear filters --- .../DataServices/UserDataService.cs | 3 +- .../Models/User/AdminUser.cs | 5 +++ .../CentreAdministratorsViewModelTests.cs | 3 ++ .../Helpers/FilteringHelper.cs | 4 ++ .../Styles/shared/searchableElements.scss | 44 ++++++++++++++++++- .../CurrentFiltersViewComponent.cs | 10 ++--- .../Common/CurrentFiltersViewModel.cs | 5 ++- .../CentreAdministratorsViewModel.cs | 11 ++++- .../Components/CurrentFilters/Default.cshtml | 16 +++++-- .../Shared/SearchablePage/_Pagination.cshtml | 12 ++--- .../Centre/Administrator/Index.cshtml | 17 +++---- 11 files changed, 99 insertions(+), 31 deletions(-) diff --git a/DigitalLearningSolutions.Data/DataServices/UserDataService.cs b/DigitalLearningSolutions.Data/DataServices/UserDataService.cs index 4231e1c207..da1a2c7c25 100644 --- a/DigitalLearningSolutions.Data/DataServices/UserDataService.cs +++ b/DigitalLearningSolutions.Data/DataServices/UserDataService.cs @@ -155,7 +155,8 @@ public List GetAdminUsersByCentreId(int centreId) cc.CategoryName, au.Supervisor AS IsSupervisor, au.Trainer AS IsTrainer, - au.ImportOnly + au.ImportOnly, + au.FailedLoginCount FROM AdminUsers AS au LEFT JOIN CourseCategories AS cc ON cc.CourseCategoryID = au.CategoryID WHERE au.Active = 1 AND au.Approved = 1 AND au.CentreId = @centreId", diff --git a/DigitalLearningSolutions.Data/Models/User/AdminUser.cs b/DigitalLearningSolutions.Data/Models/User/AdminUser.cs index 0179072477..38071ad480 100644 --- a/DigitalLearningSolutions.Data/Models/User/AdminUser.cs +++ b/DigitalLearningSolutions.Data/Models/User/AdminUser.cs @@ -4,6 +4,8 @@ public class AdminUser : User { + private const int FailedLoginThreshold = 5; + public bool IsCentreAdmin { get; set; } public bool IsCentreManager { get; set; } @@ -33,6 +35,9 @@ public class AdminUser : User public bool IsLocalWorkforceManager { get; set; } public bool ImportOnly { get; set; } + public int FailedLoginCount { get; set; } + + public bool IsLocked => FailedLoginCount >= FailedLoginThreshold; public bool IsCmsAdministrator => ImportOnly && IsContentManager; public override UserReference ToUserReference() diff --git a/DigitalLearningSolutions.Web.Tests/ViewModels/TrackingSystem/Centre/Administrator/CentreAdministratorsViewModelTests.cs b/DigitalLearningSolutions.Web.Tests/ViewModels/TrackingSystem/Centre/Administrator/CentreAdministratorsViewModelTests.cs index 9f3f35d288..5de9245f74 100644 --- a/DigitalLearningSolutions.Web.Tests/ViewModels/TrackingSystem/Centre/Administrator/CentreAdministratorsViewModelTests.cs +++ b/DigitalLearningSolutions.Web.Tests/ViewModels/TrackingSystem/Centre/Administrator/CentreAdministratorsViewModelTests.cs @@ -1,5 +1,6 @@ namespace DigitalLearningSolutions.Web.Tests.ViewModels.TrackingSystem.Centre.Administrator { + using System.Collections.Generic; using System.Linq; using DigitalLearningSolutions.Data.Models.User; using DigitalLearningSolutions.Data.Tests.TestHelpers; @@ -34,6 +35,7 @@ public void Centre_administrators_should_default_to_returning_the_first_ten_admi var model = new CentreAdministratorsViewModel( 1, adminUsers, + new List(), null, "SearchableName", "Ascending", @@ -51,6 +53,7 @@ public void Centre_administrators_should_correctly_return_the_second_page_of_adm var model = new CentreAdministratorsViewModel( 1, adminUsers, + new List(), null, "SearchableName", "Ascending", diff --git a/DigitalLearningSolutions.Web/Helpers/FilteringHelper.cs b/DigitalLearningSolutions.Web/Helpers/FilteringHelper.cs index 78b2389ff8..f4fdce74ac 100644 --- a/DigitalLearningSolutions.Web/Helpers/FilteringHelper.cs +++ b/DigitalLearningSolutions.Web/Helpers/FilteringHelper.cs @@ -45,5 +45,9 @@ public static readonly (string DisplayText, string Filter) CmsAdministrator = ("CMS administrator", nameof(AdminUser.IsCmsAdministrator) + "|true"); public static readonly (string DisplayText, string Filter) CmsManager = ("CMS manager", nameof(AdminUser.IsContentManager) + "|true"); + public static readonly (string DisplayText, string Filter) IsLocked = + ("Locked", nameof(AdminUser.IsLocked) + "|true"); + public static readonly (string DisplayText, string Filter) IsNotLocked = + ("Not locked", nameof(AdminUser.IsLocked) + "|false"); } } diff --git a/DigitalLearningSolutions.Web/Styles/shared/searchableElements.scss b/DigitalLearningSolutions.Web/Styles/shared/searchableElements.scss index 9eeda7adcc..3b37bf8e18 100644 --- a/DigitalLearningSolutions.Web/Styles/shared/searchableElements.scss +++ b/DigitalLearningSolutions.Web/Styles/shared/searchableElements.scss @@ -282,7 +282,7 @@ div#search { } } -.pagination-item { +.pagination-button-container { width: 38%; } @@ -397,3 +397,45 @@ button.nhsuk-pagination__link { border: 1px solid #768692; margin-bottom: 15px; } + +.applied-filter-container { + height: auto; + width: 80%; + float: left; + + @include mq($from: tablet) { + width: 70%; + } + + @include mq($from: desktop) { + width: 80%; + } +} + +.clear-filter-button-container { + width: 18%; + float: left; +} + +.clear-filter__submit { + background-color: $color_nhsuk-red; + border-radius: 4px; + float: left; + width: 18%; + color: $color_nhsuk-white; + min-width: 100px; + + .nhsuk-icon__search { + fill: #fff; + } + + &:hover { + background-color: #4c6272; + } +} + +.filter-tag { + padding-top: 11px; + padding-bottom: 11px; + margin-bottom:4px; +} diff --git a/DigitalLearningSolutions.Web/ViewComponents/CurrentFiltersViewComponent.cs b/DigitalLearningSolutions.Web/ViewComponents/CurrentFiltersViewComponent.cs index e3bd326195..f693c3d1dd 100644 --- a/DigitalLearningSolutions.Web/ViewComponents/CurrentFiltersViewComponent.cs +++ b/DigitalLearningSolutions.Web/ViewComponents/CurrentFiltersViewComponent.cs @@ -8,11 +8,7 @@ public class CurrentFiltersViewComponent : ViewComponent { public IViewComponentResult Invoke( - string aspController, - string aspAction, - BaseSearchablePageViewModel searchablePageViewModel, - string label, - string? cssClass + BaseSearchablePageViewModel searchablePageViewModel ) { var currentFilters = @@ -29,7 +25,9 @@ public IViewComponentResult Invoke( ) ); - return View(new CurrentFiltersViewModel(appliedFilters)); + var model = new CurrentFiltersViewModel(appliedFilters, searchablePageViewModel.SearchString); + + return View(model); } } } diff --git a/DigitalLearningSolutions.Web/ViewModels/Common/CurrentFiltersViewModel.cs b/DigitalLearningSolutions.Web/ViewModels/Common/CurrentFiltersViewModel.cs index fcd3cfcb3b..a03ce095bd 100644 --- a/DigitalLearningSolutions.Web/ViewModels/Common/CurrentFiltersViewModel.cs +++ b/DigitalLearningSolutions.Web/ViewModels/Common/CurrentFiltersViewModel.cs @@ -4,11 +4,14 @@ public class CurrentFiltersViewModel { - public CurrentFiltersViewModel(IEnumerable filters) + public CurrentFiltersViewModel(IEnumerable filters, string? searchString) { AppliedFilters = filters; + SearchString = searchString; } public IEnumerable AppliedFilters { get; set; } + + public string? SearchString { get; set; } } } diff --git a/DigitalLearningSolutions.Web/ViewModels/TrackingSystem/Centre/Administrator/CentreAdministratorsViewModel.cs b/DigitalLearningSolutions.Web/ViewModels/TrackingSystem/Centre/Administrator/CentreAdministratorsViewModel.cs index 61af076b22..b9f1400c20 100644 --- a/DigitalLearningSolutions.Web/ViewModels/TrackingSystem/Centre/Administrator/CentreAdministratorsViewModel.cs +++ b/DigitalLearningSolutions.Web/ViewModels/TrackingSystem/Centre/Administrator/CentreAdministratorsViewModel.cs @@ -18,6 +18,12 @@ public class CentreAdministratorsViewModel : BaseSearchablePageViewModel AdminFilterOptions.CmsManager }; + private static readonly IEnumerable<(string, string)> AccountStatusOptions = new[] + { + AdminFilterOptions.IsLocked, + AdminFilterOptions.IsNotLocked + }; + public CentreAdministratorsViewModel( int centreId, IEnumerable adminUsers, @@ -46,8 +52,9 @@ int page Filters = new[] { - (("Role","Role"), RoleOptions), - ((nameof(AdminUser.CategoryName), "Category"), categoryOptions) + (("Role", "Role"), RoleOptions), + ((nameof(AdminUser.CategoryName), "Category"), categoryOptions), + (("AccountStatus", "Account Status"), AccountStatusOptions) }; } diff --git a/DigitalLearningSolutions.Web/Views/Shared/Components/CurrentFilters/Default.cshtml b/DigitalLearningSolutions.Web/Views/Shared/Components/CurrentFilters/Default.cshtml index 9dfe4464a9..ab6de9ebec 100644 --- a/DigitalLearningSolutions.Web/Views/Shared/Components/CurrentFilters/Default.cshtml +++ b/DigitalLearningSolutions.Web/Views/Shared/Components/CurrentFilters/Default.cshtml @@ -1,6 +1,16 @@ @using DigitalLearningSolutions.Web.ViewModels.Common @model CurrentFiltersViewModel -@foreach (var filter in Model.AppliedFilters) { -

@filter.FilterCategory : @filter.DisplayText

-} +
+ + + +
+ @foreach (var filter in Model.AppliedFilters) { +
@filter.FilterCategory : @filter.DisplayText
+ } +
+ + + +
diff --git a/DigitalLearningSolutions.Web/Views/Shared/SearchablePage/_Pagination.cshtml b/DigitalLearningSolutions.Web/Views/Shared/SearchablePage/_Pagination.cshtml index c9929c128b..aad63818ea 100644 --- a/DigitalLearningSolutions.Web/Views/Shared/SearchablePage/_Pagination.cshtml +++ b/DigitalLearningSolutions.Web/Views/Shared/SearchablePage/_Pagination.cshtml @@ -2,16 +2,16 @@ @model BaseSearchablePageViewModel
- +
diff --git a/DigitalLearningSolutions.Web/Views/TrackingSystem/Centre/Administrator/Index.cshtml b/DigitalLearningSolutions.Web/Views/TrackingSystem/Centre/Administrator/Index.cshtml index efc4518054..0d74fec882 100644 --- a/DigitalLearningSolutions.Web/Views/TrackingSystem/Centre/Administrator/Index.cshtml +++ b/DigitalLearningSolutions.Web/Views/TrackingSystem/Centre/Administrator/Index.cshtml @@ -45,14 +45,14 @@
-
- @foreach (var (filterProperty, filterValues) in Model.Filters) { +
+ @foreach (var ((filterProperty, filterName), filterValues) in Model.Filters) {
- + @foreach (var (displayText, filterValue) in filterValues) { } @@ -67,12 +67,8 @@
-
- +
+
@@ -101,7 +97,6 @@ }
- From 6d60283b9062b53135512fa992553c80b7a4c52a Mon Sep 17 00:00:00 2001 From: Alex Jackson Date: Tue, 6 Jul 2021 11:50:37 +0100 Subject: [PATCH 18/26] HEEDLS-532 Check whether user is a CMS manager properly --- DigitalLearningSolutions.Data/Models/User/AdminUser.cs | 1 + .../Helpers/FilterableTagHelperTests.cs | 1 - .../Common/NumberOfAdministratorViewModelTests.cs | 8 ++++---- .../Centre/ContractDetailsViewModelTests.cs | 4 ++-- .../Helpers/FilterableTagHelper.cs | 2 +- DigitalLearningSolutions.Web/Helpers/FilteringHelper.cs | 2 +- .../ViewModels/Common/NumberOfAdministratorsViewModel.cs | 4 ++-- .../Centre/ContractDetails/ContractDetailsViewModel.cs | 4 ++-- 8 files changed, 13 insertions(+), 13 deletions(-) diff --git a/DigitalLearningSolutions.Data/Models/User/AdminUser.cs b/DigitalLearningSolutions.Data/Models/User/AdminUser.cs index 38071ad480..2fdae412d9 100644 --- a/DigitalLearningSolutions.Data/Models/User/AdminUser.cs +++ b/DigitalLearningSolutions.Data/Models/User/AdminUser.cs @@ -39,6 +39,7 @@ public class AdminUser : User public bool IsLocked => FailedLoginCount >= FailedLoginThreshold; public bool IsCmsAdministrator => ImportOnly && IsContentManager; + public bool IsCmsManager => IsContentManager && !ImportOnly; public override UserReference ToUserReference() { diff --git a/DigitalLearningSolutions.Web.Tests/Helpers/FilterableTagHelperTests.cs b/DigitalLearningSolutions.Web.Tests/Helpers/FilterableTagHelperTests.cs index eabfe3eca1..5cddfe59ef 100644 --- a/DigitalLearningSolutions.Web.Tests/Helpers/FilterableTagHelperTests.cs +++ b/DigitalLearningSolutions.Web.Tests/Helpers/FilterableTagHelperTests.cs @@ -24,7 +24,6 @@ public void GetCurrentTagsForAdminUser_should_return_correct_tags() new SearchableTagViewModel(AdminFilterOptions.Supervisor), new SearchableTagViewModel(AdminFilterOptions.Trainer), new SearchableTagViewModel(AdminFilterOptions.CmsAdministrator), - new SearchableTagViewModel(AdminFilterOptions.CmsManager), new SearchableTagViewModel(AdminFilterOptions.ContentCreatorLicense), }; diff --git a/DigitalLearningSolutions.Web.Tests/ViewModels/Common/NumberOfAdministratorViewModelTests.cs b/DigitalLearningSolutions.Web.Tests/ViewModels/Common/NumberOfAdministratorViewModelTests.cs index 12bc98c4f3..a53b3bd70a 100644 --- a/DigitalLearningSolutions.Web.Tests/ViewModels/Common/NumberOfAdministratorViewModelTests.cs +++ b/DigitalLearningSolutions.Web.Tests/ViewModels/Common/NumberOfAdministratorViewModelTests.cs @@ -27,8 +27,8 @@ public void AdminUsers_and_Centre_populate_expected_values() // Then viewModel.Admins.Should().Be("7"); viewModel.Supervisors.Should().Be("6"); - viewModel.CmsAdministrators.Should().Be("4 / 12"); - viewModel.CmsManagers.Should().Be("1 / 13"); + viewModel.CmsAdministrators.Should().Be("3 / 12"); + viewModel.CmsManagers.Should().Be("2 / 13"); viewModel.CcLicences.Should().Be("2 / 14"); viewModel.Trainers.Should().Be("1 / 15"); } @@ -49,8 +49,8 @@ public void No_limit_should_be_displayed_when_centre_has_no_limit_on_spots_avail var viewModel = new NumberOfAdministratorsViewModel(centre, adminUsersAtCentre); // Then - viewModel.CmsAdministrators.Should().Be("4"); - viewModel.CmsManagers.Should().Be("1"); + viewModel.CmsAdministrators.Should().Be("3"); + viewModel.CmsManagers.Should().Be("2"); viewModel.CcLicences.Should().Be("2"); viewModel.Trainers.Should().Be("1"); } diff --git a/DigitalLearningSolutions.Web.Tests/ViewModels/TrackingSystem/Centre/ContractDetailsViewModelTests.cs b/DigitalLearningSolutions.Web.Tests/ViewModels/TrackingSystem/Centre/ContractDetailsViewModelTests.cs index f1f5efd5a0..789bc4af27 100644 --- a/DigitalLearningSolutions.Web.Tests/ViewModels/TrackingSystem/Centre/ContractDetailsViewModelTests.cs +++ b/DigitalLearningSolutions.Web.Tests/ViewModels/TrackingSystem/Centre/ContractDetailsViewModelTests.cs @@ -30,7 +30,7 @@ public void AdminUsers_and_Centre_populate_expected_values() // Then viewModel.Administrators.Should().Be("7"); viewModel.Supervisors.Should().Be("6"); - viewModel.CmsAdministrators.Should().Be("4 / 3"); + viewModel.CmsAdministrators.Should().Be("3 / 3"); viewModel.CmsAdministratorsColour.Should().Be("red"); viewModel.CmsManagers.Should().Be("1 / 13"); viewModel.CmsManagersColour.Should().Be("green"); @@ -65,7 +65,7 @@ public void AdminUsers_and_Centre_populate_expected_values_with_no_limit() // Then viewModel.Administrators.Should().Be("7"); viewModel.Supervisors.Should().Be("6"); - viewModel.CmsAdministrators.Should().Be("4"); + viewModel.CmsAdministrators.Should().Be("3"); viewModel.CmsAdministratorsColour.Should().Be("blue"); viewModel.CmsManagers.Should().Be("1"); viewModel.CmsManagersColour.Should().Be("blue"); diff --git a/DigitalLearningSolutions.Web/Helpers/FilterableTagHelper.cs b/DigitalLearningSolutions.Web/Helpers/FilterableTagHelper.cs index dfd9797b24..23d8b9ed81 100644 --- a/DigitalLearningSolutions.Web/Helpers/FilterableTagHelper.cs +++ b/DigitalLearningSolutions.Web/Helpers/FilterableTagHelper.cs @@ -44,7 +44,7 @@ public static IEnumerable GetCurrentTagsForAdminUser(Adm tags.Add(new SearchableTagViewModel(AdminFilterOptions.CmsAdministrator)); } - if (adminUser.IsContentManager) + if (adminUser.IsCmsManager) { tags.Add(new SearchableTagViewModel(AdminFilterOptions.CmsManager)); } diff --git a/DigitalLearningSolutions.Web/Helpers/FilteringHelper.cs b/DigitalLearningSolutions.Web/Helpers/FilteringHelper.cs index 14ee17f4a7..589e311912 100644 --- a/DigitalLearningSolutions.Web/Helpers/FilteringHelper.cs +++ b/DigitalLearningSolutions.Web/Helpers/FilteringHelper.cs @@ -71,7 +71,7 @@ public static class AdminFilterOptions public static readonly FilterOptionViewModel CmsManager = new FilterOptionViewModel( "CMS manager", - nameof(AdminUser.IsContentManager) + FilteringHelper.Separator + "true", + nameof(AdminUser.IsCmsManager) + FilteringHelper.Separator + "true", FilterStatus.Default ); diff --git a/DigitalLearningSolutions.Web/ViewModels/Common/NumberOfAdministratorsViewModel.cs b/DigitalLearningSolutions.Web/ViewModels/Common/NumberOfAdministratorsViewModel.cs index c6ffdab939..893de324ce 100644 --- a/DigitalLearningSolutions.Web/ViewModels/Common/NumberOfAdministratorsViewModel.cs +++ b/DigitalLearningSolutions.Web/ViewModels/Common/NumberOfAdministratorsViewModel.cs @@ -14,8 +14,8 @@ public NumberOfAdministratorsViewModel(Centre centreDetails, List adm Supervisors = adminUsers.Count(a => a.IsSupervisor).ToString(); var trainers = adminUsers.Count(a => a.IsTrainer); - var cmsAdministrators = adminUsers.Count(a => a.ImportOnly); - var cmsManagers = adminUsers.Count(a => a.IsContentManager) - cmsAdministrators; + var cmsAdministrators = adminUsers.Count(a => a.IsCmsAdministrator); + var cmsManagers = adminUsers.Count(a => a.IsCmsManager); var ccLicences = adminUsers.Count(a => a.IsContentCreator); Trainers = DisplayStringHelper.FormatNumberWithLimit(trainers, centreDetails.TrainerSpots); diff --git a/DigitalLearningSolutions.Web/ViewModels/TrackingSystem/Centre/ContractDetails/ContractDetailsViewModel.cs b/DigitalLearningSolutions.Web/ViewModels/TrackingSystem/Centre/ContractDetails/ContractDetailsViewModel.cs index 5ab8121619..f7272294e2 100644 --- a/DigitalLearningSolutions.Web/ViewModels/TrackingSystem/Centre/ContractDetails/ContractDetailsViewModel.cs +++ b/DigitalLearningSolutions.Web/ViewModels/TrackingSystem/Centre/ContractDetails/ContractDetailsViewModel.cs @@ -14,8 +14,8 @@ public ContractDetailsViewModel(List adminUsers, Centre centreDetails Supervisors = adminUsers.Count(a => a.IsSupervisor).ToString(); var trainers = adminUsers.Count(a => a.IsTrainer); - var cmsAdministrators = adminUsers.Count(a => a.ImportOnly); - var cmsManagers = adminUsers.Count(a => a.IsContentManager) - cmsAdministrators; + var cmsAdministrators = adminUsers.Count(a => a.IsCmsAdministrator); + var cmsManagers = adminUsers.Count(a => a.IsCmsManager); var contentCreators = adminUsers.Count(a => a.IsContentCreator); Trainers = DisplayStringHelper.FormatNumberWithLimit(trainers, centreDetails.TrainerSpots); From 510a9709a88ab9b640f585b13872fe669eb4a9a4 Mon Sep 17 00:00:00 2001 From: Alex Jackson Date: Tue, 6 Jul 2021 11:52:38 +0100 Subject: [PATCH 19/26] HEEDLS-532 Add an extra Other filter status for the default blue tag --- DigitalLearningSolutions.Web/Models/Enums/FilterStatus.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/DigitalLearningSolutions.Web/Models/Enums/FilterStatus.cs b/DigitalLearningSolutions.Web/Models/Enums/FilterStatus.cs index 8788315982..69dc33bd82 100644 --- a/DigitalLearningSolutions.Web/Models/Enums/FilterStatus.cs +++ b/DigitalLearningSolutions.Web/Models/Enums/FilterStatus.cs @@ -4,6 +4,7 @@ public enum FilterStatus { Default, Warning, - Success + Success, + Other //This will result in the default blue nhsuk-tag } } From 284acc004817f8afe7eaf1d7bd81aba21a924ba2 Mon Sep 17 00:00:00 2001 From: Alex Jackson Date: Tue, 6 Jul 2021 12:00:56 +0100 Subject: [PATCH 20/26] HEEDLS-532 Fix unit test --- .../TrackingSystem/Centre/ContractDetailsViewModelTests.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/DigitalLearningSolutions.Web.Tests/ViewModels/TrackingSystem/Centre/ContractDetailsViewModelTests.cs b/DigitalLearningSolutions.Web.Tests/ViewModels/TrackingSystem/Centre/ContractDetailsViewModelTests.cs index 789bc4af27..57219d1ac8 100644 --- a/DigitalLearningSolutions.Web.Tests/ViewModels/TrackingSystem/Centre/ContractDetailsViewModelTests.cs +++ b/DigitalLearningSolutions.Web.Tests/ViewModels/TrackingSystem/Centre/ContractDetailsViewModelTests.cs @@ -32,7 +32,7 @@ public void AdminUsers_and_Centre_populate_expected_values() viewModel.Supervisors.Should().Be("6"); viewModel.CmsAdministrators.Should().Be("3 / 3"); viewModel.CmsAdministratorsColour.Should().Be("red"); - viewModel.CmsManagers.Should().Be("1 / 13"); + viewModel.CmsManagers.Should().Be("2 / 13"); viewModel.CmsManagersColour.Should().Be("green"); viewModel.ContentCreators.Should().Be("2 / 14"); viewModel.ContentCreatorsColour.Should().Be("green"); @@ -67,7 +67,7 @@ public void AdminUsers_and_Centre_populate_expected_values_with_no_limit() viewModel.Supervisors.Should().Be("6"); viewModel.CmsAdministrators.Should().Be("3"); viewModel.CmsAdministratorsColour.Should().Be("blue"); - viewModel.CmsManagers.Should().Be("1"); + viewModel.CmsManagers.Should().Be("2"); viewModel.CmsManagersColour.Should().Be("blue"); viewModel.ContentCreators.Should().Be("2"); viewModel.ContentCreatorsColour.Should().Be("blue"); From 501946f04b106bcf48dda62592cda5101f0d9e3a Mon Sep 17 00:00:00 2001 From: Alex Jackson Date: Tue, 6 Jul 2021 15:27:24 +0100 Subject: [PATCH 21/26] HEEDLS-532 Move SearchablePage view models into folder --- .../Helpers/FilterableTagHelperTests.cs | 5 ++--- .../CurrentFiltersViewComponentTests.cs | 2 +- .../CentreAdministratorsViewModelTests.cs | 2 +- .../Controllers/FrameworksController/Frameworks.cs | 2 +- .../LearningPortalController/Available.cs | 2 +- .../LearningPortalController/Completed.cs | 2 +- .../LearningPortalController/Current.cs | 2 +- .../Administrator/AdministratorController.cs | 3 +-- .../Helpers/FilterableTagHelper.cs | 2 +- .../Helpers/FilteringHelper.cs | 2 +- .../Helpers/GenericSortingHelper.cs | 2 +- .../ViewComponents/CurrentFiltersViewComponent.cs | 2 +- .../ViewComponents/FilterableTagsViewComponent.cs | 14 -------------- .../ViewComponents/SearchBoxViewComponent.cs | 1 + .../ViewModels/Common/SearchBoxViewModel.cs | 2 ++ .../{ => SearchablePage}/AppliedFilterViewModel.cs | 2 +- .../BaseFilterableViewModel.cs | 2 +- .../BaseSearchablePageViewModel.cs | 2 +- .../CurrentFiltersViewModel.cs | 2 +- .../{ => SearchablePage}/FilterOptionViewModel.cs | 2 +- .../Common/{ => SearchablePage}/FilterViewModel.cs | 2 +- .../{ => SearchablePage}/SearchableTagViewModel.cs | 2 +- .../Frameworks/AllFrameworksViewModel.cs | 2 +- .../ViewModels/Frameworks/MyFrameworksViewModel.cs | 2 +- .../Available/AvailablePageViewModel.cs | 2 +- .../Completed/CompletedPageViewModel.cs | 2 +- .../LearningPortal/Current/CurrentPageViewModel.cs | 2 +- .../Administrator/CentreAdministratorsViewModel.cs | 2 +- .../Administrator/SearchableAdminViewModel.cs | 2 +- .../Frameworks/Shared/_FrameworkPageSearch.cshtml | 2 +- .../Frameworks/Shared/_FrameworkPageSort.cshtml | 2 +- .../LearningPortal/Shared/_CoursePageSearch.cshtml | 2 +- .../LearningPortal/Shared/_CoursePageSort.cshtml | 2 +- .../Components/CurrentFilters/Default.cshtml | 2 +- .../_FilterableTags.cshtml} | 2 +- .../Views/Shared/SearchablePage/_Pagination.cshtml | 2 +- .../SearchablePage/_SearchResultsCount.cshtml | 2 +- .../Administrator/_SearchableAdminCard.cshtml | 2 +- 38 files changed, 39 insertions(+), 52 deletions(-) delete mode 100644 DigitalLearningSolutions.Web/ViewComponents/FilterableTagsViewComponent.cs rename DigitalLearningSolutions.Web/ViewModels/Common/{ => SearchablePage}/AppliedFilterViewModel.cs (79%) rename DigitalLearningSolutions.Web/ViewModels/Common/{ => SearchablePage}/BaseFilterableViewModel.cs (76%) rename DigitalLearningSolutions.Web/ViewModels/Common/{ => SearchablePage}/BaseSearchablePageViewModel.cs (93%) rename DigitalLearningSolutions.Web/ViewModels/Common/{ => SearchablePage}/CurrentFiltersViewModel.cs (82%) rename DigitalLearningSolutions.Web/ViewModels/Common/{ => SearchablePage}/FilterOptionViewModel.cs (83%) rename DigitalLearningSolutions.Web/ViewModels/Common/{ => SearchablePage}/FilterViewModel.cs (85%) rename DigitalLearningSolutions.Web/ViewModels/Common/{ => SearchablePage}/SearchableTagViewModel.cs (88%) rename DigitalLearningSolutions.Web/Views/Shared/{Components/FilterableTags/Default.cshtml => SearchablePage/_FilterableTags.cshtml} (78%) diff --git a/DigitalLearningSolutions.Web.Tests/Helpers/FilterableTagHelperTests.cs b/DigitalLearningSolutions.Web.Tests/Helpers/FilterableTagHelperTests.cs index 5cddfe59ef..9a385a43ae 100644 --- a/DigitalLearningSolutions.Web.Tests/Helpers/FilterableTagHelperTests.cs +++ b/DigitalLearningSolutions.Web.Tests/Helpers/FilterableTagHelperTests.cs @@ -2,10 +2,9 @@ { using System.Collections.Generic; using System.Linq; - using DigitalLearningSolutions.Data.Models.User; using DigitalLearningSolutions.Data.Tests.TestHelpers; using DigitalLearningSolutions.Web.Helpers; - using DigitalLearningSolutions.Web.ViewModels.Common; + using DigitalLearningSolutions.Web.ViewModels.Common.SearchablePage; using FluentAssertions; using FluentAssertions.Execution; using NUnit.Framework; @@ -24,7 +23,7 @@ public void GetCurrentTagsForAdminUser_should_return_correct_tags() new SearchableTagViewModel(AdminFilterOptions.Supervisor), new SearchableTagViewModel(AdminFilterOptions.Trainer), new SearchableTagViewModel(AdminFilterOptions.CmsAdministrator), - new SearchableTagViewModel(AdminFilterOptions.ContentCreatorLicense), + new SearchableTagViewModel(AdminFilterOptions.ContentCreatorLicense) }; // When diff --git a/DigitalLearningSolutions.Web.Tests/ViewComponents/CurrentFiltersViewComponentTests.cs b/DigitalLearningSolutions.Web.Tests/ViewComponents/CurrentFiltersViewComponentTests.cs index 44c50c02d1..4f2557e1b6 100644 --- a/DigitalLearningSolutions.Web.Tests/ViewComponents/CurrentFiltersViewComponentTests.cs +++ b/DigitalLearningSolutions.Web.Tests/ViewComponents/CurrentFiltersViewComponentTests.cs @@ -4,7 +4,7 @@ using DigitalLearningSolutions.Data.Models.User; using DigitalLearningSolutions.Web.Helpers; using DigitalLearningSolutions.Web.ViewComponents; - using DigitalLearningSolutions.Web.ViewModels.Common; + using DigitalLearningSolutions.Web.ViewModels.Common.SearchablePage; using DigitalLearningSolutions.Web.ViewModels.TrackingSystem.Centre.Administrator; using FluentAssertions; using Microsoft.AspNetCore.Http; diff --git a/DigitalLearningSolutions.Web.Tests/ViewModels/TrackingSystem/Centre/Administrator/CentreAdministratorsViewModelTests.cs b/DigitalLearningSolutions.Web.Tests/ViewModels/TrackingSystem/Centre/Administrator/CentreAdministratorsViewModelTests.cs index bf6155c48e..4ae2de7b01 100644 --- a/DigitalLearningSolutions.Web.Tests/ViewModels/TrackingSystem/Centre/Administrator/CentreAdministratorsViewModelTests.cs +++ b/DigitalLearningSolutions.Web.Tests/ViewModels/TrackingSystem/Centre/Administrator/CentreAdministratorsViewModelTests.cs @@ -5,7 +5,7 @@ using DigitalLearningSolutions.Data.Models.User; using DigitalLearningSolutions.Data.Tests.TestHelpers; using DigitalLearningSolutions.Web.Helpers; - using DigitalLearningSolutions.Web.ViewModels.Common; + using DigitalLearningSolutions.Web.ViewModels.Common.SearchablePage; using DigitalLearningSolutions.Web.ViewModels.TrackingSystem.Centre.Administrator; using FluentAssertions; using NUnit.Framework; diff --git a/DigitalLearningSolutions.Web/Controllers/FrameworksController/Frameworks.cs b/DigitalLearningSolutions.Web/Controllers/FrameworksController/Frameworks.cs index 5ce4144228..d125108262 100644 --- a/DigitalLearningSolutions.Web/Controllers/FrameworksController/Frameworks.cs +++ b/DigitalLearningSolutions.Web/Controllers/FrameworksController/Frameworks.cs @@ -14,7 +14,7 @@ namespace DigitalLearningSolutions.Web.Controllers.FrameworksController { - using DigitalLearningSolutions.Web.ViewModels.Common; + using DigitalLearningSolutions.Web.ViewModels.Common.SearchablePage; public partial class FrameworksController { diff --git a/DigitalLearningSolutions.Web/Controllers/LearningPortalController/Available.cs b/DigitalLearningSolutions.Web/Controllers/LearningPortalController/Available.cs index 5310d9ce39..19a536ef7d 100644 --- a/DigitalLearningSolutions.Web/Controllers/LearningPortalController/Available.cs +++ b/DigitalLearningSolutions.Web/Controllers/LearningPortalController/Available.cs @@ -1,7 +1,7 @@ namespace DigitalLearningSolutions.Web.Controllers.LearningPortalController { using DigitalLearningSolutions.Web.Helpers; - using DigitalLearningSolutions.Web.ViewModels.Common; + using DigitalLearningSolutions.Web.ViewModels.Common.SearchablePage; using DigitalLearningSolutions.Web.ViewModels.LearningPortal.Available; using Microsoft.AspNetCore.Mvc; diff --git a/DigitalLearningSolutions.Web/Controllers/LearningPortalController/Completed.cs b/DigitalLearningSolutions.Web/Controllers/LearningPortalController/Completed.cs index 4e62b52da9..3f17a7d88a 100644 --- a/DigitalLearningSolutions.Web/Controllers/LearningPortalController/Completed.cs +++ b/DigitalLearningSolutions.Web/Controllers/LearningPortalController/Completed.cs @@ -1,7 +1,7 @@ namespace DigitalLearningSolutions.Web.Controllers.LearningPortalController { using DigitalLearningSolutions.Web.Helpers; - using DigitalLearningSolutions.Web.ViewModels.Common; + using DigitalLearningSolutions.Web.ViewModels.Common.SearchablePage; using DigitalLearningSolutions.Web.ViewModels.LearningPortal.Completed; using Microsoft.AspNetCore.Mvc; diff --git a/DigitalLearningSolutions.Web/Controllers/LearningPortalController/Current.cs b/DigitalLearningSolutions.Web/Controllers/LearningPortalController/Current.cs index 53e5f2c71b..a1dfcecfe9 100644 --- a/DigitalLearningSolutions.Web/Controllers/LearningPortalController/Current.cs +++ b/DigitalLearningSolutions.Web/Controllers/LearningPortalController/Current.cs @@ -4,7 +4,7 @@ using System.Linq; using DigitalLearningSolutions.Web.ControllerHelpers; using DigitalLearningSolutions.Web.Helpers; - using DigitalLearningSolutions.Web.ViewModels.Common; + using DigitalLearningSolutions.Web.ViewModels.Common.SearchablePage; using DigitalLearningSolutions.Web.ViewModels.LearningPortal.Current; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging; diff --git a/DigitalLearningSolutions.Web/Controllers/TrackingSystem/Centre/Administrator/AdministratorController.cs b/DigitalLearningSolutions.Web/Controllers/TrackingSystem/Centre/Administrator/AdministratorController.cs index da9b90c0cf..1b5684dc93 100644 --- a/DigitalLearningSolutions.Web/Controllers/TrackingSystem/Centre/Administrator/AdministratorController.cs +++ b/DigitalLearningSolutions.Web/Controllers/TrackingSystem/Centre/Administrator/AdministratorController.cs @@ -1,11 +1,10 @@ namespace DigitalLearningSolutions.Web.Controllers.TrackingSystem.Centre.Administrator { - using System.Collections.Generic; using System.Linq; using DigitalLearningSolutions.Data.DataServices; using DigitalLearningSolutions.Data.Services; using DigitalLearningSolutions.Web.Helpers; - using DigitalLearningSolutions.Web.ViewModels.Common; + using DigitalLearningSolutions.Web.ViewModels.Common.SearchablePage; using DigitalLearningSolutions.Web.ViewModels.TrackingSystem.Centre.Administrator; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; diff --git a/DigitalLearningSolutions.Web/Helpers/FilterableTagHelper.cs b/DigitalLearningSolutions.Web/Helpers/FilterableTagHelper.cs index 23d8b9ed81..1e480c5943 100644 --- a/DigitalLearningSolutions.Web/Helpers/FilterableTagHelper.cs +++ b/DigitalLearningSolutions.Web/Helpers/FilterableTagHelper.cs @@ -2,7 +2,7 @@ { using System.Collections.Generic; using DigitalLearningSolutions.Data.Models.User; - using DigitalLearningSolutions.Web.ViewModels.Common; + using DigitalLearningSolutions.Web.ViewModels.Common.SearchablePage; public static class FilterableTagHelper { diff --git a/DigitalLearningSolutions.Web/Helpers/FilteringHelper.cs b/DigitalLearningSolutions.Web/Helpers/FilteringHelper.cs index 589e311912..82feb95c03 100644 --- a/DigitalLearningSolutions.Web/Helpers/FilteringHelper.cs +++ b/DigitalLearningSolutions.Web/Helpers/FilteringHelper.cs @@ -7,7 +7,7 @@ using DigitalLearningSolutions.Data.Models.User; using DigitalLearningSolutions.Web.Extensions; using DigitalLearningSolutions.Web.Models.Enums; - using DigitalLearningSolutions.Web.ViewModels.Common; + using DigitalLearningSolutions.Web.ViewModels.Common.SearchablePage; public static class FilteringHelper { diff --git a/DigitalLearningSolutions.Web/Helpers/GenericSortingHelper.cs b/DigitalLearningSolutions.Web/Helpers/GenericSortingHelper.cs index f5273c7f35..7f357f31f0 100644 --- a/DigitalLearningSolutions.Web/Helpers/GenericSortingHelper.cs +++ b/DigitalLearningSolutions.Web/Helpers/GenericSortingHelper.cs @@ -6,7 +6,7 @@ using DigitalLearningSolutions.Data.Models.Courses; using DigitalLearningSolutions.Data.Models.Frameworks; using DigitalLearningSolutions.Web.Extensions; - using DigitalLearningSolutions.Web.ViewModels.Common; + using DigitalLearningSolutions.Web.ViewModels.Common.SearchablePage; public static class GenericSortingHelper { diff --git a/DigitalLearningSolutions.Web/ViewComponents/CurrentFiltersViewComponent.cs b/DigitalLearningSolutions.Web/ViewComponents/CurrentFiltersViewComponent.cs index d0616897d6..9cfa2b0bd4 100644 --- a/DigitalLearningSolutions.Web/ViewComponents/CurrentFiltersViewComponent.cs +++ b/DigitalLearningSolutions.Web/ViewComponents/CurrentFiltersViewComponent.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; using System.Linq; using DigitalLearningSolutions.Web.Helpers; - using DigitalLearningSolutions.Web.ViewModels.Common; + using DigitalLearningSolutions.Web.ViewModels.Common.SearchablePage; using Microsoft.AspNetCore.Mvc; public class CurrentFiltersViewComponent : ViewComponent diff --git a/DigitalLearningSolutions.Web/ViewComponents/FilterableTagsViewComponent.cs b/DigitalLearningSolutions.Web/ViewComponents/FilterableTagsViewComponent.cs deleted file mode 100644 index 37f970b6d6..0000000000 --- a/DigitalLearningSolutions.Web/ViewComponents/FilterableTagsViewComponent.cs +++ /dev/null @@ -1,14 +0,0 @@ -namespace DigitalLearningSolutions.Web.ViewComponents -{ - using System.Collections.Generic; - using DigitalLearningSolutions.Web.ViewModels.Common; - using Microsoft.AspNetCore.Mvc; - - public class FilterableTagsViewComponent : ViewComponent - { - public IViewComponentResult Invoke(IEnumerable tags) - { - return View(tags); - } - } -} diff --git a/DigitalLearningSolutions.Web/ViewComponents/SearchBoxViewComponent.cs b/DigitalLearningSolutions.Web/ViewComponents/SearchBoxViewComponent.cs index ca4c02b7cc..d4338ce836 100644 --- a/DigitalLearningSolutions.Web/ViewComponents/SearchBoxViewComponent.cs +++ b/DigitalLearningSolutions.Web/ViewComponents/SearchBoxViewComponent.cs @@ -1,6 +1,7 @@ namespace DigitalLearningSolutions.Web.ViewComponents { using DigitalLearningSolutions.Web.ViewModels.Common; + using DigitalLearningSolutions.Web.ViewModels.Common.SearchablePage; using Microsoft.AspNetCore.Mvc; public class SearchBoxViewComponent : ViewComponent diff --git a/DigitalLearningSolutions.Web/ViewModels/Common/SearchBoxViewModel.cs b/DigitalLearningSolutions.Web/ViewModels/Common/SearchBoxViewModel.cs index 7872deed35..59cbc439f5 100644 --- a/DigitalLearningSolutions.Web/ViewModels/Common/SearchBoxViewModel.cs +++ b/DigitalLearningSolutions.Web/ViewModels/Common/SearchBoxViewModel.cs @@ -1,5 +1,7 @@ namespace DigitalLearningSolutions.Web.ViewModels.Common { + using DigitalLearningSolutions.Web.ViewModels.Common.SearchablePage; + public class SearchBoxViewModel { public readonly string AspAction; diff --git a/DigitalLearningSolutions.Web/ViewModels/Common/AppliedFilterViewModel.cs b/DigitalLearningSolutions.Web/ViewModels/Common/SearchablePage/AppliedFilterViewModel.cs similarity index 79% rename from DigitalLearningSolutions.Web/ViewModels/Common/AppliedFilterViewModel.cs rename to DigitalLearningSolutions.Web/ViewModels/Common/SearchablePage/AppliedFilterViewModel.cs index fac5c7f029..4c5747b181 100644 --- a/DigitalLearningSolutions.Web/ViewModels/Common/AppliedFilterViewModel.cs +++ b/DigitalLearningSolutions.Web/ViewModels/Common/SearchablePage/AppliedFilterViewModel.cs @@ -1,4 +1,4 @@ -namespace DigitalLearningSolutions.Web.ViewModels.Common +namespace DigitalLearningSolutions.Web.ViewModels.Common.SearchablePage { public class AppliedFilterViewModel { diff --git a/DigitalLearningSolutions.Web/ViewModels/Common/BaseFilterableViewModel.cs b/DigitalLearningSolutions.Web/ViewModels/Common/SearchablePage/BaseFilterableViewModel.cs similarity index 76% rename from DigitalLearningSolutions.Web/ViewModels/Common/BaseFilterableViewModel.cs rename to DigitalLearningSolutions.Web/ViewModels/Common/SearchablePage/BaseFilterableViewModel.cs index 63d6f556fa..504074ae62 100644 --- a/DigitalLearningSolutions.Web/ViewModels/Common/BaseFilterableViewModel.cs +++ b/DigitalLearningSolutions.Web/ViewModels/Common/SearchablePage/BaseFilterableViewModel.cs @@ -1,4 +1,4 @@ -namespace DigitalLearningSolutions.Web.ViewModels.Common +namespace DigitalLearningSolutions.Web.ViewModels.Common.SearchablePage { using System.Collections.Generic; diff --git a/DigitalLearningSolutions.Web/ViewModels/Common/BaseSearchablePageViewModel.cs b/DigitalLearningSolutions.Web/ViewModels/Common/SearchablePage/BaseSearchablePageViewModel.cs similarity index 93% rename from DigitalLearningSolutions.Web/ViewModels/Common/BaseSearchablePageViewModel.cs rename to DigitalLearningSolutions.Web/ViewModels/Common/SearchablePage/BaseSearchablePageViewModel.cs index bbc47594d6..846614c52f 100644 --- a/DigitalLearningSolutions.Web/ViewModels/Common/BaseSearchablePageViewModel.cs +++ b/DigitalLearningSolutions.Web/ViewModels/Common/SearchablePage/BaseSearchablePageViewModel.cs @@ -1,4 +1,4 @@ -namespace DigitalLearningSolutions.Web.ViewModels.Common +namespace DigitalLearningSolutions.Web.ViewModels.Common.SearchablePage { using System; using System.Collections.Generic; diff --git a/DigitalLearningSolutions.Web/ViewModels/Common/CurrentFiltersViewModel.cs b/DigitalLearningSolutions.Web/ViewModels/Common/SearchablePage/CurrentFiltersViewModel.cs similarity index 82% rename from DigitalLearningSolutions.Web/ViewModels/Common/CurrentFiltersViewModel.cs rename to DigitalLearningSolutions.Web/ViewModels/Common/SearchablePage/CurrentFiltersViewModel.cs index a03ce095bd..3b5723ee03 100644 --- a/DigitalLearningSolutions.Web/ViewModels/Common/CurrentFiltersViewModel.cs +++ b/DigitalLearningSolutions.Web/ViewModels/Common/SearchablePage/CurrentFiltersViewModel.cs @@ -1,4 +1,4 @@ -namespace DigitalLearningSolutions.Web.ViewModels.Common +namespace DigitalLearningSolutions.Web.ViewModels.Common.SearchablePage { using System.Collections.Generic; diff --git a/DigitalLearningSolutions.Web/ViewModels/Common/FilterOptionViewModel.cs b/DigitalLearningSolutions.Web/ViewModels/Common/SearchablePage/FilterOptionViewModel.cs similarity index 83% rename from DigitalLearningSolutions.Web/ViewModels/Common/FilterOptionViewModel.cs rename to DigitalLearningSolutions.Web/ViewModels/Common/SearchablePage/FilterOptionViewModel.cs index 891f3236e9..2d7568843b 100644 --- a/DigitalLearningSolutions.Web/ViewModels/Common/FilterOptionViewModel.cs +++ b/DigitalLearningSolutions.Web/ViewModels/Common/SearchablePage/FilterOptionViewModel.cs @@ -1,4 +1,4 @@ -namespace DigitalLearningSolutions.Web.ViewModels.Common +namespace DigitalLearningSolutions.Web.ViewModels.Common.SearchablePage { using DigitalLearningSolutions.Web.Models.Enums; diff --git a/DigitalLearningSolutions.Web/ViewModels/Common/FilterViewModel.cs b/DigitalLearningSolutions.Web/ViewModels/Common/SearchablePage/FilterViewModel.cs similarity index 85% rename from DigitalLearningSolutions.Web/ViewModels/Common/FilterViewModel.cs rename to DigitalLearningSolutions.Web/ViewModels/Common/SearchablePage/FilterViewModel.cs index a1983c6686..d08b6a6c62 100644 --- a/DigitalLearningSolutions.Web/ViewModels/Common/FilterViewModel.cs +++ b/DigitalLearningSolutions.Web/ViewModels/Common/SearchablePage/FilterViewModel.cs @@ -1,4 +1,4 @@ -namespace DigitalLearningSolutions.Web.ViewModels.Common +namespace DigitalLearningSolutions.Web.ViewModels.Common.SearchablePage { using System.Collections.Generic; diff --git a/DigitalLearningSolutions.Web/ViewModels/Common/SearchableTagViewModel.cs b/DigitalLearningSolutions.Web/ViewModels/Common/SearchablePage/SearchableTagViewModel.cs similarity index 88% rename from DigitalLearningSolutions.Web/ViewModels/Common/SearchableTagViewModel.cs rename to DigitalLearningSolutions.Web/ViewModels/Common/SearchablePage/SearchableTagViewModel.cs index 5d2b90b8a9..c0a22014f6 100644 --- a/DigitalLearningSolutions.Web/ViewModels/Common/SearchableTagViewModel.cs +++ b/DigitalLearningSolutions.Web/ViewModels/Common/SearchablePage/SearchableTagViewModel.cs @@ -1,4 +1,4 @@ -namespace DigitalLearningSolutions.Web.ViewModels.Common +namespace DigitalLearningSolutions.Web.ViewModels.Common.SearchablePage { using DigitalLearningSolutions.Web.Models.Enums; diff --git a/DigitalLearningSolutions.Web/ViewModels/Frameworks/AllFrameworksViewModel.cs b/DigitalLearningSolutions.Web/ViewModels/Frameworks/AllFrameworksViewModel.cs index 3e8cd00dfb..16867d4068 100644 --- a/DigitalLearningSolutions.Web/ViewModels/Frameworks/AllFrameworksViewModel.cs +++ b/DigitalLearningSolutions.Web/ViewModels/Frameworks/AllFrameworksViewModel.cs @@ -4,7 +4,7 @@ using System.Linq; using DigitalLearningSolutions.Data.Models.Frameworks; using DigitalLearningSolutions.Web.Helpers; - using DigitalLearningSolutions.Web.ViewModels.Common; + using DigitalLearningSolutions.Web.ViewModels.Common.SearchablePage; public class AllFrameworksViewModel : BaseSearchablePageViewModel { diff --git a/DigitalLearningSolutions.Web/ViewModels/Frameworks/MyFrameworksViewModel.cs b/DigitalLearningSolutions.Web/ViewModels/Frameworks/MyFrameworksViewModel.cs index 255495e5cd..0dbe8f4923 100644 --- a/DigitalLearningSolutions.Web/ViewModels/Frameworks/MyFrameworksViewModel.cs +++ b/DigitalLearningSolutions.Web/ViewModels/Frameworks/MyFrameworksViewModel.cs @@ -4,7 +4,7 @@ using System.Linq; using DigitalLearningSolutions.Data.Models.Frameworks; using DigitalLearningSolutions.Web.Helpers; - using DigitalLearningSolutions.Web.ViewModels.Common; + using DigitalLearningSolutions.Web.ViewModels.Common.SearchablePage; public class MyFrameworksViewModel : BaseSearchablePageViewModel { diff --git a/DigitalLearningSolutions.Web/ViewModels/LearningPortal/Available/AvailablePageViewModel.cs b/DigitalLearningSolutions.Web/ViewModels/LearningPortal/Available/AvailablePageViewModel.cs index 004e05d550..f92dcf6d8e 100644 --- a/DigitalLearningSolutions.Web/ViewModels/LearningPortal/Available/AvailablePageViewModel.cs +++ b/DigitalLearningSolutions.Web/ViewModels/LearningPortal/Available/AvailablePageViewModel.cs @@ -4,7 +4,7 @@ using System.Linq; using DigitalLearningSolutions.Data.Models.Courses; using DigitalLearningSolutions.Web.Helpers; - using DigitalLearningSolutions.Web.ViewModels.Common; + using DigitalLearningSolutions.Web.ViewModels.Common.SearchablePage; public class AvailablePageViewModel : BaseSearchablePageViewModel { diff --git a/DigitalLearningSolutions.Web/ViewModels/LearningPortal/Completed/CompletedPageViewModel.cs b/DigitalLearningSolutions.Web/ViewModels/LearningPortal/Completed/CompletedPageViewModel.cs index 7659dc5f20..7dd14d1581 100644 --- a/DigitalLearningSolutions.Web/ViewModels/LearningPortal/Completed/CompletedPageViewModel.cs +++ b/DigitalLearningSolutions.Web/ViewModels/LearningPortal/Completed/CompletedPageViewModel.cs @@ -4,7 +4,7 @@ namespace DigitalLearningSolutions.Web.ViewModels.LearningPortal.Completed using System.Linq; using DigitalLearningSolutions.Data.Models.Courses; using DigitalLearningSolutions.Web.Helpers; - using DigitalLearningSolutions.Web.ViewModels.Common; + using DigitalLearningSolutions.Web.ViewModels.Common.SearchablePage; using Microsoft.Extensions.Configuration; public class CompletedPageViewModel : BaseSearchablePageViewModel diff --git a/DigitalLearningSolutions.Web/ViewModels/LearningPortal/Current/CurrentPageViewModel.cs b/DigitalLearningSolutions.Web/ViewModels/LearningPortal/Current/CurrentPageViewModel.cs index a405f31f99..604750ce14 100644 --- a/DigitalLearningSolutions.Web/ViewModels/LearningPortal/Current/CurrentPageViewModel.cs +++ b/DigitalLearningSolutions.Web/ViewModels/LearningPortal/Current/CurrentPageViewModel.cs @@ -6,7 +6,7 @@ namespace DigitalLearningSolutions.Web.ViewModels.LearningPortal.Current using DigitalLearningSolutions.Data.Models.Courses; using DigitalLearningSolutions.Data.Models.SelfAssessments; using DigitalLearningSolutions.Web.Helpers; - using DigitalLearningSolutions.Web.ViewModels.Common; + using DigitalLearningSolutions.Web.ViewModels.Common.SearchablePage; using DigitalLearningSolutions.Web.ViewModels.LearningPortal.SelfAssessments; public class CurrentPageViewModel : BaseSearchablePageViewModel diff --git a/DigitalLearningSolutions.Web/ViewModels/TrackingSystem/Centre/Administrator/CentreAdministratorsViewModel.cs b/DigitalLearningSolutions.Web/ViewModels/TrackingSystem/Centre/Administrator/CentreAdministratorsViewModel.cs index 12f34d312d..4fcde8e47a 100644 --- a/DigitalLearningSolutions.Web/ViewModels/TrackingSystem/Centre/Administrator/CentreAdministratorsViewModel.cs +++ b/DigitalLearningSolutions.Web/ViewModels/TrackingSystem/Centre/Administrator/CentreAdministratorsViewModel.cs @@ -5,7 +5,7 @@ using DigitalLearningSolutions.Data.Models.User; using DigitalLearningSolutions.Web.Helpers; using DigitalLearningSolutions.Web.Models.Enums; - using DigitalLearningSolutions.Web.ViewModels.Common; + using DigitalLearningSolutions.Web.ViewModels.Common.SearchablePage; public class CentreAdministratorsViewModel : BaseSearchablePageViewModel { diff --git a/DigitalLearningSolutions.Web/ViewModels/TrackingSystem/Centre/Administrator/SearchableAdminViewModel.cs b/DigitalLearningSolutions.Web/ViewModels/TrackingSystem/Centre/Administrator/SearchableAdminViewModel.cs index 9296123fe2..e056dadc38 100644 --- a/DigitalLearningSolutions.Web/ViewModels/TrackingSystem/Centre/Administrator/SearchableAdminViewModel.cs +++ b/DigitalLearningSolutions.Web/ViewModels/TrackingSystem/Centre/Administrator/SearchableAdminViewModel.cs @@ -2,7 +2,7 @@ { using DigitalLearningSolutions.Data.Models.User; using DigitalLearningSolutions.Web.Helpers; - using DigitalLearningSolutions.Web.ViewModels.Common; + using DigitalLearningSolutions.Web.ViewModels.Common.SearchablePage; public class SearchableAdminViewModel : BaseFilterableViewModel { diff --git a/DigitalLearningSolutions.Web/Views/Frameworks/Shared/_FrameworkPageSearch.cshtml b/DigitalLearningSolutions.Web/Views/Frameworks/Shared/_FrameworkPageSearch.cshtml index a1508f13de..c547190bf6 100644 --- a/DigitalLearningSolutions.Web/Views/Frameworks/Shared/_FrameworkPageSearch.cshtml +++ b/DigitalLearningSolutions.Web/Views/Frameworks/Shared/_FrameworkPageSearch.cshtml @@ -1,4 +1,4 @@ -@using DigitalLearningSolutions.Web.ViewModels.Common +@using DigitalLearningSolutions.Web.ViewModels.Common.SearchablePage @model BaseSearchablePageViewModel