fcad-core-dragon 2.0.0-beta.5 β†’ 2.0.0-beta.7

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 (70) hide show
  1. package/.editorconfig +33 -33
  2. package/.eslintignore +29 -29
  3. package/.eslintrc.cjs +81 -81
  4. package/CHANGELOG +395 -377
  5. package/README.md +71 -71
  6. package/bk.scss +117 -117
  7. package/package.json +61 -61
  8. package/src/$locales/en.json +23 -25
  9. package/src/$locales/fr.json +22 -23
  10. package/src/assets/data/onboardingMessages.json +47 -47
  11. package/src/components/AppBase.vue +166 -99
  12. package/src/components/AppBaseButton.vue +2 -0
  13. package/src/components/AppBaseErrorDisplay.vue +438 -438
  14. package/src/components/AppBaseFlipCard.vue +84 -84
  15. package/src/components/AppBaseModule.vue +124 -106
  16. package/src/components/AppBasePage.vue +14 -4
  17. package/src/components/AppBasePopover.vue +41 -41
  18. package/src/components/AppCompAudio.vue +20 -48
  19. package/src/components/AppCompBranchButtons.vue +7 -53
  20. package/src/components/{AppCompTranscript.vue β†’ AppCompContainer.vue} +8 -1
  21. package/src/components/AppCompInputRadioNext.vue +152 -152
  22. package/src/components/AppCompInputTextToFillNext.vue +171 -171
  23. package/src/components/AppCompJauge.vue +74 -74
  24. package/src/components/AppCompMenu.vue +429 -428
  25. package/src/components/AppCompMenuItem.vue +228 -228
  26. package/src/components/AppCompNavigation.vue +2 -2
  27. package/src/components/AppCompPlayBarNext.vue +5 -0
  28. package/src/components/AppCompPlayBarProgress.vue +82 -82
  29. package/src/components/AppCompSVGNext.vue +2 -3
  30. package/src/components/AppCompSettingsMenu.vue +172 -172
  31. package/src/components/AppCompVideoPlayer.vue +17 -15
  32. package/src/composables/useQuiz.js +206 -206
  33. package/src/externalComps/ModuleView.vue +22 -22
  34. package/src/externalComps/SummaryView.vue +91 -91
  35. package/src/main.js +34 -29
  36. package/src/mixins/$mediaMixins.js +819 -819
  37. package/src/mixins/timerMixin.js +155 -155
  38. package/src/module/stores/appStore.js +1 -1
  39. package/src/module/xapi/ADL.js +144 -4
  40. package/src/module/xapi/Crypto/Hasher.js +241 -241
  41. package/src/module/xapi/Crypto/WordArray.js +278 -278
  42. package/src/module/xapi/Crypto/algorithms/BufferedBlockAlgorithm.js +103 -103
  43. package/src/module/xapi/Crypto/algorithms/C_algo.js +315 -315
  44. package/src/module/xapi/Crypto/algorithms/HMAC.js +9 -9
  45. package/src/module/xapi/Crypto/algorithms/SHA1.js +9 -9
  46. package/src/module/xapi/Crypto/encoders/Base.js +105 -105
  47. package/src/module/xapi/Crypto/encoders/Base64.js +99 -99
  48. package/src/module/xapi/Crypto/encoders/Hex.js +61 -61
  49. package/src/module/xapi/Crypto/encoders/Latin1.js +61 -61
  50. package/src/module/xapi/Crypto/encoders/Utf8.js +45 -45
  51. package/src/module/xapi/Statement/agent.js +55 -55
  52. package/src/module/xapi/Statement/index.js +259 -259
  53. package/src/module/xapi/Statement/statement.js +253 -253
  54. package/src/module/xapi/utils.js +167 -167
  55. package/src/module/xapi/verbs.js +294 -294
  56. package/src/module/xapi/wrapper copy.js +1963 -0
  57. package/src/module/xapi/wrapper.js +121 -188
  58. package/src/module/xapi/xapiStatement.js +444 -444
  59. package/src/plugins/bus.js +8 -8
  60. package/src/plugins/gsap.js +14 -14
  61. package/src/plugins/helper.js +0 -1
  62. package/src/plugins/i18n.js +44 -44
  63. package/src/plugins/save.js +37 -37
  64. package/src/plugins/scorm.js +287 -287
  65. package/src/plugins/xapi.js +11 -11
  66. package/src/public/index.html +33 -33
  67. package/src/router/index.js +2 -1
  68. package/src/shared/generalfuncs.js +210 -210
  69. package/src/shared/validators.js +2 -0
  70. package/src/components/AppCompPlayBar.vue +0 -1217
@@ -30,7 +30,8 @@ router.beforeResolve((to, from, next) => {
30
30
  if (getPopupIsOpen) app.config.globalProperties.$bus.$emit('close-popup') //close the popup
31
31
  if (getSidebarIsOpen) app.config.globalProperties.$bus.$emit('close-sidebar') //close the sidebar
32
32
 
33
- app.config.globalProperties.$bus.$emit('update-route-history', from)
33
+ if (from.name !== 'module')
34
+ app.config.globalProperties.$bus.$emit('update-route-history', from)
34
35
  app.config.globalProperties.$bus.$emit('update-content', to, from, next)
35
36
 
36
37
  if (noNavigationToMenu && to.name == 'menu') {
@@ -1,210 +1,210 @@
1
- // const allfile = require.context('@/', true, /\.vue$/) //get all .vue file at the root of the project where lib will be installed
2
- const allfile = import.meta.glob(['@/**/*.vue', '!@/**/_*'], {
3
- eager: true
4
- }) //get all .vue file at the root of the project where lib will be installed
5
-
6
- const allfileKeys = Object.keys(allfile)
7
-
8
- //console.log('ALL PATHS', fileArray)
9
- allfileKeys.forEach(function (key, index, array) {
10
- array[index] = {
11
- name: key.replace('/src', '.').replace('.vue', ''),
12
- fullPath: allfile[key].default.__file,
13
- content: allfile[key].default
14
- }
15
- })
16
-
17
- const fileAssets = {
18
- // return the collection of all the files in the project directory
19
- allFiles: () => allfileKeys,
20
-
21
- // Return all the file in './views' with the Name Module
22
- getViews: () => {
23
- return fileAssets
24
- .allFiles()
25
- .filter(
26
- (file) =>
27
- file.name.startsWith('./views') &&
28
- !file.name.split('/')[2].includes('copy')
29
- )
30
- },
31
- // return all files that are in the folder './src/module' of the project with name respecting following condition:
32
- // must start with a capital P followed by a digit (P0, P1, P2...) and not contain keyword "copy"
33
- getActivities: () => {
34
- return fileAssets.allFiles().filter((file) => {
35
- if (
36
- file.name.startsWith('./module/A') &&
37
- /^P[0-9]{2,3}/.test(file.name.split('/')[3]) &&
38
- !file.name.split('/')[3].includes('copy')
39
- )
40
- return true
41
- else return false
42
- })
43
- },
44
-
45
- // search a specific file and return its content
46
- fetchFileContent: (file) => allfile[file].default,
47
-
48
- /**
49
- * @description Validator for the content of menu setting file
50
- * @param {String} fName- name of the file for use case
51
- * @param {Object} fData: file's data to validate
52
- * @param {Object} [requiredArgs] list of arguments to include consider in validation ()
53
- */
54
- validatefileContent: (fName, fData, requiredArgs = {}) => {
55
- let err = null
56
- if (import.meta.env.DEV) {
57
- switch (fName) {
58
- case 'menuSettings': {
59
- const { keys4Activity, keys4Anchors } = requiredArgs
60
-
61
- //*validate that data is an {Object}. if Not send error message
62
- if (fData.constructor !== Object)
63
- err = 'πŸ’₯Invalid file provided for menu settings'
64
-
65
- if (Object.entries(fData).length > 0) {
66
- const content = Object.entries(fData)
67
-
68
- for (let el of content) {
69
- // validate that the content of each entry is an object
70
- if (el[1].constructor !== Object || !Object.keys(el[1]).length) {
71
- err = `πŸ’₯ invalid data provided for key πŸ‘‰ ${el[0]} πŸ‘ˆ in ➑ menu.setting.js \n 🚩Must be of type {Object}`
72
- break
73
- }
74
- }
75
- // Validate that each entry has the required key
76
- if (!err) {
77
- for (let el of content) {
78
- const entry = el[1]
79
- for (let k of keys4Activity) {
80
- if (!entry[k]) {
81
- err = `πŸ’₯ Missing πŸ‘‰ ${k} πŸ‘ˆ in ${el[0]} in ➑ menu.setting.js \n 🚩Allowed indexes are: πŸ‘‰ ${keys4Activity}`
82
- break
83
- } else {
84
- //validate that each entry as correct value type
85
- switch (k) {
86
- case 'anchors':
87
- if (entry[k].constructor !== Array)
88
- err = `πŸ’₯ Invalid anchors declaration for πŸ‘‰ ${el[0]} πŸ‘ˆ in ➑ menu.setting.j \n 🚩Must be of type {Array}`
89
- else {
90
- const anchors = entry.anchors
91
-
92
- for (let a of anchors) {
93
- //trow error if numbers of keys are not the same as required
94
- const a_numb = anchors.indexOf(a) + 1
95
- if (Object.keys(a).length !== keys4Anchors.length) {
96
- err = `πŸ’₯ Invalid declaration in πŸ‘‰anchor ${a_numb}πŸ‘ˆ for ➑ ${el[0]} in ➑ menu.setting.js \n 🚩 Allowed indexes are: πŸ‘‰ ${keys4Anchors}`
97
- break
98
- }
99
- // Validated that required keys condition and type is met
100
- for (let k of keys4Anchors) {
101
- if (!a[k]) {
102
- err = `πŸ’₯ Missing πŸ‘‰ ${k} πŸ‘ˆ for anchor ${a_numb} ➑ ${el[0]} ➑ menu.setting.js \n 🚩 Allowed indexes are: πŸ‘‰ ${keys4Anchors}`
103
- } else if (a[k].constructor !== String) {
104
- err = `πŸ’₯ Invalid πŸ‘‰ ${k} πŸ‘ˆ declaration for anchor ${a_numb} ➑ ${el[0]} ➑ menu.setting.js \n 🚩 Must be of type {String}`
105
- }
106
- if (err) break
107
- }
108
- if (err) break
109
- }
110
- }
111
-
112
- break
113
- default:
114
- if (entry[k].constructor !== String)
115
- err = `Invalid πŸ‘‰ ${k} πŸ‘ˆ declaration for ➑ ${el[0]} in ➑ menu.setting.js \n 🚩 Must be of type {String}`
116
- break
117
- }
118
- }
119
- }
120
-
121
- if (err) break
122
- }
123
- }
124
- }
125
- break
126
- }
127
- }
128
- }
129
- return err
130
- },
131
-
132
- /**
133
- * @description Validator for the content of menu setting file
134
- * @param {String} a- array of file for use case
135
- * @param {Object} [requiredArgs] list of arguments to include consider in validation ()
136
- */
137
- buildMapTree: (a) => {
138
- // Load files in module folder
139
-
140
- if (a.length < 0) return
141
-
142
- const mapTree = new Map()
143
- // There is a file in the module folder
144
-
145
- a.forEach((e) => {
146
- const fileRef = e.name.replace(/(\.\/)/g, '')
147
- const splitted = fileRef.split('/')
148
- const activityName = splitted[1]
149
- const fileName = splitted[splitted.length - 1].replace(/(\.vue)/g, '')
150
- const fileContent = e.content
151
- if (!Object.keys(fileContent).includes('data')) return
152
- // Handling single page type
153
- // adding the page in a map for the Pages
154
-
155
- // Add the key in the map for the routes if it is not in the map, with its data as new Map;
156
- if (!mapTree.get(activityName)) {
157
- mapTree.set(activityName, new Map())
158
- }
159
-
160
- if (fileName.length === 3) {
161
- mapTree.get(activityName).set(fileName, {
162
- ref: fileRef,
163
- content: fileContent.data(),
164
- fullPath: e.fullPath
165
- }) // add entry for the page
166
- }
167
- // Handleling Groupe page type
168
- else if (fileName.length > 3 && fileName.includes('_')) {
169
- const keyToFind = fileName.split('_', 1)[0] // Pxx
170
- const KeyToAdd = fileName.split('_')[1] // Exx
171
-
172
- // // search for the page key in the map
173
- if (!mapTree.get(activityName).has(keyToFind)) return
174
-
175
- // save a reference for the value of the key
176
- const tempSave = mapTree.get(activityName).get(keyToFind)
177
-
178
- // transform value of found key to a new map
179
- if (!mapTree.get(activityName).get(keyToFind).size) {
180
- mapTree.get(activityName).set(keyToFind, new Map())
181
- // Update reference of key's
182
- mapTree.get(activityName).get(keyToFind).set(keyToFind, tempSave)
183
- }
184
-
185
- // Add page EXX in Map if it is not already added
186
- if (!mapTree.get(activityName).get(keyToFind).get(KeyToAdd))
187
- mapTree.get(activityName).get(keyToFind).set(fileName, {
188
- ref: fileRef,
189
- content: fileContent.data(),
190
- fullPath: e.fullPath
191
- })
192
- }
193
- })
194
-
195
- return mapTree
196
- },
197
-
198
- /**
199
- * @description Capitalize word in string
200
- * @param {String} a- array of file for use case
201
- * @param {Object} [requiredArgs] list of arguments to include consider in validation ()
202
- */
203
- capitalize: (string) => {
204
- let formatted = string.replaceAll('_', ' ').toLowerCase()
205
- formatted = `${formatted.substring(0, 1).toUpperCase()}${formatted.slice(1).toLowerCase()}`
206
- return formatted
207
- }
208
- }
209
-
210
- export { fileAssets }
1
+ // const allfile = require.context('@/', true, /\.vue$/) //get all .vue file at the root of the project where lib will be installed
2
+ const allfile = import.meta.glob(['@/**/*.vue', '!@/**/_*'], {
3
+ eager: true
4
+ }) //get all .vue file at the root of the project where lib will be installed
5
+
6
+ const allfileKeys = Object.keys(allfile)
7
+
8
+ //console.log('ALL PATHS', fileArray)
9
+ allfileKeys.forEach(function (key, index, array) {
10
+ array[index] = {
11
+ name: key.replace('/src', '.').replace('.vue', ''),
12
+ fullPath: allfile[key].default.__file,
13
+ content: allfile[key].default
14
+ }
15
+ })
16
+
17
+ const fileAssets = {
18
+ // return the collection of all the files in the project directory
19
+ allFiles: () => allfileKeys,
20
+
21
+ // Return all the file in './views' with the Name Module
22
+ getViews: () => {
23
+ return fileAssets
24
+ .allFiles()
25
+ .filter(
26
+ (file) =>
27
+ file.name.startsWith('./views') &&
28
+ !file.name.split('/')[2].includes('copy')
29
+ )
30
+ },
31
+ // return all files that are in the folder './src/module' of the project with name respecting following condition:
32
+ // must start with a capital P followed by a digit (P0, P1, P2...) and not contain keyword "copy"
33
+ getActivities: () => {
34
+ return fileAssets.allFiles().filter((file) => {
35
+ if (
36
+ file.name.startsWith('./module/A') &&
37
+ /^P[0-9]{2,3}/.test(file.name.split('/')[3]) &&
38
+ !file.name.split('/')[3].includes('copy')
39
+ )
40
+ return true
41
+ else return false
42
+ })
43
+ },
44
+
45
+ // search a specific file and return its content
46
+ fetchFileContent: (file) => allfile[file].default,
47
+
48
+ /**
49
+ * @description Validator for the content of menu setting file
50
+ * @param {String} fName- name of the file for use case
51
+ * @param {Object} fData: file's data to validate
52
+ * @param {Object} [requiredArgs] list of arguments to include consider in validation ()
53
+ */
54
+ validatefileContent: (fName, fData, requiredArgs = {}) => {
55
+ let err = null
56
+ if (import.meta.env.DEV) {
57
+ switch (fName) {
58
+ case 'menuSettings': {
59
+ const { keys4Activity, keys4Anchors } = requiredArgs
60
+
61
+ //*validate that data is an {Object}. if Not send error message
62
+ if (fData.constructor !== Object)
63
+ err = 'πŸ’₯Invalid file provided for menu settings'
64
+
65
+ if (Object.entries(fData).length > 0) {
66
+ const content = Object.entries(fData)
67
+
68
+ for (let el of content) {
69
+ // validate that the content of each entry is an object
70
+ if (el[1].constructor !== Object || !Object.keys(el[1]).length) {
71
+ err = `πŸ’₯ invalid data provided for key πŸ‘‰ ${el[0]} πŸ‘ˆ in ➑ menu.setting.js \n 🚩Must be of type {Object}`
72
+ break
73
+ }
74
+ }
75
+ // Validate that each entry has the required key
76
+ if (!err) {
77
+ for (let el of content) {
78
+ const entry = el[1]
79
+ for (let k of keys4Activity) {
80
+ if (!entry[k]) {
81
+ err = `πŸ’₯ Missing πŸ‘‰ ${k} πŸ‘ˆ in ${el[0]} in ➑ menu.setting.js \n 🚩Allowed indexes are: πŸ‘‰ ${keys4Activity}`
82
+ break
83
+ } else {
84
+ //validate that each entry as correct value type
85
+ switch (k) {
86
+ case 'anchors':
87
+ if (entry[k].constructor !== Array)
88
+ err = `πŸ’₯ Invalid anchors declaration for πŸ‘‰ ${el[0]} πŸ‘ˆ in ➑ menu.setting.j \n 🚩Must be of type {Array}`
89
+ else {
90
+ const anchors = entry.anchors
91
+
92
+ for (let a of anchors) {
93
+ //trow error if numbers of keys are not the same as required
94
+ const a_numb = anchors.indexOf(a) + 1
95
+ if (Object.keys(a).length !== keys4Anchors.length) {
96
+ err = `πŸ’₯ Invalid declaration in πŸ‘‰anchor ${a_numb}πŸ‘ˆ for ➑ ${el[0]} in ➑ menu.setting.js \n 🚩 Allowed indexes are: πŸ‘‰ ${keys4Anchors}`
97
+ break
98
+ }
99
+ // Validated that required keys condition and type is met
100
+ for (let k of keys4Anchors) {
101
+ if (!a[k]) {
102
+ err = `πŸ’₯ Missing πŸ‘‰ ${k} πŸ‘ˆ for anchor ${a_numb} ➑ ${el[0]} ➑ menu.setting.js \n 🚩 Allowed indexes are: πŸ‘‰ ${keys4Anchors}`
103
+ } else if (a[k].constructor !== String) {
104
+ err = `πŸ’₯ Invalid πŸ‘‰ ${k} πŸ‘ˆ declaration for anchor ${a_numb} ➑ ${el[0]} ➑ menu.setting.js \n 🚩 Must be of type {String}`
105
+ }
106
+ if (err) break
107
+ }
108
+ if (err) break
109
+ }
110
+ }
111
+
112
+ break
113
+ default:
114
+ if (entry[k].constructor !== String)
115
+ err = `Invalid πŸ‘‰ ${k} πŸ‘ˆ declaration for ➑ ${el[0]} in ➑ menu.setting.js \n 🚩 Must be of type {String}`
116
+ break
117
+ }
118
+ }
119
+ }
120
+
121
+ if (err) break
122
+ }
123
+ }
124
+ }
125
+ break
126
+ }
127
+ }
128
+ }
129
+ return err
130
+ },
131
+
132
+ /**
133
+ * @description Validator for the content of menu setting file
134
+ * @param {String} a- array of file for use case
135
+ * @param {Object} [requiredArgs] list of arguments to include consider in validation ()
136
+ */
137
+ buildMapTree: (a) => {
138
+ // Load files in module folder
139
+
140
+ if (a.length < 0) return
141
+
142
+ const mapTree = new Map()
143
+ // There is a file in the module folder
144
+
145
+ a.forEach((e) => {
146
+ const fileRef = e.name.replace(/(\.\/)/g, '')
147
+ const splitted = fileRef.split('/')
148
+ const activityName = splitted[1]
149
+ const fileName = splitted[splitted.length - 1].replace(/(\.vue)/g, '')
150
+ const fileContent = e.content
151
+ if (!Object.keys(fileContent).includes('data')) return
152
+ // Handling single page type
153
+ // adding the page in a map for the Pages
154
+
155
+ // Add the key in the map for the routes if it is not in the map, with its data as new Map;
156
+ if (!mapTree.get(activityName)) {
157
+ mapTree.set(activityName, new Map())
158
+ }
159
+
160
+ if (fileName.length === 3) {
161
+ mapTree.get(activityName).set(fileName, {
162
+ ref: fileRef,
163
+ content: fileContent.data(),
164
+ fullPath: e.fullPath
165
+ }) // add entry for the page
166
+ }
167
+ // Handleling Groupe page type
168
+ else if (fileName.length > 3 && fileName.includes('_')) {
169
+ const keyToFind = fileName.split('_', 1)[0] // Pxx
170
+ const KeyToAdd = fileName.split('_')[1] // Exx
171
+
172
+ // // search for the page key in the map
173
+ if (!mapTree.get(activityName).has(keyToFind)) return
174
+
175
+ // save a reference for the value of the key
176
+ const tempSave = mapTree.get(activityName).get(keyToFind)
177
+
178
+ // transform value of found key to a new map
179
+ if (!mapTree.get(activityName).get(keyToFind).size) {
180
+ mapTree.get(activityName).set(keyToFind, new Map())
181
+ // Update reference of key's
182
+ mapTree.get(activityName).get(keyToFind).set(keyToFind, tempSave)
183
+ }
184
+
185
+ // Add page EXX in Map if it is not already added
186
+ if (!mapTree.get(activityName).get(keyToFind).get(KeyToAdd))
187
+ mapTree.get(activityName).get(keyToFind).set(fileName, {
188
+ ref: fileRef,
189
+ content: fileContent.data(),
190
+ fullPath: e.fullPath
191
+ })
192
+ }
193
+ })
194
+
195
+ return mapTree
196
+ },
197
+
198
+ /**
199
+ * @description Capitalize word in string
200
+ * @param {String} a- array of file for use case
201
+ * @param {Object} [requiredArgs] list of arguments to include consider in validation ()
202
+ */
203
+ capitalize: (string) => {
204
+ let formatted = string.replaceAll('_', ' ').toLowerCase()
205
+ formatted = `${formatted.substring(0, 1).toUpperCase()}${formatted.slice(1).toLowerCase()}`
206
+ return formatted
207
+ }
208
+ }
209
+
210
+ export { fileAssets }
@@ -347,6 +347,7 @@ const validateAudioData = (data) => {
347
347
  }
348
348
  //** Validate if all the properties are right**/
349
349
  let wrongProperties = checkerWrong(allProperties, currentProperties)
350
+
350
351
  if (wrongProperties.length > 0) {
351
352
  console.warn(
352
353
  `%c WARNING!>>> AppCompAudio : audData property ${wrongProperties} invalid. Required properties: ${requiredProperties} . Optional properties: ${optionalProperties}`,
@@ -359,6 +360,7 @@ const validateAudioData = (data) => {
359
360
 
360
361
  //** Validate if all the required properties are in the data */
361
362
  let missingRequired = checkerMissing(requiredProperties, currentProperties)
363
+
362
364
  if (missingRequired.length > 0) {
363
365
  console.warn(
364
366
  `%c WARNING!>>> AppCompAudio : audData missing required ${missingRequired} property. Required properties: ${requiredProperties} . Optional properties: ${optionalProperties}`,