diff --git a/DigitalLearningSolutions.Data/DataServices/FrameworkDataService.cs b/DigitalLearningSolutions.Data/DataServices/FrameworkDataService.cs index 9781639ad9..c50a8c32cf 100644 --- a/DigitalLearningSolutions.Data/DataServices/FrameworkDataService.cs +++ b/DigitalLearningSolutions.Data/DataServices/FrameworkDataService.cs @@ -100,6 +100,7 @@ bool zeroBased Competency? GetFrameworkCompetencyForPreview(int frameworkCompetencyId); IEnumerable GetBulkCompetenciesForFramework(int frameworkId); + List GetFrameworkCompetencyOrder(int frameworkId, List frameworkCompetencyIds); // Comments: IEnumerable GetCommentsForFrameworkId(int frameworkId, int adminId); @@ -2429,5 +2430,16 @@ Competencies AS c INNER JOIN } } + public List GetFrameworkCompetencyOrder(int frameworkId, List frameworkCompetencyIds) + { + return connection.Query( + @"SELECT fc.ID + FROM FrameworkCompetencies AS fc INNER JOIN + FrameworkCompetencyGroups AS fcg ON fc.FrameworkCompetencyGroupID = fcg.ID + WHERE (fc.FrameworkID = @frameworkId) AND (fc.ID IN @frameworkCompetencyIds) + ORDER BY fcg.Ordering, fc.Ordering", + new { frameworkId, frameworkCompetencyIds } + ).ToList(); + } } } diff --git a/DigitalLearningSolutions.Data/Models/Frameworks/Import/CompetencyTableRow.cs b/DigitalLearningSolutions.Data/Models/Frameworks/Import/CompetencyTableRow.cs index afed88f1e6..16ea0b9e52 100644 --- a/DigitalLearningSolutions.Data/Models/Frameworks/Import/CompetencyTableRow.cs +++ b/DigitalLearningSolutions.Data/Models/Frameworks/Import/CompetencyTableRow.cs @@ -9,6 +9,7 @@ public enum RowStatus CompetencyGroupAndCompetencyInserted, CompetencyInserted, CompetencyUpdated, + CompetencyUpdatedAndReordered, CompetencyGroupInserted, CompetencyGroupUpdated, CompetencyGroupAndCompetencyUpdated, diff --git a/DigitalLearningSolutions.Data/Models/Frameworks/Import/ImportCompetenciesResult.cs b/DigitalLearningSolutions.Data/Models/Frameworks/Import/ImportCompetenciesResult.cs index 1f99a35a82..15f5136274 100644 --- a/DigitalLearningSolutions.Data/Models/Frameworks/Import/ImportCompetenciesResult.cs +++ b/DigitalLearningSolutions.Data/Models/Frameworks/Import/ImportCompetenciesResult.cs @@ -22,7 +22,8 @@ IReadOnlyCollection competencyTableRows { ProcessedCount = competencyTableRows.Count; CompetencyAddedCount = competencyTableRows.Count(dr => dr.RowStatus == RowStatus.CompetencyInserted | dr.RowStatus == RowStatus.CompetencyGroupAndCompetencyInserted); - CompetencyUpdatedCount = competencyTableRows.Count(dr => dr.RowStatus == RowStatus.CompetencyUpdated); + CompetencyUpdatedCount = competencyTableRows.Count(dr => dr.RowStatus == RowStatus.CompetencyUpdated | dr.RowStatus == RowStatus.CompetencyUpdatedAndReordered); + CompetencyReorderedCount = competencyTableRows.Count(dr => dr.RowStatus == RowStatus.CompetencyUpdatedAndReordered); GroupAddedCount = competencyTableRows.Count(dr => dr.RowStatus == RowStatus.CompetencyGroupInserted | dr.RowStatus == RowStatus.CompetencyGroupAndCompetencyInserted); SkippedCount = competencyTableRows.Count(dr => dr.RowStatus == RowStatus.Skipped); Errors = competencyTableRows.Where(dr => dr.Error.HasValue).Select(dr => (dr.RowNumber, dr.Error!.Value)); @@ -47,6 +48,7 @@ IReadOnlyCollection competencyTableRows public int ProcessedCount { get; set; } public int CompetencyAddedCount { get; set; } public int CompetencyUpdatedCount { get; set; } + public int CompetencyReorderedCount { get; set; } public int GroupAddedCount { get; set; } public int GroupUpdatedCount { get; set; } public int SkippedCount { get; set; } diff --git a/DigitalLearningSolutions.Web/Controllers/FrameworksController/ImportCompetencies.cs b/DigitalLearningSolutions.Web/Controllers/FrameworksController/ImportCompetencies.cs index ecbb7a2a9e..133efd717f 100644 --- a/DigitalLearningSolutions.Web/Controllers/FrameworksController/ImportCompetencies.cs +++ b/DigitalLearningSolutions.Web/Controllers/FrameworksController/ImportCompetencies.cs @@ -84,6 +84,7 @@ public IActionResult ImportCompleted() data.CompetenciesToProcessCount = resultsModel.ToProcessCount; data.CompetenciesToAddCount = resultsModel.CompetenciesToAddCount; data.CompetenciesToUpdateCount = resultsModel.ToUpdateOrSkipCount; + data.CompetenciesToReorderCount = results.CompetencyReorderedCount; setBulkUploadData(data); return View("Developer/Import/ImportCompleted", resultsModel); } @@ -93,6 +94,30 @@ public IActionResult ImportCompleted() return View("Developer/Import/ImportFailed"); } } + [Route("/Framework/{frameworkId}/{tabname}/Import/Ordering")] + public IActionResult ApplyCompetencyOrdering() + { + var data = GetBulkUploadData(); + if (data.CompetenciesToReorderCount > 0) + { + var model = new ApplyCompetencyOrderingViewModel(data.FrameworkId, data.FrameworkName, data.FrameworkVocubulary, data.CompetenciesToReorderCount, data.ReorderCompetenciesOption); + return View("Developer/Import/ApplyCompetencyOrdering", model); + } + return RedirectToAction("AddAssessmentQuestions", "Frameworks", new { frameworkId = data.FrameworkId, tabname = data.TabName }); + } + [HttpPost] + [Route("/Framework/{frameworkId}/{tabname}/Import/Ordering")] + public IActionResult ApplyCompetencyOrdering(int reorderCompetenciesOption) + { + var data = GetBulkUploadData(); + + if (data.ReorderCompetenciesOption != reorderCompetenciesOption) + { + data.ReorderCompetenciesOption = reorderCompetenciesOption; + setBulkUploadData(data); + } + return RedirectToAction("AddAssessmentQuestions", "Frameworks", new { frameworkId = data.FrameworkId, tabname = data.TabName }); + } [Route("/Framework/{frameworkId}/{tabname}/Import/AssessmentQuestions")] public IActionResult AddAssessmentQuestions() { @@ -119,6 +144,7 @@ public IActionResult AddAssessmentQuestions() data.PublishStatusID, data.CompetenciesToAddCount, data.CompetenciesToUpdateCount, + data.CompetenciesToReorderCount, defaultQuestions, questionSelectList ); @@ -191,6 +217,15 @@ public IActionResult AddQuestionsToWhichCompetencies(int AddAssessmentQuestionsO setBulkUploadData(data); return RedirectToAction("Summary", "Frameworks", new { frameworkId = data.FrameworkId, tabname = data.TabName }); } + [Route("CancelImport")] + public IActionResult CancelImport() + { + var data = GetBulkUploadData(); + var frameworkId = data.FrameworkId; + FileHelper.DeleteFile(webHostEnvironment, data.CompetenciesFileName); + TempData.Clear(); + return RedirectToAction("ViewFramework", new { frameworkId, tabname = "Structure" }); + } private void setupBulkUploadData(int frameworkId, int adminUserID, string competenciessFileName, string tabName, bool isNotBlank) { TempData.Clear(); diff --git a/DigitalLearningSolutions.Web/Models/BulkCompetenciesData.cs b/DigitalLearningSolutions.Web/Models/BulkCompetenciesData.cs index 738acbf9ea..2d3ce9e4ac 100644 --- a/DigitalLearningSolutions.Web/Models/BulkCompetenciesData.cs +++ b/DigitalLearningSolutions.Web/Models/BulkCompetenciesData.cs @@ -35,6 +35,8 @@ public BulkCompetenciesData(DetailFramework framework, int adminUserId, string c public int CompetenciesToProcessCount { get; set; } public int CompetenciesToAddCount { get; set; } public int CompetenciesToUpdateCount { get; set; } + public int CompetenciesToReorderCount { get; set; } + public int ReorderCompetenciesOption { get; set; } = 1; //1 = ignore order, 2 = apply order public int LastRowProcessed { get; set; } public int SubtotalCompetenciesAdded { get; set; } public int SubtotalCompetenciesUpdated { get; set; } diff --git a/DigitalLearningSolutions.Web/Services/FrameworkService.cs b/DigitalLearningSolutions.Web/Services/FrameworkService.cs index f69c07cbf6..c586fa071b 100644 --- a/DigitalLearningSolutions.Web/Services/FrameworkService.cs +++ b/DigitalLearningSolutions.Web/Services/FrameworkService.cs @@ -57,6 +57,7 @@ public interface IFrameworkService int GetMaxFrameworkCompetencyGroupID(); IEnumerable GetBulkCompetenciesForFramework(int frameworkId); + List GetFrameworkCompetencyOrder(int frameworkId, List frameworkCompetencyIds); // Assessment questions: IEnumerable GetAllCompetencyQuestions(int adminId); @@ -386,6 +387,11 @@ public IEnumerable GetBulkCompetenciesForFramework(int framework return frameworkDataService.GetBulkCompetenciesForFramework(frameworkId); } + public List GetFrameworkCompetencyOrder(int frameworkId, List frameworkCompetencyIds) + { + return frameworkDataService.GetFrameworkCompetencyOrder(frameworkId, frameworkCompetencyIds); + } + public CollaboratorNotification? GetCollaboratorNotification(int id, int invitedByAdminId) { return frameworkDataService.GetCollaboratorNotification(id, invitedByAdminId); diff --git a/DigitalLearningSolutions.Web/Services/ImportCompetenciesFromFileService.cs b/DigitalLearningSolutions.Web/Services/ImportCompetenciesFromFileService.cs index c5c82281f6..a26793b651 100644 --- a/DigitalLearningSolutions.Web/Services/ImportCompetenciesFromFileService.cs +++ b/DigitalLearningSolutions.Web/Services/ImportCompetenciesFromFileService.cs @@ -34,15 +34,15 @@ public ImportCompetenciesResult PreProcessCompetenciesTable(IXLWorkbook workbook { var table = OpenCompetenciesTable(workbook, vocabulary); var competencyRows = table.Rows().Skip(1).Select(row => new CompetencyTableRow(table, row)).ToList(); - var existingCompetencies = frameworkService.GetBulkCompetenciesForFramework(frameworkId); - var existingIds = existingCompetencies.Select(bc => (int)bc.ID).ToList(); + var newCompetencyIds = competencyRows.Select(row => row.ID ?? 0).ToList(); + var existingIds = frameworkService.GetFrameworkCompetencyOrder(frameworkId, newCompetencyIds); foreach (var competencyRow in competencyRows) { - PreProcessCompetencyRow(competencyRow, existingIds); + PreProcessCompetencyRow(competencyRow, newCompetencyIds, existingIds); } return new ImportCompetenciesResult(competencyRows); } - private void PreProcessCompetencyRow(CompetencyTableRow competencyRow, List existingIds) + private void PreProcessCompetencyRow(CompetencyTableRow competencyRow, List newIds, List existingIds) { if (competencyRow.ID == null) { @@ -50,13 +50,23 @@ private void PreProcessCompetencyRow(CompetencyTableRow competencyRow, List } else { - if (!existingIds.Contains((int)(competencyRow?.ID))) + var id = (int)(competencyRow?.ID); + if (!existingIds.Contains(id)) { competencyRow.RowStatus = RowStatus.InvalidId; } else { - competencyRow.RowStatus = RowStatus.CompetencyUpdated; + int originalIndex = existingIds.IndexOf(id); + int newIndex = newIds.IndexOf(id); + if(originalIndex == newIndex) + { + competencyRow.RowStatus = RowStatus.CompetencyUpdated; + } + else + { + competencyRow.RowStatus = RowStatus.CompetencyUpdatedAndReordered; + } } } competencyRow.Validate(); diff --git a/DigitalLearningSolutions.Web/ViewModels/Frameworks/Import/AddAssessmentQuestionsViewModel.cs b/DigitalLearningSolutions.Web/ViewModels/Frameworks/Import/AddAssessmentQuestionsViewModel.cs index bfd1cf3d12..204f7e49e2 100644 --- a/DigitalLearningSolutions.Web/ViewModels/Frameworks/Import/AddAssessmentQuestionsViewModel.cs +++ b/DigitalLearningSolutions.Web/ViewModels/Frameworks/Import/AddAssessmentQuestionsViewModel.cs @@ -12,6 +12,7 @@ public class AddAssessmentQuestionsViewModel( int publishStatusId, int newCompetencies, int existingCompetencies, + int competenciesToReorderCount, IEnumerable defaultQuestions, SelectList questionSelectList ) : AddAssessmentQuestionsFormData @@ -23,6 +24,7 @@ SelectList questionSelectList public int PublishStatusID { get; set; } = publishStatusId; public int NewCompetencies { get; set; } = newCompetencies; public int ExistingCompetencies { get; set; } = existingCompetencies; + public int CompetenciesToReorderCount { get; set; } = competenciesToReorderCount; public IEnumerable? DefaultQuestions { get; set; } = defaultQuestions; public SelectList? QuestionSelectList { get; set; } = questionSelectList; } diff --git a/DigitalLearningSolutions.Web/ViewModels/Frameworks/Import/AddQuestionsToWhichCompetenciesViewModel.cs b/DigitalLearningSolutions.Web/ViewModels/Frameworks/Import/AddQuestionsToWhichCompetenciesViewModel.cs index d6cbae84ca..fa86ccc30a 100644 --- a/DigitalLearningSolutions.Web/ViewModels/Frameworks/Import/AddQuestionsToWhichCompetenciesViewModel.cs +++ b/DigitalLearningSolutions.Web/ViewModels/Frameworks/Import/AddQuestionsToWhichCompetenciesViewModel.cs @@ -37,5 +37,6 @@ public AddQuestionsToWhichCompetenciesViewModel public int CompetenciesToProcessCount { get; set; } public int CompetenciesToAddCount { get; set; } public int CompetenciesToUpdateCount { get; set; } + } } diff --git a/DigitalLearningSolutions.Web/ViewModels/Frameworks/Import/ApplyCompetencyOrderingViewModel.cs b/DigitalLearningSolutions.Web/ViewModels/Frameworks/Import/ApplyCompetencyOrderingViewModel.cs new file mode 100644 index 0000000000..ee912de97f --- /dev/null +++ b/DigitalLearningSolutions.Web/ViewModels/Frameworks/Import/ApplyCompetencyOrderingViewModel.cs @@ -0,0 +1,30 @@ +using DigitalLearningSolutions.Web.Helpers; + +namespace DigitalLearningSolutions.Web.ViewModels.Frameworks.Import +{ + public class ApplyCompetencyOrderingViewModel + { + public ApplyCompetencyOrderingViewModel + ( + int frameworkId, + string frameworkName, + string frameworkVocabulary, + int competenciesToReorderCount, + int reorderCompetenciesOption + ) + { + FrameworkID = frameworkId; + FrameworkName = frameworkName; + FrameworkVocabularySingular = FrameworkVocabularyHelper.VocabularySingular(frameworkVocabulary); + FrameworkVocabularyPlural = FrameworkVocabularyHelper.VocabularyPlural(frameworkVocabulary); + CompetenciesToReorderCount = competenciesToReorderCount; + ReorderCompetenciesOption = reorderCompetenciesOption; + } + public int FrameworkID { get; set; } + public string FrameworkName { get; set; } + public string FrameworkVocabularySingular { get; set; } + public string FrameworkVocabularyPlural { get; set; } + public int ReorderCompetenciesOption { get; set; } = 1; //1 = ignore order, 2 = apply order + public int CompetenciesToReorderCount { get; set; } + } +} diff --git a/DigitalLearningSolutions.Web/ViewModels/Frameworks/Import/ImportCompetenciesPreProcessViewModel.cs b/DigitalLearningSolutions.Web/ViewModels/Frameworks/Import/ImportCompetenciesPreProcessViewModel.cs index 343ad1a74c..96b7935ea3 100644 --- a/DigitalLearningSolutions.Web/ViewModels/Frameworks/Import/ImportCompetenciesPreProcessViewModel.cs +++ b/DigitalLearningSolutions.Web/ViewModels/Frameworks/Import/ImportCompetenciesPreProcessViewModel.cs @@ -17,6 +17,7 @@ public ImportCompetenciesPreProcessViewModel(ImportCompetenciesResult bulkCompet FrameworkVocabularyPlural = FrameworkVocabularyHelper.VocabularyPlural(bulkCompetenciesData.FrameworkVocubulary); ToProcessCount = bulkCompetenciesResult.ProcessedCount; CompetenciesToAddCount = bulkCompetenciesResult.CompetencyAddedCount; + CompetenciesToReorderCount = bulkCompetenciesResult.CompetencyReorderedCount; ToUpdateOrSkipCount = bulkCompetenciesResult.CompetencyUpdatedCount; Errors = bulkCompetenciesResult.Errors.Select(x => (x.RowNumber, MapReasonToErrorMessage(x.Reason, FrameworkVocabularyHelper.VocabularySingular(bulkCompetenciesData.FrameworkVocubulary)))); FlagCount = bulkCompetenciesResult.FlagCount; @@ -31,6 +32,7 @@ public ImportCompetenciesPreProcessViewModel(ImportCompetenciesResult bulkCompet public int ErrorCount => Errors.Count(); public int ToProcessCount { get; set; } public int CompetenciesToAddCount { get; set; } + public int CompetenciesToReorderCount { get; set; } public int ToUpdateOrSkipCount { get; set; } public string? ImportFile { get; set; } public bool IsNotBlank { get; set; } diff --git a/DigitalLearningSolutions.Web/Views/Frameworks/Developer/Import/AddAssessmentQuestions.cshtml b/DigitalLearningSolutions.Web/Views/Frameworks/Developer/Import/AddAssessmentQuestions.cshtml index ae9cdec7c2..9e6c443d05 100644 --- a/DigitalLearningSolutions.Web/Views/Frameworks/Developer/Import/AddAssessmentQuestions.cshtml +++ b/DigitalLearningSolutions.Web/Views/Frameworks/Developer/Import/AddAssessmentQuestions.cshtml @@ -96,9 +96,10 @@ + Back - + diff --git a/DigitalLearningSolutions.Web/Views/Frameworks/Developer/Import/AddQuestionsToWhichCompetencies.cshtml b/DigitalLearningSolutions.Web/Views/Frameworks/Developer/Import/AddQuestionsToWhichCompetencies.cshtml index bb5a3b3a5f..0dcf3bc1f2 100644 --- a/DigitalLearningSolutions.Web/Views/Frameworks/Developer/Import/AddQuestionsToWhichCompetencies.cshtml +++ b/DigitalLearningSolutions.Web/Views/Frameworks/Developer/Import/AddQuestionsToWhichCompetencies.cshtml @@ -29,7 +29,7 @@
-
+

@@ -81,7 +81,7 @@ Back - +

diff --git a/DigitalLearningSolutions.Web/Views/Frameworks/Developer/Import/ApplyCompetencyOrdering.cshtml b/DigitalLearningSolutions.Web/Views/Frameworks/Developer/Import/ApplyCompetencyOrdering.cshtml new file mode 100644 index 0000000000..398343f461 --- /dev/null +++ b/DigitalLearningSolutions.Web/Views/Frameworks/Developer/Import/ApplyCompetencyOrdering.cshtml @@ -0,0 +1,75 @@ +@using DigitalLearningSolutions.Web.Extensions +@using DigitalLearningSolutions.Web.ViewModels.Frameworks.Import + +@model ApplyCompetencyOrderingViewModel + +@{ + ViewData["Application"] = "Framework Service"; + ViewData["HeaderPathName"] = "Framework Service"; + var errorHasOccurred = !ViewData.ModelState.IsValid; + ViewData["Title"] = errorHasOccurred ? "Error: Add Assessment Questions" : "Add Assessment Questions"; + var cancelLinkData = Html.GetRouteValues(); +} + +@section NavMenuItems { + +} +@section NavBreadcrumbs { + +} +
+
+
+
+
+ +

+ Apply @Model.FrameworkVocabularySingular.ToLower() sequence changes? +

+
+
+ Your uploaded file includes changes to the sequence of existing @Model.FrameworkVocabularyPlural.ToLower(). Choose whether to store the changes to @Model.FrameworkVocabularySingular.ToLower() sequence during update. +
+
+ Select an option +
+
+
+
+ + +
+ @Model.FrameworkVocabularyPlural will be updated if they have changed but there sequence/order in the framework will not change. +
+
+
+ + +
+ The sequence of @Model.FrameworkVocabularyPlural.ToLower() in the framework will be changed to reflect the order in the sheet during processing. +
+
+
+
+ +
+ Back + +
+ +
+
+
diff --git a/DigitalLearningSolutions.Web/Views/Frameworks/Developer/Import/ImportCompleted.cshtml b/DigitalLearningSolutions.Web/Views/Frameworks/Developer/Import/ImportCompleted.cshtml index 4a967c11fb..b127e53979 100644 --- a/DigitalLearningSolutions.Web/Views/Frameworks/Developer/Import/ImportCompleted.cshtml +++ b/DigitalLearningSolutions.Web/Views/Frameworks/Developer/Import/ImportCompleted.cshtml @@ -32,27 +32,34 @@

@(Model.ErrorCount == 0 ? "Your file is error free and ready to be processed. Check the information below looks, correct before processing" : "Your file contains the following, including some errors:")

    -
  • @Model.ToProcessCount @(Model.ToProcessCount == 1 ? "row" : "rows") to process
  • -
  • @Model.CompetenciesToAddCount new @(Model.CompetenciesToAddCount == 1 ? Model.FrameworkVocabularySingular.ToLower() : Model.FrameworkVocabularyPlural.ToLower()) to add
  • -
  • @Model.ToUpdateOrSkipCount @Model.FrameworkVocabularySingular.ToLower() @(Model.ToUpdateOrSkipCount == 1 ? "record" : "records") to update (or skip if unchanged)
  • -
  • In @Model.CompetencyGroupCount @Model.FrameworkVocabularySingular.ToLower() groups
  • -
  • With a total of @Model.FlagCount flags assigned to @Model.FrameworkVocabularyPlural.ToLower() (@Model.DistinctFlagsCount distinct flags)
  • +
  • @Model.ToProcessCount @(Model.ToProcessCount == 1 ? "row" : "rows") uploaded
  • @if (Model.ErrorCount > 0) {
  • @Model.ErrorCount @(Model.ErrorCount == 1 ? "row" : "rows") containing errors that cannot be processed
  • } else { +
  • @Model.CompetenciesToAddCount new @(Model.CompetenciesToAddCount == 1 ? Model.FrameworkVocabularySingular.ToLower() : Model.FrameworkVocabularyPlural.ToLower()) to add
  • +
  • @Model.ToUpdateOrSkipCount @Model.FrameworkVocabularySingular.ToLower() @(Model.ToUpdateOrSkipCount == 1 ? "record" : "records") to update (or skip if unchanged)
  • +
  • In @Model.CompetencyGroupCount @Model.FrameworkVocabularySingular.ToLower() groups
  • +
  • With @Model.FlagCount flags assigned to @Model.FrameworkVocabularyPlural.ToLower() (@Model.DistinctFlagsCount distinct flags)
  • + @if (Model.CompetenciesToReorderCount > 0) + { + +
  • + @Model.CompetenciesToReorderCount existing @Model.FrameworkVocabularySingular.ToLower() @(Model.CompetenciesToReorderCount == 1 ? "record" : "records") have changed sequence in your uploaded sheet. You can choose whether to fix them in the new order next. +
  • + }
  • No errors
  • }
@if (Model.ErrorCount == 0) { - Continue + Continue } else { -

Check the information below. You will need fix these errors before continuing or remove the rows with errors from your spreadsheet:

+

Check the information below. You will need to fix these errors before continuing or remove the rows with errors from your spreadsheet:

Error: @Model.ErrorCount @Model.FrameworkVocabularySingular.ToLower() @(Model.ErrorCount == 1 ? "row" : "rows") contain errors and cannot be processed @@ -85,7 +92,7 @@ } - +
diff --git a/DigitalLearningSolutions.Web/Views/Frameworks/Developer/Import/Index.cshtml b/DigitalLearningSolutions.Web/Views/Frameworks/Developer/Import/Index.cshtml index a11a391b24..78a5fb95bd 100644 --- a/DigitalLearningSolutions.Web/Views/Frameworks/Developer/Import/Index.cshtml +++ b/DigitalLearningSolutions.Web/Views/Frameworks/Developer/Import/Index.cshtml @@ -110,7 +110,7 @@ - +