fcad-core-dragon 2.1.0 → 2.1.2
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.
- package/.editorconfig +7 -7
- package/.gitlab-ci.yml +124 -0
- package/.prettierrc +11 -11
- package/.vscode/extensions.json +8 -8
- package/.vscode/settings.json +46 -16
- package/CHANGELOG +520 -520
- package/README.md +57 -57
- package/documentation/.vitepress/config.js +114 -114
- package/documentation/api-examples.md +49 -49
- package/documentation/composants/app-base-button.md +58 -58
- package/documentation/composants/app-base-error-display.md +59 -59
- package/documentation/composants/app-base-popover.md +68 -68
- package/documentation/composants/app-comp-audio.md +75 -75
- package/documentation/composants/app-comp-branch-buttons.md +111 -111
- package/documentation/composants/app-comp-button-progress.md +53 -53
- package/documentation/composants/app-comp-carousel.md +53 -53
- package/documentation/composants/app-comp-container.md +53 -53
- package/documentation/composants/app-comp-input-checkbox-next.md +42 -42
- package/documentation/composants/app-comp-input-dropdown-next.md +34 -34
- package/documentation/composants/app-comp-input-radio-next.md +39 -39
- package/documentation/composants/app-comp-input-text-next.md +35 -35
- package/documentation/composants/app-comp-input-text-table-next.md +34 -34
- package/documentation/composants/app-comp-input-text-to-fill-dropdown-next.md +53 -53
- package/documentation/composants/app-comp-input-text-to-fill-next.md +31 -31
- package/documentation/composants/app-comp-jauge.md +31 -31
- package/documentation/composants/app-comp-menu-item.md +55 -55
- package/documentation/composants/app-comp-menu.md +29 -29
- package/documentation/composants/app-comp-navigation.md +41 -41
- package/documentation/composants/app-comp-note-call.md +53 -53
- package/documentation/composants/app-comp-note-credit.md +53 -53
- package/documentation/composants/app-comp-play-bar-next.md +53 -53
- package/documentation/composants/app-comp-pop-up-next.md +93 -93
- package/documentation/composants/app-comp-quiz-next.md +235 -235
- package/documentation/composants/app-comp-quiz-recall.md +53 -53
- package/documentation/composants/app-comp-svg-next.md +53 -53
- package/documentation/composants/app-comp-table-of-content.md +50 -50
- package/documentation/composants/app-comp-video-player.md +82 -82
- package/documentation/composants.md +46 -46
- package/documentation/composants_critiques/ModelPageComposant.md +53 -53
- package/documentation/composants_critiques/app-base-module.md +43 -43
- package/documentation/composants_critiques/app-base-page.md +48 -48
- package/documentation/composants_critiques/app-base.md +311 -311
- package/documentation/composants_critiques/main.md +15 -15
- package/documentation/demarrage.md +50 -50
- package/documentation/deploiement.md +57 -57
- package/documentation/index.md +33 -33
- package/documentation/markdown-examples.md +85 -85
- package/documentation/public/vite.svg +14 -14
- package/documentation/public/vuejs.svg +1 -1
- package/documentation/public/vuetify.svg +5 -5
- package/eslint.config.js +60 -60
- package/junit-report.xml +182 -0
- package/package.json +66 -59
- package/playwright/index.html +12 -0
- package/playwright/index.js +21 -0
- package/playwright-ct.config.js +95 -0
- package/src/$locales/en.json +157 -157
- package/src/$locales/fr.json +120 -120
- package/src/assets/data/onboardingMessages.json +47 -47
- package/src/components/AppBase.vue +1171 -1169
- package/src/components/AppBaseButton.vue +90 -95
- package/src/components/AppBaseErrorDisplay.vue +438 -438
- package/src/components/AppBaseFlipCard.vue +84 -84
- package/src/components/AppBaseModule.vue +1639 -1634
- package/src/components/AppBasePage.vue +3 -2
- package/src/components/AppBasePopover.vue +41 -41
- package/src/components/AppBaseSkeleton.vue +66 -66
- package/src/components/AppCompAudio.vue +261 -256
- package/src/components/AppCompBranchButtons.vue +508 -508
- package/src/components/AppCompButtonProgress.vue +137 -132
- package/src/components/AppCompCarousel.vue +342 -336
- package/src/components/AppCompContainer.vue +29 -29
- package/src/components/AppCompInputCheckBoxNx.vue +325 -323
- package/src/components/AppCompInputDropdownNx.vue +302 -299
- package/src/components/AppCompInputRadioNx.vue +287 -284
- package/src/components/AppCompInputTextNx.vue +156 -153
- package/src/components/AppCompInputTextTableNx.vue +205 -202
- package/src/components/AppCompInputTextToFillDropdownNx.vue +343 -340
- package/src/components/AppCompInputTextToFillNx.vue +316 -313
- package/src/components/AppCompJauge.vue +81 -81
- package/src/components/AppCompMenu.vue +6 -2
- package/src/components/AppCompMenuItem.vue +246 -240
- package/src/components/AppCompNavigation.vue +977 -972
- package/src/components/AppCompNoteCall.vue +167 -161
- package/src/components/AppCompNoteCredit.vue +496 -491
- package/src/components/AppCompPlayBarNext.vue +2290 -2288
- package/src/components/AppCompPopUpNext.vue +508 -504
- package/src/components/AppCompQuizNext.vue +515 -510
- package/src/components/AppCompQuizRecall.vue +355 -350
- package/src/components/AppCompSVGNext.vue +346 -346
- package/src/components/AppCompSettingsMenu.vue +177 -172
- package/src/components/AppCompTableOfContent.vue +433 -427
- package/src/components/AppCompVideoPlayer.vue +377 -377
- package/src/components/AppCompViewDisplay.vue +6 -6
- package/src/components/BaseModule.vue +55 -55
- package/src/composables/useIdleDetector.js +56 -56
- package/src/composables/useQuiz.js +89 -89
- package/src/composables/useTimer.js +172 -172
- package/src/directives/nvdaFix.js +53 -53
- package/src/externalComps/ModuleView.vue +22 -22
- package/src/externalComps/SummaryView.vue +91 -91
- package/src/main.js +493 -476
- package/src/module/stores/appStore.js +960 -947
- package/src/module/xapi/ADL.js +520 -520
- package/src/module/xapi/Crypto/Hasher.js +241 -241
- package/src/module/xapi/Crypto/WordArray.js +278 -278
- package/src/module/xapi/Crypto/algorithms/BufferedBlockAlgorithm.js +103 -103
- package/src/module/xapi/Crypto/algorithms/C_algo.js +315 -315
- package/src/module/xapi/Crypto/algorithms/HMAC.js +9 -9
- package/src/module/xapi/Crypto/algorithms/SHA1.js +9 -9
- package/src/module/xapi/Crypto/encoders/Base.js +105 -105
- package/src/module/xapi/Crypto/encoders/Base64.js +99 -99
- package/src/module/xapi/Crypto/encoders/Hex.js +61 -61
- package/src/module/xapi/Crypto/encoders/Latin1.js +61 -61
- package/src/module/xapi/Crypto/encoders/Utf8.js +45 -45
- package/src/module/xapi/Crypto/index.js +53 -53
- package/src/module/xapi/Statement/activity.js +47 -47
- package/src/module/xapi/Statement/agent.js +55 -55
- package/src/module/xapi/Statement/group.js +26 -26
- package/src/module/xapi/Statement/index.js +259 -259
- package/src/module/xapi/Statement/statement.js +253 -253
- package/src/module/xapi/Statement/statementRef.js +23 -23
- package/src/module/xapi/Statement/substatement.js +22 -22
- package/src/module/xapi/Statement/verb.js +36 -36
- package/src/module/xapi/activitytypes.js +17 -17
- package/src/module/xapi/launch.js +157 -157
- package/src/module/xapi/utils.js +167 -167
- package/src/module/xapi/verbs.js +294 -294
- package/src/module/xapi/wrapper.js +1895 -1895
- package/src/module/xapi/xapiStatement.js +444 -444
- package/src/plugins/analytics.js +34 -34
- package/src/plugins/bus.js +12 -8
- package/src/plugins/gsap.js +17 -15
- package/src/plugins/helper.js +355 -358
- package/src/plugins/i18n.js +27 -26
- package/src/plugins/idb.js +227 -227
- package/src/plugins/save.js +37 -37
- package/src/plugins/scorm.js +287 -287
- package/src/plugins/xapi.js +11 -11
- package/src/public/index.html +33 -33
- package/src/router/index.js +57 -57
- package/src/router/routes.js +312 -312
- package/src/shared/generalfuncs.js +344 -344
- package/src/shared/validators.js +1018 -1018
- package/tests/component/AppBaseButton.spec.js +53 -0
- package/tests/component/pinia.spec.js +24 -0
- package/{src/components/tests__ → tests/unit}/AppBaseButton.spec.js +53 -53
- package/tests/unit/AppCompInputCheckBoxNx.spec.js +59 -0
- package/tests/unit/AppCompInputDropdownNx.spec.js +51 -0
- package/tests/unit/AppCompInputRadioNx.spec.js +59 -0
- package/tests/unit/AppCompInputTextNx.spec.js +44 -0
- package/tests/unit/AppCompInputTextTableNx.spec.js +77 -0
- package/tests/unit/AppCompInputTextToFillDropdownNx.spec.js +60 -0
- package/tests/unit/AppCompInputTextToFillNx.spec.js +45 -0
- package/tests/unit/AppCompQuizNext.spec.js +114 -0
- package/tests/unit/AppCompVideoPlayer.spec.js +177 -0
- package/{src/components/tests__ → tests/unit}/useTimer.spec.js +91 -91
- package/vitest.config.js +28 -19
- package/vitest.setup.js +28 -0
- package/src/components/AppBaseButton.test.js +0 -21
|
@@ -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>
|
|
@@ -1,55 +1,55 @@
|
|
|
1
|
-
<!--
|
|
2
|
-
*@ Description: Root component used to extends the AppBase Module
|
|
3
|
-
*@ What it does: Entry point for the data of appBaseModule. manage progress, indexeDB connection.
|
|
4
|
-
*@Note :Must be used
|
|
5
|
-
-->
|
|
6
|
-
<template>
|
|
7
|
-
<div v-if="mData" class="module-wrapper">
|
|
8
|
-
<slot name="mTitle" />
|
|
9
|
-
<slot>Module</slot>
|
|
10
|
-
</div>
|
|
11
|
-
</template>
|
|
12
|
-
|
|
13
|
-
<script>
|
|
14
|
-
export default {
|
|
15
|
-
props: {
|
|
16
|
-
mData: {
|
|
17
|
-
type: Object,
|
|
18
|
-
required: true
|
|
19
|
-
}
|
|
20
|
-
},
|
|
21
|
-
|
|
22
|
-
data() {
|
|
23
|
-
return {
|
|
24
|
-
data: null
|
|
25
|
-
// over: false
|
|
26
|
-
// back: null
|
|
27
|
-
}
|
|
28
|
-
},
|
|
29
|
-
|
|
30
|
-
created() {},
|
|
31
|
-
methods: {}
|
|
32
|
-
}
|
|
33
|
-
</script>
|
|
34
|
-
|
|
35
|
-
<style lang="scss" scoped>
|
|
36
|
-
.module-wrapper {
|
|
37
|
-
width: 100%;
|
|
38
|
-
height: 100%;
|
|
39
|
-
min-height: 100vh;
|
|
40
|
-
padding: 0 145px;
|
|
41
|
-
}
|
|
42
|
-
.overlay-close-widget {
|
|
43
|
-
position: absolute;
|
|
44
|
-
top: 0;
|
|
45
|
-
left: 0;
|
|
46
|
-
width: 100%;
|
|
47
|
-
height: 100%;
|
|
48
|
-
z-index: 2;
|
|
49
|
-
display: none;
|
|
50
|
-
|
|
51
|
-
&.blockOverlay {
|
|
52
|
-
display: block;
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
</style>
|
|
1
|
+
<!--
|
|
2
|
+
*@ Description: Root component used to extends the AppBase Module
|
|
3
|
+
*@ What it does: Entry point for the data of appBaseModule. manage progress, indexeDB connection.
|
|
4
|
+
*@Note :Must be used
|
|
5
|
+
-->
|
|
6
|
+
<template>
|
|
7
|
+
<div v-if="mData" class="module-wrapper">
|
|
8
|
+
<slot name="mTitle" />
|
|
9
|
+
<slot>Module</slot>
|
|
10
|
+
</div>
|
|
11
|
+
</template>
|
|
12
|
+
|
|
13
|
+
<script>
|
|
14
|
+
export default {
|
|
15
|
+
props: {
|
|
16
|
+
mData: {
|
|
17
|
+
type: Object,
|
|
18
|
+
required: true
|
|
19
|
+
}
|
|
20
|
+
},
|
|
21
|
+
|
|
22
|
+
data() {
|
|
23
|
+
return {
|
|
24
|
+
data: null
|
|
25
|
+
// over: false
|
|
26
|
+
// back: null
|
|
27
|
+
}
|
|
28
|
+
},
|
|
29
|
+
|
|
30
|
+
created() {},
|
|
31
|
+
methods: {}
|
|
32
|
+
}
|
|
33
|
+
</script>
|
|
34
|
+
|
|
35
|
+
<style lang="scss" scoped>
|
|
36
|
+
.module-wrapper {
|
|
37
|
+
width: 100%;
|
|
38
|
+
height: 100%;
|
|
39
|
+
min-height: 100vh;
|
|
40
|
+
padding: 0 145px;
|
|
41
|
+
}
|
|
42
|
+
.overlay-close-widget {
|
|
43
|
+
position: absolute;
|
|
44
|
+
top: 0;
|
|
45
|
+
left: 0;
|
|
46
|
+
width: 100%;
|
|
47
|
+
height: 100%;
|
|
48
|
+
z-index: 2;
|
|
49
|
+
display: none;
|
|
50
|
+
|
|
51
|
+
&.blockOverlay {
|
|
52
|
+
display: block;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
</style>
|
|
@@ -1,56 +1,56 @@
|
|
|
1
|
-
export class IdleDetector {
|
|
2
|
-
constructor() {
|
|
3
|
-
this.idleCounter = 0
|
|
4
|
-
this.idleTimeoutID = null
|
|
5
|
-
this.detectorState = 'stopped' // can be 'pause' or 'stop'
|
|
6
|
-
this.idleTimer = null
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* @description Start the idle timer -
|
|
11
|
-
* creates an interval to track idle time and a timeout to trigger actions
|
|
12
|
-
* after a specified period of inactivity.
|
|
13
|
-
* @param {Function} action - a callback function to execute when the idle timeout is reached.
|
|
14
|
-
* @param {Number} timeout - the duration in milliseconds before the action is triggered.
|
|
15
|
-
*/
|
|
16
|
-
startIdleTimer(action = null, timeout = 0) {
|
|
17
|
-
this.idleTimer = setInterval(() => {
|
|
18
|
-
this.idleCounter += 1
|
|
19
|
-
}, 1000)
|
|
20
|
-
this.detectorState = 'started'
|
|
21
|
-
|
|
22
|
-
if (!action || typeof action !== 'function') return
|
|
23
|
-
|
|
24
|
-
this.idleTimeoutID = setTimeout(() => action(), timeout)
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
/**
|
|
28
|
-
* @description Reset the idle timer -
|
|
29
|
-
* clears the current idle timer and timeout,
|
|
30
|
-
*/
|
|
31
|
-
stopIdleTimer() {
|
|
32
|
-
this.idleCounter = 0
|
|
33
|
-
clearInterval(this.idleTimer)
|
|
34
|
-
clearTimeout(this.idleTimeoutID)
|
|
35
|
-
this.detectorState = 'stopped'
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
/**
|
|
39
|
-
* @description Get the current state of the timer
|
|
40
|
-
*
|
|
41
|
-
* @returns {String} - timer state, can be 'started' or 'stopped'
|
|
42
|
-
*/
|
|
43
|
-
getDectorState() {
|
|
44
|
-
return this.detectorState
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
/**
|
|
48
|
-
* @description Get the elapsed time for the idle timer.
|
|
49
|
-
* This is the time the idle detector has been running since it was started.
|
|
50
|
-
*
|
|
51
|
-
* @returns {Number} - the time count in seconds
|
|
52
|
-
*/
|
|
53
|
-
getElapsedTime() {
|
|
54
|
-
return this.idleCounter
|
|
55
|
-
}
|
|
56
|
-
}
|
|
1
|
+
export class IdleDetector {
|
|
2
|
+
constructor() {
|
|
3
|
+
this.idleCounter = 0
|
|
4
|
+
this.idleTimeoutID = null
|
|
5
|
+
this.detectorState = 'stopped' // can be 'pause' or 'stop'
|
|
6
|
+
this.idleTimer = null
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* @description Start the idle timer -
|
|
11
|
+
* creates an interval to track idle time and a timeout to trigger actions
|
|
12
|
+
* after a specified period of inactivity.
|
|
13
|
+
* @param {Function} action - a callback function to execute when the idle timeout is reached.
|
|
14
|
+
* @param {Number} timeout - the duration in milliseconds before the action is triggered.
|
|
15
|
+
*/
|
|
16
|
+
startIdleTimer(action = null, timeout = 0) {
|
|
17
|
+
this.idleTimer = setInterval(() => {
|
|
18
|
+
this.idleCounter += 1
|
|
19
|
+
}, 1000)
|
|
20
|
+
this.detectorState = 'started'
|
|
21
|
+
|
|
22
|
+
if (!action || typeof action !== 'function') return
|
|
23
|
+
|
|
24
|
+
this.idleTimeoutID = setTimeout(() => action(), timeout)
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* @description Reset the idle timer -
|
|
29
|
+
* clears the current idle timer and timeout,
|
|
30
|
+
*/
|
|
31
|
+
stopIdleTimer() {
|
|
32
|
+
this.idleCounter = 0
|
|
33
|
+
clearInterval(this.idleTimer)
|
|
34
|
+
clearTimeout(this.idleTimeoutID)
|
|
35
|
+
this.detectorState = 'stopped'
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* @description Get the current state of the timer
|
|
40
|
+
*
|
|
41
|
+
* @returns {String} - timer state, can be 'started' or 'stopped'
|
|
42
|
+
*/
|
|
43
|
+
getDectorState() {
|
|
44
|
+
return this.detectorState
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* @description Get the elapsed time for the idle timer.
|
|
49
|
+
* This is the time the idle detector has been running since it was started.
|
|
50
|
+
*
|
|
51
|
+
* @returns {Number} - the time count in seconds
|
|
52
|
+
*/
|
|
53
|
+
getElapsedTime() {
|
|
54
|
+
return this.idleCounter
|
|
55
|
+
}
|
|
56
|
+
}
|
|
@@ -1,89 +1,89 @@
|
|
|
1
|
-
//This composable should Extend the functionality of a the quiz
|
|
2
|
-
|
|
3
|
-
import
|
|
4
|
-
|
|
5
|
-
export function useQuiz() {
|
|
6
|
-
const { t } =
|
|
7
|
-
/**
|
|
8
|
-
* @description shuffles an array used to randomized the option order if shuffleAnswers is true
|
|
9
|
-
* @param {Array} array
|
|
10
|
-
* @returns {Array}
|
|
11
|
-
*/
|
|
12
|
-
function shuffleArray(array) {
|
|
13
|
-
let newArray = []
|
|
14
|
-
let newArray2 = []
|
|
15
|
-
|
|
16
|
-
for (let i = 0; i < array.length; i++) {
|
|
17
|
-
const element = array[i]
|
|
18
|
-
newArray.push(element)
|
|
19
|
-
}
|
|
20
|
-
while (newArray.length > 0) {
|
|
21
|
-
let pos = Math.floor(newArray.length * Math.random())
|
|
22
|
-
newArray2.push(newArray[pos])
|
|
23
|
-
newArray.splice(pos, 1)
|
|
24
|
-
}
|
|
25
|
-
return newArray2
|
|
26
|
-
}
|
|
27
|
-
/**
|
|
28
|
-
* @description add retro style to the quiz
|
|
29
|
-
* @param {Object} solution - the solution of the quiz
|
|
30
|
-
* @param {Array} reponse - the user response
|
|
31
|
-
* @param {Number} length - the length of the input value
|
|
32
|
-
* @returns {Object|Boolean}
|
|
33
|
-
*/
|
|
34
|
-
function addRetroStyle(solution, reponse, length) {
|
|
35
|
-
let classRetro = []
|
|
36
|
-
let mesA11y = []
|
|
37
|
-
if (solution != null) {
|
|
38
|
-
reponse.forEach((el) => {
|
|
39
|
-
if (el.correct == true) {
|
|
40
|
-
classRetro.push('goodAnswer')
|
|
41
|
-
mesA11y.push(`${t('quizState.goodAnswer')}`)
|
|
42
|
-
} else {
|
|
43
|
-
classRetro.push('badAnswer')
|
|
44
|
-
mesA11y.push(`${t('quizState.badAnswer')}`)
|
|
45
|
-
}
|
|
46
|
-
})
|
|
47
|
-
} else {
|
|
48
|
-
classRetro.push('NeutralAnswer')
|
|
49
|
-
mesA11y.push(`${t('quizState.neutralAnswer')}`)
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
return { classRetro, mesA11y }
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
/**
|
|
56
|
-
* @description reset the list of validation style of a quiz
|
|
57
|
-
* @param {Array} aList - a list of array to reset
|
|
58
|
-
* @emits hide-retro - event message to hide the retro Message
|
|
59
|
-
* $el- the target quiz,
|
|
60
|
-
* false|true of th event
|
|
61
|
-
* */
|
|
62
|
-
function resetRetroStyle(aList) {
|
|
63
|
-
aList.forEach((a) => {
|
|
64
|
-
if (a && a.length > 0) a.splice(0)
|
|
65
|
-
})
|
|
66
|
-
this.$bus.$emit('hide-retro', this.$el, false)
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
function retroType(solution, reponse) {
|
|
70
|
-
if (solution != null) {
|
|
71
|
-
if (reponse.length == solution.length) {
|
|
72
|
-
let Ag = (i) => i.correct
|
|
73
|
-
if (reponse.every(Ag)) return 'retro_positive'
|
|
74
|
-
else return 'retro_negative'
|
|
75
|
-
} else {
|
|
76
|
-
return 'retro_negative'
|
|
77
|
-
}
|
|
78
|
-
} else {
|
|
79
|
-
return `retro_neutre`
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
return {
|
|
84
|
-
addRetroStyle,
|
|
85
|
-
resetRetroStyle,
|
|
86
|
-
retroType,
|
|
87
|
-
shuffleArray
|
|
88
|
-
}
|
|
89
|
-
}
|
|
1
|
+
//This composable should Extend the functionality of a the quiz
|
|
2
|
+
|
|
3
|
+
import { useI18n } from 'vue-i18n' //Must import directly the local from project app because vue-18in does not work in legacy mode with composable
|
|
4
|
+
|
|
5
|
+
export function useQuiz() {
|
|
6
|
+
const { t } = useI18n()
|
|
7
|
+
/**
|
|
8
|
+
* @description shuffles an array used to randomized the option order if shuffleAnswers is true
|
|
9
|
+
* @param {Array} array
|
|
10
|
+
* @returns {Array}
|
|
11
|
+
*/
|
|
12
|
+
function shuffleArray(array) {
|
|
13
|
+
let newArray = []
|
|
14
|
+
let newArray2 = []
|
|
15
|
+
|
|
16
|
+
for (let i = 0; i < array.length; i++) {
|
|
17
|
+
const element = array[i]
|
|
18
|
+
newArray.push(element)
|
|
19
|
+
}
|
|
20
|
+
while (newArray.length > 0) {
|
|
21
|
+
let pos = Math.floor(newArray.length * Math.random())
|
|
22
|
+
newArray2.push(newArray[pos])
|
|
23
|
+
newArray.splice(pos, 1)
|
|
24
|
+
}
|
|
25
|
+
return newArray2
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* @description add retro style to the quiz
|
|
29
|
+
* @param {Object} solution - the solution of the quiz
|
|
30
|
+
* @param {Array} reponse - the user response
|
|
31
|
+
* @param {Number} length - the length of the input value
|
|
32
|
+
* @returns {Object|Boolean}
|
|
33
|
+
*/
|
|
34
|
+
function addRetroStyle(solution, reponse, length) {
|
|
35
|
+
let classRetro = []
|
|
36
|
+
let mesA11y = []
|
|
37
|
+
if (solution != null) {
|
|
38
|
+
reponse.forEach((el) => {
|
|
39
|
+
if (el.correct == true) {
|
|
40
|
+
classRetro.push('goodAnswer')
|
|
41
|
+
mesA11y.push(`${t('quizState.goodAnswer')}`)
|
|
42
|
+
} else {
|
|
43
|
+
classRetro.push('badAnswer')
|
|
44
|
+
mesA11y.push(`${t('quizState.badAnswer')}`)
|
|
45
|
+
}
|
|
46
|
+
})
|
|
47
|
+
} else {
|
|
48
|
+
classRetro.push('NeutralAnswer')
|
|
49
|
+
mesA11y.push(`${t('quizState.neutralAnswer')}`)
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
return { classRetro, mesA11y }
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* @description reset the list of validation style of a quiz
|
|
57
|
+
* @param {Array} aList - a list of array to reset
|
|
58
|
+
* @emits hide-retro - event message to hide the retro Message
|
|
59
|
+
* $el- the target quiz,
|
|
60
|
+
* false|true of th event
|
|
61
|
+
* */
|
|
62
|
+
function resetRetroStyle(aList) {
|
|
63
|
+
aList.forEach((a) => {
|
|
64
|
+
if (a && a.length > 0) a.splice(0)
|
|
65
|
+
})
|
|
66
|
+
this.$bus.$emit('hide-retro', this.$el, false)
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
function retroType(solution, reponse) {
|
|
70
|
+
if (solution != null) {
|
|
71
|
+
if (reponse.length == solution.length) {
|
|
72
|
+
let Ag = (i) => i.correct
|
|
73
|
+
if (reponse.every(Ag)) return 'retro_positive'
|
|
74
|
+
else return 'retro_negative'
|
|
75
|
+
} else {
|
|
76
|
+
return 'retro_negative'
|
|
77
|
+
}
|
|
78
|
+
} else {
|
|
79
|
+
return `retro_neutre`
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
return {
|
|
84
|
+
addRetroStyle,
|
|
85
|
+
resetRetroStyle,
|
|
86
|
+
retroType,
|
|
87
|
+
shuffleArray
|
|
88
|
+
}
|
|
89
|
+
}
|