mirror of
https://github.com/alexmickelson/canvasManagement.git
synced 2026-03-25 23:28:33 -06:00
added feature to rename modules
This commit is contained in:
@@ -37,6 +37,7 @@ builder.Services.AddScoped<CanvasServiceUtils>();
|
||||
builder.Services.AddScoped<CanvasAssignmentService>();
|
||||
builder.Services.AddScoped<CanvasAssignmentGroupService>();
|
||||
builder.Services.AddScoped<CanvasQuizService>();
|
||||
builder.Services.AddScoped<CanvasModuleService>();
|
||||
builder.Services.AddScoped<CanvasService, CanvasService>();
|
||||
|
||||
builder.Services.AddScoped<YamlManager>();
|
||||
|
||||
@@ -132,7 +132,7 @@
|
||||
/> *@
|
||||
<div class="row m-1">
|
||||
<div class="col my-auto">
|
||||
<h5>Assignments</h5>
|
||||
<RenameModule Module="Module" />
|
||||
</div>
|
||||
<div class="col-auto">
|
||||
<NewQuiz
|
||||
@@ -143,6 +143,7 @@
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
<h5>Assignments</h5>
|
||||
|
||||
<div class="row">
|
||||
@foreach (var a in Module.Assignments)
|
||||
|
||||
65
Management.Web/Shared/Module/RenameModule.razor
Normal file
65
Management.Web/Shared/Module/RenameModule.razor
Normal file
@@ -0,0 +1,65 @@
|
||||
@using Management.Web.Shared.Components
|
||||
|
||||
@inject CoursePlanner planner
|
||||
|
||||
@code {
|
||||
|
||||
[Parameter]
|
||||
[EditorRequired]
|
||||
public LocalModule Module { get; set; } = default!;
|
||||
private Modal? modal { get; set; } = null;
|
||||
private string Name { get; set; } = string.Empty;
|
||||
|
||||
protected override void OnParametersSet()
|
||||
{
|
||||
if (Name == string.Empty)
|
||||
Name = Module.Name;
|
||||
}
|
||||
|
||||
private void submitHandler()
|
||||
{
|
||||
if (planner.LocalCourse == null)
|
||||
return;
|
||||
|
||||
var newModule = Module with
|
||||
{
|
||||
Name = Name
|
||||
};
|
||||
|
||||
var newModules = planner.LocalCourse.Modules.Select(
|
||||
m => m.Id == Module.Id
|
||||
? newModule
|
||||
: m
|
||||
).ToArray();
|
||||
|
||||
planner.LocalCourse = planner.LocalCourse with
|
||||
{
|
||||
Modules = newModules
|
||||
};
|
||||
Name = "";
|
||||
modal?.Hide();
|
||||
}
|
||||
}
|
||||
|
||||
<button
|
||||
class="btn btn-outline-secondary"
|
||||
@onclick="() => modal?.Show()"
|
||||
>
|
||||
Rename
|
||||
</button>
|
||||
|
||||
<Modal @ref="modal">
|
||||
<Title>Rename Module</Title>
|
||||
|
||||
<Body>
|
||||
<form @onsubmit:preventDefault="true" @onsubmit="submitHandler">
|
||||
<label for="moduleName">Name</label>
|
||||
<input id="moduleName" class="form-control" @bind="Name" />
|
||||
</form>
|
||||
</Body>
|
||||
<Footer>
|
||||
<button type="button" class="btn btn-primary" @onclick="submitHandler">
|
||||
Rename
|
||||
</button>
|
||||
</Footer>
|
||||
</Modal>
|
||||
@@ -93,7 +93,7 @@ public class CoursePlanner
|
||||
|
||||
var assignmentsTask = canvas.Assignments.GetAll(canvasId);
|
||||
var quizzesTask = canvas.Quizzes.GetAll(canvasId);
|
||||
var modulesTask = canvas.GetModules(canvasId);
|
||||
var modulesTask = canvas.Modules.GetModules(canvasId);
|
||||
var assignmentGroupsTask = canvas.AssignmentGroups.GetAll(canvasId);
|
||||
|
||||
CanvasAssignments = await assignmentsTask;
|
||||
@@ -101,7 +101,7 @@ public class CoursePlanner
|
||||
CanvasModules = await modulesTask;
|
||||
CanvasAssignmentGroups = await assignmentGroupsTask;
|
||||
|
||||
CanvasModulesItems = await canvas.GetAllModulesItems(canvasId, CanvasModules);
|
||||
CanvasModulesItems = await canvas.Modules.GetAllModulesItems(canvasId, CanvasModules);
|
||||
|
||||
LoadingCanvasData = false;
|
||||
StateHasChanged?.Invoke();
|
||||
@@ -154,10 +154,10 @@ public class CoursePlanner
|
||||
canvas
|
||||
);
|
||||
LocalCourse = LocalCourse with { Modules = newModules };
|
||||
CanvasModules = await canvas.GetModules(canvasId);
|
||||
CanvasModules = await canvas.Modules.GetModules(canvasId);
|
||||
|
||||
await LocalCourse.SortCanvasModules(canvasId, CanvasModules, canvas);
|
||||
CanvasModulesItems = await canvas.GetAllModulesItems(canvasId, CanvasModules);
|
||||
CanvasModulesItems = await canvas.Modules.GetAllModulesItems(canvasId, CanvasModules);
|
||||
|
||||
LocalCourse = await LocalCourse.SyncModulesWithCanvasData(canvasId, CanvasModules, canvas);
|
||||
|
||||
@@ -167,7 +167,7 @@ public class CoursePlanner
|
||||
LocalCourse = await LocalCourse.SyncQuizzesWithCanvas(canvasId, CanvasQuizzes, canvas);
|
||||
|
||||
await LocalCourse.SyncModuleItemsWithCanvas(canvasId, CanvasModulesItems, canvas);
|
||||
CanvasModulesItems = await canvas.GetAllModulesItems(canvasId, CanvasModules);
|
||||
CanvasModulesItems = await canvas.Modules.GetAllModulesItems(canvasId, CanvasModules);
|
||||
|
||||
LoadingCanvasData = false;
|
||||
StateHasChanged?.Invoke();
|
||||
|
||||
@@ -1,7 +1,4 @@
|
||||
using System.Text.RegularExpressions;
|
||||
using CanvasModel.Assignments;
|
||||
using CanvasModel.Modules;
|
||||
using CanvasModel.Quizzes;
|
||||
using LocalModels;
|
||||
using Management.Services.Canvas;
|
||||
|
||||
@@ -11,7 +8,7 @@ public static partial class ModuleSyncronizationExtensions
|
||||
{
|
||||
internal static async Task<IEnumerable<LocalModule>> EnsureAllModulesExistInCanvas(
|
||||
this LocalCourse localCourse,
|
||||
ulong canvasId,
|
||||
ulong canvasCourseId,
|
||||
IEnumerable<CanvasModule> canvasModules,
|
||||
CanvasService canvas
|
||||
)
|
||||
@@ -21,10 +18,14 @@ public static partial class ModuleSyncronizationExtensions
|
||||
var canvasModule = canvasModules.FirstOrDefault(cm => cm.Id == module.CanvasId);
|
||||
if (canvasModule == null)
|
||||
{
|
||||
var newModule = await canvas.CreateModule(canvasId, module.Name);
|
||||
var newModule = await canvas.Modules.CreateModule(canvasCourseId, module.Name);
|
||||
return module with { CanvasId = newModule.Id };
|
||||
}
|
||||
else
|
||||
|
||||
if (canvasModule.Name != module.Name)
|
||||
{
|
||||
await canvas.Modules.UpdateModule(canvasCourseId, canvasModule.Id, module.Name, canvasModule.Position);
|
||||
}
|
||||
return module;
|
||||
});
|
||||
var newModules = await Task.WhenAll(moduleTasks);
|
||||
@@ -41,13 +42,13 @@ public static partial class ModuleSyncronizationExtensions
|
||||
var currentCanvasPositions = canvasModules.ToDictionary(m => m.Id, m => m.Position);
|
||||
foreach (var (localModule, i) in localCourse.Modules.Select((m, i) => (m, i)))
|
||||
{
|
||||
var correctPosition = i + 1;
|
||||
uint correctPosition = (uint)(i + 1);
|
||||
var moduleCanvasId =
|
||||
localModule.CanvasId ?? throw new Exception("cannot sort module if no module canvas id");
|
||||
var currentCanvasPosition = currentCanvasPositions[moduleCanvasId];
|
||||
if (currentCanvasPosition != correctPosition)
|
||||
{
|
||||
await canvas.UpdateModule(canvasId, moduleCanvasId, localModule.Name, correctPosition);
|
||||
await canvas.Modules.UpdateModule(canvasId, moduleCanvasId, localModule.Name, correctPosition);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -59,7 +60,7 @@ public static partial class ModuleSyncronizationExtensions
|
||||
CanvasService canvas
|
||||
)
|
||||
{
|
||||
canvasModules = await canvas.GetModules(canvasId);
|
||||
canvasModules = await canvas.Modules.GetModules(canvasId);
|
||||
return localCourse with
|
||||
{
|
||||
Modules = localCourse.Modules.Select(m =>
|
||||
@@ -178,7 +179,7 @@ public static partial class ModuleSyncronizationExtensions
|
||||
);
|
||||
|
||||
var canvasModuleItems = anyUpdated
|
||||
? await canvas.GetModuleItems(canvasId, moduleCanvasId)
|
||||
? await canvas.Modules.GetModuleItems(canvasId, moduleCanvasId)
|
||||
: canvasModulesItems[moduleCanvasId];
|
||||
|
||||
await localModule.SortModuleItems(canvasId, moduleCanvasId, canvasModuleItems, canvas);
|
||||
|
||||
93
Management/Services/Canvas/CanvasModuleService.cs
Normal file
93
Management/Services/Canvas/CanvasModuleService.cs
Normal file
@@ -0,0 +1,93 @@
|
||||
|
||||
using CanvasModel.Modules;
|
||||
using LocalModels;
|
||||
using RestSharp;
|
||||
|
||||
namespace Management.Services.Canvas;
|
||||
|
||||
public class CanvasModuleService
|
||||
{
|
||||
|
||||
private readonly IWebRequestor webRequestor;
|
||||
private readonly CanvasServiceUtils utils;
|
||||
|
||||
public CanvasModuleService(IWebRequestor webRequestor, CanvasServiceUtils utils)
|
||||
{
|
||||
this.webRequestor = webRequestor;
|
||||
this.utils = utils;
|
||||
}
|
||||
|
||||
|
||||
public async Task<IEnumerable<CanvasModule>> GetModules(ulong courseId)
|
||||
{
|
||||
var url = $"courses/{courseId}/modules";
|
||||
var request = new RestRequest(url);
|
||||
var modules = await utils.PaginatedRequest<IEnumerable<CanvasModule>>(request);
|
||||
return modules.SelectMany(c => c).ToArray();
|
||||
}
|
||||
|
||||
public async Task<CanvasModule> CreateModule(ulong courseId, string name)
|
||||
{
|
||||
Console.WriteLine($"Creating Module: {name}");
|
||||
var url = $"courses/{courseId}/modules";
|
||||
var request = new RestRequest(url);
|
||||
var body = new
|
||||
{
|
||||
module = new
|
||||
{
|
||||
name
|
||||
}
|
||||
};
|
||||
request.AddBody(body);
|
||||
|
||||
var (newModule, _) = await webRequestor.PostAsync<CanvasModule>(request);
|
||||
return newModule ?? throw new Exception($"failed to create new canvas module {name}");
|
||||
}
|
||||
|
||||
public async Task UpdateModule(ulong courseId, ulong moduleId, string name, uint position)
|
||||
{
|
||||
Console.WriteLine($"Updating Module: {name}");
|
||||
var url = $"courses/{courseId}/modules/{moduleId}";
|
||||
var body = new { module = new { name = name, position = position } };
|
||||
var request = new RestRequest(url);
|
||||
request.AddBody(body);
|
||||
|
||||
await webRequestor.PutAsync(request);
|
||||
}
|
||||
|
||||
public async Task<IEnumerable<CanvasModuleItem>> GetModuleItems(ulong courseId, ulong moduleId)
|
||||
{
|
||||
var url = $"courses/{courseId}/modules/{moduleId}/items";
|
||||
var request = new RestRequest(url);
|
||||
var (items, response) = await webRequestor.GetAsync<IEnumerable<CanvasModuleItem>>(request);
|
||||
if (items == null)
|
||||
throw new Exception($"Error getting canvas module items for {url}");
|
||||
return items;
|
||||
}
|
||||
|
||||
public async Task<Dictionary<ulong, IEnumerable<CanvasModuleItem>>> GetAllModulesItems(
|
||||
ulong courseId,
|
||||
IEnumerable<CanvasModule> modules
|
||||
)
|
||||
{
|
||||
var itemsTasks = modules.Select(
|
||||
async (m) =>
|
||||
{
|
||||
var items = await GetModuleItems(courseId, m.Id);
|
||||
return (m, items);
|
||||
}
|
||||
);
|
||||
|
||||
var output = new Dictionary<ulong, IEnumerable<CanvasModuleItem>>();
|
||||
var itemTasksResult = await Task.WhenAll(itemsTasks);
|
||||
foreach (var (module, items) in itemTasksResult)
|
||||
{
|
||||
if (module == null || items == null)
|
||||
throw new Exception(
|
||||
"i'm not sure how we got here, but module and items are null after looking up module items"
|
||||
);
|
||||
output[module.Id] = items;
|
||||
}
|
||||
return output;
|
||||
}
|
||||
}
|
||||
@@ -14,6 +14,7 @@ public class CanvasService
|
||||
|
||||
public CanvasAssignmentService Assignments { get; }
|
||||
public CanvasAssignmentGroupService AssignmentGroups { get; }
|
||||
public CanvasModuleService Modules { get; }
|
||||
public CanvasQuizService Quizzes { get; }
|
||||
|
||||
public CanvasService(
|
||||
@@ -21,6 +22,7 @@ public class CanvasService
|
||||
CanvasServiceUtils utils,
|
||||
CanvasAssignmentService Assignments,
|
||||
CanvasAssignmentGroupService AssignmentGroups,
|
||||
CanvasModuleService Modules,
|
||||
CanvasQuizService Quizzes
|
||||
)
|
||||
{
|
||||
@@ -28,6 +30,7 @@ public class CanvasService
|
||||
this.utils = utils;
|
||||
this.Assignments = Assignments;
|
||||
this.AssignmentGroups = AssignmentGroups;
|
||||
this.Modules = Modules;
|
||||
this.Quizzes = Quizzes;
|
||||
}
|
||||
|
||||
@@ -64,78 +67,7 @@ public class CanvasService
|
||||
return data;
|
||||
}
|
||||
|
||||
public async Task<IEnumerable<CanvasModule>> GetModules(ulong courseId)
|
||||
{
|
||||
var url = $"courses/{courseId}/modules";
|
||||
var request = new RestRequest(url);
|
||||
var modules = await utils.PaginatedRequest<IEnumerable<CanvasModule>>(request);
|
||||
return modules.SelectMany(c => c).ToArray();
|
||||
}
|
||||
|
||||
public async Task<CanvasModule> CreateModule(ulong courseId, string name)
|
||||
{
|
||||
Console.WriteLine($"Creating Module: {name}");
|
||||
var url = $"courses/{courseId}/modules";
|
||||
var request = new RestRequest(url);
|
||||
var body = new
|
||||
{
|
||||
module = new
|
||||
{
|
||||
name = name
|
||||
}
|
||||
};
|
||||
request.AddBody(body);
|
||||
|
||||
var (newModule, _) = await webRequestor.PostAsync<CanvasModule>(request);
|
||||
return newModule ?? throw new Exception($"failed to create new canvas module {name}");
|
||||
}
|
||||
|
||||
public async Task UpdateModule(ulong courseId, ulong moduleId, string name, int position)
|
||||
{
|
||||
Console.WriteLine($"Updating Module: {name}");
|
||||
var url = $"courses/{courseId}/modules/{moduleId}";
|
||||
var body = new { module = new { name = name, position = position } };
|
||||
var request = new RestRequest(url);
|
||||
request.AddBody(body);
|
||||
|
||||
await webRequestor.PutAsync(request);
|
||||
}
|
||||
|
||||
public async Task<IEnumerable<CanvasModuleItem>> GetModuleItems(ulong courseId, ulong moduleId)
|
||||
{
|
||||
var url = $"courses/{courseId}/modules/{moduleId}/items";
|
||||
var request = new RestRequest(url);
|
||||
var (items, response) = await webRequestor.GetAsync<IEnumerable<CanvasModuleItem>>(request);
|
||||
if (items == null)
|
||||
throw new Exception($"Error getting canvas module items for {url}");
|
||||
return items;
|
||||
}
|
||||
|
||||
public async Task<Dictionary<ulong, IEnumerable<CanvasModuleItem>>> GetAllModulesItems(
|
||||
ulong courseId,
|
||||
IEnumerable<CanvasModule> modules
|
||||
)
|
||||
{
|
||||
var itemsTasks = modules.Select(
|
||||
async (m) =>
|
||||
{
|
||||
var items = await GetModuleItems(courseId, m.Id);
|
||||
return (m, items);
|
||||
}
|
||||
);
|
||||
|
||||
var output = new Dictionary<ulong, IEnumerable<CanvasModuleItem>>();
|
||||
var itemTasksResult = await Task.WhenAll(itemsTasks);
|
||||
foreach (var (module, items) in itemTasksResult)
|
||||
{
|
||||
if (module == null || items == null)
|
||||
throw new Exception(
|
||||
"i'm not sure how we got here, but module and items are null after looking up module items"
|
||||
);
|
||||
output[module.Id] = items;
|
||||
}
|
||||
return output;
|
||||
}
|
||||
|
||||
public async Task<IEnumerable<EnrollmentTermModel>> GetCurrentTermsFor(
|
||||
DateTime? _queryDate = null
|
||||
|
||||
Reference in New Issue
Block a user