added some details for editing assignment

This commit is contained in:
2023-10-30 13:47:05 -06:00
parent 246d64c2a0
commit 29de2880b9
6 changed files with 153 additions and 65 deletions

View File

@@ -41,14 +41,15 @@
if (assignmentContext.Assignment == null) if (assignmentContext.Assignment == null)
{ {
var assignment = planner var assignment = planner
.LocalCourse? .LocalCourse?
.Modules .Modules
.SelectMany(m => m.Assignments) .SelectMany(m => m.Assignments)
.FirstOrDefault(a => a.Name == AssignmentName); .FirstOrDefault(a => a.Name == AssignmentName);
assignmentContext.Assignment = assignment; assignmentContext.Assignment = assignment;
logger.LogInformation($"set assignment to '{assignmentContext.Assignment?.Name}'"); logger.LogInformation($"set assignment to '{assignmentContext.Assignment?.Name}'");
} }
await planner.LoadCanvasData();
base.OnInitialized(); base.OnInitialized();
StateHasChanged(); StateHasChanged();
} }

View File

@@ -144,6 +144,16 @@
await planner.LoadCanvasData(); await planner.LoadCanvasData();
addingAssignmentToCanvas = false; addingAssignmentToCanvas = false;
} }
private async Task updateInCanvas()
{
if(assignmentInCanvas != null)
{
addingAssignmentToCanvas = true;
await assignmentContext.UpdateInCanvas(assignmentInCanvas.Id);
await planner.LoadCanvasData();
addingAssignmentToCanvas = false;
}
}
private CanvasAssignment? assignmentInCanvas => private CanvasAssignment? assignmentInCanvas =>
planner.CanvasAssignments?.FirstOrDefault(a => a.Name == assignmentContext.Assignment?.Name); planner.CanvasAssignments?.FirstOrDefault(a => a.Name == assignmentContext.Assignment?.Name);
@@ -153,16 +163,20 @@
private async Task deleteFromCanvas() 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; return;
deletingAssignmentFromCanvas = true; deletingAssignmentFromCanvas = true;
await canvas.Assignments.Delete( await canvas.Assignments.Delete(
(ulong)planner.LocalCourse.Settings.CanvasId, (ulong)planner.LocalCourse.Settings.CanvasId,
assignmentInCanvas.Id, assignmentInCanvas.Id,
assignmentContext.Assignment.Name); assignmentContext.Assignment.Name);
await planner.LoadCanvasData(); await planner.LoadCanvasData();
StateHasChanged();
deletingAssignmentFromCanvas = false; deletingAssignmentFromCanvas = false;
StateHasChanged();
} }
} }
@@ -224,6 +238,13 @@
> >
View in Canvas View in Canvas
</a> </a>
<button
class="btn btn-outline-secondary mx-3"
disabled="@(addingAssignmentToCanvas || deletingAssignmentFromCanvas)"
@onclick="updateInCanvas"
>
Update In Canvas
</button>
<ConfirmationModal <ConfirmationModal
Disabled="@(addingAssignmentToCanvas || deletingAssignmentFromCanvas)" Disabled="@(addingAssignmentToCanvas || deletingAssignmentFromCanvas)"
Label="Delete from Canvas" Label="Delete from Canvas"

View File

@@ -5,10 +5,40 @@
@code @code
{ {
private IEnumerable<RubricItem> rubric { get; set; } = Array.Empty<RubricItem>(); private IEnumerable<RubricItem> displayRubric { get; set; } = new RubricItem[] {};
private string rubricText = ""; 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 int rubricReloadKey = 0;
private string? error { get; set; } = null;
protected override void OnInitialized() protected override void OnInitialized()
{ {
@@ -19,55 +49,28 @@
{ {
if (assignmentContext.Assignment != null) if (assignmentContext.Assignment != null)
{ {
rubric = assignmentContext.Assignment.Rubric; if(rubricText == string.Empty)
{
rubricText = assignmentContext.Assignment.RubricToMarkdown();
}
} }
this.InvokeAsync(this.StateHasChanged); this.InvokeAsync(this.StateHasChanged);
} }
public void Dispose() public void Dispose()
{ {
assignmentContext.StateHasChanged -= reload; assignmentContext.StateHasChanged -= reload;
} }
private void save() 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();
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();
} }
<br> <br>
<div class="row"> <div class="row">
<div class="col offset-3">
<h4 class="text-center">Rubric</h4> <h4 class="text-center">Rubric</h4>
</div>
</div> </div>
<div class="row">
<div class="col">
<label for="description" class="form-label">
Rubric
</label>
</div>
<div class="col">
HTML Preview
</div>
</div>
<div class="row"> <div class="row">
<div class="col-6"> <div class="col-6">
<textarea <textarea
@@ -75,22 +78,37 @@
class="form-control h-100" class="form-control h-100"
rows=12 rows=12
@bind="rubricText" @bind="rubricText"
@oninput="handleNewRubricText" @bind:event="oninput"
/> />
</div> </div>
<div class="col-6"> <div class="col-6">
preview here @if (error != null)
{
<p class="text-danger text-truncate">Error: @error</p>
}
<div class="row border-bottom">
<div class="col-6 text-end">Label</div>
<div class="col-3 text-center">Points</div>
<div class="col-3 text-center">Extra Credit</div>
</div>
@foreach(var item in displayRubric)
{
<div class="row border-bottom">
<div class="col-6 text-end">@item.Label</div>
<div class="col-3 text-center">@item.Points</div>
<div class="col-3 text-center">@item.IsExtraCredit</div>
</div>
}
<div class="text-end">
<div>
Required Points: @requiredPoints
</div>
<div>
Extra Credit Points @extraCreditPoints
</div>
</div>
</div> </div>
</div> </div>
<div class="row">
<div class="col">
<div>
Requred Points: @requiredPoints
</div>
<div>
Extra Credit Points @extraCreditPoints
</div>
</div>
</div>

View File

@@ -39,10 +39,7 @@ public class AssignmentEditorContext
if (planner.LocalCourse != null) if (planner.LocalCourse != null)
{ {
// run discovery on Assignment, it was the last stored version of the assignment // run discovery on Assignment, it was the last stored version of the assignment
var currentModule = var currentModule = getCurrentModule(Assignment, planner.LocalCourse);
planner.LocalCourse.Modules.First(
m => m.Assignments.Contains(Assignment)
) ?? throw new Exception("could not find current module in assignment editor context");
var updatedModules = planner.LocalCourse.Modules var updatedModules = planner.LocalCourse.Modules
.Select( .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() public async Task AddAssignmentToCanvas()
{ {
logger.Log("started to add assignment to canvas"); logger.Log("started to add assignment to canvas");
@@ -120,13 +167,12 @@ public class AssignmentEditorContext
canvas canvas
); );
logger.Log($"finished adding assignment {Assignment.Name} to canvas"); logger.Log($"finished adding assignment {Assignment.Name} to canvas");
} }
private static LocalModule getCurrentModule(LocalAssignment assignment, LocalCourse course) private static LocalModule getCurrentModule(LocalAssignment assignment, LocalCourse course)
{ {
return course.Modules.FirstOrDefault( 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"); ?? throw new Exception("could not find current module in assignment editor context");
} }

View File

@@ -64,9 +64,10 @@ public static partial class AssignmentSyncronizationExtensions
{ {
await canvas.Assignments.Update( await canvas.Assignments.Update(
courseId: canvasCourseId, courseId: canvasCourseId,
canvasAssignmentId: (ulong) localAssignment.CanvasId,
localAssignment, localAssignment,
localHtmlDescription, localHtmlDescription,
canvasAssignmentGroupId (ulong)canvasAssignmentGroupId
); );
} }
return canvasAssignment.Id; return canvasAssignment.Id;

View File

@@ -69,19 +69,20 @@ public class CanvasAssignmentService
public async Task Update( public async Task Update(
ulong courseId, ulong courseId,
ulong canvasAssignmentId,
LocalAssignment localAssignment, LocalAssignment localAssignment,
string htmlDescription, string htmlDescription,
ulong? canvasAssignmentGroupId ulong canvasAssignmentGroupId
) )
{ {
log.Log($"updating assignment: {localAssignment.Name}"); 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 request = new RestRequest(url);
var body = new var body = new
{ {
name = localAssignment.Name, name = localAssignment.Name,
submission_types = localAssignment.SubmissionTypes.Select(t => t.ToString()), submission_types = localAssignment.SubmissionTypes.Select(t => t.ToString()),
description = htmlDescription, description = localAssignment.GetDescriptionHtml(),
due_at = localAssignment.DueAt, due_at = localAssignment.DueAt,
lock_at = localAssignment.LockAtDueDate ? localAssignment.DueAt : localAssignment.LockAt, lock_at = localAssignment.LockAtDueDate ? localAssignment.DueAt : localAssignment.LockAt,
points_possible = localAssignment.PointsPossible, points_possible = localAssignment.PointsPossible,
@@ -92,7 +93,7 @@ public class CanvasAssignmentService
await webRequestor.PutAsync(request); 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) public async Task Delete(ulong courseId, ulong assignmentCanvasId, string assignmentName)