]> _ Git - hf-scorm-package.git/commitdiff
wip #4907 @1.5
authorVincent Vanwaelscappel <vincent@cubedesigners.com>
Wed, 15 Dec 2021 17:12:02 +0000 (18:12 +0100)
committerVincent Vanwaelscappel <vincent@cubedesigners.com>
Wed, 15 Dec 2021 17:12:02 +0000 (18:12 +0100)
HF_Scorm_Package.zip [new file with mode: 0644]
data.js
imsmanifest.xml
js/scormpackage.js
packages/QZ/js/main.js

diff --git a/HF_Scorm_Package.zip b/HF_Scorm_Package.zip
new file mode 100644 (file)
index 0000000..1da905d
Binary files /dev/null and b/HF_Scorm_Package.zip differ
diff --git a/data.js b/data.js
index 5a5b57db5abf753b7c997e4e01893187b7cab0bf..74425369ed2a0f3cad630fef260031cd1f74a3cc 100644 (file)
--- a/data.js
+++ b/data.js
@@ -2,7 +2,7 @@ const DATA = {
     "title": "Title of the project",
     "modules": [
         {
-            "id": 0,
+            "id": "0",
             "title": "Title of the module",
             "type": "IN",
             "path": "packages/IN/HF_IN_PositiveCulture_v1_UK EN_outlined.pdf",
@@ -10,7 +10,7 @@ const DATA = {
             "scorm": false,
         },
         {
-            "id": 1,
+            "id": "1",
             "title": "Title of the module",
             "type": "AN",
             "path": "packages/AN/HF_AN_038_Building a positive culture_UK EN.mp4",
@@ -18,7 +18,7 @@ const DATA = {
             "scorm": false,
         },
         {
-            "id": 2,
+            "id": "2",
             "title": "Title of the module",
             "type": "VI",
             "path": "packages/Ti5/TI5_100_Positive-Culture_UK EN.mp4",
@@ -26,7 +26,7 @@ const DATA = {
             "scorm": false,
         },
         {
-            "id": 3,
+            "id": "3",
             "title": "Title of the module",
             "type": "FB",
             "path": "packages/FB/index.html",
@@ -34,7 +34,7 @@ const DATA = {
             "scorm": true,
         },
         {
-            "id": 4,
+            "id": "4",
             "title": "Title of the module",
             "type": "QZ",
             "path": "packages/QZ/index.html",
index b5f65e3583ef7c303d0380e57d0be776922b7108..5aebe979f57dcc3176ca2b24d11977cf46c2e775 100644 (file)
@@ -1,26 +1,40 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<manifest
-        xmlns="http://www.imsproject.org/xsd/imscp_rootv1p1p2"
-        xmlns:imsmd="http://www.imsglobal.org/xsd/imsmd_rootv1p2p1"
-        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:adlcp="http://www.adlnet.org/xsd/adlcp_rootv1p2"
-        identifier="MANIFEST-90878C16-EB60-D648-94ED-9651972B5F38"
-        xsi:schemaLocation="http://www.imsproject.org/xsd/imscp_rootv1p1p2 imscp_rootv1p1p2.xsd
-                            http://www.imsglobal.org/xsd/imsmd_rootv1p2p1 imsmd_rootv1p2p1.xsd
-                            http://www.adlnet.org/xsd/adlcp_rootv1p2 adlcp_rootv1p2.xsd">
+<?xml version="1.0" standalone="no" ?>
+<manifest identifier="MANIFEST-90878C16-EB60-D648-94ED-9651972B5F38" version="1.3"
+          xmlns="http://www.imsglobal.org/xsd/imscp_v1p1"
+          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+          xmlns:adlcp="http://www.adlnet.org/xsd/adlcp_v1p3"
+          xmlns:adlseq="http://www.adlnet.org/xsd/adlseq_v1p3"
+          xmlns:adlnav="http://www.adlnet.org/xsd/adlnav_v1p3"
+          xmlns:imsss="http://www.imsglobal.org/xsd/imsss"
+          xsi:schemaLocation="http://www.imsglobal.org/xsd/imscp_v1p1 imscp_v1p1.xsd
+                              http://www.adlnet.org/xsd/adlcp_v1p3 adlcp_v1p3.xsd
+                              http://www.adlnet.org/xsd/adlseq_v1p3 adlseq_v1p3.xsd
+                              http://www.adlnet.org/xsd/adlnav_v1p3 adlnav_v1p3.xsd
+                              http://www.imsglobal.org/xsd/imsss imsss_v1p0.xsd">
     <metadata>
         <schema>ADL SCORM</schema>
-        <schemaversion>1.2</schemaversion>
+        <schemaversion>2004 4th Edition</schemaversion>
     </metadata>
-    <organizations default="ACME-ORG-1350650111249">
-        <organization identifier="ACME-ORG-1350650111249" structure="hierarchical">
-            <title>HF SCORM Multiple Package</title>
-            <item identifier="HF_SCORM_PACKAGE" identifierref="HF_SCORM_PACKAGE" isvisible="true">
-                <title>HF SCORM Multiple Package</title>
+    <organizations default="HF">
+        <organization identifier="HF" adlseq:objectivesGlobalToSystem="false">
+            <title>HF Scorm Multi Package</title>
+            <item identifier="multipackage" identifierref="multipackage_RES" isvisible="true">
+                <title>HF Scorm Multi Package</title>
+                <adlnav:presentation>
+                    <adlnav:navigationInterface>
+                        <adlnav:hideLMSUI>continue</adlnav:hideLMSUI>
+                        <adlnav:hideLMSUI>previous</adlnav:hideLMSUI>
+                        <adlnav:hideLMSUI>exit</adlnav:hideLMSUI>
+                        <adlnav:hideLMSUI>exitAll</adlnav:hideLMSUI>
+                        <adlnav:hideLMSUI>suspendAll</adlnav:hideLMSUI>
+                        <adlnav:hideLMSUI>abandonAll</adlnav:hideLMSUI>
+                    </adlnav:navigationInterface>
+                </adlnav:presentation>
             </item>
         </organization>
     </organizations>
     <resources>
-        <resource type="webcontent" adlcp:scormtype="sco" identifier="HF_SCORM_PACKAGE" href="index.html">
+        <resource identifier="multipackage_RES" type="webcontent" adlcp:scormType="sco" href="index.html">
             <file href="index.html"/>
         </resource>
     </resources>
index f23d4005ab7194ed7c7ecd9e04a8a25fc491c493..964f16089ee1761fe9761c88b71a3e49d9f4fed2 100644 (file)
@@ -94,6 +94,12 @@ function initScorm() {
 }
 
 function initState() {
+
+    if (SCORM_LOCATION_INITED) {
+        return;
+    }
+    SCORM_LOCATION_INITED = true;
+
     var currentLocation = '';
     if (SCORM_OK) {
         currentLocation = getScormValue('location');
@@ -105,18 +111,21 @@ function initState() {
         window.savedState = JSON.parse(currentLocation);
     }
 
+    console.log(currentLocation, window.savedState);
+
 
     if (window.savedState === undefined || window.savedState === null || window.savedState === 'null') {
         window.savedState = {};
     }
 
-
+    var clone = $.extend(true, {}, window.savedState);
     $.each(DATA.modules, function (k, v) {
+        var id = v.id.toString();
         var defaultState = {completion_status: 'incomplete', success_status: 'unknown', score: 0, location: '', cmi: {}};
-        if (window.savedState[v.id] === undefined || window.savedState[v.id] === null) {
-            window.savedState[v.id] = defaultState;
+        if (clone[id] === undefined || clone[id] === null) {
+            window.savedState[id] = defaultState;
         } else {
-            $.extend(true, window.savedState[v.id], defaultState);
+            window.savedState[id] = $.extend(true, defaultState, clone[id]);
         }
     });
 }
@@ -135,9 +144,7 @@ function finishScorm() {
     }
     setSessionTime();
     pipwerks.SCORM.save();
-    if (fluidbook.settings.multilang === '') {
-        pipwerks.SCORM.quit();
-    }
+    pipwerks.SCORM.quit();
 }
 
 function scormExit() {
@@ -145,14 +152,6 @@ function scormExit() {
         return;
     }
     var v = 'suspend';
-    if (fluidbook.settings.scorm_force_attempts) {
-        if (pipwerks.SCORM.version === '1.2') {
-            v = 'logout';
-        } else {
-            v = 'normal';
-        }
-    }
-
     setScormValue('exit', v);
 }
 
@@ -212,13 +211,48 @@ function openSubSCO(id) {
 }
 
 function setModuleState(id, data) {
-    $.extend(true, window.savedState[id], data);
+    var clone = $.extend(true, {}, window.savedState[id]);
+    window.savedState[id] = $.extend(true, {}, clone, data);
     saveStatus();
     setContents();
 }
 
 function saveStatus() {
+    if (!SCORM_LOCATION_INITED) {
+        return;
+    }
     setSCORMLocation(window.savedState);
+    var completed = true;
+    var globalScore = 0;
+    var globalScoreItems = 0;
+    for (var k in DATA.modules) {
+        var m = DATA.modules[k];
+        var s = window.savedState[m.id];
+        if (m.mandatory && s.completion_status !== 'completed' && s.completion_status !== 'passed') {
+            completed = false;
+        }
+        var score = calcScore(s);
+        if (!isNaN(score) && score >= 0) {
+            globalScore += score;
+            globalScoreItems++;
+        }
+    }
+    var score100 = globalScore / globalScoreItems;
+    if (isNaN(score100)) {
+        score100 = -1;
+    }
+    if (score100 > 0) {
+        setScormValue('cmi.score.raw', score100);
+        setScormValue('cmi.score.scaled', score100 / 100);
+        setScormValue('cmi.score.min', 0);
+        setScormValue('cmi.score.max', 100);
+    }
+    if (!isNaN(score100) && score100 > 0) {
+        setScormValue('success_status', 'passed');
+    } else {
+        setScormValue('success_status', 'unknown');
+    }
+    setScormValue('status', completed ? 'completed' : 'incomplete');
 }
 
 function getModuleData(id) {
@@ -232,6 +266,9 @@ function getModuleData(id) {
 }
 
 function setContents() {
+    if (!SCORM_LOCATION_INITED) {
+        return;
+    }
     var vcheck = getSpriteIcon('check-ok');
     var xcheck = getSpriteIcon('check-nok');
     var types = {IN: 'Infographic PDF', AN: 'Animation', VI: 'Video', FB: 'Fluidbook', PC: 'Podcast HTML', QZ: 'Quiz'};
@@ -249,22 +286,30 @@ function setContents() {
         tr.append('<td class="y">' + types[v.type] + '</td>');
         tr.append('<td class="c">' + (v.mandatory ? vcheck : xcheck) + '</td>');
         tr.append('<td class="c">' + (s.completion_status === 'completed' ? vcheck : xcheck) + '</td>');
-        tr.append('<td class="score c" data-score="' + score + '"><div>' + (score === 0 ? '-' : score + ' %') + '</div></td>');
+        tr.append('<td class="score c" data-score="' + score + '"><div>' + (score < 0 ? '-' : score + ' %') + '</div></td>');
     });
 }
 
 function calcScore(s) {
-    var raw = doubleQuestionMark(s.cmi['cmi.core.score.raw'], s.cmi['cmi.score.raw'], 0);
+    if (s === undefined) {
+        return -1;
+    }
+    var raw = doubleQuestionMark(s.cmi['cmi.core.score.raw'], s.cmi['cmi.score.raw'], -1);
     var max = doubleQuestionMark(s.cmi['cmi.core.score.max'], s.cmi['cmi.score.max'], 100);
     var min = doubleQuestionMark(s.cmi['cmi.core.score.min'], s.cmi['cmi.score.min'], 0);
+
+    console.log(raw, max, min);
     var scale = max - min;
     var norm = raw - min;
+    if (isNaN(scale) || isNaN(norm)) {
+        return -1;
+    }
     return 100 * (norm / scale);
 }
 
 function doubleQuestionMark() {
     for (var i = 0; i < arguments.length; i++) {
-        if (arguments[i] === undefined || arguments[i]===null) {
+        if (arguments[i] === undefined || arguments[i] === null) {
             continue;
         }
         return arguments[i];
@@ -300,15 +345,6 @@ function initScormEvents() {
         finishScorm();
     });
 
-    if (SCORM_LOCATION_INITED) {
-        return;
-    }
-    SCORM_LOCATION_INITED = true;
-
-
-    initEvents();
-    setContents();
-
     setInterval(function () {
         pipwerks.SCORM.save();
     }, 5000);
@@ -350,9 +386,6 @@ function setScormValue(elementName, value) {
         return false;
     }
     var result = pipwerks.SCORM.set(cmi, value);
-    if (fluidbook.settings.scorm_immediate_commit) {
-        pipwerks.SCORM.save();
-    }
     return result;
 }
 
index 7092b4adf9efa4deea57a9a7a8392166933162fb..c9a25f893489e4ae759a7540adb1825a998992f9 100644 (file)
             $("main").append(results);
 
             $(document).on('quizinit', function (event, state) {
-                console.log(state);
                 init(state)
             });
             initScormEvents();