resolved warnings

This commit is contained in:
2023-07-24 14:31:20 -06:00
parent 6232a7a94e
commit d1383fe1d4
17 changed files with 261 additions and 134 deletions

View File

@@ -1,5 +1,6 @@
@page "/" @page "/"
@using CanvasModel.EnrollmentTerms @using CanvasModel.EnrollmentTerms
@using Management.Web.Shared.Course
@using Management.Web.Shared.Semester @using Management.Web.Shared.Semester
@using CanvasModel.Courses @using CanvasModel.Courses
@using Microsoft.AspNetCore.Components.Server.ProtectedBrowserStorage @using Microsoft.AspNetCore.Components.Server.ProtectedBrowserStorage
@@ -8,7 +9,6 @@
@inject CanvasService canvas @inject CanvasService canvas
@inject CoursePlanner planner @inject CoursePlanner planner
@inject ProtectedLocalStorage BrowserStorage @inject ProtectedLocalStorage BrowserStorage
@inject YamlManager yamlManager
@code @code
{ {
@@ -57,14 +57,13 @@
@if(planner.LocalCourse != null) @if(planner.LocalCourse != null)
{ {
<div class="">
<div class=""> <button
<button @onclick="@(() => planner.LocalCourse = null)"
@onclick="@(() => planner.LocalCourse = default)" class="btn btn-primary"
class="btn btn-primary" >
> Select New Course
Select New Course </button>
</button> </div>
</div> <CourseDetails />
<Calendar />
} }

View File

@@ -5,6 +5,7 @@ global using CanvasModel.EnrollmentTerms;
global using CanvasModel.Courses; global using CanvasModel.Courses;
global using CanvasModel; global using CanvasModel;
global using LocalModels; global using LocalModels;
global using Management.Web.Shared.Course;
using Microsoft.AspNetCore.Components; using Microsoft.AspNetCore.Components;
using Microsoft.AspNetCore.Components.Web; using Microsoft.AspNetCore.Components.Web;
@@ -19,10 +20,10 @@ builder.Services.AddRazorPages();
builder.Services.AddServerSideBlazor(); builder.Services.AddServerSideBlazor();
builder.Services.AddSingleton<IWebRequestor, WebRequestor>(); builder.Services.AddSingleton<IWebRequestor, WebRequestor>();
builder.Services.AddSingleton<CanvasService, CanvasService>(); builder.Services.AddSingleton<CanvasService, CanvasService>();
builder.Services.AddSingleton<YamlManager>();
builder.Services.AddSingleton<CoursePlanner>(); builder.Services.AddSingleton<CoursePlanner>();
builder.Services.AddSingleton<AssignmentDragContainer>(); builder.Services.AddSingleton<AssignmentDragContainer>();
builder.Services.AddScoped<BrowserStorageManagement>(); builder.Services.AddScoped<BrowserStorageManagement>();
builder.Services.AddScoped<YamlManager>();
var app = builder.Build(); var app = builder.Build();

View File

@@ -1,25 +0,0 @@
@using CanvasModel.EnrollmentTerms
@using Management.Web.Shared.Module
@using Management.Web.Shared.Semester
@inject CoursePlanner planner
<br>
<div class="row">
<div class="col">
@if (planner.LocalCourse != null)
{
@foreach (var month in SemesterPlanner.GetMonthsBetweenDates(planner.LocalCourse.StartDate, planner.LocalCourse.EndDate))
{
<MonthDetail Month="month" />
<hr />
}
}
</div>
<div class="col">
<Modules />
</div>
</div>

View File

@@ -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);
}
}
<br>
@if(!showEditCourseSettings)
{
<button class="btn btn-outline-secondary" @onclick="@(() => showEditCourseSettings = true)">Edit Course Settings</button>
}
else
{
<CourseSettings />
<button
class="btn btn-outline-secondary"
@onclick="@(() => showEditCourseSettings = false)"
>
Done Editing Course Settings
</button>
}
<div class="row">
<div class="col">
@if (planner.LocalCourse != null)
{
@foreach (var month in SemesterPlanner.GetMonthsBetweenDates(planner.LocalCourse.StartDate, planner.LocalCourse.EndDate))
{
<MonthDetail Month="month" />
<hr />
}
}
</div>
<div class="col">
<Modules />
</div>
</div>

View File

@@ -0,0 +1,99 @@
@inject CanvasService canvas
@inject CoursePlanner planner
@code
{
private IEnumerable<EnrollmentTermModel>? 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;
}
}
}
<h5>Select Days Of Week</h5>
<div class="row m-3">
@foreach (DayOfWeek day in (DayOfWeek[])Enum.GetValues(typeof(DayOfWeek)))
{
<div class="col">
<button
class="@(
planner.LocalCourse?.DaysOfWeek.Contains(day) ?? false
? "btn btn-secondary"
: "btn btn-outline-secondary"
)"
@onclick="() =>
{
if(planner.LocalCourse?.DaysOfWeek.Contains(day) ?? false)
{
planner.LocalCourse = planner.LocalCourse with
{
DaysOfWeek = planner.LocalCourse.DaysOfWeek.Where((d) => d != day)
};
}
else
{
if (planner.LocalCourse != null)
{
planner.LocalCourse = planner.LocalCourse with
{
DaysOfWeek = planner.LocalCourse.DaysOfWeek.Append(day)
};
}
}
}"
>
@day
</button>
</div>
}
</div>
@if(loading)
{
<Spinner />
}
@if (terms != null)
{
<div class="row justify-content-center">
<div class="col-auto">
<form>
<lablel for="termselect">Select Term for Start and End Date:</lablel>
<select id="termselect" class="form-select" @bind="selectedTermId">
@foreach (var term in terms)
{
<option value="@term.Id">@term.Name</option>
}
</select>
</form>
</div>
</div>
}

View File

@@ -5,14 +5,11 @@
@code @code
{ {
public IEnumerable<LocalCourse> localCourses { get; set; } public IEnumerable<LocalCourse>? localCourses { get; set; }
protected override async Task OnInitializedAsync() protected override async Task OnInitializedAsync()
{ {
localCourses = await yamlManager.LoadSavedCourses(); localCourses = await yamlManager.LoadSavedCourses();
} }
} }
@if(localCourses != null) @if(localCourses != null)

View File

@@ -10,7 +10,7 @@
@code { @code {
private bool loadingCourses = false; private bool loadingCourses = false;
public IEnumerable<LocalCourse> localCourses { get; set; } public IEnumerable<LocalCourse>? localCourses { get; set; }
private IEnumerable<EnrollmentTermModel>? terms { get; set; } = null; private IEnumerable<EnrollmentTermModel>? terms { get; set; } = null;
private IEnumerable<CourseModel>? courses { get; set;} = null; private IEnumerable<CourseModel>? courses { get; set;} = null;
private ulong? _selectedTermId { get; set; } private ulong? _selectedTermId { get; set; }
@@ -20,7 +20,10 @@
set set
{ {
_selectedTermId = value; _selectedTermId = value;
updateCourses(); @* updateCourses(); *@
var task = Task.Run(async () => await updateCourses());
task.Wait();
StateHasChanged();
} }
} }
private EnrollmentTermModel? selectedTerm private EnrollmentTermModel? selectedTerm
@@ -58,7 +61,7 @@
CanvasId = selectedCourse.Id, CanvasId = selectedCourse.Id,
DaysOfWeek = days, DaysOfWeek = days,
}; };
await yamlManager.SaveCourse(course); await yamlManager.SaveCourseAsync(course);
} }
await updateCourses(); await updateCourses();
} }

View File

@@ -4,7 +4,7 @@
[Parameter] [Parameter]
[Required] [Required]
public LocalAssignment assignment { get; set; } = new(); public LocalAssignment assignment { get; set; } = new();
private async Task HandleDragStart() private void HandleDragStart()
{ {
dragContainer.AssignmentBeingDragged = assignment; dragContainer.AssignmentBeingDragged = assignment;
System.Console.WriteLine("assignment set"); System.Console.WriteLine("assignment set");
@@ -13,7 +13,7 @@
<div <div
draggable="true" draggable="true"
ondragstart="@HandleDragStart" @ondragstart="HandleDragStart"
class="col-2" class="col-2"
> >
<div class="card"> <div class="card">

View File

@@ -4,7 +4,7 @@
@code { @code {
[Parameter, EditorRequired] [Parameter, EditorRequired]
public string ModuleName { get; set; } public string ModuleName { get; set; } = "";
[Parameter] [Parameter]
public EventCallback OnSubmit { get; set; } public EventCallback OnSubmit { get; set; }

View File

@@ -7,17 +7,7 @@
@inject BrowserStorageManagement storage @inject BrowserStorageManagement storage
@code { @code {
private bool showNewModule { get; set; } = false; private bool showNewModule { get; set; } = false;
protected override async Task OnAfterRenderAsync(bool firstRender)
{
if(firstRender)
{
await storage.LoadStoredConfig();
StateHasChanged();
}
}
} }
@if (!showNewModule) @if (!showNewModule)
@@ -42,13 +32,3 @@ else
<ModuleDetail Module="module" /> <ModuleDetail Module="module" />
} }
} }
<hr>
<div class="text-center">
<button
class="btn btn-primary"
@onclick="@(async () => await storage.Save())"
>
Save Modules
</button>
</div>

View File

@@ -26,9 +26,9 @@
DayOfWeek? weekDay = date?.DayOfWeek; DayOfWeek? weekDay = date?.DayOfWeek;
DayOfWeek notNullDay = weekDay ?? default; DayOfWeek notNullDay = weekDay ?? default;
var dayInSemester = var dayInSemester =
planner.LocalCourse.DaysOfWeek.Contains(notNullDay) planner.LocalCourse?.DaysOfWeek.Contains(notNullDay) ?? false
&& date < planner.LocalCourse.EndDate && date < planner.LocalCourse.EndDate
&& date > planner.LocalCourse.StartDate; && date > planner.LocalCourse.StartDate;
var totalClasses = dayInSemester ? $"bg-light {baseClasses}" : baseClasses; var totalClasses = dayInSemester ? $"bg-light {baseClasses}" : baseClasses;
@@ -45,7 +45,7 @@
Console.WriteLine("on drag start"); Console.WriteLine("on drag start");
} }
async Task OnDrop() void OnDrop()
{ {
Console.WriteLine("on drop"); Console.WriteLine("on drop");
dragging = false; dragging = false;
@@ -58,10 +58,10 @@
dragContainer.AssignmentBeingDragged = null; dragContainer.AssignmentBeingDragged = null;
} }
async Task OnDragEnter() { void OnDragEnter() {
dragging = true; dragging = true;
} }
async Task OnDragLeave() { void OnDragLeave() {
dragging = false; dragging = false;
} }
} }

View File

@@ -19,7 +19,14 @@
<div class="row text-center fw-bold"> <div class="row text-center fw-bold">
@foreach (DayOfWeek day in WeekDaysList) @foreach (DayOfWeek day in WeekDaysList)
{ {
<div class="@(planner.LocalCourse.DaysOfWeek.Contains(day) ? "col" : "col text-secondary")">@day</div> <div class="@(
planner.LocalCourse?.DaysOfWeek.Contains(day) ?? false
? "col"
: "col text-secondary"
)"
>
@day
</div>
} }
</div> </div>

View File

@@ -2,9 +2,9 @@ using Microsoft.AspNetCore.Components.Server.ProtectedBrowserStorage;
public class BrowserStorageManagement public class BrowserStorageManagement
{ {
private string moduleStorageKey = "module storage key"; // private string moduleStorageKey = "module storage key";
private string assignmentStorageKey = "assignment storage key"; // private string assignmentStorageKey = "assignment storage key";
private string courseIdKey = "course id storage key"; // private string courseIdKey = "course id storage key";
private CoursePlanner planner { get; } private CoursePlanner planner { get; }
private ProtectedLocalStorage storage { get; } private ProtectedLocalStorage storage { get; }
@@ -21,53 +21,53 @@ public class BrowserStorageManagement
canvas = canvasService; canvas = canvasService;
} }
public async Task LoadStoredConfig() // public async Task LoadStoredConfig()
{ // {
// var storedModules = await storage.GetAsync<IEnumerable<CourseModule>>(moduleStorageKey); // // var storedModules = await storage.GetAsync<IEnumerable<CourseModule>>(moduleStorageKey);
// if (storedModules.Success) // // if (storedModules.Success)
// { // // {
// planner.Modules = // // planner.Modules =
// storedModules.Value // // storedModules.Value
// ?? throw new Exception("stored modules was null, it shouldn't have been"); // // ?? throw new Exception("stored modules was null, it shouldn't have been");
// } // // }
// else // // else
// { // // {
// Console.WriteLine("no stored modules"); // // Console.WriteLine("no stored modules");
// } // // }
// var storedAssignments = await storage.GetAsync<IEnumerable<CourseModule>>(assignmentStorageKey); // // var storedAssignments = await storage.GetAsync<IEnumerable<CourseModule>>(assignmentStorageKey);
// if (storedAssignments.Success) // // if (storedAssignments.Success)
// { // // {
// planner.Modules = // // planner.Modules =
// storedAssignments.Value // // storedAssignments.Value
// ?? throw new Exception("stored assignments are null, it shouldn't have been"); // // ?? throw new Exception("stored assignments are null, it shouldn't have been");
// } // // }
// else // // else
// { // // {
// Console.WriteLine("no stored assignments"); // // Console.WriteLine("no stored assignments");
// } // // }
// var storedCourseId = await storage.GetAsync<ulong>(courseIdKey); // // var storedCourseId = await storage.GetAsync<ulong>(courseIdKey);
// if (storedCourseId.Success) // // if (storedCourseId.Success)
// { // // {
// // var courses = // // // var courses =
// planner.Course = await canvas.GetCourse(storedCourseId.Value); // // planner.Course = await canvas.GetCourse(storedCourseId.Value);
// planner.Modules = await canvas.GetModules(planner.Course.Id); // // planner.Modules = await canvas.GetModules(planner.Course.Id);
// } // // }
// else // // else
// { // // {
// Console.WriteLine("no stored assignments"); // // Console.WriteLine("no stored assignments");
// } // // }
} // }
public async Task Save() // public async Task Save()
{ // {
// await storage.SetAsync(moduleStorageKey, planner.Modules); // // await storage.SetAsync(moduleStorageKey, planner.Modules);
// await storage.SetAsync(assignmentStorageKey, planner.Assignments); // // await storage.SetAsync(assignmentStorageKey, planner.Assignments);
// if (planner.Course != null) // // if (planner.Course != null)
// await storage.SetAsync(courseIdKey, planner.Course.Id); // // await storage.SetAsync(courseIdKey, planner.Course.Id);
// else // // else
// await storage.DeleteAsync(courseIdKey); // // await storage.DeleteAsync(courseIdKey);
} // }
} }

View File

@@ -5,12 +5,24 @@ using LocalModels;
public class CoursePlanner public class CoursePlanner
{ {
public LocalCourse _localCourse { get; set; } = default!; private readonly YamlManager yamlManager;
public LocalCourse LocalCourse
public CoursePlanner(YamlManager yamlManager)
{
this.yamlManager = yamlManager;
}
private LocalCourse? _localCourse { get; set; }
public LocalCourse? LocalCourse
{ {
get => _localCourse; get => _localCourse;
set set
{ {
// ignore initial load of course
if (_localCourse != null && value != null)
{
yamlManager.SaveCourse(value);
}
_localCourse = value; _localCourse = value;
StateHasChanged?.Invoke(); StateHasChanged?.Invoke();
} }

View File

@@ -41,7 +41,7 @@ public class CanvasService : ICanvasService
public async Task<CourseModel> GetCourse(ulong courseId) public async Task<CourseModel> GetCourse(ulong courseId)
{ {
var url = $"course/{courseId}"; var url = $"courses/{courseId}";
var request = new RestRequest(url); var request = new RestRequest(url);
var (data, response) = await webRequestor.GetAsync<CourseModel>(request); var (data, response) = await webRequestor.GetAsync<CourseModel>(request);
@@ -127,7 +127,8 @@ public class CanvasService : ICanvasService
var currentTerms = terms var currentTerms = terms
.Where(t => t.EndAt != null && t.EndAt > queryDate && t.EndAt < queryDate.AddYears(1)) .Where(t => t.EndAt != null && t.EndAt > queryDate && t.EndAt < queryDate.AddYears(1))
.Take(3); .Take(3)
.OrderBy(t => t.StartAt);
return currentTerms; return currentTerms;
} }

View File

@@ -58,7 +58,7 @@ public class WebRequestor : IWebRequestor
} }
try try
{ {
var data = JsonSerializer.Deserialize<T>(response.Content); var data = JsonSerializer.Deserialize<T>(response.Content!);
if (data == null) if (data == null)
{ {

View File

@@ -6,30 +6,35 @@ public class YamlManager
{ {
public string CourseToYaml(LocalCourse course) public string CourseToYaml(LocalCourse course)
{ {
var serializer = new SerializerBuilder() var serializer = new SerializerBuilder().Build();
.Build();
var yaml = serializer.Serialize(course); var yaml = serializer.Serialize(course);
System.Console.WriteLine(yaml); // System.Console.WriteLine(yaml);
return yaml; return yaml;
} }
public LocalCourse ParseCourse(string rawCourse) public LocalCourse ParseCourse(string rawCourse)
{ {
var deserializer = new DeserializerBuilder() var deserializer = new DeserializerBuilder().Build();
.Build();
var person = deserializer.Deserialize<LocalCourse>(rawCourse); var person = deserializer.Deserialize<LocalCourse>(rawCourse);
return person; return person;
} }
public async Task SaveCourse(LocalCourse course) public async Task SaveCourseAsync(LocalCourse course)
{ {
var courseString = CourseToYaml(course); var courseString = CourseToYaml(course);
await File.WriteAllTextAsync($"../storage/{course.Name}.yml", courseString); 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<IEnumerable<LocalCourse>> LoadSavedCourses() public async Task<IEnumerable<LocalCourse>> LoadSavedCourses()
{ {
string path = "../storage/"; string path = "../storage/";