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,228 +1,228 @@
1
- <!--
2
- @ Description: This component is used to display and create the link's to all the activity creation in module.
3
- @ What it does: Goes trougth all the activity in the router and create a card that open the Table of content (appCompTableOfContent) that display the anchor.Display the title and subtitle enter in menu.json. Must be used with AppCompTableOfContent and AppCompMenu.
4
- -->
5
- <template>
6
- <v-row v-if="activities.length" class="box-msa">
7
- <v-col
8
- v-for="activity of activities"
9
- :key="activity.id"
10
- cols="6"
11
- class="menu-section-activity"
12
- :aria-describedby="activity.id + '-subMenu'"
13
- >
14
- <router-link
15
- :id="activity.id + '-subMenu'"
16
- :title="activity.title"
17
- :data-test="`item-menu-${activity.id}`"
18
- class="btn-menu"
19
- :to="{
20
- name: createRoutes(activity.id)
21
- }"
22
- @click="startActivity(activity)"
23
- >
24
- <div class="menu-card" tag="article">
25
- <v-row>
26
- <div v-if="activity.subtitle === undefined" class="title">
27
- <h4 v-html="activity.title"></h4>
28
- </div>
29
- <div v-else class="title">
30
- <h4 v-html="`${activity.title} : ${activity.subtitle}`"></h4>
31
- </div>
32
-
33
- <div class="cnt-time">
34
- <svg :aria-label="$t('label.timer')">
35
- <use href="#clock-icon" />
36
- </svg>
37
- <p class="time">
38
- {{ activity.time || '00:00' }}
39
- </p>
40
- </div>
41
- <div class="box-gauge">
42
- <app-comp-jauge
43
- :max-value="getActivitySize(activity.id)"
44
- :value="getPageComplete(activity.id)"
45
- />
46
- </div>
47
- </v-row>
48
- </div>
49
- </router-link>
50
- </v-col>
51
- </v-row>
52
- </template>
53
- <script>
54
- // ...
55
- import { mapState } from 'pinia'
56
- import { useAppStore } from '../module/stores/appStore'
57
- import AppCompJauge from './AppCompJauge.vue'
58
- export default {
59
- components: {
60
- AppCompJauge
61
- },
62
- computed: {
63
- ...mapState(useAppStore, [
64
- 'getAllActivities',
65
- 'getAllActivitiesState',
66
- 'getAllCompleted',
67
- 'getAppConfigs',
68
- 'getMenuSettings',
69
- 'getModuleInfo'
70
- ]),
71
- activities() {
72
- // get the data for list of the page for this module from the store and
73
- // get the route of the page from the router to build the menu with its routes
74
- let count = 0
75
- const collection = []
76
-
77
- this.getAllActivities().list.forEach((value, key) => {
78
- let theActivity,
79
- activityTitle,
80
- activitySubTitle,
81
- activityTime = null,
82
- activityPath = ''
83
-
84
- if (this.menuInfo[key]) {
85
- const { title, subTitle, time } = this.menuInfo[key] //get time subTitle time from menu info
86
- //set the title
87
- if (title && title != ' ') activityTitle = title
88
- //set the subtitle
89
- if (subTitle && subTitle != ' ') activitySubTitle = subTitle
90
- //set the time
91
- if (time && time != ' ') activityTime = time
92
- }
93
- // This is the Introduction
94
- if (key === 'A00') {
95
- activityTitle = activityTitle || this.$t('text.introduction')
96
- activityPath = 'introduction'
97
- } else if (key === 'A99') {
98
- activityTitle = activityTitle || this.$t('text.conclusion')
99
- activityPath = 'conclusion'
100
- } else {
101
- count++
102
- activityTitle =
103
- activityTitle || `${this.$t('text.activity')} ${count}`
104
- activityPath = `activite_${count}`
105
- }
106
-
107
- theActivity = {
108
- id: key,
109
- title: activityTitle,
110
- subtitle: activitySubTitle,
111
- time: activityTime,
112
- path: activityPath,
113
- data: value
114
- }
115
-
116
- collection.push(theActivity) // push the activity in the collection
117
- })
118
-
119
- return collection
120
- },
121
- menuInfo() {
122
- let menuInfo = this.getMenuSettings
123
- return menuInfo
124
- }
125
- },
126
- mounted() {},
127
- methods: {
128
- /**
129
- * @description Gives gives length of completed page for an activity
130
- * @param {String} idActivity
131
- * @returns {Number}
132
- */
133
- getPageComplete(idActivity) {
134
- /// give all the page that are complete to the gauge
135
- if (idActivity) {
136
- let completed = []
137
- if (this.getAllCompleted[idActivity]) {
138
- completed = this.getAllCompleted[idActivity] //get all completed page for the activity
139
- }
140
-
141
- return completed.length
142
- }
143
- },
144
- /**
145
- * @description give the size of the state of the activity
146
- * @param {String} activityID
147
- * @returns {Number} size
148
- */
149
- getActivitySize(activityID) {
150
- /*
151
- * Note:
152
- * Assaging by reference would change the property of the getters when the valued are changed in the new object in. * To prevent this behaviour we will make a deep copy of the getter
153
- * cf: https://reactgo.com/javascript-clone-object/
154
- */
155
-
156
- const allActivitiesState = JSON.parse(
157
- JSON.stringify(this.getAllActivitiesState)
158
- )
159
- let size = allActivitiesState[activityID]
160
- ? allActivitiesState[activityID].size
161
- : 0
162
-
163
- return size
164
- },
165
- createRoutes(data) {
166
- let activity
167
-
168
- if (data.charAt(1) == '0' || data.charAt(1) == 0) {
169
- activity = data.substr(2)
170
- } else {
171
- activity = data.substr(1)
172
- }
173
-
174
- if (activity == 0 && activity == '0') return `introduction`
175
- if (activity == '99') return `conclusion`
176
- else return `activite_${activity}`
177
- },
178
- startActivity(a) {
179
- //this.$bus.$emit('send-starting-event', a)
180
- }
181
- }
182
- }
183
- </script>
184
- <style lang="scss">
185
- .menu-card {
186
- width: 100%;
187
- padding: 24px;
188
-
189
- .v-row {
190
- margin: 0;
191
- flex-direction: column;
192
-
193
- .title {
194
- flex-grow: 4;
195
- width: 80%;
196
- margin-bottom: 30px;
197
-
198
- h3 {
199
- text-align: left;
200
- }
201
- }
202
-
203
- .cnt-time {
204
- display: flex;
205
- flex-direction: row;
206
- align-items: center;
207
- margin-bottom: 20px;
208
-
209
- svg {
210
- width: 18px;
211
- height: 18px;
212
- margin-right: 10px;
213
- }
214
- }
215
-
216
- .box-gauge {
217
- display: block;
218
- width: 100%;
219
-
220
- .box-g {
221
- display: flex;
222
- flex-direction: row;
223
- align-items: center;
224
- }
225
- }
226
- }
227
- }
228
- </style>
1
+ <!--
2
+ @ Description: This component is used to display and create the link's to all the activity creation in module.
3
+ @ What it does: Goes trougth all the activity in the router and create a card that open the Table of content (appCompTableOfContent) that display the anchor.Display the title and subtitle enter in menu.json. Must be used with AppCompTableOfContent and AppCompMenu.
4
+ -->
5
+ <template>
6
+ <v-row v-if="activities.length" class="box-msa">
7
+ <v-col
8
+ v-for="activity of activities"
9
+ :key="activity.id"
10
+ cols="6"
11
+ class="menu-section-activity"
12
+ :aria-describedby="activity.id + '-subMenu'"
13
+ >
14
+ <router-link
15
+ :id="activity.id + '-subMenu'"
16
+ :title="activity.title"
17
+ :data-test="`item-menu-${activity.id}`"
18
+ class="btn-menu"
19
+ :to="{
20
+ name: createRoutes(activity.id)
21
+ }"
22
+ @click="startActivity(activity)"
23
+ >
24
+ <div class="menu-card" tag="article">
25
+ <v-row>
26
+ <div v-if="activity.subtitle === undefined" class="title">
27
+ <h4 v-html="activity.title"></h4>
28
+ </div>
29
+ <div v-else class="title">
30
+ <h4 v-html="`${activity.title} : ${activity.subtitle}`"></h4>
31
+ </div>
32
+
33
+ <div class="cnt-time">
34
+ <svg :aria-label="$t('label.timer')">
35
+ <use href="#clock-icon" />
36
+ </svg>
37
+ <p class="time">
38
+ {{ activity.time || '00:00' }}
39
+ </p>
40
+ </div>
41
+ <div class="box-gauge">
42
+ <app-comp-jauge
43
+ :max-value="getActivitySize(activity.id)"
44
+ :value="getPageComplete(activity.id)"
45
+ />
46
+ </div>
47
+ </v-row>
48
+ </div>
49
+ </router-link>
50
+ </v-col>
51
+ </v-row>
52
+ </template>
53
+ <script>
54
+ // ...
55
+ import { mapState } from 'pinia'
56
+ import { useAppStore } from '../module/stores/appStore'
57
+ import AppCompJauge from './AppCompJauge.vue'
58
+ export default {
59
+ components: {
60
+ AppCompJauge
61
+ },
62
+ computed: {
63
+ ...mapState(useAppStore, [
64
+ 'getAllActivities',
65
+ 'getAllActivitiesState',
66
+ 'getAllCompleted',
67
+ 'getAppConfigs',
68
+ 'getMenuSettings',
69
+ 'getModuleInfo'
70
+ ]),
71
+ activities() {
72
+ // get the data for list of the page for this module from the store and
73
+ // get the route of the page from the router to build the menu with its routes
74
+ let count = 0
75
+ const collection = []
76
+
77
+ this.getAllActivities().list.forEach((value, key) => {
78
+ let theActivity,
79
+ activityTitle,
80
+ activitySubTitle,
81
+ activityTime = null,
82
+ activityPath = ''
83
+
84
+ if (this.menuInfo[key]) {
85
+ const { title, subTitle, time } = this.menuInfo[key] //get time subTitle time from menu info
86
+ //set the title
87
+ if (title && title != ' ') activityTitle = title
88
+ //set the subtitle
89
+ if (subTitle && subTitle != ' ') activitySubTitle = subTitle
90
+ //set the time
91
+ if (time && time != ' ') activityTime = time
92
+ }
93
+ // This is the Introduction
94
+ if (key === 'A00') {
95
+ activityTitle = activityTitle || this.$t('text.introduction')
96
+ activityPath = 'introduction'
97
+ } else if (key === 'A99') {
98
+ activityTitle = activityTitle || this.$t('text.conclusion')
99
+ activityPath = 'conclusion'
100
+ } else {
101
+ count++
102
+ activityTitle =
103
+ activityTitle || `${this.$t('text.activity')} ${count}`
104
+ activityPath = `activite_${count}`
105
+ }
106
+
107
+ theActivity = {
108
+ id: key,
109
+ title: activityTitle,
110
+ subtitle: activitySubTitle,
111
+ time: activityTime,
112
+ path: activityPath,
113
+ data: value
114
+ }
115
+
116
+ collection.push(theActivity) // push the activity in the collection
117
+ })
118
+
119
+ return collection
120
+ },
121
+ menuInfo() {
122
+ let menuInfo = this.getMenuSettings
123
+ return menuInfo
124
+ }
125
+ },
126
+ mounted() {},
127
+ methods: {
128
+ /**
129
+ * @description Gives gives length of completed page for an activity
130
+ * @param {String} idActivity
131
+ * @returns {Number}
132
+ */
133
+ getPageComplete(idActivity) {
134
+ /// give all the page that are complete to the gauge
135
+ if (idActivity) {
136
+ let completed = []
137
+ if (this.getAllCompleted[idActivity]) {
138
+ completed = this.getAllCompleted[idActivity] //get all completed page for the activity
139
+ }
140
+
141
+ return completed.length
142
+ }
143
+ },
144
+ /**
145
+ * @description give the size of the state of the activity
146
+ * @param {String} activityID
147
+ * @returns {Number} size
148
+ */
149
+ getActivitySize(activityID) {
150
+ /*
151
+ * Note:
152
+ * Assaging by reference would change the property of the getters when the valued are changed in the new object in. * To prevent this behaviour we will make a deep copy of the getter
153
+ * cf: https://reactgo.com/javascript-clone-object/
154
+ */
155
+
156
+ const allActivitiesState = JSON.parse(
157
+ JSON.stringify(this.getAllActivitiesState)
158
+ )
159
+ let size = allActivitiesState[activityID]
160
+ ? allActivitiesState[activityID].size
161
+ : 0
162
+
163
+ return size
164
+ },
165
+ createRoutes(data) {
166
+ let activity
167
+
168
+ if (data.charAt(1) == '0' || data.charAt(1) == 0) {
169
+ activity = data.substr(2)
170
+ } else {
171
+ activity = data.substr(1)
172
+ }
173
+
174
+ if (activity == 0 && activity == '0') return `introduction`
175
+ if (activity == '99') return `conclusion`
176
+ else return `activite_${activity}`
177
+ },
178
+ startActivity(a) {
179
+ //this.$bus.$emit('send-starting-event', a)
180
+ }
181
+ }
182
+ }
183
+ </script>
184
+ <style lang="scss">
185
+ .menu-card {
186
+ width: 100%;
187
+ padding: 24px;
188
+
189
+ .v-row {
190
+ margin: 0;
191
+ flex-direction: column;
192
+
193
+ .title {
194
+ flex-grow: 4;
195
+ width: 80%;
196
+ margin-bottom: 30px;
197
+
198
+ h3 {
199
+ text-align: left;
200
+ }
201
+ }
202
+
203
+ .cnt-time {
204
+ display: flex;
205
+ flex-direction: row;
206
+ align-items: center;
207
+ margin-bottom: 20px;
208
+
209
+ svg {
210
+ width: 18px;
211
+ height: 18px;
212
+ margin-right: 10px;
213
+ }
214
+ }
215
+
216
+ .box-gauge {
217
+ display: block;
218
+ width: 100%;
219
+
220
+ .box-g {
221
+ display: flex;
222
+ flex-direction: row;
223
+ align-items: center;
224
+ }
225
+ }
226
+ }
227
+ }
228
+ </style>