mirror of
https://github.com/alexmickelson/canvasManagement.git
synced 2026-03-25 23:28:33 -06:00
got assignment edit page working again
This commit is contained in:
@@ -34,6 +34,9 @@
|
|||||||
private string name { get; set; } = String.Empty;
|
private string name { get; set; } = String.Empty;
|
||||||
private bool addingAssignmentToCanvas = false;
|
private bool addingAssignmentToCanvas = false;
|
||||||
private bool deletingAssignmentFromCanvas = false;
|
private bool deletingAssignmentFromCanvas = false;
|
||||||
|
private bool showHelp = false;
|
||||||
|
|
||||||
|
private void toggleHelp() => showHelp = !showHelp;
|
||||||
|
|
||||||
private void submitHandler()
|
private void submitHandler()
|
||||||
{
|
{
|
||||||
@@ -157,9 +160,6 @@
|
|||||||
deletingAssignmentFromCanvas = false;
|
deletingAssignmentFromCanvas = false;
|
||||||
StateHasChanged();
|
StateHasChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private bool showHelp { get; set; } = false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
<div class="d-flex flex-column p-2 h-100 w-100" style="height: 100%;" >
|
<div class="d-flex flex-column p-2 h-100 w-100" style="height: 100%;" >
|
||||||
@@ -170,7 +170,7 @@
|
|||||||
<section class="flex-grow-1 p-1 border rounded-4 bg-dark-subtle" style="min-height: 0;">
|
<section class="flex-grow-1 p-1 border rounded-4 bg-dark-subtle" style="min-height: 0;">
|
||||||
@if (assignmentContext.Assignment != null)
|
@if (assignmentContext.Assignment != null)
|
||||||
{
|
{
|
||||||
@* <AssignmentMarkdownEditor ShowHelp="@showhelp" /> *@
|
<AssignmentMarkdownEditor ShowHelp=@showHelp />
|
||||||
}
|
}
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
@@ -182,7 +182,7 @@
|
|||||||
</div>
|
</div>
|
||||||
}
|
}
|
||||||
|
|
||||||
<button class="btn btn-outline-secondary mx-3" @onclick="() => showHelp = !showHelp">
|
<button class="btn btn-outline-secondary mx-3" @onclick=toggleHelp>
|
||||||
Toggle Help
|
Toggle Help
|
||||||
</button>
|
</button>
|
||||||
<ConfirmationModal Label="Delete" Class="btn btn-danger" OnConfirmAsync="HandleDelete" />
|
<ConfirmationModal Label="Delete" Class="btn btn-danger" OnConfirmAsync="HandleDelete" />
|
||||||
|
|||||||
@@ -64,7 +64,7 @@
|
|||||||
private MarkupString preview { get => (MarkupString)Markdown.ToHtml(assignmentContext?.Assignment?.Description ?? ""); }
|
private MarkupString preview { get => (MarkupString)Markdown.ToHtml(assignmentContext?.Assignment?.Description ?? ""); }
|
||||||
private string HelpText()
|
private string HelpText()
|
||||||
{
|
{
|
||||||
var groupNames = string.Join(", " , planner.LocalCourse?.Settings.AssignmentGroups.Select(g => g.Name));
|
var groupNames = string.Join(", " , planner.LocalCourse?.Settings.AssignmentGroups.Select(g => g.Name) ?? []);
|
||||||
return $@"
|
return $@"
|
||||||
SubmissionTypes:
|
SubmissionTypes:
|
||||||
- {AssignmentSubmissionType.ONLINE_TEXT_ENTRY}
|
- {AssignmentSubmissionType.ONLINE_TEXT_ENTRY}
|
||||||
|
|||||||
@@ -98,12 +98,17 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@if(existsInCanvas && NeedsToBeUpdatedInCanvas)
|
@if(
|
||||||
|
planner.LocalCourse != null
|
||||||
|
&& existsInCanvas
|
||||||
|
&& NeedsToBeUpdatedInCanvas
|
||||||
|
&& assignmentInCanvas != null
|
||||||
|
)
|
||||||
{
|
{
|
||||||
<div class="mx-3 text-body-tertiary">
|
<div class="mx-3 text-body-tertiary">
|
||||||
@Assignment.GetUpdateReason(
|
@Assignment.GetUpdateReason(
|
||||||
(CanvasAssignment)assignmentInCanvas,
|
(CanvasAssignment)assignmentInCanvas,
|
||||||
Assignment.GetCanvasAssignmentGroupId(planner.LocalCourse.Settings.AssignmentGroups))
|
Assignment.GetCanvasAssignmentGroupId(planner.LocalCourse.Settings.AssignmentGroups))
|
||||||
</div>
|
</div>
|
||||||
}
|
}
|
||||||
@if(!existsInCanvas)
|
@if(!existsInCanvas)
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
"DetailedErrors": true,
|
"DetailedErrors": true,
|
||||||
"Logging": {
|
"Logging": {
|
||||||
"LogLevel": {
|
"LogLevel": {
|
||||||
"Default": "Information",
|
"Default": "Error",
|
||||||
"Microsoft.AspNetCore": "Warning"
|
"Microsoft.AspNetCore": "Warning"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"Logging": {
|
"Logging": {
|
||||||
"LogLevel": {
|
"LogLevel": {
|
||||||
"Default": "Trace",
|
"Default": "Error",
|
||||||
"Microsoft.AspNetCore": "Warning"
|
"Microsoft.AspNetCore": "Warning"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -0,0 +1,10 @@
|
|||||||
|
|
||||||
|
namespace LocalModels;
|
||||||
|
public class RubricMarkdownParseException : Exception
|
||||||
|
{
|
||||||
|
public RubricMarkdownParseException(string message) : base(message) { }
|
||||||
|
}
|
||||||
|
public class AssignmentMarkdownParseException : Exception
|
||||||
|
{
|
||||||
|
public AssignmentMarkdownParseException(string message) : base(message) { }
|
||||||
|
}
|
||||||
@@ -57,89 +57,6 @@ public record LocalAssignment
|
|||||||
return yaml;
|
return yaml;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static LocalAssignment ParseMarkdown(string input)
|
|
||||||
{
|
|
||||||
var settingsString = input.Split("---")[0];
|
|
||||||
var (name, localAssignmentGroupName, submissionTypes, dueAt, lockAt) = parseSettings(settingsString);
|
|
||||||
|
|
||||||
var description = input.Split("---\n")[1].Split("## Rubric")[0];
|
|
||||||
|
|
||||||
var rubricString = input.Split("## Rubric\n")[1];
|
|
||||||
var rubric = ParseRubricMarkdown(rubricString);
|
|
||||||
return new LocalAssignment()
|
|
||||||
{
|
|
||||||
Name = name.Trim(),
|
|
||||||
LocalAssignmentGroupName = localAssignmentGroupName.Trim(),
|
|
||||||
SubmissionTypes = submissionTypes,
|
|
||||||
DueAt = dueAt,
|
|
||||||
LockAt = lockAt,
|
|
||||||
Rubric = rubric,
|
|
||||||
Description = description.Trim()
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
private static (string name, string assignmentGroupName, List<string> submissionTypes, DateTime dueAt, DateTime? lockAt) parseSettings(string input)
|
|
||||||
{
|
|
||||||
var name = extractLabelValue(input, "Name");
|
|
||||||
var rawLockAt = extractLabelValue(input, "LockAt");
|
|
||||||
var rawDueAt = extractLabelValue(input, "DueAt");
|
|
||||||
var localAssignmentGroupName = extractLabelValue(input, "AssignmentGroupName");
|
|
||||||
var submissionTypes = parseSubmissionTypes(input);
|
|
||||||
|
|
||||||
DateTime? lockAt = DateTime.TryParse(rawLockAt, out DateTime parsedLockAt)
|
|
||||||
? parsedLockAt
|
|
||||||
: null;
|
|
||||||
var dueAt = DateTime.TryParse(rawDueAt, out DateTime parsedDueAt)
|
|
||||||
? parsedDueAt
|
|
||||||
: throw new QuizMarkdownParseException($"Error with DueAt: {rawDueAt}");
|
|
||||||
|
|
||||||
return (name, localAssignmentGroupName, submissionTypes, dueAt, lockAt);
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
private static List<string> parseSubmissionTypes(string input)
|
|
||||||
{
|
|
||||||
input = input.Replace("\r\n", "\n");
|
|
||||||
List<string> submissionTypes = new List<string>();
|
|
||||||
|
|
||||||
// Define a regular expression pattern to match the bulleted list items
|
|
||||||
string startOfTypePattern = @"- (.+)";
|
|
||||||
Regex regex = new Regex(startOfTypePattern);
|
|
||||||
|
|
||||||
var words = input.Split("SubmissionTypes:");
|
|
||||||
var inputAfterSubmissionTypes = words[1];
|
|
||||||
|
|
||||||
string[] lines = inputAfterSubmissionTypes.Split("\n", StringSplitOptions.RemoveEmptyEntries);
|
|
||||||
|
|
||||||
foreach (string line in lines)
|
|
||||||
{
|
|
||||||
string trimmedLine = line.Trim();
|
|
||||||
Match match = regex.Match(trimmedLine);
|
|
||||||
|
|
||||||
if (!match.Success)
|
|
||||||
break;
|
|
||||||
|
|
||||||
string type = match.Groups[1].Value.Trim();
|
|
||||||
submissionTypes.Add(type);
|
|
||||||
}
|
|
||||||
|
|
||||||
return submissionTypes;
|
|
||||||
}
|
|
||||||
|
|
||||||
static string extractLabelValue(string input, string label)
|
|
||||||
{
|
|
||||||
string pattern = $@"{label}: (.*?)\n";
|
|
||||||
Match match = Regex.Match(input, pattern);
|
|
||||||
|
|
||||||
if (match.Success)
|
|
||||||
{
|
|
||||||
return match.Groups[1].Value;
|
|
||||||
}
|
|
||||||
|
|
||||||
return string.Empty;
|
|
||||||
}
|
|
||||||
|
|
||||||
public string ToMarkdown()
|
public string ToMarkdown()
|
||||||
{
|
{
|
||||||
var settingsMarkdown = settingsToMarkdown();
|
var settingsMarkdown = settingsToMarkdown();
|
||||||
@@ -180,39 +97,5 @@ public record LocalAssignment
|
|||||||
return builder.ToString();
|
return builder.ToString();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static IEnumerable<RubricItem> ParseRubricMarkdown(string rawMarkdown)
|
public static LocalAssignment ParseMarkdown(string input) => LocalAssignmentMarkdownParser.ParseMarkdown(input);
|
||||||
{
|
|
||||||
if (rawMarkdown.Trim() == string.Empty)
|
|
||||||
return [];
|
|
||||||
var lines = rawMarkdown.Trim().Split("\n");
|
|
||||||
var items = lines.Select(parseIndividualRubricItemMarkdown).ToArray();
|
|
||||||
return items;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static RubricItem parseIndividualRubricItemMarkdown(string rawMarkdown)
|
|
||||||
{
|
|
||||||
var pointsPattern = @"\s*-\s*(\d+)\s*pt(s)?:";
|
|
||||||
var match = Regex.Match(rawMarkdown, pointsPattern);
|
|
||||||
if (!match.Success)
|
|
||||||
throw new RubricMarkdownParseException($"points not found: {rawMarkdown}");
|
|
||||||
|
|
||||||
var points = int.Parse(match.Groups[1].Value);
|
|
||||||
|
|
||||||
var label = string.Join(": ", rawMarkdown.Split(": ").Skip(1));
|
|
||||||
|
|
||||||
return new RubricItem()
|
|
||||||
{
|
|
||||||
Points = points,
|
|
||||||
Label = label
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public class RubricMarkdownParseException : Exception
|
|
||||||
{
|
|
||||||
public RubricMarkdownParseException(string message) : base(message) { }
|
|
||||||
}
|
|
||||||
public class AssignmentMarkdownParseException : Exception
|
|
||||||
{
|
|
||||||
public AssignmentMarkdownParseException(string message) : base(message) { }
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,120 @@
|
|||||||
|
|
||||||
|
|
||||||
|
using System.Text.RegularExpressions;
|
||||||
|
|
||||||
|
namespace LocalModels;
|
||||||
|
public static class LocalAssignmentMarkdownParser
|
||||||
|
{
|
||||||
|
|
||||||
|
public static LocalAssignment ParseMarkdown(string input)
|
||||||
|
{
|
||||||
|
var settingsString = input.Split("---")[0];
|
||||||
|
var (name, localAssignmentGroupName, submissionTypes, dueAt, lockAt) = parseSettings(settingsString);
|
||||||
|
|
||||||
|
var description = input.Split("---\n")[1].Split("## Rubric")[0];
|
||||||
|
|
||||||
|
var rubricString = input.Split("## Rubric\n")[1];
|
||||||
|
var rubric = ParseRubricMarkdown(rubricString);
|
||||||
|
return new LocalAssignment()
|
||||||
|
{
|
||||||
|
Name = name.Trim(),
|
||||||
|
LocalAssignmentGroupName = localAssignmentGroupName.Trim(),
|
||||||
|
SubmissionTypes = submissionTypes,
|
||||||
|
DueAt = dueAt,
|
||||||
|
LockAt = lockAt,
|
||||||
|
Rubric = rubric,
|
||||||
|
Description = description.Trim()
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
private static (string name, string assignmentGroupName, List<string> submissionTypes, DateTime dueAt, DateTime? lockAt) parseSettings(string input)
|
||||||
|
{
|
||||||
|
var name = extractLabelValue(input, "Name");
|
||||||
|
var rawLockAt = extractLabelValue(input, "LockAt");
|
||||||
|
var rawDueAt = extractLabelValue(input, "DueAt");
|
||||||
|
var localAssignmentGroupName = extractLabelValue(input, "AssignmentGroupName");
|
||||||
|
var submissionTypes = parseSubmissionTypes(input);
|
||||||
|
|
||||||
|
DateTime? lockAt = DateTime.TryParse(rawLockAt, out DateTime parsedLockAt)
|
||||||
|
? parsedLockAt
|
||||||
|
: null;
|
||||||
|
var dueAt = DateTime.TryParse(rawDueAt, out DateTime parsedDueAt)
|
||||||
|
? parsedDueAt
|
||||||
|
: throw new QuizMarkdownParseException($"Error with DueAt: {rawDueAt}");
|
||||||
|
|
||||||
|
return (name, localAssignmentGroupName, submissionTypes, dueAt, lockAt);
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private static List<string> parseSubmissionTypes(string input)
|
||||||
|
{
|
||||||
|
input = input.Replace("\r\n", "\n");
|
||||||
|
List<string> submissionTypes = new List<string>();
|
||||||
|
|
||||||
|
// Define a regular expression pattern to match the bulleted list items
|
||||||
|
string startOfTypePattern = @"- (.+)";
|
||||||
|
Regex regex = new Regex(startOfTypePattern);
|
||||||
|
|
||||||
|
var words = input.Split("SubmissionTypes:");
|
||||||
|
var inputAfterSubmissionTypes = words[1];
|
||||||
|
|
||||||
|
string[] lines = inputAfterSubmissionTypes.Split("\n", StringSplitOptions.RemoveEmptyEntries);
|
||||||
|
|
||||||
|
foreach (string line in lines)
|
||||||
|
{
|
||||||
|
string trimmedLine = line.Trim();
|
||||||
|
Match match = regex.Match(trimmedLine);
|
||||||
|
|
||||||
|
if (!match.Success)
|
||||||
|
break;
|
||||||
|
|
||||||
|
string type = match.Groups[1].Value.Trim();
|
||||||
|
submissionTypes.Add(type);
|
||||||
|
}
|
||||||
|
|
||||||
|
return submissionTypes;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static string extractLabelValue(string input, string label)
|
||||||
|
{
|
||||||
|
string pattern = $@"{label}: (.*?)\n";
|
||||||
|
Match match = Regex.Match(input, pattern);
|
||||||
|
|
||||||
|
if (match.Success)
|
||||||
|
{
|
||||||
|
return match.Groups[1].Value;
|
||||||
|
}
|
||||||
|
|
||||||
|
return string.Empty;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static IEnumerable<RubricItem> ParseRubricMarkdown(string rawMarkdown)
|
||||||
|
{
|
||||||
|
if (rawMarkdown.Trim() == string.Empty)
|
||||||
|
return [];
|
||||||
|
var lines = rawMarkdown.Trim().Split("\n");
|
||||||
|
var items = lines.Select(parseIndividualRubricItemMarkdown).ToArray();
|
||||||
|
return items;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static RubricItem parseIndividualRubricItemMarkdown(string rawMarkdown)
|
||||||
|
{
|
||||||
|
var pointsPattern = @"\s*-\s*(\d+)\s*pt(s)?:";
|
||||||
|
var match = Regex.Match(rawMarkdown, pointsPattern);
|
||||||
|
if (!match.Success)
|
||||||
|
throw new RubricMarkdownParseException($"points not found: {rawMarkdown}");
|
||||||
|
|
||||||
|
var points = int.Parse(match.Groups[1].Value);
|
||||||
|
|
||||||
|
var label = string.Join(": ", rawMarkdown.Split(": ").Skip(1));
|
||||||
|
|
||||||
|
return new RubricItem()
|
||||||
|
{
|
||||||
|
Points = points,
|
||||||
|
Label = label
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -16,6 +16,7 @@ services:
|
|||||||
- ~/projects/faculty/1400/2024_spring_alex/modules:/app/storage/1400
|
- ~/projects/faculty/1400/2024_spring_alex/modules:/app/storage/1400
|
||||||
- ~/projects/faculty/1405/2024_spring_alex/modules:/app/storage/1405
|
- ~/projects/faculty/1405/2024_spring_alex/modules:/app/storage/1405
|
||||||
- ~/projects/faculty/4620_Distributed/2024Spring/modules:/app/storage/distributed
|
- ~/projects/faculty/4620_Distributed/2024Spring/modules:/app/storage/distributed
|
||||||
|
- ~/projects/faculty/3840_Telemetry/2024Spring_alex/modules:/app/storage/telemetry_and_operations
|
||||||
|
|
||||||
collector:
|
collector:
|
||||||
image: otel/opentelemetry-collector-contrib
|
image: otel/opentelemetry-collector-contrib
|
||||||
|
|||||||
Reference in New Issue
Block a user