fcad-core-dragon 2.0.0-beta.5 → 2.0.0-beta.7

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 +33 -33
  2. package/.eslintignore +29 -29
  3. package/.eslintrc.cjs +81 -81
  4. package/CHANGELOG +395 -377
  5. package/README.md +71 -71
  6. package/bk.scss +117 -117
  7. package/package.json +61 -61
  8. package/src/$locales/en.json +23 -25
  9. package/src/$locales/fr.json +22 -23
  10. package/src/assets/data/onboardingMessages.json +47 -47
  11. package/src/components/AppBase.vue +166 -99
  12. package/src/components/AppBaseButton.vue +2 -0
  13. package/src/components/AppBaseErrorDisplay.vue +438 -438
  14. package/src/components/AppBaseFlipCard.vue +84 -84
  15. package/src/components/AppBaseModule.vue +124 -106
  16. package/src/components/AppBasePage.vue +14 -4
  17. package/src/components/AppBasePopover.vue +41 -41
  18. package/src/components/AppCompAudio.vue +20 -48
  19. package/src/components/AppCompBranchButtons.vue +7 -53
  20. package/src/components/{AppCompTranscript.vue → AppCompContainer.vue} +8 -1
  21. package/src/components/AppCompInputRadioNext.vue +152 -152
  22. package/src/components/AppCompInputTextToFillNext.vue +171 -171
  23. package/src/components/AppCompJauge.vue +74 -74
  24. package/src/components/AppCompMenu.vue +429 -428
  25. package/src/components/AppCompMenuItem.vue +228 -228
  26. package/src/components/AppCompNavigation.vue +2 -2
  27. package/src/components/AppCompPlayBarNext.vue +5 -0
  28. package/src/components/AppCompPlayBarProgress.vue +82 -82
  29. package/src/components/AppCompSVGNext.vue +2 -3
  30. package/src/components/AppCompSettingsMenu.vue +172 -172
  31. package/src/components/AppCompVideoPlayer.vue +17 -15
  32. package/src/composables/useQuiz.js +206 -206
  33. package/src/externalComps/ModuleView.vue +22 -22
  34. package/src/externalComps/SummaryView.vue +91 -91
  35. package/src/main.js +34 -29
  36. package/src/mixins/$mediaMixins.js +819 -819
  37. package/src/mixins/timerMixin.js +155 -155
  38. package/src/module/stores/appStore.js +1 -1
  39. package/src/module/xapi/ADL.js +144 -4
  40. package/src/module/xapi/Crypto/Hasher.js +241 -241
  41. package/src/module/xapi/Crypto/WordArray.js +278 -278
  42. package/src/module/xapi/Crypto/algorithms/BufferedBlockAlgorithm.js +103 -103
  43. package/src/module/xapi/Crypto/algorithms/C_algo.js +315 -315
  44. package/src/module/xapi/Crypto/algorithms/HMAC.js +9 -9
  45. package/src/module/xapi/Crypto/algorithms/SHA1.js +9 -9
  46. package/src/module/xapi/Crypto/encoders/Base.js +105 -105
  47. package/src/module/xapi/Crypto/encoders/Base64.js +99 -99
  48. package/src/module/xapi/Crypto/encoders/Hex.js +61 -61
  49. package/src/module/xapi/Crypto/encoders/Latin1.js +61 -61
  50. package/src/module/xapi/Crypto/encoders/Utf8.js +45 -45
  51. package/src/module/xapi/Statement/agent.js +55 -55
  52. package/src/module/xapi/Statement/index.js +259 -259
  53. package/src/module/xapi/Statement/statement.js +253 -253
  54. package/src/module/xapi/utils.js +167 -167
  55. package/src/module/xapi/verbs.js +294 -294
  56. package/src/module/xapi/wrapper copy.js +1963 -0
  57. package/src/module/xapi/wrapper.js +121 -188
  58. package/src/module/xapi/xapiStatement.js +444 -444
  59. package/src/plugins/bus.js +8 -8
  60. package/src/plugins/gsap.js +14 -14
  61. package/src/plugins/helper.js +0 -1
  62. package/src/plugins/i18n.js +44 -44
  63. package/src/plugins/save.js +37 -37
  64. package/src/plugins/scorm.js +287 -287
  65. package/src/plugins/xapi.js +11 -11
  66. package/src/public/index.html +33 -33
  67. package/src/router/index.js +2 -1
  68. package/src/shared/generalfuncs.js +210 -210
  69. package/src/shared/validators.js +2 -0
  70. package/src/components/AppCompPlayBar.vue +0 -1217
@@ -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>
@@ -1,91 +1,91 @@
1
- <template>
2
- <div>
3
- <app-comp-menu></app-comp-menu>
4
- <!-- <h6>normal</h6>
5
- <div class="t normal"></div>
6
- <h6>red</h6>
7
- <div class="t red"></div>
8
- <h6>green</h6>
9
- <div class="t green"></div>
10
- <h6>hue</h6>
11
- <div class="t hue"></div>
12
- <h6>Saturation</h6>
13
- <div class="t saturation"></div>
14
- <h6>desaturation</h6>
15
- <div class="t desaturation"></div>
16
- <h6>lighteness</h6>
17
- <div class="t lighteness"></div>
18
- <h6>darkness</h6>
19
- <div class="t darkness"></div>
20
- <h6>whiteness</h6>
21
- <div class="t whiteness"></div>
22
- <h6>blackness</h6>
23
- <div class="t blackness"></div> -->
24
- </div>
25
- </template>
26
-
27
- <script>
28
- export default {
29
- data() {
30
- return {}
31
- }
32
- }
33
- </script>
34
- <!-- <style lang="scss">
35
- @use 'sass:color';
36
- $color: #f11532;
37
- $color-red: color.change($color, $red: 155);
38
- $color-green: color.change($color, $green: 255);
39
- $color-hue: adjust-hue($color, -30deg);
40
- $color-saturation: color.scale($color, $saturation: 100%);
41
- $color-desaturate: color.scale($color, $saturation: -50%);
42
- $color-lighteness: color.scale($color, $lightness: 50%);
43
- $color-darkness: color.scale($color, $lightness: -50%);
44
- $color-whiteness: color.scale($color, $whiteness: 50%);
45
- $color-blackness: color.scale($color, $blackness: 50%);
46
-
47
- .t {
48
- width: 50px;
49
- height: 50px;
50
-
51
- &.normal {
52
- background: $color;
53
- }
54
-
55
- &.red {
56
- background: $color-red;
57
- }
58
-
59
- &.green {
60
- background: $color-green;
61
- }
62
-
63
- &.hue {
64
- background: $color-hue;
65
- }
66
-
67
- &.saturation {
68
- background: $color-saturation;
69
- }
70
-
71
- &.desaturation {
72
- background: $color-desaturate;
73
- }
74
-
75
- &.lighteness {
76
- background: $color-lighteness;
77
- }
78
-
79
- &.darkness {
80
- background: $color-darkness;
81
- }
82
-
83
- &.whiteness {
84
- background: $color-whiteness;
85
- }
86
-
87
- &.blackness {
88
- background: $color-blackness;
89
- }
90
- }
91
- </style> -->
1
+ <template>
2
+ <div>
3
+ <app-comp-menu></app-comp-menu>
4
+ <!-- <h6>normal</h6>
5
+ <div class="t normal"></div>
6
+ <h6>red</h6>
7
+ <div class="t red"></div>
8
+ <h6>green</h6>
9
+ <div class="t green"></div>
10
+ <h6>hue</h6>
11
+ <div class="t hue"></div>
12
+ <h6>Saturation</h6>
13
+ <div class="t saturation"></div>
14
+ <h6>desaturation</h6>
15
+ <div class="t desaturation"></div>
16
+ <h6>lighteness</h6>
17
+ <div class="t lighteness"></div>
18
+ <h6>darkness</h6>
19
+ <div class="t darkness"></div>
20
+ <h6>whiteness</h6>
21
+ <div class="t whiteness"></div>
22
+ <h6>blackness</h6>
23
+ <div class="t blackness"></div> -->
24
+ </div>
25
+ </template>
26
+
27
+ <script>
28
+ export default {
29
+ data() {
30
+ return {}
31
+ }
32
+ }
33
+ </script>
34
+ <!-- <style lang="scss">
35
+ @use 'sass:color';
36
+ $color: #f11532;
37
+ $color-red: color.change($color, $red: 155);
38
+ $color-green: color.change($color, $green: 255);
39
+ $color-hue: adjust-hue($color, -30deg);
40
+ $color-saturation: color.scale($color, $saturation: 100%);
41
+ $color-desaturate: color.scale($color, $saturation: -50%);
42
+ $color-lighteness: color.scale($color, $lightness: 50%);
43
+ $color-darkness: color.scale($color, $lightness: -50%);
44
+ $color-whiteness: color.scale($color, $whiteness: 50%);
45
+ $color-blackness: color.scale($color, $blackness: 50%);
46
+
47
+ .t {
48
+ width: 50px;
49
+ height: 50px;
50
+
51
+ &.normal {
52
+ background: $color;
53
+ }
54
+
55
+ &.red {
56
+ background: $color-red;
57
+ }
58
+
59
+ &.green {
60
+ background: $color-green;
61
+ }
62
+
63
+ &.hue {
64
+ background: $color-hue;
65
+ }
66
+
67
+ &.saturation {
68
+ background: $color-saturation;
69
+ }
70
+
71
+ &.desaturation {
72
+ background: $color-desaturate;
73
+ }
74
+
75
+ &.lighteness {
76
+ background: $color-lighteness;
77
+ }
78
+
79
+ &.darkness {
80
+ background: $color-darkness;
81
+ }
82
+
83
+ &.whiteness {
84
+ background: $color-whiteness;
85
+ }
86
+
87
+ &.blackness {
88
+ background: $color-blackness;
89
+ }
90
+ }
91
+ </style> -->