fcad-core-dragon 2.0.0 → 2.0.1-beta.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.
- package/.editorconfig +33 -33
- package/.eslintignore +29 -29
- package/.eslintrc.cjs +81 -81
- package/README.md +57 -72
- package/bk.scss +117 -117
- package/package.json +1 -1
- package/src/assets/data/onboardingMessages.json +47 -47
- package/src/components/AppBaseErrorDisplay.vue +438 -438
- package/src/components/AppBaseFlipCard.vue +84 -84
- package/src/components/AppBasePopover.vue +41 -41
- package/src/components/AppCompInputDropdownNext.vue +1 -1
- package/src/components/AppCompInputRadioNext.vue +152 -152
- package/src/components/AppCompInputTextToFillNext.vue +171 -171
- package/src/components/AppCompJauge.vue +74 -74
- package/src/components/AppCompPlayBarProgress.vue +82 -82
- package/src/components/AppCompSettingsMenu.vue +172 -172
- package/src/components/AppCompViewDisplay.vue +6 -6
- package/src/composables/useQuiz.js +206 -206
- package/src/externalComps/ModuleView.vue +22 -22
- package/src/externalComps/SummaryView.vue +91 -91
- package/src/mixins/$mediaMixins.js +819 -819
- 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/utils.js +167 -167
- package/src/module/xapi/verbs.js +294 -294
- package/src/module/xapi/xapiStatement.js +444 -444
- package/src/plugins/bus.js +8 -8
- package/src/plugins/gsap.js +14 -14
- package/src/plugins/i18n.js +44 -44
- 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/shared/generalfuncs.js +210 -210
|
@@ -1,171 +1,171 @@
|
|
|
1
|
-
<!-- About this Component--
|
|
2
|
-
* Renders a Series of inputs to collect input for the Quiz component.
|
|
3
|
-
* Related Quiz to question: TEXTE_TROUE
|
|
4
|
-
* Receives the a data object defined by user
|
|
5
|
-
* Used by AppCompQuizNext
|
|
6
|
-
* Uses useQuiz composable
|
|
7
|
-
-->
|
|
8
|
-
<template>
|
|
9
|
-
<div class="input-box">
|
|
10
|
-
<div
|
|
11
|
-
v-for="textInput in theInputData"
|
|
12
|
-
:key="textInput.id"
|
|
13
|
-
class="texteatrou"
|
|
14
|
-
>
|
|
15
|
-
<span v-if="!textInput.type" v-html="textInput.content"></span>
|
|
16
|
-
<label
|
|
17
|
-
:for="`${inputDataId}_${textInput.id}-champ`"
|
|
18
|
-
style="display: none"
|
|
19
|
-
>
|
|
20
|
-
{{ $t('text.quiz') }}
|
|
21
|
-
</label>
|
|
22
|
-
<v-text-field
|
|
23
|
-
v-if="textInput.type == 'inputText'"
|
|
24
|
-
:id="`${inputDataId}_${textInput.id}-champ`"
|
|
25
|
-
v-model="quizInputTypeValue[textInput.id]"
|
|
26
|
-
:placeholder="$t('text.place_holder.for_textarea')"
|
|
27
|
-
:disabled="quizLimitActive"
|
|
28
|
-
no-resize
|
|
29
|
-
:class="classInput(textInput.id, quizInputTypeValue)"
|
|
30
|
-
class="input-textatrou"
|
|
31
|
-
:aria-describedby="`${inputDataId}_${textInput.id}-msg-erreur`"
|
|
32
|
-
:aria-labelledby="`${inputDataId}_${textInput.id}-label`"
|
|
33
|
-
/>
|
|
34
|
-
<span :id="`${inputDataId}_${textInput.id}-msg-erreur`" class="sr-only">
|
|
35
|
-
{{ messageAccessibility(textInput.id, quizInputTypeValue) }}
|
|
36
|
-
</span>
|
|
37
|
-
</div>
|
|
38
|
-
</div>
|
|
39
|
-
</template>
|
|
40
|
-
<script>
|
|
41
|
-
import { useQuiz } from '../composables/useQuiz'
|
|
42
|
-
import { toRefs } from 'vue'
|
|
43
|
-
export default {
|
|
44
|
-
name: 'AppCompInputTextToFillNext',
|
|
45
|
-
props: {
|
|
46
|
-
quizType: {
|
|
47
|
-
type: String,
|
|
48
|
-
default: ''
|
|
49
|
-
},
|
|
50
|
-
inputDataId: {
|
|
51
|
-
type: String,
|
|
52
|
-
default: ''
|
|
53
|
-
},
|
|
54
|
-
inputData: {
|
|
55
|
-
type: Array,
|
|
56
|
-
default: () => []
|
|
57
|
-
},
|
|
58
|
-
inputType: {
|
|
59
|
-
type: String,
|
|
60
|
-
default: ''
|
|
61
|
-
},
|
|
62
|
-
textBase: {
|
|
63
|
-
type: String,
|
|
64
|
-
default: ''
|
|
65
|
-
},
|
|
66
|
-
quizInputType: {
|
|
67
|
-
type: Array,
|
|
68
|
-
default: () => []
|
|
69
|
-
},
|
|
70
|
-
solution: {
|
|
71
|
-
type: Array,
|
|
72
|
-
default: () => []
|
|
73
|
-
},
|
|
74
|
-
showSolution: {
|
|
75
|
-
type: Boolean,
|
|
76
|
-
default: false
|
|
77
|
-
},
|
|
78
|
-
quizLimitActive: {
|
|
79
|
-
type: Boolean,
|
|
80
|
-
default: false
|
|
81
|
-
}, //use to set if quiz should be active or not
|
|
82
|
-
quizSubmit: {
|
|
83
|
-
type: Boolean,
|
|
84
|
-
default: false
|
|
85
|
-
} //use to call a submit
|
|
86
|
-
},
|
|
87
|
-
emits: ['input-change'],
|
|
88
|
-
setup(props) {
|
|
89
|
-
const { shuffleArray, classInput, messageAccessibility } = useQuiz(
|
|
90
|
-
toRefs(props)
|
|
91
|
-
)
|
|
92
|
-
return { shuffleArray, classInput, messageAccessibility }
|
|
93
|
-
},
|
|
94
|
-
data() {
|
|
95
|
-
return {
|
|
96
|
-
quizInputTypeValue: [], //not using quizInputType because quizInputType is a prop
|
|
97
|
-
theInputData: [], //to create the list of drop down and text mixed togeter
|
|
98
|
-
quizSolution: null
|
|
99
|
-
}
|
|
100
|
-
},
|
|
101
|
-
|
|
102
|
-
watch: {
|
|
103
|
-
/**
|
|
104
|
-
* @description to pass value to AppCompQuiz
|
|
105
|
-
* @fires input-change to AppCompQuiz.vue
|
|
106
|
-
*/
|
|
107
|
-
quizInputTypeValue: {
|
|
108
|
-
deep: true,
|
|
109
|
-
handler(newValue) {
|
|
110
|
-
this.$emit('input-change', newValue)
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
},
|
|
114
|
-
|
|
115
|
-
mounted() {
|
|
116
|
-
this.initQuiz()
|
|
117
|
-
},
|
|
118
|
-
|
|
119
|
-
methods: {
|
|
120
|
-
initQuiz() {
|
|
121
|
-
this.quizSolution = this.solution
|
|
122
|
-
if (this.quizSolution !== null) {
|
|
123
|
-
this.quizSolution.sort(function (a, b) {
|
|
124
|
-
return a - b
|
|
125
|
-
})
|
|
126
|
-
}
|
|
127
|
-
let textChoices = []
|
|
128
|
-
|
|
129
|
-
const regex = /\$%\S*%\$/g // regex pattern to match exp: $%number%$
|
|
130
|
-
let matchAll = this.textBase.split(regex)
|
|
131
|
-
|
|
132
|
-
for (let i = 0; i < matchAll.length - 1; i++) {
|
|
133
|
-
textChoices.push('')
|
|
134
|
-
}
|
|
135
|
-
//apply previous answers
|
|
136
|
-
if (this.quizInputType && this.quizInputType.length == 0) {
|
|
137
|
-
this.quizInputTypeValue = textChoices
|
|
138
|
-
} else {
|
|
139
|
-
this.quizInputTypeValue = this.quizInputType
|
|
140
|
-
}
|
|
141
|
-
this.createTextWithInput(this.textBase)
|
|
142
|
-
},
|
|
143
|
-
/**
|
|
144
|
-
* @description create the object to genate the text and inputs
|
|
145
|
-
* @param {String} str the text with holes to fill
|
|
146
|
-
*/
|
|
147
|
-
createTextWithInput(str) {
|
|
148
|
-
const regex = /\$%\S*%\$/g // regex pattern to match exp: $%number%$
|
|
149
|
-
let matchAll = str.split(regex)
|
|
150
|
-
let listInput = []
|
|
151
|
-
for (let i = 0; i < matchAll.length - 1; i++) {
|
|
152
|
-
listInput.push({ id: 't' + i, content: matchAll[i] })
|
|
153
|
-
listInput.push({ id: i, type: 'inputText' })
|
|
154
|
-
}
|
|
155
|
-
let lastItem = matchAll.length - 1
|
|
156
|
-
listInput.push({ id: 't' + lastItem, content: matchAll[lastItem] })
|
|
157
|
-
this.theInputData = listInput
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
</script>
|
|
162
|
-
<style lang="scss" scoped>
|
|
163
|
-
.texteatrou {
|
|
164
|
-
display: inline;
|
|
165
|
-
position: relative;
|
|
166
|
-
}
|
|
167
|
-
.texteatrou > input {
|
|
168
|
-
display: inline;
|
|
169
|
-
width: auto;
|
|
170
|
-
}
|
|
171
|
-
</style>
|
|
1
|
+
<!-- About this Component--
|
|
2
|
+
* Renders a Series of inputs to collect input for the Quiz component.
|
|
3
|
+
* Related Quiz to question: TEXTE_TROUE
|
|
4
|
+
* Receives the a data object defined by user
|
|
5
|
+
* Used by AppCompQuizNext
|
|
6
|
+
* Uses useQuiz composable
|
|
7
|
+
-->
|
|
8
|
+
<template>
|
|
9
|
+
<div class="input-box">
|
|
10
|
+
<div
|
|
11
|
+
v-for="textInput in theInputData"
|
|
12
|
+
:key="textInput.id"
|
|
13
|
+
class="texteatrou"
|
|
14
|
+
>
|
|
15
|
+
<span v-if="!textInput.type" v-html="textInput.content"></span>
|
|
16
|
+
<label
|
|
17
|
+
:for="`${inputDataId}_${textInput.id}-champ`"
|
|
18
|
+
style="display: none"
|
|
19
|
+
>
|
|
20
|
+
{{ $t('text.quiz') }}
|
|
21
|
+
</label>
|
|
22
|
+
<v-text-field
|
|
23
|
+
v-if="textInput.type == 'inputText'"
|
|
24
|
+
:id="`${inputDataId}_${textInput.id}-champ`"
|
|
25
|
+
v-model="quizInputTypeValue[textInput.id]"
|
|
26
|
+
:placeholder="$t('text.place_holder.for_textarea')"
|
|
27
|
+
:disabled="quizLimitActive"
|
|
28
|
+
no-resize
|
|
29
|
+
:class="classInput(textInput.id, quizInputTypeValue)"
|
|
30
|
+
class="input-textatrou"
|
|
31
|
+
:aria-describedby="`${inputDataId}_${textInput.id}-msg-erreur`"
|
|
32
|
+
:aria-labelledby="`${inputDataId}_${textInput.id}-label`"
|
|
33
|
+
/>
|
|
34
|
+
<span :id="`${inputDataId}_${textInput.id}-msg-erreur`" class="sr-only">
|
|
35
|
+
{{ messageAccessibility(textInput.id, quizInputTypeValue) }}
|
|
36
|
+
</span>
|
|
37
|
+
</div>
|
|
38
|
+
</div>
|
|
39
|
+
</template>
|
|
40
|
+
<script>
|
|
41
|
+
import { useQuiz } from '../composables/useQuiz'
|
|
42
|
+
import { toRefs } from 'vue'
|
|
43
|
+
export default {
|
|
44
|
+
name: 'AppCompInputTextToFillNext',
|
|
45
|
+
props: {
|
|
46
|
+
quizType: {
|
|
47
|
+
type: String,
|
|
48
|
+
default: ''
|
|
49
|
+
},
|
|
50
|
+
inputDataId: {
|
|
51
|
+
type: String,
|
|
52
|
+
default: ''
|
|
53
|
+
},
|
|
54
|
+
inputData: {
|
|
55
|
+
type: Array,
|
|
56
|
+
default: () => []
|
|
57
|
+
},
|
|
58
|
+
inputType: {
|
|
59
|
+
type: String,
|
|
60
|
+
default: ''
|
|
61
|
+
},
|
|
62
|
+
textBase: {
|
|
63
|
+
type: String,
|
|
64
|
+
default: ''
|
|
65
|
+
},
|
|
66
|
+
quizInputType: {
|
|
67
|
+
type: Array,
|
|
68
|
+
default: () => []
|
|
69
|
+
},
|
|
70
|
+
solution: {
|
|
71
|
+
type: Array,
|
|
72
|
+
default: () => []
|
|
73
|
+
},
|
|
74
|
+
showSolution: {
|
|
75
|
+
type: Boolean,
|
|
76
|
+
default: false
|
|
77
|
+
},
|
|
78
|
+
quizLimitActive: {
|
|
79
|
+
type: Boolean,
|
|
80
|
+
default: false
|
|
81
|
+
}, //use to set if quiz should be active or not
|
|
82
|
+
quizSubmit: {
|
|
83
|
+
type: Boolean,
|
|
84
|
+
default: false
|
|
85
|
+
} //use to call a submit
|
|
86
|
+
},
|
|
87
|
+
emits: ['input-change'],
|
|
88
|
+
setup(props) {
|
|
89
|
+
const { shuffleArray, classInput, messageAccessibility } = useQuiz(
|
|
90
|
+
toRefs(props)
|
|
91
|
+
)
|
|
92
|
+
return { shuffleArray, classInput, messageAccessibility }
|
|
93
|
+
},
|
|
94
|
+
data() {
|
|
95
|
+
return {
|
|
96
|
+
quizInputTypeValue: [], //not using quizInputType because quizInputType is a prop
|
|
97
|
+
theInputData: [], //to create the list of drop down and text mixed togeter
|
|
98
|
+
quizSolution: null
|
|
99
|
+
}
|
|
100
|
+
},
|
|
101
|
+
|
|
102
|
+
watch: {
|
|
103
|
+
/**
|
|
104
|
+
* @description to pass value to AppCompQuiz
|
|
105
|
+
* @fires input-change to AppCompQuiz.vue
|
|
106
|
+
*/
|
|
107
|
+
quizInputTypeValue: {
|
|
108
|
+
deep: true,
|
|
109
|
+
handler(newValue) {
|
|
110
|
+
this.$emit('input-change', newValue)
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
},
|
|
114
|
+
|
|
115
|
+
mounted() {
|
|
116
|
+
this.initQuiz()
|
|
117
|
+
},
|
|
118
|
+
|
|
119
|
+
methods: {
|
|
120
|
+
initQuiz() {
|
|
121
|
+
this.quizSolution = this.solution
|
|
122
|
+
if (this.quizSolution !== null) {
|
|
123
|
+
this.quizSolution.sort(function (a, b) {
|
|
124
|
+
return a - b
|
|
125
|
+
})
|
|
126
|
+
}
|
|
127
|
+
let textChoices = []
|
|
128
|
+
|
|
129
|
+
const regex = /\$%\S*%\$/g // regex pattern to match exp: $%number%$
|
|
130
|
+
let matchAll = this.textBase.split(regex)
|
|
131
|
+
|
|
132
|
+
for (let i = 0; i < matchAll.length - 1; i++) {
|
|
133
|
+
textChoices.push('')
|
|
134
|
+
}
|
|
135
|
+
//apply previous answers
|
|
136
|
+
if (this.quizInputType && this.quizInputType.length == 0) {
|
|
137
|
+
this.quizInputTypeValue = textChoices
|
|
138
|
+
} else {
|
|
139
|
+
this.quizInputTypeValue = this.quizInputType
|
|
140
|
+
}
|
|
141
|
+
this.createTextWithInput(this.textBase)
|
|
142
|
+
},
|
|
143
|
+
/**
|
|
144
|
+
* @description create the object to genate the text and inputs
|
|
145
|
+
* @param {String} str the text with holes to fill
|
|
146
|
+
*/
|
|
147
|
+
createTextWithInput(str) {
|
|
148
|
+
const regex = /\$%\S*%\$/g // regex pattern to match exp: $%number%$
|
|
149
|
+
let matchAll = str.split(regex)
|
|
150
|
+
let listInput = []
|
|
151
|
+
for (let i = 0; i < matchAll.length - 1; i++) {
|
|
152
|
+
listInput.push({ id: 't' + i, content: matchAll[i] })
|
|
153
|
+
listInput.push({ id: i, type: 'inputText' })
|
|
154
|
+
}
|
|
155
|
+
let lastItem = matchAll.length - 1
|
|
156
|
+
listInput.push({ id: 't' + lastItem, content: matchAll[lastItem] })
|
|
157
|
+
this.theInputData = listInput
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
</script>
|
|
162
|
+
<style lang="scss" scoped>
|
|
163
|
+
.texteatrou {
|
|
164
|
+
display: inline;
|
|
165
|
+
position: relative;
|
|
166
|
+
}
|
|
167
|
+
.texteatrou > input {
|
|
168
|
+
display: inline;
|
|
169
|
+
width: auto;
|
|
170
|
+
}
|
|
171
|
+
</style>
|
|
@@ -1,74 +1,74 @@
|
|
|
1
|
-
<template>
|
|
2
|
-
<div v-if="!error" class="box-g" :class="state">
|
|
3
|
-
<v-progress-linear
|
|
4
|
-
class="jauge"
|
|
5
|
-
:model-value="value"
|
|
6
|
-
:height="12"
|
|
7
|
-
:max="maxValue"
|
|
8
|
-
aria-hidden="true"
|
|
9
|
-
></v-progress-linear>
|
|
10
|
-
<p class="prcnt">{{ getPourcent }} %</p>
|
|
11
|
-
</div>
|
|
12
|
-
<div v-else>
|
|
13
|
-
<div class="warning">
|
|
14
|
-
<p class="title">Attention</p>
|
|
15
|
-
<p class="info">
|
|
16
|
-
Attention les valeurs que vous donnez au composant ne sont pas des
|
|
17
|
-
nombres.
|
|
18
|
-
</p>
|
|
19
|
-
</div>
|
|
20
|
-
</div>
|
|
21
|
-
</template>
|
|
22
|
-
<script>
|
|
23
|
-
export default {
|
|
24
|
-
props: {
|
|
25
|
-
// props Give value to show progress
|
|
26
|
-
state: {
|
|
27
|
-
type: String,
|
|
28
|
-
default: 'started'
|
|
29
|
-
},
|
|
30
|
-
maxValue: {
|
|
31
|
-
type: Number,
|
|
32
|
-
default: 100
|
|
33
|
-
},
|
|
34
|
-
value: { type: Number, default: 0 },
|
|
35
|
-
pourcent: { type: Boolean, default: false },
|
|
36
|
-
fraction: { type: Boolean, default: false }
|
|
37
|
-
},
|
|
38
|
-
data() {
|
|
39
|
-
return {}
|
|
40
|
-
},
|
|
41
|
-
computed: {
|
|
42
|
-
getPourcent() {
|
|
43
|
-
// Calculate on a 100%
|
|
44
|
-
let result = (this.value * 100) / this.maxValue
|
|
45
|
-
if (result > 100) return 100
|
|
46
|
-
else return Math.round(result)
|
|
47
|
-
},
|
|
48
|
-
error() {
|
|
49
|
-
if (typeof this.value != 'number' || typeof this.maxValue != 'number') {
|
|
50
|
-
return true
|
|
51
|
-
} else {
|
|
52
|
-
return false
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
},
|
|
56
|
-
methods: {}
|
|
57
|
-
}
|
|
58
|
-
</script>
|
|
59
|
-
<style lang="scss">
|
|
60
|
-
.box-g {
|
|
61
|
-
width: 100%;
|
|
62
|
-
display: flex;
|
|
63
|
-
flex-direction: row;
|
|
64
|
-
flex-wrap: wrap;
|
|
65
|
-
|
|
66
|
-
.jauge {
|
|
67
|
-
width: 70%;
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
.prcnt {
|
|
71
|
-
margin-left: 10px;
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
</style>
|
|
1
|
+
<template>
|
|
2
|
+
<div v-if="!error" class="box-g" :class="state">
|
|
3
|
+
<v-progress-linear
|
|
4
|
+
class="jauge"
|
|
5
|
+
:model-value="value"
|
|
6
|
+
:height="12"
|
|
7
|
+
:max="maxValue"
|
|
8
|
+
aria-hidden="true"
|
|
9
|
+
></v-progress-linear>
|
|
10
|
+
<p class="prcnt">{{ getPourcent }} %</p>
|
|
11
|
+
</div>
|
|
12
|
+
<div v-else>
|
|
13
|
+
<div class="warning">
|
|
14
|
+
<p class="title">Attention</p>
|
|
15
|
+
<p class="info">
|
|
16
|
+
Attention les valeurs que vous donnez au composant ne sont pas des
|
|
17
|
+
nombres.
|
|
18
|
+
</p>
|
|
19
|
+
</div>
|
|
20
|
+
</div>
|
|
21
|
+
</template>
|
|
22
|
+
<script>
|
|
23
|
+
export default {
|
|
24
|
+
props: {
|
|
25
|
+
// props Give value to show progress
|
|
26
|
+
state: {
|
|
27
|
+
type: String,
|
|
28
|
+
default: 'started'
|
|
29
|
+
},
|
|
30
|
+
maxValue: {
|
|
31
|
+
type: Number,
|
|
32
|
+
default: 100
|
|
33
|
+
},
|
|
34
|
+
value: { type: Number, default: 0 },
|
|
35
|
+
pourcent: { type: Boolean, default: false },
|
|
36
|
+
fraction: { type: Boolean, default: false }
|
|
37
|
+
},
|
|
38
|
+
data() {
|
|
39
|
+
return {}
|
|
40
|
+
},
|
|
41
|
+
computed: {
|
|
42
|
+
getPourcent() {
|
|
43
|
+
// Calculate on a 100%
|
|
44
|
+
let result = (this.value * 100) / this.maxValue
|
|
45
|
+
if (result > 100) return 100
|
|
46
|
+
else return Math.round(result)
|
|
47
|
+
},
|
|
48
|
+
error() {
|
|
49
|
+
if (typeof this.value != 'number' || typeof this.maxValue != 'number') {
|
|
50
|
+
return true
|
|
51
|
+
} else {
|
|
52
|
+
return false
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
},
|
|
56
|
+
methods: {}
|
|
57
|
+
}
|
|
58
|
+
</script>
|
|
59
|
+
<style lang="scss">
|
|
60
|
+
.box-g {
|
|
61
|
+
width: 100%;
|
|
62
|
+
display: flex;
|
|
63
|
+
flex-direction: row;
|
|
64
|
+
flex-wrap: wrap;
|
|
65
|
+
|
|
66
|
+
.jauge {
|
|
67
|
+
width: 70%;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
.prcnt {
|
|
71
|
+
margin-left: 10px;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
</style>
|
|
@@ -1,82 +1,82 @@
|
|
|
1
|
-
<!--@ Description: This component is used to display the playbar associate with the videoPlayer
|
|
2
|
-
@ What it does: The component is used to interacted with the videoPlayer via buttons.
|
|
3
|
-
v-media class is used to identified which html elements trigger the playBar to be appear (with focus/click)-->
|
|
4
|
-
<template>
|
|
5
|
-
<!--------------------------------- PLAY-BAR Progress -------------------------------------->
|
|
6
|
-
<div ref="$playbar-timeline" class="pb-timeline">
|
|
7
|
-
<div ref="$progress-area" class="progress-area">
|
|
8
|
-
<div
|
|
9
|
-
id="progress-bar"
|
|
10
|
-
ref="$progress-bar"
|
|
11
|
-
draggable="false"
|
|
12
|
-
tabindex="0"
|
|
13
|
-
class="v-media pb-progress-bar"
|
|
14
|
-
role="slider"
|
|
15
|
-
aria-valuemin="0"
|
|
16
|
-
:aria-label="mediaA11Y.label"
|
|
17
|
-
:aria-valuenow="mediaA11Y.valNow"
|
|
18
|
-
:aria-valuemax="mediaA11Y.valMax"
|
|
19
|
-
:aria-valuetext="mediaA11Y.valueText"
|
|
20
|
-
@focus="changeFocusState('progressBar', true)"
|
|
21
|
-
@blur="changeFocusState('progressBar', false)"
|
|
22
|
-
>
|
|
23
|
-
<!--Class progress-animation is apply when we are not using the thumb to change the progression-->
|
|
24
|
-
<div
|
|
25
|
-
id="progress-indicator"
|
|
26
|
-
ref="$progress-indicator"
|
|
27
|
-
draggable="false"
|
|
28
|
-
class="progress-indicator"
|
|
29
|
-
:class="{ 'progress-animation': !progressThumbDown }"
|
|
30
|
-
:style="{ width: progressBarPercentage + '%' }"
|
|
31
|
-
>
|
|
32
|
-
<!--Mousedown validate if the thumb is cliqued (if yes, the mouse is follow to modify the progress)
|
|
33
|
-
MouseOver/MouseOut deactivate click event on progressBar if the mouse hovered the thumb-->
|
|
34
|
-
<!-- <div
|
|
35
|
-
ref="$progress-thumb"
|
|
36
|
-
draggable="false"
|
|
37
|
-
class="progress-thumb"
|
|
38
|
-
style="z-index: 9"
|
|
39
|
-
@mousedown="
|
|
40
|
-
savedIsPlaying = isPlaying
|
|
41
|
-
progressThumbDown = true
|
|
42
|
-
"
|
|
43
|
-
@mouseover="progressThumbHover = true"
|
|
44
|
-
@mouseleave="progressThumbHover = false"
|
|
45
|
-
></div> -->
|
|
46
|
-
|
|
47
|
-
<div
|
|
48
|
-
ref="$progress-thumb"
|
|
49
|
-
draggable="false"
|
|
50
|
-
class="progress-thumb"
|
|
51
|
-
style="z-index: 9"
|
|
52
|
-
@mouseover="progressThumbHover = true"
|
|
53
|
-
@mouseleave="progressThumbHover = false"
|
|
54
|
-
></div>
|
|
55
|
-
</div>
|
|
56
|
-
</div>
|
|
57
|
-
<div
|
|
58
|
-
v-if="tooTipTimeCode"
|
|
59
|
-
id="seek-tooltip"
|
|
60
|
-
ref="$seek-tooltip"
|
|
61
|
-
aria-hidden="true"
|
|
62
|
-
class="seek-tooltip"
|
|
63
|
-
>
|
|
64
|
-
{{ tooTipTimeCode }}
|
|
65
|
-
</div>
|
|
66
|
-
</div>
|
|
67
|
-
</div>
|
|
68
|
-
</template>
|
|
69
|
-
|
|
70
|
-
<script>
|
|
71
|
-
import $extendsMedia from '../mixins/$mediaMixins'
|
|
72
|
-
|
|
73
|
-
export default {
|
|
74
|
-
mixins: [$extendsMedia],
|
|
75
|
-
data() {
|
|
76
|
-
return {
|
|
77
|
-
tooTipTimeCode: null
|
|
78
|
-
}
|
|
79
|
-
},
|
|
80
|
-
mounted() {}
|
|
81
|
-
}
|
|
82
|
-
</script>
|
|
1
|
+
<!--@ Description: This component is used to display the playbar associate with the videoPlayer
|
|
2
|
+
@ What it does: The component is used to interacted with the videoPlayer via buttons.
|
|
3
|
+
v-media class is used to identified which html elements trigger the playBar to be appear (with focus/click)-->
|
|
4
|
+
<template>
|
|
5
|
+
<!--------------------------------- PLAY-BAR Progress -------------------------------------->
|
|
6
|
+
<div ref="$playbar-timeline" class="pb-timeline">
|
|
7
|
+
<div ref="$progress-area" class="progress-area">
|
|
8
|
+
<div
|
|
9
|
+
id="progress-bar"
|
|
10
|
+
ref="$progress-bar"
|
|
11
|
+
draggable="false"
|
|
12
|
+
tabindex="0"
|
|
13
|
+
class="v-media pb-progress-bar"
|
|
14
|
+
role="slider"
|
|
15
|
+
aria-valuemin="0"
|
|
16
|
+
:aria-label="mediaA11Y.label"
|
|
17
|
+
:aria-valuenow="mediaA11Y.valNow"
|
|
18
|
+
:aria-valuemax="mediaA11Y.valMax"
|
|
19
|
+
:aria-valuetext="mediaA11Y.valueText"
|
|
20
|
+
@focus="changeFocusState('progressBar', true)"
|
|
21
|
+
@blur="changeFocusState('progressBar', false)"
|
|
22
|
+
>
|
|
23
|
+
<!--Class progress-animation is apply when we are not using the thumb to change the progression-->
|
|
24
|
+
<div
|
|
25
|
+
id="progress-indicator"
|
|
26
|
+
ref="$progress-indicator"
|
|
27
|
+
draggable="false"
|
|
28
|
+
class="progress-indicator"
|
|
29
|
+
:class="{ 'progress-animation': !progressThumbDown }"
|
|
30
|
+
:style="{ width: progressBarPercentage + '%' }"
|
|
31
|
+
>
|
|
32
|
+
<!--Mousedown validate if the thumb is cliqued (if yes, the mouse is follow to modify the progress)
|
|
33
|
+
MouseOver/MouseOut deactivate click event on progressBar if the mouse hovered the thumb-->
|
|
34
|
+
<!-- <div
|
|
35
|
+
ref="$progress-thumb"
|
|
36
|
+
draggable="false"
|
|
37
|
+
class="progress-thumb"
|
|
38
|
+
style="z-index: 9"
|
|
39
|
+
@mousedown="
|
|
40
|
+
savedIsPlaying = isPlaying
|
|
41
|
+
progressThumbDown = true
|
|
42
|
+
"
|
|
43
|
+
@mouseover="progressThumbHover = true"
|
|
44
|
+
@mouseleave="progressThumbHover = false"
|
|
45
|
+
></div> -->
|
|
46
|
+
|
|
47
|
+
<div
|
|
48
|
+
ref="$progress-thumb"
|
|
49
|
+
draggable="false"
|
|
50
|
+
class="progress-thumb"
|
|
51
|
+
style="z-index: 9"
|
|
52
|
+
@mouseover="progressThumbHover = true"
|
|
53
|
+
@mouseleave="progressThumbHover = false"
|
|
54
|
+
></div>
|
|
55
|
+
</div>
|
|
56
|
+
</div>
|
|
57
|
+
<div
|
|
58
|
+
v-if="tooTipTimeCode"
|
|
59
|
+
id="seek-tooltip"
|
|
60
|
+
ref="$seek-tooltip"
|
|
61
|
+
aria-hidden="true"
|
|
62
|
+
class="seek-tooltip"
|
|
63
|
+
>
|
|
64
|
+
{{ tooTipTimeCode }}
|
|
65
|
+
</div>
|
|
66
|
+
</div>
|
|
67
|
+
</div>
|
|
68
|
+
</template>
|
|
69
|
+
|
|
70
|
+
<script>
|
|
71
|
+
import $extendsMedia from '../mixins/$mediaMixins'
|
|
72
|
+
|
|
73
|
+
export default {
|
|
74
|
+
mixins: [$extendsMedia],
|
|
75
|
+
data() {
|
|
76
|
+
return {
|
|
77
|
+
tooTipTimeCode: null
|
|
78
|
+
}
|
|
79
|
+
},
|
|
80
|
+
mounted() {}
|
|
81
|
+
}
|
|
82
|
+
</script>
|