]> _ Git - fluidbook-toolbox.git/commitdiff
wait #5391 @10
authorVincent Vanwaelscappel <vincent@cubedesigners.com>
Wed, 10 Aug 2022 16:13:25 +0000 (18:13 +0200)
committerVincent Vanwaelscappel <vincent@cubedesigners.com>
Wed, 10 Aug 2022 16:13:25 +0000 (18:13 +0200)
app/Jobs/ElearningPackageDownload.php
app/Models/ELearningMedia.php
app/Models/ELearningPackage.php
resources/elearningmedia/js/app.js
resources/elearningpackage/js/app.js
resources/scorm/scorm.js

index 23b5fcaf000aa38a42c52f4068c4acdef2f3abd9..ef5df78ce6794080c9feef73e75d8c6700122541 100644 (file)
@@ -32,7 +32,7 @@ class ElearningPackageDownload extends DownloadBase
 
             try {
                 if ($this->action === 'scormcloud') {
-                    $scormURL = ScormCloud::send($url, 'toolbox_' . $this->type . '_' . $this->entry->id, true);
+                    $scormURL = ScormCloud::send($url, 'toolbox_' . $this->type . '_' . $this->entry->id);
                     $body .= "<br><br>";
                     $body .= __('Le package peut ĂȘtre testĂ© sur SCORM Cloud : <a href=":url">:url</a>', ['url' => $scormURL]);
                 }
index e1dc869d5de0720604baeaeee8750225bc3651f3..c7b406fcf9dfafac281d378d5ab154e4d0208d45 100644 (file)
@@ -103,8 +103,8 @@ class ELearningMedia extends ToolboxModel
         $vdir->copyDirectory(resource_path('elearningmedia/dist/css'), 'css');
         $vdir->copyDirectory(resource_path('elearningmedia/dist/js'), 'js');
         if ($type === 'pdf') {
-            $vdir->copyDirectory(resource_path('pdfjs-legacy-min'), 'pdfjs');
-            $css = file_get_contents(resource_path('pdfjs-legacy-min/web/viewer.css'));
+            $vdir->copyDirectory(resource_path('pdfjs-legacy'), 'pdfjs');
+            $css = file_get_contents(resource_path('pdfjs-legacy/web/viewer.css'));
             $css .= 'body{--sidebar-width:400px;}';
             $css .= '#openFile,#pageRotateCw,#pageRotateCcw,#pageRotateCcw + .horizontalToolbarSeparator{display:none !important;}';
             $css .= '#viewBookmark,#print,#download{display:none !important}';
index 99a8d469f0eee53ce8e775711bff744f17cdc233..23de16db492980b842ab37f5e777b8b335105c01 100644 (file)
@@ -2,10 +2,12 @@
 
 namespace App\Models;
 
+use App\Fields\SCORMVersion;
 use App\Http\Controllers\Admin\Operations\ELearningPackage\ImportOperation;
 use App\Http\Controllers\Admin\Operations\ELearningPackage\PreviewOperation;
 use App\Http\Controllers\Admin\Operations\ELearningPackage\DownloadOperation;
 use App\Models\Base\ToolboxModel;
+use App\Models\Traits\SCORMVersionTrait;
 use App\Services\WorkshopV2;
 use App\SubForms\ElearningPackageContent;
 use Cubist\Backpack\Magic\Fields\BunchOfFieldsMultiple;
@@ -20,6 +22,8 @@ use DirectoryIterator;
 
 class ELearningPackage extends ToolboxModel
 {
+    use SCORMVersionTrait;
+
     protected $table = 'elearning_package';
 
     protected $_options = ['name' => 'elearning-package',
@@ -35,6 +39,14 @@ class ELearningPackage extends ToolboxModel
         parent::setFields();
 
         $this->addField('title', Text::class, __('Titre'), ['column' => true]);
+        $this->addField(['name' => 'scorm_version',
+                'label' => __('Version SCORM'),
+                'column' => true,
+                'type' => SCORMVersion::class,
+                'default' => Version::SCORM_2004,
+                'database_default' => Version::SCORM_2004,
+            ]
+        );
         $this->addField('description', Textarea::class, __('Description'));
 
         $this->addOwnerField();
@@ -73,7 +85,7 @@ class ELearningPackage extends ToolboxModel
         $data = ['title' => $this->title, 'description' => $this->description, 'modules' => $modules];
 
         $vdir->file_put_contents('data.js', 'const DATA=' . json_encode($data) . ';');
-        $vdir->file_put_contents('imsmanifest.xml', new Manifest($this->title, Version::SCORM_2004, $organization, 'PACKAGE_' . $this->id));
+        $vdir->file_put_contents('imsmanifest.xml', new Manifest($this->title, $this->scorm_version, $organization, 'PACKAGE_' . $this->id));
         $vdir->copyDirectory(resource_path('elearningpackage/dist/css'), 'css');
         $vdir->copyDirectory(resource_path('elearningpackage/dist/js'), 'js');
         $vdir->copyDirectory(resource_path('elearningpackage/dist/fonts'), 'fonts');
@@ -144,7 +156,7 @@ class ELearningPackage extends ToolboxModel
 
         $workshop = new WorkshopV2($user);
         $workshop->installBook($id, $tmp, [], 'scorm');
-        if(file_exists($tmp.'/imsmanifest.xml')) {
+        if (file_exists($tmp . '/imsmanifest.xml')) {
             unlink($tmp . '/imsmanifest.xml');
         }
         $vdir->copyDirectory($tmp, $basePath);
@@ -170,7 +182,7 @@ class ELearningPackage extends ToolboxModel
             return null;
         }
         $quiz->compile($tmp, true);
-        if(file_exists($tmp.'/imsmanifest.xml')) {
+        if (file_exists($tmp . '/imsmanifest.xml')) {
             unlink($tmp . '/imsmanifest.xml');
         }
         $vdir->copyDirectory($tmp, $basePath);
@@ -194,7 +206,7 @@ class ELearningPackage extends ToolboxModel
         }
         $file = $f->getPath();
         $title = ELearningMedia::compileFromFile($file, $tmp, '', $organization, 'MEDIA_' . $media_file);
-        if(file_exists($tmp.'/imsmanifest.xml')) {
+        if (file_exists($tmp . '/imsmanifest.xml')) {
             unlink($tmp . '/imsmanifest.xml');
         }
         $vdir->copyDirectory($tmp, $basePath);
@@ -212,7 +224,7 @@ class ELearningPackage extends ToolboxModel
         }
         $media->compile($tmp);
 
-        if(file_exists($tmp.'/imsmanifest.xml')) {
+        if (file_exists($tmp . '/imsmanifest.xml')) {
             unlink($tmp . '/imsmanifest.xml');
         }
 
@@ -253,7 +265,7 @@ class ELearningPackage extends ToolboxModel
             }
         }
 
-        if(file_exists($tmp.'/imsmanifest.xml')) {
+        if (file_exists($tmp . '/imsmanifest.xml')) {
             unlink($tmp . '/imsmanifest.xml');
         }
         $vdir->copyDirectory($tmp, $basePath);
index 16d13cb4d9a1aeaa2622152192898888e6db205f..20f20b28dd21462a002af0441467b7209ec4d274 100644 (file)
@@ -42,18 +42,35 @@ document.addEventListener("DOMContentLoaded", function () {
             }
         }, 1000);
     } else if (window.type === 'pdf') {
-        var interval = setInterval(function () {
-            try {
-                var pdfViewer = document.getElementById('player').contentWindow.PDFViewerApplication.pdfViewer;
-                var total = pdfViewer.pagesCount;
-                var current = pdfViewer._currentPageNumber;
-                if (total > 0 && current / total >= pc) {
-                    markComplete(interval);
+        var playerIframe = document.getElementById('player');
+        playerIframe.addEventListener('load', function () {
+            var playerWindow = playerIframe.contentWindow;
+
+
+            var interval = setInterval(function () {
+                console.log('Check pdf progress');
+                try {
+                    var app = playerWindow.PDFViewerApplication;
+                    if (app === undefined || app === null) {
+                        return;
+                    }
+                    var pdfViewer = app.pdfViewer;
+                    if (pdfViewer === undefined || pdfViewer === null) {
+                        return;
+                    }
+
+                    var total = pdfViewer.pagesCount;
+                    var current = pdfViewer._currentPageNumber;
+                    if (total > 0 && current / total >= pc) {
+                        markComplete(interval);
+                    }
+
+                } catch (e) {
+                    console.error('Error while updating pdf course status');
+                    console.error(e);
                 }
-            } catch (e) {
-
-            }
-        },1000);
+            }, 1000);
+        });
     }
 
     player.on('ready', function () {
@@ -74,7 +91,7 @@ function setSessionTime() {
 }
 
 function scormSecondsToTimeInterval(diff) {
-    var diff = Math.round(diff);
+    diff = Math.round(diff);
     var h = Math.floor(diff / 3600);
     diff = diff % 3600;
     var m = Math.floor(diff / 60);
index ea8f0bce1b4b1b5063d78512283e8cf59d12f516..4ed8c3146f4812a012d9744a20a1e2fdfaa76939 100644 (file)
@@ -130,19 +130,15 @@ function saveStatus() {
     if (isNaN(score100)) {
         score100 = -1;
     }
-    console.log(score100, completed, score);
     if (score100 > 0) {
-        setScormValue('cmi.score.raw', score100);
-        setScormValue('cmi.score.scaled', score100 / 100);
-        setScormValue('cmi.score.min', 0);
-        setScormValue('cmi.score.max', 100);
+        setSCORMScore(score100, 100, 0, score100 / 100);
     }
     if (!isNaN(score100) && score100 > 0) {
         setScormValue('success_status', 'passed');
     } else {
         setScormValue('success_status', 'unknown');
     }
-    setScormValue('status', completed ? 'completed' : 'incomplete');
+    setScormValue('status', completed ? 'completed' : 'incomplete',true);
 }
 
 function getModuleData(id) {
@@ -177,14 +173,12 @@ function setContents() {
     $('title').text(DATA.title);
     $('tbody').html('');
 
-
     $.each(DATA.modules, function (k, v) {
         var s = window.savedState[v.id];
         var lock = '';
         var lockstatus = 'none';
         var lockCol = '';
         if (v.lock) {
-            console.log(v.lock);
             lock = 'data-lock="';
             lockstatus = 'unlocked';
             lockCol = getSpriteIcon('lock-unlocked');
@@ -373,6 +367,6 @@ SCORMFacade.prototype = {
     }, GetDiagnostic: function (code) {
         return '';
     }, _log: function (log) {
-        console.log('SCORM facade : ' + log);
+        console.log('SCORM facade ('+currentModule.id+') : ' + log);
     },
 };
index e236a6208d16763ef8399cc5aa7ac0ab8faae75c..199718a83244974f367cbf9a3aaf5d75ef7cd469 100644 (file)
@@ -1,5 +1,6 @@
 import {SCORM} from "pipwerks-scorm-api-wrapper";
 
+window.SCORM__ = SCORM;
 window.pako = require('pako');
 
 window.SCORM_INITED = false;
@@ -38,6 +39,10 @@ window._CMI2004 = {
     'exit': 'cmi.exit',
 };
 
+window.scormVersion = function () {
+    return SCORM.version;
+}
+
 window.initScorm = function () {
     if (SCORM_INITED) {
         return;
@@ -46,6 +51,8 @@ window.initScorm = function () {
     SCORM_INITED = true;
     try {
         if (SCORM.init()) {
+            console.info('SCORM OK');
+            console.info(SCORM.API.getHandle());
             SCORM_OK = true;
         }
     } catch (e) {
@@ -101,12 +108,9 @@ window.initScormEvents = function () {
 
 window.setSCORMLocation = function (location) {
     let json = JSON.stringify(location);
-    console.log(json);
     let deflate = pako.deflate(json);
-    console.log(deflate);
     let b64 = bytesArrToBase64(deflate);
-    console.log(b64);
-    return setScormValue('location', b64);
+    return setScormValue('suspend_data', b64);
 };
 
 window.setSCORMScore = function (score, max, min, scaled) {
@@ -129,7 +133,9 @@ window.getScormValue = function (elementName) {
     if (cmi == '') {
         return null;
     }
-    return SCORM.get(cmi);
+    var res = SCORM.get(cmi);
+    console.info('get SCORM value `' + cmi + '` : ' + res);
+    return res;
 };
 
 window.getScormLocation = function (defaultLocation) {
@@ -140,13 +146,12 @@ window.getScormLocation = function (defaultLocation) {
     if (!SCORM_OK) {
         return defaultLocation;
     }
-    var currentLocation = getScormValue('location');
+    var currentLocation = getScormValue('suspend_data');
 
     if (currentLocation.indexOf('[') === -1 && currentLocation.indexOf('{') === -1) {
         // Maybe a zipped string
         try {
             currentLocation = pako.inflate(base64ToBytesArr(currentLocation), {to: 'string'})
-            console.log(currentLocation);
         } catch (e) {
             console.warn('Unable to uncompress the data');
             currentLocation = '';
@@ -170,16 +175,20 @@ window.getScormLocation = function (defaultLocation) {
     return res;
 }
 
-window.setScormValue = function (elementName, value) {
+window.setScormValue = function (elementName, value, save) {
     if (!SCORM_OK) {
         return;
     }
-    var cmi = _cmi(elementName);
+    let cmi = _cmi(elementName);
     if (cmi == '') {
         return false;
     }
-    var result = SCORM.set(cmi, value);
-    return result;
+    console.info('set SCORM value `' + cmi + '` : ' + value);
+    let res = SCORM.set(cmi, value);
+    if (save === true) {
+        SCORM.save();
+    }
+    return res;
 };
 
 
@@ -187,6 +196,7 @@ window.scormMarkAsComplete = function () {
     if (!SCORM_OK) {
         return;
     }
+    setScormValue('status', "completed", true);
     scormExit();
 };
 
@@ -217,6 +227,11 @@ window.scormCompleteAndClose = function () {
     scormClose();
 }
 
+window.scormComplete = function () {
+    scormMarkAsComplete();
+    finishScorm();
+}
+
 window.scormClose = function () {
     parent.close();
     top.close();
@@ -304,10 +319,10 @@ window.getScormTimeInterval = function (start, end) {
 };
 
 window.scormSecondsToTimeInterval = function (diff) {
-    var diff = Math.round(diff);
-    var h = Math.floor(diff / 3600);
+    diff = Math.round(diff);
+    let h = Math.floor(diff / 3600);
     diff = diff % 3600;
-    var m = Math.floor(diff / 60);
-    var s = diff % 60;
+    let m = Math.floor(diff / 60);
+    let s = diff % 60;
     return 'PT' + h + 'H' + m + 'M' + s + 'S';
 };