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,230 +1,230 @@
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
+ :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>