workflow to create quiz only in markdown should work now

This commit is contained in:
2023-10-13 12:53:50 -06:00
parent e7daf5f77f
commit c7f9b262da
4 changed files with 43 additions and 19 deletions

View File

@@ -95,7 +95,7 @@
<div class="col-6"> <div class="col-6">
@if(error != null) @if(error != null)
{ {
<p class="text-danger text-truncate">@error</p> <p class="text-danger text-truncate">Error: @error</p>
} }
<QuizPreview Quiz="testQuiz" /> <QuizPreview Quiz="testQuiz" />
</div> </div>

View File

@@ -54,7 +54,7 @@
<div class="col-6">@Quiz.LocalAssignmentGroupName</div> <div class="col-6">@Quiz.LocalAssignmentGroupName</div>
</div> </div>
<div class="p-3">@Quiz.Description</div> <div class="p-3" style="white-space: pre-wrap;">@Quiz.Description</div>
@foreach(var question in Quiz.Questions) @foreach(var question in Quiz.Questions)
{ {

View File

@@ -19,6 +19,8 @@ public class QuizEditorContext
private LocalQuiz? _quiz; private LocalQuiz? _quiz;
private LocalModule? _module;
private readonly MyLogger<CanvasAssignmentService> logger; private readonly MyLogger<CanvasAssignmentService> logger;
public LocalQuiz? Quiz public LocalQuiz? Quiz
@@ -26,6 +28,10 @@ public class QuizEditorContext
get => _quiz; get => _quiz;
set set
{ {
if(_quiz == null)
{
_module = getCurrentModule(value, planner.LocalCourse);
}
_quiz = value; _quiz = value;
StateHasChanged?.Invoke(); StateHasChanged?.Invoke();
} }
@@ -33,18 +39,18 @@ public class QuizEditorContext
public void SaveQuiz(LocalQuiz newQuiz) public void SaveQuiz(LocalQuiz newQuiz)
{ {
if (planner.LocalCourse != null) if (planner.LocalCourse != null && _module != null && Quiz != null)
{ {
var currentModule = getCurrentModule(newQuiz, planner.LocalCourse); // use Quiz not newQuiz because it is the version that was last stored
var updatedModules = planner.LocalCourse.Modules var updatedModules = planner.LocalCourse.Modules
.Select( .Select(
m => m =>
m.Name == currentModule.Name m.Name == _module.Name
? currentModule with ? m with
{ {
Quizzes = currentModule.Quizzes Quizzes = m.Quizzes
.Select(q => q.Name + q.Description == newQuiz.Name + newQuiz.Description ? newQuiz : q) .Select(q => q.Name + q.Description == Quiz.Name + Quiz.Description ? newQuiz : q)
.ToArray() .ToArray()
} }
: m : m
@@ -58,12 +64,11 @@ public class QuizEditorContext
public void DeleteQuiz() public void DeleteQuiz()
{ {
if (planner.LocalCourse != null && Quiz != null) if (planner.LocalCourse != null && Quiz != null && _module != null)
{ {
var currentModule = getCurrentModule(Quiz, planner.LocalCourse);
var updatedModules = planner.LocalCourse.Modules var updatedModules = planner.LocalCourse.Modules
.Select(m => m.Name != currentModule.Name .Select(m => m.Name != _module.Name
? m ? m
: m with { : m with {
Quizzes = m.Quizzes.Where(q => q.Name + q.Description != Quiz.Name + Quiz.Description).ToArray() Quizzes = m.Quizzes.Where(q => q.Name + q.Description != Quiz.Name + Quiz.Description).ToArray()
@@ -132,7 +137,9 @@ public class QuizEditorContext
private static LocalModule getCurrentModule(LocalQuiz newQuiz, LocalCourse course) private static LocalModule getCurrentModule(LocalQuiz newQuiz, LocalCourse course)
{ {
return course.Modules.FirstOrDefault(m => m.Quizzes.Select(q => q.Name + q.Description).Contains(newQuiz.Name + newQuiz.Description)) return course.Modules.FirstOrDefault(
m => m.Quizzes.Select(q => q.Name + q.Description).Contains(newQuiz.Name + newQuiz.Description)
)
?? throw new Exception("could not find current module in quiz editor context"); ?? throw new Exception("could not find current module in quiz editor context");
} }
} }

View File

@@ -75,17 +75,34 @@ Description: {Description}
{ {
var name = extractLabelValue(settings, "Name"); var name = extractLabelValue(settings, "Name");
var shuffleAnswers = bool.Parse(extractLabelValue(settings, "ShuffleAnswers")); var rawShuffleAnswers = extractLabelValue(settings, "ShuffleAnswers");
var oneQuestionAtATime = bool.Parse(extractLabelValue(settings, "OneQuestionAtATime")); var shuffleAnswers = bool.TryParse(rawShuffleAnswers, out bool parsedShuffleAnswers)
var allowedAttempts = int.Parse(extractLabelValue(settings, "AllowedAttempts")); ? parsedShuffleAnswers
var dueAt = DateTime.Parse(extractLabelValue(settings, "DueAt")); : throw new QuizMarkdownParseException($"Error with ShuffleAnswers: {rawShuffleAnswers}");
var rawOneQuestionAtATime = extractLabelValue(settings, "OneQuestionAtATime");
var oneQuestionAtATime = bool.TryParse(rawOneQuestionAtATime, out bool parsedOneQuestion)
? parsedOneQuestion
: throw new QuizMarkdownParseException($"Error with oneQuestionAtATime: {rawOneQuestionAtATime}");
var rawAllowedAttempts = extractLabelValue(settings, "AllowedAttempts");
var allowedAttempts = int.TryParse(rawAllowedAttempts, out int parsedAllowedAttempts)
? parsedAllowedAttempts
: throw new QuizMarkdownParseException($"Error with AllowedAttempts: {rawAllowedAttempts}");
var rawDueAt = extractLabelValue(settings, "DueAt");
var dueAt = DateTime.TryParse(rawDueAt, out DateTime parsedDueAt)
? parsedDueAt
: throw new QuizMarkdownParseException($"Error with DueAt: {rawDueAt}");
var rawLockAt = extractLabelValue(settings, "LockAt"); var rawLockAt = extractLabelValue(settings, "LockAt");
DateTime? lockAt = DateTime.TryParse(rawLockAt, out DateTime parsedLockAt) DateTime? lockAt = DateTime.TryParse(rawLockAt, out DateTime parsedLockAt)
? parsedLockAt ? parsedLockAt
: null; : null;
var description = extractDescription(settings); var description = extractDescription(settings);