got initial month layout

This commit is contained in:
2023-01-05 17:27:57 -07:00
parent 159313cbca
commit dc70216f1d
8 changed files with 181 additions and 29 deletions

View File

@@ -20,6 +20,58 @@ public class CanvasServiceTests
EndAt: new DateTime(2022, 2, 1) EndAt: new DateTime(2022, 2, 1)
), ),
}; };
Mock<IWebRequestor> 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<IWebRequestor> 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<IWebRequestor> getTermsMock(EnrollmentTermModel[] expectedTerms)
{
var data = new RedundantEnrollmentTermsResponse(EnrollmentTerms: expectedTerms); var data = new RedundantEnrollmentTermsResponse(EnrollmentTerms: expectedTerms);
var response = new RestResponse<RedundantEnrollmentTermsResponse>(); var response = new RestResponse<RedundantEnrollmentTermsResponse>();
response.Data = data; response.Data = data;
@@ -28,11 +80,7 @@ public class CanvasServiceTests
mockRequestor mockRequestor
.Setup(s => s.GetAsync<RedundantEnrollmentTermsResponse>(It.IsAny<RestRequest>())) .Setup(s => s.GetAsync<RedundantEnrollmentTermsResponse>(It.IsAny<RestRequest>()))
.ReturnsAsync(response); .ReturnsAsync(response);
return mockRequestor;
var service = new CanvasService(mockRequestor.Object);
var canvasTerms = await service.GetTerms();
canvasTerms.Should().BeEquivalentTo(expectedTerms);
} }
} }

View File

@@ -1,5 +1,13 @@
<Project Sdk="Microsoft.NET.Sdk.Web"> <Project Sdk="Microsoft.NET.Sdk.Web">
<ItemGroup>
<ProjectReference Include="..\Management\Management.csproj" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="dotenv.net" Version="3.1.2" />
</ItemGroup>
<PropertyGroup> <PropertyGroup>
<TargetFramework>net7.0</TargetFramework> <TargetFramework>net7.0</TargetFramework>
<Nullable>enable</Nullable> <Nullable>enable</Nullable>

View File

@@ -1,9 +1,42 @@
@page "/" @page "/"
@using CanvasModel.EnrollmentTerms
@using Management.Web.Shared.Semester
@inject ICanvasService canvasService
@code
{
private IEnumerable<EnrollmentTermModel>? 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();
}
}
<PageTitle>Index</PageTitle> <PageTitle>Index</PageTitle>
<h1>Hello, world!</h1> @if (terms != null)
{
<div class="row justify-content-center">
<div class="col-auto">
Welcome to your new app. <form>
<lablel for="termselect">Select Term:</lablel>
<SurveyPrompt Title="How is Blazor working for you?" /> <select id="termselect" class="form-select" @bind="selectedTermId">
@foreach (var term in terms)
{
<option value="@term.Id">@term.Name</option>
}
</select>
</form>
</div>
</div>
}
@if (selectedTerm is not null)
{
<SemesterDetail Term="selectedTerm" />
}

View File

@@ -1,6 +1,12 @@
global using System.Text.Json.Serialization;
global using System.Text.Json;
using Microsoft.AspNetCore.Components; using Microsoft.AspNetCore.Components;
using Microsoft.AspNetCore.Components.Web; using Microsoft.AspNetCore.Components.Web;
using Management.Web.Data; using Management.Web.Data;
using dotenv.net;
DotEnv.Load();
var builder = WebApplication.CreateBuilder(args); var builder = WebApplication.CreateBuilder(args);
@@ -8,15 +14,17 @@ var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages(); builder.Services.AddRazorPages();
builder.Services.AddServerSideBlazor(); builder.Services.AddServerSideBlazor();
builder.Services.AddSingleton<WeatherForecastService>(); builder.Services.AddSingleton<WeatherForecastService>();
builder.Services.AddSingleton<IWebRequestor, WebRequestor>();
builder.Services.AddSingleton<ICanvasService, CanvasService>();
var app = builder.Build(); var app = builder.Build();
// Configure the HTTP request pipeline. // Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment()) if (!app.Environment.IsDevelopment())
{ {
app.UseExceptionHandler("/Error"); 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. // 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.UseHsts();
} }
app.UseHttpsRedirection(); app.UseHttpsRedirection();

View File

@@ -0,0 +1,26 @@
@code
{
[Parameter, EditorRequired]
public CalendarMonth Month { get; set; } = default!;
}
<div class="row text-center fw-bold">
<div class="col">Saturday</div>
<div class="col">Monday</div>
<div class="col">Tuesday</div>
<div class="col">Wednesday</div>
<div class="col">Thursday</div>
<div class="col">Friday</div>
<div class="col">Saturday</div>
</div>
@foreach(var week in Month.DaysByWeek)
{
<div class="row m-3">
@foreach (var day in week)
{
<div class="col border rounded rounded-3 pb-5 m-1">@day?.Day</div>
}
</div>
}

View File

@@ -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)
{
<MonthDetail Month="month" />
<hr />
}

View File

@@ -1,16 +0,0 @@
<div class="alert alert-secondary mt-4">
<span class="oi oi-pencil me-2" aria-hidden="true"></span>
<strong>@Title</strong>
<span class="text-nowrap">
Please take our
<a target="_blank" class="font-weight-bold link-dark" href="https://go.microsoft.com/fwlink/?linkid=2186158">brief survey</a>
</span>
and tell us what you think.
</div>
@code {
// Demonstrates how a parent component can supply parameters
[Parameter]
public string? Title { get; set; }
}

View File

@@ -1,7 +1,14 @@
using CanvasModel.Courses; using CanvasModel.Courses;
using CanvasModel.EnrollmentTerms; using CanvasModel.EnrollmentTerms;
using RestSharp; using RestSharp;
public class CanvasService
public interface ICanvasService
{
Task<IEnumerable<EnrollmentTermModel>> GetCurrentTermsFor(DateTime? _queryDate = null);
Task<IEnumerable<EnrollmentTermModel>> GetTerms();
}
public class CanvasService : ICanvasService
{ {
private const string BaseUrl = "https://snow.instructure.com/api/v1/"; private const string BaseUrl = "https://snow.instructure.com/api/v1/";
private readonly IWebRequestor webRequestor; private readonly IWebRequestor webRequestor;
@@ -64,4 +71,19 @@ public class CanvasService
.TrimStart('<') .TrimStart('<')
.Replace(" ", "") .Replace(" ", "")
.Replace(BaseUrl, ""); .Replace(BaseUrl, "");
public async Task<IEnumerable<EnrollmentTermModel>> 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;
}
} }