Skip to content

Commit bc12dde

Browse files
author
Binon
committed
Added new search filter and search result page and added feature flag in webui peroject
1 parent 067cd6d commit bc12dde

File tree

7 files changed

+421
-29
lines changed

7 files changed

+421
-29
lines changed

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/Views/Search/Index.cshtml

Lines changed: 27 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,22 @@
1-
@model LearningHub.Nhs.WebUI.Models.Search.SearchResultViewModel
1+
@using Microsoft.FeatureManagement
2+
@inject IFeatureManager FeatureManager
3+
@model LearningHub.Nhs.WebUI.Models.Search.SearchResultViewModel
24

35
@{
46
ViewData["Title"] = "Search";
7+
var azureSearchEnabled = await FeatureManager.IsEnabledAsync("AzureSearch");
58
}
69

7-
@section styles{
10+
@section styles {
811
<link rel="stylesheet" type="text/css" href="~/css/nhsuk/pages/search.css" asp-append-version="true" />
912
}
1013

1114
<div class="search-page">
12-
<div class="nhsuk-width-container app-width-container">
15+
<div class="nhsuk-width-container app-width-container">
1316
@if (Model.DidYouMeanEnabled)
1417
{
1518
<p class="nhsuk-u-margin-top-5 nhsuk-u-margin-bottom-6 nhsuk-body-l">
16-
No results were found for <b>@(Model.SearchString)</b> please change your search term or explore the suggestions below
19+
No results were found for <b>@(Model.SearchString)</b> please change your search term or explore the suggestions below
1720
</p>
1821
}
1922
else
@@ -22,14 +25,14 @@
2225
Search results @(!string.IsNullOrEmpty(Model.SearchString) ? "for " + Model.SearchString : string.Empty)
2326
</h1>
2427
}
25-
28+
2629
<div class="nhsuk-grid-row">
2730
<div class="nhsuk-grid-column-two-thirds">
2831
@await Html.PartialAsync("_SearchBar", @Model.SearchString)
2932
</div>
3033
</div>
3134

32-
@if (Model.CatalogueSearchResult?.TotalHits > 0)
35+
@if (Model.CatalogueSearchResult?.TotalHits > 0 && !azureSearchEnabled)
3336
{
3437
@if (Model.DidYouMeanEnabled)
3538
{
@@ -52,18 +55,33 @@
5255
Showing results for <b>@(Model.SuggestedResource)</b>
5356
</p>
5457
}
55-
@await Html.PartialAsync("_ResourceFilter", Model)
5658

59+
@if (azureSearchEnabled)
60+
{
61+
@await Html.PartialAsync("_SearchFilter", Model)
62+
}
63+
else
64+
{
65+
@await Html.PartialAsync("_ResourceFilter", Model)
66+
}
67+
5768
<div class="nhsuk-grid-row">
5869
<div class="nhsuk-grid-column-full">
5970
<div class="nhsuk-u-reading-width">
60-
@await Html.PartialAsync("_ResourceSearchResult", Model)
71+
@if (azureSearchEnabled)
72+
{
73+
@await Html.PartialAsync("_SearchResult", Model)
74+
}
75+
else
76+
{
77+
@await Html.PartialAsync("_ResourceSearchResult", Model)
78+
}
6179
@await Html.PartialAsync("_ResourcePagination", Model)
6280
</div>
6381
</div>
6482
</div>
6583
}
66-
84+
6785
@if ((Model.CatalogueSearchResult?.TotalHits ?? 0) == 0 && (Model.ResourceSearchResult?.TotalHits ?? 0) == 0)
6886
{
6987
<div class="nhsuk-grid-row">
Lines changed: 207 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,207 @@
1+
@using Microsoft.AspNetCore.WebUtilities
2+
@model LearningHub.Nhs.WebUI.Models.Search.SearchResultViewModel
3+
4+
@{
5+
var resourceResult = Model.ResourceSearchResult;
6+
var filtersApplied = resourceResult.SortItemSelected.Value != string.Empty
7+
|| resourceResult.SearchFilters.Any(f => f.Selected) || resourceResult.SearchResourceAccessLevelFilters.Any(f => f.Selected)
8+
|| resourceResult.SearchProviderFilters.Any(f =>f.Selected);
9+
10+
var queryParams = QueryHelpers.ParseQuery(Context.Request.QueryString.ToString().ToLower());
11+
queryParams["actiontype"] = "sort-filter";
12+
var pageUrl = Model.CatalogueId > 0 ? "/catalogue/" + Model.CatalogueUrl +"/search" : "/search/results";
13+
var actionUrl = QueryHelpers.AddQueryString(pageUrl, queryParams);
14+
var pageFragment = "#search-filters";
15+
16+
string FilterSummary()
17+
{
18+
string summary = $"Sorted by <strong class='nhsuk-tag'>{resourceResult.SortItemSelected.Name}</strong>";
19+
var filters = resourceResult.SearchFilters
20+
.Where(f => f.Selected)
21+
.Select(f => $"<strong class='nhsuk-tag'>{f.DisplayName}</strong>");
22+
23+
var resourceAccessLevelFilters = resourceResult.SearchResourceAccessLevelFilters
24+
.Where(f => f.Selected)
25+
.Select(f => $"<strong class='nhsuk-tag'>{char.ToUpper(f.DisplayName[0])}{f.DisplayName[1..]}</strong>");
26+
27+
if (resourceAccessLevelFilters.Any())
28+
{
29+
summary += $" and Filtered by Audience access level {string.Join(" ", resourceAccessLevelFilters)}";
30+
}
31+
32+
33+
var providerfilters = resourceResult.SearchProviderFilters.Where(f => f.Selected).Select(f => $"<strong class='nhsuk-tag'>{f.DisplayName}</strong>");
34+
35+
if (providerfilters.Any())
36+
{
37+
summary += $" and Filtered by Provider {string.Join(" ", providerfilters)}";
38+
}
39+
40+
if (filters.Any())
41+
{
42+
summary += $" and Filtered by Type {string.Join(" ", filters)}";
43+
}
44+
return summary;
45+
}
46+
}
47+
48+
<h2 class="nhsuk-u-margin-bottom-3">
49+
@($"Showing {resourceResult.TotalHits} result{(resourceResult.TotalHits == 1 ? string.Empty : "s")}")
50+
</h2>
51+
52+
@if (resourceResult.TotalHits > 0)
53+
{
54+
<div class="search-filters" id="search-filters">
55+
<form action="@string.Concat(@actionUrl, pageFragment)" method="post">
56+
<input type="hidden" name="searchId" value="@Model.ResourceSearchResult.SearchId" />
57+
<input type="hidden" name="groupId" value="@Model.GroupId" />
58+
<input type="hidden" name="resourceCount" value="@Model.ResourceSearchResult.TotalHits" />
59+
60+
<details class="nhsuk-details nhsuk-expander nhsuk-u-margin-bottom-7" @(this.ViewBag.SelectFilterError == true ? "open" : "")>
61+
62+
<summary class="nhsuk-details__summary nhsuk-u-padding-0">
63+
<span class="nhsuk-details__summary-text">
64+
Sort and filter results
65+
</span>
66+
67+
<hr class="nhsuk-u-margin-top-4 nhsuk-u-margin-bottom-4" />
68+
69+
<div class="filter-summary">
70+
<div>
71+
@Html.Raw(FilterSummary())
72+
</div>
73+
@if (filtersApplied)
74+
{
75+
<div class="clear-filter">
76+
<a href="@[email protected]&[email protected]&[email protected]@pageFragment">Clear all filters</a>
77+
</div>
78+
}
79+
</div>
80+
</summary>
81+
82+
<div class="search-filter-items nhsuk-u-margin-top-3 nhsuk-u-padding-4 nhsuk-u-padding-bottom-0 @(this.ViewBag.SelectFilterError == true ? "nhsuk-form-group--error" : "")">
83+
84+
@if (this.ViewBag.SelectFilterError == true)
85+
{
86+
<span class="nhsuk-error-message nhsuk-u-padding-bottom-2">
87+
<span class="nhsuk-u-visually-hidden">Error:</span> You must update the sort or filter before applying changes
88+
</span>
89+
}
90+
91+
<div class="nhsuk-grid-row">
92+
<fieldset class="nhsuk-grid-column-full">
93+
<legend>
94+
<h2>Sort by:</h2>
95+
</legend>
96+
97+
<div class="nhsuk-radios">
98+
@foreach (var sortItem in resourceResult.SortItemList)
99+
{
100+
<div class="nhsuk-grid-column-one-third nhsuk-u-padding-left-0">
101+
<div class="nhsuk-radios__item nhsuk-u-padding-bottom-3">
102+
<input class="nhsuk-radios__input" id="[email protected]" name="sortby" type="radio"
103+
value="@((int)sortItem.SearchSortType)" checked="@(sortItem.SearchSortType == resourceResult.SortItemSelected.SearchSortType)">
104+
<label class="nhsuk-label nhsuk-radios__label" for="[email protected]">
105+
@sortItem.Name
106+
</label>
107+
</div>
108+
</div>
109+
}
110+
111+
</div>
112+
</fieldset>
113+
</div>
114+
115+
@if (resourceResult.SearchResourceAccessLevelFilters != null && resourceResult.SearchResourceAccessLevelFilters.Any())
116+
{
117+
<hr class="nhsuk-u-margin-top-4 nhsuk-u-margin-bottom-4" />
118+
119+
<div class="nhsuk-grid-row">
120+
<fieldset class="nhsuk-grid-column-full">
121+
<legend>
122+
<h2>Filter by audience access level:</h2>
123+
</legend>
124+
125+
<div class="nhsuk-checkboxes">
126+
@foreach (var filter in resourceResult.SearchResourceAccessLevelFilters)
127+
{
128+
<div class="nhsuk-u-padding-left-0">
129+
<div class="nhsuk-checkboxes__item nhsuk-u-padding-bottom-3">
130+
<input class="nhsuk-checkboxes__input" id="[email protected]" name="resourceAccessLevelId" type="checkbox"
131+
value="@filter.Value" checked="@filter.Selected" class="@(filter.Count > 0 ? "" : "disabled")">
132+
<label class="nhsuk-label nhsuk-checkboxes__label" for="[email protected]">
133+
Show @filter.DisplayName (@filter.Count)
134+
</label>
135+
</div>
136+
</div>
137+
}
138+
</div>
139+
</fieldset>
140+
</div>
141+
}
142+
143+
@if (resourceResult.SearchProviderFilters.Count > 0)
144+
{
145+
<hr class="nhsuk-u-margin-top-4 nhsuk-u-margin-bottom-4" />
146+
147+
<div class="nhsuk-grid-row">
148+
<fieldset class="nhsuk-grid-column-full">
149+
<legend>
150+
<h2>Filter by provider:</h2>
151+
</legend>
152+
153+
<div class="nhsuk-checkboxes">
154+
@foreach (var filter in resourceResult.SearchProviderFilters)
155+
{
156+
<div class="nhsuk-grid-column-one-third nhsuk-u-padding-left-0">
157+
158+
<div class="nhsuk-checkboxes__item nhsuk-u-padding-bottom-3">
159+
<input class="nhsuk-checkboxes__input" id="[email protected]" name="providerfilters" type="checkbox"
160+
value="@filter.Value" checked="@filter.Selected" class="@(filter.Count > 0 ? "" : "disabled")">
161+
<label class="nhsuk-label nhsuk-checkboxes__label" for="[email protected]">
162+
@filter.DisplayName (@filter.Count)
163+
</label>
164+
</div>
165+
</div>
166+
}
167+
</div>
168+
</fieldset>
169+
</div>
170+
}
171+
172+
<hr class="nhsuk-u-margin-top-4 nhsuk-u-margin-bottom-4" />
173+
174+
<div class="nhsuk-grid-row">
175+
<fieldset class="nhsuk-grid-column-full">
176+
<legend>
177+
<h2>Filter by:</h2>
178+
</legend>
179+
180+
<div class="nhsuk-checkboxes">
181+
@foreach (var filter in resourceResult.SearchFilters)
182+
{
183+
<div class="nhsuk-grid-column-one-third nhsuk-u-padding-left-0">
184+
185+
<div class="nhsuk-checkboxes__item nhsuk-u-padding-bottom-3">
186+
<input class="nhsuk-checkboxes__input" id="[email protected]" name="filters" type="checkbox"
187+
value="@filter.Value" checked="@filter.Selected" class="@(filter.Count > 0 ? "" : "disabled")">
188+
<label class="nhsuk-label nhsuk-checkboxes__label" for="[email protected]">
189+
@filter.DisplayName (@filter.Count)
190+
</label>
191+
</div>
192+
</div>
193+
}
194+
195+
</div>
196+
</fieldset>
197+
</div>
198+
199+
<button class="nhsuk-button nhsuk-u-margin-top-3 nhsuk-u-margin-bottom-0" data-module="nhsuk-button" type="submit">
200+
Apply
201+
</button>
202+
</div>
203+
204+
</details>
205+
</form>
206+
</div>
207+
}

0 commit comments

Comments
 (0)