fcad-core-dragon 2.0.0-beta.9 → 2.0.1-beta.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 (64) hide show
  1. package/.editorconfig +33 -33
  2. package/.eslintignore +29 -29
  3. package/.eslintrc.cjs +81 -81
  4. package/CHANGELOG +11 -0
  5. package/README.md +57 -72
  6. package/bk.scss +117 -117
  7. package/package.json +1 -1
  8. package/src/assets/data/onboardingMessages.json +47 -47
  9. package/src/components/AppBase.vue +130 -3
  10. package/src/components/AppBaseErrorDisplay.vue +438 -438
  11. package/src/components/AppBaseFlipCard.vue +84 -84
  12. package/src/components/AppBaseModule.vue +15 -18
  13. package/src/components/AppBasePopover.vue +41 -41
  14. package/src/components/AppCompBranchButtons.vue +5 -5
  15. package/src/components/AppCompInputDropdownNext.vue +1 -1
  16. package/src/components/AppCompInputRadioNext.vue +152 -152
  17. package/src/components/AppCompInputTextToFillNext.vue +171 -171
  18. package/src/components/AppCompJauge.vue +74 -74
  19. package/src/components/AppCompMenuItem.vue +238 -228
  20. package/src/components/AppCompPlayBarProgress.vue +82 -82
  21. package/src/components/AppCompSettingsMenu.vue +172 -172
  22. package/src/components/AppCompTableOfContent.vue +2 -0
  23. package/src/components/AppCompViewDisplay.vue +6 -6
  24. package/src/composables/useQuiz.js +206 -206
  25. package/src/externalComps/ModuleView.vue +22 -22
  26. package/src/externalComps/SummaryView.vue +91 -91
  27. package/src/mixins/$mediaMixins.js +819 -819
  28. package/src/mixins/timerMixin.js +195 -155
  29. package/src/module/stores/appStore.js +3 -3
  30. package/src/module/xapi/ADL.js +0 -1
  31. package/src/module/xapi/Crypto/Hasher.js +241 -241
  32. package/src/module/xapi/Crypto/WordArray.js +278 -278
  33. package/src/module/xapi/Crypto/algorithms/BufferedBlockAlgorithm.js +103 -103
  34. package/src/module/xapi/Crypto/algorithms/C_algo.js +315 -315
  35. package/src/module/xapi/Crypto/algorithms/HMAC.js +9 -9
  36. package/src/module/xapi/Crypto/algorithms/SHA1.js +9 -9
  37. package/src/module/xapi/Crypto/encoders/Base.js +105 -105
  38. package/src/module/xapi/Crypto/encoders/Base64.js +99 -99
  39. package/src/module/xapi/Crypto/encoders/Hex.js +61 -61
  40. package/src/module/xapi/Crypto/encoders/Latin1.js +61 -61
  41. package/src/module/xapi/Crypto/encoders/Utf8.js +45 -45
  42. package/src/module/xapi/Crypto/index.js +53 -53
  43. package/src/module/xapi/Statement/activity.js +47 -47
  44. package/src/module/xapi/Statement/agent.js +55 -55
  45. package/src/module/xapi/Statement/group.js +26 -26
  46. package/src/module/xapi/Statement/index.js +259 -259
  47. package/src/module/xapi/Statement/statement.js +253 -253
  48. package/src/module/xapi/Statement/statementRef.js +23 -23
  49. package/src/module/xapi/Statement/substatement.js +22 -22
  50. package/src/module/xapi/Statement/verb.js +36 -36
  51. package/src/module/xapi/activitytypes.js +17 -17
  52. package/src/module/xapi/utils.js +167 -167
  53. package/src/module/xapi/verbs.js +294 -294
  54. package/src/module/xapi/wrapper.js +0 -1
  55. package/src/module/xapi/xapiStatement.js +444 -444
  56. package/src/plugins/bus.js +8 -8
  57. package/src/plugins/gsap.js +14 -14
  58. package/src/plugins/i18n.js +44 -44
  59. package/src/plugins/save.js +37 -37
  60. package/src/plugins/scorm.js +287 -287
  61. package/src/plugins/xapi.js +11 -11
  62. package/src/public/index.html +33 -33
  63. package/src/router/index.js +5 -0
  64. package/src/shared/generalfuncs.js +210 -210
@@ -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> -->