fcad-core-dragon 2.0.0 → 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 (53) hide show
  1. package/.editorconfig +33 -33
  2. package/.eslintignore +29 -29
  3. package/.eslintrc.cjs +81 -81
  4. package/README.md +57 -72
  5. package/bk.scss +117 -117
  6. package/package.json +1 -1
  7. package/src/assets/data/onboardingMessages.json +47 -47
  8. package/src/components/AppBaseErrorDisplay.vue +438 -438
  9. package/src/components/AppBaseFlipCard.vue +84 -84
  10. package/src/components/AppBasePopover.vue +41 -41
  11. package/src/components/AppCompInputDropdownNext.vue +1 -1
  12. package/src/components/AppCompInputRadioNext.vue +152 -152
  13. package/src/components/AppCompInputTextToFillNext.vue +171 -171
  14. package/src/components/AppCompJauge.vue +74 -74
  15. package/src/components/AppCompPlayBarProgress.vue +82 -82
  16. package/src/components/AppCompSettingsMenu.vue +172 -172
  17. package/src/components/AppCompViewDisplay.vue +6 -6
  18. package/src/composables/useQuiz.js +206 -206
  19. package/src/externalComps/ModuleView.vue +22 -22
  20. package/src/externalComps/SummaryView.vue +91 -91
  21. package/src/mixins/$mediaMixins.js +819 -819
  22. package/src/module/xapi/Crypto/Hasher.js +241 -241
  23. package/src/module/xapi/Crypto/WordArray.js +278 -278
  24. package/src/module/xapi/Crypto/algorithms/BufferedBlockAlgorithm.js +103 -103
  25. package/src/module/xapi/Crypto/algorithms/C_algo.js +315 -315
  26. package/src/module/xapi/Crypto/algorithms/HMAC.js +9 -9
  27. package/src/module/xapi/Crypto/algorithms/SHA1.js +9 -9
  28. package/src/module/xapi/Crypto/encoders/Base.js +105 -105
  29. package/src/module/xapi/Crypto/encoders/Base64.js +99 -99
  30. package/src/module/xapi/Crypto/encoders/Hex.js +61 -61
  31. package/src/module/xapi/Crypto/encoders/Latin1.js +61 -61
  32. package/src/module/xapi/Crypto/encoders/Utf8.js +45 -45
  33. package/src/module/xapi/Crypto/index.js +53 -53
  34. package/src/module/xapi/Statement/activity.js +47 -47
  35. package/src/module/xapi/Statement/agent.js +55 -55
  36. package/src/module/xapi/Statement/group.js +26 -26
  37. package/src/module/xapi/Statement/index.js +259 -259
  38. package/src/module/xapi/Statement/statement.js +253 -253
  39. package/src/module/xapi/Statement/statementRef.js +23 -23
  40. package/src/module/xapi/Statement/substatement.js +22 -22
  41. package/src/module/xapi/Statement/verb.js +36 -36
  42. package/src/module/xapi/activitytypes.js +17 -17
  43. package/src/module/xapi/utils.js +167 -167
  44. package/src/module/xapi/verbs.js +294 -294
  45. package/src/module/xapi/xapiStatement.js +444 -444
  46. package/src/plugins/bus.js +8 -8
  47. package/src/plugins/gsap.js +14 -14
  48. package/src/plugins/i18n.js +44 -44
  49. package/src/plugins/save.js +37 -37
  50. package/src/plugins/scorm.js +287 -287
  51. package/src/plugins/xapi.js +11 -11
  52. package/src/public/index.html +33 -33
  53. package/src/shared/generalfuncs.js +210 -210
@@ -1,171 +1,171 @@
1
- <!-- About this Component--
2
- * Renders a Series of inputs to collect input for the Quiz component.
3
- * Related Quiz to question: TEXTE_TROUE
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="textInput in theInputData"
12
- :key="textInput.id"
13
- class="texteatrou"
14
- >
15
- <span v-if="!textInput.type" v-html="textInput.content"></span>
16
- <label
17
- :for="`${inputDataId}_${textInput.id}-champ`"
18
- style="display: none"
19
- >
20
- {{ $t('text.quiz') }}
21
- </label>
22
- <v-text-field
23
- v-if="textInput.type == 'inputText'"
24
- :id="`${inputDataId}_${textInput.id}-champ`"
25
- v-model="quizInputTypeValue[textInput.id]"
26
- :placeholder="$t('text.place_holder.for_textarea')"
27
- :disabled="quizLimitActive"
28
- no-resize
29
- :class="classInput(textInput.id, quizInputTypeValue)"
30
- class="input-textatrou"
31
- :aria-describedby="`${inputDataId}_${textInput.id}-msg-erreur`"
32
- :aria-labelledby="`${inputDataId}_${textInput.id}-label`"
33
- />
34
- <span :id="`${inputDataId}_${textInput.id}-msg-erreur`" class="sr-only">
35
- {{ messageAccessibility(textInput.id, quizInputTypeValue) }}
36
- </span>
37
- </div>
38
- </div>
39
- </template>
40
- <script>
41
- import { useQuiz } from '../composables/useQuiz'
42
- import { toRefs } from 'vue'
43
- export default {
44
- name: 'AppCompInputTextToFillNext',
45
- props: {
46
- quizType: {
47
- type: String,
48
- default: ''
49
- },
50
- inputDataId: {
51
- type: String,
52
- default: ''
53
- },
54
- inputData: {
55
- type: Array,
56
- default: () => []
57
- },
58
- inputType: {
59
- type: String,
60
- default: ''
61
- },
62
- textBase: {
63
- type: String,
64
- default: ''
65
- },
66
- quizInputType: {
67
- type: Array,
68
- default: () => []
69
- },
70
- solution: {
71
- type: Array,
72
- default: () => []
73
- },
74
- showSolution: {
75
- type: Boolean,
76
- default: false
77
- },
78
- quizLimitActive: {
79
- type: Boolean,
80
- default: false
81
- }, //use to set if quiz should be active or not
82
- quizSubmit: {
83
- type: Boolean,
84
- default: false
85
- } //use to call a submit
86
- },
87
- emits: ['input-change'],
88
- setup(props) {
89
- const { shuffleArray, classInput, messageAccessibility } = useQuiz(
90
- toRefs(props)
91
- )
92
- return { shuffleArray, classInput, messageAccessibility }
93
- },
94
- data() {
95
- return {
96
- quizInputTypeValue: [], //not using quizInputType because quizInputType is a prop
97
- theInputData: [], //to create the list of drop down and text mixed togeter
98
- quizSolution: null
99
- }
100
- },
101
-
102
- watch: {
103
- /**
104
- * @description to pass value to AppCompQuiz
105
- * @fires input-change to AppCompQuiz.vue
106
- */
107
- quizInputTypeValue: {
108
- deep: true,
109
- handler(newValue) {
110
- this.$emit('input-change', newValue)
111
- }
112
- }
113
- },
114
-
115
- mounted() {
116
- this.initQuiz()
117
- },
118
-
119
- methods: {
120
- initQuiz() {
121
- this.quizSolution = this.solution
122
- if (this.quizSolution !== null) {
123
- this.quizSolution.sort(function (a, b) {
124
- return a - b
125
- })
126
- }
127
- let textChoices = []
128
-
129
- const regex = /\$%\S*%\$/g // regex pattern to match exp: $%number%$
130
- let matchAll = this.textBase.split(regex)
131
-
132
- for (let i = 0; i < matchAll.length - 1; i++) {
133
- textChoices.push('')
134
- }
135
- //apply previous answers
136
- if (this.quizInputType && this.quizInputType.length == 0) {
137
- this.quizInputTypeValue = textChoices
138
- } else {
139
- this.quizInputTypeValue = this.quizInputType
140
- }
141
- this.createTextWithInput(this.textBase)
142
- },
143
- /**
144
- * @description create the object to genate the text and inputs
145
- * @param {String} str the text with holes to fill
146
- */
147
- createTextWithInput(str) {
148
- const regex = /\$%\S*%\$/g // regex pattern to match exp: $%number%$
149
- let matchAll = str.split(regex)
150
- let listInput = []
151
- for (let i = 0; i < matchAll.length - 1; i++) {
152
- listInput.push({ id: 't' + i, content: matchAll[i] })
153
- listInput.push({ id: i, type: 'inputText' })
154
- }
155
- let lastItem = matchAll.length - 1
156
- listInput.push({ id: 't' + lastItem, content: matchAll[lastItem] })
157
- this.theInputData = listInput
158
- }
159
- }
160
- }
161
- </script>
162
- <style lang="scss" scoped>
163
- .texteatrou {
164
- display: inline;
165
- position: relative;
166
- }
167
- .texteatrou > input {
168
- display: inline;
169
- width: auto;
170
- }
171
- </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
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="textInput in theInputData"
12
+ :key="textInput.id"
13
+ class="texteatrou"
14
+ >
15
+ <span v-if="!textInput.type" v-html="textInput.content"></span>
16
+ <label
17
+ :for="`${inputDataId}_${textInput.id}-champ`"
18
+ style="display: none"
19
+ >
20
+ {{ $t('text.quiz') }}
21
+ </label>
22
+ <v-text-field
23
+ v-if="textInput.type == 'inputText'"
24
+ :id="`${inputDataId}_${textInput.id}-champ`"
25
+ v-model="quizInputTypeValue[textInput.id]"
26
+ :placeholder="$t('text.place_holder.for_textarea')"
27
+ :disabled="quizLimitActive"
28
+ no-resize
29
+ :class="classInput(textInput.id, quizInputTypeValue)"
30
+ class="input-textatrou"
31
+ :aria-describedby="`${inputDataId}_${textInput.id}-msg-erreur`"
32
+ :aria-labelledby="`${inputDataId}_${textInput.id}-label`"
33
+ />
34
+ <span :id="`${inputDataId}_${textInput.id}-msg-erreur`" class="sr-only">
35
+ {{ messageAccessibility(textInput.id, quizInputTypeValue) }}
36
+ </span>
37
+ </div>
38
+ </div>
39
+ </template>
40
+ <script>
41
+ import { useQuiz } from '../composables/useQuiz'
42
+ import { toRefs } from 'vue'
43
+ export default {
44
+ name: 'AppCompInputTextToFillNext',
45
+ props: {
46
+ quizType: {
47
+ type: String,
48
+ default: ''
49
+ },
50
+ inputDataId: {
51
+ type: String,
52
+ default: ''
53
+ },
54
+ inputData: {
55
+ type: Array,
56
+ default: () => []
57
+ },
58
+ inputType: {
59
+ type: String,
60
+ default: ''
61
+ },
62
+ textBase: {
63
+ type: String,
64
+ default: ''
65
+ },
66
+ quizInputType: {
67
+ type: Array,
68
+ default: () => []
69
+ },
70
+ solution: {
71
+ type: Array,
72
+ default: () => []
73
+ },
74
+ showSolution: {
75
+ type: Boolean,
76
+ default: false
77
+ },
78
+ quizLimitActive: {
79
+ type: Boolean,
80
+ default: false
81
+ }, //use to set if quiz should be active or not
82
+ quizSubmit: {
83
+ type: Boolean,
84
+ default: false
85
+ } //use to call a submit
86
+ },
87
+ emits: ['input-change'],
88
+ setup(props) {
89
+ const { shuffleArray, classInput, messageAccessibility } = useQuiz(
90
+ toRefs(props)
91
+ )
92
+ return { shuffleArray, classInput, messageAccessibility }
93
+ },
94
+ data() {
95
+ return {
96
+ quizInputTypeValue: [], //not using quizInputType because quizInputType is a prop
97
+ theInputData: [], //to create the list of drop down and text mixed togeter
98
+ quizSolution: null
99
+ }
100
+ },
101
+
102
+ watch: {
103
+ /**
104
+ * @description to pass value to AppCompQuiz
105
+ * @fires input-change to AppCompQuiz.vue
106
+ */
107
+ quizInputTypeValue: {
108
+ deep: true,
109
+ handler(newValue) {
110
+ this.$emit('input-change', newValue)
111
+ }
112
+ }
113
+ },
114
+
115
+ mounted() {
116
+ this.initQuiz()
117
+ },
118
+
119
+ methods: {
120
+ initQuiz() {
121
+ this.quizSolution = this.solution
122
+ if (this.quizSolution !== null) {
123
+ this.quizSolution.sort(function (a, b) {
124
+ return a - b
125
+ })
126
+ }
127
+ let textChoices = []
128
+
129
+ const regex = /\$%\S*%\$/g // regex pattern to match exp: $%number%$
130
+ let matchAll = this.textBase.split(regex)
131
+
132
+ for (let i = 0; i < matchAll.length - 1; i++) {
133
+ textChoices.push('')
134
+ }
135
+ //apply previous answers
136
+ if (this.quizInputType && this.quizInputType.length == 0) {
137
+ this.quizInputTypeValue = textChoices
138
+ } else {
139
+ this.quizInputTypeValue = this.quizInputType
140
+ }
141
+ this.createTextWithInput(this.textBase)
142
+ },
143
+ /**
144
+ * @description create the object to genate the text and inputs
145
+ * @param {String} str the text with holes to fill
146
+ */
147
+ createTextWithInput(str) {
148
+ const regex = /\$%\S*%\$/g // regex pattern to match exp: $%number%$
149
+ let matchAll = str.split(regex)
150
+ let listInput = []
151
+ for (let i = 0; i < matchAll.length - 1; i++) {
152
+ listInput.push({ id: 't' + i, content: matchAll[i] })
153
+ listInput.push({ id: i, type: 'inputText' })
154
+ }
155
+ let lastItem = matchAll.length - 1
156
+ listInput.push({ id: 't' + lastItem, content: matchAll[lastItem] })
157
+ this.theInputData = listInput
158
+ }
159
+ }
160
+ }
161
+ </script>
162
+ <style lang="scss" scoped>
163
+ .texteatrou {
164
+ display: inline;
165
+ position: relative;
166
+ }
167
+ .texteatrou > input {
168
+ display: inline;
169
+ width: auto;
170
+ }
171
+ </style>
@@ -1,74 +1,74 @@
1
- <template>
2
- <div v-if="!error" class="box-g" :class="state">
3
- <v-progress-linear
4
- class="jauge"
5
- :model-value="value"
6
- :height="12"
7
- :max="maxValue"
8
- aria-hidden="true"
9
- ></v-progress-linear>
10
- <p class="prcnt">{{ getPourcent }} %</p>
11
- </div>
12
- <div v-else>
13
- <div class="warning">
14
- <p class="title">Attention</p>
15
- <p class="info">
16
- Attention les valeurs que vous donnez au composant ne sont pas des
17
- nombres.
18
- </p>
19
- </div>
20
- </div>
21
- </template>
22
- <script>
23
- export default {
24
- props: {
25
- // props Give value to show progress
26
- state: {
27
- type: String,
28
- default: 'started'
29
- },
30
- maxValue: {
31
- type: Number,
32
- default: 100
33
- },
34
- value: { type: Number, default: 0 },
35
- pourcent: { type: Boolean, default: false },
36
- fraction: { type: Boolean, default: false }
37
- },
38
- data() {
39
- return {}
40
- },
41
- computed: {
42
- getPourcent() {
43
- // Calculate on a 100%
44
- let result = (this.value * 100) / this.maxValue
45
- if (result > 100) return 100
46
- else return Math.round(result)
47
- },
48
- error() {
49
- if (typeof this.value != 'number' || typeof this.maxValue != 'number') {
50
- return true
51
- } else {
52
- return false
53
- }
54
- }
55
- },
56
- methods: {}
57
- }
58
- </script>
59
- <style lang="scss">
60
- .box-g {
61
- width: 100%;
62
- display: flex;
63
- flex-direction: row;
64
- flex-wrap: wrap;
65
-
66
- .jauge {
67
- width: 70%;
68
- }
69
-
70
- .prcnt {
71
- margin-left: 10px;
72
- }
73
- }
74
- </style>
1
+ <template>
2
+ <div v-if="!error" class="box-g" :class="state">
3
+ <v-progress-linear
4
+ class="jauge"
5
+ :model-value="value"
6
+ :height="12"
7
+ :max="maxValue"
8
+ aria-hidden="true"
9
+ ></v-progress-linear>
10
+ <p class="prcnt">{{ getPourcent }} %</p>
11
+ </div>
12
+ <div v-else>
13
+ <div class="warning">
14
+ <p class="title">Attention</p>
15
+ <p class="info">
16
+ Attention les valeurs que vous donnez au composant ne sont pas des
17
+ nombres.
18
+ </p>
19
+ </div>
20
+ </div>
21
+ </template>
22
+ <script>
23
+ export default {
24
+ props: {
25
+ // props Give value to show progress
26
+ state: {
27
+ type: String,
28
+ default: 'started'
29
+ },
30
+ maxValue: {
31
+ type: Number,
32
+ default: 100
33
+ },
34
+ value: { type: Number, default: 0 },
35
+ pourcent: { type: Boolean, default: false },
36
+ fraction: { type: Boolean, default: false }
37
+ },
38
+ data() {
39
+ return {}
40
+ },
41
+ computed: {
42
+ getPourcent() {
43
+ // Calculate on a 100%
44
+ let result = (this.value * 100) / this.maxValue
45
+ if (result > 100) return 100
46
+ else return Math.round(result)
47
+ },
48
+ error() {
49
+ if (typeof this.value != 'number' || typeof this.maxValue != 'number') {
50
+ return true
51
+ } else {
52
+ return false
53
+ }
54
+ }
55
+ },
56
+ methods: {}
57
+ }
58
+ </script>
59
+ <style lang="scss">
60
+ .box-g {
61
+ width: 100%;
62
+ display: flex;
63
+ flex-direction: row;
64
+ flex-wrap: wrap;
65
+
66
+ .jauge {
67
+ width: 70%;
68
+ }
69
+
70
+ .prcnt {
71
+ margin-left: 10px;
72
+ }
73
+ }
74
+ </style>
@@ -1,82 +1,82 @@
1
- <!--@ Description: This component is used to display the playbar associate with the videoPlayer
2
- @ What it does: The component is used to interacted with the videoPlayer via buttons.
3
- v-media class is used to identified which html elements trigger the playBar to be appear (with focus/click)-->
4
- <template>
5
- <!--------------------------------- PLAY-BAR Progress -------------------------------------->
6
- <div ref="$playbar-timeline" class="pb-timeline">
7
- <div ref="$progress-area" class="progress-area">
8
- <div
9
- id="progress-bar"
10
- ref="$progress-bar"
11
- draggable="false"
12
- tabindex="0"
13
- class="v-media pb-progress-bar"
14
- role="slider"
15
- aria-valuemin="0"
16
- :aria-label="mediaA11Y.label"
17
- :aria-valuenow="mediaA11Y.valNow"
18
- :aria-valuemax="mediaA11Y.valMax"
19
- :aria-valuetext="mediaA11Y.valueText"
20
- @focus="changeFocusState('progressBar', true)"
21
- @blur="changeFocusState('progressBar', false)"
22
- >
23
- <!--Class progress-animation is apply when we are not using the thumb to change the progression-->
24
- <div
25
- id="progress-indicator"
26
- ref="$progress-indicator"
27
- draggable="false"
28
- class="progress-indicator"
29
- :class="{ 'progress-animation': !progressThumbDown }"
30
- :style="{ width: progressBarPercentage + '%' }"
31
- >
32
- <!--Mousedown validate if the thumb is cliqued (if yes, the mouse is follow to modify the progress)
33
- MouseOver/MouseOut deactivate click event on progressBar if the mouse hovered the thumb-->
34
- <!-- <div
35
- ref="$progress-thumb"
36
- draggable="false"
37
- class="progress-thumb"
38
- style="z-index: 9"
39
- @mousedown="
40
- savedIsPlaying = isPlaying
41
- progressThumbDown = true
42
- "
43
- @mouseover="progressThumbHover = true"
44
- @mouseleave="progressThumbHover = false"
45
- ></div> -->
46
-
47
- <div
48
- ref="$progress-thumb"
49
- draggable="false"
50
- class="progress-thumb"
51
- style="z-index: 9"
52
- @mouseover="progressThumbHover = true"
53
- @mouseleave="progressThumbHover = false"
54
- ></div>
55
- </div>
56
- </div>
57
- <div
58
- v-if="tooTipTimeCode"
59
- id="seek-tooltip"
60
- ref="$seek-tooltip"
61
- aria-hidden="true"
62
- class="seek-tooltip"
63
- >
64
- {{ tooTipTimeCode }}
65
- </div>
66
- </div>
67
- </div>
68
- </template>
69
-
70
- <script>
71
- import $extendsMedia from '../mixins/$mediaMixins'
72
-
73
- export default {
74
- mixins: [$extendsMedia],
75
- data() {
76
- return {
77
- tooTipTimeCode: null
78
- }
79
- },
80
- mounted() {}
81
- }
82
- </script>
1
+ <!--@ Description: This component is used to display the playbar associate with the videoPlayer
2
+ @ What it does: The component is used to interacted with the videoPlayer via buttons.
3
+ v-media class is used to identified which html elements trigger the playBar to be appear (with focus/click)-->
4
+ <template>
5
+ <!--------------------------------- PLAY-BAR Progress -------------------------------------->
6
+ <div ref="$playbar-timeline" class="pb-timeline">
7
+ <div ref="$progress-area" class="progress-area">
8
+ <div
9
+ id="progress-bar"
10
+ ref="$progress-bar"
11
+ draggable="false"
12
+ tabindex="0"
13
+ class="v-media pb-progress-bar"
14
+ role="slider"
15
+ aria-valuemin="0"
16
+ :aria-label="mediaA11Y.label"
17
+ :aria-valuenow="mediaA11Y.valNow"
18
+ :aria-valuemax="mediaA11Y.valMax"
19
+ :aria-valuetext="mediaA11Y.valueText"
20
+ @focus="changeFocusState('progressBar', true)"
21
+ @blur="changeFocusState('progressBar', false)"
22
+ >
23
+ <!--Class progress-animation is apply when we are not using the thumb to change the progression-->
24
+ <div
25
+ id="progress-indicator"
26
+ ref="$progress-indicator"
27
+ draggable="false"
28
+ class="progress-indicator"
29
+ :class="{ 'progress-animation': !progressThumbDown }"
30
+ :style="{ width: progressBarPercentage + '%' }"
31
+ >
32
+ <!--Mousedown validate if the thumb is cliqued (if yes, the mouse is follow to modify the progress)
33
+ MouseOver/MouseOut deactivate click event on progressBar if the mouse hovered the thumb-->
34
+ <!-- <div
35
+ ref="$progress-thumb"
36
+ draggable="false"
37
+ class="progress-thumb"
38
+ style="z-index: 9"
39
+ @mousedown="
40
+ savedIsPlaying = isPlaying
41
+ progressThumbDown = true
42
+ "
43
+ @mouseover="progressThumbHover = true"
44
+ @mouseleave="progressThumbHover = false"
45
+ ></div> -->
46
+
47
+ <div
48
+ ref="$progress-thumb"
49
+ draggable="false"
50
+ class="progress-thumb"
51
+ style="z-index: 9"
52
+ @mouseover="progressThumbHover = true"
53
+ @mouseleave="progressThumbHover = false"
54
+ ></div>
55
+ </div>
56
+ </div>
57
+ <div
58
+ v-if="tooTipTimeCode"
59
+ id="seek-tooltip"
60
+ ref="$seek-tooltip"
61
+ aria-hidden="true"
62
+ class="seek-tooltip"
63
+ >
64
+ {{ tooTipTimeCode }}
65
+ </div>
66
+ </div>
67
+ </div>
68
+ </template>
69
+
70
+ <script>
71
+ import $extendsMedia from '../mixins/$mediaMixins'
72
+
73
+ export default {
74
+ mixins: [$extendsMedia],
75
+ data() {
76
+ return {
77
+ tooTipTimeCode: null
78
+ }
79
+ },
80
+ mounted() {}
81
+ }
82
+ </script>