diff --git a/Management.Test/Markdown/AssignmentMarkdownTests.cs b/Management.Test/Markdown/AssignmentMarkdownTests.cs index ae9649a..11d37e3 100644 --- a/Management.Test/Markdown/AssignmentMarkdownTests.cs +++ b/Management.Test/Markdown/AssignmentMarkdownTests.cs @@ -1,11 +1,13 @@ +using LocalModels; + public class AssignmentMarkdownTests { [Test] public void TestCanParseAssignmentSettings() { - var assignmentMarkdown = @" + var assignment = new LocalAssignment() + { - - "; + }; } } \ No newline at end of file diff --git a/Management.Web/Shared/Components/AssignmentForm/AssignmentDescriptionEditor.razor b/Management.Web/Shared/Components/AssignmentForm/AssignmentDescriptionEditor.razor index 1114ff5..305a8b4 100644 --- a/Management.Web/Shared/Components/AssignmentForm/AssignmentDescriptionEditor.razor +++ b/Management.Web/Shared/Components/AssignmentForm/AssignmentDescriptionEditor.razor @@ -44,6 +44,7 @@ private void handleNewDescription(string newDescription) { + description = newDescription; if (newDescription != string.Empty) { descriptionForPreview = newDescription; @@ -56,6 +57,7 @@ assignmentContext.SaveAssignment(newAssignment); } } + StateHasChanged(); } private MarkupString preview { get => (MarkupString)Markdown.ToHtml(descriptionForPreview); } @@ -76,8 +78,8 @@ -
- @(preview) +
+ @((MarkupString)Markdown.ToHtml(descriptionForPreview))
} \ No newline at end of file diff --git a/Management/Features/Configuration/CoursePlanner.cs b/Management/Features/Configuration/CoursePlanner.cs index f64b48c..6f524f8 100644 --- a/Management/Features/Configuration/CoursePlanner.cs +++ b/Management/Features/Configuration/CoursePlanner.cs @@ -134,12 +134,6 @@ public class CoursePlanner LoadingCanvasData = true; StateHasChanged?.Invoke(); - LocalCourse = LocalCourse.deleteCanvasIdsThatNoLongerExist( - canvasModules, - canvasAssignments, - canvasAssignmentGroups, - canvasQuizzes - ); var canvasId = LocalCourse.Settings.CanvasId ?? throw new Exception("no course canvas id to sync with canvas"); @@ -170,7 +164,7 @@ public class CoursePlanner CanvasModulesItems = await canvas.Modules.GetAllModulesItems(canvasId, CanvasModules); - await LocalCourse.SyncModuleItemsWithCanvas(canvasId, CanvasModulesItems, canvas); + await LocalCourse.SyncModuleItemsWithCanvas(canvasId, CanvasModulesItems, canvas, CanvasAssignments); CanvasModulesItems = await canvas.Modules.GetAllModulesItems(canvasId, CanvasModules); LoadingCanvasData = false; diff --git a/Management/Features/Configuration/CoursePlannerValidationExtensions.cs b/Management/Features/Configuration/CoursePlannerValidationExtensions.cs index 8b9527d..286dcb7 100644 --- a/Management/Features/Configuration/CoursePlannerValidationExtensions.cs +++ b/Management/Features/Configuration/CoursePlannerValidationExtensions.cs @@ -45,83 +45,6 @@ public static class CoursePlannerExtensions }; } - public static LocalCourse deleteCanvasIdsThatNoLongerExist( - this LocalCourse localCourse, - IEnumerable canvasModules, - IEnumerable canvasAssignments, - IEnumerable canvasAssignmentGroups, - IEnumerable canvasQuizzes - ) - { - Console.WriteLine("checking canvas ids still exist"); - - var correctedModules = localCourse.Modules - .Select((m) => m.validateCanvasIds(canvasModules, canvasAssignments, canvasQuizzes)) - .ToArray(); - - var canvasAssignmentGroupIds = canvasAssignmentGroups.Select(g => g.Id).ToArray(); - var correctAssignmentGroups = localCourse.Settings.AssignmentGroups.Select( - g => - { - var groupCanvasId = g.CanvasId ?? 0; - return canvasAssignmentGroupIds.Contains(groupCanvasId) - ? g - : g with { CanvasId = null }; - } - ).ToArray(); - - return localCourse with - { - Modules = correctedModules, - Settings = localCourse.Settings with - { - AssignmentGroups = correctAssignmentGroups, - } - }; - } - - private static LocalModule validateCanvasIds( - this LocalModule module, - IEnumerable canvasModules, - IEnumerable canvasAssignments, - IEnumerable canvasQuizzes - ) - { - var moduleIdInCanvas = canvasModules.FirstOrDefault(m => m.Name == module.Name) != null; - var moduleWithAssignments = module with - { - Assignments = module.Assignments - .Select((a) => a.validateAssignmentForCanvasId(canvasAssignments)) - .ToArray(), - }; - - if (!moduleIdInCanvas) - { - Console.WriteLine( - $"no id in canvas for module, removing old canvas id: {moduleWithAssignments.Name}" - ); - return moduleWithAssignments; - } - return moduleWithAssignments; - } - - private static LocalAssignment validateAssignmentForCanvasId( - this LocalAssignment assignment, - IEnumerable canvasAssignments - ) - { - var assignmentIdInCanvas = - canvasAssignments.FirstOrDefault(ca => ca.Id == assignment.CanvasId) != null; - if (!assignmentIdInCanvas) - { - Console.WriteLine( - $"no id in canvas for assignment, removing old canvas id: {assignment.Name}" - ); - return assignment with { CanvasId = null }; - } - return assignment; - } - public static LocalAssignment validateSubmissionTypes(this LocalAssignment assignment) { var containsDiscussion = diff --git a/Management/Features/Configuration/Synchronization/AssignmentSyncronizationExtensions.cs b/Management/Features/Configuration/Synchronization/AssignmentSyncronizationExtensions.cs index b2b6405..43fb509 100644 --- a/Management/Features/Configuration/Synchronization/AssignmentSyncronizationExtensions.cs +++ b/Management/Features/Configuration/Synchronization/AssignmentSyncronizationExtensions.cs @@ -22,7 +22,7 @@ public static partial class AssignmentSyncronizationExtensions { var canvasAssignment = canvasAssignments.FirstOrDefault( - ca => ca.Id == localAssignment.CanvasId + ca => ca.Name == localAssignment.Name ); string localHtmlDescription = localAssignment.GetDescriptionHtml(); @@ -61,7 +61,7 @@ public static partial class AssignmentSyncronizationExtensions { await canvas.Assignments.Update( courseId: canvasCourseId, - canvasAssignmentId: (ulong) localAssignment.CanvasId, + canvasAssignmentId: canvasAssignment.Id, localAssignment, localHtmlDescription, (ulong)canvasAssignmentGroupId @@ -164,8 +164,8 @@ public static partial class AssignmentSyncronizationExtensions var submissionTypesSame = canvasAssignment.SubmissionTypes.SequenceEqual( localAssignment.SubmissionTypes.Select(t => t.ToString()) ); - var assignmentGroupSame = - canvasAssignmentGroupId != null + var assignmentGroupSame = + canvasAssignmentGroupId != null && canvasAssignmentGroupId == canvasAssignment.AssignmentGroupId; if (!quiet) @@ -223,7 +223,7 @@ public static partial class AssignmentSyncronizationExtensions Console.WriteLine( $"Submission Types different for {localAssignment.Name}, local: {JsonSerializer.Serialize(localAssignment.SubmissionTypes.Select(t => t.ToString()))}, in canvas {JsonSerializer.Serialize(canvasAssignment.SubmissionTypes)}" ); - if(!assignmentGroupSame) + if (!assignmentGroupSame) Console.WriteLine( $"Canvas assignment group ids different for {localAssignment.Name}, local: {canvasAssignmentGroupId}, in canvas {canvasAssignment.AssignmentGroupId}" ); diff --git a/Management/Features/Configuration/Synchronization/ModuleSyncronizationExtensions.cs b/Management/Features/Configuration/Synchronization/ModuleSyncronizationExtensions.cs index 48e918c..021ee0a 100644 --- a/Management/Features/Configuration/Synchronization/ModuleSyncronizationExtensions.cs +++ b/Management/Features/Configuration/Synchronization/ModuleSyncronizationExtensions.cs @@ -1,3 +1,4 @@ +using CanvasModel.Assignments; using CanvasModel.Modules; using LocalModels; using Management.Services.Canvas; @@ -95,24 +96,25 @@ public static partial class ModuleSyncronizationExtensions ulong canvasId, CanvasModule canvasModule, Dictionary> canvasModulesItems, - CanvasService canvas + CanvasService canvas, + IEnumerable canvasAssignments ) { var anyUpdated = false; foreach (var localAssignment in localModule.Assignments.Where(a => a.DueAt > DateTime.Now)) { - var canvasModuleItemContentIds = canvasModulesItems[canvasModule].Select(i => i.ContentId); - if (!canvasModuleItemContentIds.Contains(localAssignment.CanvasId)) + var canvasModuleItemContentNames = canvasModulesItems[canvasModule].Select(i => i.Title); + if (!canvasModuleItemContentNames.Contains(localAssignment.Name)) { - var canvasAssignmentId = - localAssignment.CanvasId - ?? throw new Exception("cannot create module item if assignment does not have canvas id"); + var canvasAssignment = canvasAssignments.FirstOrDefault(a => a.Name == localAssignment.Name) + ?? throw new Exception($"cannot create module item if cannot find canvas assignment with name {localAssignment.Name}"); + await canvas.CreateModuleItem( canvasId, canvasModule.Id, localAssignment.Name, "Assignment", - canvasAssignmentId + canvasAssignment.Id ); anyUpdated = true; } @@ -125,23 +127,22 @@ public static partial class ModuleSyncronizationExtensions this LocalCourse localCourse, ulong courseCanvasId, Dictionary> canvasModulesItems, - CanvasService canvas + CanvasService canvas, + IEnumerable canvasAssignments ) { foreach (var localModule in localCourse.Modules) { - // var moduleCanvasId = - // localModule.CanvasId - // ?? throw new Exception("cannot sync canvas modules items if module not synced with canvas"); - await localModule.SyncAndSortCanvasModule(courseCanvasId, canvasModulesItems, canvas); + await localModule.SyncAndSortCanvasModule(courseCanvasId, canvasModulesItems, canvas, canvasAssignments); } } public static async Task SyncAndSortCanvasModule( this LocalModule localModule, - ulong courseCanvasId, - Dictionary> canvasModulesItems, - CanvasService canvas + ulong courseCanvasId, + Dictionary> canvasModulesItems, + CanvasService canvas, + IEnumerable canvasAssignments ) { var canvasModule = canvasModulesItems.Keys.FirstOrDefault(k => k.Name == localModule.Name); @@ -154,7 +155,8 @@ public static partial class ModuleSyncronizationExtensions courseCanvasId, canvasModule, canvasModulesItems, - canvas + canvas, + canvasAssignments ); var canvasModuleItems = anyUpdated diff --git a/Management/Models/Local/LocalAssignment.cs b/Management/Models/Local/LocalAssignment.cs index 7f82270..57e560b 100644 --- a/Management/Models/Local/LocalAssignment.cs +++ b/Management/Models/Local/LocalAssignment.cs @@ -42,7 +42,7 @@ public static class SubmissionType public record LocalAssignment { - public ulong? CanvasId { get; init; } = null; + // public ulong? CanvasId { get; init; } = null; public string Name { get; init; } = ""; public string Description { get; init; } = ""; public bool LockAtDueDate { get; init; }