mirror of
https://github.com/alexmickelson/canvasManagement.git
synced 2026-03-25 23:28:33 -06:00
can create modules without syncing
This commit is contained in:
@@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
@using Management.Web.Shared.Components
|
@using Management.Web.Shared.Components
|
||||||
@using Management.Web.Shared.Components.Quiz
|
@using Management.Web.Shared.Components.Quiz
|
||||||
@using Management.Web.Shared.Module.Assignment
|
@using Management.Web.Shared.Module.Assignment
|
||||||
@@ -13,28 +12,29 @@
|
|||||||
@code {
|
@code {
|
||||||
[Parameter, EditorRequired]
|
[Parameter, EditorRequired]
|
||||||
public LocalModule Module { get; set; } = default!;
|
public LocalModule Module { get; set; } = default!;
|
||||||
private bool dragging {get; set;} = false;
|
private bool dragging { get; set; } = false;
|
||||||
|
private bool publishing = false;
|
||||||
private string _notes { get; set; } = "";
|
private string _notes { get; set; } = "";
|
||||||
private string notes
|
private string notes
|
||||||
{
|
{
|
||||||
get => _notes;
|
get => _notes;
|
||||||
set
|
set
|
||||||
{
|
{
|
||||||
if(value != _notes)
|
if (value != _notes)
|
||||||
{
|
{
|
||||||
_notes = value;
|
_notes = value;
|
||||||
if(planner.LocalCourse != null)
|
if (planner.LocalCourse != null)
|
||||||
{
|
{
|
||||||
var newModule = Module with { Notes = _notes };
|
var newModule = Module with { Notes = _notes };
|
||||||
var newModules = planner.LocalCourse.Modules.Select(
|
var newModules = planner.LocalCourse.Modules.Select(
|
||||||
m => m.Name == newModule.Name
|
m => m.Name == newModule.Name
|
||||||
? newModule
|
? newModule
|
||||||
: m
|
: m
|
||||||
);
|
);
|
||||||
planner.LocalCourse = planner.LocalCourse with
|
planner.LocalCourse = planner.LocalCourse with
|
||||||
{
|
{
|
||||||
Modules = newModules
|
Modules = newModules
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -43,7 +43,7 @@
|
|||||||
|
|
||||||
protected override void OnInitialized()
|
protected override void OnInitialized()
|
||||||
{
|
{
|
||||||
if(_notes == string.Empty)
|
if (_notes == string.Empty)
|
||||||
{
|
{
|
||||||
_notes = Module.Notes;
|
_notes = Module.Notes;
|
||||||
}
|
}
|
||||||
@@ -59,21 +59,25 @@
|
|||||||
planner.StateHasChanged -= reload;
|
planner.StateHasChanged -= reload;
|
||||||
}
|
}
|
||||||
|
|
||||||
private string accordionId {
|
private string accordionId
|
||||||
|
{
|
||||||
get => Module.Name.Replace(" ", "").Replace("#", "") + "-AccordionItem";
|
get => Module.Name.Replace(" ", "").Replace("#", "") + "-AccordionItem";
|
||||||
}
|
}
|
||||||
|
|
||||||
void OnDragEnter() {
|
void OnDragEnter()
|
||||||
|
{
|
||||||
dragging = true;
|
dragging = true;
|
||||||
}
|
}
|
||||||
void OnDragLeave() {
|
void OnDragLeave()
|
||||||
|
{
|
||||||
dragging = false;
|
dragging = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void OnDrop()
|
void OnDrop()
|
||||||
{
|
{
|
||||||
dragging = false;
|
dragging = false;
|
||||||
if(dragContainer.DropCallback == null){
|
if (dragContainer.DropCallback == null)
|
||||||
|
{
|
||||||
System.Console.WriteLine("no drop callback set");
|
System.Console.WriteLine("no drop callback set");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -85,76 +89,84 @@
|
|||||||
.FirstOrDefault(
|
.FirstOrDefault(
|
||||||
cm => cm.Name == Module.Name
|
cm => cm.Name == Module.Name
|
||||||
) != null;
|
) != null;
|
||||||
|
private async Task Publish()
|
||||||
|
{
|
||||||
|
publishing = true;
|
||||||
|
await planner.CreateModule(Module);
|
||||||
|
publishing = false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
<div
|
<div class="@("accordion-item " + (dragging ? "" : ""))" @ondrop="@(() => OnDrop())" @ondragenter="OnDragEnter"
|
||||||
class="@("accordion-item " + (dragging ? "" : ""))"
|
@ondragleave="OnDragLeave" ondragover="event.preventDefault();">
|
||||||
@ondrop="@(() => OnDrop())"
|
|
||||||
@ondragenter="OnDragEnter"
|
|
||||||
@ondragleave="OnDragLeave"
|
|
||||||
ondragover="event.preventDefault();"
|
|
||||||
>
|
|
||||||
<h2 class="accordion-header">
|
<h2 class="accordion-header">
|
||||||
<button
|
<button class="accordion-button collapsed" type="button" data-bs-toggle="collapse"
|
||||||
class="accordion-button collapsed"
|
data-bs-target="@("#" + accordionId)" aria-controls="@accordionId">
|
||||||
type="button"
|
<div class="w-100 d-flex justify-content-between pe-3">
|
||||||
data-bs-toggle="collapse"
|
<div>
|
||||||
data-bs-target="@("#" + accordionId)"
|
@Module.Name
|
||||||
aria-controls="@accordionId"
|
</div>
|
||||||
>
|
@if (isSyncedWithCanvas)
|
||||||
<div class="w-100 d-flex justify-content-between pe-3">
|
{
|
||||||
<div>
|
<CheckIcon />
|
||||||
@Module.Name
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
<SyncIcon />
|
||||||
|
}
|
||||||
</div>
|
</div>
|
||||||
@if(isSyncedWithCanvas)
|
|
||||||
{
|
|
||||||
<CheckIcon />
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
<SyncIcon />
|
|
||||||
}
|
|
||||||
</div>
|
|
||||||
</button>
|
</button>
|
||||||
|
|
||||||
</h2>
|
</h2>
|
||||||
<div
|
<div id="@accordionId" class="accordion-collapse collapse">
|
||||||
id="@accordionId"
|
|
||||||
class="accordion-collapse collapse"
|
|
||||||
>
|
|
||||||
<div class="accordion-body pt-1">
|
<div class="accordion-body pt-1">
|
||||||
@* <textarea
|
@* <textarea
|
||||||
class="form-control"
|
class="form-control"
|
||||||
@bind="notes"
|
@bind="notes"
|
||||||
@bind:event="oninput"
|
@bind:event="oninput"
|
||||||
placeholder="notes for the module"
|
placeholder="notes for the module"
|
||||||
rows="6"
|
rows="6"
|
||||||
/> *@
|
/> *@
|
||||||
<div class="row m-1">
|
<div class="row m-1">
|
||||||
<div class="col my-auto">
|
<div class="col my-auto">
|
||||||
<RenameModule Module="Module" />
|
<RenameModule Module="Module" />
|
||||||
</div>
|
</div>
|
||||||
<div class="col-auto">
|
<div class="col my-auto">
|
||||||
<NewQuiz
|
@if(publishing)
|
||||||
Module="Module"
|
{
|
||||||
/>
|
<Spinner />
|
||||||
<NewAssignment
|
}
|
||||||
Module="Module"
|
else
|
||||||
/>
|
{
|
||||||
|
if(!isSyncedWithCanvas)
|
||||||
|
{
|
||||||
|
<button
|
||||||
|
class="btn btn-outline-primary"
|
||||||
|
@onclick="Publish"
|
||||||
|
disabled="@publishing"
|
||||||
|
>
|
||||||
|
Publish
|
||||||
|
</button>
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</div>
|
||||||
|
<div class="col-auto my-auto">
|
||||||
|
<NewQuiz Module="Module" />
|
||||||
|
<NewAssignment Module="Module" />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<h5>Assignments</h5>
|
<h5>Assignments</h5>
|
||||||
|
|
||||||
<div class="row">
|
<div class="row">
|
||||||
@foreach (var a in Module.Assignments)
|
@foreach (var a in Module.Assignments)
|
||||||
{
|
{
|
||||||
<AssignmentListItem Assignment="a" Module="Module" />
|
<AssignmentListItem Assignment="a" Module="Module" />
|
||||||
}
|
}
|
||||||
<br>
|
<br>
|
||||||
@foreach(var quiz in Module.Quizzes)
|
@foreach (var quiz in Module.Quizzes)
|
||||||
{
|
{
|
||||||
<QuizListItem Quiz="quiz" />
|
<QuizListItem Quiz="quiz" />
|
||||||
}
|
}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -165,8 +165,6 @@ public class CoursePlanner
|
|||||||
await LocalCourse.SortCanvasModulesByLocalOrder(canvasId, CanvasModules, canvas);
|
await LocalCourse.SortCanvasModulesByLocalOrder(canvasId, CanvasModules, canvas);
|
||||||
CanvasModulesItems = await canvas.Modules.GetAllModulesItems(canvasId, CanvasModules);
|
CanvasModulesItems = await canvas.Modules.GetAllModulesItems(canvasId, CanvasModules);
|
||||||
|
|
||||||
LocalCourse = await LocalCourse.GetCanvasIdsForLocalModules(canvasId, canvas);
|
|
||||||
|
|
||||||
LocalCourse = await LocalCourse.SyncAssignmentsWithCanvas(canvasId, CanvasAssignments, canvas);
|
LocalCourse = await LocalCourse.SyncAssignmentsWithCanvas(canvasId, CanvasAssignments, canvas);
|
||||||
CanvasAssignments = await canvas.Assignments.GetAll(canvasId);
|
CanvasAssignments = await canvas.Assignments.GetAll(canvasId);
|
||||||
|
|
||||||
@@ -180,6 +178,15 @@ public class CoursePlanner
|
|||||||
Console.WriteLine("done syncing with canvas\n");
|
Console.WriteLine("done syncing with canvas\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public async Task CreateModule(LocalModule newModule)
|
||||||
|
{
|
||||||
|
if(LocalCourse == null)
|
||||||
|
return;
|
||||||
|
var canvasCourseId =
|
||||||
|
LocalCourse.Settings.CanvasId ?? throw new Exception("no course canvas id to use to create module");
|
||||||
|
await canvas.Modules.CreateModule(canvasCourseId, newModule.Name);
|
||||||
|
CanvasModules = await canvas.Modules.GetModules(canvasCourseId);
|
||||||
|
}
|
||||||
|
|
||||||
public void Clear()
|
public void Clear()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -51,23 +51,6 @@ public static partial class ModuleSyncronizationExtensions
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
internal static async Task<LocalCourse> GetCanvasIdsForLocalModules(
|
|
||||||
this LocalCourse localCourse,
|
|
||||||
ulong canvasId,
|
|
||||||
CanvasService canvas
|
|
||||||
)
|
|
||||||
{
|
|
||||||
// var canvasModules = await canvas.Modules.GetModules(canvasId);
|
|
||||||
return localCourse;
|
|
||||||
// {
|
|
||||||
// Modules = localCourse.Modules.Select(m =>
|
|
||||||
// {
|
|
||||||
// var canvasModule = canvasModules.FirstOrDefault(cm => cm.Name == m.Name);
|
|
||||||
// return canvasModule == null ? m : m with { CanvasId = canvasModule.Id };
|
|
||||||
// })
|
|
||||||
// };
|
|
||||||
}
|
|
||||||
|
|
||||||
public static async Task SortModuleItems(
|
public static async Task SortModuleItems(
|
||||||
this LocalModule localModule,
|
this LocalModule localModule,
|
||||||
ulong canvasId,
|
ulong canvasId,
|
||||||
@@ -75,7 +58,7 @@ public static partial class ModuleSyncronizationExtensions
|
|||||||
CanvasService canvas
|
CanvasService canvas
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
|
|
||||||
var canvasModuleItems = await canvas.Modules.GetModuleItems(canvasId, moduleCanvasId);
|
var canvasModuleItems = await canvas.Modules.GetModuleItems(canvasId, moduleCanvasId);
|
||||||
var moduleItemsInCorrectOrder = canvasModuleItems
|
var moduleItemsInCorrectOrder = canvasModuleItems
|
||||||
.OrderBy(i => i.ContentDetails?.DueAt)
|
.OrderBy(i => i.ContentDetails?.DueAt)
|
||||||
@@ -150,24 +133,34 @@ public static partial class ModuleSyncronizationExtensions
|
|||||||
// var moduleCanvasId =
|
// var moduleCanvasId =
|
||||||
// localModule.CanvasId
|
// localModule.CanvasId
|
||||||
// ?? throw new Exception("cannot sync canvas modules items if module not synced with canvas");
|
// ?? throw new Exception("cannot sync canvas modules items if module not synced with canvas");
|
||||||
var canvasModule = canvasModulesItems.Keys.FirstOrDefault(k => k.Name == localModule.Name);
|
await localModule.SyncAndSortCanvasModule(courseCanvasId, canvasModulesItems, canvas);
|
||||||
if(canvasModule == null)
|
|
||||||
{
|
|
||||||
throw new Exception($"cannot sync module items in canvas, could not find module with name ${localModule.Name}");
|
|
||||||
}
|
|
||||||
|
|
||||||
bool anyUpdated = await localModule.EnsureAllModulesItemsCreated(
|
|
||||||
courseCanvasId,
|
|
||||||
canvasModule,
|
|
||||||
canvasModulesItems,
|
|
||||||
canvas
|
|
||||||
);
|
|
||||||
|
|
||||||
var canvasModuleItems = anyUpdated
|
|
||||||
? await canvas.Modules.GetModuleItems(courseCanvasId, canvasModule.Id)
|
|
||||||
: canvasModulesItems[canvasModule];
|
|
||||||
|
|
||||||
await localModule.SortModuleItems(courseCanvasId, canvasModule.Id, canvas);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static async Task SyncAndSortCanvasModule(
|
||||||
|
this LocalModule localModule,
|
||||||
|
ulong courseCanvasId,
|
||||||
|
Dictionary<CanvasModule, IEnumerable<CanvasModuleItem>> canvasModulesItems,
|
||||||
|
CanvasService canvas
|
||||||
|
)
|
||||||
|
{
|
||||||
|
var canvasModule = canvasModulesItems.Keys.FirstOrDefault(k => k.Name == localModule.Name);
|
||||||
|
if (canvasModule == null)
|
||||||
|
{
|
||||||
|
throw new Exception($"cannot sync module items in canvas, could not find module with name ${localModule.Name}");
|
||||||
|
}
|
||||||
|
|
||||||
|
bool anyUpdated = await localModule.EnsureAllModulesItemsCreated(
|
||||||
|
courseCanvasId,
|
||||||
|
canvasModule,
|
||||||
|
canvasModulesItems,
|
||||||
|
canvas
|
||||||
|
);
|
||||||
|
|
||||||
|
var canvasModuleItems = anyUpdated
|
||||||
|
? await canvas.Modules.GetModuleItems(courseCanvasId, canvasModule.Id)
|
||||||
|
: canvasModulesItems[canvasModule];
|
||||||
|
|
||||||
|
await localModule.SortModuleItems(courseCanvasId, canvasModule.Id, canvas);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user