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,6 +1,6 @@
1
- <template>
2
- <router-view />
3
- </template>
4
- <script>
5
- export default {}
6
- </script>
1
+ <template>
2
+ <router-view />
3
+ </template>
4
+ <script>
5
+ export default {}
6
+ </script>
@@ -1,72 +1,72 @@
1
- <!--
2
- *@ Description: Root component used to extends the AppBase Module
3
- *@ What it does: Entry point for the data of appBaseModule. manage progress, indexeDB connection.
4
- *@Note :Must be used
5
- -->
6
- <template>
7
- <div v-if="mData" class="module-wrapper">
8
- <!-- <div
9
- class="overlay-close-widget"
10
- :class="{ blockOverlay: over }"
11
- @click="overlayClose()"
12
- ></div> -->
13
- <slot name="mTitle" />
14
- <slot>Module</slot>
15
- </div>
16
- </template>
17
-
18
- <script>
19
- export default {
20
- props: {
21
- mData: {
22
- type: Object,
23
- required: true
24
- }
25
- },
26
-
27
- data() {
28
- return {
29
- data: null
30
- // over: false
31
- // back: null
32
- }
33
- },
34
-
35
- mounted() {
36
- // this.$bus.$on('toggle-widget', () => {
37
- // this.over = true
38
- // })
39
- // this.$bus.$on('close-widget', () => {
40
- // this.over = false
41
- // })
42
- },
43
- created() {},
44
- methods: {
45
- // overlayClose() {
46
- // this.$bus.$emit('close-widget')
47
- // }
48
- }
49
- }
50
- </script>
51
-
52
- <style lang="scss" scoped>
53
- .module-wrapper {
54
- width: 100%;
55
- height: 100%;
56
- min-height: 100vh;
57
- padding: 0 145px;
58
- }
59
- .overlay-close-widget {
60
- position: absolute;
61
- top: 0;
62
- left: 0;
63
- width: 100%;
64
- height: 100%;
65
- z-index: 2;
66
- display: none;
67
-
68
- &.blockOverlay {
69
- display: block;
70
- }
71
- }
72
- </style>
1
+ <!--
2
+ *@ Description: Root component used to extends the AppBase Module
3
+ *@ What it does: Entry point for the data of appBaseModule. manage progress, indexeDB connection.
4
+ *@Note :Must be used
5
+ -->
6
+ <template>
7
+ <div v-if="mData" class="module-wrapper">
8
+ <!-- <div
9
+ class="overlay-close-widget"
10
+ :class="{ blockOverlay: over }"
11
+ @click="overlayClose()"
12
+ ></div> -->
13
+ <slot name="mTitle" />
14
+ <slot>Module</slot>
15
+ </div>
16
+ </template>
17
+
18
+ <script>
19
+ export default {
20
+ props: {
21
+ mData: {
22
+ type: Object,
23
+ required: true
24
+ }
25
+ },
26
+
27
+ data() {
28
+ return {
29
+ data: null
30
+ // over: false
31
+ // back: null
32
+ }
33
+ },
34
+
35
+ mounted() {
36
+ // this.$bus.$on('toggle-widget', () => {
37
+ // this.over = true
38
+ // })
39
+ // this.$bus.$on('close-widget', () => {
40
+ // this.over = false
41
+ // })
42
+ },
43
+ created() {},
44
+ methods: {
45
+ // overlayClose() {
46
+ // this.$bus.$emit('close-widget')
47
+ // }
48
+ }
49
+ }
50
+ </script>
51
+
52
+ <style lang="scss" scoped>
53
+ .module-wrapper {
54
+ width: 100%;
55
+ height: 100%;
56
+ min-height: 100vh;
57
+ padding: 0 145px;
58
+ }
59
+ .overlay-close-widget {
60
+ position: absolute;
61
+ top: 0;
62
+ left: 0;
63
+ width: 100%;
64
+ height: 100%;
65
+ z-index: 2;
66
+ display: none;
67
+
68
+ &.blockOverlay {
69
+ display: block;
70
+ }
71
+ }
72
+ </style>
@@ -1,206 +1,206 @@
1
- //This composable sould Extend the functionality of a the quiz
2
-
3
- import i18n from '@/i18n' //Must import directly the local from project app because vue-18in does not work in legacy mode with composable
4
-
5
- export function useQuiz(quiz) {
6
- const { quizType, solution, showSolution, quizInputType } = quiz
7
- const { t } = i18n.global
8
-
9
- // /**
10
- // * @param {String} inputId
11
- // * @returns {Array} the class
12
- // */
13
- function classInput(inputId, optSelected = null) {
14
- let theClass = []
15
-
16
- switch (true) {
17
- case ['choix_unique', 'reponse_ouverte'].includes(quizType.value):
18
- if (inputId == quizInputType.value) {
19
- theClass.push('reponseSelectionner')
20
- }
21
- break
22
-
23
- case quizType.value == 'choix_mult':
24
- if (containsValue(quizInputType.value, inputId)) {
25
- theClass.push('reponseSelectionner')
26
- }
27
- }
28
-
29
- if (showSolution.value) {
30
- if (solution.value !== null) {
31
- switch (true) {
32
- case ['choix_unique', 'reponse_ouverte'].includes(quizType.value):
33
- if (inputId == solution.value) {
34
- theClass.push('correct_answer')
35
- } else {
36
- theClass.push('wrong_answer')
37
- }
38
- break
39
-
40
- case quizType.value == 'choix_mult':
41
- if (containsValue(solution.value, inputId)) {
42
- theClass.push('correct_answer')
43
- } else {
44
- theClass.push('wrong_answer')
45
- }
46
- break
47
- case quizType.value == 'dropdown':
48
- if (!optSelected || !optSelected[inputId]) return
49
- if (solution.value[inputId] == optSelected[inputId]) {
50
- theClass.push('correct_answer')
51
- } else {
52
- theClass.push('wrong_answer')
53
- }
54
- break
55
-
56
- case quizType.value == 'texte_troue_select':
57
- if (typeof optSelected[inputId] !== 'undefined') {
58
- if (
59
- Object.values(solution.value[inputId])[0] ==
60
- optSelected[inputId]
61
- ) {
62
- theClass.push('correct_answer')
63
- } else {
64
- theClass.push('wrong_answer')
65
- }
66
- }
67
- break
68
-
69
- case quizType.value == 'texte_tableau':
70
- if (
71
- containsValue(
72
- solution.value[inputId].reponse_value,
73
- optSelected[inputId]
74
- )
75
- ) {
76
- theClass.push('correct_answer')
77
- } else {
78
- theClass.push('wrong_answer')
79
- }
80
- break
81
- case quizType.value == 'texte_troue':
82
- if (typeof optSelected[inputId] !== 'undefined') {
83
- if (
84
- containsValue(
85
- Object.values(solution.value[inputId])[0],
86
- optSelected[inputId]
87
- )
88
- ) {
89
- theClass.push('correct_answer')
90
- } else {
91
- theClass.push('wrong_answer')
92
- }
93
- }
94
- break
95
- }
96
- }
97
- }
98
- return theClass
99
- }
100
-
101
- function messageAccessibility(inputId, optSelected = null) {
102
- let mess = ''
103
- if (showSolution.value) {
104
- if (solution.value !== null) {
105
- switch (true) {
106
- case ['choix_unique', 'reponse_ouverte'].includes(quizType.value):
107
- if (inputId == solution.value) {
108
- mess = `${t('quizState.goodAnswer')}`
109
- } else {
110
- mess = `${t('quizState.badAnswer')}`
111
- }
112
- break
113
-
114
- case quizType.value == 'choix_mult':
115
- if (containsValue(solution.value, inputId)) {
116
- mess = `${t('quizState.goodAnswer')}`
117
- } else {
118
- mess = `${t('quizState.badAnswer')}`
119
- }
120
- break
121
- case quizType.value == 'dropdown':
122
- if (solution[inputId.value] == optSelected[inputId.value]) {
123
- mess = `${t('quizState.goodAnswer')}`
124
- } else {
125
- mess = `${t('quizState.badAnswer')}`
126
- }
127
- break
128
-
129
- case quizType.value == 'texte_troue_select':
130
- if (typeof optSelected[inputId] !== 'undefined') {
131
- if (
132
- Object.values(solution.value[inputId])[0] ==
133
- optSelected[inputId]
134
- ) {
135
- mess = `${t('quizState.goodAnswer')}`
136
- } else {
137
- mess = `${t('quizState.badAnswer')}`
138
- }
139
- }
140
- break
141
-
142
- case quizType.value == 'texte_tableau':
143
- if (
144
- containsValue(
145
- solution.value[inputId].reponse_value,
146
- optSelected[inputId]
147
- )
148
- ) {
149
- mess = `${t('quizState.goodAnswer')}`
150
- } else {
151
- mess = `${t('quizState.badAnswer')}`
152
- }
153
- break
154
- case quizType.value == 'texte_troue':
155
- if (typeof optSelected[inputId] !== 'undefined') {
156
- if (
157
- containsValue(
158
- Object.values(solution.value[inputId])[0],
159
- optSelected[inputId]
160
- )
161
- ) {
162
- mess = `${t('quizState.goodAnswer')}`
163
- } else {
164
- mess = `${t('quizState.badAnswer')}`
165
- }
166
- }
167
- break
168
- }
169
- }
170
- }
171
- return mess
172
- }
173
-
174
- /**
175
- * @description check if a values exists in a array
176
- * @param {Array} array
177
- * @param value
178
- * @returns {Boolean}
179
- */
180
- function containsValue(array, value) {
181
- return array.includes(value)
182
- }
183
-
184
- /**
185
- * @description shuffles an array used to randomized the option order if shuffleAnswers is true
186
- * @param {Array} array
187
- * @returns {Array}
188
- */
189
- function shuffleArray(array) {
190
- let newArray = []
191
- let newArray2 = []
192
-
193
- for (let i = 0; i < array.length; i++) {
194
- const element = array[i]
195
- newArray.push(element)
196
- }
197
- while (newArray.length > 0) {
198
- let pos = Math.floor(newArray.length * Math.random())
199
- newArray2.push(newArray[pos])
200
- newArray.splice(pos, 1)
201
- }
202
- return newArray2
203
- }
204
-
205
- return { containsValue, shuffleArray, classInput, messageAccessibility }
206
- }
1
+ //This composable sould Extend the functionality of a the quiz
2
+
3
+ import i18n from '@/i18n' //Must import directly the local from project app because vue-18in does not work in legacy mode with composable
4
+
5
+ export function useQuiz(quiz) {
6
+ const { quizType, solution, showSolution, quizInputType } = quiz
7
+ const { t } = i18n.global
8
+
9
+ // /**
10
+ // * @param {String} inputId
11
+ // * @returns {Array} the class
12
+ // */
13
+ function classInput(inputId, optSelected = null) {
14
+ let theClass = []
15
+
16
+ switch (true) {
17
+ case ['choix_unique', 'reponse_ouverte'].includes(quizType.value):
18
+ if (inputId == quizInputType.value) {
19
+ theClass.push('reponseSelectionner')
20
+ }
21
+ break
22
+
23
+ case quizType.value == 'choix_mult':
24
+ if (containsValue(quizInputType.value, inputId)) {
25
+ theClass.push('reponseSelectionner')
26
+ }
27
+ }
28
+
29
+ if (showSolution.value) {
30
+ if (solution.value !== null) {
31
+ switch (true) {
32
+ case ['choix_unique', 'reponse_ouverte'].includes(quizType.value):
33
+ if (inputId == solution.value) {
34
+ theClass.push('correct_answer')
35
+ } else {
36
+ theClass.push('wrong_answer')
37
+ }
38
+ break
39
+
40
+ case quizType.value == 'choix_mult':
41
+ if (containsValue(solution.value, inputId)) {
42
+ theClass.push('correct_answer')
43
+ } else {
44
+ theClass.push('wrong_answer')
45
+ }
46
+ break
47
+ case quizType.value == 'dropdown':
48
+ if (!optSelected || !optSelected[inputId]) return
49
+ if (solution.value[inputId] == optSelected[inputId]) {
50
+ theClass.push('correct_answer')
51
+ } else {
52
+ theClass.push('wrong_answer')
53
+ }
54
+ break
55
+
56
+ case quizType.value == 'texte_troue_select':
57
+ if (typeof optSelected[inputId] !== 'undefined') {
58
+ if (
59
+ Object.values(solution.value[inputId])[0] ==
60
+ optSelected[inputId]
61
+ ) {
62
+ theClass.push('correct_answer')
63
+ } else {
64
+ theClass.push('wrong_answer')
65
+ }
66
+ }
67
+ break
68
+
69
+ case quizType.value == 'texte_tableau':
70
+ if (
71
+ containsValue(
72
+ solution.value[inputId].reponse_value,
73
+ optSelected[inputId]
74
+ )
75
+ ) {
76
+ theClass.push('correct_answer')
77
+ } else {
78
+ theClass.push('wrong_answer')
79
+ }
80
+ break
81
+ case quizType.value == 'texte_troue':
82
+ if (typeof optSelected[inputId] !== 'undefined') {
83
+ if (
84
+ containsValue(
85
+ Object.values(solution.value[inputId])[0],
86
+ optSelected[inputId]
87
+ )
88
+ ) {
89
+ theClass.push('correct_answer')
90
+ } else {
91
+ theClass.push('wrong_answer')
92
+ }
93
+ }
94
+ break
95
+ }
96
+ }
97
+ }
98
+ return theClass
99
+ }
100
+
101
+ function messageAccessibility(inputId, optSelected = null) {
102
+ let mess = ''
103
+ if (showSolution.value) {
104
+ if (solution.value !== null) {
105
+ switch (true) {
106
+ case ['choix_unique', 'reponse_ouverte'].includes(quizType.value):
107
+ if (inputId == solution.value) {
108
+ mess = `${t('quizState.goodAnswer')}`
109
+ } else {
110
+ mess = `${t('quizState.badAnswer')}`
111
+ }
112
+ break
113
+
114
+ case quizType.value == 'choix_mult':
115
+ if (containsValue(solution.value, inputId)) {
116
+ mess = `${t('quizState.goodAnswer')}`
117
+ } else {
118
+ mess = `${t('quizState.badAnswer')}`
119
+ }
120
+ break
121
+ case quizType.value == 'dropdown':
122
+ if (solution[inputId.value] == optSelected[inputId.value]) {
123
+ mess = `${t('quizState.goodAnswer')}`
124
+ } else {
125
+ mess = `${t('quizState.badAnswer')}`
126
+ }
127
+ break
128
+
129
+ case quizType.value == 'texte_troue_select':
130
+ if (typeof optSelected[inputId] !== 'undefined') {
131
+ if (
132
+ Object.values(solution.value[inputId])[0] ==
133
+ optSelected[inputId]
134
+ ) {
135
+ mess = `${t('quizState.goodAnswer')}`
136
+ } else {
137
+ mess = `${t('quizState.badAnswer')}`
138
+ }
139
+ }
140
+ break
141
+
142
+ case quizType.value == 'texte_tableau':
143
+ if (
144
+ containsValue(
145
+ solution.value[inputId].reponse_value,
146
+ optSelected[inputId]
147
+ )
148
+ ) {
149
+ mess = `${t('quizState.goodAnswer')}`
150
+ } else {
151
+ mess = `${t('quizState.badAnswer')}`
152
+ }
153
+ break
154
+ case quizType.value == 'texte_troue':
155
+ if (typeof optSelected[inputId] !== 'undefined') {
156
+ if (
157
+ containsValue(
158
+ Object.values(solution.value[inputId])[0],
159
+ optSelected[inputId]
160
+ )
161
+ ) {
162
+ mess = `${t('quizState.goodAnswer')}`
163
+ } else {
164
+ mess = `${t('quizState.badAnswer')}`
165
+ }
166
+ }
167
+ break
168
+ }
169
+ }
170
+ }
171
+ return mess
172
+ }
173
+
174
+ /**
175
+ * @description check if a values exists in a array
176
+ * @param {Array} array
177
+ * @param value
178
+ * @returns {Boolean}
179
+ */
180
+ function containsValue(array, value) {
181
+ return array.includes(value)
182
+ }
183
+
184
+ /**
185
+ * @description shuffles an array used to randomized the option order if shuffleAnswers is true
186
+ * @param {Array} array
187
+ * @returns {Array}
188
+ */
189
+ function shuffleArray(array) {
190
+ let newArray = []
191
+ let newArray2 = []
192
+
193
+ for (let i = 0; i < array.length; i++) {
194
+ const element = array[i]
195
+ newArray.push(element)
196
+ }
197
+ while (newArray.length > 0) {
198
+ let pos = Math.floor(newArray.length * Math.random())
199
+ newArray2.push(newArray[pos])
200
+ newArray.splice(pos, 1)
201
+ }
202
+ return newArray2
203
+ }
204
+
205
+ return { containsValue, shuffleArray, classInput, messageAccessibility }
206
+ }
@@ -1,22 +1,22 @@
1
- <template>
2
- <app-base-module :module-config="$data" />
3
- </template>
4
-
5
- <script>
6
- export default {
7
- data() {
8
- return {
9
- id: 'module_99',
10
- consigneBehavior: 'onHover', //Controle the behavior of desplaying instruction
11
- bookmarkActive: true, // Controle the use of saved point
12
- allowNavigationToActivity: null
13
-
14
- //main:''// Edit to define the ID of the node that will be main. When skipping to main content in the page.
15
- }
16
- },
17
- created() {
18
- this.allowNavigationToActivity =
19
- this.$helper.getSettingsFromStore('auto_next_activity')
20
- }
21
- }
22
- </script>
1
+ <template>
2
+ <app-base-module :module-config="$data" />
3
+ </template>
4
+
5
+ <script>
6
+ export default {
7
+ data() {
8
+ return {
9
+ id: 'module_99',
10
+ consigneBehavior: 'onHover', //Controle the behavior of desplaying instruction
11
+ bookmarkActive: true, // Controle the use of saved point
12
+ allowNavigationToActivity: null
13
+
14
+ //main:''// Edit to define the ID of the node that will be main. When skipping to main content in the page.
15
+ }
16
+ },
17
+ created() {
18
+ this.allowNavigationToActivity =
19
+ this.$helper.getSettingsFromStore('auto_next_activity')
20
+ }
21
+ }
22
+ </script>