Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
6a2a6f8
DLSV2-258 Renamed review page, viewmodel and controller actions to ov…
kevwhitt-hee Jul 27, 2021
01906bc
Update SelfAssessmentTests.cs
kevwhitt-hee Jul 27, 2021
a976b10
DLSV2-268 Links to Overview from description page
kevwhitt-hee Jul 27, 2021
6d3abf9
DLSV2-261 Reworks overview cards to table DLSV2-259 Adds links to go …
kevwhitt-hee Jul 28, 2021
9bbe167
DLSV2-259 Updates test helper to add new RowNo field to competency
kevwhitt-hee Jul 28, 2021
4bcac88
DLSV2-259 Adds back to overview navigation to assessment breadcrumbs
kevwhitt-hee Jul 28, 2021
75c8208
Merge branch 'master' into Develop/Features/CompetencyFrameworks
kevwhitt-hee Jul 28, 2021
bc821ff
DLSV2-261 Removes hover effect and moves classes to layout scss
kevwhitt-hee Jul 28, 2021
e6e50f1
DLSV2-281 Hides summary for none scale input questions and fixes disp…
kevwhitt-hee Jul 28, 2021
75b608e
DLSV2-86 Loads assessment question level descriptors for verify multi…
kevwhitt-hee Jul 28, 2021
f085251
DLSV2-259 Adds partitioning to row number query to fix links
kevwhitt-hee Jul 29, 2021
bbf5cc3
DLSV2-261 Removes status-tag class from question text in tds
kevwhitt-hee Jul 29, 2021
04772c9
DLSV2-284 Removes Previous and Close buttons from Overview page
kevwhitt-hee Jul 29, 2021
b6e51aa
DLSV2-284 Migration to add LinearNavigation field to SelfAssessments
kevwhitt-hee Jul 29, 2021
a1c1c84
DLSV2-284 Loads LinearNavigation into self assessment model
kevwhitt-hee Jul 29, 2021
bf06be9
DLSV2-284 Fixes description nav for linear and non-linear
kevwhitt-hee Jul 29, 2021
2a9990e
DLSV2-284 Fixes competency navigation buttons
kevwhitt-hee Jul 29, 2021
1709c0d
DLSV2-284 Removes expanders for non-linear nav overviews
kevwhitt-hee Jul 29, 2021
d7fd1d2
DLSV2-284 Scrolls to submitted capability on overview page
kevwhitt-hee Jul 29, 2021
0d23c81
Update SelfAssessmentHelper.cs
kevwhitt-hee Jul 29, 2021
da3df0b
DLSV2-284 Scroll to highlights capability briefly on page load
kevwhitt-hee Jul 29, 2021
474d3ab
DLSV2-284 Fixes breadcrumb navigation
kevwhitt-hee Jul 29, 2021
4cb2db4
Merge branch 'master' into Develop/Features/CompetencyFrameworks
kevwhitt-hee Jul 29, 2021
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
namespace DigitalLearningSolutions.Data.Migrations
{
using FluentMigrator;
[Migration(202107290942)]
public class AddLinearNavigationBitFieldToSelfAssessments : Migration
{
public override void Up()
{
Alter.Table("SelfAssessments").AddColumn("LinearNavigation").AsBoolean().WithDefaultValue(false);
}
public override void Down()
{
Delete.Column("LinearNavigation").FromTable("SelfAssessments");
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,8 @@ public static CurrentSelfAssessment CreateDefaultSelfAssessment(
DateTime? lastAccessed = null,
DateTime? completeByDate = null,
bool useFilteredApi = false,
bool unprocessedUpdates = false
bool unprocessedUpdates = false,
bool linearNavigation = true
)
{
return new CurrentSelfAssessment()
Expand All @@ -29,12 +30,14 @@ public static CurrentSelfAssessment CreateDefaultSelfAssessment(
LastAccessed = lastAccessed,
CompleteByDate = completeByDate,
UseFilteredApi = useFilteredApi,
UnprocessedUpdates = unprocessedUpdates
UnprocessedUpdates = unprocessedUpdates,
LinearNavigation = linearNavigation
};
}

public static Competency CreateDefaultCompetency(
int id = 1,
int rowNo = 1,
string name = "name",
string? description = "description",
string competencyGroup = "competencyGroup",
Expand All @@ -45,6 +48,7 @@ public static Competency CreateDefaultCompetency(
return new Competency()
{
Id = id,
RowNo = rowNo,
Name = name,
Description = description,
CompetencyGroup = competencyGroup,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
public class Competency
{
public int Id { get; set; }
public int RowNo { get; set; }
public string Name { get; set; }
public string? Description { get; set; }
public string CompetencyGroup { get; set; }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,6 @@ public class SelfAssessment : CurrentLearningItem
{
public string Description { get; set; }
public int NumberOfCompetencies { get; set; }
public bool LinearNavigation { get; set; }
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,7 @@ LEFT OUTER JOIN CompetencyAssessmentQuestionRoleRequirements rr
WHERE ca.ID = @candidateAssessmentId
)";
private const string CompetencyFields = @"C.ID AS Id,
ROW_NUMBER() OVER (PARTITION BY CAQ.Ordering ORDER BY SAS.Ordering) as RowNo,
C.Name AS Name,
C.Description AS Description,
CG.Name AS CompetencyGroup,
Expand Down Expand Up @@ -195,7 +196,7 @@ INNER JOIN Competencies AS C
CA.CompleteByDate,
CA.UserBookmark,
CA.UnprocessedUpdates,
CA.LaunchCount, CA.SubmittedDate
CA.LaunchCount, CA.SubmittedDate, SA.LinearNavigation
FROM CandidateAssessments CA
JOIN SelfAssessments SA
ON CA.SelfAssessmentID = SA.ID
Expand All @@ -204,7 +205,7 @@ INNER JOIN SelfAssessmentStructure AS SAS
INNER JOIN Competencies AS C
ON SAS.CompetencyID = C.ID
WHERE CA.CandidateID = @candidateId AND CA.SelfAssessmentID = @selfAssessmentId AND CA.RemovedDate IS NULL AND CA.CompletedDate IS NULL
GROUP BY CA.SelfAssessmentID, SA.Name, SA.Description, SA.UseFilteredApi, CA.StartedDate, CA.LastAccessed, CA.CompleteByDate, CA.UserBookmark, CA.UnprocessedUpdates, CA.LaunchCount, CA.SubmittedDate",
GROUP BY CA.SelfAssessmentID, SA.Name, SA.Description, SA.UseFilteredApi, CA.StartedDate, CA.LastAccessed, CA.CompleteByDate, CA.UserBookmark, CA.UnprocessedUpdates, CA.LaunchCount, CA.SubmittedDate, SA.LinearNavigation",
new { candidateId, selfAssessmentId }
);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -137,7 +137,7 @@ public void SelfAssessmentCompetency_Redirects_To_Review_After_Last_Question()
var result = controller.SelfAssessmentCompetency(SelfAssessmentId, competencyNumber);

// Then
result.Should().BeRedirectToActionResult().WithActionName("SelfAssessmentReview");
result.Should().BeRedirectToActionResult().WithActionName("SelfAssessmentOverview");
}

[Test]
Expand Down Expand Up @@ -242,7 +242,7 @@ public void SelfAssessmentCompetency_Post_without_self_assessment_should_return_
}

[Test]
public void SelfAssessmentReview_Should_Return_View()
public void SelfAssessmentOverview_Should_Return_View()
{
// Given
var selfAssessment = SelfAssessmentHelper.CreateDefaultSelfAssessment();
Expand All @@ -251,7 +251,7 @@ public void SelfAssessmentReview_Should_Return_View()
new Competency() { CompetencyGroup = "A" },
new Competency() { CompetencyGroup = "A" }
};
var expectedModel = new SelfAssessmentReviewViewModel()
var expectedModel = new SelfAssessmentOverviewViewModel()
{
SelfAssessment = selfAssessment,
CompetencyGroups = competencies.GroupBy(competency => competency.CompetencyGroup),
Expand All @@ -261,47 +261,47 @@ public void SelfAssessmentReview_Should_Return_View()
A.CallTo(() => selfAssessmentService.GetMostRecentResults(selfAssessment.Id, CandidateId)).Returns(competencies);

// When
var result = controller.SelfAssessmentReview(SelfAssessmentId);
var result = controller.SelfAssessmentOverview(SelfAssessmentId);

// Then
result.Should().BeViewResult()
.WithViewName("SelfAssessments/SelfAssessmentReview")
.WithViewName("SelfAssessments/SelfAssessmentOverview")
.Model.Should().BeEquivalentTo(expectedModel);
}

[Test]
public void SelfAssessmentReview_action_should_update_last_accessed()
public void SelfAssessmentOverview_action_should_update_last_accessed()
{
// Given
var selfAssessment = SelfAssessmentHelper.CreateDefaultSelfAssessment();
A.CallTo(() => selfAssessmentService.GetSelfAssessmentForCandidateById(CandidateId, SelfAssessmentId)).Returns(selfAssessment);

// When
controller.SelfAssessmentReview(SelfAssessmentId);
controller.SelfAssessmentOverview(SelfAssessmentId);

// Then
A.CallTo(() => selfAssessmentService.UpdateLastAccessed(selfAssessment.Id, CandidateId)).MustHaveHappened();
}
[Test]
public void SelfAssessmentReview_action_should_update_user_bookmark()
public void SelfAssessmentOverview_action_should_update_user_bookmark()
{
// Given
var selfAssessment = SelfAssessmentHelper.CreateDefaultSelfAssessment();
A.CallTo(() => selfAssessmentService.GetSelfAssessmentForCandidateById(CandidateId, SelfAssessmentId)).Returns(selfAssessment);
string destUrl = "/LearningPortal/SelfAssessment/" + selfAssessment.Id.ToString() + "/Review";
string destUrl = "/LearningPortal/SelfAssessment/" + selfAssessment.Id.ToString() + "/Overview";
// When
controller.SelfAssessmentReview(SelfAssessmentId);
controller.SelfAssessmentOverview(SelfAssessmentId);

// Then
A.CallTo(() => selfAssessmentService.SetBookmark(selfAssessment.Id, CandidateId, destUrl)).MustHaveHappened();
}
[Test]
public void SelfAssessmentReview_Should_Have_Previous_Competency_Number_One_When_Empty()
public void SelfAssessmentOverview_Should_Have_Previous_Competency_Number_One_When_Empty()
{
// Given
var selfAssessment = SelfAssessmentHelper.CreateDefaultSelfAssessment();
var competencies = new List<Competency>();
var expectedModel = new SelfAssessmentReviewViewModel()
var expectedModel = new SelfAssessmentOverviewViewModel()
{
SelfAssessment = selfAssessment,
CompetencyGroups = competencies.GroupBy(competency => competency.CompetencyGroup),
Expand All @@ -311,22 +311,22 @@ public void SelfAssessmentReview_Should_Have_Previous_Competency_Number_One_When
A.CallTo(() => selfAssessmentService.GetMostRecentResults(selfAssessment.Id, CandidateId)).Returns(competencies);

// When
var result = controller.SelfAssessmentReview(SelfAssessmentId);
var result = controller.SelfAssessmentOverview(SelfAssessmentId);

// Then
result.Should().BeViewResult()
.WithViewName("SelfAssessments/SelfAssessmentReview")
.WithViewName("SelfAssessments/SelfAssessmentOverview")
.Model.Should().BeEquivalentTo(expectedModel);
}

[Test]
public void SelfAssessmentReview_action_without_self_assessment_should_return_403()
public void SelfAssessmentOverview_action_without_self_assessment_should_return_403()
{
// Given
A.CallTo(() => selfAssessmentService.GetSelfAssessmentForCandidateById(CandidateId, SelfAssessmentId)).Returns(null);

// When
var result = controller.SelfAssessmentReview(SelfAssessmentId);
var result = controller.SelfAssessmentOverview(SelfAssessmentId);

// Then
result.Should()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ public IActionResult SelfAssessmentCompetency(int selfAssessmentId, int competen
var competency = selfAssessmentService.GetNthCompetency(competencyNumber, assessment.Id, User.GetCandidateIdKnownNotNull());
if (competency == null)
{
return RedirectToAction("SelfAssessmentReview", new { selfAssessmentId = assessment.Id });
return RedirectToAction("SelfAssessmentOverview", new { selfAssessmentId = assessment.Id });
}
else
{
Expand Down Expand Up @@ -86,18 +86,25 @@ public IActionResult SelfAssessmentCompetency(int selfAssessmentId, ICollection<
}
}
selfAssessmentService.SetUpdatedFlag(selfAssessmentId, candidateID, true);
return RedirectToAction("SelfAssessmentCompetency", new { competencyNumber = competencyNumber + 1 });
if (assessment.LinearNavigation)
{
return RedirectToAction("SelfAssessmentCompetency", new { competencyNumber = competencyNumber + 1 });
}
else
{
return new RedirectResult(Url.Action("SelfAssessmentOverview", new { selfAssessmentId = selfAssessmentId }) + "#comp-" + competencyNumber.ToString());
}
}

[Route("LearningPortal/SelfAssessment/{selfAssessmentId:int}/Review")]
public IActionResult SelfAssessmentReview(int selfAssessmentId)
[Route("LearningPortal/SelfAssessment/{selfAssessmentId:int}/Overview")]
public IActionResult SelfAssessmentOverview(int selfAssessmentId)
{
string destUrl = "/LearningPortal/SelfAssessment/" + selfAssessmentId.ToString() + "/Review";
string destUrl = "/LearningPortal/SelfAssessment/" + selfAssessmentId.ToString() + "/Overview";
selfAssessmentService.SetBookmark(selfAssessmentId, User.GetCandidateIdKnownNotNull(), destUrl);
var assessment = selfAssessmentService.GetSelfAssessmentForCandidateById(User.GetCandidateIdKnownNotNull(), selfAssessmentId);
if (assessment == null)
{
logger.LogWarning($"Attempt to display self assessment review for candidate {User.GetCandidateIdKnownNotNull()} with no self assessment");
logger.LogWarning($"Attempt to display self assessment overview for candidate {User.GetCandidateIdKnownNotNull()} with no self assessment");
return RedirectToAction("StatusCode", "LearningSolutions", new { code = 403 });
}

Expand All @@ -114,13 +121,13 @@ public IActionResult SelfAssessmentReview(int selfAssessmentId)
}
}
}
var model = new SelfAssessmentReviewViewModel()
var model = new SelfAssessmentOverviewViewModel()
{
SelfAssessment = assessment,
CompetencyGroups = competencies.GroupBy(competency => competency.CompetencyGroup),
PreviousCompetencyNumber = Math.Max(competencies.Count(), 1)
};
return View("SelfAssessments/SelfAssessmentReview", model);
return View("SelfAssessments/SelfAssessmentOverview", model);
}

[HttpPost]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
using System.Collections.Generic;
using DigitalLearningSolutions.Web.ViewModels.Common.SearchablePage;
using DigitalLearningSolutions.Data.Models.SessionData.Supervisor;
using DigitalLearningSolutions.Data.Models.SelfAssessments;

public partial class SupervisorController
{
Expand Down Expand Up @@ -134,7 +135,19 @@ public IActionResult ReviewDelegateSelfAssessment(int supervisorDelegateId, int
{
var adminId = GetAdminID();
var superviseDelegate = supervisorService.GetSupervisorDelegateDetailsById(supervisorDelegateId);
var reviewedCompetencies = selfAssessmentService.GetCandidateAssessmentResultsById(candidateAssessmentId, adminId).ToList();
var reviewedCompetencies = PopulateCompetencyLevelDescriptors(selfAssessmentService.GetCandidateAssessmentResultsById(candidateAssessmentId, adminId).ToList());
var delegateSelfAssessment = supervisorService.GetSelfAssessmentByCandidateAssessmentId(candidateAssessmentId, adminId);
var model = new ReviewSelfAssessmentViewModel()
{
SupervisorDelegateDetail = superviseDelegate,
DelegateSelfAssessment = delegateSelfAssessment,
CompetencyGroups = reviewedCompetencies.GroupBy(competency => competency.CompetencyGroup)
};
return View("ReviewSelfAssessment", model);
}

private List<Competency> PopulateCompetencyLevelDescriptors(List<Competency> reviewedCompetencies)
{
foreach (var competency in reviewedCompetencies)
{
foreach (var assessmentQuestion in competency.AssessmentQuestions)
Expand All @@ -145,14 +158,15 @@ public IActionResult ReviewDelegateSelfAssessment(int supervisorDelegateId, int
}
}
}
var delegateSelfAssessment = supervisorService.GetSelfAssessmentByCandidateAssessmentId(candidateAssessmentId, adminId);
var model = new ReviewSelfAssessmentViewModel()
return reviewedCompetencies;
}
private AssessmentQuestion GetLevelDescriptorsForAssessmentQuestion (AssessmentQuestion assessmentQuestion)
{
if (assessmentQuestion.AssessmentQuestionInputTypeID != 2)
{
SupervisorDelegateDetail = superviseDelegate,
DelegateSelfAssessment = delegateSelfAssessment,
CompetencyGroups = reviewedCompetencies.GroupBy(competency => competency.CompetencyGroup)
};
return View("ReviewSelfAssessment", model);
assessmentQuestion.LevelDescriptors = selfAssessmentService.GetLevelDescriptorsForAssessmentQuestion(assessmentQuestion.Id, assessmentQuestion.MinValue, assessmentQuestion.MaxValue, assessmentQuestion.MinValue == 0).ToList();
}
return assessmentQuestion;
}
[Route("/Supervisor/Staff/{supervisorDelegateId}/ProfileAssessment/{candidateAssessmentId}/{viewMode}/{resultId}/")]
public IActionResult ReviewCompetencySelfAssessment(int supervisorDelegateId, int candidateAssessmentId, string viewMode, int resultId)
Expand All @@ -161,11 +175,7 @@ public IActionResult ReviewCompetencySelfAssessment(int supervisorDelegateId, in
var supervisorDelegate = supervisorService.GetSupervisorDelegateDetailsById(supervisorDelegateId);
var competency = selfAssessmentService.GetCompetencyByCandidateAssessmentResultId(resultId, candidateAssessmentId, adminId);
var delegateSelfAssessment = supervisorService.GetSelfAssessmentBaseByCandidateAssessmentId(candidateAssessmentId);
var assessmentQuestion = competency.AssessmentQuestions.First();
if (assessmentQuestion.AssessmentQuestionInputTypeID != 2)
{
assessmentQuestion.LevelDescriptors = selfAssessmentService.GetLevelDescriptorsForAssessmentQuestion(assessmentQuestion.Id, assessmentQuestion.MinValue, assessmentQuestion.MaxValue, assessmentQuestion.MinValue == 0).ToList();
}
var assessmentQuestion = GetLevelDescriptorsForAssessmentQuestion(competency.AssessmentQuestions.First());
var model = new ReviewCompetencySelfAsessmentViewModel()
{
DelegateSelfAssessment = delegateSelfAssessment,
Expand Down Expand Up @@ -194,7 +204,7 @@ public IActionResult VerifyMultipleResults(int supervisorDelegateId, int candida
var adminId = GetAdminID();
var superviseDelegate = supervisorService.GetSupervisorDelegateDetailsById(supervisorDelegateId);
var delegateSelfAssessment = supervisorService.GetSelfAssessmentBaseByCandidateAssessmentId(candidateAssessmentId);
var reviewedCompetencies = selfAssessmentService.GetCandidateAssessmentResultsForReviewById(candidateAssessmentId, adminId).ToList();
var reviewedCompetencies = PopulateCompetencyLevelDescriptors(selfAssessmentService.GetCandidateAssessmentResultsForReviewById(candidateAssessmentId, adminId).ToList());
var model = new ReviewSelfAssessmentViewModel()
{
SupervisorDelegateDetail = superviseDelegate,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ by editing this MSBuild file. In order to learn more about this please visit htt
<ProjectGuid>de1be25a-b979-47be-9d88-203f02fe2001</ProjectGuid>
<publishUrl>ftp://10.0.1.82</publishUrl>
<DeleteExistingFiles>False</DeleteExistingFiles>
<FtpPassiveMode>False</FtpPassiveMode>
<FtpPassiveMode>True</FtpPassiveMode>
<FtpSitePath>/dls-dev-my-learning-portal</FtpSitePath>
<UserName>nhsd-itspdb-nsg</UserName>
<_SavePWD>False</_SavePWD>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,10 +22,7 @@ $nhs-dark-grey: #425563;
font-size: 12px;
padding: 4px;
}
.status-tag {
overflow: hidden;
white-space: nowrap;
}

.nhsuk-details__text {
padding-bottom: 0 !important;
}
Expand Down Expand Up @@ -392,7 +389,4 @@ h1.truncate-overflow::after {
.searchable-element .nhsuk-expander {
border: none
}
.first-row td {
border-top: 2px solid #d8dde0;
}

7 changes: 7 additions & 0 deletions DigitalLearningSolutions.Web/Styles/layout.scss
Original file line number Diff line number Diff line change
Expand Up @@ -278,3 +278,10 @@ nav, .nhsuk-header__navigation, #header-navigation {
background-color: shade($color_nhsuk-red, 50%);
}
}
.first-row td {
border-top: 2px solid #d8dde0;
}
.status-tag {
overflow: hidden;
white-space: nowrap;
}
Original file line number Diff line number Diff line change
Expand Up @@ -215,3 +215,20 @@ details.nhsuk-details {
.course-card .nhsuk-expander {
border: none
}

.nhsuk-table__row:hover{
background-color: inherit;
}
.row-outer:target {
background-color: rgba(255, 249, 146, 1);
animation: fade 4s forwards;
}
@keyframes fade {
from {
background-color: rgba(255, 249, 146, 1);
}

to {
background-color: rgba(255, 249, 146, 0);
}
}
Loading