From 7c857a388740677b6909911508eb3d2230d07d8c Mon Sep 17 00:00:00 2001 From: Alex Mickelson Date: Thu, 27 Jul 2023 19:51:36 -0600 Subject: [PATCH] got assignment template variables and replacement working --- Management.Web/Pages/Index.razor | 21 -------------- Management.Web/Program.cs | 1 - .../Module/Assignment/AssignmentDetails.razor | 18 +++++++++++- .../AssignmentDescriptionEditor.razor | 28 ++++++++++++++++--- .../AssignmentForm/AssignmentForm.razor | 2 ++ Management.Web/Utils/StorageManagement.cs | 28 ------------------- Management/Management.csproj | 1 + Management/Models/Local/AssignmentTemplate.cs | 12 ++++++++ Management/Services/ICanvasTokenManagement.cs | 5 ---- Management/Services/WebRequestor.cs | 28 +++++-------------- 10 files changed, 63 insertions(+), 81 deletions(-) delete mode 100644 Management.Web/Utils/StorageManagement.cs delete mode 100644 Management/Services/ICanvasTokenManagement.cs diff --git a/Management.Web/Pages/Index.razor b/Management.Web/Pages/Index.razor index bc70b8a..50c540f 100644 --- a/Management.Web/Pages/Index.razor +++ b/Management.Web/Pages/Index.razor @@ -11,13 +11,11 @@ @inject CanvasService canvas @inject CoursePlanner planner -@inject ICanvasTokenManagement tokenManagement @code { private bool showNewFile { get; set; } = false; - private bool hasCanvasToken { get; set; } = false; protected override void OnInitialized() { planner.StateHasChanged += reload; @@ -32,29 +30,10 @@ { planner.StateHasChanged -= reload; } - protected override async Task OnAfterRenderAsync(bool firstRender) - { - if(firstRender) - { - hasCanvasToken = await tokenManagement.GetCanvasToken() != null; - StateHasChanged(); - } - } - private async Task SetToken(string newToken) - { - await tokenManagement.SaveCanvasToken(newToken); - hasCanvasToken = true; - StateHasChanged(); - } } Index -@if(!hasCanvasToken) -{ - -} - @if(planner.LocalCourse == null) { diff --git a/Management.Web/Program.cs b/Management.Web/Program.cs index f7b4165..f1ffe11 100644 --- a/Management.Web/Program.cs +++ b/Management.Web/Program.cs @@ -19,7 +19,6 @@ var builder = WebApplication.CreateBuilder(args); // Add services to the container. builder.Services.AddRazorPages(); builder.Services.AddServerSideBlazor(); -builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddSingleton(); diff --git a/Management.Web/Shared/Module/Assignment/AssignmentDetails.razor b/Management.Web/Shared/Module/Assignment/AssignmentDetails.razor index 7d3e247..80655de 100644 --- a/Management.Web/Shared/Module/Assignment/AssignmentDetails.razor +++ b/Management.Web/Shared/Module/Assignment/AssignmentDetails.razor @@ -134,7 +134,23 @@
- @Assignment.description + @if(Assignment.use_template) + { + var template = planner.LocalCourse?.AssignmentTemplates.First((t) => t.Id == Assignment.template_id); + if(template == null) + { + System.Console.WriteLine($"Could not find template fof assignment, {Assignment.template_id}"); + } + else + { + var html = AssignmentTemplate.GetHtml(template, Assignment); + @((MarkupString) html) + } + } + else + { + @Assignment.description + }
diff --git a/Management.Web/Shared/Module/Assignment/AssignmentForm/AssignmentDescriptionEditor.razor b/Management.Web/Shared/Module/Assignment/AssignmentForm/AssignmentDescriptionEditor.razor index 1ca5b44..80beff6 100644 --- a/Management.Web/Shared/Module/Assignment/AssignmentForm/AssignmentDescriptionEditor.razor +++ b/Management.Web/Shared/Module/Assignment/AssignmentForm/AssignmentDescriptionEditor.razor @@ -9,6 +9,8 @@ public bool UseTemplate { get; set; } [Parameter] public string? TemplateId { get; set; } + [Parameter] + public Dictionary VariableValues { get; set; } = new Dictionary(); [Parameter] public EventCallback DescriptionChanged { get; set; } @@ -19,12 +21,14 @@ [Parameter] public EventCallback TemplateIdChanged { get; set; } - private string selectedTemplateId { get; set; } + [Parameter] + public EventCallback> VariableValuesChanged { get; set; } + private AssignmentTemplate? selectedTemplate => planner .LocalCourse? .AssignmentTemplates - .FirstOrDefault(t => t.Id == selectedTemplateId); + .FirstOrDefault(t => t.Id == TemplateId); } @@ -55,8 +59,14 @@
- + @foreach (var template in planner.LocalCourse.AssignmentTemplates) { @@ -79,6 +89,16 @@
} diff --git a/Management.Web/Shared/Module/Assignment/AssignmentForm/AssignmentForm.razor b/Management.Web/Shared/Module/Assignment/AssignmentForm/AssignmentForm.razor index 7f8309e..1bc6536 100644 --- a/Management.Web/Shared/Module/Assignment/AssignmentForm/AssignmentForm.razor +++ b/Management.Web/Shared/Module/Assignment/AssignmentForm/AssignmentForm.razor @@ -55,6 +55,7 @@ .Where(r => !r.Label.Contains(RubricItem.extraCredit)) .Select(s => s.Points) .Sum(); + var newAssignment = Assignment with { name=name, @@ -117,6 +118,7 @@ @bind-Description="description" @bind-UseTemplate="useTemplate" @bind-TemplateId="templateId" + @bind-VariableValues="templateVariables" />
diff --git a/Management.Web/Utils/StorageManagement.cs b/Management.Web/Utils/StorageManagement.cs deleted file mode 100644 index c1e83a2..0000000 --- a/Management.Web/Utils/StorageManagement.cs +++ /dev/null @@ -1,28 +0,0 @@ -using Microsoft.AspNetCore.Components.Server.ProtectedBrowserStorage; - -public class BrowserStorageManagement : ICanvasTokenManagement -{ - // private string moduleStorageKey = "module storage key"; - // private string assignmentStorageKey = "assignment storage key"; - private string canvasKey = "canvas key"; - - private ProtectedLocalStorage storage { get; } - - public BrowserStorageManagement(ProtectedLocalStorage BrowserStorage) - { - storage = BrowserStorage; - } - - public async Task GetCanvasToken() - { - var result = await storage.GetAsync(canvasKey); - if (!result.Success) - return null; - return result.Value; - } - - public async Task SaveCanvasToken(string token) - { - await storage.SetAsync(canvasKey, token); - } -} diff --git a/Management/Management.csproj b/Management/Management.csproj index 86f7c20..1d2bbcf 100644 --- a/Management/Management.csproj +++ b/Management/Management.csproj @@ -7,6 +7,7 @@ + diff --git a/Management/Models/Local/AssignmentTemplate.cs b/Management/Models/Local/AssignmentTemplate.cs index 791e73c..4d214cf 100644 --- a/Management/Models/Local/AssignmentTemplate.cs +++ b/Management/Models/Local/AssignmentTemplate.cs @@ -15,4 +15,16 @@ public record AssignmentTemplate return matches.Select(match => match.Groups[1].Value); } + public static string GetHtml(AssignmentTemplate template, LocalAssignment assignment) + { + + var html = Markdig.Markdown.ToHtml(template.Markdown); + + foreach (KeyValuePair entry in assignment.template_variables) + { + html = html.Replace($"%7B%7B{entry.Key}%7D%7D", entry.Value); + } + return html; + } + } diff --git a/Management/Services/ICanvasTokenManagement.cs b/Management/Services/ICanvasTokenManagement.cs deleted file mode 100644 index a33e182..0000000 --- a/Management/Services/ICanvasTokenManagement.cs +++ /dev/null @@ -1,5 +0,0 @@ -public interface ICanvasTokenManagement -{ - Task GetCanvasToken(); - Task SaveCanvasToken(string token); -} \ No newline at end of file diff --git a/Management/Services/WebRequestor.cs b/Management/Services/WebRequestor.cs index eec913b..b29933c 100644 --- a/Management/Services/WebRequestor.cs +++ b/Management/Services/WebRequestor.cs @@ -3,46 +3,33 @@ using RestSharp; public class WebRequestor : IWebRequestor { private const string BaseUrl = "https://snow.instructure.com/api/v1/"; - private bool tokenSet = false; + private string token; private RestClient client; - private ICanvasTokenManagement tokenManagement { get; } - - public WebRequestor(ICanvasTokenManagement tokenManagement) + public WebRequestor() { + token = + Environment.GetEnvironmentVariable("CANVAS_TOKEN") + ?? throw new Exception("CANVAS_TOKEN not in environment"); client = new RestClient(BaseUrl); - this.tokenManagement = tokenManagement; + client.AddDefaultHeader("Authorization", $"Bearer {token}"); } - private async Task EnsureCanvasTokenSet() - { - if (tokenSet) - return; - - var newToken = await tokenManagement.GetCanvasToken(); - if(newToken == null) - throw new Exception("cannot request canvas, no token in storage"); - - client.AddDefaultHeader("Authorization", $"Bearer {newToken}"); - tokenSet = true; - } + public async Task<(T[]?, RestResponse)> GetManyAsync(RestRequest request) { - await EnsureCanvasTokenSet(); var response = await client.ExecuteGetAsync(request); return (Deserialize(response), response); } public async Task<(T?, RestResponse)> GetAsync(RestRequest request) { - await EnsureCanvasTokenSet(); var response = await client.ExecuteGetAsync(request); return (Deserialize(response), response); } public async Task PostAsync(RestRequest request) { - await EnsureCanvasTokenSet(); var response = await client.ExecutePostAsync(request); if (!response.IsSuccessful) { @@ -56,7 +43,6 @@ public class WebRequestor : IWebRequestor public async Task<(T?, RestResponse)> PostAsync(RestRequest request) { - await EnsureCanvasTokenSet(); var response = await client.ExecutePostAsync(request); return (Deserialize(response), response); }