Skip to content

Commit 9190fae

Browse files
authored
Merge pull request #3050 from TechnologyEnhancedLearning/Develop/Features/TD-5220-ReorderCompetenciesPage
TD-5220 reorder competencies option page
2 parents 28853e3 + 42a1361 commit 9190fae

File tree

16 files changed

+205
-19
lines changed

16 files changed

+205
-19
lines changed

DigitalLearningSolutions.Data/DataServices/FrameworkDataService.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,7 @@ bool zeroBased
100100

101101
Competency? GetFrameworkCompetencyForPreview(int frameworkCompetencyId);
102102
IEnumerable<BulkCompetency> GetBulkCompetenciesForFramework(int frameworkId);
103+
List<int> GetFrameworkCompetencyOrder(int frameworkId, List<int> frameworkCompetencyIds);
103104

104105
// Comments:
105106
IEnumerable<CommentReplies> GetCommentsForFrameworkId(int frameworkId, int adminId);
@@ -2429,5 +2430,16 @@ Competencies AS c INNER JOIN
24292430
}
24302431

24312432
}
2433+
public List<int> GetFrameworkCompetencyOrder(int frameworkId, List<int> frameworkCompetencyIds)
2434+
{
2435+
return connection.Query<int>(
2436+
@"SELECT fc.ID
2437+
FROM FrameworkCompetencies AS fc INNER JOIN
2438+
FrameworkCompetencyGroups AS fcg ON fc.FrameworkCompetencyGroupID = fcg.ID
2439+
WHERE (fc.FrameworkID = @frameworkId) AND (fc.ID IN @frameworkCompetencyIds)
2440+
ORDER BY fcg.Ordering, fc.Ordering",
2441+
new { frameworkId, frameworkCompetencyIds }
2442+
).ToList();
2443+
}
24322444
}
24332445
}

DigitalLearningSolutions.Data/Models/Frameworks/Import/CompetencyTableRow.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ public enum RowStatus
99
CompetencyGroupAndCompetencyInserted,
1010
CompetencyInserted,
1111
CompetencyUpdated,
12+
CompetencyUpdatedAndReordered,
1213
CompetencyGroupInserted,
1314
CompetencyGroupUpdated,
1415
CompetencyGroupAndCompetencyUpdated,

DigitalLearningSolutions.Data/Models/Frameworks/Import/ImportCompetenciesResult.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,8 @@ IReadOnlyCollection<CompetencyTableRow> competencyTableRows
2222
{
2323
ProcessedCount = competencyTableRows.Count;
2424
CompetencyAddedCount = competencyTableRows.Count(dr => dr.RowStatus == RowStatus.CompetencyInserted | dr.RowStatus == RowStatus.CompetencyGroupAndCompetencyInserted);
25-
CompetencyUpdatedCount = competencyTableRows.Count(dr => dr.RowStatus == RowStatus.CompetencyUpdated);
25+
CompetencyUpdatedCount = competencyTableRows.Count(dr => dr.RowStatus == RowStatus.CompetencyUpdated | dr.RowStatus == RowStatus.CompetencyUpdatedAndReordered);
26+
CompetencyReorderedCount = competencyTableRows.Count(dr => dr.RowStatus == RowStatus.CompetencyUpdatedAndReordered);
2627
GroupAddedCount = competencyTableRows.Count(dr => dr.RowStatus == RowStatus.CompetencyGroupInserted | dr.RowStatus == RowStatus.CompetencyGroupAndCompetencyInserted);
2728
SkippedCount = competencyTableRows.Count(dr => dr.RowStatus == RowStatus.Skipped);
2829
Errors = competencyTableRows.Where(dr => dr.Error.HasValue).Select(dr => (dr.RowNumber, dr.Error!.Value));
@@ -47,6 +48,7 @@ IReadOnlyCollection<CompetencyTableRow> competencyTableRows
4748
public int ProcessedCount { get; set; }
4849
public int CompetencyAddedCount { get; set; }
4950
public int CompetencyUpdatedCount { get; set; }
51+
public int CompetencyReorderedCount { get; set; }
5052
public int GroupAddedCount { get; set; }
5153
public int GroupUpdatedCount { get; set; }
5254
public int SkippedCount { get; set; }

DigitalLearningSolutions.Web/Controllers/FrameworksController/ImportCompetencies.cs

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ public IActionResult ImportCompleted()
8484
data.CompetenciesToProcessCount = resultsModel.ToProcessCount;
8585
data.CompetenciesToAddCount = resultsModel.CompetenciesToAddCount;
8686
data.CompetenciesToUpdateCount = resultsModel.ToUpdateOrSkipCount;
87+
data.CompetenciesToReorderCount = results.CompetencyReorderedCount;
8788
setBulkUploadData(data);
8889
return View("Developer/Import/ImportCompleted", resultsModel);
8990
}
@@ -93,6 +94,30 @@ public IActionResult ImportCompleted()
9394
return View("Developer/Import/ImportFailed");
9495
}
9596
}
97+
[Route("/Framework/{frameworkId}/{tabname}/Import/Ordering")]
98+
public IActionResult ApplyCompetencyOrdering()
99+
{
100+
var data = GetBulkUploadData();
101+
if (data.CompetenciesToReorderCount > 0)
102+
{
103+
var model = new ApplyCompetencyOrderingViewModel(data.FrameworkId, data.FrameworkName, data.FrameworkVocubulary, data.CompetenciesToReorderCount, data.ReorderCompetenciesOption);
104+
return View("Developer/Import/ApplyCompetencyOrdering", model);
105+
}
106+
return RedirectToAction("AddAssessmentQuestions", "Frameworks", new { frameworkId = data.FrameworkId, tabname = data.TabName });
107+
}
108+
[HttpPost]
109+
[Route("/Framework/{frameworkId}/{tabname}/Import/Ordering")]
110+
public IActionResult ApplyCompetencyOrdering(int reorderCompetenciesOption)
111+
{
112+
var data = GetBulkUploadData();
113+
114+
if (data.ReorderCompetenciesOption != reorderCompetenciesOption)
115+
{
116+
data.ReorderCompetenciesOption = reorderCompetenciesOption;
117+
setBulkUploadData(data);
118+
}
119+
return RedirectToAction("AddAssessmentQuestions", "Frameworks", new { frameworkId = data.FrameworkId, tabname = data.TabName });
120+
}
96121
[Route("/Framework/{frameworkId}/{tabname}/Import/AssessmentQuestions")]
97122
public IActionResult AddAssessmentQuestions()
98123
{
@@ -119,6 +144,7 @@ public IActionResult AddAssessmentQuestions()
119144
data.PublishStatusID,
120145
data.CompetenciesToAddCount,
121146
data.CompetenciesToUpdateCount,
147+
data.CompetenciesToReorderCount,
122148
defaultQuestions,
123149
questionSelectList
124150
);
@@ -191,6 +217,15 @@ public IActionResult AddQuestionsToWhichCompetencies(int AddAssessmentQuestionsO
191217
setBulkUploadData(data);
192218
return RedirectToAction("Summary", "Frameworks", new { frameworkId = data.FrameworkId, tabname = data.TabName });
193219
}
220+
[Route("CancelImport")]
221+
public IActionResult CancelImport()
222+
{
223+
var data = GetBulkUploadData();
224+
var frameworkId = data.FrameworkId;
225+
FileHelper.DeleteFile(webHostEnvironment, data.CompetenciesFileName);
226+
TempData.Clear();
227+
return RedirectToAction("ViewFramework", new { frameworkId, tabname = "Structure" });
228+
}
194229
private void setupBulkUploadData(int frameworkId, int adminUserID, string competenciessFileName, string tabName, bool isNotBlank)
195230
{
196231
TempData.Clear();

DigitalLearningSolutions.Web/Models/BulkCompetenciesData.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@ public BulkCompetenciesData(DetailFramework framework, int adminUserId, string c
3535
public int CompetenciesToProcessCount { get; set; }
3636
public int CompetenciesToAddCount { get; set; }
3737
public int CompetenciesToUpdateCount { get; set; }
38+
public int CompetenciesToReorderCount { get; set; }
39+
public int ReorderCompetenciesOption { get; set; } = 1; //1 = ignore order, 2 = apply order
3840
public int LastRowProcessed { get; set; }
3941
public int SubtotalCompetenciesAdded { get; set; }
4042
public int SubtotalCompetenciesUpdated { get; set; }

DigitalLearningSolutions.Web/Services/FrameworkService.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ public interface IFrameworkService
5757

5858
int GetMaxFrameworkCompetencyGroupID();
5959
IEnumerable<BulkCompetency> GetBulkCompetenciesForFramework(int frameworkId);
60+
List<int> GetFrameworkCompetencyOrder(int frameworkId, List<int> frameworkCompetencyIds);
6061

6162
// Assessment questions:
6263
IEnumerable<AssessmentQuestion> GetAllCompetencyQuestions(int adminId);
@@ -386,6 +387,11 @@ public IEnumerable<BulkCompetency> GetBulkCompetenciesForFramework(int framework
386387
return frameworkDataService.GetBulkCompetenciesForFramework(frameworkId);
387388
}
388389

390+
public List<int> GetFrameworkCompetencyOrder(int frameworkId, List<int> frameworkCompetencyIds)
391+
{
392+
return frameworkDataService.GetFrameworkCompetencyOrder(frameworkId, frameworkCompetencyIds);
393+
}
394+
389395
public CollaboratorNotification? GetCollaboratorNotification(int id, int invitedByAdminId)
390396
{
391397
return frameworkDataService.GetCollaboratorNotification(id, invitedByAdminId);

DigitalLearningSolutions.Web/Services/ImportCompetenciesFromFileService.cs

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -34,29 +34,39 @@ public ImportCompetenciesResult PreProcessCompetenciesTable(IXLWorkbook workbook
3434
{
3535
var table = OpenCompetenciesTable(workbook, vocabulary);
3636
var competencyRows = table.Rows().Skip(1).Select(row => new CompetencyTableRow(table, row)).ToList();
37-
var existingCompetencies = frameworkService.GetBulkCompetenciesForFramework(frameworkId);
38-
var existingIds = existingCompetencies.Select(bc => (int)bc.ID).ToList();
37+
var newCompetencyIds = competencyRows.Select(row => row.ID ?? 0).ToList();
38+
var existingIds = frameworkService.GetFrameworkCompetencyOrder(frameworkId, newCompetencyIds);
3939
foreach (var competencyRow in competencyRows)
4040
{
41-
PreProcessCompetencyRow(competencyRow, existingIds);
41+
PreProcessCompetencyRow(competencyRow, newCompetencyIds, existingIds);
4242
}
4343
return new ImportCompetenciesResult(competencyRows);
4444
}
45-
private void PreProcessCompetencyRow(CompetencyTableRow competencyRow, List<int> existingIds)
45+
private void PreProcessCompetencyRow(CompetencyTableRow competencyRow, List<int> newIds, List<int> existingIds)
4646
{
4747
if (competencyRow.ID == null)
4848
{
4949
competencyRow.RowStatus = RowStatus.CompetencyInserted;
5050
}
5151
else
5252
{
53-
if (!existingIds.Contains((int)(competencyRow?.ID)))
53+
var id = (int)(competencyRow?.ID);
54+
if (!existingIds.Contains(id))
5455
{
5556
competencyRow.RowStatus = RowStatus.InvalidId;
5657
}
5758
else
5859
{
59-
competencyRow.RowStatus = RowStatus.CompetencyUpdated;
60+
int originalIndex = existingIds.IndexOf(id);
61+
int newIndex = newIds.IndexOf(id);
62+
if(originalIndex == newIndex)
63+
{
64+
competencyRow.RowStatus = RowStatus.CompetencyUpdated;
65+
}
66+
else
67+
{
68+
competencyRow.RowStatus = RowStatus.CompetencyUpdatedAndReordered;
69+
}
6070
}
6171
}
6272
competencyRow.Validate();

DigitalLearningSolutions.Web/ViewModels/Frameworks/Import/AddAssessmentQuestionsViewModel.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ public class AddAssessmentQuestionsViewModel(
1212
int publishStatusId,
1313
int newCompetencies,
1414
int existingCompetencies,
15+
int competenciesToReorderCount,
1516
IEnumerable<AssessmentQuestion> defaultQuestions,
1617
SelectList questionSelectList
1718
) : AddAssessmentQuestionsFormData
@@ -23,6 +24,7 @@ SelectList questionSelectList
2324
public int PublishStatusID { get; set; } = publishStatusId;
2425
public int NewCompetencies { get; set; } = newCompetencies;
2526
public int ExistingCompetencies { get; set; } = existingCompetencies;
27+
public int CompetenciesToReorderCount { get; set; } = competenciesToReorderCount;
2628
public IEnumerable<AssessmentQuestion>? DefaultQuestions { get; set; } = defaultQuestions;
2729
public SelectList? QuestionSelectList { get; set; } = questionSelectList;
2830
}

DigitalLearningSolutions.Web/ViewModels/Frameworks/Import/AddQuestionsToWhichCompetenciesViewModel.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,5 +37,6 @@ public AddQuestionsToWhichCompetenciesViewModel
3737
public int CompetenciesToProcessCount { get; set; }
3838
public int CompetenciesToAddCount { get; set; }
3939
public int CompetenciesToUpdateCount { get; set; }
40+
4041
}
4142
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
using DigitalLearningSolutions.Web.Helpers;
2+
3+
namespace DigitalLearningSolutions.Web.ViewModels.Frameworks.Import
4+
{
5+
public class ApplyCompetencyOrderingViewModel
6+
{
7+
public ApplyCompetencyOrderingViewModel
8+
(
9+
int frameworkId,
10+
string frameworkName,
11+
string frameworkVocabulary,
12+
int competenciesToReorderCount,
13+
int reorderCompetenciesOption
14+
)
15+
{
16+
FrameworkID = frameworkId;
17+
FrameworkName = frameworkName;
18+
FrameworkVocabularySingular = FrameworkVocabularyHelper.VocabularySingular(frameworkVocabulary);
19+
FrameworkVocabularyPlural = FrameworkVocabularyHelper.VocabularyPlural(frameworkVocabulary);
20+
CompetenciesToReorderCount = competenciesToReorderCount;
21+
ReorderCompetenciesOption = reorderCompetenciesOption;
22+
}
23+
public int FrameworkID { get; set; }
24+
public string FrameworkName { get; set; }
25+
public string FrameworkVocabularySingular { get; set; }
26+
public string FrameworkVocabularyPlural { get; set; }
27+
public int ReorderCompetenciesOption { get; set; } = 1; //1 = ignore order, 2 = apply order
28+
public int CompetenciesToReorderCount { get; set; }
29+
}
30+
}

0 commit comments

Comments
 (0)