@page "/settings/quizzes/questions/{id}" @using FWLAZ_Web.Data @using Microsoft.EntityFrameworkCore; @inject IDbContextFactory DbFactory; @inject NavigationManager nav;

Questions for '@SelectedItem.Name'

New Question

Questiongroups

@foreach (QuestionGroupSelect qg in questionGroups) {
}

Answers

@foreach (Answer aw in NewQuestion.Answers) {
}

Existing Questions

@{ int tabcount = 1; } @foreach (Question question in SelectedItem.Questions) {

Question groups

Added

    @foreach (QuestionGroupSelect qgs in questionGroups.Where(qgs => question.QuestionGroups.Any(qg => qg.Id == qgs.questionGroup.Id))) {
  • }

Remaining

    @foreach (QuestionGroupSelect qgs in questionGroups.Where(qgs => question.QuestionGroups.Any(qg => qg.Id == qgs.questionGroup.Id) == false)) {
  • }

Answers

@foreach (Answer aw in question.Answers) {
}
tabcount++; }
@code { [Parameter] public string Id { get; set; } = null!; ElementReference txtNewQuestionText; public Quiz SelectedItem { get; set; } = null!; private Question NewQuestion = null!; private int DefaultAnswerCount = 3; private List questionGroups = new(); private string PrevURL = "/settings/quizzes"; private LocalDbContext? DbContext; protected override async Task OnInitializedAsync() { DbContext ??= await DbFactory.CreateDbContextAsync(); if (DbContext == null) return; SelectedItem = DbContext.Quiz.Include(q => q.Questiongroups).ThenInclude(qg => qg.Questions).ThenInclude(qu => qu.Answers).Single(q => q.Id == Convert.ToInt32(Id)); foreach (QuestionGroup qg in SelectedItem.Questiongroups) { questionGroups.Add(new(qg)); } PrepareNewQuestion(); } private void PrepareNewQuestion() { NewQuestion = new(); if (SelectedItem.Questions.Count > 0) { NewQuestion.Number = SelectedItem.Questions.Max(q => q.Number) + 1; } else { NewQuestion.Number = 1; } NewQuestion.Quiz = SelectedItem; for (int i = 0; i < DefaultAnswerCount; i++) { AddAnswerBox(NewQuestion); } } private async Task AddQuestion_Enter(KeyboardEventArgs e) { if (e.Code == "Enter" || e.Code == "NumpadEnter") await AddQuestion(new MouseEventArgs()); } private async Task AddQuestion(MouseEventArgs e) { NewQuestion.Answers.RemoveAll(aw => aw.Text == null || aw.Text.Trim().Length == 0); if (NewQuestion.Answers.Count == 0 || NewQuestion.Text == null || NewQuestion.Text.Trim().Length == 0 || NewQuestion.Answers.Count(aw => aw.IsCorrect) == 0 || questionGroups.Count(qg => qg.Checked == true) == 0 ) return; foreach (QuestionGroupSelect qgs in questionGroups.Where(qg => qg.Checked)) { NewQuestion.QuestionGroups.Add(qgs.questionGroup); } DefaultAnswerCount = NewQuestion.Answers.Count; SelectedItem.Questions.Add(NewQuestion); PrepareNewQuestion(); await txtNewQuestionText.FocusAsync(); } private void RemoveAnswer(Question question, Answer answer) { question.Answers.Remove(answer); } private void AddAnswerBox(Question question) { char CurLetter = 'a'; for (int i = 0; i < question.Answers.Count; i++) { CurLetter = NextChar(CurLetter); } question.Answers.Add(new() { Position = CurLetter.ToString() }); } private void RemoveQuestion(Question question) { SelectedItem.Questions.Remove(question); } private void RemoveQuestionGroup(Question question, QuestionGroup questionGroup) { question.QuestionGroups.Remove(questionGroup); } private void AddQuestionGroup(Question question, QuestionGroup questionGroup) { if (question.QuestionGroups.Any(qg => qg.Id == questionGroup.Id)) return; question.QuestionGroups.Add(questionGroup); } private char NextChar(char StartLetter) { if (StartLetter == 'z') { return 'a'; } else if (StartLetter == 'Z') { return 'A'; } else { return (char)(((int)StartLetter) + 1); } } public class QuestionGroupSelect { public bool Checked { get; set; } public QuestionGroup questionGroup { get; } public QuestionGroupSelect(QuestionGroup questionGroup) { this.questionGroup = questionGroup; } } private async Task SaveQuiz(MouseEventArgs e) { foreach (Question question in SelectedItem.Questions) { question.Answers.RemoveAll(aw => aw.Text == null || aw.Text.Trim().Length == 0); } DbContext ??= await DbFactory.CreateDbContextAsync(); if (DbContext == null) return; DbContext.Quiz.Update(SelectedItem); await DbContext.SaveChangesAsync(); nav.NavigateTo(PrevURL); } }