mirror of
https://github.com/alexmickelson/canvasManagement.git
synced 2026-03-26 15:48:32 -06:00
before I dive too much more into adding pages in canvas
This commit is contained in:
169
Management.Web/Pages/CoursePageForm/CoursePageForm.razor
Normal file
169
Management.Web/Pages/CoursePageForm/CoursePageForm.razor
Normal file
@@ -0,0 +1,169 @@
|
||||
@using Management.Web.Shared.Components
|
||||
@using CanvasModel.Pages
|
||||
|
||||
@inject CoursePlanner planner
|
||||
@inject CanvasService canvas
|
||||
@inject NavigationManager Navigation
|
||||
@inject PageEditorContext pageContext
|
||||
|
||||
|
||||
@code {
|
||||
protected override void OnInitialized()
|
||||
{
|
||||
pageContext.StateHasChanged += reload;
|
||||
reload();
|
||||
}
|
||||
private void reload()
|
||||
{
|
||||
if (pageContext.Page != null)
|
||||
{
|
||||
name = pageContext.Page.Name;
|
||||
}
|
||||
this.InvokeAsync(this.StateHasChanged);
|
||||
}
|
||||
public void Dispose()
|
||||
{
|
||||
pageContext.StateHasChanged -= reload;
|
||||
}
|
||||
|
||||
private string name { get; set; } = String.Empty;
|
||||
private bool addingPageToCanvas = false;
|
||||
private bool deletingPageFromCanvas = false;
|
||||
|
||||
|
||||
private CanvasPage? pageInCanvas =>
|
||||
planner.CanvasPages?.FirstOrDefault(a => a.Title == pageContext.Page?.Name);
|
||||
|
||||
|
||||
private string canvasPageUrl =>
|
||||
$"https://snow.instructure.com/courses/{planner.LocalCourse?.Settings.CanvasId}/assignments/{pageInCanvas?.PageId}";
|
||||
|
||||
|
||||
private void submitHandler()
|
||||
{
|
||||
if (pageContext.Page != null)
|
||||
{
|
||||
var newPage = pageContext.Page with
|
||||
{
|
||||
Name = name,
|
||||
};
|
||||
|
||||
pageContext.SavePage(newPage);
|
||||
}
|
||||
pageContext.Page = null;
|
||||
}
|
||||
private async Task HandleDelete()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
private void handleNameChange(ChangeEventArgs e)
|
||||
{
|
||||
if (pageContext.Page != null)
|
||||
{
|
||||
var newPage = pageContext.Page with { Name = e.Value?.ToString() ?? "" };
|
||||
pageContext.SavePage(newPage);
|
||||
}
|
||||
}
|
||||
|
||||
private async Task addToCanvas()
|
||||
{
|
||||
addingPageToCanvas = true;
|
||||
await pageContext.AddPageToCanvas();
|
||||
await planner.LoadCanvasData();
|
||||
addingPageToCanvas = false;
|
||||
}
|
||||
private async Task updateInCanvas()
|
||||
{
|
||||
if(pageInCanvas != null)
|
||||
{
|
||||
addingPageToCanvas = true;
|
||||
await pageContext.UpdateInCanvas(pageInCanvas.PageId);
|
||||
await planner.LoadCanvasData();
|
||||
addingPageToCanvas = false;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private async Task deleteFromCanvas()
|
||||
{
|
||||
if (pageInCanvas == null
|
||||
|| planner?.LocalCourse?.Settings.CanvasId == null
|
||||
|| pageContext.Page == null
|
||||
)
|
||||
return;
|
||||
|
||||
deletingPageFromCanvas = true;
|
||||
@* await canvas.Pages.Delete(
|
||||
(ulong)planner.LocalCourse.Settings.CanvasId,
|
||||
pageInCanvas.Id,
|
||||
assignmentContext.Assignment.Name
|
||||
); *@
|
||||
await planner.LoadCanvasData();
|
||||
deletingPageFromCanvas = false;
|
||||
StateHasChanged();
|
||||
}
|
||||
}
|
||||
|
||||
<div class="d-flex flex-column p-2 h-100 w-100" style="height: 100%;" >
|
||||
<div>
|
||||
@pageContext.Page?.Name
|
||||
</div>
|
||||
|
||||
<section class="flex-grow-1 p-1 border rounded-4 bg-dark-subtle" style="min-height: 0;">
|
||||
@if (pageContext.Page != null)
|
||||
{
|
||||
<CoursePageMarkdownEditor />
|
||||
}
|
||||
</section>
|
||||
|
||||
<div class="d-flex justify-content-end p-3">
|
||||
@if (addingPageToCanvas || deletingPageFromCanvas)
|
||||
{
|
||||
<div>
|
||||
<Spinner />
|
||||
</div>
|
||||
}
|
||||
|
||||
<ConfirmationModal Label="Delete" Class="btn btn-danger" OnConfirmAsync="HandleDelete" />
|
||||
<button
|
||||
class="btn btn-outline-secondary mx-3"
|
||||
disabled="@(addingPageToCanvas || deletingPageFromCanvas)"
|
||||
@onclick="addToCanvas"
|
||||
>
|
||||
Add To Canvas
|
||||
</button>
|
||||
@if (pageInCanvas != null)
|
||||
{
|
||||
<a
|
||||
class="btn btn-outline-secondary me-1"
|
||||
href="@canvasPageUrl"
|
||||
target="_blank"
|
||||
disabled="@(addingPageToCanvas || deletingPageFromCanvas)"
|
||||
>
|
||||
View in Canvas
|
||||
</a>
|
||||
<button
|
||||
class="btn btn-outline-secondary mx-3"
|
||||
disabled="@(addingPageToCanvas || deletingPageFromCanvas)"
|
||||
@onclick="updateInCanvas"
|
||||
>
|
||||
Update In Canvas
|
||||
</button>
|
||||
<ConfirmationModal
|
||||
Disabled="@(addingPageToCanvas || deletingPageFromCanvas)"
|
||||
Label="Delete from Canvas"
|
||||
Class="btn btn-outline-danger mx-3"
|
||||
OnConfirmAsync="deleteFromCanvas"
|
||||
/>
|
||||
}
|
||||
<button class="btn btn-primary mx-2" @onclick="@(() => {
|
||||
pageContext.Page = null;
|
||||
Navigation.NavigateTo("/course/" + planner.LocalCourse?.Settings.Name);
|
||||
})">
|
||||
Done
|
||||
</button>
|
||||
</div>
|
||||
|
||||
|
||||
</div>
|
||||
71
Management.Web/Pages/CoursePageForm/CoursePageFormPage.razor
Normal file
71
Management.Web/Pages/CoursePageForm/CoursePageFormPage.razor
Normal file
@@ -0,0 +1,71 @@
|
||||
@page "/course/{CourseName}/page/{PageName}"
|
||||
|
||||
@using CanvasModel.EnrollmentTerms
|
||||
@using CanvasModel.Courses
|
||||
@using Microsoft.AspNetCore.Components.Server.ProtectedBrowserStorage
|
||||
@using LocalModels
|
||||
@using Management.Web.Pages.Course.Module.ModuleItems
|
||||
@using Management.Web.Shared.Components
|
||||
|
||||
@inject FileStorageManager fileStorageManager
|
||||
@inject CanvasService canvas
|
||||
@inject CoursePlanner planner
|
||||
@inject PageEditorContext pageContext
|
||||
@inject ILogger<CoursePageFormPage> logger
|
||||
|
||||
|
||||
|
||||
@code {
|
||||
[Parameter]
|
||||
public string? CourseName { get; set; } = default!;
|
||||
[Parameter]
|
||||
public string? PageName { get; set; } = default!;
|
||||
|
||||
|
||||
private bool loading { get; set; } = true;
|
||||
|
||||
protected override async Task OnInitializedAsync()
|
||||
{
|
||||
if (loading)
|
||||
{
|
||||
loading = false;
|
||||
logger.LogInformation($"loading page {CourseName} {PageName}");
|
||||
if (planner.LocalCourse == null)
|
||||
{
|
||||
var courses = await fileStorageManager.LoadSavedCourses();
|
||||
planner.LocalCourse = courses.First(c => c.Settings.Name == CourseName);
|
||||
logger.LogInformation($"set course to '{planner.LocalCourse?.Settings.Name}'");
|
||||
}
|
||||
|
||||
if (pageContext.Page == null)
|
||||
{
|
||||
var page = planner
|
||||
.LocalCourse?
|
||||
.Modules
|
||||
.SelectMany(m => m.Pages)
|
||||
.FirstOrDefault(a => a.Name == PageName);
|
||||
|
||||
pageContext.Page = page;
|
||||
logger.LogInformation($"set page to '{pageContext.Page?.Name}'");
|
||||
}
|
||||
await planner.LoadCanvasData();
|
||||
base.OnInitialized();
|
||||
StateHasChanged();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
<PageTitle>@CourseName - @PageName</PageTitle>
|
||||
|
||||
<div style="height: 100vh;" class="m-0 p-1 d-flex flex-row">
|
||||
@if (loading)
|
||||
{
|
||||
<Spinner />
|
||||
}
|
||||
|
||||
@if (planner.LocalCourse != null && pageContext.Page != null)
|
||||
{
|
||||
<CoursePageForm />
|
||||
}
|
||||
</div>
|
||||
@@ -0,0 +1,79 @@
|
||||
@using Markdig
|
||||
@using Management.Web.Shared.Components
|
||||
|
||||
@inject CoursePlanner planner
|
||||
@inject PageEditorContext pageContext
|
||||
|
||||
@code {
|
||||
protected override void OnInitialized()
|
||||
{
|
||||
pageContext.StateHasChanged += reload;
|
||||
reload();
|
||||
}
|
||||
private void reload()
|
||||
{
|
||||
if (pageContext.Page != null)
|
||||
{
|
||||
if(rawText == string.Empty)
|
||||
{
|
||||
rawText = pageContext.Page.ToMarkdown();
|
||||
this.InvokeAsync(this.StateHasChanged);
|
||||
}
|
||||
}
|
||||
}
|
||||
public void Dispose()
|
||||
{
|
||||
pageContext.StateHasChanged -= reload;
|
||||
}
|
||||
|
||||
private string rawText { get; set; } = string.Empty;
|
||||
private string? error = null;
|
||||
|
||||
private MarkupString preview { get => (MarkupString)Markdown.ToHtml(pageContext?.Page?.Text ?? ""); }
|
||||
|
||||
private void handleChange(string newRawPage)
|
||||
{
|
||||
rawText = newRawPage;
|
||||
if (newRawPage != string.Empty)
|
||||
{
|
||||
try
|
||||
{
|
||||
var parsed = LocalCoursePage.ParseMarkdown(newRawPage);
|
||||
error = null;
|
||||
pageContext.SavePage(parsed);
|
||||
}
|
||||
catch(LocalPageMarkdownParseException e)
|
||||
{
|
||||
error = e.Message;
|
||||
}
|
||||
finally
|
||||
{
|
||||
StateHasChanged();
|
||||
}
|
||||
}
|
||||
StateHasChanged();
|
||||
}
|
||||
}
|
||||
|
||||
<div class="d-flex w-100 h-100 flex-row">
|
||||
@if(pageContext.Page != null && planner.LocalCourse != null)
|
||||
{
|
||||
<div class="row h-100 w-100">
|
||||
<div class="col-6">
|
||||
|
||||
<MonacoTextArea Value=@rawText OnChange=@handleChange />
|
||||
</div>
|
||||
<div class="col-6 overflow-y-auto h-100" >
|
||||
@if (error != null)
|
||||
{
|
||||
<p class="text-danger text-truncate">Error: @error</p>
|
||||
}
|
||||
<div>Due At: @pageContext.Page.DueAt</div>
|
||||
<hr>
|
||||
<div>
|
||||
@(preview)
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
}
|
||||
</div>
|
||||
Reference in New Issue
Block a user