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
@@ -1,174 +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
- <b-row v-if="activities.length" class="box-msa">
7
- <b-col
8
- v-for="activity of activities"
9
- :key="activity.id"
10
- class="menu-section-activity"
11
- :aria-describedby="activity.id + '-subMenu'"
12
- >
13
- <b-link
14
- :id="activity.id + '-subMenu'"
15
- :title="activity.title"
16
- :to="{
17
- name: createRoutes(activity.id)
18
- }"
19
- >
20
- <div class="menu-card" tag="article">
21
- <b-row>
22
- <div v-if="activity.subtitle === undefined" class="title">
23
- <h4 v-html="activity.title"></h4>
24
- </div>
25
- <div v-else class="title">
26
- <h4 v-html="`${activity.title} : ${activity.subtitle}`"></h4>
27
- </div>
28
-
29
- <div class="time">
30
- <p class="time">
31
- <svg width="18" height="21.01" :aria-label="$t('label.timer')">
32
- <use href="#clock-icon" />
33
- </svg>
34
- {{ activity.time || '00:00' }}
35
- </p>
36
- </div>
37
- <div class="box-gauge">
38
- <app-comp-jauge
39
- :max-value="getActivitySize(activity.id)"
40
- :value="getPageComplete(activity.id)"
41
- />
42
- </div>
43
- </b-row>
44
- </div>
45
- </b-link>
46
- </b-col>
47
- </b-row>
48
- </template>
49
- <script>
50
- // ...
51
- import { mapGetters } from 'vuex'
52
- import AppCompJauge from './AppCompJauge'
53
- export default {
54
- components: {
55
- AppCompJauge
56
- },
57
- computed: {
58
- ...mapGetters([
59
- 'getAllActivities',
60
- 'getAllActivitiesState',
61
- 'getAllCompleted',
62
- 'getAppConfigs',
63
- 'getMenuSettings'
64
- ]),
65
- activities() {
66
- // get the data for list of the page for this module from the store and
67
- // get the route of the page from the router to build the menu with its routes
68
- let count = 0
69
- const collection = []
70
-
71
- this.getAllActivities.list.forEach((value, key) => {
72
- let theActivity,
73
- activityTitle,
74
- activitySubTitle,
75
- activityTime = null,
76
- activityPath = ''
77
-
78
- if (this.menuInfo[key]) {
79
- const { title, subTitle, time } = this.menuInfo[key] //get time subTitle time from menu info
80
- //set the title
81
- if (title && title != ' ') activityTitle = title
82
- //set the subtitle
83
- if (subTitle && subTitle != ' ') activitySubTitle = subTitle
84
- //set the time
85
- if (time && time != ' ') activityTime = time
86
- }
87
- // This is the Introduction
88
- if (key === 'A00') {
89
- activityTitle = activityTitle || this.$t('text.introduction')
90
- activityPath = 'introduction'
91
- } else if (key === 'A99') {
92
- activityTitle = activityTitle || this.$t('text.conclusion')
93
- activityPath = 'conclusion'
94
- } else {
95
- count++
96
- activityTitle =
97
- activityTitle || `${this.$t('text.activity')} ${count}`
98
- activityPath = `activite_${count}`
99
- }
100
-
101
- theActivity = {
102
- id: key,
103
- title: activityTitle,
104
- subtitle: activitySubTitle,
105
- time: activityTime,
106
- path: activityPath,
107
- data: value
108
- }
109
-
110
- collection.push(theActivity) // push the activity in the collection
111
- })
112
-
113
- return collection
114
- },
115
- menuInfo() {
116
- let menuInfo = this.getMenuSettings
117
- return menuInfo
118
- }
119
- },
120
- mounted() {},
121
- methods: {
122
- /**
123
- * @description Gives gives length of completed page for an activity
124
- * @param {String} idActivity
125
- * @returns {Number}
126
- */
127
- getPageComplete(idActivity) {
128
- /// give all the page that are complete to the gauge
129
- if (idActivity) {
130
- let completed = []
131
- if (this.getAllCompleted[idActivity]) {
132
- completed = this.getAllCompleted[idActivity] //get all completed page for the activity
133
- }
134
-
135
- return completed.length
136
- }
137
- },
138
- /**
139
- * @description give the size of the state of the activity
140
- * @param {String} activityID
141
- * @returns {Number} size
142
- */
143
- getActivitySize(activityID) {
144
- /*
145
- * Note:
146
- * 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
147
- * cf: https://reactgo.com/javascript-clone-object/
148
- */
149
-
150
- const allActivitiesState = JSON.parse(
151
- JSON.stringify(this.getAllActivitiesState)
152
- )
153
- let size = allActivitiesState[activityID]
154
- ? allActivitiesState[activityID].size
155
- : 0
156
-
157
- return size
158
- },
159
- createRoutes(data) {
160
- let activity
161
-
162
- if (data.charAt(1) == '0' || data.charAt(1) == 0) {
163
- activity = data.substr(2)
164
- } else {
165
- activity = data.substr(1)
166
- }
167
-
168
- if (activity == 0 && activity == '0') return `introduction`
169
- if (activity == '99') return `conclusion`
170
- else return `activite_${activity}`
171
- }
172
- }
173
- }
174
- </script>
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>