fcad-core-dragon 2.0.0-beta.3 → 2.0.0-beta.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (95) hide show
  1. package/.editorconfig +33 -33
  2. package/.eslintignore +29 -29
  3. package/.eslintrc.cjs +81 -81
  4. package/CHANGELOG +373 -364
  5. package/README.md +71 -71
  6. package/bk.scss +117 -117
  7. package/package.json +61 -61
  8. package/src/$locales/en.json +143 -143
  9. package/src/$locales/fr.json +105 -105
  10. package/src/assets/data/onboardingMessages.json +47 -47
  11. package/src/components/AppBase.vue +1147 -1054
  12. package/src/components/AppBaseButton.vue +87 -87
  13. package/src/components/AppBaseErrorDisplay.vue +438 -438
  14. package/src/components/AppBaseFlipCard.vue +84 -84
  15. package/src/components/AppBaseModule.vue +1636 -1673
  16. package/src/components/AppBasePage.vue +779 -779
  17. package/src/components/AppBasePopover.vue +41 -41
  18. package/src/components/AppCompAudio.vue +234 -234
  19. package/src/components/AppCompBranchButtons.vue +552 -552
  20. package/src/components/AppCompButtonProgress.vue +126 -126
  21. package/src/components/AppCompCarousel.vue +298 -298
  22. package/src/components/AppCompInputCheckBoxNext.vue +195 -195
  23. package/src/components/AppCompInputDropdownNext.vue +159 -159
  24. package/src/components/AppCompInputRadioNext.vue +152 -152
  25. package/src/components/AppCompInputTextNext.vue +106 -106
  26. package/src/components/AppCompInputTextTableNext.vue +141 -141
  27. package/src/components/AppCompInputTextToFillDropdownNext.vue +230 -230
  28. package/src/components/AppCompInputTextToFillNext.vue +171 -171
  29. package/src/components/AppCompJauge.vue +74 -74
  30. package/src/components/AppCompMenu.vue +423 -413
  31. package/src/components/AppCompMenuItem.vue +228 -228
  32. package/src/components/AppCompNavigation.vue +959 -960
  33. package/src/components/AppCompNoteCall.vue +133 -133
  34. package/src/components/AppCompNoteCredit.vue +292 -292
  35. package/src/components/AppCompPlayBar.vue +1218 -1218
  36. package/src/components/AppCompPlayBarNext.vue +2052 -2052
  37. package/src/components/AppCompPlayBarProgress.vue +82 -82
  38. package/src/components/AppCompPopUpNext.vue +503 -503
  39. package/src/components/AppCompQuizNext.vue +2904 -2904
  40. package/src/components/AppCompQuizRecall.vue +276 -276
  41. package/src/components/AppCompSVGNext.vue +347 -347
  42. package/src/components/AppCompSettingsMenu.vue +172 -172
  43. package/src/components/AppCompTableOfContent.vue +387 -387
  44. package/src/components/AppCompTranscript.vue +24 -24
  45. package/src/components/AppCompVideoPlayer.vue +368 -368
  46. package/src/components/AppCompViewDisplay.vue +6 -6
  47. package/src/components/BaseModule.vue +72 -72
  48. package/src/composables/useQuiz.js +206 -206
  49. package/src/externalComps/ModuleView.vue +22 -22
  50. package/src/externalComps/SummaryView.vue +91 -91
  51. package/src/main.js +272 -272
  52. package/src/mixins/$mediaMixins.js +819 -819
  53. package/src/mixins/timerMixin.js +155 -155
  54. package/src/module/stores/appStore.js +901 -893
  55. package/src/module/xapi/ADL.js +380 -376
  56. package/src/module/xapi/Crypto/Hasher.js +241 -241
  57. package/src/module/xapi/Crypto/WordArray.js +278 -278
  58. package/src/module/xapi/Crypto/algorithms/BufferedBlockAlgorithm.js +103 -103
  59. package/src/module/xapi/Crypto/algorithms/C_algo.js +315 -315
  60. package/src/module/xapi/Crypto/algorithms/HMAC.js +9 -9
  61. package/src/module/xapi/Crypto/algorithms/SHA1.js +9 -9
  62. package/src/module/xapi/Crypto/encoders/Base.js +105 -105
  63. package/src/module/xapi/Crypto/encoders/Base64.js +99 -99
  64. package/src/module/xapi/Crypto/encoders/Hex.js +61 -61
  65. package/src/module/xapi/Crypto/encoders/Latin1.js +61 -61
  66. package/src/module/xapi/Crypto/encoders/Utf8.js +45 -45
  67. package/src/module/xapi/Crypto/index.js +53 -53
  68. package/src/module/xapi/Statement/activity.js +47 -47
  69. package/src/module/xapi/Statement/agent.js +55 -55
  70. package/src/module/xapi/Statement/group.js +26 -26
  71. package/src/module/xapi/Statement/index.js +259 -259
  72. package/src/module/xapi/Statement/statement.js +253 -253
  73. package/src/module/xapi/Statement/statementRef.js +23 -23
  74. package/src/module/xapi/Statement/substatement.js +22 -22
  75. package/src/module/xapi/Statement/verb.js +36 -36
  76. package/src/module/xapi/activitytypes.js +17 -17
  77. package/src/module/xapi/launch.js +157 -157
  78. package/src/module/xapi/utils.js +167 -167
  79. package/src/module/xapi/verbs.js +294 -294
  80. package/src/module/xapi/wrapper.js +1963 -1963
  81. package/src/module/xapi/xapiStatement.js +444 -444
  82. package/src/plugins/bus.js +8 -8
  83. package/src/plugins/gsap.js +14 -14
  84. package/src/plugins/helper.js +314 -308
  85. package/src/plugins/i18n.js +44 -44
  86. package/src/plugins/idb.js +227 -219
  87. package/src/plugins/save.js +37 -37
  88. package/src/plugins/scorm.js +287 -287
  89. package/src/plugins/xapi.js +11 -11
  90. package/src/public/index.html +33 -33
  91. package/src/router/index.js +43 -43
  92. package/src/router/routes.js +312 -312
  93. package/src/shared/generalfuncs.js +210 -210
  94. package/src/shared/validators.js +1069 -1069
  95. package/vite.config.js +0 -27
@@ -1,17 +1,17 @@
1
- export default {
2
- assessment: 'http://adlnet.gov/expapi/activities/assessment',
3
- attempt: 'http://adlnet.gov/expapi/activities/attempt',
4
- course: 'http://adlnet.gov/expapi/activities/course',
5
- file: 'http://adlnet.gov/expapi/activities/file',
6
- interaction: 'http://adlnet.gov/expapi/activities/interaction',
7
- lesson: 'http://adlnet.gov/expapi/activities/lesson',
8
- link: 'http://adlnet.gov/expapi/activities/link',
9
- media: 'http://adlnet.gov/expapi/activities/media',
10
- meeting: 'http://adlnet.gov/expapi/activities/meeting',
11
- module: 'http://adlnet.gov/expapi/activities/module',
12
- objective: 'http://adlnet.gov/expapi/activities/objective',
13
- performance: 'http://adlnet.gov/expapi/activities/performance',
14
- profile: 'http://adlnet.gov/expapi/activities/profile',
15
- question: 'http://adlnet.gov/expapi/activities/question',
16
- simulation: 'http://adlnet.gov/expapi/activities/simulation'
17
- }
1
+ export default {
2
+ assessment: 'http://adlnet.gov/expapi/activities/assessment',
3
+ attempt: 'http://adlnet.gov/expapi/activities/attempt',
4
+ course: 'http://adlnet.gov/expapi/activities/course',
5
+ file: 'http://adlnet.gov/expapi/activities/file',
6
+ interaction: 'http://adlnet.gov/expapi/activities/interaction',
7
+ lesson: 'http://adlnet.gov/expapi/activities/lesson',
8
+ link: 'http://adlnet.gov/expapi/activities/link',
9
+ media: 'http://adlnet.gov/expapi/activities/media',
10
+ meeting: 'http://adlnet.gov/expapi/activities/meeting',
11
+ module: 'http://adlnet.gov/expapi/activities/module',
12
+ objective: 'http://adlnet.gov/expapi/activities/objective',
13
+ performance: 'http://adlnet.gov/expapi/activities/performance',
14
+ profile: 'http://adlnet.gov/expapi/activities/profile',
15
+ question: 'http://adlnet.gov/expapi/activities/question',
16
+ simulation: 'http://adlnet.gov/expapi/activities/simulation'
17
+ }
@@ -1,157 +1,157 @@
1
- export default function (obj) {
2
- const getQueryVariable = (variable) => {
3
- var query = window.location.search.substring(1)
4
- var vars = query.split('&')
5
- for (var i = 0; i < vars.length; i++) {
6
- var pair = vars[i].split('=')
7
- if (decodeURIComponent(pair[0]) == variable) {
8
- return decodeURIComponent(pair[1])
9
- }
10
- }
11
- }
12
-
13
- const cb_wrap = (cb) => {
14
- return function () {
15
- var args = arguments
16
- window.setTimeout(function () {
17
- var callerArgs = []
18
- for (var i = 0; i < args.length; i++) {
19
- callerArgs.push(args[i])
20
- }
21
- cb.apply(window, callerArgs)
22
- }, 0)
23
- }
24
- }
25
-
26
- //The library will append the necessary launch info to each new A that is linked to the page.
27
- //NOTE: This cannot work if you programmatically change the window location. If you do, you must
28
- //execute the logic in setupCourseLinks to send the initialization data to the new location (if
29
- //you wish that new location to track as part of this session)
30
- const observeForNewLinks = () => {
31
- // select the target node
32
- var target = document.body
33
- // create an observer instance
34
- var observer = new MutationObserver(function (mutations) {
35
- mutations.forEach(function (mutation) {
36
- for (var i in mutation.addedNodes) {
37
- //if (mutation.addedNodes.hasOwnProperty(i)) {
38
- if (Object.prototype.hasOwnProperty.call(mutation.addedNodes, i)) {
39
- if (mutation.addedNodes[i].constructor == HTMLAnchorElement) {
40
- var node = mutation.addedNodes[i]
41
- setupCourseLinks([node])
42
- }
43
- }
44
- }
45
- })
46
- })
47
- // configuration of the observer:
48
- var config = {
49
- attributes: true,
50
- childList: true,
51
- subtree: true
52
- }
53
- // pass in the target node, as well as the observer options
54
- observer.observe(target, config)
55
- // later, you can stop observing
56
- /// observer.disconnect();
57
- }
58
- //This library will init all links in the DOM that include the attribute "courseLink = true"
59
- //with the information necessary for the document at that link to track as part of this session.
60
- const setupCourseLinks = (_nodes) => {
61
- var launchToken = getQueryVariable('xAPILaunchKey')
62
- var launchEndpoint = getQueryVariable('xAPILaunchService')
63
- var encrypted = getQueryVariable('encrypted')
64
- var query =
65
- 'xAPILaunchKey=' + launchToken + '&xAPILaunchService=' + launchEndpoint
66
- if (encrypted) {
67
- query += '&encrypted=true'
68
- }
69
- for (var i = 0; i < _nodes.length; i++) {
70
- var link = _nodes[i]
71
- var href = link.href
72
- var courseLink = link.attributes.getNamedItem('courselink')
73
- if (courseLink && courseLink.value == 'true') {
74
- if (href.indexOf('?') > -1) {
75
- href = href + '&' + query
76
- } else href = href + '?' + query
77
- link.href = href
78
- }
79
- }
80
- }
81
-
82
- const xAPILaunch = (cb, terminate_on_unload, strict_callbacks) => {
83
- cb = cb_wrap(cb)
84
-
85
- try {
86
- var launchToken = getQueryVariable('xAPILaunchKey')
87
- var launchEndpoint = getQueryVariable('xAPILaunchService')
88
- var encrypted = getQueryVariable('encrypted')
89
- if (encrypted) {
90
- //here, we'd have to implement decryption for the data. This makes little sense in a client side only course
91
- }
92
-
93
- xAPILaunch.terminate = function (message) {
94
- var launch = new URL(launchEndpoint)
95
- launch.pathname += 'launch/' + launchToken + '/terminate'
96
- var xhr2 = new XMLHttpRequest()
97
- xhr2.withCredentials = true
98
- xhr2.crossDomain = true
99
-
100
- xhr2.open('POST', launch.toString(), false)
101
- xhr2.setRequestHeader('Content-type', 'application/json')
102
- xhr2.send(
103
- JSON.stringify({
104
- code: 0,
105
- description: message || 'User closed content'
106
- })
107
- )
108
- }
109
-
110
- if (!launchToken || !launchEndpoint)
111
- return cb('invalid launch parameters')
112
- var launch = new URL(launchEndpoint)
113
- launch.pathname += 'launch/' + launchToken
114
- var xhr = new XMLHttpRequest()
115
- xhr.withCredentials = true
116
- xhr.crossDomain = true
117
- xhr.onerror = function (err) {
118
- //exit the try catch so inner execptions in the callback don't trigger this catch
119
- window.setTimeout(function () {
120
- return cb(err)
121
- })
122
- }
123
- xhr.onload = function (e) {
124
- e
125
- if (xhr.status !== 200) {
126
- return xhr.onerror(xhr.responseText)
127
- }
128
- var body = JSON.parse(xhr.responseText)
129
- var launchData = body
130
-
131
- var conf = {}
132
- conf['endpoint'] = launchData.endpoint
133
- conf['actor'] = launchData.actor
134
- conf.withCredentials = true
135
- conf.strictCallbacks = strict_callbacks || false
136
-
137
- window.onunload = function () {
138
- if (!terminate_on_unload) return
139
- xAPILaunch.terminate('User closed content')
140
- }
141
- const wrapper = new obj.XAPIWrapper.constructor()
142
-
143
- wrapper.changeConfig(conf)
144
- //Links that include "courseLink='true'"
145
- setupCourseLinks(document.body.querySelectorAll('a'))
146
- //Also, if links are added dynamically, we will do the same logic for those links.
147
- observeForNewLinks()
148
- return cb(null, body, wrapper)
149
- }
150
- xhr.open('POST', launch.toString(), true)
151
- xhr.send()
152
- } catch (e) {
153
- cb(e)
154
- }
155
- }
156
- obj.launch = xAPILaunch
157
- }
1
+ export default function (obj) {
2
+ const getQueryVariable = (variable) => {
3
+ var query = window.location.search.substring(1)
4
+ var vars = query.split('&')
5
+ for (var i = 0; i < vars.length; i++) {
6
+ var pair = vars[i].split('=')
7
+ if (decodeURIComponent(pair[0]) == variable) {
8
+ return decodeURIComponent(pair[1])
9
+ }
10
+ }
11
+ }
12
+
13
+ const cb_wrap = (cb) => {
14
+ return function () {
15
+ var args = arguments
16
+ window.setTimeout(function () {
17
+ var callerArgs = []
18
+ for (var i = 0; i < args.length; i++) {
19
+ callerArgs.push(args[i])
20
+ }
21
+ cb.apply(window, callerArgs)
22
+ }, 0)
23
+ }
24
+ }
25
+
26
+ //The library will append the necessary launch info to each new A that is linked to the page.
27
+ //NOTE: This cannot work if you programmatically change the window location. If you do, you must
28
+ //execute the logic in setupCourseLinks to send the initialization data to the new location (if
29
+ //you wish that new location to track as part of this session)
30
+ const observeForNewLinks = () => {
31
+ // select the target node
32
+ var target = document.body
33
+ // create an observer instance
34
+ var observer = new MutationObserver(function (mutations) {
35
+ mutations.forEach(function (mutation) {
36
+ for (var i in mutation.addedNodes) {
37
+ //if (mutation.addedNodes.hasOwnProperty(i)) {
38
+ if (Object.prototype.hasOwnProperty.call(mutation.addedNodes, i)) {
39
+ if (mutation.addedNodes[i].constructor == HTMLAnchorElement) {
40
+ var node = mutation.addedNodes[i]
41
+ setupCourseLinks([node])
42
+ }
43
+ }
44
+ }
45
+ })
46
+ })
47
+ // configuration of the observer:
48
+ var config = {
49
+ attributes: true,
50
+ childList: true,
51
+ subtree: true
52
+ }
53
+ // pass in the target node, as well as the observer options
54
+ observer.observe(target, config)
55
+ // later, you can stop observing
56
+ /// observer.disconnect();
57
+ }
58
+ //This library will init all links in the DOM that include the attribute "courseLink = true"
59
+ //with the information necessary for the document at that link to track as part of this session.
60
+ const setupCourseLinks = (_nodes) => {
61
+ var launchToken = getQueryVariable('xAPILaunchKey')
62
+ var launchEndpoint = getQueryVariable('xAPILaunchService')
63
+ var encrypted = getQueryVariable('encrypted')
64
+ var query =
65
+ 'xAPILaunchKey=' + launchToken + '&xAPILaunchService=' + launchEndpoint
66
+ if (encrypted) {
67
+ query += '&encrypted=true'
68
+ }
69
+ for (var i = 0; i < _nodes.length; i++) {
70
+ var link = _nodes[i]
71
+ var href = link.href
72
+ var courseLink = link.attributes.getNamedItem('courselink')
73
+ if (courseLink && courseLink.value == 'true') {
74
+ if (href.indexOf('?') > -1) {
75
+ href = href + '&' + query
76
+ } else href = href + '?' + query
77
+ link.href = href
78
+ }
79
+ }
80
+ }
81
+
82
+ const xAPILaunch = (cb, terminate_on_unload, strict_callbacks) => {
83
+ cb = cb_wrap(cb)
84
+
85
+ try {
86
+ var launchToken = getQueryVariable('xAPILaunchKey')
87
+ var launchEndpoint = getQueryVariable('xAPILaunchService')
88
+ var encrypted = getQueryVariable('encrypted')
89
+ if (encrypted) {
90
+ //here, we'd have to implement decryption for the data. This makes little sense in a client side only course
91
+ }
92
+
93
+ xAPILaunch.terminate = function (message) {
94
+ var launch = new URL(launchEndpoint)
95
+ launch.pathname += 'launch/' + launchToken + '/terminate'
96
+ var xhr2 = new XMLHttpRequest()
97
+ xhr2.withCredentials = true
98
+ xhr2.crossDomain = true
99
+
100
+ xhr2.open('POST', launch.toString(), false)
101
+ xhr2.setRequestHeader('Content-type', 'application/json')
102
+ xhr2.send(
103
+ JSON.stringify({
104
+ code: 0,
105
+ description: message || 'User closed content'
106
+ })
107
+ )
108
+ }
109
+
110
+ if (!launchToken || !launchEndpoint)
111
+ return cb('invalid launch parameters')
112
+ var launch = new URL(launchEndpoint)
113
+ launch.pathname += 'launch/' + launchToken
114
+ var xhr = new XMLHttpRequest()
115
+ xhr.withCredentials = true
116
+ xhr.crossDomain = true
117
+ xhr.onerror = function (err) {
118
+ //exit the try catch so inner execptions in the callback don't trigger this catch
119
+ window.setTimeout(function () {
120
+ return cb(err)
121
+ })
122
+ }
123
+ xhr.onload = function (e) {
124
+ e
125
+ if (xhr.status !== 200) {
126
+ return xhr.onerror(xhr.responseText)
127
+ }
128
+ var body = JSON.parse(xhr.responseText)
129
+ var launchData = body
130
+
131
+ var conf = {}
132
+ conf['endpoint'] = launchData.endpoint
133
+ conf['actor'] = launchData.actor
134
+ conf.withCredentials = true
135
+ conf.strictCallbacks = strict_callbacks || false
136
+
137
+ window.onunload = function () {
138
+ if (!terminate_on_unload) return
139
+ xAPILaunch.terminate('User closed content')
140
+ }
141
+ const wrapper = new obj.XAPIWrapper.constructor()
142
+
143
+ wrapper.changeConfig(conf)
144
+ //Links that include "courseLink='true'"
145
+ setupCourseLinks(document.body.querySelectorAll('a'))
146
+ //Also, if links are added dynamically, we will do the same logic for those links.
147
+ observeForNewLinks()
148
+ return cb(null, body, wrapper)
149
+ }
150
+ xhr.open('POST', launch.toString(), true)
151
+ xhr.send()
152
+ } catch (e) {
153
+ cb(e)
154
+ }
155
+ }
156
+ obj.launch = xAPILaunch
157
+ }