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

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 (90) hide show
  1. package/.editorconfig +33 -33
  2. package/.eslintignore +29 -29
  3. package/.eslintrc.cjs +81 -81
  4. package/CHANGELOG +13 -0
  5. package/README.md +71 -71
  6. package/bk.scss +117 -117
  7. package/package.json +8 -8
  8. package/src/$locales/en.json +145 -143
  9. package/src/$locales/fr.json +107 -105
  10. package/src/assets/data/onboardingMessages.json +47 -47
  11. package/src/components/AppBase.vue +1150 -1054
  12. package/src/components/AppBaseButton.test.js +22 -0
  13. package/src/components/AppBaseButton.vue +93 -87
  14. package/src/components/AppBaseErrorDisplay.vue +438 -438
  15. package/src/components/AppBaseFlipCard.vue +84 -84
  16. package/src/components/AppBaseModule.vue +1657 -1673
  17. package/src/components/AppBasePage.vue +742 -779
  18. package/src/components/AppBasePopover.vue +41 -41
  19. package/src/components/AppCompAudio.vue +265 -234
  20. package/src/components/AppCompBranchButtons.vue +556 -552
  21. package/src/components/AppCompButtonProgress.vue +121 -126
  22. package/src/components/AppCompCarousel.vue +328 -298
  23. package/src/components/AppCompInputCheckBoxNext.vue +200 -195
  24. package/src/components/AppCompInputDropdownNext.vue +201 -159
  25. package/src/components/AppCompInputRadioNext.vue +152 -152
  26. package/src/components/AppCompInputTextNext.vue +125 -106
  27. package/src/components/AppCompInputTextTableNext.vue +142 -141
  28. package/src/components/AppCompInputTextToFillDropdownNext.vue +238 -230
  29. package/src/components/AppCompInputTextToFillNext.vue +171 -171
  30. package/src/components/AppCompJauge.vue +74 -74
  31. package/src/components/AppCompMenu.vue +25 -10
  32. package/src/components/AppCompMenuItem.vue +228 -228
  33. package/src/components/AppCompNavigation.vue +972 -960
  34. package/src/components/AppCompNoteCall.vue +159 -133
  35. package/src/components/AppCompNoteCredit.vue +490 -292
  36. package/src/components/AppCompPlayBar.vue +1217 -1218
  37. package/src/components/AppCompPlayBarNext.vue +2060 -2052
  38. package/src/components/AppCompPlayBarProgress.vue +82 -82
  39. package/src/components/AppCompPopUpNext.vue +500 -503
  40. package/src/components/AppCompQuizNext.vue +2908 -2904
  41. package/src/components/AppCompQuizRecall.vue +298 -276
  42. package/src/components/AppCompSVGNext.vue +347 -347
  43. package/src/components/AppCompSettingsMenu.vue +172 -172
  44. package/src/components/AppCompTableOfContent.vue +386 -387
  45. package/src/components/AppCompTranscript.vue +24 -24
  46. package/src/components/AppCompVideoPlayer.vue +368 -368
  47. package/src/components/BaseModule.vue +55 -72
  48. package/src/components/tests__/AppBaseButton.spec.js +53 -0
  49. package/src/composables/useQuiz.js +206 -206
  50. package/src/externalComps/ModuleView.vue +22 -22
  51. package/src/externalComps/SummaryView.vue +91 -91
  52. package/src/main.js +272 -272
  53. package/src/mixins/$mediaMixins.js +819 -819
  54. package/src/mixins/timerMixin.js +155 -155
  55. package/src/module/stores/appStore.js +954 -893
  56. package/src/module/xapi/ADL.js +380 -376
  57. package/src/module/xapi/Crypto/Hasher.js +241 -241
  58. package/src/module/xapi/Crypto/WordArray.js +278 -278
  59. package/src/module/xapi/Crypto/algorithms/BufferedBlockAlgorithm.js +103 -103
  60. package/src/module/xapi/Crypto/algorithms/C_algo.js +315 -315
  61. package/src/module/xapi/Crypto/algorithms/HMAC.js +9 -9
  62. package/src/module/xapi/Crypto/algorithms/SHA1.js +9 -9
  63. package/src/module/xapi/Crypto/encoders/Base.js +105 -105
  64. package/src/module/xapi/Crypto/encoders/Base64.js +99 -99
  65. package/src/module/xapi/Crypto/encoders/Hex.js +61 -61
  66. package/src/module/xapi/Crypto/encoders/Latin1.js +61 -61
  67. package/src/module/xapi/Crypto/encoders/Utf8.js +45 -45
  68. package/src/module/xapi/Statement/agent.js +55 -55
  69. package/src/module/xapi/Statement/index.js +259 -259
  70. package/src/module/xapi/Statement/statement.js +253 -253
  71. package/src/module/xapi/launch.js +157 -157
  72. package/src/module/xapi/utils.js +167 -167
  73. package/src/module/xapi/verbs.js +294 -294
  74. package/src/module/xapi/wrapper.js +1963 -1963
  75. package/src/module/xapi/xapiStatement.js +444 -444
  76. package/src/plugins/bus.js +8 -8
  77. package/src/plugins/gsap.js +14 -14
  78. package/src/plugins/helper.js +355 -308
  79. package/src/plugins/i18n.js +44 -44
  80. package/src/plugins/idb.js +227 -219
  81. package/src/plugins/save.js +37 -37
  82. package/src/plugins/scorm.js +287 -287
  83. package/src/plugins/xapi.js +11 -11
  84. package/src/public/index.html +33 -33
  85. package/src/router/index.js +48 -43
  86. package/src/router/routes.js +312 -312
  87. package/src/shared/generalfuncs.js +210 -210
  88. package/src/shared/validators.js +926 -1069
  89. package/vitest.config.js +19 -0
  90. package/vite.config.js +0 -27
@@ -1,230 +1,238 @@
1
- <!-- About this Component--
2
- * Renders a Series of inputs to collect input for the Quiz component.
3
- * Related Quiz to question: TEXTE_TROUE_SELECT
4
- * Receives the a data object defined by user
5
- * Used by AppCompQuizNext
6
- * Uses useQuiz composable
7
- -->
8
- <template>
9
- <div class="input-box">
10
- <div
11
- v-for="singleDropdown in theInputData"
12
- :key="singleDropdown.id"
13
- class="texteatrou"
14
- >
15
- <span v-if="!singleDropdown.type" v-html="singleDropdown.content"></span>
16
- <label
17
- :for="`${inputDataId}_${singleDropdown.id}-champ`"
18
- style="display: none"
19
- >
20
- {{ $t('text.quiz') }}
21
- </label>
22
- <div
23
- class="cnt-input"
24
- :class="classInput(singleDropdown.id, quizInputTypeValue)"
25
- >
26
- <v-select
27
- v-if="singleDropdown.type == 'dropdown'"
28
- :id="`${inputDataId}_${singleDropdown.id}-champ`"
29
- v-model="quizInputTypeValue[singleDropdown.id]"
30
- item-title="text"
31
- class="dropdown"
32
- :items="singleDropdown.option"
33
- :disabled="quizLimitActive"
34
- :aria-describedby="`${inputDataId}_${singleDropdown.id}-msg-erreur`"
35
- />
36
- </div>
37
-
38
- <span
39
- v-if="showSolution"
40
- :id="`${inputDataId}_${singleDropdown.id}-msg-erreur`"
41
- class="sr-only"
42
- >
43
- {{ messageAccessibility(singleDropdown.id, quizInputTypeValue) }}
44
- </span>
45
- </div>
46
- </div>
47
- </template>
48
- <script>
49
- import { useQuiz } from '../composables/useQuiz'
50
- import { toRefs } from 'vue'
51
- export default {
52
- name: 'AppCompInputTextToFillDropdownNext',
53
-
54
- props: {
55
- quizType: {
56
- type: String,
57
- default: ''
58
- },
59
- inputDataId: {
60
- type: String,
61
- default: ''
62
- },
63
- inputData: {
64
- type: Array,
65
- default: () => []
66
- },
67
- inputType: {
68
- type: String,
69
- default: ''
70
- },
71
- textBase: {
72
- type: String,
73
- default: ''
74
- },
75
- quizInputType: {
76
- type: Array,
77
- default: () => []
78
- },
79
-
80
- solution: {
81
- type: Array,
82
- default: () => []
83
- },
84
- showSolution: {
85
- type: Boolean,
86
- default: false
87
- },
88
- quizLimitActive: {
89
- type: Boolean,
90
- default: false
91
- }, //use to set if quiz should be active or not
92
- shuffleAnswers: {
93
- type: Boolean,
94
- default: false
95
- },
96
- quizSubmit: {
97
- type: Boolean,
98
- default: false
99
- } //use to call a submit
100
- },
101
- emits: ['input-change'],
102
- setup(props) {
103
- const { shuffleArray, classInput, messageAccessibility } = useQuiz(
104
- toRefs(props)
105
- )
106
- return { shuffleArray, classInput, messageAccessibility }
107
- },
108
- data() {
109
- return {
110
- quizInputTypeValue: [], //not using quizInputType because quizInputType is a prop
111
- theInputData: [], //to create the list of drop down and text mixed togeter
112
- quizSolution: null
113
- }
114
- },
115
-
116
- watch: {
117
- /**
118
- * @description to pass value to AppCompQuiz
119
- * @fires input-change to AppCompQuiz.vue
120
- */
121
- quizInputTypeValue: {
122
- deep: true,
123
- handler(newValue) {
124
- this.$emit('input-change', newValue)
125
- }
126
- }
127
- },
128
-
129
- mounted() {
130
- this.initQuiz()
131
- },
132
-
133
- methods: {
134
- /**
135
- * @description create the object to genate the text and inputs
136
- * @param {String} str the text with holes to fill
137
- */
138
- createTextWithInput(str) {
139
- const regex = /\$%\S*%\$/g // regex pattern to match exp: $%number%$
140
- let matchAll = str.split(regex)
141
- let listInput = []
142
- for (let i = 0; i < this.inputData.length; i++) {
143
- const element = this.inputData[i]
144
- listInput.push({ id: 't' + i, content: matchAll[i] })
145
- listInput.push({
146
- id: i,
147
- type: 'dropdown',
148
- option: Object.values(element)[0]
149
- })
150
- }
151
- let lastItem = matchAll.length - 1
152
- listInput.push({ id: 't' + lastItem, content: matchAll[lastItem] })
153
- this.theInputData = listInput
154
- },
155
- initQuiz() {
156
- this.quizSolution = this.solution
157
- if (this.quizSolution !== null) {
158
- this.quizSolution.sort(function (a, b) {
159
- return a - b
160
- })
161
- }
162
- //to show the defaultAnswer
163
- const defaultAnswer = {
164
- value: null,
165
- disabled: true,
166
- text: this.$t('message.first_option_dropdown')
167
- }
168
- let selectedChoices = []
169
- for (let i = 0; i < this.inputData.length; i++) {
170
- let singleDropdown = {}
171
- if (this.shuffleAnswers) {
172
- singleDropdown = this.inputData[i]
173
- singleDropdown[Object.keys(this.inputData[i])[0].toString()] =
174
- this.shuffleArray(Object.values(this.inputData[i])[0])
175
- } else {
176
- singleDropdown = this.inputData[i]
177
- }
178
- for (
179
- let index = 0;
180
- index < Object.values(singleDropdown)[0].length;
181
- index++
182
- ) {
183
- const element = Object.values(singleDropdown)[0][index]
184
- if (
185
- element.text &&
186
- element.text == this.$t('message.first_option_dropdown')
187
- ) {
188
- Object.values(singleDropdown)[0].splice(index, 1)
189
- }
190
- }
191
- Object.values(singleDropdown)[0].unshift(defaultAnswer)
192
-
193
- selectedChoices.push(null)
194
- }
195
- if (this.quizInputType.length == 0) {
196
- this.quizInputTypeValue = selectedChoices
197
- } else {
198
- this.quizInputTypeValue = this.quizInputType
199
- }
200
-
201
- this.createTextWithInput(this.textBase)
202
- }
203
- }
204
- }
205
- </script>
206
- <style lang="scss" scoped>
207
- select {
208
- &.custom-select {
209
- background-image: inherit;
210
-
211
- &:focus {
212
- border-color: inherit;
213
- box-shadow: inherit;
214
- }
215
- }
216
- }
217
-
218
- /***** style dev *****/
219
- .texteatrou {
220
- display: inline;
221
- }
222
- .texteatrou > select {
223
- display: inline;
224
- width: auto;
225
- }
226
-
227
- .cnt-input {
228
- position: relative;
229
- }
230
- </style>
1
+ <!-- About this Component--
2
+ * Renders a Series of inputs to collect input for the Quiz component.
3
+ * Related Quiz to question: TEXTE_TROUE_SELECT
4
+ * Receives the a data object defined by user
5
+ * Used by AppCompQuizNext
6
+ * Uses useQuiz composable
7
+ -->
8
+ <template>
9
+ <div class="input-box">
10
+ <div
11
+ v-for="singleDropdown in theInputData"
12
+ :key="singleDropdown.id"
13
+ class="texteatrou"
14
+ >
15
+ <span v-if="!singleDropdown.type" v-html="singleDropdown.content"></span>
16
+ <label
17
+ :for="`${inputDataId}_${singleDropdown.id}-champ`"
18
+ style="display: none"
19
+ >
20
+ {{ $t('text.quiz') }}
21
+ </label>
22
+ <div
23
+ class="cnt-input"
24
+ :class="classInput(singleDropdown.id, quizInputTypeValue)"
25
+ >
26
+ <v-select
27
+ v-if="singleDropdown.type == 'dropdown'"
28
+ :id="`${inputDataId}_${singleDropdown.id}-champ`"
29
+ v-model="quizInputTypeValue[singleDropdown.id]"
30
+ item-title="text"
31
+ class="dropdown"
32
+ :items="singleDropdown.option"
33
+ :item-props="true"
34
+ :disabled="quizLimitActive"
35
+ :aria-describedby="`${inputDataId}_${singleDropdown.id}-msg-erreur`"
36
+ :open-text="$t('message.dropdown_list')"
37
+ close-text=""
38
+ />
39
+ </div>
40
+
41
+ <span
42
+ v-if="showSolution"
43
+ :id="`${inputDataId}_${singleDropdown.id}-msg-erreur`"
44
+ class="sr-only"
45
+ >
46
+ {{ messageAccessibility(singleDropdown.id, quizInputTypeValue) }}
47
+ </span>
48
+ </div>
49
+ </div>
50
+ </template>
51
+ <script>
52
+ import { useQuiz } from '../composables/useQuiz'
53
+ import { toRefs } from 'vue'
54
+ export default {
55
+ name: 'AppCompInputTextToFillDropdownNext',
56
+
57
+ props: {
58
+ quizType: {
59
+ type: String,
60
+ default: ''
61
+ },
62
+ inputDataId: {
63
+ type: String,
64
+ default: ''
65
+ },
66
+ inputData: {
67
+ type: Array,
68
+ default: () => []
69
+ },
70
+ inputType: {
71
+ type: String,
72
+ default: ''
73
+ },
74
+ textBase: {
75
+ type: String,
76
+ default: ''
77
+ },
78
+ quizInputType: {
79
+ type: Array,
80
+ default: () => []
81
+ },
82
+
83
+ solution: {
84
+ type: Array,
85
+ default: () => []
86
+ },
87
+ showSolution: {
88
+ type: Boolean,
89
+ default: false
90
+ },
91
+ quizLimitActive: {
92
+ type: Boolean,
93
+ default: false
94
+ }, //use to set if quiz should be active or not
95
+ shuffleAnswers: {
96
+ type: Boolean,
97
+ default: false
98
+ },
99
+ quizSubmit: {
100
+ type: Boolean,
101
+ default: false
102
+ } //use to call a submit
103
+ },
104
+ emits: ['input-change'],
105
+ setup(props) {
106
+ const { shuffleArray, classInput, messageAccessibility } = useQuiz(
107
+ toRefs(props)
108
+ )
109
+ return { shuffleArray, classInput, messageAccessibility }
110
+ },
111
+ data() {
112
+ return {
113
+ quizInputTypeValue: [], //not using quizInputType because quizInputType is a prop
114
+ theInputData: [], //to create the list of drop down and text mixed togeter
115
+ quizSolution: null
116
+ }
117
+ },
118
+
119
+ watch: {
120
+ /**
121
+ * @description to pass value to AppCompQuiz
122
+ * @fires input-change to AppCompQuiz.vue
123
+ */
124
+ quizInputTypeValue: {
125
+ deep: true,
126
+ handler(newValue) {
127
+ this.$emit('input-change', newValue)
128
+ }
129
+ }
130
+ },
131
+
132
+ mounted() {
133
+ this.initQuiz()
134
+ },
135
+
136
+ methods: {
137
+ /**
138
+ * @description create the object to genate the text and inputs
139
+ * @param {String} str the text with holes to fill
140
+ */
141
+ createTextWithInput(str) {
142
+ const regex = /\$%\S*%\$/g // regex pattern to match exp: $%number%$
143
+ let matchAll = str.split(regex)
144
+ let listInput = []
145
+ for (let i = 0; i < this.inputData.length; i++) {
146
+ const element = this.inputData[i]
147
+ listInput.push({ id: 't' + i, content: matchAll[i] })
148
+ listInput.push({
149
+ id: i,
150
+ type: 'dropdown',
151
+ option: Object.values(element)[0]
152
+ })
153
+ }
154
+ let lastItem = matchAll.length - 1
155
+ listInput.push({ id: 't' + lastItem, content: matchAll[lastItem] })
156
+ this.theInputData = listInput
157
+ },
158
+ initQuiz() {
159
+ this.quizSolution = this.solution
160
+ if (this.quizSolution !== null) {
161
+ this.quizSolution.sort(function (a, b) {
162
+ return a - b
163
+ })
164
+ }
165
+ //to show the defaultAnswer
166
+ const defaultAnswer = {
167
+ value: null,
168
+ disabled: true,
169
+ selected: true,
170
+ text: this.$t('message.first_option_dropdown')
171
+ }
172
+ let selectedChoices = []
173
+
174
+ for (let i = 0; i < this.inputData.length; i++) {
175
+ let singleDropdown = {}
176
+ if (this.shuffleAnswers) {
177
+ singleDropdown = this.inputData[i]
178
+
179
+ singleDropdown[Object.keys(this.inputData[i])[0].toString()] =
180
+ this.shuffleArray(Object.values(this.inputData[i])[0])
181
+ } else {
182
+ // this.inputData[i].splice(0, 0, defaultAnswer)
183
+ singleDropdown = this.inputData[i]
184
+ }
185
+ for (
186
+ let index = 0;
187
+ index < Object.values(singleDropdown)[0].length;
188
+ index++
189
+ ) {
190
+ const element = Object.values(singleDropdown)[0][index]
191
+ if (
192
+ element.text &&
193
+ element.text == this.$t('message.first_option_dropdown')
194
+ ) {
195
+ Object.values(singleDropdown)[0].splice(index, 1)
196
+ }
197
+ }
198
+
199
+ Object.values(singleDropdown)[0].unshift(defaultAnswer)
200
+
201
+ selectedChoices.push(null)
202
+ }
203
+ if (this.quizInputType.length == 0) {
204
+ this.quizInputTypeValue = selectedChoices
205
+ } else {
206
+ this.quizInputTypeValue = this.quizInputType
207
+ }
208
+
209
+ this.createTextWithInput(this.textBase)
210
+ }
211
+ }
212
+ }
213
+ </script>
214
+ <style lang="scss" scoped>
215
+ select {
216
+ &.custom-select {
217
+ background-image: inherit;
218
+
219
+ &:focus {
220
+ border-color: inherit;
221
+ box-shadow: inherit;
222
+ }
223
+ }
224
+ }
225
+
226
+ /***** style dev *****/
227
+ .texteatrou {
228
+ display: inline;
229
+ }
230
+ .texteatrou > select {
231
+ display: inline;
232
+ width: auto;
233
+ }
234
+
235
+ .cnt-input {
236
+ position: relative;
237
+ }
238
+ </style>