fcad-core-dragon 2.1.1 → 2.1.2
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.
- package/.editorconfig +7 -7
- package/.gitlab-ci.yml +124 -0
- package/.prettierrc +11 -11
- package/.vscode/extensions.json +8 -8
- package/.vscode/settings.json +46 -16
- package/CHANGELOG +520 -520
- package/README.md +57 -57
- package/documentation/.vitepress/config.js +114 -114
- package/documentation/api-examples.md +49 -49
- package/documentation/composants/app-base-button.md +58 -58
- package/documentation/composants/app-base-error-display.md +59 -59
- package/documentation/composants/app-base-popover.md +68 -68
- package/documentation/composants/app-comp-audio.md +75 -75
- package/documentation/composants/app-comp-branch-buttons.md +111 -111
- package/documentation/composants/app-comp-button-progress.md +53 -53
- package/documentation/composants/app-comp-carousel.md +53 -53
- package/documentation/composants/app-comp-container.md +53 -53
- package/documentation/composants/app-comp-input-checkbox-next.md +42 -42
- package/documentation/composants/app-comp-input-dropdown-next.md +34 -34
- package/documentation/composants/app-comp-input-radio-next.md +39 -39
- package/documentation/composants/app-comp-input-text-next.md +35 -35
- package/documentation/composants/app-comp-input-text-table-next.md +34 -34
- package/documentation/composants/app-comp-input-text-to-fill-dropdown-next.md +53 -53
- package/documentation/composants/app-comp-input-text-to-fill-next.md +31 -31
- package/documentation/composants/app-comp-jauge.md +31 -31
- package/documentation/composants/app-comp-menu-item.md +55 -55
- package/documentation/composants/app-comp-menu.md +29 -29
- package/documentation/composants/app-comp-navigation.md +41 -41
- package/documentation/composants/app-comp-note-call.md +53 -53
- package/documentation/composants/app-comp-note-credit.md +53 -53
- package/documentation/composants/app-comp-play-bar-next.md +53 -53
- package/documentation/composants/app-comp-pop-up-next.md +93 -93
- package/documentation/composants/app-comp-quiz-next.md +235 -235
- package/documentation/composants/app-comp-quiz-recall.md +53 -53
- package/documentation/composants/app-comp-svg-next.md +53 -53
- package/documentation/composants/app-comp-table-of-content.md +50 -50
- package/documentation/composants/app-comp-video-player.md +82 -82
- package/documentation/composants.md +46 -46
- package/documentation/composants_critiques/ModelPageComposant.md +53 -53
- package/documentation/composants_critiques/app-base-module.md +43 -43
- package/documentation/composants_critiques/app-base-page.md +48 -48
- package/documentation/composants_critiques/app-base.md +311 -311
- package/documentation/composants_critiques/main.md +15 -15
- package/documentation/demarrage.md +50 -50
- package/documentation/deploiement.md +57 -57
- package/documentation/index.md +33 -33
- package/documentation/markdown-examples.md +85 -85
- package/documentation/public/vite.svg +14 -14
- package/documentation/public/vuejs.svg +1 -1
- package/documentation/public/vuetify.svg +5 -5
- package/eslint.config.js +60 -60
- package/junit-report.xml +182 -0
- package/package.json +66 -59
- package/playwright/index.html +12 -0
- package/playwright/index.js +21 -0
- package/playwright-ct.config.js +95 -0
- package/src/$locales/en.json +157 -157
- package/src/$locales/fr.json +120 -120
- package/src/assets/data/onboardingMessages.json +47 -47
- package/src/components/AppBase.vue +1171 -1169
- package/src/components/AppBaseButton.vue +90 -95
- package/src/components/AppBaseErrorDisplay.vue +438 -438
- package/src/components/AppBaseFlipCard.vue +84 -84
- package/src/components/AppBaseModule.vue +1639 -1634
- package/src/components/AppBasePage.vue +867 -866
- package/src/components/AppBasePopover.vue +41 -41
- package/src/components/AppBaseSkeleton.vue +66 -66
- package/src/components/AppCompAudio.vue +261 -256
- package/src/components/AppCompBranchButtons.vue +508 -508
- package/src/components/AppCompButtonProgress.vue +137 -132
- package/src/components/AppCompCarousel.vue +342 -336
- package/src/components/AppCompContainer.vue +29 -29
- package/src/components/AppCompInputCheckBoxNx.vue +325 -323
- package/src/components/AppCompInputDropdownNx.vue +302 -299
- package/src/components/AppCompInputRadioNx.vue +287 -284
- package/src/components/AppCompInputTextNx.vue +156 -153
- package/src/components/AppCompInputTextTableNx.vue +205 -202
- package/src/components/AppCompInputTextToFillDropdownNx.vue +343 -340
- package/src/components/AppCompInputTextToFillNx.vue +316 -313
- package/src/components/AppCompJauge.vue +81 -81
- package/src/components/AppCompMenu.vue +6 -1
- package/src/components/AppCompMenuItem.vue +246 -240
- package/src/components/AppCompNavigation.vue +977 -972
- package/src/components/AppCompNoteCall.vue +167 -161
- package/src/components/AppCompNoteCredit.vue +496 -491
- package/src/components/AppCompPlayBarNext.vue +2290 -2288
- package/src/components/AppCompPopUpNext.vue +508 -504
- package/src/components/AppCompQuizNext.vue +515 -510
- package/src/components/AppCompQuizRecall.vue +355 -350
- package/src/components/AppCompSVGNext.vue +346 -346
- package/src/components/AppCompSettingsMenu.vue +177 -172
- package/src/components/AppCompTableOfContent.vue +433 -427
- package/src/components/AppCompVideoPlayer.vue +377 -377
- package/src/components/AppCompViewDisplay.vue +6 -6
- package/src/components/BaseModule.vue +55 -55
- package/src/composables/useIdleDetector.js +56 -56
- package/src/composables/useQuiz.js +89 -89
- package/src/composables/useTimer.js +172 -172
- package/src/directives/nvdaFix.js +53 -53
- package/src/externalComps/ModuleView.vue +22 -22
- package/src/externalComps/SummaryView.vue +91 -91
- package/src/main.js +493 -476
- package/src/module/stores/appStore.js +960 -947
- package/src/module/xapi/ADL.js +520 -520
- package/src/module/xapi/Crypto/Hasher.js +241 -241
- package/src/module/xapi/Crypto/WordArray.js +278 -278
- package/src/module/xapi/Crypto/algorithms/BufferedBlockAlgorithm.js +103 -103
- package/src/module/xapi/Crypto/algorithms/C_algo.js +315 -315
- package/src/module/xapi/Crypto/algorithms/HMAC.js +9 -9
- package/src/module/xapi/Crypto/algorithms/SHA1.js +9 -9
- package/src/module/xapi/Crypto/encoders/Base.js +105 -105
- package/src/module/xapi/Crypto/encoders/Base64.js +99 -99
- package/src/module/xapi/Crypto/encoders/Hex.js +61 -61
- package/src/module/xapi/Crypto/encoders/Latin1.js +61 -61
- package/src/module/xapi/Crypto/encoders/Utf8.js +45 -45
- package/src/module/xapi/Crypto/index.js +53 -53
- package/src/module/xapi/Statement/activity.js +47 -47
- package/src/module/xapi/Statement/agent.js +55 -55
- package/src/module/xapi/Statement/group.js +26 -26
- package/src/module/xapi/Statement/index.js +259 -259
- package/src/module/xapi/Statement/statement.js +253 -253
- package/src/module/xapi/Statement/statementRef.js +23 -23
- package/src/module/xapi/Statement/substatement.js +22 -22
- package/src/module/xapi/Statement/verb.js +36 -36
- package/src/module/xapi/activitytypes.js +17 -17
- package/src/module/xapi/launch.js +157 -157
- package/src/module/xapi/utils.js +167 -167
- package/src/module/xapi/verbs.js +294 -294
- package/src/module/xapi/wrapper.js +1895 -1895
- package/src/module/xapi/xapiStatement.js +444 -444
- package/src/plugins/analytics.js +34 -34
- package/src/plugins/bus.js +12 -8
- package/src/plugins/gsap.js +17 -17
- package/src/plugins/helper.js +355 -358
- package/src/plugins/i18n.js +27 -26
- package/src/plugins/idb.js +227 -227
- package/src/plugins/save.js +37 -37
- package/src/plugins/scorm.js +287 -287
- package/src/plugins/xapi.js +11 -11
- package/src/public/index.html +33 -33
- package/src/router/index.js +57 -57
- package/src/router/routes.js +312 -312
- package/src/shared/generalfuncs.js +344 -344
- package/src/shared/validators.js +1018 -1018
- package/tests/component/AppBaseButton.spec.js +53 -0
- package/tests/component/pinia.spec.js +24 -0
- package/{src/components/tests__ → tests/unit}/AppBaseButton.spec.js +53 -53
- package/tests/unit/AppCompInputCheckBoxNx.spec.js +59 -0
- package/tests/unit/AppCompInputDropdownNx.spec.js +51 -0
- package/tests/unit/AppCompInputRadioNx.spec.js +59 -0
- package/tests/unit/AppCompInputTextNx.spec.js +44 -0
- package/tests/unit/AppCompInputTextTableNx.spec.js +77 -0
- package/tests/unit/AppCompInputTextToFillDropdownNx.spec.js +60 -0
- package/tests/unit/AppCompInputTextToFillNx.spec.js +45 -0
- package/tests/unit/AppCompQuizNext.spec.js +114 -0
- package/tests/unit/AppCompVideoPlayer.spec.js +177 -0
- package/{src/components/tests__ → tests/unit}/useTimer.spec.js +91 -91
- package/vitest.config.js +28 -19
- package/vitest.setup.js +28 -0
- package/src/components/AppBaseButton.test.js +0 -21
package/src/plugins/scorm.js
CHANGED
|
@@ -1,287 +1,287 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Create a Scorm plugin for LMS communication.
|
|
3
|
-
* this plugin implements Scorm 1.2 specifications
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
export const scormPlugin = {
|
|
7
|
-
install: function (app) {
|
|
8
|
-
{
|
|
9
|
-
app.config.globalProperties.$scorm = {
|
|
10
|
-
nFindAPITries: 0,
|
|
11
|
-
API: null,
|
|
12
|
-
maxTries: 500,
|
|
13
|
-
SCORM_TRUE: 'true',
|
|
14
|
-
SCORM_FALSE: 'false',
|
|
15
|
-
SCORM_NO_ERROR: '0',
|
|
16
|
-
error_message: {
|
|
17
|
-
msg_api_init:
|
|
18
|
-
'Error - Could not initialize communication with the LMS.\n\nYour results may not be recorded.\n\n $@errorDescription',
|
|
19
|
-
msg_api_Terminate:
|
|
20
|
-
'Error - Could not terminate communication with the LMS.\n\nYour results may not be recorded.\n\n $@errorDescription',
|
|
21
|
-
msg_setValue:
|
|
22
|
-
'Error - Could not store a value in the LMS.\n\nYour results may not be recorded.\n\n $@errorDescription',
|
|
23
|
-
msg_getValue:
|
|
24
|
-
' Error - Could not retrieve a value from the LMS.\n\n $@errorDescription',
|
|
25
|
-
msg_commit:
|
|
26
|
-
'Error - Could not invoke Commit.\n\nYour results may not be recorded.\n\n $@errorDescription'
|
|
27
|
-
},
|
|
28
|
-
//Since the Unload handler will be called twice, from both the onunload
|
|
29
|
-
//and onbeforeunload events, ensure that we only call Terminate once.
|
|
30
|
-
terminateCalled: false,
|
|
31
|
-
//Track whether or not we successfully initialized.
|
|
32
|
-
initialized: false,
|
|
33
|
-
|
|
34
|
-
// The ScanForAPI() function searches for an object named this.API_1484_11
|
|
35
|
-
// in the window that is passed into the function. If the object is
|
|
36
|
-
// found a reference to the object is returned to the calling function.
|
|
37
|
-
// If the instance is found the SCO now has a handle to the LMS
|
|
38
|
-
// provided this.API Instance. The function searches a maximum number
|
|
39
|
-
// of parents of the current window. If no object is found the
|
|
40
|
-
// function returns a null reference. This function also reassigns a
|
|
41
|
-
// value to the win parameter passed in, based on the number of
|
|
42
|
-
// parents. At the end of the function call, the win variable will be
|
|
43
|
-
// set to the upper most parent in the chain of parents.
|
|
44
|
-
ScanForAPI: function (win) {
|
|
45
|
-
while (win.API == null && win.parent != null && win.parent != win) {
|
|
46
|
-
this.nFindAPITries++
|
|
47
|
-
if (this.nFindAPITries > this.maxTries) {
|
|
48
|
-
return null
|
|
49
|
-
}
|
|
50
|
-
win = win.parent
|
|
51
|
-
}
|
|
52
|
-
return win.API
|
|
53
|
-
},
|
|
54
|
-
// The GetAPI() function begins the process of searching for the LMS
|
|
55
|
-
// provided this.API Instance. The function takes in a parameter that
|
|
56
|
-
// represents the current window. The function is built to search in a
|
|
57
|
-
// specific order and stop when the LMS provided this.API Instance is found.
|
|
58
|
-
// The function begins by searching the current window�s parent, if the
|
|
59
|
-
// current window has a parent. If the this.API Instance is not found, the
|
|
60
|
-
// function then checks to see if there are any opener windows. If
|
|
61
|
-
// the window has an opener, the function begins to look for the
|
|
62
|
-
// this.API Instance in the opener window.
|
|
63
|
-
GetAPI: function (win) {
|
|
64
|
-
if (win.parent != null && win.parent != win) {
|
|
65
|
-
this.API = this.ScanForAPI(win.parent)
|
|
66
|
-
}
|
|
67
|
-
if (this.API == null && win.opener != null) {
|
|
68
|
-
this.API = this.ScanForAPI(win.opener)
|
|
69
|
-
}
|
|
70
|
-
},
|
|
71
|
-
|
|
72
|
-
// Initalize
|
|
73
|
-
Initialize: function () {
|
|
74
|
-
let result
|
|
75
|
-
|
|
76
|
-
this.GetAPI(window)
|
|
77
|
-
|
|
78
|
-
if (this.API == null) {
|
|
79
|
-
return
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
result = this.API.LMSInitialize('') // Initialize communication with LMS return true | false
|
|
83
|
-
|
|
84
|
-
if (result == this.SCORM_FALSE) {
|
|
85
|
-
let errorNumber = this.API.LMSGetLastError()
|
|
86
|
-
let errorString = this.API.LMSGetErrorString(errorNumber)
|
|
87
|
-
let diagnostic = this.API.LMSGetDiagnostic(errorNumber)
|
|
88
|
-
|
|
89
|
-
let errorDescription =
|
|
90
|
-
'Number: ' +
|
|
91
|
-
errorNumber +
|
|
92
|
-
'\nDescription: ' +
|
|
93
|
-
errorString +
|
|
94
|
-
'\nDiagnostic: ' +
|
|
95
|
-
diagnostic
|
|
96
|
-
|
|
97
|
-
alert(
|
|
98
|
-
'Error - Could not initialize communication with the LMS.\n\nYour results may not be recorded.\n\n' +
|
|
99
|
-
errorDescription
|
|
100
|
-
)
|
|
101
|
-
return
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
this.initialized = true
|
|
105
|
-
},
|
|
106
|
-
//Termitate the communication with the LMS
|
|
107
|
-
Finish: function (finalState) {
|
|
108
|
-
let result
|
|
109
|
-
//Don't terminate if we haven't initialized or if we've already terminated
|
|
110
|
-
if (this.initialized === false || this.terminateCalled === true) {
|
|
111
|
-
return
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
if (finalState && finalState == true) {
|
|
115
|
-
this.SetValue('cmi.core.lesson_status', 'completed')
|
|
116
|
-
} else {
|
|
117
|
-
this.SetValue('cmi.core.lesson_status', 'incomplete')
|
|
118
|
-
}
|
|
119
|
-
this.Commit()
|
|
120
|
-
result = this.API.LMSFinish('') // terminate communication with the LMS return true | false
|
|
121
|
-
this.terminateCalled = true
|
|
122
|
-
|
|
123
|
-
if (result == this.SCORM_FALSE) {
|
|
124
|
-
let errorNumber = this.API.LMSGetLastError()
|
|
125
|
-
let errorString = this.API.LMSGetErrorString(errorNumber)
|
|
126
|
-
let diagnostic = this.API.LMSGetDiagnostic(errorNumber)
|
|
127
|
-
|
|
128
|
-
let errorDescription =
|
|
129
|
-
'Number: ' +
|
|
130
|
-
errorNumber +
|
|
131
|
-
'\nDescription: ' +
|
|
132
|
-
errorString +
|
|
133
|
-
'\nDiagnostic: ' +
|
|
134
|
-
diagnostic
|
|
135
|
-
|
|
136
|
-
alert(
|
|
137
|
-
'Error - Could not terminate communication with the LMS.\n\nYour results may not be recorded.\n\n' +
|
|
138
|
-
errorDescription
|
|
139
|
-
)
|
|
140
|
-
return
|
|
141
|
-
}
|
|
142
|
-
this.initialized = false
|
|
143
|
-
},
|
|
144
|
-
//There are situations where a GetValue call is expected to have an error
|
|
145
|
-
//and should not alert the user.
|
|
146
|
-
|
|
147
|
-
GetValue: function (element, checkError) {
|
|
148
|
-
let result
|
|
149
|
-
|
|
150
|
-
if (this.initialized == false || this.terminateCalled == true) {
|
|
151
|
-
return
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
result = this.API.LMSGetValue(element)
|
|
155
|
-
|
|
156
|
-
if (checkError == true && result == '') {
|
|
157
|
-
let errorNumber = this.API.LMSGetLastError()
|
|
158
|
-
|
|
159
|
-
if (errorNumber != this.SCORM_NO_ERROR) {
|
|
160
|
-
let errorString = this.API.LMSGetErrorString(errorNumber)
|
|
161
|
-
let diagnostic = this.API.LMSGetDiagnostic(errorNumber)
|
|
162
|
-
|
|
163
|
-
let errorDescription =
|
|
164
|
-
'Number: ' +
|
|
165
|
-
errorNumber +
|
|
166
|
-
'\nDescription: ' +
|
|
167
|
-
errorString +
|
|
168
|
-
'\nDiagnostic: ' +
|
|
169
|
-
diagnostic
|
|
170
|
-
|
|
171
|
-
alert(
|
|
172
|
-
'Error - Could not retrieve a value from the LMS.\n\n' +
|
|
173
|
-
errorDescription
|
|
174
|
-
)
|
|
175
|
-
return ''
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
return result
|
|
180
|
-
},
|
|
181
|
-
|
|
182
|
-
SetValue: function (element, value) {
|
|
183
|
-
let result
|
|
184
|
-
|
|
185
|
-
if (this.initialized == false || this.terminateCalled == true) {
|
|
186
|
-
return
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
result = this.API.LMSSetValue(element, value)
|
|
190
|
-
|
|
191
|
-
if (result == this.SCORM_FALSE) {
|
|
192
|
-
let errorNumber = this.API.LMSGetLastError()
|
|
193
|
-
let errorString = this.API.LMSGetErrorString(errorNumber)
|
|
194
|
-
let diagnostic = this.API.LMSGetDiagnostic(errorNumber)
|
|
195
|
-
|
|
196
|
-
let errorDescription =
|
|
197
|
-
'Number: ' +
|
|
198
|
-
errorNumber +
|
|
199
|
-
'\nDescription: ' +
|
|
200
|
-
errorString +
|
|
201
|
-
'\nDiagnostic: ' +
|
|
202
|
-
diagnostic
|
|
203
|
-
|
|
204
|
-
alert(
|
|
205
|
-
'Error - Could not store a value in the LMS.\n\nYour results may not be recorded.\n\n' +
|
|
206
|
-
errorDescription
|
|
207
|
-
)
|
|
208
|
-
return
|
|
209
|
-
}
|
|
210
|
-
},
|
|
211
|
-
|
|
212
|
-
Commit: function () {
|
|
213
|
-
let result
|
|
214
|
-
|
|
215
|
-
result = this.API.LMSCommit('')
|
|
216
|
-
|
|
217
|
-
if (result == this.SCORM_FALSE) {
|
|
218
|
-
let errorNumber = this.API.LMSGetLastError()
|
|
219
|
-
let errorString = this.API.LMSGetErrorString(errorNumber)
|
|
220
|
-
let diagnostic = this.API.LMSGetDiagnostic(errorNumber)
|
|
221
|
-
|
|
222
|
-
let errorDescription =
|
|
223
|
-
'Number: ' +
|
|
224
|
-
errorNumber +
|
|
225
|
-
'\nDescription: ' +
|
|
226
|
-
errorString +
|
|
227
|
-
'\nDiagnostic: ' +
|
|
228
|
-
diagnostic
|
|
229
|
-
|
|
230
|
-
alert(
|
|
231
|
-
'Error - Could not invoke Commit.\n\nYour results may not be recorded.\n\n' +
|
|
232
|
-
errorDescription
|
|
233
|
-
)
|
|
234
|
-
return
|
|
235
|
-
}
|
|
236
|
-
},
|
|
237
|
-
//==================== CUSTOME METHODS =============================
|
|
238
|
-
checkForError: function () {
|
|
239
|
-
let error_type = null
|
|
240
|
-
let errorNumber = this.API.LMSGetLastError()
|
|
241
|
-
if (errorNumber !== '' || errorNumber !== '0') {
|
|
242
|
-
let errorString = this.API.LMSGetErrorString(errorNumber)
|
|
243
|
-
let diagnostic = this.API.LMSGetDiagnostic(errorNumber)
|
|
244
|
-
return (error_type = {
|
|
245
|
-
error_number: errorNumber,
|
|
246
|
-
error_name: errorString,
|
|
247
|
-
description: diagnostic
|
|
248
|
-
})
|
|
249
|
-
} else return error_type
|
|
250
|
-
},
|
|
251
|
-
|
|
252
|
-
formateMsg: function (msg, data) {
|
|
253
|
-
msg.replace('$@errorDescription', data)
|
|
254
|
-
},
|
|
255
|
-
|
|
256
|
-
getScormStatus: function () {
|
|
257
|
-
return this.initialized
|
|
258
|
-
},
|
|
259
|
-
|
|
260
|
-
getScormAPI: function () {
|
|
261
|
-
return this.API
|
|
262
|
-
},
|
|
263
|
-
|
|
264
|
-
setCompletionStatus: function (newStatus) {
|
|
265
|
-
this.API.RunTimeData.CompletionStatus = newStatus
|
|
266
|
-
this.Commit()
|
|
267
|
-
},
|
|
268
|
-
|
|
269
|
-
setSucessStatus: function (newStatus) {
|
|
270
|
-
this.API.RunTimeData.SuccessStatus = newStatus
|
|
271
|
-
this.Commit()
|
|
272
|
-
},
|
|
273
|
-
setBookMark(page) {
|
|
274
|
-
this.SetValue('cmi.core.lesson_location', page)
|
|
275
|
-
this.Commit()
|
|
276
|
-
},
|
|
277
|
-
getDataValues() {
|
|
278
|
-
return {
|
|
279
|
-
bookMark: this.GetValue('cmi.core.lesson_location'),
|
|
280
|
-
userData: this.GetValue('cmi.suspend_data'),
|
|
281
|
-
lessonState: this.GetValue('cmi.core.lesson_status')
|
|
282
|
-
}
|
|
283
|
-
}
|
|
284
|
-
}
|
|
285
|
-
}
|
|
286
|
-
}
|
|
287
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* Create a Scorm plugin for LMS communication.
|
|
3
|
+
* this plugin implements Scorm 1.2 specifications
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
export const scormPlugin = {
|
|
7
|
+
install: function (app) {
|
|
8
|
+
{
|
|
9
|
+
app.config.globalProperties.$scorm = {
|
|
10
|
+
nFindAPITries: 0,
|
|
11
|
+
API: null,
|
|
12
|
+
maxTries: 500,
|
|
13
|
+
SCORM_TRUE: 'true',
|
|
14
|
+
SCORM_FALSE: 'false',
|
|
15
|
+
SCORM_NO_ERROR: '0',
|
|
16
|
+
error_message: {
|
|
17
|
+
msg_api_init:
|
|
18
|
+
'Error - Could not initialize communication with the LMS.\n\nYour results may not be recorded.\n\n $@errorDescription',
|
|
19
|
+
msg_api_Terminate:
|
|
20
|
+
'Error - Could not terminate communication with the LMS.\n\nYour results may not be recorded.\n\n $@errorDescription',
|
|
21
|
+
msg_setValue:
|
|
22
|
+
'Error - Could not store a value in the LMS.\n\nYour results may not be recorded.\n\n $@errorDescription',
|
|
23
|
+
msg_getValue:
|
|
24
|
+
' Error - Could not retrieve a value from the LMS.\n\n $@errorDescription',
|
|
25
|
+
msg_commit:
|
|
26
|
+
'Error - Could not invoke Commit.\n\nYour results may not be recorded.\n\n $@errorDescription'
|
|
27
|
+
},
|
|
28
|
+
//Since the Unload handler will be called twice, from both the onunload
|
|
29
|
+
//and onbeforeunload events, ensure that we only call Terminate once.
|
|
30
|
+
terminateCalled: false,
|
|
31
|
+
//Track whether or not we successfully initialized.
|
|
32
|
+
initialized: false,
|
|
33
|
+
|
|
34
|
+
// The ScanForAPI() function searches for an object named this.API_1484_11
|
|
35
|
+
// in the window that is passed into the function. If the object is
|
|
36
|
+
// found a reference to the object is returned to the calling function.
|
|
37
|
+
// If the instance is found the SCO now has a handle to the LMS
|
|
38
|
+
// provided this.API Instance. The function searches a maximum number
|
|
39
|
+
// of parents of the current window. If no object is found the
|
|
40
|
+
// function returns a null reference. This function also reassigns a
|
|
41
|
+
// value to the win parameter passed in, based on the number of
|
|
42
|
+
// parents. At the end of the function call, the win variable will be
|
|
43
|
+
// set to the upper most parent in the chain of parents.
|
|
44
|
+
ScanForAPI: function (win) {
|
|
45
|
+
while (win.API == null && win.parent != null && win.parent != win) {
|
|
46
|
+
this.nFindAPITries++
|
|
47
|
+
if (this.nFindAPITries > this.maxTries) {
|
|
48
|
+
return null
|
|
49
|
+
}
|
|
50
|
+
win = win.parent
|
|
51
|
+
}
|
|
52
|
+
return win.API
|
|
53
|
+
},
|
|
54
|
+
// The GetAPI() function begins the process of searching for the LMS
|
|
55
|
+
// provided this.API Instance. The function takes in a parameter that
|
|
56
|
+
// represents the current window. The function is built to search in a
|
|
57
|
+
// specific order and stop when the LMS provided this.API Instance is found.
|
|
58
|
+
// The function begins by searching the current window�s parent, if the
|
|
59
|
+
// current window has a parent. If the this.API Instance is not found, the
|
|
60
|
+
// function then checks to see if there are any opener windows. If
|
|
61
|
+
// the window has an opener, the function begins to look for the
|
|
62
|
+
// this.API Instance in the opener window.
|
|
63
|
+
GetAPI: function (win) {
|
|
64
|
+
if (win.parent != null && win.parent != win) {
|
|
65
|
+
this.API = this.ScanForAPI(win.parent)
|
|
66
|
+
}
|
|
67
|
+
if (this.API == null && win.opener != null) {
|
|
68
|
+
this.API = this.ScanForAPI(win.opener)
|
|
69
|
+
}
|
|
70
|
+
},
|
|
71
|
+
|
|
72
|
+
// Initalize
|
|
73
|
+
Initialize: function () {
|
|
74
|
+
let result
|
|
75
|
+
|
|
76
|
+
this.GetAPI(window)
|
|
77
|
+
|
|
78
|
+
if (this.API == null) {
|
|
79
|
+
return
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
result = this.API.LMSInitialize('') // Initialize communication with LMS return true | false
|
|
83
|
+
|
|
84
|
+
if (result == this.SCORM_FALSE) {
|
|
85
|
+
let errorNumber = this.API.LMSGetLastError()
|
|
86
|
+
let errorString = this.API.LMSGetErrorString(errorNumber)
|
|
87
|
+
let diagnostic = this.API.LMSGetDiagnostic(errorNumber)
|
|
88
|
+
|
|
89
|
+
let errorDescription =
|
|
90
|
+
'Number: ' +
|
|
91
|
+
errorNumber +
|
|
92
|
+
'\nDescription: ' +
|
|
93
|
+
errorString +
|
|
94
|
+
'\nDiagnostic: ' +
|
|
95
|
+
diagnostic
|
|
96
|
+
|
|
97
|
+
alert(
|
|
98
|
+
'Error - Could not initialize communication with the LMS.\n\nYour results may not be recorded.\n\n' +
|
|
99
|
+
errorDescription
|
|
100
|
+
)
|
|
101
|
+
return
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
this.initialized = true
|
|
105
|
+
},
|
|
106
|
+
//Termitate the communication with the LMS
|
|
107
|
+
Finish: function (finalState) {
|
|
108
|
+
let result
|
|
109
|
+
//Don't terminate if we haven't initialized or if we've already terminated
|
|
110
|
+
if (this.initialized === false || this.terminateCalled === true) {
|
|
111
|
+
return
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
if (finalState && finalState == true) {
|
|
115
|
+
this.SetValue('cmi.core.lesson_status', 'completed')
|
|
116
|
+
} else {
|
|
117
|
+
this.SetValue('cmi.core.lesson_status', 'incomplete')
|
|
118
|
+
}
|
|
119
|
+
this.Commit()
|
|
120
|
+
result = this.API.LMSFinish('') // terminate communication with the LMS return true | false
|
|
121
|
+
this.terminateCalled = true
|
|
122
|
+
|
|
123
|
+
if (result == this.SCORM_FALSE) {
|
|
124
|
+
let errorNumber = this.API.LMSGetLastError()
|
|
125
|
+
let errorString = this.API.LMSGetErrorString(errorNumber)
|
|
126
|
+
let diagnostic = this.API.LMSGetDiagnostic(errorNumber)
|
|
127
|
+
|
|
128
|
+
let errorDescription =
|
|
129
|
+
'Number: ' +
|
|
130
|
+
errorNumber +
|
|
131
|
+
'\nDescription: ' +
|
|
132
|
+
errorString +
|
|
133
|
+
'\nDiagnostic: ' +
|
|
134
|
+
diagnostic
|
|
135
|
+
|
|
136
|
+
alert(
|
|
137
|
+
'Error - Could not terminate communication with the LMS.\n\nYour results may not be recorded.\n\n' +
|
|
138
|
+
errorDescription
|
|
139
|
+
)
|
|
140
|
+
return
|
|
141
|
+
}
|
|
142
|
+
this.initialized = false
|
|
143
|
+
},
|
|
144
|
+
//There are situations where a GetValue call is expected to have an error
|
|
145
|
+
//and should not alert the user.
|
|
146
|
+
|
|
147
|
+
GetValue: function (element, checkError) {
|
|
148
|
+
let result
|
|
149
|
+
|
|
150
|
+
if (this.initialized == false || this.terminateCalled == true) {
|
|
151
|
+
return
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
result = this.API.LMSGetValue(element)
|
|
155
|
+
|
|
156
|
+
if (checkError == true && result == '') {
|
|
157
|
+
let errorNumber = this.API.LMSGetLastError()
|
|
158
|
+
|
|
159
|
+
if (errorNumber != this.SCORM_NO_ERROR) {
|
|
160
|
+
let errorString = this.API.LMSGetErrorString(errorNumber)
|
|
161
|
+
let diagnostic = this.API.LMSGetDiagnostic(errorNumber)
|
|
162
|
+
|
|
163
|
+
let errorDescription =
|
|
164
|
+
'Number: ' +
|
|
165
|
+
errorNumber +
|
|
166
|
+
'\nDescription: ' +
|
|
167
|
+
errorString +
|
|
168
|
+
'\nDiagnostic: ' +
|
|
169
|
+
diagnostic
|
|
170
|
+
|
|
171
|
+
alert(
|
|
172
|
+
'Error - Could not retrieve a value from the LMS.\n\n' +
|
|
173
|
+
errorDescription
|
|
174
|
+
)
|
|
175
|
+
return ''
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
return result
|
|
180
|
+
},
|
|
181
|
+
|
|
182
|
+
SetValue: function (element, value) {
|
|
183
|
+
let result
|
|
184
|
+
|
|
185
|
+
if (this.initialized == false || this.terminateCalled == true) {
|
|
186
|
+
return
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
result = this.API.LMSSetValue(element, value)
|
|
190
|
+
|
|
191
|
+
if (result == this.SCORM_FALSE) {
|
|
192
|
+
let errorNumber = this.API.LMSGetLastError()
|
|
193
|
+
let errorString = this.API.LMSGetErrorString(errorNumber)
|
|
194
|
+
let diagnostic = this.API.LMSGetDiagnostic(errorNumber)
|
|
195
|
+
|
|
196
|
+
let errorDescription =
|
|
197
|
+
'Number: ' +
|
|
198
|
+
errorNumber +
|
|
199
|
+
'\nDescription: ' +
|
|
200
|
+
errorString +
|
|
201
|
+
'\nDiagnostic: ' +
|
|
202
|
+
diagnostic
|
|
203
|
+
|
|
204
|
+
alert(
|
|
205
|
+
'Error - Could not store a value in the LMS.\n\nYour results may not be recorded.\n\n' +
|
|
206
|
+
errorDescription
|
|
207
|
+
)
|
|
208
|
+
return
|
|
209
|
+
}
|
|
210
|
+
},
|
|
211
|
+
|
|
212
|
+
Commit: function () {
|
|
213
|
+
let result
|
|
214
|
+
|
|
215
|
+
result = this.API.LMSCommit('')
|
|
216
|
+
|
|
217
|
+
if (result == this.SCORM_FALSE) {
|
|
218
|
+
let errorNumber = this.API.LMSGetLastError()
|
|
219
|
+
let errorString = this.API.LMSGetErrorString(errorNumber)
|
|
220
|
+
let diagnostic = this.API.LMSGetDiagnostic(errorNumber)
|
|
221
|
+
|
|
222
|
+
let errorDescription =
|
|
223
|
+
'Number: ' +
|
|
224
|
+
errorNumber +
|
|
225
|
+
'\nDescription: ' +
|
|
226
|
+
errorString +
|
|
227
|
+
'\nDiagnostic: ' +
|
|
228
|
+
diagnostic
|
|
229
|
+
|
|
230
|
+
alert(
|
|
231
|
+
'Error - Could not invoke Commit.\n\nYour results may not be recorded.\n\n' +
|
|
232
|
+
errorDescription
|
|
233
|
+
)
|
|
234
|
+
return
|
|
235
|
+
}
|
|
236
|
+
},
|
|
237
|
+
//==================== CUSTOME METHODS =============================
|
|
238
|
+
checkForError: function () {
|
|
239
|
+
let error_type = null
|
|
240
|
+
let errorNumber = this.API.LMSGetLastError()
|
|
241
|
+
if (errorNumber !== '' || errorNumber !== '0') {
|
|
242
|
+
let errorString = this.API.LMSGetErrorString(errorNumber)
|
|
243
|
+
let diagnostic = this.API.LMSGetDiagnostic(errorNumber)
|
|
244
|
+
return (error_type = {
|
|
245
|
+
error_number: errorNumber,
|
|
246
|
+
error_name: errorString,
|
|
247
|
+
description: diagnostic
|
|
248
|
+
})
|
|
249
|
+
} else return error_type
|
|
250
|
+
},
|
|
251
|
+
|
|
252
|
+
formateMsg: function (msg, data) {
|
|
253
|
+
msg.replace('$@errorDescription', data)
|
|
254
|
+
},
|
|
255
|
+
|
|
256
|
+
getScormStatus: function () {
|
|
257
|
+
return this.initialized
|
|
258
|
+
},
|
|
259
|
+
|
|
260
|
+
getScormAPI: function () {
|
|
261
|
+
return this.API
|
|
262
|
+
},
|
|
263
|
+
|
|
264
|
+
setCompletionStatus: function (newStatus) {
|
|
265
|
+
this.API.RunTimeData.CompletionStatus = newStatus
|
|
266
|
+
this.Commit()
|
|
267
|
+
},
|
|
268
|
+
|
|
269
|
+
setSucessStatus: function (newStatus) {
|
|
270
|
+
this.API.RunTimeData.SuccessStatus = newStatus
|
|
271
|
+
this.Commit()
|
|
272
|
+
},
|
|
273
|
+
setBookMark(page) {
|
|
274
|
+
this.SetValue('cmi.core.lesson_location', page)
|
|
275
|
+
this.Commit()
|
|
276
|
+
},
|
|
277
|
+
getDataValues() {
|
|
278
|
+
return {
|
|
279
|
+
bookMark: this.GetValue('cmi.core.lesson_location'),
|
|
280
|
+
userData: this.GetValue('cmi.suspend_data'),
|
|
281
|
+
lessonState: this.GetValue('cmi.core.lesson_status')
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
}
|
package/src/plugins/xapi.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import ADL from '../module/xapi/ADL'
|
|
2
|
-
|
|
3
|
-
const _ADL = new ADL()
|
|
4
|
-
|
|
5
|
-
export const xapiPlugin = {
|
|
6
|
-
install(app) {
|
|
7
|
-
{
|
|
8
|
-
app.config.globalProperties.$xapi = _ADL
|
|
9
|
-
}
|
|
10
|
-
}
|
|
11
|
-
}
|
|
1
|
+
import ADL from '../module/xapi/ADL'
|
|
2
|
+
|
|
3
|
+
const _ADL = new ADL()
|
|
4
|
+
|
|
5
|
+
export const xapiPlugin = {
|
|
6
|
+
install(app) {
|
|
7
|
+
{
|
|
8
|
+
app.config.globalProperties.$xapi = _ADL
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
}
|
package/src/public/index.html
CHANGED
|
@@ -1,33 +1,33 @@
|
|
|
1
|
-
<!doctype html>
|
|
2
|
-
<html lang="en" data-build-time="<%= new Date().toLocaleString() %>">
|
|
3
|
-
<head>
|
|
4
|
-
<meta charset="utf-8" />
|
|
5
|
-
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
|
|
6
|
-
<meta name="viewport" content="width=device-width,initial-scale=1.0" />
|
|
7
|
-
<meta name="apple-mobile-web-app-capable" content="yes" />
|
|
8
|
-
<link rel="icon" href="<%= BASE_URL %>favicon.ico" />
|
|
9
|
-
<link
|
|
10
|
-
href="https://fonts.googleapis.com/css?family=Roboto:100,100i,300,300i,400,400i,500,500i,700,700i,900,900i&display=swap"
|
|
11
|
-
rel="stylesheet"
|
|
12
|
-
/>
|
|
13
|
-
<title>dfcad-prototype</title>
|
|
14
|
-
<link
|
|
15
|
-
rel="stylesheet"
|
|
16
|
-
href="https://fonts.googleapis.com/css?family=Roboto:100,300,400,500,700,900"
|
|
17
|
-
/>
|
|
18
|
-
<link
|
|
19
|
-
rel="stylesheet"
|
|
20
|
-
href="https://cdn.jsdelivr.net/npm/@mdi/font@latest/css/materialdesignicons.min.css"
|
|
21
|
-
/>
|
|
22
|
-
</head>
|
|
23
|
-
<body>
|
|
24
|
-
<noscript>
|
|
25
|
-
<strong>
|
|
26
|
-
We're sorry but dfcad-prototype doesn't work properly without JavaScript
|
|
27
|
-
enabled. Please enable it to continue.
|
|
28
|
-
</strong>
|
|
29
|
-
</noscript>
|
|
30
|
-
<div id="app"></div>
|
|
31
|
-
<!-- built files will be auto injected -->
|
|
32
|
-
</body>
|
|
33
|
-
</html>
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="en" data-build-time="<%= new Date().toLocaleString() %>">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8" />
|
|
5
|
+
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
|
|
6
|
+
<meta name="viewport" content="width=device-width,initial-scale=1.0" />
|
|
7
|
+
<meta name="apple-mobile-web-app-capable" content="yes" />
|
|
8
|
+
<link rel="icon" href="<%= BASE_URL %>favicon.ico" />
|
|
9
|
+
<link
|
|
10
|
+
href="https://fonts.googleapis.com/css?family=Roboto:100,100i,300,300i,400,400i,500,500i,700,700i,900,900i&display=swap"
|
|
11
|
+
rel="stylesheet"
|
|
12
|
+
/>
|
|
13
|
+
<title>dfcad-prototype</title>
|
|
14
|
+
<link
|
|
15
|
+
rel="stylesheet"
|
|
16
|
+
href="https://fonts.googleapis.com/css?family=Roboto:100,300,400,500,700,900"
|
|
17
|
+
/>
|
|
18
|
+
<link
|
|
19
|
+
rel="stylesheet"
|
|
20
|
+
href="https://cdn.jsdelivr.net/npm/@mdi/font@latest/css/materialdesignicons.min.css"
|
|
21
|
+
/>
|
|
22
|
+
</head>
|
|
23
|
+
<body>
|
|
24
|
+
<noscript>
|
|
25
|
+
<strong>
|
|
26
|
+
We're sorry but dfcad-prototype doesn't work properly without JavaScript
|
|
27
|
+
enabled. Please enable it to continue.
|
|
28
|
+
</strong>
|
|
29
|
+
</noscript>
|
|
30
|
+
<div id="app"></div>
|
|
31
|
+
<!-- built files will be auto injected -->
|
|
32
|
+
</body>
|
|
33
|
+
</html>
|