fcad-core-dragon 2.0.0-beta.8 → 2.0.0-beta.9
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/CHANGELOG +3 -0
- package/README.md +71 -71
- 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/AppCompInputRadioNext.vue +152 -152
- package/src/components/AppCompInputTextToFillNext.vue +171 -171
- package/src/components/AppCompJauge.vue +74 -74
- package/src/components/AppCompMenuItem.vue +228 -228
- package/src/components/AppCompNoteCall.vue +1 -0
- package/src/components/AppCompPlayBarProgress.vue +82 -82
- package/src/components/AppCompPopUpNext.vue +5 -1
- 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/mixins/timerMixin.js +155 -155
- 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,228 +1,228 @@
|
|
|
1
|
-
<!--
|
|
2
|
-
@ Description: This component is used to display and create the link's to all the activity creation in module.
|
|
3
|
-
@ What it does: Goes trougth all the activity in the router and create a card that open the Table of content (appCompTableOfContent) that display the anchor.Display the title and subtitle enter in menu.json. Must be used with AppCompTableOfContent and AppCompMenu.
|
|
4
|
-
-->
|
|
5
|
-
<template>
|
|
6
|
-
<v-row v-if="activities.length" class="box-msa">
|
|
7
|
-
<v-col
|
|
8
|
-
v-for="activity of activities"
|
|
9
|
-
:key="activity.id"
|
|
10
|
-
cols="6"
|
|
11
|
-
class="menu-section-activity"
|
|
12
|
-
:aria-describedby="activity.id + '-subMenu'"
|
|
13
|
-
>
|
|
14
|
-
<router-link
|
|
15
|
-
:id="activity.id + '-subMenu'"
|
|
16
|
-
:title="activity.title"
|
|
17
|
-
:data-test="`item-menu-${activity.id}`"
|
|
18
|
-
class="btn-menu"
|
|
19
|
-
:to="{
|
|
20
|
-
name: createRoutes(activity.id)
|
|
21
|
-
}"
|
|
22
|
-
@click="startActivity(activity)"
|
|
23
|
-
>
|
|
24
|
-
<div class="menu-card" tag="article">
|
|
25
|
-
<v-row>
|
|
26
|
-
<div v-if="activity.subtitle === undefined" class="title">
|
|
27
|
-
<h4 v-html="activity.title"></h4>
|
|
28
|
-
</div>
|
|
29
|
-
<div v-else class="title">
|
|
30
|
-
<h4 v-html="`${activity.title} : ${activity.subtitle}`"></h4>
|
|
31
|
-
</div>
|
|
32
|
-
|
|
33
|
-
<div class="cnt-time">
|
|
34
|
-
<svg :aria-label="$t('label.timer')">
|
|
35
|
-
<use href="#clock-icon" />
|
|
36
|
-
</svg>
|
|
37
|
-
<p class="time">
|
|
38
|
-
{{ activity.time || '00:00' }}
|
|
39
|
-
</p>
|
|
40
|
-
</div>
|
|
41
|
-
<div class="box-gauge">
|
|
42
|
-
<app-comp-jauge
|
|
43
|
-
:max-value="getActivitySize(activity.id)"
|
|
44
|
-
:value="getPageComplete(activity.id)"
|
|
45
|
-
/>
|
|
46
|
-
</div>
|
|
47
|
-
</v-row>
|
|
48
|
-
</div>
|
|
49
|
-
</router-link>
|
|
50
|
-
</v-col>
|
|
51
|
-
</v-row>
|
|
52
|
-
</template>
|
|
53
|
-
<script>
|
|
54
|
-
// ...
|
|
55
|
-
import { mapState } from 'pinia'
|
|
56
|
-
import { useAppStore } from '../module/stores/appStore'
|
|
57
|
-
import AppCompJauge from './AppCompJauge.vue'
|
|
58
|
-
export default {
|
|
59
|
-
components: {
|
|
60
|
-
AppCompJauge
|
|
61
|
-
},
|
|
62
|
-
computed: {
|
|
63
|
-
...mapState(useAppStore, [
|
|
64
|
-
'getAllActivities',
|
|
65
|
-
'getAllActivitiesState',
|
|
66
|
-
'getAllCompleted',
|
|
67
|
-
'getAppConfigs',
|
|
68
|
-
'getMenuSettings',
|
|
69
|
-
'getModuleInfo'
|
|
70
|
-
]),
|
|
71
|
-
activities() {
|
|
72
|
-
// get the data for list of the page for this module from the store and
|
|
73
|
-
// get the route of the page from the router to build the menu with its routes
|
|
74
|
-
let count = 0
|
|
75
|
-
const collection = []
|
|
76
|
-
|
|
77
|
-
this.getAllActivities().list.forEach((value, key) => {
|
|
78
|
-
let theActivity,
|
|
79
|
-
activityTitle,
|
|
80
|
-
activitySubTitle,
|
|
81
|
-
activityTime = null,
|
|
82
|
-
activityPath = ''
|
|
83
|
-
|
|
84
|
-
if (this.menuInfo[key]) {
|
|
85
|
-
const { title, subTitle, time } = this.menuInfo[key] //get time subTitle time from menu info
|
|
86
|
-
//set the title
|
|
87
|
-
if (title && title != ' ') activityTitle = title
|
|
88
|
-
//set the subtitle
|
|
89
|
-
if (subTitle && subTitle != ' ') activitySubTitle = subTitle
|
|
90
|
-
//set the time
|
|
91
|
-
if (time && time != ' ') activityTime = time
|
|
92
|
-
}
|
|
93
|
-
// This is the Introduction
|
|
94
|
-
if (key === 'A00') {
|
|
95
|
-
activityTitle = activityTitle || this.$t('text.introduction')
|
|
96
|
-
activityPath = 'introduction'
|
|
97
|
-
} else if (key === 'A99') {
|
|
98
|
-
activityTitle = activityTitle || this.$t('text.conclusion')
|
|
99
|
-
activityPath = 'conclusion'
|
|
100
|
-
} else {
|
|
101
|
-
count++
|
|
102
|
-
activityTitle =
|
|
103
|
-
activityTitle || `${this.$t('text.activity')} ${count}`
|
|
104
|
-
activityPath = `activite_${count}`
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
theActivity = {
|
|
108
|
-
id: key,
|
|
109
|
-
title: activityTitle,
|
|
110
|
-
subtitle: activitySubTitle,
|
|
111
|
-
time: activityTime,
|
|
112
|
-
path: activityPath,
|
|
113
|
-
data: value
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
collection.push(theActivity) // push the activity in the collection
|
|
117
|
-
})
|
|
118
|
-
|
|
119
|
-
return collection
|
|
120
|
-
},
|
|
121
|
-
menuInfo() {
|
|
122
|
-
let menuInfo = this.getMenuSettings
|
|
123
|
-
return menuInfo
|
|
124
|
-
}
|
|
125
|
-
},
|
|
126
|
-
mounted() {},
|
|
127
|
-
methods: {
|
|
128
|
-
/**
|
|
129
|
-
* @description Gives gives length of completed page for an activity
|
|
130
|
-
* @param {String} idActivity
|
|
131
|
-
* @returns {Number}
|
|
132
|
-
*/
|
|
133
|
-
getPageComplete(idActivity) {
|
|
134
|
-
/// give all the page that are complete to the gauge
|
|
135
|
-
if (idActivity) {
|
|
136
|
-
let completed = []
|
|
137
|
-
if (this.getAllCompleted[idActivity]) {
|
|
138
|
-
completed = this.getAllCompleted[idActivity] //get all completed page for the activity
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
return completed.length
|
|
142
|
-
}
|
|
143
|
-
},
|
|
144
|
-
/**
|
|
145
|
-
* @description give the size of the state of the activity
|
|
146
|
-
* @param {String} activityID
|
|
147
|
-
* @returns {Number} size
|
|
148
|
-
*/
|
|
149
|
-
getActivitySize(activityID) {
|
|
150
|
-
/*
|
|
151
|
-
* Note:
|
|
152
|
-
* Assaging by reference would change the property of the getters when the valued are changed in the new object in. * To prevent this behaviour we will make a deep copy of the getter
|
|
153
|
-
* cf: https://reactgo.com/javascript-clone-object/
|
|
154
|
-
*/
|
|
155
|
-
|
|
156
|
-
const allActivitiesState = JSON.parse(
|
|
157
|
-
JSON.stringify(this.getAllActivitiesState)
|
|
158
|
-
)
|
|
159
|
-
let size = allActivitiesState[activityID]
|
|
160
|
-
? allActivitiesState[activityID].size
|
|
161
|
-
: 0
|
|
162
|
-
|
|
163
|
-
return size
|
|
164
|
-
},
|
|
165
|
-
createRoutes(data) {
|
|
166
|
-
let activity
|
|
167
|
-
|
|
168
|
-
if (data.charAt(1) == '0' || data.charAt(1) == 0) {
|
|
169
|
-
activity = data.substr(2)
|
|
170
|
-
} else {
|
|
171
|
-
activity = data.substr(1)
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
if (activity == 0 && activity == '0') return `introduction`
|
|
175
|
-
if (activity == '99') return `conclusion`
|
|
176
|
-
else return `activite_${activity}`
|
|
177
|
-
},
|
|
178
|
-
startActivity(a) {
|
|
179
|
-
//this.$bus.$emit('send-starting-event', a)
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
}
|
|
183
|
-
</script>
|
|
184
|
-
<style lang="scss">
|
|
185
|
-
.menu-card {
|
|
186
|
-
width: 100%;
|
|
187
|
-
padding: 24px;
|
|
188
|
-
|
|
189
|
-
.v-row {
|
|
190
|
-
margin: 0;
|
|
191
|
-
flex-direction: column;
|
|
192
|
-
|
|
193
|
-
.title {
|
|
194
|
-
flex-grow: 4;
|
|
195
|
-
width: 80%;
|
|
196
|
-
margin-bottom: 30px;
|
|
197
|
-
|
|
198
|
-
h3 {
|
|
199
|
-
text-align: left;
|
|
200
|
-
}
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
.cnt-time {
|
|
204
|
-
display: flex;
|
|
205
|
-
flex-direction: row;
|
|
206
|
-
align-items: center;
|
|
207
|
-
margin-bottom: 20px;
|
|
208
|
-
|
|
209
|
-
svg {
|
|
210
|
-
width: 18px;
|
|
211
|
-
height: 18px;
|
|
212
|
-
margin-right: 10px;
|
|
213
|
-
}
|
|
214
|
-
}
|
|
215
|
-
|
|
216
|
-
.box-gauge {
|
|
217
|
-
display: block;
|
|
218
|
-
width: 100%;
|
|
219
|
-
|
|
220
|
-
.box-g {
|
|
221
|
-
display: flex;
|
|
222
|
-
flex-direction: row;
|
|
223
|
-
align-items: center;
|
|
224
|
-
}
|
|
225
|
-
}
|
|
226
|
-
}
|
|
227
|
-
}
|
|
228
|
-
</style>
|
|
1
|
+
<!--
|
|
2
|
+
@ Description: This component is used to display and create the link's to all the activity creation in module.
|
|
3
|
+
@ What it does: Goes trougth all the activity in the router and create a card that open the Table of content (appCompTableOfContent) that display the anchor.Display the title and subtitle enter in menu.json. Must be used with AppCompTableOfContent and AppCompMenu.
|
|
4
|
+
-->
|
|
5
|
+
<template>
|
|
6
|
+
<v-row v-if="activities.length" class="box-msa">
|
|
7
|
+
<v-col
|
|
8
|
+
v-for="activity of activities"
|
|
9
|
+
:key="activity.id"
|
|
10
|
+
cols="6"
|
|
11
|
+
class="menu-section-activity"
|
|
12
|
+
:aria-describedby="activity.id + '-subMenu'"
|
|
13
|
+
>
|
|
14
|
+
<router-link
|
|
15
|
+
:id="activity.id + '-subMenu'"
|
|
16
|
+
:title="activity.title"
|
|
17
|
+
:data-test="`item-menu-${activity.id}`"
|
|
18
|
+
class="btn-menu"
|
|
19
|
+
:to="{
|
|
20
|
+
name: createRoutes(activity.id)
|
|
21
|
+
}"
|
|
22
|
+
@click="startActivity(activity)"
|
|
23
|
+
>
|
|
24
|
+
<div class="menu-card" tag="article">
|
|
25
|
+
<v-row>
|
|
26
|
+
<div v-if="activity.subtitle === undefined" class="title">
|
|
27
|
+
<h4 v-html="activity.title"></h4>
|
|
28
|
+
</div>
|
|
29
|
+
<div v-else class="title">
|
|
30
|
+
<h4 v-html="`${activity.title} : ${activity.subtitle}`"></h4>
|
|
31
|
+
</div>
|
|
32
|
+
|
|
33
|
+
<div class="cnt-time">
|
|
34
|
+
<svg :aria-label="$t('label.timer')">
|
|
35
|
+
<use href="#clock-icon" />
|
|
36
|
+
</svg>
|
|
37
|
+
<p class="time">
|
|
38
|
+
{{ activity.time || '00:00' }}
|
|
39
|
+
</p>
|
|
40
|
+
</div>
|
|
41
|
+
<div class="box-gauge">
|
|
42
|
+
<app-comp-jauge
|
|
43
|
+
:max-value="getActivitySize(activity.id)"
|
|
44
|
+
:value="getPageComplete(activity.id)"
|
|
45
|
+
/>
|
|
46
|
+
</div>
|
|
47
|
+
</v-row>
|
|
48
|
+
</div>
|
|
49
|
+
</router-link>
|
|
50
|
+
</v-col>
|
|
51
|
+
</v-row>
|
|
52
|
+
</template>
|
|
53
|
+
<script>
|
|
54
|
+
// ...
|
|
55
|
+
import { mapState } from 'pinia'
|
|
56
|
+
import { useAppStore } from '../module/stores/appStore'
|
|
57
|
+
import AppCompJauge from './AppCompJauge.vue'
|
|
58
|
+
export default {
|
|
59
|
+
components: {
|
|
60
|
+
AppCompJauge
|
|
61
|
+
},
|
|
62
|
+
computed: {
|
|
63
|
+
...mapState(useAppStore, [
|
|
64
|
+
'getAllActivities',
|
|
65
|
+
'getAllActivitiesState',
|
|
66
|
+
'getAllCompleted',
|
|
67
|
+
'getAppConfigs',
|
|
68
|
+
'getMenuSettings',
|
|
69
|
+
'getModuleInfo'
|
|
70
|
+
]),
|
|
71
|
+
activities() {
|
|
72
|
+
// get the data for list of the page for this module from the store and
|
|
73
|
+
// get the route of the page from the router to build the menu with its routes
|
|
74
|
+
let count = 0
|
|
75
|
+
const collection = []
|
|
76
|
+
|
|
77
|
+
this.getAllActivities().list.forEach((value, key) => {
|
|
78
|
+
let theActivity,
|
|
79
|
+
activityTitle,
|
|
80
|
+
activitySubTitle,
|
|
81
|
+
activityTime = null,
|
|
82
|
+
activityPath = ''
|
|
83
|
+
|
|
84
|
+
if (this.menuInfo[key]) {
|
|
85
|
+
const { title, subTitle, time } = this.menuInfo[key] //get time subTitle time from menu info
|
|
86
|
+
//set the title
|
|
87
|
+
if (title && title != ' ') activityTitle = title
|
|
88
|
+
//set the subtitle
|
|
89
|
+
if (subTitle && subTitle != ' ') activitySubTitle = subTitle
|
|
90
|
+
//set the time
|
|
91
|
+
if (time && time != ' ') activityTime = time
|
|
92
|
+
}
|
|
93
|
+
// This is the Introduction
|
|
94
|
+
if (key === 'A00') {
|
|
95
|
+
activityTitle = activityTitle || this.$t('text.introduction')
|
|
96
|
+
activityPath = 'introduction'
|
|
97
|
+
} else if (key === 'A99') {
|
|
98
|
+
activityTitle = activityTitle || this.$t('text.conclusion')
|
|
99
|
+
activityPath = 'conclusion'
|
|
100
|
+
} else {
|
|
101
|
+
count++
|
|
102
|
+
activityTitle =
|
|
103
|
+
activityTitle || `${this.$t('text.activity')} ${count}`
|
|
104
|
+
activityPath = `activite_${count}`
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
theActivity = {
|
|
108
|
+
id: key,
|
|
109
|
+
title: activityTitle,
|
|
110
|
+
subtitle: activitySubTitle,
|
|
111
|
+
time: activityTime,
|
|
112
|
+
path: activityPath,
|
|
113
|
+
data: value
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
collection.push(theActivity) // push the activity in the collection
|
|
117
|
+
})
|
|
118
|
+
|
|
119
|
+
return collection
|
|
120
|
+
},
|
|
121
|
+
menuInfo() {
|
|
122
|
+
let menuInfo = this.getMenuSettings
|
|
123
|
+
return menuInfo
|
|
124
|
+
}
|
|
125
|
+
},
|
|
126
|
+
mounted() {},
|
|
127
|
+
methods: {
|
|
128
|
+
/**
|
|
129
|
+
* @description Gives gives length of completed page for an activity
|
|
130
|
+
* @param {String} idActivity
|
|
131
|
+
* @returns {Number}
|
|
132
|
+
*/
|
|
133
|
+
getPageComplete(idActivity) {
|
|
134
|
+
/// give all the page that are complete to the gauge
|
|
135
|
+
if (idActivity) {
|
|
136
|
+
let completed = []
|
|
137
|
+
if (this.getAllCompleted[idActivity]) {
|
|
138
|
+
completed = this.getAllCompleted[idActivity] //get all completed page for the activity
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
return completed.length
|
|
142
|
+
}
|
|
143
|
+
},
|
|
144
|
+
/**
|
|
145
|
+
* @description give the size of the state of the activity
|
|
146
|
+
* @param {String} activityID
|
|
147
|
+
* @returns {Number} size
|
|
148
|
+
*/
|
|
149
|
+
getActivitySize(activityID) {
|
|
150
|
+
/*
|
|
151
|
+
* Note:
|
|
152
|
+
* Assaging by reference would change the property of the getters when the valued are changed in the new object in. * To prevent this behaviour we will make a deep copy of the getter
|
|
153
|
+
* cf: https://reactgo.com/javascript-clone-object/
|
|
154
|
+
*/
|
|
155
|
+
|
|
156
|
+
const allActivitiesState = JSON.parse(
|
|
157
|
+
JSON.stringify(this.getAllActivitiesState)
|
|
158
|
+
)
|
|
159
|
+
let size = allActivitiesState[activityID]
|
|
160
|
+
? allActivitiesState[activityID].size
|
|
161
|
+
: 0
|
|
162
|
+
|
|
163
|
+
return size
|
|
164
|
+
},
|
|
165
|
+
createRoutes(data) {
|
|
166
|
+
let activity
|
|
167
|
+
|
|
168
|
+
if (data.charAt(1) == '0' || data.charAt(1) == 0) {
|
|
169
|
+
activity = data.substr(2)
|
|
170
|
+
} else {
|
|
171
|
+
activity = data.substr(1)
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
if (activity == 0 && activity == '0') return `introduction`
|
|
175
|
+
if (activity == '99') return `conclusion`
|
|
176
|
+
else return `activite_${activity}`
|
|
177
|
+
},
|
|
178
|
+
startActivity(a) {
|
|
179
|
+
//this.$bus.$emit('send-starting-event', a)
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
</script>
|
|
184
|
+
<style lang="scss">
|
|
185
|
+
.menu-card {
|
|
186
|
+
width: 100%;
|
|
187
|
+
padding: 24px;
|
|
188
|
+
|
|
189
|
+
.v-row {
|
|
190
|
+
margin: 0;
|
|
191
|
+
flex-direction: column;
|
|
192
|
+
|
|
193
|
+
.title {
|
|
194
|
+
flex-grow: 4;
|
|
195
|
+
width: 80%;
|
|
196
|
+
margin-bottom: 30px;
|
|
197
|
+
|
|
198
|
+
h3 {
|
|
199
|
+
text-align: left;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
.cnt-time {
|
|
204
|
+
display: flex;
|
|
205
|
+
flex-direction: row;
|
|
206
|
+
align-items: center;
|
|
207
|
+
margin-bottom: 20px;
|
|
208
|
+
|
|
209
|
+
svg {
|
|
210
|
+
width: 18px;
|
|
211
|
+
height: 18px;
|
|
212
|
+
margin-right: 10px;
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
.box-gauge {
|
|
217
|
+
display: block;
|
|
218
|
+
width: 100%;
|
|
219
|
+
|
|
220
|
+
.box-g {
|
|
221
|
+
display: flex;
|
|
222
|
+
flex-direction: row;
|
|
223
|
+
align-items: center;
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
</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>
|
|
@@ -208,7 +208,7 @@
|
|
|
208
208
|
</template>
|
|
209
209
|
|
|
210
210
|
<script>
|
|
211
|
-
import { mapActions } from 'pinia'
|
|
211
|
+
import { mapState, mapActions } from 'pinia'
|
|
212
212
|
import { useAppStore } from '../module/stores/appStore'
|
|
213
213
|
|
|
214
214
|
export default {
|
|
@@ -229,6 +229,7 @@ export default {
|
|
|
229
229
|
}
|
|
230
230
|
},
|
|
231
231
|
computed: {
|
|
232
|
+
...mapState(useAppStore, ['getNotes', 'getWidgetOpen']),
|
|
232
233
|
contentLength() {
|
|
233
234
|
let size = null
|
|
234
235
|
if (!this.pType || this.pType !== 'popup-info') return
|
|
@@ -399,6 +400,9 @@ export default {
|
|
|
399
400
|
if (this.pType == 'popup-endActivity')
|
|
400
401
|
this.updateEndPopUp(true) //This will handle the activation of the element in the portal
|
|
401
402
|
else this.updateEndPopUp(false) //This will handle the activation of the element in the portal
|
|
403
|
+
if (this.getWidgetOpen) {
|
|
404
|
+
this.$bus.$emit('close-widget')
|
|
405
|
+
}
|
|
402
406
|
this.$open()
|
|
403
407
|
}
|
|
404
408
|
},
|