fcad-core-dragon 2.1.0-beta.4 → 2.1.0
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 +8 -33
- package/.prettierrc +11 -0
- package/.vscode/extensions.json +8 -0
- package/.vscode/settings.json +16 -0
- package/CHANGELOG +20 -0
- package/eslint.config.js +60 -0
- package/package.json +9 -9
- package/src/$locales/en.json +3 -3
- package/src/$locales/fr.json +3 -3
- package/src/assets/data/onboardingMessages.json +47 -47
- package/src/components/AppBase.vue +5 -6
- package/src/components/AppBaseErrorDisplay.vue +438 -438
- package/src/components/AppBaseFlipCard.vue +84 -84
- package/src/components/AppBaseModule.vue +15 -17
- package/src/components/AppBasePage.vue +866 -783
- package/src/components/AppBasePopover.vue +41 -41
- package/src/components/AppBaseSkeleton.vue +24 -3
- package/src/components/AppCompAudio.vue +12 -2
- package/src/components/AppCompInputCheckBoxNx.vue +1 -2
- package/src/components/AppCompInputRadioNx.vue +8 -2
- package/src/components/AppCompInputTextToFillDropdownNx.vue +45 -0
- package/src/components/AppCompMenu.vue +424 -423
- package/src/components/AppCompNavigation.vue +2 -2
- package/src/components/AppCompPlayBarNext.vue +123 -94
- package/src/components/AppCompPopUpNext.vue +2 -2
- package/src/components/AppCompQuizNext.vue +12 -2
- package/src/components/AppCompQuizRecall.vue +10 -4
- package/src/components/AppCompSettingsMenu.vue +172 -172
- package/src/components/AppCompTableOfContent.vue +1 -4
- package/src/components/AppCompVideoPlayer.vue +7 -0
- package/src/components/AppCompViewDisplay.vue +6 -6
- package/src/composables/useTimer.js +17 -20
- package/src/externalComps/ModuleView.vue +22 -22
- package/src/externalComps/SummaryView.vue +91 -91
- package/src/module/stores/appStore.js +0 -1
- 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/utils.js +167 -167
- package/src/module/xapi/verbs.js +294 -294
- package/src/module/xapi/xapiStatement.js +444 -444
- package/src/plugins/bus.js +8 -8
- package/src/plugins/helper.js +4 -0
- 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 +1 -1
- package/src/shared/validators.js +22 -6
- package/.eslintignore +0 -29
- package/.eslintrc.cjs +0 -81
- package/bk.scss +0 -117
|
@@ -1,84 +1,84 @@
|
|
|
1
|
-
<template>
|
|
2
|
-
<!--
|
|
3
|
-
inspire by : https://vuejsexamples.com/generic-flip-card-in-vue-that-allows-completely-arbitrary-content-on-each-side/
|
|
4
|
-
-->
|
|
5
|
-
<div class="flip-card" role="button" aria-pressed="false" @click="fnClick">
|
|
6
|
-
<div class="inside-card" :class="{ flip: isFlipped }">
|
|
7
|
-
<div class="front-card" name="front-card">
|
|
8
|
-
<slot name="front-card" />
|
|
9
|
-
</div>
|
|
10
|
-
<div class="back-card">
|
|
11
|
-
<slot name="back-card" />
|
|
12
|
-
</div>
|
|
13
|
-
</div>
|
|
14
|
-
</div>
|
|
15
|
-
</template>
|
|
16
|
-
<script>
|
|
17
|
-
export default {
|
|
18
|
-
props: {
|
|
19
|
-
isActive: {
|
|
20
|
-
type: Boolean,
|
|
21
|
-
default: false
|
|
22
|
-
}
|
|
23
|
-
},
|
|
24
|
-
emits: ['click'],
|
|
25
|
-
data() {
|
|
26
|
-
return {
|
|
27
|
-
isFlipped: false
|
|
28
|
-
}
|
|
29
|
-
},
|
|
30
|
-
methods: {
|
|
31
|
-
/**
|
|
32
|
-
* @fires click to parent componant or page
|
|
33
|
-
*/
|
|
34
|
-
fnClick() {
|
|
35
|
-
this.$emit('click', this.$el)
|
|
36
|
-
this.isFlipped = !this.isFlipped
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
</script>
|
|
41
|
-
<style lang="scss">
|
|
42
|
-
.flip-card {
|
|
43
|
-
height: auto;
|
|
44
|
-
cursor: pointer;
|
|
45
|
-
|
|
46
|
-
/***** Parameretre modifiable *****/
|
|
47
|
-
perspective: 100%;
|
|
48
|
-
width: 90%;
|
|
49
|
-
|
|
50
|
-
.inside-card {
|
|
51
|
-
position: relative;
|
|
52
|
-
width: 100%;
|
|
53
|
-
height: 100%;
|
|
54
|
-
|
|
55
|
-
/***** Parameretre modifiable *****/
|
|
56
|
-
transform-style: preserve-3d;
|
|
57
|
-
transition: transform 0.5s;
|
|
58
|
-
|
|
59
|
-
&.flip {
|
|
60
|
-
/***** Parameretre modifiable *****/
|
|
61
|
-
transform: rotateY(180deg);
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
.front-card,
|
|
65
|
-
.back-card {
|
|
66
|
-
position: absolute;
|
|
67
|
-
width: 100%;
|
|
68
|
-
height: 100%;
|
|
69
|
-
-webkit-backface-visibility: hidden;
|
|
70
|
-
backface-visibility: hidden;
|
|
71
|
-
|
|
72
|
-
.img-flip-card {
|
|
73
|
-
width: 90%;
|
|
74
|
-
height: auto;
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
.back-card {
|
|
79
|
-
/***** Parameretre modifiable *****/
|
|
80
|
-
transform: rotateY(180deg);
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
</style>
|
|
1
|
+
<template>
|
|
2
|
+
<!--
|
|
3
|
+
inspire by : https://vuejsexamples.com/generic-flip-card-in-vue-that-allows-completely-arbitrary-content-on-each-side/
|
|
4
|
+
-->
|
|
5
|
+
<div class="flip-card" role="button" aria-pressed="false" @click="fnClick">
|
|
6
|
+
<div class="inside-card" :class="{ flip: isFlipped }">
|
|
7
|
+
<div class="front-card" name="front-card">
|
|
8
|
+
<slot name="front-card" />
|
|
9
|
+
</div>
|
|
10
|
+
<div class="back-card">
|
|
11
|
+
<slot name="back-card" />
|
|
12
|
+
</div>
|
|
13
|
+
</div>
|
|
14
|
+
</div>
|
|
15
|
+
</template>
|
|
16
|
+
<script>
|
|
17
|
+
export default {
|
|
18
|
+
props: {
|
|
19
|
+
isActive: {
|
|
20
|
+
type: Boolean,
|
|
21
|
+
default: false
|
|
22
|
+
}
|
|
23
|
+
},
|
|
24
|
+
emits: ['click'],
|
|
25
|
+
data() {
|
|
26
|
+
return {
|
|
27
|
+
isFlipped: false
|
|
28
|
+
}
|
|
29
|
+
},
|
|
30
|
+
methods: {
|
|
31
|
+
/**
|
|
32
|
+
* @fires click to parent componant or page
|
|
33
|
+
*/
|
|
34
|
+
fnClick() {
|
|
35
|
+
this.$emit('click', this.$el)
|
|
36
|
+
this.isFlipped = !this.isFlipped
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
</script>
|
|
41
|
+
<style lang="scss">
|
|
42
|
+
.flip-card {
|
|
43
|
+
height: auto;
|
|
44
|
+
cursor: pointer;
|
|
45
|
+
|
|
46
|
+
/***** Parameretre modifiable *****/
|
|
47
|
+
perspective: 100%;
|
|
48
|
+
width: 90%;
|
|
49
|
+
|
|
50
|
+
.inside-card {
|
|
51
|
+
position: relative;
|
|
52
|
+
width: 100%;
|
|
53
|
+
height: 100%;
|
|
54
|
+
|
|
55
|
+
/***** Parameretre modifiable *****/
|
|
56
|
+
transform-style: preserve-3d;
|
|
57
|
+
transition: transform 0.5s;
|
|
58
|
+
|
|
59
|
+
&.flip {
|
|
60
|
+
/***** Parameretre modifiable *****/
|
|
61
|
+
transform: rotateY(180deg);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
.front-card,
|
|
65
|
+
.back-card {
|
|
66
|
+
position: absolute;
|
|
67
|
+
width: 100%;
|
|
68
|
+
height: 100%;
|
|
69
|
+
-webkit-backface-visibility: hidden;
|
|
70
|
+
backface-visibility: hidden;
|
|
71
|
+
|
|
72
|
+
.img-flip-card {
|
|
73
|
+
width: 90%;
|
|
74
|
+
height: auto;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
.back-card {
|
|
79
|
+
/***** Parameretre modifiable *****/
|
|
80
|
+
transform: rotateY(180deg);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
</style>
|
|
@@ -29,6 +29,8 @@
|
|
|
29
29
|
/>
|
|
30
30
|
</nav>
|
|
31
31
|
<base-module :m-data="$data">
|
|
32
|
+
|
|
33
|
+
|
|
32
34
|
<v-container
|
|
33
35
|
id="wrapper-content"
|
|
34
36
|
fluid
|
|
@@ -184,7 +186,6 @@ export default {
|
|
|
184
186
|
appReady() {
|
|
185
187
|
return this.getAppStatus === 'ready' ? true : false
|
|
186
188
|
},
|
|
187
|
-
|
|
188
189
|
hasMedia() {
|
|
189
190
|
return typeof this.hasMediaElOrTimeline === 'object'
|
|
190
191
|
},
|
|
@@ -203,7 +204,6 @@ export default {
|
|
|
203
204
|
return true
|
|
204
205
|
else return false
|
|
205
206
|
},
|
|
206
|
-
|
|
207
207
|
/**
|
|
208
208
|
* @description Set the id the module
|
|
209
209
|
*/
|
|
@@ -233,7 +233,6 @@ export default {
|
|
|
233
233
|
description = this.moduleConfig.description
|
|
234
234
|
return description
|
|
235
235
|
},
|
|
236
|
-
|
|
237
236
|
/**
|
|
238
237
|
* @description set Previous/Next can allow navigation between activities.
|
|
239
238
|
*
|
|
@@ -338,7 +337,6 @@ export default {
|
|
|
338
337
|
|
|
339
338
|
return sidebarSettings
|
|
340
339
|
},
|
|
341
|
-
|
|
342
340
|
navigationHistory() {
|
|
343
341
|
return this.getRouteHistory
|
|
344
342
|
}
|
|
@@ -521,7 +519,7 @@ export default {
|
|
|
521
519
|
lessonLabel = this.$t('text.lesson')
|
|
522
520
|
lessonNumber = this.moduleConfig.id.replace('module_', '')
|
|
523
521
|
lessonTitle = this.theTitle
|
|
524
|
-
titleString = lessonLabel + ' ' + lessonNumber + '
|
|
522
|
+
titleString = lessonLabel + ' ' + lessonNumber + ' – ' + lessonTitle
|
|
525
523
|
|
|
526
524
|
//Remove prefix for introduction or conclusion, according to isIntroConclu setting in Module.vue
|
|
527
525
|
if (typeof this.moduleConfig.isIntroConclu !== 'undefined') {
|
|
@@ -626,7 +624,7 @@ export default {
|
|
|
626
624
|
async handleKeyboardControls(evt) {
|
|
627
625
|
let { code } = evt
|
|
628
626
|
|
|
629
|
-
if (code === 'Escape' && this.rightSidebarVisible){
|
|
627
|
+
if (code === 'Escape' && this.rightSidebarVisible) {
|
|
630
628
|
this.closeSidebar(this.dynamicSidebarContent._context)
|
|
631
629
|
}
|
|
632
630
|
},
|
|
@@ -661,15 +659,15 @@ export default {
|
|
|
661
659
|
//delay animation
|
|
662
660
|
this.rightSidebarVisible = true
|
|
663
661
|
this.updatesideBIsOpen(this.rightSidebarVisible)
|
|
664
|
-
setTimeout(() => {
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
}, 100)
|
|
662
|
+
// setTimeout(() => {
|
|
663
|
+
const rightSidebarContent = this.getRightSidebar() // Emelent displayed in the sidebar-body
|
|
664
|
+
if (!rightSidebarContent) return
|
|
665
|
+
rightSidebarContent.scrollTop = 0
|
|
666
|
+
const rSidebar = document.querySelector('#right-sidebar') // the sidebar
|
|
667
|
+
rSidebar.dispatchEvent(this.rightSidebarEvent)
|
|
668
|
+
rSidebar.setAttribute('tabindex', -1)
|
|
669
|
+
this.resetFocus(rSidebar) //set focus on the sidebar
|
|
670
|
+
// }, 100)
|
|
673
671
|
},
|
|
674
672
|
/**
|
|
675
673
|
* @description close the right sidebar component
|
|
@@ -682,6 +680,7 @@ export default {
|
|
|
682
680
|
this.rightSidebarVisible = false //
|
|
683
681
|
setTimeout(() => {
|
|
684
682
|
const rSidebar = document.querySelector('#right-sidebar') // the sidebar
|
|
683
|
+
if (!rSidebar) return
|
|
685
684
|
rSidebar.setAttribute('style', 'display:none')
|
|
686
685
|
rSidebar.dispatchEvent(this.rightSidebarEvent) //this will allow to run the animation of sidebar closing 1rst
|
|
687
686
|
}, 100)
|
|
@@ -785,7 +784,6 @@ export default {
|
|
|
785
784
|
openBranchContent(branchID) {
|
|
786
785
|
this.branchingVisible = true
|
|
787
786
|
this.compID = branchID //set compenent ID
|
|
788
|
-
|
|
789
787
|
setTimeout(() => {
|
|
790
788
|
const rightSidebar = this.getRightSidebar()
|
|
791
789
|
//Should indicate that page is completed when the Rightsidebar content heigh is less then window height
|
|
@@ -847,7 +845,7 @@ export default {
|
|
|
847
845
|
|
|
848
846
|
return new Promise((res) => {
|
|
849
847
|
this.$bus.$emit('set-comp-status', 'appBaseModule', 'loading')
|
|
850
|
-
this.updateCurrentTimeline(
|
|
848
|
+
this.updateCurrentTimeline(null)
|
|
851
849
|
this.updateCurrentMediaElements([])
|
|
852
850
|
// this.updateCurrentPage({})
|
|
853
851
|
this.$bus.$emit('set-comp-status', 'appBaseModule', 'ready')
|