diff --git a/Management.Web/Pages/Index.razor b/Management.Web/Pages/Index.razor index 531e0a2..5edd309 100644 --- a/Management.Web/Pages/Index.razor +++ b/Management.Web/Pages/Index.razor @@ -1,5 +1,6 @@ @page "/" @using CanvasModel.EnrollmentTerms +@using Management.Web.Shared.Course @using Management.Web.Shared.Semester @using CanvasModel.Courses @using Microsoft.AspNetCore.Components.Server.ProtectedBrowserStorage @@ -8,7 +9,6 @@ @inject CanvasService canvas @inject CoursePlanner planner @inject ProtectedLocalStorage BrowserStorage -@inject YamlManager yamlManager @code { @@ -57,14 +57,13 @@ @if(planner.LocalCourse != null) { - -
- -
- +
+ +
+ } diff --git a/Management.Web/Program.cs b/Management.Web/Program.cs index c99cbf1..b01d772 100644 --- a/Management.Web/Program.cs +++ b/Management.Web/Program.cs @@ -5,6 +5,7 @@ global using CanvasModel.EnrollmentTerms; global using CanvasModel.Courses; global using CanvasModel; global using LocalModels; +global using Management.Web.Shared.Course; using Microsoft.AspNetCore.Components; using Microsoft.AspNetCore.Components.Web; @@ -19,10 +20,10 @@ builder.Services.AddRazorPages(); builder.Services.AddServerSideBlazor(); builder.Services.AddSingleton(); builder.Services.AddSingleton(); +builder.Services.AddSingleton(); builder.Services.AddSingleton(); builder.Services.AddSingleton(); builder.Services.AddScoped(); -builder.Services.AddScoped(); var app = builder.Build(); diff --git a/Management.Web/Shared/Calendar.razor b/Management.Web/Shared/Calendar.razor deleted file mode 100644 index 74d228e..0000000 --- a/Management.Web/Shared/Calendar.razor +++ /dev/null @@ -1,25 +0,0 @@ - -@using CanvasModel.EnrollmentTerms -@using Management.Web.Shared.Module -@using Management.Web.Shared.Semester - -@inject CoursePlanner planner - -
- -
-
- - @if (planner.LocalCourse != null) - { - @foreach (var month in SemesterPlanner.GetMonthsBetweenDates(planner.LocalCourse.StartDate, planner.LocalCourse.EndDate)) - { - -
- } - } -
-
- -
-
\ No newline at end of file diff --git a/Management.Web/Shared/Course/CourseDetails.razor b/Management.Web/Shared/Course/CourseDetails.razor new file mode 100644 index 0000000..d819306 --- /dev/null +++ b/Management.Web/Shared/Course/CourseDetails.razor @@ -0,0 +1,48 @@ + +@using CanvasModel.EnrollmentTerms +@using Management.Web.Shared.Module +@using Management.Web.Shared.Semester + +@inject CoursePlanner planner + +@code +{ + private bool showEditCourseSettings = false; + protected override void OnInitialized() + { + planner.StateHasChanged += () => this.InvokeAsync(this.StateHasChanged); + } +} +
+ +@if(!showEditCourseSettings) +{ + +} +else +{ + + +} + + +
+
+ @if (planner.LocalCourse != null) + { + @foreach (var month in SemesterPlanner.GetMonthsBetweenDates(planner.LocalCourse.StartDate, planner.LocalCourse.EndDate)) + { + +
+ } + } +
+
+ +
+
\ No newline at end of file diff --git a/Management.Web/Shared/Course/CourseSettings.razor b/Management.Web/Shared/Course/CourseSettings.razor new file mode 100644 index 0000000..f124ca4 --- /dev/null +++ b/Management.Web/Shared/Course/CourseSettings.razor @@ -0,0 +1,99 @@ +@inject CanvasService canvas +@inject CoursePlanner planner + +@code +{ + private IEnumerable? terms { get; set; } = null; + private ulong? _selectedTermId {get; set;} + private ulong? selectedTermId { + get => _selectedTermId; + set + { + _selectedTermId = value; + if(selectedTerm != null && planner.LocalCourse != null) + { + planner.LocalCourse = planner.LocalCourse with + { + StartDate=selectedTerm.StartAt ?? new DateTime(), + EndDate=selectedTerm.EndAt ?? new DateTime(), + }; + } + } + } + private EnrollmentTermModel? selectedTerm + { + get => terms?.FirstOrDefault(t => t.Id == selectedTermId); + } + private bool loading = false; + protected override async Task OnInitializedAsync() + { + if(planner.LocalCourse != null && planner.LocalCourse.CanvasId != null) + { + loading = true; + ulong id = planner.LocalCourse?.CanvasId ?? throw new Exception("wtf how did i get here"); + var canvasCourse = await canvas.GetCourse(id); + terms = await canvas.GetCurrentTermsFor(canvasCourse.StartAt); + loading = false; + } + } +} + +
Select Days Of Week
+
+@foreach (DayOfWeek day in (DayOfWeek[])Enum.GetValues(typeof(DayOfWeek))) + { +
+ +
+ } +
+ +@if(loading) +{ + +} + +@if (terms != null) +{ +
+
+
+ Select Term for Start and End Date: + +
+
+
+} \ No newline at end of file diff --git a/Management.Web/Shared/CurrentFiles.razor b/Management.Web/Shared/CurrentFiles.razor index 01fd685..cff8d6f 100644 --- a/Management.Web/Shared/CurrentFiles.razor +++ b/Management.Web/Shared/CurrentFiles.razor @@ -5,14 +5,11 @@ @code { - public IEnumerable localCourses { get; set; } + public IEnumerable? localCourses { get; set; } protected override async Task OnInitializedAsync() { localCourses = await yamlManager.LoadSavedCourses(); } - - - } @if(localCourses != null) diff --git a/Management.Web/Shared/InitializeYamlFromCanvas.razor b/Management.Web/Shared/InitializeYamlFromCanvas.razor index 93e7fdb..249ed2a 100644 --- a/Management.Web/Shared/InitializeYamlFromCanvas.razor +++ b/Management.Web/Shared/InitializeYamlFromCanvas.razor @@ -10,7 +10,7 @@ @code { private bool loadingCourses = false; - public IEnumerable localCourses { get; set; } + public IEnumerable? localCourses { get; set; } private IEnumerable? terms { get; set; } = null; private IEnumerable? courses { get; set;} = null; private ulong? _selectedTermId { get; set; } @@ -20,7 +20,10 @@ set { _selectedTermId = value; - updateCourses(); + @* updateCourses(); *@ + var task = Task.Run(async () => await updateCourses()); + task.Wait(); + StateHasChanged(); } } private EnrollmentTermModel? selectedTerm @@ -58,7 +61,7 @@ CanvasId = selectedCourse.Id, DaysOfWeek = days, }; - await yamlManager.SaveCourse(course); + await yamlManager.SaveCourseAsync(course); } await updateCourses(); } diff --git a/Management.Web/Shared/Module/Assignment/AssignmentCard.razor b/Management.Web/Shared/Module/Assignment/AssignmentCard.razor index f3b1d86..818d910 100644 --- a/Management.Web/Shared/Module/Assignment/AssignmentCard.razor +++ b/Management.Web/Shared/Module/Assignment/AssignmentCard.razor @@ -4,7 +4,7 @@ [Parameter] [Required] public LocalAssignment assignment { get; set; } = new(); - private async Task HandleDragStart() + private void HandleDragStart() { dragContainer.AssignmentBeingDragged = assignment; System.Console.WriteLine("assignment set"); @@ -13,7 +13,7 @@
diff --git a/Management.Web/Shared/Module/Assignment/NewAssignment.razor b/Management.Web/Shared/Module/Assignment/NewAssignment.razor index 93a2528..2b89d26 100644 --- a/Management.Web/Shared/Module/Assignment/NewAssignment.razor +++ b/Management.Web/Shared/Module/Assignment/NewAssignment.razor @@ -4,7 +4,7 @@ @code { [Parameter, EditorRequired] - public string ModuleName { get; set; } + public string ModuleName { get; set; } = ""; [Parameter] public EventCallback OnSubmit { get; set; } diff --git a/Management.Web/Shared/Module/Modules.razor b/Management.Web/Shared/Module/Modules.razor index edb37a5..a1b4b04 100644 --- a/Management.Web/Shared/Module/Modules.razor +++ b/Management.Web/Shared/Module/Modules.razor @@ -7,17 +7,7 @@ @inject BrowserStorageManagement storage @code { - private bool showNewModule { get; set; } = false; - - protected override async Task OnAfterRenderAsync(bool firstRender) - { - if(firstRender) - { - await storage.LoadStoredConfig(); - StateHasChanged(); - } - } - + private bool showNewModule { get; set; } = false; } @if (!showNewModule) @@ -42,13 +32,3 @@ else } } - -
-
- -
\ No newline at end of file diff --git a/Management.Web/Shared/Semester/Day.razor b/Management.Web/Shared/Semester/Day.razor index cfef739..9c320ef 100644 --- a/Management.Web/Shared/Semester/Day.razor +++ b/Management.Web/Shared/Semester/Day.razor @@ -26,9 +26,9 @@ DayOfWeek? weekDay = date?.DayOfWeek; DayOfWeek notNullDay = weekDay ?? default; var dayInSemester = - planner.LocalCourse.DaysOfWeek.Contains(notNullDay) - && date < planner.LocalCourse.EndDate - && date > planner.LocalCourse.StartDate; + planner.LocalCourse?.DaysOfWeek.Contains(notNullDay) ?? false + && date < planner.LocalCourse.EndDate + && date > planner.LocalCourse.StartDate; var totalClasses = dayInSemester ? $"bg-light {baseClasses}" : baseClasses; @@ -45,7 +45,7 @@ Console.WriteLine("on drag start"); } - async Task OnDrop() + void OnDrop() { Console.WriteLine("on drop"); dragging = false; @@ -58,10 +58,10 @@ dragContainer.AssignmentBeingDragged = null; } - async Task OnDragEnter() { + void OnDragEnter() { dragging = true; } - async Task OnDragLeave() { + void OnDragLeave() { dragging = false; } } diff --git a/Management.Web/Shared/Semester/MonthDetail.razor b/Management.Web/Shared/Semester/MonthDetail.razor index e74cd7b..e2e30ed 100644 --- a/Management.Web/Shared/Semester/MonthDetail.razor +++ b/Management.Web/Shared/Semester/MonthDetail.razor @@ -19,7 +19,14 @@
@foreach (DayOfWeek day in WeekDaysList) { -
@day
+
+ @day +
}
diff --git a/Management.Web/Utils/StorageManagement.cs b/Management.Web/Utils/StorageManagement.cs index 87f9c20..c4ff1a0 100644 --- a/Management.Web/Utils/StorageManagement.cs +++ b/Management.Web/Utils/StorageManagement.cs @@ -2,9 +2,9 @@ using Microsoft.AspNetCore.Components.Server.ProtectedBrowserStorage; public class BrowserStorageManagement { - private string moduleStorageKey = "module storage key"; - private string assignmentStorageKey = "assignment storage key"; - private string courseIdKey = "course id storage key"; + // private string moduleStorageKey = "module storage key"; + // private string assignmentStorageKey = "assignment storage key"; + // private string courseIdKey = "course id storage key"; private CoursePlanner planner { get; } private ProtectedLocalStorage storage { get; } @@ -21,53 +21,53 @@ public class BrowserStorageManagement canvas = canvasService; } - public async Task LoadStoredConfig() - { - // var storedModules = await storage.GetAsync>(moduleStorageKey); - // if (storedModules.Success) - // { - // planner.Modules = - // storedModules.Value - // ?? throw new Exception("stored modules was null, it shouldn't have been"); - // } - // else - // { - // Console.WriteLine("no stored modules"); - // } + // public async Task LoadStoredConfig() + // { + // // var storedModules = await storage.GetAsync>(moduleStorageKey); + // // if (storedModules.Success) + // // { + // // planner.Modules = + // // storedModules.Value + // // ?? throw new Exception("stored modules was null, it shouldn't have been"); + // // } + // // else + // // { + // // Console.WriteLine("no stored modules"); + // // } - // var storedAssignments = await storage.GetAsync>(assignmentStorageKey); - // if (storedAssignments.Success) - // { - // planner.Modules = - // storedAssignments.Value - // ?? throw new Exception("stored assignments are null, it shouldn't have been"); - // } - // else - // { - // Console.WriteLine("no stored assignments"); - // } + // // var storedAssignments = await storage.GetAsync>(assignmentStorageKey); + // // if (storedAssignments.Success) + // // { + // // planner.Modules = + // // storedAssignments.Value + // // ?? throw new Exception("stored assignments are null, it shouldn't have been"); + // // } + // // else + // // { + // // Console.WriteLine("no stored assignments"); + // // } - // var storedCourseId = await storage.GetAsync(courseIdKey); - // if (storedCourseId.Success) - // { - // // var courses = - // planner.Course = await canvas.GetCourse(storedCourseId.Value); - // planner.Modules = await canvas.GetModules(planner.Course.Id); - // } - // else - // { - // Console.WriteLine("no stored assignments"); - // } - } + // // var storedCourseId = await storage.GetAsync(courseIdKey); + // // if (storedCourseId.Success) + // // { + // // // var courses = + // // planner.Course = await canvas.GetCourse(storedCourseId.Value); + // // planner.Modules = await canvas.GetModules(planner.Course.Id); + // // } + // // else + // // { + // // Console.WriteLine("no stored assignments"); + // // } + // } - public async Task Save() - { - // await storage.SetAsync(moduleStorageKey, planner.Modules); - // await storage.SetAsync(assignmentStorageKey, planner.Assignments); + // public async Task Save() + // { + // // await storage.SetAsync(moduleStorageKey, planner.Modules); + // // await storage.SetAsync(assignmentStorageKey, planner.Assignments); - // if (planner.Course != null) - // await storage.SetAsync(courseIdKey, planner.Course.Id); - // else - // await storage.DeleteAsync(courseIdKey); - } + // // if (planner.Course != null) + // // await storage.SetAsync(courseIdKey, planner.Course.Id); + // // else + // // await storage.DeleteAsync(courseIdKey); + // } } diff --git a/Management/Features/Configuration/CoursePlanner.cs b/Management/Features/Configuration/CoursePlanner.cs index c9d0541..0334d9c 100644 --- a/Management/Features/Configuration/CoursePlanner.cs +++ b/Management/Features/Configuration/CoursePlanner.cs @@ -5,12 +5,24 @@ using LocalModels; public class CoursePlanner { - public LocalCourse _localCourse { get; set; } = default!; - public LocalCourse LocalCourse + private readonly YamlManager yamlManager; + + public CoursePlanner(YamlManager yamlManager) + { + this.yamlManager = yamlManager; + } + + private LocalCourse? _localCourse { get; set; } + public LocalCourse? LocalCourse { get => _localCourse; set { + // ignore initial load of course + if (_localCourse != null && value != null) + { + yamlManager.SaveCourse(value); + } _localCourse = value; StateHasChanged?.Invoke(); } diff --git a/Management/Services/CanvasService.cs b/Management/Services/CanvasService.cs index 09bb77a..e1baf4a 100644 --- a/Management/Services/CanvasService.cs +++ b/Management/Services/CanvasService.cs @@ -41,7 +41,7 @@ public class CanvasService : ICanvasService public async Task GetCourse(ulong courseId) { - var url = $"course/{courseId}"; + var url = $"courses/{courseId}"; var request = new RestRequest(url); var (data, response) = await webRequestor.GetAsync(request); @@ -127,7 +127,8 @@ public class CanvasService : ICanvasService var currentTerms = terms .Where(t => t.EndAt != null && t.EndAt > queryDate && t.EndAt < queryDate.AddYears(1)) - .Take(3); + .Take(3) + .OrderBy(t => t.StartAt); return currentTerms; } diff --git a/Management/Services/WebRequestor.cs b/Management/Services/WebRequestor.cs index b10faa2..f8a3620 100644 --- a/Management/Services/WebRequestor.cs +++ b/Management/Services/WebRequestor.cs @@ -58,7 +58,7 @@ public class WebRequestor : IWebRequestor } try { - var data = JsonSerializer.Deserialize(response.Content); + var data = JsonSerializer.Deserialize(response.Content!); if (data == null) { diff --git a/Management/Services/YamlManager.cs b/Management/Services/YamlManager.cs index e03cc97..7f158e0 100644 --- a/Management/Services/YamlManager.cs +++ b/Management/Services/YamlManager.cs @@ -6,30 +6,35 @@ public class YamlManager { public string CourseToYaml(LocalCourse course) { - var serializer = new SerializerBuilder() - .Build(); + var serializer = new SerializerBuilder().Build(); var yaml = serializer.Serialize(course); - System.Console.WriteLine(yaml); + // System.Console.WriteLine(yaml); return yaml; } public LocalCourse ParseCourse(string rawCourse) { - var deserializer = new DeserializerBuilder() - .Build(); + var deserializer = new DeserializerBuilder().Build(); var person = deserializer.Deserialize(rawCourse); return person; } - public async Task SaveCourse(LocalCourse course) + public async Task SaveCourseAsync(LocalCourse course) { var courseString = CourseToYaml(course); await File.WriteAllTextAsync($"../storage/{course.Name}.yml", courseString); } + public void SaveCourse(LocalCourse course) + { + var courseString = CourseToYaml(course); + + File.WriteAllText($"../storage/{course.Name}.yml", courseString); + } + public async Task> LoadSavedCourses() { string path = "../storage/";