diff --git a/Management.Web/Pages/AssignmentFormPage.razor b/Management.Web/Pages/AssignmentFormPage.razor index 7020a6d..75b2ae2 100644 --- a/Management.Web/Pages/AssignmentFormPage.razor +++ b/Management.Web/Pages/AssignmentFormPage.razor @@ -41,14 +41,15 @@ if (assignmentContext.Assignment == null) { var assignment = planner - .LocalCourse? - .Modules - .SelectMany(m => m.Assignments) - .FirstOrDefault(a => a.Name == AssignmentName); + .LocalCourse? + .Modules + .SelectMany(m => m.Assignments) + .FirstOrDefault(a => a.Name == AssignmentName); assignmentContext.Assignment = assignment; logger.LogInformation($"set assignment to '{assignmentContext.Assignment?.Name}'"); } + await planner.LoadCanvasData(); base.OnInitialized(); StateHasChanged(); } diff --git a/Management.Web/Shared/Components/AssignmentForm/AssignmentForm.razor b/Management.Web/Shared/Components/AssignmentForm/AssignmentForm.razor index 9f29556..b2dfeb1 100644 --- a/Management.Web/Shared/Components/AssignmentForm/AssignmentForm.razor +++ b/Management.Web/Shared/Components/AssignmentForm/AssignmentForm.razor @@ -144,6 +144,16 @@ await planner.LoadCanvasData(); addingAssignmentToCanvas = false; } + private async Task updateInCanvas() + { + if(assignmentInCanvas != null) + { + addingAssignmentToCanvas = true; + await assignmentContext.UpdateInCanvas(assignmentInCanvas.Id); + await planner.LoadCanvasData(); + addingAssignmentToCanvas = false; + } + } private CanvasAssignment? assignmentInCanvas => planner.CanvasAssignments?.FirstOrDefault(a => a.Name == assignmentContext.Assignment?.Name); @@ -153,16 +163,20 @@ private async Task deleteFromCanvas() { - if (assignmentInCanvas == null || planner.LocalCourse.Settings.CanvasId == null || assignmentContext.Assignment == null) + if (assignmentInCanvas == null + || planner.LocalCourse.Settings.CanvasId == null + || assignmentContext.Assignment == null + ) return; + deletingAssignmentFromCanvas = true; await canvas.Assignments.Delete( (ulong)planner.LocalCourse.Settings.CanvasId, assignmentInCanvas.Id, assignmentContext.Assignment.Name); await planner.LoadCanvasData(); - StateHasChanged(); deletingAssignmentFromCanvas = false; + StateHasChanged(); } } @@ -224,6 +238,13 @@ > View in Canvas + + Update In Canvas + rubric { get; set; } = Array.Empty(); - private string rubricText = ""; + private IEnumerable displayRubric { get; set; } = new RubricItem[] {}; + private string _rubricText = ""; + private string rubricText + { + get => _rubricText; + set + { + _rubricText = value; + + try + { + var parsedRubric = LocalAssignment.ParseRubricMarkdown(value); + displayRubric = parsedRubric; + error = null; + if (assignmentContext.Assignment != null) + { + var newAssignment = assignmentContext.Assignment with + { + Rubric = parsedRubric, + }; + assignmentContext.SaveAssignment(newAssignment); + } + } + catch (RubricMarkdownParseException parseError) + { + error = parseError.Message; + } + + StateHasChanged(); + } + } private int rubricReloadKey = 0; + private string? error { get; set; } = null; protected override void OnInitialized() { @@ -19,55 +49,28 @@ { if (assignmentContext.Assignment != null) { - rubric = assignmentContext.Assignment.Rubric; + if(rubricText == string.Empty) + { + rubricText = assignmentContext.Assignment.RubricToMarkdown(); + } } this.InvokeAsync(this.StateHasChanged); } + public void Dispose() { assignmentContext.StateHasChanged -= reload; } - private void save() - { - if (assignmentContext.Assignment != null) - { - var newAssignment = assignmentContext.Assignment with - { - Rubric = rubric, - }; - assignmentContext.SaveAssignment(newAssignment); - StateHasChanged(); - } - } - - private void handleNewRubricText() - { - - } - - private int requiredPoints => rubric.Where(r => !r.IsExtraCredit).Select(r => r.Points).Sum(); - private int extraCreditPoints => rubric.Where(r => r.IsExtraCredit).Select(r => r.Points).Sum(); + private int requiredPoints => displayRubric.Where(r => !r.IsExtraCredit).Select(r => r.Points).Sum(); + private int extraCreditPoints => displayRubric.Where(r => r.IsExtraCredit).Select(r => r.Points).Sum(); } - - Rubric - - - - - Rubric - - - - HTML Preview - - - preview here + @if (error != null) + { + Error: @error + } + + + Label + Points + Extra Credit + + @foreach(var item in displayRubric) + { + + @item.Label + @item.Points + @item.IsExtraCredit + + } + + + Required Points: @requiredPoints + + + Extra Credit Points @extraCreditPoints + + - - - - Requred Points: @requiredPoints - - - Extra Credit Points @extraCreditPoints - - - diff --git a/Management/Features/Configuration/AssignmentEditorContext.cs b/Management/Features/Configuration/AssignmentEditorContext.cs index c0f40b2..5e315d5 100644 --- a/Management/Features/Configuration/AssignmentEditorContext.cs +++ b/Management/Features/Configuration/AssignmentEditorContext.cs @@ -39,10 +39,7 @@ public class AssignmentEditorContext if (planner.LocalCourse != null) { // run discovery on Assignment, it was the last stored version of the assignment - var currentModule = - planner.LocalCourse.Modules.First( - m => m.Assignments.Contains(Assignment) - ) ?? throw new Exception("could not find current module in assignment editor context"); + var currentModule = getCurrentModule(Assignment, planner.LocalCourse); var updatedModules = planner.LocalCourse.Modules .Select( @@ -63,6 +60,56 @@ public class AssignmentEditorContext } } + public async Task UpdateInCanvas(ulong canvasAssignmentId) + { + logger.Log("started to update assignment in canvas"); + if (Assignment == null) + { + logger.Log("cannot update null assignment in canvas"); + return; + } + + + await planner.LoadCanvasData(); + if (planner.CanvasAssignments == null) + { + logger.Log("cannot update assignment in canvas, failed to retrieve current assignments"); + return; + } + if (planner.LocalCourse == null) + { + logger.Log("cannot update assignment in canvas, no course stored in planner"); + return; + } + if (planner.LocalCourse.Settings.CanvasId == null) + { + logger.Log("Cannot update assignment with null local course canvas id"); + return; + } + var assignmentInCanvas = planner.CanvasAssignments?.FirstOrDefault(a => a.Id == canvasAssignmentId); + if (assignmentInCanvas == null) + { + logger.Log("cannot update assignment in canvas, could not find canvas assignment with id: " + canvasAssignmentId); + return; + } + var canvasAssignmentGroupId = Assignment.GetCanvasAssignmentGroupId(planner.LocalCourse.Settings.AssignmentGroups); + + if (canvasAssignmentGroupId == null) + { + + logger.Log("cannot update assignment in canvas, could not get assignment group id: " + assignmentInCanvas.AssignmentGroupId); + return; + } + + await canvas.Assignments.Update( + courseId: (ulong)planner.LocalCourse.Settings.CanvasId, + canvasAssignmentId: canvasAssignmentId, + localAssignment: Assignment, + htmlDescription: Assignment.GetDescriptionHtml(), + canvasAssignmentGroupId: (ulong)canvasAssignmentGroupId + ); + } + public async Task AddAssignmentToCanvas() { logger.Log("started to add assignment to canvas"); @@ -120,13 +167,12 @@ public class AssignmentEditorContext canvas ); logger.Log($"finished adding assignment {Assignment.Name} to canvas"); - } private static LocalModule getCurrentModule(LocalAssignment assignment, LocalCourse course) { return course.Modules.FirstOrDefault( - m => m.Assignments.Contains(assignment) + m => m.Assignments.Select(a => a.Name).Contains(assignment.Name) ) ?? throw new Exception("could not find current module in assignment editor context"); } diff --git a/Management/Features/Configuration/Synchronization/AssignmentSyncronizationExtensions.cs b/Management/Features/Configuration/Synchronization/AssignmentSyncronizationExtensions.cs index a5b0469..1fbaccb 100644 --- a/Management/Features/Configuration/Synchronization/AssignmentSyncronizationExtensions.cs +++ b/Management/Features/Configuration/Synchronization/AssignmentSyncronizationExtensions.cs @@ -64,9 +64,10 @@ public static partial class AssignmentSyncronizationExtensions { await canvas.Assignments.Update( courseId: canvasCourseId, + canvasAssignmentId: (ulong) localAssignment.CanvasId, localAssignment, localHtmlDescription, - canvasAssignmentGroupId + (ulong)canvasAssignmentGroupId ); } return canvasAssignment.Id; diff --git a/Management/Services/Canvas/CanvasAssignmentService.cs b/Management/Services/Canvas/CanvasAssignmentService.cs index 02079f4..c624ec1 100644 --- a/Management/Services/Canvas/CanvasAssignmentService.cs +++ b/Management/Services/Canvas/CanvasAssignmentService.cs @@ -69,19 +69,20 @@ public class CanvasAssignmentService public async Task Update( ulong courseId, + ulong canvasAssignmentId, LocalAssignment localAssignment, string htmlDescription, - ulong? canvasAssignmentGroupId + ulong canvasAssignmentGroupId ) { log.Log($"updating assignment: {localAssignment.Name}"); - var url = $"courses/{courseId}/assignments/{localAssignment.CanvasId}"; + var url = $"courses/{courseId}/assignments/{canvasAssignmentId}"; var request = new RestRequest(url); var body = new { name = localAssignment.Name, submission_types = localAssignment.SubmissionTypes.Select(t => t.ToString()), - description = htmlDescription, + description = localAssignment.GetDescriptionHtml(), due_at = localAssignment.DueAt, lock_at = localAssignment.LockAtDueDate ? localAssignment.DueAt : localAssignment.LockAt, points_possible = localAssignment.PointsPossible, @@ -92,7 +93,7 @@ public class CanvasAssignmentService await webRequestor.PutAsync(request); - await CreateRubric(courseId, (ulong)localAssignment.CanvasId, localAssignment); + await CreateRubric(courseId, canvasAssignmentId, localAssignment); } public async Task Delete(ulong courseId, ulong assignmentCanvasId, string assignmentName)
Error: @error