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.
Files changed (70) hide show
  1. package/.editorconfig +8 -33
  2. package/.prettierrc +11 -0
  3. package/.vscode/extensions.json +8 -0
  4. package/.vscode/settings.json +16 -0
  5. package/CHANGELOG +20 -0
  6. package/eslint.config.js +60 -0
  7. package/package.json +9 -9
  8. package/src/$locales/en.json +3 -3
  9. package/src/$locales/fr.json +3 -3
  10. package/src/assets/data/onboardingMessages.json +47 -47
  11. package/src/components/AppBase.vue +5 -6
  12. package/src/components/AppBaseErrorDisplay.vue +438 -438
  13. package/src/components/AppBaseFlipCard.vue +84 -84
  14. package/src/components/AppBaseModule.vue +15 -17
  15. package/src/components/AppBasePage.vue +866 -783
  16. package/src/components/AppBasePopover.vue +41 -41
  17. package/src/components/AppBaseSkeleton.vue +24 -3
  18. package/src/components/AppCompAudio.vue +12 -2
  19. package/src/components/AppCompInputCheckBoxNx.vue +1 -2
  20. package/src/components/AppCompInputRadioNx.vue +8 -2
  21. package/src/components/AppCompInputTextToFillDropdownNx.vue +45 -0
  22. package/src/components/AppCompMenu.vue +424 -423
  23. package/src/components/AppCompNavigation.vue +2 -2
  24. package/src/components/AppCompPlayBarNext.vue +123 -94
  25. package/src/components/AppCompPopUpNext.vue +2 -2
  26. package/src/components/AppCompQuizNext.vue +12 -2
  27. package/src/components/AppCompQuizRecall.vue +10 -4
  28. package/src/components/AppCompSettingsMenu.vue +172 -172
  29. package/src/components/AppCompTableOfContent.vue +1 -4
  30. package/src/components/AppCompVideoPlayer.vue +7 -0
  31. package/src/components/AppCompViewDisplay.vue +6 -6
  32. package/src/composables/useTimer.js +17 -20
  33. package/src/externalComps/ModuleView.vue +22 -22
  34. package/src/externalComps/SummaryView.vue +91 -91
  35. package/src/module/stores/appStore.js +0 -1
  36. package/src/module/xapi/Crypto/Hasher.js +241 -241
  37. package/src/module/xapi/Crypto/WordArray.js +278 -278
  38. package/src/module/xapi/Crypto/algorithms/BufferedBlockAlgorithm.js +103 -103
  39. package/src/module/xapi/Crypto/algorithms/C_algo.js +315 -315
  40. package/src/module/xapi/Crypto/algorithms/HMAC.js +9 -9
  41. package/src/module/xapi/Crypto/algorithms/SHA1.js +9 -9
  42. package/src/module/xapi/Crypto/encoders/Base.js +105 -105
  43. package/src/module/xapi/Crypto/encoders/Base64.js +99 -99
  44. package/src/module/xapi/Crypto/encoders/Hex.js +61 -61
  45. package/src/module/xapi/Crypto/encoders/Latin1.js +61 -61
  46. package/src/module/xapi/Crypto/encoders/Utf8.js +45 -45
  47. package/src/module/xapi/Crypto/index.js +53 -53
  48. package/src/module/xapi/Statement/activity.js +47 -47
  49. package/src/module/xapi/Statement/agent.js +55 -55
  50. package/src/module/xapi/Statement/group.js +26 -26
  51. package/src/module/xapi/Statement/index.js +259 -259
  52. package/src/module/xapi/Statement/statement.js +253 -253
  53. package/src/module/xapi/Statement/statementRef.js +23 -23
  54. package/src/module/xapi/Statement/substatement.js +22 -22
  55. package/src/module/xapi/Statement/verb.js +36 -36
  56. package/src/module/xapi/activitytypes.js +17 -17
  57. package/src/module/xapi/utils.js +167 -167
  58. package/src/module/xapi/verbs.js +294 -294
  59. package/src/module/xapi/xapiStatement.js +444 -444
  60. package/src/plugins/bus.js +8 -8
  61. package/src/plugins/helper.js +4 -0
  62. package/src/plugins/save.js +37 -37
  63. package/src/plugins/scorm.js +287 -287
  64. package/src/plugins/xapi.js +11 -11
  65. package/src/public/index.html +33 -33
  66. package/src/router/index.js +1 -1
  67. package/src/shared/validators.js +22 -6
  68. package/.eslintignore +0 -29
  69. package/.eslintrc.cjs +0 -81
  70. 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 + ' : ' + lessonTitle
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
- const rightSidebarContent = this.getRightSidebar() // Emelent displayed in the sidebar-body
666
- if (!rightSidebarContent) return
667
- rightSidebarContent.scrollTop = 0
668
- const rSidebar = document.querySelector('#right-sidebar') // the sidebar
669
- rSidebar.dispatchEvent(this.rightSidebarEvent)
670
- rSidebar.setAttribute('tabindex', -1)
671
- this.resetFocus(rSidebar) //set focus on the sidebar
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')