fcad-core-dragon 2.1.0-beta.4 → 2.1.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 (70) hide show
  1. package/.editorconfig +8 -33
  2. package/.prettierrc +11 -0
  3. package/.vscode/extensions.json +8 -0
  4. package/.vscode/settings.json +16 -0
  5. package/CHANGELOG +20 -0
  6. package/eslint.config.js +60 -0
  7. package/package.json +9 -9
  8. package/src/$locales/en.json +3 -3
  9. package/src/$locales/fr.json +3 -3
  10. package/src/assets/data/onboardingMessages.json +47 -47
  11. package/src/components/AppBase.vue +5 -6
  12. package/src/components/AppBaseErrorDisplay.vue +438 -438
  13. package/src/components/AppBaseFlipCard.vue +84 -84
  14. package/src/components/AppBaseModule.vue +15 -17
  15. package/src/components/AppBasePage.vue +866 -783
  16. package/src/components/AppBasePopover.vue +41 -41
  17. package/src/components/AppBaseSkeleton.vue +24 -3
  18. package/src/components/AppCompAudio.vue +12 -2
  19. package/src/components/AppCompInputCheckBoxNx.vue +1 -2
  20. package/src/components/AppCompInputRadioNx.vue +8 -2
  21. package/src/components/AppCompInputTextToFillDropdownNx.vue +45 -0
  22. package/src/components/AppCompMenu.vue +424 -423
  23. package/src/components/AppCompNavigation.vue +2 -2
  24. package/src/components/AppCompPlayBarNext.vue +123 -94
  25. package/src/components/AppCompPopUpNext.vue +2 -2
  26. package/src/components/AppCompQuizNext.vue +12 -2
  27. package/src/components/AppCompQuizRecall.vue +10 -4
  28. package/src/components/AppCompSettingsMenu.vue +172 -172
  29. package/src/components/AppCompTableOfContent.vue +1 -4
  30. package/src/components/AppCompVideoPlayer.vue +7 -0
  31. package/src/components/AppCompViewDisplay.vue +6 -6
  32. package/src/composables/useTimer.js +17 -20
  33. package/src/externalComps/ModuleView.vue +22 -22
  34. package/src/externalComps/SummaryView.vue +91 -91
  35. package/src/module/stores/appStore.js +0 -1
  36. package/src/module/xapi/Crypto/Hasher.js +241 -241
  37. package/src/module/xapi/Crypto/WordArray.js +278 -278
  38. package/src/module/xapi/Crypto/algorithms/BufferedBlockAlgorithm.js +103 -103
  39. package/src/module/xapi/Crypto/algorithms/C_algo.js +315 -315
  40. package/src/module/xapi/Crypto/algorithms/HMAC.js +9 -9
  41. package/src/module/xapi/Crypto/algorithms/SHA1.js +9 -9
  42. package/src/module/xapi/Crypto/encoders/Base.js +105 -105
  43. package/src/module/xapi/Crypto/encoders/Base64.js +99 -99
  44. package/src/module/xapi/Crypto/encoders/Hex.js +61 -61
  45. package/src/module/xapi/Crypto/encoders/Latin1.js +61 -61
  46. package/src/module/xapi/Crypto/encoders/Utf8.js +45 -45
  47. package/src/module/xapi/Crypto/index.js +53 -53
  48. package/src/module/xapi/Statement/activity.js +47 -47
  49. package/src/module/xapi/Statement/agent.js +55 -55
  50. package/src/module/xapi/Statement/group.js +26 -26
  51. package/src/module/xapi/Statement/index.js +259 -259
  52. package/src/module/xapi/Statement/statement.js +253 -253
  53. package/src/module/xapi/Statement/statementRef.js +23 -23
  54. package/src/module/xapi/Statement/substatement.js +22 -22
  55. package/src/module/xapi/Statement/verb.js +36 -36
  56. package/src/module/xapi/activitytypes.js +17 -17
  57. package/src/module/xapi/utils.js +167 -167
  58. package/src/module/xapi/verbs.js +294 -294
  59. package/src/module/xapi/xapiStatement.js +444 -444
  60. package/src/plugins/bus.js +8 -8
  61. package/src/plugins/helper.js +4 -0
  62. package/src/plugins/save.js +37 -37
  63. package/src/plugins/scorm.js +287 -287
  64. package/src/plugins/xapi.js +11 -11
  65. package/src/public/index.html +33 -33
  66. package/src/router/index.js +1 -1
  67. package/src/shared/validators.js +22 -6
  68. package/.eslintignore +0 -29
  69. package/.eslintrc.cjs +0 -81
  70. package/bk.scss +0 -117
@@ -1,172 +1,172 @@
1
- <template>
2
- <b-sidebar
3
- id="sidebar-settings"
4
- title="Settings"
5
- right
6
- shadow
7
- backdrop
8
- no-header
9
- @hidden="onClose"
10
- >
11
- <div class="pl-3 pr-3">
12
- <b-form-group :label="$t('user_settings.title')">
13
- <b-form-checkbox
14
- v-for="(setting, index) in Object.entries(settingsSelected)"
15
- :key="index"
16
- v-model="settingsSelected[setting[0]]"
17
- :aria-describedby="ariaDescribedby"
18
- :name="`parameter-${setting[0]}`"
19
- :text-field="$t(`user_settings.${setting[0]}`)"
20
- switch
21
- stacked
22
- size="lg"
23
- @change="onSettingsChange"
24
- >
25
- <span>{{ $t(`user_settings.${setting[0]}`) }}</span>
26
- </b-form-checkbox>
27
- </b-form-group>
28
- <app-base-button
29
- v-b-toggle.sidebar-settings
30
- class="float-right btn-primary"
31
- :title="$t('user_settings.close')"
32
- >
33
- {{ $t('user_settings.close') }}
34
- </app-base-button>
35
- </div>
36
- </b-sidebar>
37
- </template>
38
-
39
- <script>
40
- import { mapState, mapActions } from 'pinia'
41
- import { useAppStore } from '../module/stores/appStore'
42
- import AppBaseButton from './AppBaseButton.vue'
43
-
44
- export default {
45
- components: { AppBaseButton },
46
- props: {},
47
- data() {
48
- return {
49
- settingsSelected: {},
50
- settingsNeedUpdate: false
51
- }
52
- },
53
- computed: {
54
- ...mapState(useAppStore, [
55
- 'getApplicationSettings',
56
- 'getModuleInfo',
57
- 'getUserInteraction',
58
- 'getConnectionInfo',
59
- 'onboardingEnabled'
60
- ]),
61
- settingsOptions() {
62
- return this.settingsOptionsELPlus
63
- }
64
- },
65
- watch: {
66
- getApplicationSettings: {
67
- immediate: true,
68
- deep: true,
69
- handler() {
70
- this.getAppSettingsInStore()
71
- }
72
- }
73
- },
74
- created() {
75
- setTimeout(() => this.getAppSettingsInStore(), 1700)
76
-
77
- this.$bus.$on('save-settings', (settings) => {
78
- this.saveSettings(settings)
79
- })
80
- },
81
- methods: {
82
- ...mapActions(useAppStore, [
83
- 'setApplicationSettings',
84
- 'updateUserMetaData'
85
- ]),
86
- getAppSettingsInStore() {
87
- this.settingsSelected = { ...this.getApplicationSettings }
88
- },
89
-
90
- //Save user settings to the store
91
- onSettingsChange() {
92
- this.settingsNeedUpdate = true
93
- this.saveSettingsToStore(this.settingsSelected)
94
- },
95
- saveSettingsToStore(settings) {
96
- this.setApplicationSettings(settings)
97
- },
98
- /**
99
- * @description Save the user preferred settings to vue store and LRS or local store:
100
- * LRS: Send a XAPI Statement to the LRS
101
- * IndexedDB: Set a new Key for preferred settings in the userInteraction in store
102
- * Update current value of settings
103
- * @param {Object} appSettings - group of application settings {autoplay, subtitles, onboarding}
104
- *
105
- */
106
- saveSettings(appSettings) {
107
- this.saveSettingsToStore(appSettings) //save to store
108
-
109
- if (
110
- this.getModuleInfo.packageType === 'xapi' &&
111
- this.getConnectionInfo &&
112
- this.getConnectionInfo.remote
113
- ) {
114
- let text
115
- //Defining the text to display for stmt description and definition
116
- switch (this.$i18n.locale) {
117
- case 'fr':
118
- if (this.getModuleInfo.courseID)
119
- text = `Le ${this.getModuleInfo.id} de ${this.getModuleInfo.courseID}`
120
- else text = `Le ${this.getModuleInfo.id}`
121
- break
122
- case 'en':
123
- if (this.getModuleInfo.courseID)
124
- text = `The ${this.getModuleInfo.id} of ${this.getModuleInfo.courseID}`
125
- else text = `The ${this.getModuleInfo.id}`
126
- break
127
- }
128
- //Creating custom statement
129
- const stmt = {
130
- id: (() => {
131
- return this.getModuleInfo.courseID
132
- ? this.getModuleInfo.courseID
133
- : null
134
- })(),
135
- verb: 'preferred',
136
- definition: text,
137
- description: text,
138
- extensions: [
139
- {
140
- id: 'application-settings',
141
- content: {
142
- userSettings: { ...appSettings }
143
- }
144
- }
145
- ]
146
- }
147
-
148
- setTimeout(() => {
149
- this.$bus.$emit('send-xapi-statement', stmt) //send xapi statement
150
- }, 1000)
151
- } else {
152
- this.$set(this.getUserInteraction, 'userSettings', appSettings) // adding the usersettings to user Interaction to save to save to the local DB
153
- this.updateUserMetaData(this.getUserInteraction) //force update of the userInteraction to ensure saving of settings in local DB
154
- }
155
-
156
- //update sidebar data
157
- this.getAppSettingsInStore()
158
- },
159
-
160
- /**
161
- * @description -Action to perform when the sidebar closed- will require saving when changing occurred
162
- */
163
- onClose() {
164
- if (this.settingsNeedUpdate) {
165
- this.saveSettingsToStore(this.settingsSelected)
166
- this.saveSettings(this.getApplicationSettings)
167
- this.settingsNeedUpdate = false
168
- }
169
- }
170
- }
171
- }
172
- </script>
1
+ <template>
2
+ <b-sidebar
3
+ id="sidebar-settings"
4
+ title="Settings"
5
+ right
6
+ shadow
7
+ backdrop
8
+ no-header
9
+ @hidden="onClose"
10
+ >
11
+ <div class="pl-3 pr-3">
12
+ <b-form-group :label="$t('user_settings.title')">
13
+ <b-form-checkbox
14
+ v-for="(setting, index) in Object.entries(settingsSelected)"
15
+ :key="index"
16
+ v-model="settingsSelected[setting[0]]"
17
+ :aria-describedby="ariaDescribedby"
18
+ :name="`parameter-${setting[0]}`"
19
+ :text-field="$t(`user_settings.${setting[0]}`)"
20
+ switch
21
+ stacked
22
+ size="lg"
23
+ @change="onSettingsChange"
24
+ >
25
+ <span>{{ $t(`user_settings.${setting[0]}`) }}</span>
26
+ </b-form-checkbox>
27
+ </b-form-group>
28
+ <app-base-button
29
+ v-b-toggle.sidebar-settings
30
+ class="float-right btn-primary"
31
+ :title="$t('user_settings.close')"
32
+ >
33
+ {{ $t('user_settings.close') }}
34
+ </app-base-button>
35
+ </div>
36
+ </b-sidebar>
37
+ </template>
38
+
39
+ <script>
40
+ import { mapState, mapActions } from 'pinia'
41
+ import { useAppStore } from '../module/stores/appStore'
42
+ import AppBaseButton from './AppBaseButton.vue'
43
+
44
+ export default {
45
+ components: { AppBaseButton },
46
+ props: {},
47
+ data() {
48
+ return {
49
+ settingsSelected: {},
50
+ settingsNeedUpdate: false
51
+ }
52
+ },
53
+ computed: {
54
+ ...mapState(useAppStore, [
55
+ 'getApplicationSettings',
56
+ 'getModuleInfo',
57
+ 'getUserInteraction',
58
+ 'getConnectionInfo',
59
+ 'onboardingEnabled'
60
+ ]),
61
+ settingsOptions() {
62
+ return this.settingsOptionsELPlus
63
+ }
64
+ },
65
+ watch: {
66
+ getApplicationSettings: {
67
+ immediate: true,
68
+ deep: true,
69
+ handler() {
70
+ this.getAppSettingsInStore()
71
+ }
72
+ }
73
+ },
74
+ created() {
75
+ setTimeout(() => this.getAppSettingsInStore(), 1700)
76
+
77
+ this.$bus.$on('save-settings', (settings) => {
78
+ this.saveSettings(settings)
79
+ })
80
+ },
81
+ methods: {
82
+ ...mapActions(useAppStore, [
83
+ 'setApplicationSettings',
84
+ 'updateUserMetaData'
85
+ ]),
86
+ getAppSettingsInStore() {
87
+ this.settingsSelected = { ...this.getApplicationSettings }
88
+ },
89
+
90
+ //Save user settings to the store
91
+ onSettingsChange() {
92
+ this.settingsNeedUpdate = true
93
+ this.saveSettingsToStore(this.settingsSelected)
94
+ },
95
+ saveSettingsToStore(settings) {
96
+ this.setApplicationSettings(settings)
97
+ },
98
+ /**
99
+ * @description Save the user preferred settings to vue store and LRS or local store:
100
+ * LRS: Send a XAPI Statement to the LRS
101
+ * IndexedDB: Set a new Key for preferred settings in the userInteraction in store
102
+ * Update current value of settings
103
+ * @param {Object} appSettings - group of application settings {autoplay, subtitles, onboarding}
104
+ *
105
+ */
106
+ saveSettings(appSettings) {
107
+ this.saveSettingsToStore(appSettings) //save to store
108
+
109
+ if (
110
+ this.getModuleInfo.packageType === 'xapi' &&
111
+ this.getConnectionInfo &&
112
+ this.getConnectionInfo.remote
113
+ ) {
114
+ let text
115
+ //Defining the text to display for stmt description and definition
116
+ switch (this.$i18n.locale) {
117
+ case 'fr':
118
+ if (this.getModuleInfo.courseID)
119
+ text = `Le ${this.getModuleInfo.id} de ${this.getModuleInfo.courseID}`
120
+ else text = `Le ${this.getModuleInfo.id}`
121
+ break
122
+ case 'en':
123
+ if (this.getModuleInfo.courseID)
124
+ text = `The ${this.getModuleInfo.id} of ${this.getModuleInfo.courseID}`
125
+ else text = `The ${this.getModuleInfo.id}`
126
+ break
127
+ }
128
+ //Creating custom statement
129
+ const stmt = {
130
+ id: (() => {
131
+ return this.getModuleInfo.courseID
132
+ ? this.getModuleInfo.courseID
133
+ : null
134
+ })(),
135
+ verb: 'preferred',
136
+ definition: text,
137
+ description: text,
138
+ extensions: [
139
+ {
140
+ id: 'application-settings',
141
+ content: {
142
+ userSettings: { ...appSettings }
143
+ }
144
+ }
145
+ ]
146
+ }
147
+
148
+ setTimeout(() => {
149
+ this.$bus.$emit('send-xapi-statement', stmt) //send xapi statement
150
+ }, 1000)
151
+ } else {
152
+ this.$set(this.getUserInteraction, 'userSettings', appSettings) // adding the usersettings to user Interaction to save to save to the local DB
153
+ this.updateUserMetaData(this.getUserInteraction) //force update of the userInteraction to ensure saving of settings in local DB
154
+ }
155
+
156
+ //update sidebar data
157
+ this.getAppSettingsInStore()
158
+ },
159
+
160
+ /**
161
+ * @description -Action to perform when the sidebar closed- will require saving when changing occurred
162
+ */
163
+ onClose() {
164
+ if (this.settingsNeedUpdate) {
165
+ this.saveSettingsToStore(this.settingsSelected)
166
+ this.saveSettings(this.getApplicationSettings)
167
+ this.settingsNeedUpdate = false
168
+ }
169
+ }
170
+ }
171
+ }
172
+ </script>
@@ -332,13 +332,10 @@ export default {
332
332
  flex-direction: column;
333
333
  }
334
334
 
335
- // .sidebar-submenu-content {
336
- // display: flex;
337
- // flex-direction: column;
338
- // }
339
335
  #close-toc {
340
336
  position: absolute;
341
337
  right: 24px;
338
+ top: 24px;
342
339
  margin-bottom: 0;
343
340
  padding: 12px;
344
341
  width: 48px;
@@ -367,4 +367,11 @@ $widthVideo: 100%;
367
367
  background-color: hsl(200, 20%, 95%);
368
368
  }
369
369
  }
370
+
371
+ .debug{
372
+
373
+ &:focus{
374
+ border: 5px solid rgba(#fff, 0.05);
375
+ }
376
+ }
370
377
  </style>
@@ -1,6 +1,6 @@
1
- <template>
2
- <router-view />
3
- </template>
4
- <script>
5
- export default {}
6
- </script>
1
+ <template>
2
+ <router-view />
3
+ </template>
4
+ <script>
5
+ export default {}
6
+ </script>
@@ -7,7 +7,7 @@ export class Timer {
7
7
  this.elapsedCounter = 0 //elapsed time counter how lofg the timer is running
8
8
  this.interval = null //interval for the timer
9
9
  this.timerState = 'stopped' //state of the timer, can be 'started' or 'stopped'
10
- Timer.timers.set(this.timerID, this) // Store the timer in the static map
10
+ Timer.timers.set(this.timerID, this) // Store the timer in the static map
11
11
  }
12
12
 
13
13
  /**
@@ -20,7 +20,6 @@ export class Timer {
20
20
  this.elapsedCounter += 1
21
21
  }, 1000)
22
22
  this.timerState = 'started'
23
-
24
23
  }
25
24
  }
26
25
 
@@ -39,12 +38,11 @@ export class Timer {
39
38
  this.timeCounter = 0
40
39
  this.elapsedCounter = 0
41
40
  this.timerState = 'stopped'
42
-
43
41
  }
44
42
  }
45
43
 
46
44
  /** @description Destroy the timer instance */
47
- destroy() {
45
+ destroy() {
48
46
  this.pause()
49
47
  Timer.timers.delete(this.timerID)
50
48
  }
@@ -54,23 +52,24 @@ export class Timer {
54
52
  return this.timerID
55
53
  }
56
54
 
57
- /**
58
- *
59
- * @description retrive a timer instance by its ID
60
- * If no ID is provided, it returns the current timer instance.
61
- * @param {String} id - the ID of the timer to retrieve
62
- * If no ID is provided, it returns the current timer instance.
63
- *
64
- * @throws {Error} - if the timer with the specified ID does not exist
65
- *
66
- * @returns {Timer} - the timer instance
67
- */
68
- getTimer(id=null) {
55
+ /**
56
+ *
57
+ * @description retrive a timer instance by its ID
58
+ * If no ID is provided, it returns the current timer instance.
59
+ * @param {String} id - the ID of the timer to retrieve
60
+ * If no ID is provided, it returns the current timer instance.
61
+ *
62
+ * @throws {Error} - if the timer with the specified ID does not exist
63
+ *
64
+ * @returns {Timer} - the timer instance
65
+ */
66
+ getTimer(id = null) {
69
67
  if (!id) {
70
68
  console.warn('No timer ID provided. Returning the current timer.')
71
69
  return this
72
70
  }
73
- if (!Timer.timers.has(id)) throw new Error(`Timer with ID ${id} does not exist.`)
71
+ if (!Timer.timers.has(id))
72
+ throw new Error(`Timer with ID ${id} does not exist.`)
74
73
  return Timer.timers.get(id)
75
74
  }
76
75
 
@@ -101,7 +100,6 @@ export class Timer {
101
100
  return this.elapsedCounter
102
101
  }
103
102
 
104
-
105
103
  /**
106
104
  * @description Get all existing timers
107
105
  *
@@ -109,7 +107,7 @@ export class Timer {
109
107
  */
110
108
 
111
109
  static getAllTimers() {
112
- return Timer.timers
110
+ return Timer.timers
113
111
  }
114
112
 
115
113
  /**
@@ -130,7 +128,6 @@ export class Timer {
130
128
  return id
131
129
  }
132
130
 
133
-
134
131
  /**
135
132
  * @description Format seconds to ISO 8601 format
136
133
  * Example of ISO 8601 time format of 24 chars: "1970-01-04T14:50:00.000Z"
@@ -1,22 +1,22 @@
1
- <template>
2
- <app-base-module :module-config="$data" />
3
- </template>
4
-
5
- <script>
6
- export default {
7
- data() {
8
- return {
9
- id: 'module_99',
10
- consigneBehavior: 'onHover', //Controle the behavior of desplaying instruction
11
- bookmarkActive: true, // Controle the use of saved point
12
- allowNavigationToActivity: null
13
-
14
- //main:''// Edit to define the ID of the node that will be main. When skipping to main content in the page.
15
- }
16
- },
17
- created() {
18
- this.allowNavigationToActivity =
19
- this.$helper.getSettingsFromStore('auto_next_activity')
20
- }
21
- }
22
- </script>
1
+ <template>
2
+ <app-base-module :module-config="$data" />
3
+ </template>
4
+
5
+ <script>
6
+ export default {
7
+ data() {
8
+ return {
9
+ id: 'module_99',
10
+ consigneBehavior: 'onHover', //Controle the behavior of desplaying instruction
11
+ bookmarkActive: true, // Controle the use of saved point
12
+ allowNavigationToActivity: null
13
+
14
+ //main:''// Edit to define the ID of the node that will be main. When skipping to main content in the page.
15
+ }
16
+ },
17
+ created() {
18
+ this.allowNavigationToActivity =
19
+ this.$helper.getSettingsFromStore('auto_next_activity')
20
+ }
21
+ }
22
+ </script>