From: Vincent Vanwaelscappel Date: Wed, 10 Aug 2022 16:13:25 +0000 (+0200) Subject: wait #5391 @10 X-Git-Url: http://git.cubedesigners.com/?a=commitdiff_plain;h=f299eb0bdec20f331b7b2828b46df31360d06d1f;p=fluidbook-toolbox.git wait #5391 @10 --- diff --git a/app/Jobs/ElearningPackageDownload.php b/app/Jobs/ElearningPackageDownload.php index 23b5fcaf0..ef5df78ce 100644 --- a/app/Jobs/ElearningPackageDownload.php +++ b/app/Jobs/ElearningPackageDownload.php @@ -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 .= "

"; $body .= __('Le package peut être testé sur SCORM Cloud : :url', ['url' => $scormURL]); } diff --git a/app/Models/ELearningMedia.php b/app/Models/ELearningMedia.php index e1dc869d5..c7b406fcf 100644 --- a/app/Models/ELearningMedia.php +++ b/app/Models/ELearningMedia.php @@ -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}'; diff --git a/app/Models/ELearningPackage.php b/app/Models/ELearningPackage.php index 99a8d469f..23de16db4 100644 --- a/app/Models/ELearningPackage.php +++ b/app/Models/ELearningPackage.php @@ -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); diff --git a/resources/elearningmedia/js/app.js b/resources/elearningmedia/js/app.js index 16d13cb4d..20f20b28d 100644 --- a/resources/elearningmedia/js/app.js +++ b/resources/elearningmedia/js/app.js @@ -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); diff --git a/resources/elearningpackage/js/app.js b/resources/elearningpackage/js/app.js index ea8f0bce1..4ed8c3146 100644 --- a/resources/elearningpackage/js/app.js +++ b/resources/elearningpackage/js/app.js @@ -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); }, }; diff --git a/resources/scorm/scorm.js b/resources/scorm/scorm.js index e236a6208..199718a83 100644 --- a/resources/scorm/scorm.js +++ b/resources/scorm/scorm.js @@ -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'; };