Skip to content

Commit e1c36c0

Browse files
authored
Merge pull request #1554 from TechnologyEnhancedLearning/Develop/Features/TD-6467-implement-new-search-ui
Develop/features/td 6467 implement new search UI
2 parents 9cbc0c1 + d6ffff1 commit e1c36c0

File tree

44 files changed

+2649
-64
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

44 files changed

+2649
-64
lines changed

AdminUI/LearningHub.Nhs.AdminUI/LearningHub.Nhs.AdminUI.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@
8989
<PackageReference Include="HtmlSanitizer" Version="6.0.453" />
9090
<PackageReference Include="IdentityModel" Version="4.6.0" />
9191
<PackageReference Include="LearningHub.Nhs.Caching" Version="2.0.2" />
92-
<PackageReference Include="LearningHub.Nhs.Models" Version="4.0.3" />
92+
<PackageReference Include="LearningHub.Nhs.Models" Version="4.0.5" />
9393
<PackageReference Include="Microsoft.ApplicationInsights.AspNetCore" Version="2.19.0" />
9494
<PackageReference Include="Microsoft.AspNetCore.Authentication.OpenIdConnect" Version="6.0.36" />
9595
<PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="6.0.36" />

LearningHub.Nhs.WebUI.AutomatedUiTests/LearningHub.Nhs.WebUI.AutomatedUiTests.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
<ItemGroup>
1313
<PackageReference Include="elfhHub.Nhs.Models" Version="3.0.14" />
1414
<PackageReference Include="FluentAssertions" Version="6.12.0" />
15-
<PackageReference Include="LearningHub.Nhs.Models" Version="4.0.3" />
15+
<PackageReference Include="LearningHub.Nhs.Models" Version="4.0.5" />
1616
<PackageReference Include="Microsoft.AspNetCore.Mvc.Testing" Version="3.1.13" />
1717
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.1.0" />
1818
<PackageReference Include="Selenium.Axe" Version="4.0.19" />

LearningHub.Nhs.WebUI/Controllers/SearchController.cs

Lines changed: 33 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ namespace LearningHub.Nhs.WebUI.Controllers
88
using LearningHub.Nhs.Models.Search;
99
using LearningHub.Nhs.Models.Search.SearchClick;
1010
using LearningHub.Nhs.WebUI.Filters;
11+
using LearningHub.Nhs.WebUI.Helpers;
1112
using LearningHub.Nhs.WebUI.Interfaces;
1213
using LearningHub.Nhs.WebUI.Models.Search;
1314
using Microsoft.AspNetCore.Authorization;
@@ -16,6 +17,7 @@ namespace LearningHub.Nhs.WebUI.Controllers
1617
using Microsoft.AspNetCore.Routing;
1718
using Microsoft.Extensions.Logging;
1819
using Microsoft.Extensions.Options;
20+
using Microsoft.FeatureManagement;
1921
using Settings = LearningHub.Nhs.WebUI.Configuration.Settings;
2022

2123
/// <summary>
@@ -28,6 +30,7 @@ public class SearchController : BaseController
2830
{
2931
private readonly ISearchService searchService;
3032
private readonly IFileService fileService;
33+
private readonly IFeatureManager featureManager;
3134

3235
/// <summary>
3336
/// Initializes a new instance of the <see cref="SearchController"/> class.
@@ -38,17 +41,20 @@ public class SearchController : BaseController
3841
/// <param name="searchService">The searchService.</param>
3942
/// <param name="logger">The logger.</param>
4043
/// <param name="fileService">The fileService.</param>
44+
/// <param name="featureManager"> The Feature flag manager.</param>
4145
public SearchController(
4246
IHttpClientFactory httpClientFactory,
4347
IWebHostEnvironment hostingEnvironment,
4448
IOptions<Settings> settings,
4549
ISearchService searchService,
4650
ILogger<SearchController> logger,
47-
IFileService fileService)
51+
IFileService fileService,
52+
IFeatureManager featureManager)
4853
: base(hostingEnvironment, httpClientFactory, logger, settings.Value)
4954
{
5055
this.searchService = searchService;
5156
this.fileService = fileService;
57+
this.featureManager = featureManager;
5258
}
5359

5460
/// <summary>
@@ -65,18 +71,32 @@ public async Task<IActionResult> Index(SearchRequestViewModel search, bool noSor
6571
search.SearchId ??= 0;
6672
search.GroupId = !string.IsNullOrWhiteSpace(search.GroupId) && Guid.TryParse(search.GroupId, out Guid groupId) ? groupId.ToString() : Guid.NewGuid().ToString();
6773

68-
var searchResult = await this.searchService.PerformSearch(this.User, search);
74+
// Fix: Ensure an instance of IFeatureManager is injected and used
75+
var azureSearchEnabled = Task.Run(() => this.featureManager.IsEnabledAsync(FeatureFlags.AzureSearch)).Result;
76+
SearchResultViewModel searchResult = new SearchResultViewModel();
77+
78+
if (azureSearchEnabled)
79+
{
80+
searchResult = await this.searchService.PerformSearch(this.User, search);
81+
}
82+
else
83+
{
84+
searchResult = await this.searchService.PerformSearchInFindwise(this.User, search);
85+
}
6986

7087
if (search.SearchId == 0 && searchResult.ResourceSearchResult != null)
7188
{
7289
var searchId = await this.searchService.RegisterSearchEventsAsync(
7390
search,
7491
SearchFormActionTypeEnum.BasicSearch,
7592
searchResult.ResourceSearchResult.TotalHits,
76-
searchResult.CatalogueSearchResult.TotalHits);
93+
searchResult.CatalogueSearchResult != null ? searchResult.CatalogueSearchResult.TotalHits : 0);
7794

7895
searchResult.ResourceSearchResult.SearchId = searchId;
79-
searchResult.CatalogueSearchResult.SearchId = searchId;
96+
if (searchResult.CatalogueSearchResult != null)
97+
{
98+
searchResult.CatalogueSearchResult.SearchId = searchId;
99+
}
80100
}
81101

82102
if (filterApplied)
@@ -109,10 +129,11 @@ public async Task<IActionResult> Index(SearchRequestViewModel search, bool noSor
109129
/// <param name="groupId">The search group id.</param>
110130
/// <param name="searchId">The search id.</param>
111131
/// <param name="actionType">The action type.</param>
132+
/// <param name="resourceCollectionFilter">The show filter.</param>
112133
/// <param name="feedback">The feedback.</param>
113134
/// <returns>The actionResult.</returns>
114135
[HttpPost("results")]
115-
public async Task<IActionResult> IndexPost([FromQuery] SearchRequestViewModel search, int resourceCount, [FromForm] IEnumerable<string> filters, [FromForm] int? resourceAccessLevelId, [FromForm] IEnumerable<string> providerfilters, [FromForm] int? sortby, [FromForm] string groupId, [FromForm] int searchId, [FromQuery] string actionType, string feedback)
136+
public async Task<IActionResult> IndexPost([FromQuery] SearchRequestViewModel search, int resourceCount, [FromForm] IEnumerable<string> filters, [FromForm] int? resourceAccessLevelId, [FromForm] IEnumerable<string> providerfilters, [FromForm] int? sortby, [FromForm] string groupId, [FromForm] int searchId, [FromQuery] string actionType, [FromForm] IEnumerable<string> resourceCollectionFilter, string feedback)
116137
{
117138
if (actionType == "feedback")
118139
{
@@ -144,14 +165,17 @@ public async Task<IActionResult> IndexPost([FromQuery] SearchRequestViewModel se
144165
var existingProviderFilters = (search.ProviderFilters ?? new List<string>()).OrderBy(t => t);
145166
var newProviderFilters = providerfilters.OrderBy(t => t);
146167
var filterProviderUpdated = !newProviderFilters.SequenceEqual(existingProviderFilters);
168+
var existingResourceCollectionFilter = (search.ResourceCollectionFilter ?? new List<string>()).OrderBy(t => t);
169+
var newResourceCollectionFilter = resourceCollectionFilter.OrderBy(t => t);
170+
var filterResourceCollectionUpdated = !newResourceCollectionFilter.SequenceEqual(existingResourceCollectionFilter);
147171

148-
// No sort or resource type filter updated or resource access level filter updated or provider filter applied
149-
if ((search.Sortby ?? 0) == sortby && !filterUpdated && !resourceAccessLevelFilterUpdated && !filterProviderUpdated)
172+
// No sort or resource type filter updated or resource access level filter updated or provider filter applied or resource collection filter applied
173+
if ((search.Sortby ?? 0) == sortby && !filterUpdated && !resourceAccessLevelFilterUpdated && !filterProviderUpdated && !filterResourceCollectionUpdated)
150174
{
151175
return await this.Index(search, noSortFilterError: true);
152176
}
153177

154-
if (search.ResourcePageIndex > 0 && (filterUpdated || resourceAccessLevelFilterUpdated || filterProviderUpdated))
178+
if (search.ResourcePageIndex > 0 && (filterUpdated || resourceAccessLevelFilterUpdated || filterProviderUpdated || filterResourceCollectionUpdated))
155179
{
156180
search.ResourcePageIndex = null;
157181
}
@@ -163,6 +187,7 @@ public async Task<IActionResult> IndexPost([FromQuery] SearchRequestViewModel se
163187
search.GroupId = groupId;
164188
search.SearchId = searchId;
165189
search.ResourceAccessLevelId = resourceAccessLevelId;
190+
search.ResourceCollectionFilter = resourceCollectionFilter;
166191

167192
var routeValues = new RouteValueDictionary(search)
168193
{

LearningHub.Nhs.WebUI/Helpers/FeatureFlags.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,5 +19,10 @@ public static class FeatureFlags
1919
/// The EnableMoodle.
2020
/// </summary>
2121
public const string EnableMoodle = "EnableMoodle";
22+
23+
/// <summary>
24+
/// The AzureSearch.
25+
/// </summary>
26+
public const string AzureSearch = "AzureSearch";
2227
}
2328
}

LearningHub.Nhs.WebUI/Helpers/UtilityHelper.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,13 +25,16 @@ public static class UtilityHelper
2525
{ "article", ResourceTypeEnum.Article },
2626
{ "case", ResourceTypeEnum.Case },
2727
{ "weblink", ResourceTypeEnum.WebLink },
28+
{ "web link", ResourceTypeEnum.WebLink },
2829
{ "audio", ResourceTypeEnum.Audio },
2930
{ "scorm", ResourceTypeEnum.Scorm },
3031
{ "assessment", ResourceTypeEnum.Assessment },
3132
{ "genericfile", ResourceTypeEnum.GenericFile },
33+
{ "file", ResourceTypeEnum.GenericFile },
3234
{ "image", ResourceTypeEnum.Image },
3335
{ "html", ResourceTypeEnum.Html },
3436
{ "moodle", ResourceTypeEnum.Moodle },
37+
{ "catalogue", ResourceTypeEnum.Catalogue },
3538
};
3639

3740
/// <summary>
@@ -146,6 +149,8 @@ public static string GetPrettifiedResourceTypeName(ResourceTypeEnum resourceType
146149
return "HTML";
147150
case ResourceTypeEnum.Moodle:
148151
return "Course";
152+
case ResourceTypeEnum.Catalogue:
153+
return "Catalogue";
149154
default:
150155
return "File";
151156
}
@@ -186,6 +191,8 @@ public static string GetPrettifiedResourceTypeName(ResourceTypeEnum resourceType
186191
return "HTML";
187192
case ResourceTypeEnum.Moodle:
188193
return "Course";
194+
case ResourceTypeEnum.Catalogue:
195+
return "Catalogue";
189196
default:
190197
return "File";
191198
}

LearningHub.Nhs.WebUI/Helpers/ViewActivityHelper.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,9 @@ public static string GetResourceTypeDesc(ResourceTypeEnum resourceType)
116116
case ResourceTypeEnum.Moodle:
117117
typeText = "Course";
118118
break;
119+
case ResourceTypeEnum.Catalogue:
120+
typeText = "Catalogue";
121+
break;
119122
default:
120123
typeText = string.Empty;
121124
break;

LearningHub.Nhs.WebUI/Interfaces/ISearchService.cs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,15 @@ public interface ISearchService
2020
/// <returns>A <see cref="Task{TResult}"/> representing the result of the asynchronous operation.</returns>
2121
Task<SearchResultViewModel> PerformSearch(IPrincipal user, SearchRequestViewModel searchRequest);
2222

23+
/// <summary>
24+
/// Performs a search - either a combined resource and catalogue search, or just a resource search if
25+
/// searching within a catalogue.
26+
/// </summary>
27+
/// <param name="user">User.</param>
28+
/// <param name="searchRequest">The SearchRequestViewModel.</param>
29+
/// <returns>A <see cref="Task{TResult}"/> representing the result of the asynchronous operation.</returns>
30+
Task<SearchResultViewModel> PerformSearchInFindwise(IPrincipal user, SearchRequestViewModel searchRequest);
31+
2332
/// <summary>
2433
/// Records the analytics events associated with a search.
2534
/// </summary>

LearningHub.Nhs.WebUI/LearningHub.Nhs.WebUI.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@
113113
<PackageReference Include="HtmlAgilityPack" Version="1.11.72" />
114114
<PackageReference Include="IdentityModel" Version="4.6.0" />
115115
<PackageReference Include="LearningHub.Nhs.Caching" Version="2.0.0" />
116-
<PackageReference Include="LearningHub.Nhs.Models" Version="4.0.3" />
116+
<PackageReference Include="LearningHub.Nhs.Models" Version="4.0.5" />
117117
<PackageReference Include="linqtotwitter" Version="6.9.0" />
118118
<PackageReference Include="Microsoft.ApplicationInsights.AspNetCore" Version="2.19.0" />
119119
<PackageReference Include="Microsoft.ApplicationInsights.EventCounterCollector" Version="2.21.0" />

LearningHub.Nhs.WebUI/Models/Search/SearchRequestViewModel.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,5 +75,10 @@ public class SearchRequestViewModel
7575
/// </summary>
7676
[FromQuery]
7777
public IEnumerable<string> ProviderFilters { get; set; }
78+
79+
/// <summary>
80+
/// Gets or sets the show filter (all, catalogues, courses, resources).
81+
/// </summary>
82+
public IEnumerable<string> ResourceCollectionFilter { get; set; }
7883
}
7984
}

LearningHub.Nhs.WebUI/Models/Search/SearchResultViewModel.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
namespace LearningHub.Nhs.WebUI.Models.Search
22
{
33
using System;
4+
using System.Collections.Generic;
45
using LearningHub.Nhs.Models.Paging;
56
using LearningHub.Nhs.Models.Search;
67

@@ -93,5 +94,10 @@ public class SearchResultViewModel
9394
/// Gets or sets Suggested Resource name.
9495
/// </summary>
9596
public string SuggestedResource { get; set; }
97+
98+
/// <summary>
99+
/// Gets or sets the show filter (all, catalogues, courses, resources).
100+
/// </summary>
101+
public List<SearchFilterModel> ResourceCollectionFilter { get; set; }
96102
}
97103
}

0 commit comments

Comments
 (0)