]> _ Git - fluidbook-toolbox.git/commitdiff
wait #3947 @2.5
authorVincent Vanwaelscappel <vincent@cubedesigners.com>
Wed, 14 Oct 2020 11:55:21 +0000 (13:55 +0200)
committerVincent Vanwaelscappel <vincent@cubedesigners.com>
Wed, 14 Oct 2020 11:55:21 +0000 (13:55 +0200)
app/Http/Controllers/Admin/Operations/LogOperation.php
app/Http/Controllers/Admin/Operations/ReportOperation.php
app/SubForms/Question.php
composer.lock
resources/quiz/js/main.js

index 64735b18f5e2401e173fa9428222d0ae15e972dc..f3d727e3c3d0d8add554297d000b7194f702effc 100644 (file)
@@ -23,7 +23,7 @@ trait LogOperation
         $log = new QuizAttempt();
         $log->quiz = $id;
         $log->score = $request->get('score');
-        $log->passed = $request->get('passed')?'1':'0';
+        $log->passed = $request->get('passed') !== 'false' ? '1' : '0';
         $log->answers = json_encode($request->get('questions'));
         $log->save();
 
index e7c67243e855888c138c2be1b152b78f1eb3a2b4..c00859a7d8fe951f4dd5244d5d97ec3a8fb0b85a 100644 (file)
@@ -2,6 +2,8 @@
 
 namespace App\Http\Controllers\Admin\Operations;
 
+use App\Models\Quiz;
+use App\Models\QuizAttempt;
 use Cubist\Util\Files\Files;
 use Illuminate\Support\Facades\Route;
 use PhpOffice\PhpSpreadsheet\Spreadsheet;
@@ -21,14 +23,76 @@ trait ReportOperation
 
     protected function report($id)
     {
+        $quiz = Quiz::where('id', $id)->first()->getPageData();
+        $first = ['#', 'Date', 'Score', 'Passed'];
+
+        $emailQuestion = 0;
+
+        foreach ($quiz->questions as $q => $question) {
+            $first[] = $question['report_label'] ?: $question['question'];
+            if ($question['type'] === 'email') {
+                $emailQuestion = $q;
+            }
+        }
+
+        $attemptsList = [$first];
+        $users = [];
+        /** @var QuizAttempt[] $attempts */
+        $attempts = QuizAttempt::where('quiz', $id)->orderBy('created_at', 'ASC')->get();
+        foreach ($attempts as $attempt) {
+            $email = null;
+            $data = $attempt->getPageData();
+            $a = [$data->get('id'), $data->get('created_at'), $data->get('score'), $data->get('passed') ? '1' : '0'];
+            foreach ($data->get('answers', []) as $aid => $answer) {
+                if (null === $answer) {
+                    continue;
+                }
+                $aa = $answer['anwser'] ?? $answer['answer'] ?? '';
+                if ($aid == $emailQuestion + 1) {
+                    $email = trim(mb_strtolower($aa));
+                }
+                $a[] = is_array($aa) ? implode(', ', $aa) : $aa;
+            }
+
+            if (null !== $email) {
+                if (!isset($users[$email])) {
+                    $users[$email] = ['totalAttempts' => 0, 'attemptsBeforePassing' => 0, 'passed' => false, 'worstScore' => 100, 'bestScore' => 0];
+                }
+                $users[$email]['totalAttempts']++;
+                $users[$email]['worstScore'] = min($users[$email]['worstScore'], $data->get('score'));
+                $users[$email]['bestScore'] = max($users[$email]['bestScore'], $data->get('score'));
+                if (!$users[$email]['passed']) {
+                    $users[$email]['attemptsBeforePassing']++;
+                }
+                if ($data->get('passed')) {
+                    $users[$email]['passed'] = true;
+                }
+            }
+
+            $attemptsList[] = $a;
+        }
+
+        $usersList = [['Email', 'Passed', 'Attempts before passed', 'Total attempts', 'Best score', 'Worst score']];
+        foreach ($users as $email => $user) {
+            $usersList[] = [$email, $user['passed'] ? '1' : '0', $user['attemptsBeforePassing'], $user['totalAttempts'], $user['bestScore'], $user['worstScore']];
+        }
+
         $spreadsheet = new Spreadsheet();
 
         $sheet = $spreadsheet->getActiveSheet();
         $sheet->setTitle('USERS');
+        $sheet->fromArray($usersList);
+        foreach (range('A', 'Z') as $columnID) {
+            $sheet->getColumnDimension($columnID)->setAutoSize(true);
+        }
 
+        array_reverse($attemptsList);
         $sheet = $spreadsheet->createSheet();
-        $sheet->setTitle('DATA');
-        $sheet->setCellValue('A1', 'Hello World !');
+        $sheet->setTitle('ATTEMPTS');
+        $sheet->fromArray($attemptsList);
+        foreach (range('A', 'Z') as $columnID) {
+            $sheet->getColumnDimension($columnID)->setAutoSize(true);
+        }
 
         $writer = new Xlsx($spreadsheet);
         $tmp = Files::tempnam();
index 6a1fe1115790690c74a2650c13f4e8812dd2f259..bee36a43d1705b31f86b8419e3fa8dadd955ca68 100644 (file)
@@ -15,6 +15,10 @@ class Question extends SubForm
             'type' => 'Text',
             'label' => 'Question label']);
 
+        $this->addField(['name' => 'report_label',
+            'type' => 'Text',
+            'label' => 'Question label in reports']);
+
         $this->addField(['name' => 'type',
             'type' => 'SelectFromArray',
             'label' => 'Type',
index b0f9440c3b90cc9910782d35a6d76d7bfff8f429..bd527eb9346f418060aaeaa3e3d311b9cbcc72ff 100644 (file)
             "source": {
                 "type": "git",
                 "url": "git://git.cubedesigners.com/cubist_cms-back.git",
-                "reference": "a93ca4e7089022c95cd738143fffb9cba3efe76f"
+                "reference": "b400e14d10f01ac02c5c16951bbb76b1682c2e36"
             },
             "dist": {
                 "type": "tar",
-                "url": "https://composer.cubedesigners.com/dist/cubist/cms-back/cubist-cms-back-dev-master-3bc9cf.tar",
-                "reference": "a93ca4e7089022c95cd738143fffb9cba3efe76f",
-                "shasum": "2ee03d406892aaae9ac63910af4c7960e48e4265"
+                "url": "https://composer.cubedesigners.com/dist/cubist/cms-back/cubist-cms-back-dev-master-c7b202.tar",
+                "reference": "b400e14d10f01ac02c5c16951bbb76b1682c2e36",
+                "shasum": "bf4286cc83661561acb996d042339510fe84eec6"
             },
             "require": {
                 "backpack/backupmanager": "^2.0",
                 }
             ],
             "description": "Cubist Backpack extension",
-            "time": "2020-10-08T17:54:21+00:00"
+            "time": "2020-10-12T17:54:04+00:00"
         },
         {
             "name": "cubist/cms-front",
         },
         {
             "name": "dragonmantank/cron-expression",
-            "version": "v2.3.0",
+            "version": "v2.3.1",
             "source": {
                 "type": "git",
                 "url": "https://github.com/dragonmantank/cron-expression.git",
-                "reference": "72b6fbf76adb3cf5bc0db68559b33d41219aba27"
+                "reference": "65b2d8ee1f10915efb3b55597da3404f096acba2"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/dragonmantank/cron-expression/zipball/72b6fbf76adb3cf5bc0db68559b33d41219aba27",
-                "reference": "72b6fbf76adb3cf5bc0db68559b33d41219aba27",
+                "url": "https://api.github.com/repos/dragonmantank/cron-expression/zipball/65b2d8ee1f10915efb3b55597da3404f096acba2",
+                "reference": "65b2d8ee1f10915efb3b55597da3404f096acba2",
                 "shasum": ""
             },
             "require": {
-                "php": "^7.0"
+                "php": "^7.0|^8.0"
             },
             "require-dev": {
-                "phpunit/phpunit": "^6.4|^7.0"
+                "phpunit/phpunit": "^6.4|^7.0|^8.0|^9.0"
             },
             "type": "library",
             "extra": {
                 "cron",
                 "schedule"
             ],
-            "time": "2019-03-31T00:38:28+00:00"
+            "time": "2020-10-13T00:52:37+00:00"
         },
         {
             "name": "egulias/email-validator",
         },
         {
             "name": "nesbot/carbon",
-            "version": "2.41.2",
+            "version": "2.41.3",
             "source": {
                 "type": "git",
                 "url": "https://github.com/briannesbitt/Carbon.git",
-                "reference": "35959c93ada06469107a05df6b15b65074a960cf"
+                "reference": "e148788eeae9b9b7b87996520358b86faad37b52"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/35959c93ada06469107a05df6b15b65074a960cf",
-                "reference": "35959c93ada06469107a05df6b15b65074a960cf",
+                "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/e148788eeae9b9b7b87996520358b86faad37b52",
+                "reference": "e148788eeae9b9b7b87996520358b86faad37b52",
                 "shasum": ""
             },
             "require": {
                 "datetime",
                 "time"
             ],
-            "time": "2020-10-10T23:35:06+00:00"
+            "time": "2020-10-12T20:36:09+00:00"
         },
         {
             "name": "nothingworks/blade-svg",
         },
         {
             "name": "composer/composer",
-            "version": "1.10.13",
+            "version": "1.10.15",
             "source": {
                 "type": "git",
                 "url": "https://github.com/composer/composer.git",
-                "reference": "47c841ba3b2d3fc0b4b13282cf029ea18b66d78b"
+                "reference": "547c9ee73fe26c77af09a0ea16419176b1cdbd12"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/composer/composer/zipball/47c841ba3b2d3fc0b4b13282cf029ea18b66d78b",
-                "reference": "47c841ba3b2d3fc0b4b13282cf029ea18b66d78b",
+                "url": "https://api.github.com/repos/composer/composer/zipball/547c9ee73fe26c77af09a0ea16419176b1cdbd12",
+                "reference": "547c9ee73fe26c77af09a0ea16419176b1cdbd12",
                 "shasum": ""
             },
             "require": {
                 "dependency",
                 "package"
             ],
-            "time": "2020-09-09T09:46:34+00:00"
+            "time": "2020-10-13T13:59:09+00:00"
         },
         {
             "name": "composer/semver",
         },
         {
             "name": "facade/ignition",
-            "version": "2.3.8",
+            "version": "2.4.1",
             "source": {
                 "type": "git",
                 "url": "https://github.com/facade/ignition.git",
-                "reference": "e8fed9c382cd1d02b5606688576a35619afdf82c"
+                "reference": "9fc6c3d3de5271a1b94cff19dce2c9295abf0ffa"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/facade/ignition/zipball/e8fed9c382cd1d02b5606688576a35619afdf82c",
-                "reference": "e8fed9c382cd1d02b5606688576a35619afdf82c",
+                "url": "https://api.github.com/repos/facade/ignition/zipball/9fc6c3d3de5271a1b94cff19dce2c9295abf0ffa",
+                "reference": "9fc6c3d3de5271a1b94cff19dce2c9295abf0ffa",
                 "shasum": ""
             },
             "require": {
                 "laravel",
                 "page"
             ],
-            "time": "2020-10-01T23:01:14+00:00"
+            "time": "2020-10-14T08:59:59+00:00"
         },
         {
             "name": "facade/ignition-contracts",
index ab3b592d9cee710758101481451a0808a6dec365..805518a959876c01ae2693bfcdc4fcee306908ab 100644 (file)
 
             var passed = checkScore();
             if (logAttempts) {
-                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',
-                        data: logdata,
-                        crossDomain: true,
-                    }
-                );
+               logAttempt(passed);
             }
         }
 
+        function logAttempt(passed){
+            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',
+                    data: logdata,
+                    crossDomain: true,
+                }
+            );
+        }
+
         function checkScore() {
             var normalizedScore = score / countQuestions;
             $('#results > h2').hide();
                     });
                     ok = this_score >= min_score;
                     answers.push(a);
-                    log.anwser = a;
+                    log.answer = a;
                 } else {
-                    log.anwser = $(this).find('input').val();
+                    log.answer = $(this).find('input').val();
                 }
 
                 var b = $("#correction .correction[data-i='" + qn + "'] .badge");