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

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 (118) hide show
  1. package/.editorconfig +33 -33
  2. package/.eslintignore +29 -29
  3. package/{.eslintrc.js → .eslintrc.cjs} +81 -86
  4. package/CHANGELOG +364 -364
  5. package/README.md +71 -71
  6. package/bk.scss +117 -0
  7. package/package.json +61 -63
  8. package/src/$locales/en.json +143 -179
  9. package/src/$locales/fr.json +105 -181
  10. package/src/assets/data/onboardingMessages.json +47 -47
  11. package/src/components/AppBase.vue +1054 -614
  12. package/src/components/AppBaseButton.vue +87 -63
  13. package/src/components/AppBaseErrorDisplay.vue +438 -420
  14. package/src/components/AppBaseFlipCard.vue +84 -83
  15. package/src/components/AppBaseModule.vue +1673 -1842
  16. package/src/components/AppBasePage.vue +779 -312
  17. package/src/components/AppBasePopover.vue +41 -0
  18. package/src/components/AppCompAudio.vue +234 -0
  19. package/src/components/AppCompBranchButtons.vue +552 -582
  20. package/src/components/AppCompButtonProgress.vue +126 -147
  21. package/src/components/AppCompCarousel.vue +298 -192
  22. package/src/components/AppCompInputCheckBoxNext.vue +195 -0
  23. package/src/components/AppCompInputDropdownNext.vue +159 -0
  24. package/src/components/AppCompInputRadioNext.vue +152 -0
  25. package/src/components/{AppCompInputTextBox.vue → AppCompInputTextNext.vue} +106 -91
  26. package/src/components/AppCompInputTextTableNext.vue +141 -0
  27. package/src/components/AppCompInputTextToFillDropdownNext.vue +230 -0
  28. package/src/components/{AppCompInputTextToFillText.vue → AppCompInputTextToFillNext.vue} +171 -164
  29. package/src/components/AppCompJauge.vue +74 -55
  30. package/src/components/AppCompMenu.vue +413 -209
  31. package/src/components/AppCompMenuItem.vue +228 -174
  32. package/src/components/AppCompNavigation.vue +960 -949
  33. package/src/components/AppCompNoteCall.vue +133 -126
  34. package/src/components/AppCompNoteCredit.vue +292 -164
  35. package/src/components/AppCompPlayBar.vue +1218 -1319
  36. package/src/components/AppCompPlayBarNext.vue +2052 -0
  37. package/src/components/AppCompPlayBarProgress.vue +82 -0
  38. package/src/components/AppCompPopUpNext.vue +503 -0
  39. package/src/components/{AppCompQuiz.vue → AppCompQuizNext.vue} +2904 -2989
  40. package/src/components/AppCompQuizRecall.vue +276 -250
  41. package/src/components/AppCompSVGNext.vue +347 -0
  42. package/src/components/AppCompSettingsMenu.vue +172 -171
  43. package/src/components/AppCompTableOfContent.vue +387 -264
  44. package/src/components/AppCompTranscript.vue +24 -19
  45. package/src/components/AppCompVideoPlayer.vue +368 -336
  46. package/src/components/AppCompViewDisplay.vue +6 -6
  47. package/src/components/BaseModule.vue +72 -67
  48. package/src/composables/useQuiz.js +206 -0
  49. package/src/externalComps/ModuleView.vue +22 -0
  50. package/src/externalComps/SummaryView.vue +91 -0
  51. package/src/main.js +272 -227
  52. package/src/mixins/$mediaMixins.js +819 -0
  53. package/src/mixins/timerMixin.js +155 -156
  54. package/src/module/stores/appStore.js +893 -0
  55. package/src/module/xapi/ADL.js +376 -339
  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 -319
  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 -1890
  81. package/src/module/xapi/xapiStatement.js +444 -444
  82. package/src/plugins/bus.js +8 -3
  83. package/src/plugins/gsap.js +14 -17
  84. package/src/plugins/helper.js +308 -295
  85. package/src/plugins/i18n.js +44 -31
  86. package/src/plugins/idb.js +219 -212
  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 -21
  91. package/src/router/index.js +43 -41
  92. package/src/router/routes.js +312 -337
  93. package/src/shared/generalfuncs.js +210 -188
  94. package/src/shared/validators.js +1069 -249
  95. package/vite.config.js +27 -0
  96. package/.prettierrc.js +0 -5
  97. package/babel.config.js +0 -3
  98. package/src/components/AppBaseDragChoice.vue +0 -91
  99. package/src/components/AppBaseDropZone.vue +0 -112
  100. package/src/components/AppCompBif.vue +0 -120
  101. package/src/components/AppCompDragAndDrop.vue +0 -339
  102. package/src/components/AppCompInputAssociation.vue +0 -332
  103. package/src/components/AppCompInputCheckBox.vue +0 -227
  104. package/src/components/AppCompInputDropdown.vue +0 -184
  105. package/src/components/AppCompInputRadio.vue +0 -169
  106. package/src/components/AppCompInputTextTable.vue +0 -155
  107. package/src/components/AppCompInputTextToFillDropdown.vue +0 -255
  108. package/src/components/AppCompMediaPlayer.vue +0 -397
  109. package/src/components/AppCompPopUp.vue +0 -522
  110. package/src/components/AppCompPopover.vue +0 -27
  111. package/src/components/AppCompSVG.vue +0 -309
  112. package/src/mixins/$pageMixins.js +0 -459
  113. package/src/mixins/$quizMixins.js +0 -456
  114. package/src/module/store.js +0 -895
  115. package/src/plugins/timeManager.js +0 -77
  116. package/src/routes_bckp.js +0 -313
  117. package/src/routes_static.js +0 -344
  118. package/vue.config.js +0 -83
@@ -0,0 +1,141 @@
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 AppCompQuizNext
6
+ * Uses useQuiz composable
7
+ -->
8
+ <template>
9
+ <div class="input-box">
10
+ <div v-for="textInput in quizInputDataValue" :key="textInput.id">
11
+ <label
12
+ :id="`${inputDataId}_${textInput.id}-label`"
13
+ aria-hidden="true"
14
+ v-html="textInput.ennonce"
15
+ ></label>
16
+ <div
17
+ class="cnt-input-text"
18
+ :class="classInput(textInput.id, quizInputTypeValue)"
19
+ >
20
+ <v-text-field
21
+ :id="`${inputDataId}_${textInput.id}-champ`"
22
+ v-model="quizInputTypeValue[textInput.id]"
23
+ :placeholder="$t('text.place_holder.for_textarea')"
24
+ :disabled="quizLimitActive"
25
+ no-resize
26
+ :aria-describedby="`${inputDataId}_${textInput.id}-msg-erreur`"
27
+ :aria-labelledby="`${inputDataId}_${textInput.id}-label`"
28
+ />
29
+ </div>
30
+ <span :id="`${inputDataId}_${textInput.id}-msg-erreur`" class="sr-only">
31
+ {{ messageAccessibility(textInput.id, quizInputTypeValue) }}
32
+ </span>
33
+ </div>
34
+ </div>
35
+ </template>
36
+ <script>
37
+ import { useQuiz } from '../composables/useQuiz'
38
+ import { toRefs } from 'vue'
39
+ export default {
40
+ name: 'AppCompInputTextTableNext',
41
+
42
+ props: {
43
+ quizType: {
44
+ type: String,
45
+ default: ''
46
+ },
47
+ inputDataId: {
48
+ type: String,
49
+ default: ''
50
+ },
51
+ inputData: {
52
+ type: Array,
53
+ default: () => []
54
+ },
55
+ quizInputType: {
56
+ type: Array,
57
+ default: () => []
58
+ },
59
+
60
+ solution: {
61
+ type: Array,
62
+ default: () => []
63
+ },
64
+ showSolution: {
65
+ type: Boolean,
66
+ default: false
67
+ },
68
+ quizLimitActive: {
69
+ type: Boolean,
70
+ default: false
71
+ }, //use to set if quiz should be active or not
72
+ shuffleAnswers: {
73
+ type: Boolean,
74
+ default: false
75
+ },
76
+ quizSubmit: {
77
+ type: Boolean,
78
+ default: false
79
+ } //use to call a submit
80
+ },
81
+ emits: ['input-change'],
82
+ setup(props) {
83
+ const { classInput, containsValue, shuffleArray, messageAccessibility } =
84
+ useQuiz(toRefs(props))
85
+
86
+ return { classInput, containsValue, shuffleArray, messageAccessibility }
87
+ },
88
+ data() {
89
+ return {
90
+ quizInputDataValue: [],
91
+ quizInputTypeValue: [],
92
+ quizSolution: null
93
+ }
94
+ },
95
+
96
+ watch: {
97
+ /**
98
+ * @description to pass value to AppCompQuiz
99
+ * @fires input-change to AppCompQuiz.vue
100
+ */
101
+ quizInputTypeValue: {
102
+ deep: true,
103
+ handler(newValue) {
104
+ this.$emit('input-change', newValue)
105
+ }
106
+ }
107
+ },
108
+
109
+ mounted() {
110
+ this.initQuiz()
111
+ },
112
+
113
+ methods: {
114
+ initQuiz() {
115
+ this.quizSolution = this.solution
116
+ if (this.quizSolution !== null) {
117
+ this.quizSolution.sort(function (a, b) {
118
+ return a - b
119
+ })
120
+ }
121
+
122
+ //apply previous answers
123
+ if (this.quizInputType && this.quizInputType.length == 0) {
124
+ this.quizInputTypeValue = []
125
+ } else {
126
+ this.quizInputTypeValue = this.quizInputType
127
+ }
128
+
129
+ if (this.shuffleAnswers)
130
+ return (this.quizInputDataValue = this.shuffleArray(this.inputData))
131
+
132
+ this.quizInputDataValue = this.inputData
133
+ }
134
+ }
135
+ }
136
+ </script>
137
+ <style lang="scss" scoped>
138
+ .cnt-input-text {
139
+ position: relative;
140
+ }
141
+ </style>
@@ -0,0 +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>