From dc70216f1d1c7e79693e496f8c118f27872d57b5 Mon Sep 17 00:00:00 2001 From: Alex Mickelson Date: Thu, 5 Jan 2023 17:27:57 -0700 Subject: [PATCH] got initial month layout --- .../Services/CanvasServiceTests.cs | 58 +++++++++++++++++-- Management.Web/Management.Web.csproj | 8 +++ Management.Web/Pages/Index.razor | 41 +++++++++++-- Management.Web/Program.cs | 14 ++++- .../Shared/Semester/MonthDetail.razor | 26 +++++++++ .../Shared/Semester/SemesterDetail.razor | 23 ++++++++ Management.Web/Shared/SurveyPrompt.razor | 16 ----- Management/Services/CanvasService.cs | 24 +++++++- 8 files changed, 181 insertions(+), 29 deletions(-) create mode 100644 Management.Web/Shared/Semester/MonthDetail.razor create mode 100644 Management.Web/Shared/Semester/SemesterDetail.razor delete mode 100644 Management.Web/Shared/SurveyPrompt.razor diff --git a/Management.Test/Services/CanvasServiceTests.cs b/Management.Test/Services/CanvasServiceTests.cs index ede3544..0b7df79 100644 --- a/Management.Test/Services/CanvasServiceTests.cs +++ b/Management.Test/Services/CanvasServiceTests.cs @@ -20,6 +20,58 @@ public class CanvasServiceTests EndAt: new DateTime(2022, 2, 1) ), }; + Mock mockRequestor = getTermsMock(expectedTerms); + + var service = new CanvasService(mockRequestor.Object); + var canvasTerms = await service.GetTerms(); + + canvasTerms.Should().BeEquivalentTo(expectedTerms); + } + + [Test] + public async Task CanGetActiveTerms() + { + var expectedTerms = new EnrollmentTermModel[] { + new EnrollmentTermModel( + Id: 1, + Name: "one", + StartAt: new DateTime(2022, 5, 1), + EndAt: new DateTime(2022, 7, 1) + ), + new EnrollmentTermModel( + Id: 2, + Name: "two", + StartAt: new DateTime(2022, 7, 1), + EndAt: new DateTime(2022, 9, 1) + ), + new EnrollmentTermModel( + Id: 3, + Name: "three", + StartAt: new DateTime(2022, 9, 1), + EndAt: new DateTime(2022, 10, 1) + ), + new EnrollmentTermModel( + Id: 4, + Name: "four", + StartAt: new DateTime(2022, 10, 1), + EndAt: new DateTime(2022, 11, 1) + ), + }; + Mock mockRequestor = getTermsMock(expectedTerms); + var service = new CanvasService(mockRequestor.Object); + + var queryDate = new DateTime(2022, 6, 1); + var canvasTerms = await service.GetCurrentTermsFor(queryDate); + + canvasTerms.Count().Should().Be(3); + + var termIds = canvasTerms.Select(t => t.Id); + var expectedIds = new int[] { 1, 2, 3 }; + termIds.Should().BeEquivalentTo(expectedIds); + } + + private static Mock getTermsMock(EnrollmentTermModel[] expectedTerms) + { var data = new RedundantEnrollmentTermsResponse(EnrollmentTerms: expectedTerms); var response = new RestResponse(); response.Data = data; @@ -28,11 +80,7 @@ public class CanvasServiceTests mockRequestor .Setup(s => s.GetAsync(It.IsAny())) .ReturnsAsync(response); - - var service = new CanvasService(mockRequestor.Object); - var canvasTerms = await service.GetTerms(); - - canvasTerms.Should().BeEquivalentTo(expectedTerms); + return mockRequestor; } } \ No newline at end of file diff --git a/Management.Web/Management.Web.csproj b/Management.Web/Management.Web.csproj index 72a1294..c91364a 100644 --- a/Management.Web/Management.Web.csproj +++ b/Management.Web/Management.Web.csproj @@ -1,5 +1,13 @@ + + + + + + + + net7.0 enable diff --git a/Management.Web/Pages/Index.razor b/Management.Web/Pages/Index.razor index b1a9fbd..9a80573 100644 --- a/Management.Web/Pages/Index.razor +++ b/Management.Web/Pages/Index.razor @@ -1,9 +1,42 @@ @page "/" +@using CanvasModel.EnrollmentTerms +@using Management.Web.Shared.Semester +@inject ICanvasService canvasService +@code +{ + private IEnumerable? terms { get; set; } = null; + private ulong? selectedTermId { get; set; } = null; + private EnrollmentTermModel? selectedTerm + { + get => terms?.FirstOrDefault(t => t.Id == selectedTermId); + } + protected override async Task OnInitializedAsync() + { + terms = await canvasService.GetCurrentTermsFor(); + } + +} Index -

Hello, world!

+@if (terms != null) +{ +
+
-Welcome to your new app. - - +
+ Select Term: + +
+
+
+} +@if (selectedTerm is not null) +{ + +} \ No newline at end of file diff --git a/Management.Web/Program.cs b/Management.Web/Program.cs index 326d83b..4b85f94 100644 --- a/Management.Web/Program.cs +++ b/Management.Web/Program.cs @@ -1,6 +1,12 @@ +global using System.Text.Json.Serialization; +global using System.Text.Json; + using Microsoft.AspNetCore.Components; using Microsoft.AspNetCore.Components.Web; using Management.Web.Data; +using dotenv.net; + +DotEnv.Load(); var builder = WebApplication.CreateBuilder(args); @@ -8,15 +14,17 @@ var builder = WebApplication.CreateBuilder(args); builder.Services.AddRazorPages(); builder.Services.AddServerSideBlazor(); builder.Services.AddSingleton(); +builder.Services.AddSingleton(); +builder.Services.AddSingleton(); var app = builder.Build(); // Configure the HTTP request pipeline. if (!app.Environment.IsDevelopment()) { - app.UseExceptionHandler("/Error"); - // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts. - app.UseHsts(); + app.UseExceptionHandler("/Error"); + // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts. + app.UseHsts(); } app.UseHttpsRedirection(); diff --git a/Management.Web/Shared/Semester/MonthDetail.razor b/Management.Web/Shared/Semester/MonthDetail.razor new file mode 100644 index 0000000..c415bc2 --- /dev/null +++ b/Management.Web/Shared/Semester/MonthDetail.razor @@ -0,0 +1,26 @@ + +@code +{ + [Parameter, EditorRequired] + public CalendarMonth Month { get; set; } = default!; +} + + +
+
Saturday
+
Monday
+
Tuesday
+
Wednesday
+
Thursday
+
Friday
+
Saturday
+
+@foreach(var week in Month.DaysByWeek) +{ +
+ @foreach (var day in week) + { +
@day?.Day
+ } +
+} \ No newline at end of file diff --git a/Management.Web/Shared/Semester/SemesterDetail.razor b/Management.Web/Shared/Semester/SemesterDetail.razor new file mode 100644 index 0000000..611bf6e --- /dev/null +++ b/Management.Web/Shared/Semester/SemesterDetail.razor @@ -0,0 +1,23 @@ +@using CanvasModel.EnrollmentTerms + + +@code +{ + [Parameter, EditorRequired] + public EnrollmentTermModel Term { get; set; } = default!; + + private SemesterPlanner semester { get; set; } = default!; + protected override void OnParametersSet() + { + semester = new SemesterPlanner(Term); + } + +} + +@Term.Name + +@foreach (var month in semester.Months) +{ + +
+} \ No newline at end of file diff --git a/Management.Web/Shared/SurveyPrompt.razor b/Management.Web/Shared/SurveyPrompt.razor deleted file mode 100644 index b31a4a6..0000000 --- a/Management.Web/Shared/SurveyPrompt.razor +++ /dev/null @@ -1,16 +0,0 @@ -
- - @Title - - - Please take our - brief survey - - and tell us what you think. -
- -@code { - // Demonstrates how a parent component can supply parameters - [Parameter] - public string? Title { get; set; } -} diff --git a/Management/Services/CanvasService.cs b/Management/Services/CanvasService.cs index 8a835c7..8bb8e1e 100644 --- a/Management/Services/CanvasService.cs +++ b/Management/Services/CanvasService.cs @@ -1,7 +1,14 @@ using CanvasModel.Courses; using CanvasModel.EnrollmentTerms; using RestSharp; -public class CanvasService + +public interface ICanvasService +{ + Task> GetCurrentTermsFor(DateTime? _queryDate = null); + Task> GetTerms(); +} + +public class CanvasService : ICanvasService { private const string BaseUrl = "https://snow.instructure.com/api/v1/"; private readonly IWebRequestor webRequestor; @@ -64,4 +71,19 @@ public class CanvasService .TrimStart('<') .Replace(" ", "") .Replace(BaseUrl, ""); + + public async Task> GetCurrentTermsFor(DateTime? _queryDate = null) + { + DateTime queryDate = _queryDate ?? DateTime.Now; + + var terms = await GetTerms(); + + var currentTerms = terms.Where(t => + t.EndAt != null + && t.EndAt > queryDate + && t.EndAt < queryDate.AddYears(1) + ).Take(3); + + return currentTerms; + } } \ No newline at end of file