From b93e30e330fc235ec6e915a9de6a8a8997b6e087 Mon Sep 17 00:00:00 2001 From: Vincent Vanwaelscappel Date: Tue, 13 Oct 2020 14:21:35 +0200 Subject: [PATCH] done #3946 @2.5 --- .../Controllers/Admin/Base/QuizController.php | 2 + .../Admin/Operations/LogOperation.php | 32 ++++++++++ app/Models/Quiz.php | 2 +- app/Models/QuizAttempt.php | 34 ++++++++++ resources/quiz/js/main.js | 63 +++++++++++++------ 5 files changed, 113 insertions(+), 20 deletions(-) create mode 100644 app/Http/Controllers/Admin/Operations/LogOperation.php create mode 100644 app/Models/QuizAttempt.php diff --git a/app/Http/Controllers/Admin/Base/QuizController.php b/app/Http/Controllers/Admin/Base/QuizController.php index 324056b4f..efb7eec0f 100644 --- a/app/Http/Controllers/Admin/Base/QuizController.php +++ b/app/Http/Controllers/Admin/Base/QuizController.php @@ -5,6 +5,7 @@ namespace App\Http\Controllers\Admin\Base; use App\Http\Controllers\Admin\Operations\DownloadOperation; use App\Http\Controllers\Admin\Operations\ImportOperation; +use App\Http\Controllers\Admin\Operations\LogOperation; use App\Http\Controllers\Admin\Operations\PreviewOperation; use Cubist\Backpack\app\Magic\Controllers\CubistMagicController; @@ -13,6 +14,7 @@ class QuizController extends CubistMagicController use PreviewOperation; use DownloadOperation; use ImportOperation; + use LogOperation; function setupListOperation() { diff --git a/app/Http/Controllers/Admin/Operations/LogOperation.php b/app/Http/Controllers/Admin/Operations/LogOperation.php new file mode 100644 index 000000000..64735b18f --- /dev/null +++ b/app/Http/Controllers/Admin/Operations/LogOperation.php @@ -0,0 +1,32 @@ +withoutMiddleware([VerifyCsrfToken::class]); + } + + protected function log($id) + { + $request = request(); + + $log = new QuizAttempt(); + $log->quiz = $id; + $log->score = $request->get('score'); + $log->passed = $request->get('passed')?'1':'0'; + $log->answers = json_encode($request->get('questions')); + $log->save(); + + return response()->json(['ok' => true])->header('Access-Control-Allow-Origin', '*'); + } +} diff --git a/app/Models/Quiz.php b/app/Models/Quiz.php index 045d18db9..8e67d3f12 100644 --- a/app/Models/Quiz.php +++ b/app/Models/Quiz.php @@ -216,7 +216,7 @@ class Quiz extends CubistMagicAbstractModel // Create data.xml $xml = simplexml_load_string(''); - $xml->addAttribute('id', $data->get('id')); + $xml->addChild('id', $data->get('id')); $xml->addChild('title', $data->get('title')); $xml->addChild('threshold', $data->get('threshold', '0') ?: '0'); $xml->addChild('instantReview', $data->get('instantReview', true) ? '1' : '0'); diff --git a/app/Models/QuizAttempt.php b/app/Models/QuizAttempt.php new file mode 100644 index 000000000..85570fa63 --- /dev/null +++ b/app/Models/QuizAttempt.php @@ -0,0 +1,34 @@ + 'quizatttempt', + 'singular' => 'quiz attempt', + 'plural' => 'quiz attempts']; + + public function setFields() + { + parent::setFields(); + + $this->addField(['type' => 'Number', + 'name' => 'quiz', + 'label' => 'Quiz ID']); + + $this->addField(['type' => 'Number', + 'name' => 'score', + 'label' => 'Score']); + + $this->addField(['type' => 'Checkbox', + 'name' => 'passed', + 'label' => 'Passed']); + + $this->addField(['type' => 'Textarea', + 'name' => 'answers', + 'label' => 'Answers']); + } +} diff --git a/resources/quiz/js/main.js b/resources/quiz/js/main.js index 4e6874d85..b09ae217b 100644 --- a/resources/quiz/js/main.js +++ b/resources/quiz/js/main.js @@ -106,12 +106,16 @@ var correction = $('

' + getTranslation('reviewAnswer') + '

'); var qn = 1; + countQuestions = 0; // Create questions $(data).find('questions question').each(function () { + if ($(this).attr('count') == '1') { + countQuestions++; + } var type = $(this).attr('type'); var multiple = $(this).attr('multiple') == '1'; var multipleclass = multiple ? ' multiple' : ''; - var question = '
'; + var question = '
'; question += '

' + sprintf(getTranslation('question'), qn) + '

' + $(this).find('label').text() + '
'; question += '
'; question += '
'; @@ -168,8 +172,6 @@ qn++; }); - totalQuestions = (qn - 1); - var defaultMessage = $(data).find('defaultMessage').length > 0 && $(data).find('defaultMessage').text() !== '' ? $(data).find('defaultMessage').text() : 'You have finished the quiz!'; var passedMessage = $(data).find('passedMessage').length > 0 && $(data).find('passedMessage').text() !== '' ? $(data).find('passedMessage').text() : defaultMessage; var failedMessage = $(data).find('failedMessage').length > 0 && $(data).find('failedMessage').text() !== '' ? $(data).find('failedMessage').text() : defaultMessage; @@ -181,7 +183,7 @@ '

' + defaultMessage + '

' + '

' + passedMessage + '

' + '

' + failedMessage + '

' + - '
' + getTranslation('totalQuestions') + ' ' + totalQuestions + '
' + getTranslation('correctAnswers') + '
'); + '
' + getTranslation('totalQuestions') + ' ' + countQuestions + '
' + getTranslation('correctAnswers') + '
'); $(results).append(correction); $("main").append(results); @@ -307,17 +309,24 @@ var passed = checkScore(); if (logAttempts) { - $.ajax('https://toolbox.fluidbook.com/quizlog/', + var logdata = { + passed: passed, + score: Math.round(100 * (score / countQuestions)), + questions: logQuestions, + }; + + $.ajax('https://toolbox.fluidbook.com/quiz/' + $(data).find('id').text() + '/log', { - method: 'post', + method: 'POST', data: logdata, + crossDomain: true, } ); } } function checkScore() { - var normalizedScore = score / totalQuestions; + var normalizedScore = score / countQuestions; $('#results > h2').hide(); var passed; if (threshold === 0) { @@ -332,6 +341,7 @@ execAction(failedAction); passed = false; } + return passed; } function execAction(action) { @@ -369,27 +379,42 @@ score = 0; var answers = []; var qn = 1; + logQuestions = []; $('.question').each(function () { var a = []; var ok = true; + var count = $(this).attr('data-count') == '1'; + var log = { + 'count': count, + }; + + if ($(this).data('type') === 'multiple') { + $(this).find('.answer').each(function () { + var correct = $(this).attr('data-correct') == '1'; + var active = $(this).hasClass('active'); + if (correct !== active) { + ok = false; + } + if (active) { + a.push($(this).data('a')) + } + }); + answers.push(a); + log.anwser = a; + } else { + log.anwser = $(this).find('input').val(); + } - $(this).find('.answer').each(function () { - var correct = $(this).attr('data-correct') == '1'; - var active = $(this).hasClass('active'); - if (correct !== active) { - ok = false; - } - if (active) { - a.push($(this).data('a')) - } - }); - answers.push(a); var b = $("#correction .correction[data-i='" + qn + "'] .badge"); $(b).removeClass('correct').removeClass('incorrect').addClass(ok ? 'correct' : 'incorrect'); - if (ok) { + if (ok && count) { score++; + log.score = 1; + } else { + log.score = 0; } + logQuestions[qn] = log; qn++; }); -- 2.39.5