fcad-core-dragon 2.1.1 → 2.1.2

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 (160) hide show
  1. package/.editorconfig +7 -7
  2. package/.gitlab-ci.yml +124 -0
  3. package/.prettierrc +11 -11
  4. package/.vscode/extensions.json +8 -8
  5. package/.vscode/settings.json +46 -16
  6. package/CHANGELOG +520 -520
  7. package/README.md +57 -57
  8. package/documentation/.vitepress/config.js +114 -114
  9. package/documentation/api-examples.md +49 -49
  10. package/documentation/composants/app-base-button.md +58 -58
  11. package/documentation/composants/app-base-error-display.md +59 -59
  12. package/documentation/composants/app-base-popover.md +68 -68
  13. package/documentation/composants/app-comp-audio.md +75 -75
  14. package/documentation/composants/app-comp-branch-buttons.md +111 -111
  15. package/documentation/composants/app-comp-button-progress.md +53 -53
  16. package/documentation/composants/app-comp-carousel.md +53 -53
  17. package/documentation/composants/app-comp-container.md +53 -53
  18. package/documentation/composants/app-comp-input-checkbox-next.md +42 -42
  19. package/documentation/composants/app-comp-input-dropdown-next.md +34 -34
  20. package/documentation/composants/app-comp-input-radio-next.md +39 -39
  21. package/documentation/composants/app-comp-input-text-next.md +35 -35
  22. package/documentation/composants/app-comp-input-text-table-next.md +34 -34
  23. package/documentation/composants/app-comp-input-text-to-fill-dropdown-next.md +53 -53
  24. package/documentation/composants/app-comp-input-text-to-fill-next.md +31 -31
  25. package/documentation/composants/app-comp-jauge.md +31 -31
  26. package/documentation/composants/app-comp-menu-item.md +55 -55
  27. package/documentation/composants/app-comp-menu.md +29 -29
  28. package/documentation/composants/app-comp-navigation.md +41 -41
  29. package/documentation/composants/app-comp-note-call.md +53 -53
  30. package/documentation/composants/app-comp-note-credit.md +53 -53
  31. package/documentation/composants/app-comp-play-bar-next.md +53 -53
  32. package/documentation/composants/app-comp-pop-up-next.md +93 -93
  33. package/documentation/composants/app-comp-quiz-next.md +235 -235
  34. package/documentation/composants/app-comp-quiz-recall.md +53 -53
  35. package/documentation/composants/app-comp-svg-next.md +53 -53
  36. package/documentation/composants/app-comp-table-of-content.md +50 -50
  37. package/documentation/composants/app-comp-video-player.md +82 -82
  38. package/documentation/composants.md +46 -46
  39. package/documentation/composants_critiques/ModelPageComposant.md +53 -53
  40. package/documentation/composants_critiques/app-base-module.md +43 -43
  41. package/documentation/composants_critiques/app-base-page.md +48 -48
  42. package/documentation/composants_critiques/app-base.md +311 -311
  43. package/documentation/composants_critiques/main.md +15 -15
  44. package/documentation/demarrage.md +50 -50
  45. package/documentation/deploiement.md +57 -57
  46. package/documentation/index.md +33 -33
  47. package/documentation/markdown-examples.md +85 -85
  48. package/documentation/public/vite.svg +14 -14
  49. package/documentation/public/vuejs.svg +1 -1
  50. package/documentation/public/vuetify.svg +5 -5
  51. package/eslint.config.js +60 -60
  52. package/junit-report.xml +182 -0
  53. package/package.json +66 -59
  54. package/playwright/index.html +12 -0
  55. package/playwright/index.js +21 -0
  56. package/playwright-ct.config.js +95 -0
  57. package/src/$locales/en.json +157 -157
  58. package/src/$locales/fr.json +120 -120
  59. package/src/assets/data/onboardingMessages.json +47 -47
  60. package/src/components/AppBase.vue +1171 -1169
  61. package/src/components/AppBaseButton.vue +90 -95
  62. package/src/components/AppBaseErrorDisplay.vue +438 -438
  63. package/src/components/AppBaseFlipCard.vue +84 -84
  64. package/src/components/AppBaseModule.vue +1639 -1634
  65. package/src/components/AppBasePage.vue +867 -866
  66. package/src/components/AppBasePopover.vue +41 -41
  67. package/src/components/AppBaseSkeleton.vue +66 -66
  68. package/src/components/AppCompAudio.vue +261 -256
  69. package/src/components/AppCompBranchButtons.vue +508 -508
  70. package/src/components/AppCompButtonProgress.vue +137 -132
  71. package/src/components/AppCompCarousel.vue +342 -336
  72. package/src/components/AppCompContainer.vue +29 -29
  73. package/src/components/AppCompInputCheckBoxNx.vue +325 -323
  74. package/src/components/AppCompInputDropdownNx.vue +302 -299
  75. package/src/components/AppCompInputRadioNx.vue +287 -284
  76. package/src/components/AppCompInputTextNx.vue +156 -153
  77. package/src/components/AppCompInputTextTableNx.vue +205 -202
  78. package/src/components/AppCompInputTextToFillDropdownNx.vue +343 -340
  79. package/src/components/AppCompInputTextToFillNx.vue +316 -313
  80. package/src/components/AppCompJauge.vue +81 -81
  81. package/src/components/AppCompMenu.vue +6 -1
  82. package/src/components/AppCompMenuItem.vue +246 -240
  83. package/src/components/AppCompNavigation.vue +977 -972
  84. package/src/components/AppCompNoteCall.vue +167 -161
  85. package/src/components/AppCompNoteCredit.vue +496 -491
  86. package/src/components/AppCompPlayBarNext.vue +2290 -2288
  87. package/src/components/AppCompPopUpNext.vue +508 -504
  88. package/src/components/AppCompQuizNext.vue +515 -510
  89. package/src/components/AppCompQuizRecall.vue +355 -350
  90. package/src/components/AppCompSVGNext.vue +346 -346
  91. package/src/components/AppCompSettingsMenu.vue +177 -172
  92. package/src/components/AppCompTableOfContent.vue +433 -427
  93. package/src/components/AppCompVideoPlayer.vue +377 -377
  94. package/src/components/AppCompViewDisplay.vue +6 -6
  95. package/src/components/BaseModule.vue +55 -55
  96. package/src/composables/useIdleDetector.js +56 -56
  97. package/src/composables/useQuiz.js +89 -89
  98. package/src/composables/useTimer.js +172 -172
  99. package/src/directives/nvdaFix.js +53 -53
  100. package/src/externalComps/ModuleView.vue +22 -22
  101. package/src/externalComps/SummaryView.vue +91 -91
  102. package/src/main.js +493 -476
  103. package/src/module/stores/appStore.js +960 -947
  104. package/src/module/xapi/ADL.js +520 -520
  105. package/src/module/xapi/Crypto/Hasher.js +241 -241
  106. package/src/module/xapi/Crypto/WordArray.js +278 -278
  107. package/src/module/xapi/Crypto/algorithms/BufferedBlockAlgorithm.js +103 -103
  108. package/src/module/xapi/Crypto/algorithms/C_algo.js +315 -315
  109. package/src/module/xapi/Crypto/algorithms/HMAC.js +9 -9
  110. package/src/module/xapi/Crypto/algorithms/SHA1.js +9 -9
  111. package/src/module/xapi/Crypto/encoders/Base.js +105 -105
  112. package/src/module/xapi/Crypto/encoders/Base64.js +99 -99
  113. package/src/module/xapi/Crypto/encoders/Hex.js +61 -61
  114. package/src/module/xapi/Crypto/encoders/Latin1.js +61 -61
  115. package/src/module/xapi/Crypto/encoders/Utf8.js +45 -45
  116. package/src/module/xapi/Crypto/index.js +53 -53
  117. package/src/module/xapi/Statement/activity.js +47 -47
  118. package/src/module/xapi/Statement/agent.js +55 -55
  119. package/src/module/xapi/Statement/group.js +26 -26
  120. package/src/module/xapi/Statement/index.js +259 -259
  121. package/src/module/xapi/Statement/statement.js +253 -253
  122. package/src/module/xapi/Statement/statementRef.js +23 -23
  123. package/src/module/xapi/Statement/substatement.js +22 -22
  124. package/src/module/xapi/Statement/verb.js +36 -36
  125. package/src/module/xapi/activitytypes.js +17 -17
  126. package/src/module/xapi/launch.js +157 -157
  127. package/src/module/xapi/utils.js +167 -167
  128. package/src/module/xapi/verbs.js +294 -294
  129. package/src/module/xapi/wrapper.js +1895 -1895
  130. package/src/module/xapi/xapiStatement.js +444 -444
  131. package/src/plugins/analytics.js +34 -34
  132. package/src/plugins/bus.js +12 -8
  133. package/src/plugins/gsap.js +17 -17
  134. package/src/plugins/helper.js +355 -358
  135. package/src/plugins/i18n.js +27 -26
  136. package/src/plugins/idb.js +227 -227
  137. package/src/plugins/save.js +37 -37
  138. package/src/plugins/scorm.js +287 -287
  139. package/src/plugins/xapi.js +11 -11
  140. package/src/public/index.html +33 -33
  141. package/src/router/index.js +57 -57
  142. package/src/router/routes.js +312 -312
  143. package/src/shared/generalfuncs.js +344 -344
  144. package/src/shared/validators.js +1018 -1018
  145. package/tests/component/AppBaseButton.spec.js +53 -0
  146. package/tests/component/pinia.spec.js +24 -0
  147. package/{src/components/tests__ → tests/unit}/AppBaseButton.spec.js +53 -53
  148. package/tests/unit/AppCompInputCheckBoxNx.spec.js +59 -0
  149. package/tests/unit/AppCompInputDropdownNx.spec.js +51 -0
  150. package/tests/unit/AppCompInputRadioNx.spec.js +59 -0
  151. package/tests/unit/AppCompInputTextNx.spec.js +44 -0
  152. package/tests/unit/AppCompInputTextTableNx.spec.js +77 -0
  153. package/tests/unit/AppCompInputTextToFillDropdownNx.spec.js +60 -0
  154. package/tests/unit/AppCompInputTextToFillNx.spec.js +45 -0
  155. package/tests/unit/AppCompQuizNext.spec.js +114 -0
  156. package/tests/unit/AppCompVideoPlayer.spec.js +177 -0
  157. package/{src/components/tests__ → tests/unit}/useTimer.spec.js +91 -91
  158. package/vitest.config.js +28 -19
  159. package/vitest.setup.js +28 -0
  160. package/src/components/AppBaseButton.test.js +0 -21
@@ -1,202 +1,205 @@
1
- <!-- About this Component--
2
- * Renders a Series of SELECTS inputs to collect input for the Quiz component.
3
- * Related Quiz to question: TEXTE_TABLEAU
4
- * Receives the a data object defined by user
5
- * Used by AppCompQuiz
6
- * Uses useQuiz composable
7
- -->
8
- <template>
9
- <div :id="id" class="input-box">
10
- <fieldset :aria-label="fieldsetLabel">
11
- <div v-for="(textInput, index) in inputData" :key="textInput.id">
12
- <label
13
- :id="`${id}_${textInput.id}-label`"
14
- aria-hidden="true"
15
- v-html="textInput.ennonce"
16
- ></label>
17
-
18
- <div class="cnt-input-text" :class="`${retro[index]}`">
19
- <v-text-field
20
- :id="`${id}_${textInput.id}-champ`"
21
- :model-value="inputsValue[textInput.id]"
22
- :placeholder="$t('text.place_holder.for_textarea')"
23
- :aria-describedby="`${id}_${textInput.id}-msg-erreur`"
24
- :aria-labelledby="`${id}_${textInput.id}-label`"
25
- no-resize
26
- @update:model-value="onSelectUpdate($event, textInput.id)"
27
- />
28
- </div>
29
- <span :id="`${id}_${textInput.id}-msg-erreur`" class="sr-only">
30
- {{ messageAccessibility[index] }}
31
- </span>
32
- </div>
33
- </fieldset>
34
- </div>
35
- </template>
36
- <script>
37
- import { useQuiz } from '../composables/useQuiz'
38
- import { validateObjType } from '../shared/validators'
39
- export default {
40
- name: 'AppCompInputTextTableNx',
41
- /* PROPS USED FOR PARENT TO COMMUNICATE DATA TO CHILD */
42
- props: {
43
- modelValue: {
44
- type: Array,
45
- default: () => []
46
- },
47
- inputData: {
48
- type: Array,
49
- default: () => []
50
- },
51
- solution: {
52
- type: Array,
53
- default: () => []
54
- },
55
- id: {
56
- type: String,
57
- default: ''
58
- }
59
- },
60
- emits: ['update:modelValue', 'enable-submit'],
61
- setup() {
62
- const { retroType, addRetroStyle, resetRetroStyle } = useQuiz()
63
-
64
- return { retroType, addRetroStyle, resetRetroStyle }
65
- },
66
- data() {
67
- return {
68
- quizInputDataValue: [],
69
- textInputs: [],
70
- quizSolution: null,
71
- inputElements: [],
72
- result: null,
73
- retro: [],
74
- messageAccessibility: []
75
- }
76
- },
77
- computed: {
78
- fieldsetLabel() {
79
- return `${this.$t('quizState.textTableFieldset1')} ${this.inputData.length} ${this.$t('quizState.textTableFieldset2')}`
80
- },
81
- /* INTERNAL REACTIVE VALUE THAT BIND WITH MODELVALUE PROPS */
82
- inputsValue: {
83
- get() {
84
- return this.modelValue
85
- },
86
- set(newValue) {
87
- this.$emit('update:modelValue', [...newValue])
88
- }
89
- }
90
- },
91
- watch: {
92
- inputsValue: {
93
- handler() {
94
- const filled = this.modelValue.filter((val) => val && val.trim() !== '')
95
-
96
- this.$emit('enable-submit', filled.length == this.inputData.length)
97
- },
98
- deep: true,
99
- immediate: true
100
- }
101
- },
102
- created() {
103
- if (import.meta.env.DEV) {
104
- let errors = this.validateInputData()
105
- if (errors && errors.errorList.length) {
106
- return this.$bus.$emit('input-error', { e: this.id, errors })
107
- }
108
- }
109
-
110
- this.quizInputDataValue = this.inputData
111
- },
112
- mounted() {},
113
-
114
- methods: {
115
- validateInputData() {
116
- let errors = { errorInConsole: [], errorList: [] }
117
- let stringType = ['id', 'ennonce']
118
- let e = null
119
-
120
- if (!this.inputData.length) return errors
121
- for (let i = 0; i < this.inputData.length; i++) {
122
- e = validateObjType(
123
- this.inputData[i],
124
- { stringType },
125
- null,
126
- `texte tableau #${i + 1}`
127
- )
128
-
129
- if (e.errorInConsole.length && e.errorList.length) {
130
- errors.errorInConsole.push(e.errorInConsole[0])
131
- errors.errorList.push(e.errorList[0])
132
- }
133
- }
134
-
135
- return errors
136
- },
137
- /**
138
- * @description Method to force update of this.inputsValue.
139
- * this force the old value and new value of the input to be tracked by VUE.
140
- * @param newValue, the new value of the input
141
- * @param index index of the selected element
142
- */
143
-
144
- onSelectUpdate(newValue, index) {
145
- if (this.$el && this.$el.id !== this.id) return
146
- this.resetRetroStyle([this.retro, this.messageAccessibility])
147
-
148
- const updated = [...this.inputsValue] //create new array from inputsValue
149
- updated[index] = newValue
150
- this.inputsValue = updated //trigger vue reactivity for inputsValue
151
- },
152
- validateAnswer() {
153
- let mappedResults
154
-
155
- if (this.solution != null) {
156
- mappedResults = this.inputsValue.map(
157
- (a, i) =>
158
- (a = {
159
- filled: a,
160
- correct: this.solution[i].reponse_value.includes(a)
161
- })
162
- )
163
- } else {
164
- mappedResults = this.inputsValue.map(
165
- (a) =>
166
- (a = {
167
- filled: a,
168
- correct: false
169
- })
170
- )
171
- }
172
-
173
- let { classRetro, mesA11y } = this.addRetroStyle(
174
- this.solution,
175
- mappedResults,
176
- this.inputData.length
177
- )
178
-
179
- this.retro = classRetro
180
- this.messageAccessibility = mesA11y
181
-
182
- this.result = mappedResults.filter((a) => a.filled)
183
- let tr = this.retroType(this.solution, mappedResults)
184
-
185
- return {
186
- userAnswer: this.result,
187
- correctAnswer: this.solution,
188
- retroType: tr
189
- }
190
- }
191
- }
192
- }
193
- </script>
194
- <style lang="scss" scoped>
195
- .cnt-input-text {
196
- position: relative;
197
- }
198
-
199
- fieldset {
200
- border: inherit;
201
- }
202
- </style>
1
+ <!-- About this Component--
2
+ * Renders a Series of SELECTS inputs to collect input for the Quiz component.
3
+ * Related Quiz to question: TEXTE_TABLEAU
4
+ * Receives the a data object defined by user
5
+ * Used by AppCompQuiz
6
+ * Uses useQuiz composable
7
+ -->
8
+ <template>
9
+ <div :id="id" class="input-box">
10
+ <fieldset :aria-label="fieldsetLabel">
11
+ <div v-for="(textInput, index) in inputData" :key="textInput.id">
12
+ <label
13
+ :id="`${id}_${textInput.id}-label`"
14
+ aria-hidden="true"
15
+ v-html="textInput.ennonce"
16
+ ></label>
17
+
18
+ <div class="cnt-input-text" :class="`${retro[index]}`">
19
+ <v-text-field
20
+ :id="`${id}_${textInput.id}-champ`"
21
+ :model-value="inputsValue[textInput.id]"
22
+ :placeholder="$t('text.place_holder.for_textarea')"
23
+ :aria-describedby="`${id}_${textInput.id}-msg-erreur`"
24
+ :aria-labelledby="`${id}_${textInput.id}-label`"
25
+ no-resize
26
+ @update:model-value="onSelectUpdate($event, textInput.id)"
27
+ />
28
+ </div>
29
+ <span :id="`${id}_${textInput.id}-msg-erreur`" class="sr-only">
30
+ {{ messageAccessibility[index] }}
31
+ </span>
32
+ </div>
33
+ </fieldset>
34
+ </div>
35
+ </template>
36
+ <script>
37
+ import { useQuiz } from '../composables/useQuiz'
38
+ import { validateObjType } from '../shared/validators'
39
+ import { useI18n } from 'vue-i18n'
40
+
41
+ export default {
42
+ name: 'AppCompInputTextTableNx',
43
+ /* PROPS USED FOR PARENT TO COMMUNICATE DATA TO CHILD */
44
+ props: {
45
+ modelValue: {
46
+ type: Array,
47
+ default: () => []
48
+ },
49
+ inputData: {
50
+ type: Array,
51
+ default: () => []
52
+ },
53
+ solution: {
54
+ type: Array,
55
+ default: () => []
56
+ },
57
+ id: {
58
+ type: String,
59
+ default: ''
60
+ }
61
+ },
62
+ emits: ['update:modelValue', 'enable-submit'],
63
+ setup() {
64
+ const { t } = useI18n()
65
+ const { retroType, addRetroStyle, resetRetroStyle } = useQuiz()
66
+
67
+ return { retroType, addRetroStyle, resetRetroStyle, t }
68
+ },
69
+ data() {
70
+ return {
71
+ quizInputDataValue: [],
72
+ textInputs: [],
73
+ quizSolution: null,
74
+ inputElements: [],
75
+ result: null,
76
+ retro: [],
77
+ messageAccessibility: []
78
+ }
79
+ },
80
+ computed: {
81
+ fieldsetLabel() {
82
+ return `${this.$t('quizState.textTableFieldset1')} ${this.inputData.length} ${this.$t('quizState.textTableFieldset2')}`
83
+ },
84
+ /* INTERNAL REACTIVE VALUE THAT BIND WITH MODELVALUE PROPS */
85
+ inputsValue: {
86
+ get() {
87
+ return this.modelValue
88
+ },
89
+ set(newValue) {
90
+ this.$emit('update:modelValue', [...newValue])
91
+ }
92
+ }
93
+ },
94
+ watch: {
95
+ inputsValue: {
96
+ handler() {
97
+ const filled = this.modelValue.filter((val) => val && val.trim() !== '')
98
+
99
+ this.$emit('enable-submit', filled.length == this.inputData.length)
100
+ },
101
+ deep: true,
102
+ immediate: true
103
+ }
104
+ },
105
+ created() {
106
+ if (import.meta.env.DEV) {
107
+ let errors = this.validateInputData()
108
+ if (errors && errors.errorList.length) {
109
+ return this.$bus.$emit('input-error', { e: this.id, errors })
110
+ }
111
+ }
112
+
113
+ this.quizInputDataValue = this.inputData
114
+ },
115
+ mounted() {},
116
+
117
+ methods: {
118
+ validateInputData() {
119
+ let errors = { errorInConsole: [], errorList: [] }
120
+ let stringType = ['id', 'ennonce']
121
+ let e = null
122
+
123
+ if (!this.inputData.length) return errors
124
+ for (let i = 0; i < this.inputData.length; i++) {
125
+ e = validateObjType(
126
+ this.inputData[i],
127
+ { stringType },
128
+ null,
129
+ `texte tableau #${i + 1}`
130
+ )
131
+
132
+ if (e.errorInConsole.length && e.errorList.length) {
133
+ errors.errorInConsole.push(e.errorInConsole[0])
134
+ errors.errorList.push(e.errorList[0])
135
+ }
136
+ }
137
+
138
+ return errors
139
+ },
140
+ /**
141
+ * @description Method to force update of this.inputsValue.
142
+ * this force the old value and new value of the input to be tracked by VUE.
143
+ * @param newValue, the new value of the input
144
+ * @param index index of the selected element
145
+ */
146
+
147
+ onSelectUpdate(newValue, index) {
148
+ if (this.$el && this.$el.id !== this.id) return
149
+ this.resetRetroStyle([this.retro, this.messageAccessibility])
150
+
151
+ const updated = [...this.inputsValue] //create new array from inputsValue
152
+ updated[index] = newValue
153
+ this.inputsValue = updated //trigger vue reactivity for inputsValue
154
+ },
155
+ validateAnswer() {
156
+ let mappedResults
157
+
158
+ if (this.solution != null) {
159
+ mappedResults = this.inputsValue.map(
160
+ (a, i) =>
161
+ (a = {
162
+ filled: a,
163
+ correct: this.solution[i].reponse_value.includes(a)
164
+ })
165
+ )
166
+ } else {
167
+ mappedResults = this.inputsValue.map(
168
+ (a) =>
169
+ (a = {
170
+ filled: a,
171
+ correct: false
172
+ })
173
+ )
174
+ }
175
+
176
+ let { classRetro, mesA11y } = this.addRetroStyle(
177
+ this.solution,
178
+ mappedResults,
179
+ this.inputData.length
180
+ )
181
+
182
+ this.retro = classRetro
183
+ this.messageAccessibility = mesA11y
184
+
185
+ this.result = mappedResults.filter((a) => a.filled)
186
+ let tr = this.retroType(this.solution, mappedResults)
187
+
188
+ return {
189
+ userAnswer: this.result,
190
+ correctAnswer: this.solution,
191
+ retroType: tr
192
+ }
193
+ }
194
+ }
195
+ }
196
+ </script>
197
+ <style lang="scss" scoped>
198
+ .cnt-input-text {
199
+ position: relative;
200
+ }
201
+
202
+ fieldset {
203
+ border: inherit;
204
+ }
205
+ </style>