Skip to content

Commit 418f0c8

Browse files
committed
Revert Revert "TD-2182 - feature 'Refactor the Tracking System - Course Setup l…
1 parent 30db9ff commit 418f0c8

File tree

7 files changed

+132
-128
lines changed

7 files changed

+132
-128
lines changed

DigitalLearningSolutions.Web.Tests/Controllers/TrackingSystem/CourseSetup/CourseSetupControllerTests.cs

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
namespace DigitalLearningSolutions.Web.Tests.Controllers.TrackingSystem.CourseSetup
22
{
3+
using DigitalLearningSolutions.Data.DataServices;
34
using DigitalLearningSolutions.Data.Models;
45
using DigitalLearningSolutions.Data.Models.Courses;
56
using DigitalLearningSolutions.Data.Models.MultiPageFormData.AddNewCentreCourse;
@@ -102,15 +103,21 @@ public class CourseSetupControllerTests
102103
private ISectionService sectionService = null!;
103104
private ITutorialService tutorialService = null!;
104105
private IActivityService activityService = null;
106+
private IPaginateService paginateService = null;
107+
private ICourseCategoriesDataService courseCategoriesDataService = null;
108+
private ICourseTopicsDataService courseTopicsDataService = null;
105109

106-
[SetUp]
110+
[SetUp]
107111
public void Setup()
108112
{
109113
courseService = A.Fake<ICourseService>();
110114
tutorialService = A.Fake<ITutorialService>();
111115
sectionService = A.Fake<ISectionService>();
112116
activityService = A.Fake<IActivityService>();
113117
searchSortFilterPaginateService = A.Fake<ISearchSortFilterPaginateService>();
118+
paginateService = A.Fake<IPaginateService>();
119+
courseCategoriesDataService = A.Fake<ICourseCategoriesDataService>();
120+
courseTopicsDataService = A.Fake<ICourseTopicsDataService>();
114121
config = A.Fake<IConfiguration>();
115122
multiPageFormService = A.Fake<IMultiPageFormService>();
116123
A.CallTo(() => activityService.GetCourseCategoryNameForActivityFilter(A<int>._))
@@ -136,9 +143,12 @@ public void Setup()
136143
tutorialService,
137144
sectionService,
138145
searchSortFilterPaginateService,
146+
paginateService,
139147
config,
140148
multiPageFormService,
141-
activityService
149+
activityService,
150+
courseCategoriesDataService,
151+
courseTopicsDataService
142152
)
143153
.WithDefaultContext()
144154
.WithMockUser(true, 101)
@@ -150,9 +160,12 @@ public void Setup()
150160
tutorialService,
151161
sectionService,
152162
searchSortFilterPaginateService,
163+
paginateService,
153164
config,
154165
multiPageFormService,
155-
activityService
166+
activityService,
167+
courseCategoriesDataService,
168+
courseTopicsDataService
156169
)
157170
.WithMockHttpContext(httpRequest, CookieName, cookieValue, httpResponse)
158171
.WithMockUser(true, 101)
@@ -168,11 +181,13 @@ public void Index_calls_expected_methods_and_returns_view()
168181
// Then
169182
using (new AssertionScope())
170183
{
171-
A.CallTo(() => courseService.GetCentreCourseDetails(A<int>._, A<int?>._)).MustHaveHappened();
184+
A.CallTo(() => courseService.GetCentreCourses(A<string>._, A<int>._, A<int>._, A<string>._, A<string>._, A<int>._, A<int?>._, A<bool>._, A<bool?>._,
185+
A<string>._, A<string>._, A<string>._, A<string>._)).MustHaveHappened();
172186
A.CallTo(
173-
() => searchSortFilterPaginateService.SearchFilterSortAndPaginate(
187+
() => paginateService.Paginate(
174188
A<IEnumerable<CourseStatisticsWithAdminFieldResponseCounts>>._,
175-
A<SearchSortFilterAndPaginateOptions>._
189+
A<int>._,
190+
A<PaginationOptions>._, A<FilterOptions>._, A<string>._, A<string>._, A<string>._
176191
)
177192
).MustHaveHappened();
178193
A.CallTo(

DigitalLearningSolutions.Web.Tests/ViewModels/TrackingSystem/CourseSetup/CourseStatisticsViewModelFilterOptionsTests.cs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,8 @@ public class CourseStatisticsViewModelFilterOptionsTests
4949
"true",
5050
FilterStatus.Success
5151
),
52-
}
52+
},
53+
"course status"
5354
);
5455

5556
private readonly FilterModel expectedTopicsFilterViewModel = new FilterModel(
@@ -89,7 +90,8 @@ public class CourseStatisticsViewModelFilterOptionsTests
8990
"false",
9091
FilterStatus.Success
9192
),
92-
}
93+
},
94+
"course status"
9395
);
9496

9597
private readonly FilterModel expectedHasAdminFieldsFilterViewModel = new FilterModel(
@@ -109,7 +111,8 @@ public class CourseStatisticsViewModelFilterOptionsTests
109111
"false",
110112
FilterStatus.Default
111113
)
112-
}
114+
},
115+
"course status"
113116
);
114117

115118
private readonly List<string> filterableCategories = new List<string> { "Category 1", "Category 2" };

DigitalLearningSolutions.Web/Controllers/TrackingSystem/CourseSetup/CourseSetupController.cs

Lines changed: 99 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
using System.Linq;
2828
using System.Transactions;
2929
using GDS.MultiPageFormData.Enums;
30+
using DigitalLearningSolutions.Data.DataServices;
3031

3132
[FeatureGate(FeatureFlags.RefactoredTrackingSystem)]
3233
[Authorize(Policy = CustomPolicies.UserCentreAdmin)]
@@ -41,29 +42,41 @@ public class CourseSetupController : Controller
4142
private readonly ICourseService courseService;
4243
private readonly IMultiPageFormService multiPageFormService;
4344
private readonly ISearchSortFilterPaginateService searchSortFilterPaginateService;
45+
private readonly IPaginateService paginateService;
4446
private readonly ISectionService sectionService;
4547
private readonly ITutorialService tutorialService;
4648
private readonly IActivityService activityService;
49+
private readonly ICourseCategoriesDataService courseCategoriesDataService;
50+
private readonly ICourseTopicsDataService courseTopicsDataService;
4751

4852
public CourseSetupController(
4953
ICourseService courseService,
5054
ITutorialService tutorialService,
5155
ISectionService sectionService,
5256
ISearchSortFilterPaginateService searchSortFilterPaginateService,
57+
IPaginateService paginateService,
5358
IConfiguration config,
5459
IMultiPageFormService multiPageFormService,
55-
IActivityService activityService
60+
IActivityService activityService,
61+
ICourseCategoriesDataService courseCategoriesDataService,
62+
ICourseTopicsDataService courseTopicsDataService
63+
5664
)
5765
{
5866
this.courseService = courseService;
5967
this.tutorialService = tutorialService;
6068
this.sectionService = sectionService;
6169
this.searchSortFilterPaginateService = searchSortFilterPaginateService;
70+
this.paginateService = paginateService;
6271
this.config = config;
6372
this.multiPageFormService = multiPageFormService;
6473
this.activityService = activityService;
74+
this.courseCategoriesDataService = courseCategoriesDataService;
75+
this.courseTopicsDataService = courseTopicsDataService;
76+
6577
}
6678

79+
[NoCaching]
6780
[Route("{page=1:int}")]
6881
public IActionResult Index(
6982
string? searchString = null,
@@ -73,10 +86,12 @@ public IActionResult Index(
7386
string? newFilterToAdd = null,
7487
bool clearFilters = false,
7588
int page = 1,
76-
int? itemsPerPage = null
89+
int? itemsPerPage = 10
7790
)
7891
{
7992
sortBy ??= DefaultSortByOptions.Name.PropertyName;
93+
sortDirection ??= GenericSortingHelper.Ascending;
94+
8095
existingFilterString = FilteringHelper.GetFilterString(
8196
existingFilterString,
8297
newFilterToAdd,
@@ -89,28 +104,90 @@ public IActionResult Index(
89104
var centreId = User.GetCentreIdKnownNotNull();
90105
var categoryId = User.GetAdminCategoryId();
91106
var courseCategoryName = this.activityService.GetCourseCategoryNameForActivityFilter(categoryId);
92-
var details = courseService.GetCentreCourseDetails(centreId, categoryId);
107+
var Categories = courseCategoriesDataService.GetCategoriesForCentreAndCentrallyManagedCourses(centreId).Select(c => c.CategoryName);
108+
var Topics = courseTopicsDataService.GetCourseTopicsAvailableAtCentre(centreId).Select(c => c.CourseTopic);
109+
110+
int offSet = ((page - 1) * itemsPerPage) ?? 0;
111+
string isActive, categoryName, courseTopic, hasAdminFields;
112+
isActive = categoryName = courseTopic = hasAdminFields = "Any";
113+
bool? hideInLearnerPortal = null;
114+
115+
if (!string.IsNullOrEmpty(existingFilterString))
116+
{
117+
var selectedFilters = existingFilterString.Split(FilteringHelper.FilterSeparator).ToList();
118+
119+
if (!string.IsNullOrEmpty(newFilterToAdd))
120+
{
121+
var filterHeader = newFilterToAdd.Split(FilteringHelper.Separator)[0];
122+
var dupfilters = selectedFilters.Where(x => x.Contains(filterHeader));
123+
if (dupfilters.Count() > 1)
124+
{
125+
foreach (var filter in selectedFilters)
126+
{
127+
if (filter.Contains(filterHeader))
128+
{
129+
selectedFilters.Remove(filter);
130+
existingFilterString = string.Join(FilteringHelper.FilterSeparator, selectedFilters);
131+
break;
132+
}
133+
}
134+
}
135+
}
136+
137+
if (selectedFilters.Count > 0)
138+
{
139+
foreach (var filter in selectedFilters)
140+
{
141+
var filterArr = filter.Split(FilteringHelper.Separator);
142+
var filterValue = filterArr[2];
143+
if (filterValue == FilteringHelper.EmptyValue) filterValue = "No option selected";
144+
145+
if (filter.Contains("CategoryName"))
146+
categoryName = filterValue;
147+
148+
if (filter.Contains("CourseTopic"))
149+
courseTopic = filterValue;
150+
151+
if (filter.Contains("Active"))
152+
isActive = filterValue;
153+
154+
if (filter.Contains("NotActive"))
155+
isActive = "false";
156+
157+
if (filter.Contains("HasAdminFields"))
158+
hasAdminFields = filterValue;
159+
160+
if (filter.Contains("HideInLearnerPortal"))
161+
hideInLearnerPortal = filterValue=="true" ? true:false;
162+
}
163+
}
164+
}
165+
166+
var (courses, resultCount) = courseService.GetCentreCourses(searchString ?? string.Empty, offSet, (int)itemsPerPage, sortBy, sortDirection, centreId, categoryId, false, hideInLearnerPortal,
167+
isActive, categoryName, courseTopic, hasAdminFields);
168+
if (courses.Count() == 0 && resultCount > 0)
169+
{
170+
page = 1;
171+
offSet = 0;
172+
(courses, resultCount) = courseService.GetCentreCourses(searchString ?? string.Empty, offSet, (int)itemsPerPage, sortBy, sortDirection, centreId, categoryId, false, hideInLearnerPortal,
173+
isActive, categoryName, courseTopic, hasAdminFields);
174+
}
93175

94-
var courses = UpdateCoursesNotActiveStatus(details.Courses);
95-
96176
var availableFilters = CourseStatisticsViewModelFilterOptions
97-
.GetFilterOptions(categoryId.HasValue ? new string[] { } : details.Categories, details.Topics).ToList();
177+
.GetFilterOptions(categoryId.HasValue ? new string[] { } : Categories, Topics).ToList();
98178

99-
var searchSortPaginationOptions = new SearchSortFilterAndPaginateOptions(
100-
new SearchOptions(searchString),
101-
new SortOptions(sortBy, sortDirection),
102-
new FilterOptions(
103-
existingFilterString,
104-
availableFilters,
105-
CourseStatusFilterOptions.IsActive.FilterValue
106-
),
107-
new PaginationOptions(page, itemsPerPage)
108-
);
179+
var result = paginateService.Paginate(
180+
courses,
181+
resultCount,
182+
new PaginationOptions(page, itemsPerPage),
183+
new FilterOptions(existingFilterString, availableFilters),
184+
searchString,
185+
sortBy,
186+
sortDirection
187+
);
109188

110-
var result = searchSortFilterPaginateService.SearchFilterSortAndPaginate(
111-
courses,
112-
searchSortPaginationOptions
113-
);
189+
result.Page = page;
190+
TempData["Page"] = result.Page;
114191

115192
var model = new CourseSetupViewModel(
116193
result,
@@ -119,22 +196,13 @@ public IActionResult Index(
119196
courseCategoryName
120197
);
121198

199+
model.TotalPages = (int)(resultCount / itemsPerPage) + ((resultCount % itemsPerPage) > 0 ? 1 : 0);
200+
model.MatchingSearchResults = resultCount;
122201
Response.UpdateFilterCookie(CourseFilterCookieName, result.FilterString);
123202

124203
return View(model);
125204
}
126205

127-
[Route("AllCourseStatistics")]
128-
public IActionResult AllCourseStatistics()
129-
{
130-
var centreId = User.GetCentreIdKnownNotNull();
131-
var categoryId = User.GetAdminCategoryId();
132-
var details = courseService.GetCentreCourseDetails(centreId, categoryId);
133-
134-
var model = new AllCourseStatisticsViewModel(details, config);
135-
136-
return View(model);
137-
}
138206

139207
[HttpGet("AddCourseNew")]
140208
public IActionResult AddCourseNew()

DigitalLearningSolutions.Web/DigitalLearningSolutions.Web.csproj

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,6 @@
133133
<TypeScriptCompile Include="Scripts\trackingSystem\editCourseContent.ts" />
134134
<TypeScriptCompile Include="Scripts\trackingSystem\emailDelegates.ts" />
135135
<TypeScriptCompile Include="Scripts\trackingSystem\centreAdministrators.ts" />
136-
<TypeScriptCompile Include="Scripts\trackingSystem\centreCourseSetup.ts" />
137136
<TypeScriptCompile Include="Scripts\trackingSystem\delegateGroups.ts" />
138137
<TypeScriptCompile Include="Scripts\trackingSystem\learningLog.ts" />
139138
<TypeScriptCompile Include="Scripts\trackingSystem\reports.ts" />

DigitalLearningSolutions.Web/Scripts/trackingSystem/centreCourseSetup.ts

Lines changed: 0 additions & 75 deletions
This file was deleted.

0 commit comments

Comments
 (0)