fcad-core-dragon 2.0.0-beta.3 β†’ 2.0.0-beta.4

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 (95) hide show
  1. package/.editorconfig +33 -33
  2. package/.eslintignore +29 -29
  3. package/.eslintrc.cjs +81 -81
  4. package/CHANGELOG +373 -364
  5. package/README.md +71 -71
  6. package/bk.scss +117 -117
  7. package/package.json +61 -61
  8. package/src/$locales/en.json +143 -143
  9. package/src/$locales/fr.json +105 -105
  10. package/src/assets/data/onboardingMessages.json +47 -47
  11. package/src/components/AppBase.vue +1147 -1054
  12. package/src/components/AppBaseButton.vue +87 -87
  13. package/src/components/AppBaseErrorDisplay.vue +438 -438
  14. package/src/components/AppBaseFlipCard.vue +84 -84
  15. package/src/components/AppBaseModule.vue +1636 -1673
  16. package/src/components/AppBasePage.vue +779 -779
  17. package/src/components/AppBasePopover.vue +41 -41
  18. package/src/components/AppCompAudio.vue +234 -234
  19. package/src/components/AppCompBranchButtons.vue +552 -552
  20. package/src/components/AppCompButtonProgress.vue +126 -126
  21. package/src/components/AppCompCarousel.vue +298 -298
  22. package/src/components/AppCompInputCheckBoxNext.vue +195 -195
  23. package/src/components/AppCompInputDropdownNext.vue +159 -159
  24. package/src/components/AppCompInputRadioNext.vue +152 -152
  25. package/src/components/AppCompInputTextNext.vue +106 -106
  26. package/src/components/AppCompInputTextTableNext.vue +141 -141
  27. package/src/components/AppCompInputTextToFillDropdownNext.vue +230 -230
  28. package/src/components/AppCompInputTextToFillNext.vue +171 -171
  29. package/src/components/AppCompJauge.vue +74 -74
  30. package/src/components/AppCompMenu.vue +423 -413
  31. package/src/components/AppCompMenuItem.vue +228 -228
  32. package/src/components/AppCompNavigation.vue +959 -960
  33. package/src/components/AppCompNoteCall.vue +133 -133
  34. package/src/components/AppCompNoteCredit.vue +292 -292
  35. package/src/components/AppCompPlayBar.vue +1218 -1218
  36. package/src/components/AppCompPlayBarNext.vue +2052 -2052
  37. package/src/components/AppCompPlayBarProgress.vue +82 -82
  38. package/src/components/AppCompPopUpNext.vue +503 -503
  39. package/src/components/AppCompQuizNext.vue +2904 -2904
  40. package/src/components/AppCompQuizRecall.vue +276 -276
  41. package/src/components/AppCompSVGNext.vue +347 -347
  42. package/src/components/AppCompSettingsMenu.vue +172 -172
  43. package/src/components/AppCompTableOfContent.vue +387 -387
  44. package/src/components/AppCompTranscript.vue +24 -24
  45. package/src/components/AppCompVideoPlayer.vue +368 -368
  46. package/src/components/AppCompViewDisplay.vue +6 -6
  47. package/src/components/BaseModule.vue +72 -72
  48. package/src/composables/useQuiz.js +206 -206
  49. package/src/externalComps/ModuleView.vue +22 -22
  50. package/src/externalComps/SummaryView.vue +91 -91
  51. package/src/main.js +272 -272
  52. package/src/mixins/$mediaMixins.js +819 -819
  53. package/src/mixins/timerMixin.js +155 -155
  54. package/src/module/stores/appStore.js +901 -893
  55. package/src/module/xapi/ADL.js +380 -376
  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 -315
  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 -1963
  81. package/src/module/xapi/xapiStatement.js +444 -444
  82. package/src/plugins/bus.js +8 -8
  83. package/src/plugins/gsap.js +14 -14
  84. package/src/plugins/helper.js +314 -308
  85. package/src/plugins/i18n.js +44 -44
  86. package/src/plugins/idb.js +227 -219
  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 -33
  91. package/src/router/index.js +43 -43
  92. package/src/router/routes.js +312 -312
  93. package/src/shared/generalfuncs.js +210 -210
  94. package/src/shared/validators.js +1069 -1069
  95. package/vite.config.js +0 -27
@@ -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 }