fcad-core-dragon 2.1.1 → 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 +867 -866
- 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 -1
- 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 -17
- 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,504 +1,508 @@
|
|
|
1
|
-
<!-- About this Component--
|
|
2
|
-
*@ Description: Application component to show instructions in a modal.
|
|
3
|
-
*@ What it does: This component uses the VDialog component to create a Popup. 2 types of popups can be display:
|
|
4
|
-
- end of activities popup (popup-endActivity). Default used by the application at the end of activities (AppCompNavigation)
|
|
5
|
-
- custom popup (popup-custom)- this allow user to defined custom popup using the power of VDialog. Must respect properties defined by VDialog. For more info, refer to https://vuetifyjs.com/en/components/dialogs/#usage.
|
|
6
|
-
It validates the content of the popup before rendering. Will render error view if there are some errors in content definition
|
|
7
|
-
* What it needs: data must contain:
|
|
8
|
-
- type(string) : 'popup-endAcivity' || 'popup-custom || popup-info'
|
|
9
|
-
- value (Object): {$bvArgs(Object), template (String)}
|
|
10
|
-
|
|
11
|
-
*⚠️@Note :There can only be Popup instance of this component in the application. You can ask the application to open the Popup with you defined popup
|
|
12
|
-
*@ Exemple: creating a custom popup using the VDialog props
|
|
13
|
-
|
|
14
|
-
const myCustomProp = {
|
|
15
|
-
type: 'popup-custom',
|
|
16
|
-
value: {
|
|
17
|
-
//⚠️IMPORTANT:Only props of VDialog must be listed in $bvArgs. Check VDialog documentation for full list of props
|
|
18
|
-
$bvArgs: {
|
|
19
|
-
centered: true,
|
|
20
|
-
width: 'auto',
|
|
21
|
-
scrollable: false,
|
|
22
|
-
'max-width': '600'
|
|
23
|
-
}
|
|
24
|
-
//⚠️IMPORTANT:Must have a template attribute
|
|
25
|
-
tempate:`<div><h4>Exemple of custom popup</h4><p>Hello World</p></div>`
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
// Now we can ask the application to open our custom popup
|
|
29
|
-
this.$bus.$emit('open-popup', myCustomProp)
|
|
30
|
-
-->
|
|
31
|
-
|
|
32
|
-
<template>
|
|
33
|
-
<div>
|
|
34
|
-
<template v-if="!errors.length">
|
|
35
|
-
<!------------ End Activity --------------------------->
|
|
36
|
-
|
|
37
|
-
<v-dialog
|
|
38
|
-
id="popUp"
|
|
39
|
-
:model-value="popupType == 'popup-endActivity' && dialogue"
|
|
40
|
-
:class="pType"
|
|
41
|
-
width="auto"
|
|
42
|
-
scrollable
|
|
43
|
-
centered
|
|
44
|
-
@after-leave="$close(pContent.cb_$close)"
|
|
45
|
-
>
|
|
46
|
-
<focus-trap v-model:active="dialogue" :prevent-scroll="true">
|
|
47
|
-
<div class="pop-outside">
|
|
48
|
-
<div class="pop-header">
|
|
49
|
-
<app-base-button
|
|
50
|
-
id="close-pop"
|
|
51
|
-
class="btn-ghost-ico"
|
|
52
|
-
:title="$t('button.closePopUp')"
|
|
53
|
-
:aria-label="$t('button.closePopUp')"
|
|
54
|
-
@click="$close()"
|
|
55
|
-
>
|
|
56
|
-
<svg aria-hidden="true" focusable="false">
|
|
57
|
-
<use href="#close-square-icon" />
|
|
58
|
-
</svg>
|
|
59
|
-
</app-base-button>
|
|
60
|
-
</div>
|
|
61
|
-
<div class="pop-containt">
|
|
62
|
-
<div class="pop-box">
|
|
63
|
-
<div id="popHeader">
|
|
64
|
-
<div id="dialogTitle" class="p-title" v-html="pTitle"></div>
|
|
65
|
-
</div>
|
|
66
|
-
<div class="box-content-popUp"></div>
|
|
67
|
-
<div
|
|
68
|
-
id="end-activity"
|
|
69
|
-
:aria-hidden="pType !== 'popup-endActivity'"
|
|
70
|
-
class="popup-bottom-buttons"
|
|
71
|
-
></div>
|
|
72
|
-
</div>
|
|
73
|
-
</div>
|
|
74
|
-
</div>
|
|
75
|
-
</focus-trap>
|
|
76
|
-
</v-dialog>
|
|
77
|
-
<!------------ POPUP INFO ----------------------------->
|
|
78
|
-
<v-dialog
|
|
79
|
-
id="popUp"
|
|
80
|
-
:model-value="popupType == 'popup-info' && dialogue"
|
|
81
|
-
:class="pType"
|
|
82
|
-
width="auto"
|
|
83
|
-
scrollable
|
|
84
|
-
centered
|
|
85
|
-
v-bind="pArgs"
|
|
86
|
-
@after-leave="$close(pContent.cb_$close)"
|
|
87
|
-
>
|
|
88
|
-
<focus-trap v-model:active="dialogue" :prevent-scroll="true">
|
|
89
|
-
<div class="pop-outside">
|
|
90
|
-
<div class="pop-header">
|
|
91
|
-
<app-base-button
|
|
92
|
-
id="close-pop"
|
|
93
|
-
class="btn-ghost-ico"
|
|
94
|
-
:title="$t('button.closePopUp')"
|
|
95
|
-
:aria-label="$t('button.closePopUp')"
|
|
96
|
-
@click="$close()"
|
|
97
|
-
>
|
|
98
|
-
<svg aria-hidden="true" focusable="false">
|
|
99
|
-
<use href="#close-square-icon" />
|
|
100
|
-
</svg>
|
|
101
|
-
</app-base-button>
|
|
102
|
-
</div>
|
|
103
|
-
<div class="pop-containt">
|
|
104
|
-
<div class="pop-box">
|
|
105
|
-
<div id="popHeader">
|
|
106
|
-
<p id="dialogTitle" class="p-title" v-html="pTitle"></p>
|
|
107
|
-
</div>
|
|
108
|
-
<div class="box-content-popUp">
|
|
109
|
-
<template v-if="contentLength > 0">
|
|
110
|
-
<template v-for="(content, _key, index) of pContent">
|
|
111
|
-
<!-------- Create TEXT element -------------->
|
|
112
|
-
<p
|
|
113
|
-
v-if="_key.includes('text') && !_key.includes('hyper')"
|
|
114
|
-
:id="`${_key}_${index}`"
|
|
115
|
-
:key="_key"
|
|
116
|
-
class="p-txt"
|
|
117
|
-
>
|
|
118
|
-
{{ content }}
|
|
119
|
-
</p>
|
|
120
|
-
|
|
121
|
-
<!-------- Create HTMLelement -------------->
|
|
122
|
-
<div
|
|
123
|
-
v-else-if="_key.includes('hypertext')"
|
|
124
|
-
:id="`${_key}_${index}`"
|
|
125
|
-
:key="`hyp_${_key}`"
|
|
126
|
-
v-html="content"
|
|
127
|
-
/>
|
|
128
|
-
|
|
129
|
-
<!-------- Create IMAGE element ------------->
|
|
130
|
-
<img
|
|
131
|
-
v-else-if="_key.includes('image')"
|
|
132
|
-
:id="`${_key}_${index}`"
|
|
133
|
-
:key="`img_${_key}`"
|
|
134
|
-
class="p-img"
|
|
135
|
-
:src="content.path"
|
|
136
|
-
:alt="content.label || 'image'"
|
|
137
|
-
/>
|
|
138
|
-
|
|
139
|
-
<!-------- Create LINK element -------------->
|
|
140
|
-
<a
|
|
141
|
-
v-else-if="_key.includes('link')"
|
|
142
|
-
:id="`${_key}_${index}`"
|
|
143
|
-
:key="`lnk_${_key}`"
|
|
144
|
-
:href="content.ref"
|
|
145
|
-
class="p-a"
|
|
146
|
-
target="_blank"
|
|
147
|
-
:title="`${content.label}`"
|
|
148
|
-
>
|
|
149
|
-
{{ content.label }}
|
|
150
|
-
</a>
|
|
151
|
-
|
|
152
|
-
<!-------- Create VIDEO element ------------->
|
|
153
|
-
<video
|
|
154
|
-
v-else-if="_key.includes('video')"
|
|
155
|
-
:id="`${_key}_${index}`"
|
|
156
|
-
:key="`vid_${_key}`"
|
|
157
|
-
:src="content"
|
|
158
|
-
class="p-vid"
|
|
159
|
-
controls
|
|
160
|
-
disablepictureinpicture
|
|
161
|
-
controlslist="nofullscreen nodownload"
|
|
162
|
-
/>
|
|
163
|
-
|
|
164
|
-
<!--------Create AUDIO element--------------->
|
|
165
|
-
<audio
|
|
166
|
-
v-else-if="_key.includes('audio')"
|
|
167
|
-
:id="`${_key}_${index}`"
|
|
168
|
-
:key="`aud_${_key}`"
|
|
169
|
-
:src="content"
|
|
170
|
-
class="p-aud"
|
|
171
|
-
controls
|
|
172
|
-
controlslist="nodownload"
|
|
173
|
-
/>
|
|
174
|
-
</template>
|
|
175
|
-
</template>
|
|
176
|
-
</div>
|
|
177
|
-
<div
|
|
178
|
-
id="end-activity"
|
|
179
|
-
:aria-hidden="pType !== 'popup-endActivity'"
|
|
180
|
-
class="popup-bottom-buttons"
|
|
181
|
-
></div>
|
|
182
|
-
</div>
|
|
183
|
-
</div>
|
|
184
|
-
</div>
|
|
185
|
-
</focus-trap>
|
|
186
|
-
</v-dialog>
|
|
187
|
-
<!------------ POPUP CUSTOM --------------------------->
|
|
188
|
-
<v-dialog
|
|
189
|
-
id="popUp"
|
|
190
|
-
:model-value="popupType == 'popup-custom' && dialogue"
|
|
191
|
-
:class="pType"
|
|
192
|
-
v-bind="pArgs"
|
|
193
|
-
@after-leave="$close(pContent.cb_$close)"
|
|
194
|
-
>
|
|
195
|
-
<focus-trap v-model:active="dialogue" :prevent-scroll="true">
|
|
196
|
-
<component :is="{ template: pContent.template }"></component>
|
|
197
|
-
</focus-trap>
|
|
198
|
-
</v-dialog>
|
|
199
|
-
<!------------------------------- END POPUPS ------------------------------>
|
|
200
|
-
</template>
|
|
201
|
-
<app-base-error-display
|
|
202
|
-
v-show="errors.length"
|
|
203
|
-
:error-group="'component'"
|
|
204
|
-
:error-title="'ERREUR: COMPOSANT DE POPUP'"
|
|
205
|
-
:errors-list="errors"
|
|
206
|
-
/>
|
|
207
|
-
</div>
|
|
208
|
-
</template>
|
|
209
|
-
|
|
210
|
-
<script>
|
|
211
|
-
import { mapState, mapActions } from 'pinia'
|
|
212
|
-
import { useAppStore } from '../module/stores/appStore'
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
return
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
this.$bus.$
|
|
254
|
-
this.$bus.$
|
|
255
|
-
},
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
case data.type === 'popup-
|
|
294
|
-
KeywordsList = ['
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
'
|
|
311
|
-
'
|
|
312
|
-
'
|
|
313
|
-
'
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
const { title,
|
|
393
|
-
this.pContent = filtered
|
|
394
|
-
this.pTitle = title
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
this
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
.
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
}
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
.pop-
|
|
472
|
-
display: flex;
|
|
473
|
-
justify-content:
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
}
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
1
|
+
<!-- About this Component--
|
|
2
|
+
*@ Description: Application component to show instructions in a modal.
|
|
3
|
+
*@ What it does: This component uses the VDialog component to create a Popup. 2 types of popups can be display:
|
|
4
|
+
- end of activities popup (popup-endActivity). Default used by the application at the end of activities (AppCompNavigation)
|
|
5
|
+
- custom popup (popup-custom)- this allow user to defined custom popup using the power of VDialog. Must respect properties defined by VDialog. For more info, refer to https://vuetifyjs.com/en/components/dialogs/#usage.
|
|
6
|
+
It validates the content of the popup before rendering. Will render error view if there are some errors in content definition
|
|
7
|
+
* What it needs: data must contain:
|
|
8
|
+
- type(string) : 'popup-endAcivity' || 'popup-custom || popup-info'
|
|
9
|
+
- value (Object): {$bvArgs(Object), template (String)}
|
|
10
|
+
|
|
11
|
+
*⚠️@Note :There can only be Popup instance of this component in the application. You can ask the application to open the Popup with you defined popup
|
|
12
|
+
*@ Exemple: creating a custom popup using the VDialog props
|
|
13
|
+
|
|
14
|
+
const myCustomProp = {
|
|
15
|
+
type: 'popup-custom',
|
|
16
|
+
value: {
|
|
17
|
+
//⚠️IMPORTANT:Only props of VDialog must be listed in $bvArgs. Check VDialog documentation for full list of props
|
|
18
|
+
$bvArgs: {
|
|
19
|
+
centered: true,
|
|
20
|
+
width: 'auto',
|
|
21
|
+
scrollable: false,
|
|
22
|
+
'max-width': '600'
|
|
23
|
+
}
|
|
24
|
+
//⚠️IMPORTANT:Must have a template attribute
|
|
25
|
+
tempate:`<div><h4>Exemple of custom popup</h4><p>Hello World</p></div>`
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
// Now we can ask the application to open our custom popup
|
|
29
|
+
this.$bus.$emit('open-popup', myCustomProp)
|
|
30
|
+
-->
|
|
31
|
+
|
|
32
|
+
<template>
|
|
33
|
+
<div>
|
|
34
|
+
<template v-if="!errors.length">
|
|
35
|
+
<!------------ End Activity --------------------------->
|
|
36
|
+
|
|
37
|
+
<v-dialog
|
|
38
|
+
id="popUp"
|
|
39
|
+
:model-value="popupType == 'popup-endActivity' && dialogue"
|
|
40
|
+
:class="pType"
|
|
41
|
+
width="auto"
|
|
42
|
+
scrollable
|
|
43
|
+
centered
|
|
44
|
+
@after-leave="$close(pContent.cb_$close)"
|
|
45
|
+
>
|
|
46
|
+
<focus-trap v-model:active="dialogue" :prevent-scroll="true">
|
|
47
|
+
<div class="pop-outside">
|
|
48
|
+
<div class="pop-header">
|
|
49
|
+
<app-base-button
|
|
50
|
+
id="close-pop"
|
|
51
|
+
class="btn-ghost-ico"
|
|
52
|
+
:title="$t('button.closePopUp')"
|
|
53
|
+
:aria-label="$t('button.closePopUp')"
|
|
54
|
+
@click="$close()"
|
|
55
|
+
>
|
|
56
|
+
<svg aria-hidden="true" focusable="false">
|
|
57
|
+
<use href="#close-square-icon" />
|
|
58
|
+
</svg>
|
|
59
|
+
</app-base-button>
|
|
60
|
+
</div>
|
|
61
|
+
<div class="pop-containt">
|
|
62
|
+
<div class="pop-box">
|
|
63
|
+
<div id="popHeader">
|
|
64
|
+
<div id="dialogTitle" class="p-title" v-html="pTitle"></div>
|
|
65
|
+
</div>
|
|
66
|
+
<div class="box-content-popUp"></div>
|
|
67
|
+
<div
|
|
68
|
+
id="end-activity"
|
|
69
|
+
:aria-hidden="pType !== 'popup-endActivity'"
|
|
70
|
+
class="popup-bottom-buttons"
|
|
71
|
+
></div>
|
|
72
|
+
</div>
|
|
73
|
+
</div>
|
|
74
|
+
</div>
|
|
75
|
+
</focus-trap>
|
|
76
|
+
</v-dialog>
|
|
77
|
+
<!------------ POPUP INFO ----------------------------->
|
|
78
|
+
<v-dialog
|
|
79
|
+
id="popUp"
|
|
80
|
+
:model-value="popupType == 'popup-info' && dialogue"
|
|
81
|
+
:class="pType"
|
|
82
|
+
width="auto"
|
|
83
|
+
scrollable
|
|
84
|
+
centered
|
|
85
|
+
v-bind="pArgs"
|
|
86
|
+
@after-leave="$close(pContent.cb_$close)"
|
|
87
|
+
>
|
|
88
|
+
<focus-trap v-model:active="dialogue" :prevent-scroll="true">
|
|
89
|
+
<div class="pop-outside">
|
|
90
|
+
<div class="pop-header">
|
|
91
|
+
<app-base-button
|
|
92
|
+
id="close-pop"
|
|
93
|
+
class="btn-ghost-ico"
|
|
94
|
+
:title="$t('button.closePopUp')"
|
|
95
|
+
:aria-label="$t('button.closePopUp')"
|
|
96
|
+
@click="$close()"
|
|
97
|
+
>
|
|
98
|
+
<svg aria-hidden="true" focusable="false">
|
|
99
|
+
<use href="#close-square-icon" />
|
|
100
|
+
</svg>
|
|
101
|
+
</app-base-button>
|
|
102
|
+
</div>
|
|
103
|
+
<div class="pop-containt">
|
|
104
|
+
<div class="pop-box">
|
|
105
|
+
<div id="popHeader">
|
|
106
|
+
<p id="dialogTitle" class="p-title" v-html="pTitle"></p>
|
|
107
|
+
</div>
|
|
108
|
+
<div class="box-content-popUp">
|
|
109
|
+
<template v-if="contentLength > 0">
|
|
110
|
+
<template v-for="(content, _key, index) of pContent">
|
|
111
|
+
<!-------- Create TEXT element -------------->
|
|
112
|
+
<p
|
|
113
|
+
v-if="_key.includes('text') && !_key.includes('hyper')"
|
|
114
|
+
:id="`${_key}_${index}`"
|
|
115
|
+
:key="_key"
|
|
116
|
+
class="p-txt"
|
|
117
|
+
>
|
|
118
|
+
{{ content }}
|
|
119
|
+
</p>
|
|
120
|
+
|
|
121
|
+
<!-------- Create HTMLelement -------------->
|
|
122
|
+
<div
|
|
123
|
+
v-else-if="_key.includes('hypertext')"
|
|
124
|
+
:id="`${_key}_${index}`"
|
|
125
|
+
:key="`hyp_${_key}`"
|
|
126
|
+
v-html="content"
|
|
127
|
+
/>
|
|
128
|
+
|
|
129
|
+
<!-------- Create IMAGE element ------------->
|
|
130
|
+
<img
|
|
131
|
+
v-else-if="_key.includes('image')"
|
|
132
|
+
:id="`${_key}_${index}`"
|
|
133
|
+
:key="`img_${_key}`"
|
|
134
|
+
class="p-img"
|
|
135
|
+
:src="content.path"
|
|
136
|
+
:alt="content.label || 'image'"
|
|
137
|
+
/>
|
|
138
|
+
|
|
139
|
+
<!-------- Create LINK element -------------->
|
|
140
|
+
<a
|
|
141
|
+
v-else-if="_key.includes('link')"
|
|
142
|
+
:id="`${_key}_${index}`"
|
|
143
|
+
:key="`lnk_${_key}`"
|
|
144
|
+
:href="content.ref"
|
|
145
|
+
class="p-a"
|
|
146
|
+
target="_blank"
|
|
147
|
+
:title="`${content.label}`"
|
|
148
|
+
>
|
|
149
|
+
{{ content.label }}
|
|
150
|
+
</a>
|
|
151
|
+
|
|
152
|
+
<!-------- Create VIDEO element ------------->
|
|
153
|
+
<video
|
|
154
|
+
v-else-if="_key.includes('video')"
|
|
155
|
+
:id="`${_key}_${index}`"
|
|
156
|
+
:key="`vid_${_key}`"
|
|
157
|
+
:src="content"
|
|
158
|
+
class="p-vid"
|
|
159
|
+
controls
|
|
160
|
+
disablepictureinpicture
|
|
161
|
+
controlslist="nofullscreen nodownload"
|
|
162
|
+
/>
|
|
163
|
+
|
|
164
|
+
<!--------Create AUDIO element--------------->
|
|
165
|
+
<audio
|
|
166
|
+
v-else-if="_key.includes('audio')"
|
|
167
|
+
:id="`${_key}_${index}`"
|
|
168
|
+
:key="`aud_${_key}`"
|
|
169
|
+
:src="content"
|
|
170
|
+
class="p-aud"
|
|
171
|
+
controls
|
|
172
|
+
controlslist="nodownload"
|
|
173
|
+
/>
|
|
174
|
+
</template>
|
|
175
|
+
</template>
|
|
176
|
+
</div>
|
|
177
|
+
<div
|
|
178
|
+
id="end-activity"
|
|
179
|
+
:aria-hidden="pType !== 'popup-endActivity'"
|
|
180
|
+
class="popup-bottom-buttons"
|
|
181
|
+
></div>
|
|
182
|
+
</div>
|
|
183
|
+
</div>
|
|
184
|
+
</div>
|
|
185
|
+
</focus-trap>
|
|
186
|
+
</v-dialog>
|
|
187
|
+
<!------------ POPUP CUSTOM --------------------------->
|
|
188
|
+
<v-dialog
|
|
189
|
+
id="popUp"
|
|
190
|
+
:model-value="popupType == 'popup-custom' && dialogue"
|
|
191
|
+
:class="pType"
|
|
192
|
+
v-bind="pArgs"
|
|
193
|
+
@after-leave="$close(pContent.cb_$close)"
|
|
194
|
+
>
|
|
195
|
+
<focus-trap v-model:active="dialogue" :prevent-scroll="true">
|
|
196
|
+
<component :is="{ template: pContent.template }"></component>
|
|
197
|
+
</focus-trap>
|
|
198
|
+
</v-dialog>
|
|
199
|
+
<!------------------------------- END POPUPS ------------------------------>
|
|
200
|
+
</template>
|
|
201
|
+
<app-base-error-display
|
|
202
|
+
v-show="errors.length"
|
|
203
|
+
:error-group="'component'"
|
|
204
|
+
:error-title="'ERREUR: COMPOSANT DE POPUP'"
|
|
205
|
+
:errors-list="errors"
|
|
206
|
+
/>
|
|
207
|
+
</div>
|
|
208
|
+
</template>
|
|
209
|
+
|
|
210
|
+
<script>
|
|
211
|
+
import { mapState, mapActions } from 'pinia'
|
|
212
|
+
import { useAppStore } from '../module/stores/appStore'
|
|
213
|
+
import { useI18n } from 'vue-i18n'
|
|
214
|
+
|
|
215
|
+
export default {
|
|
216
|
+
name: 'AppCompPopUp',
|
|
217
|
+
setup() {
|
|
218
|
+
const { t } = useI18n()
|
|
219
|
+
return { t }
|
|
220
|
+
},
|
|
221
|
+
data() {
|
|
222
|
+
return {
|
|
223
|
+
pType: null,
|
|
224
|
+
pName: 'noName',
|
|
225
|
+
pContent: {},
|
|
226
|
+
pArgs: null,
|
|
227
|
+
pTitle: '',
|
|
228
|
+
errors: [],
|
|
229
|
+
docLink:
|
|
230
|
+
'https://fcaddocumentation.netlify.app/guide/ressources.html#creer-un-popup-custom',
|
|
231
|
+
animationOff: false,
|
|
232
|
+
dialogue: false
|
|
233
|
+
}
|
|
234
|
+
},
|
|
235
|
+
computed: {
|
|
236
|
+
...mapState(useAppStore, ['getNotes', 'getWidgetOpen']),
|
|
237
|
+
contentLength() {
|
|
238
|
+
let size = null
|
|
239
|
+
if (!this.pType || this.pType !== 'popup-info') return
|
|
240
|
+
|
|
241
|
+
if (this.pContent && Object.keys(this.pContent).length > 0)
|
|
242
|
+
size = Object.keys(this.pContent).length
|
|
243
|
+
return size
|
|
244
|
+
},
|
|
245
|
+
|
|
246
|
+
popupType() {
|
|
247
|
+
if (!this.pType) return
|
|
248
|
+
return this.pType
|
|
249
|
+
}
|
|
250
|
+
},
|
|
251
|
+
|
|
252
|
+
mounted() {
|
|
253
|
+
this.$bus.$on('popup-open', this.validateContent)
|
|
254
|
+
this.$bus.$on('popup-close', this.$close)
|
|
255
|
+
},
|
|
256
|
+
beforeUnmount() {
|
|
257
|
+
this.$bus.$off('popup-open', this.validateContent)
|
|
258
|
+
this.$bus.$off('popup-close', this.$close)
|
|
259
|
+
},
|
|
260
|
+
methods: {
|
|
261
|
+
...mapActions(useAppStore, ['updateEndPopUp']),
|
|
262
|
+
/**
|
|
263
|
+
* @description - Validate the data for the component
|
|
264
|
+
* @param {Object} data
|
|
265
|
+
*/
|
|
266
|
+
validateContent(data) {
|
|
267
|
+
if (!data) return
|
|
268
|
+
const typeList = ['popup-custom', 'popup-endActivity', 'popup-info']
|
|
269
|
+
|
|
270
|
+
if (this.errors.length > 0) this.errors = []
|
|
271
|
+
|
|
272
|
+
if (data.type) {
|
|
273
|
+
// validate the type value of popup
|
|
274
|
+
const validType = typeList.includes(data.type)
|
|
275
|
+
|
|
276
|
+
if (!validType) this.errors.push('Invalid value for type')
|
|
277
|
+
} else this.errors.push('Missing argument: type')
|
|
278
|
+
|
|
279
|
+
// validate value of the popup according to popup type
|
|
280
|
+
// Content must be String|Object
|
|
281
|
+
if (data.value) {
|
|
282
|
+
let validObject = false
|
|
283
|
+
if (
|
|
284
|
+
data.value.constructor === Object &&
|
|
285
|
+
Object.keys(data.value).length > 0
|
|
286
|
+
)
|
|
287
|
+
validObject = true
|
|
288
|
+
|
|
289
|
+
if (validObject) {
|
|
290
|
+
let KeywordsList
|
|
291
|
+
//Validate the content accordint to popup type
|
|
292
|
+
switch (true) {
|
|
293
|
+
case data.type === 'popup-endActivity':
|
|
294
|
+
KeywordsList = ['template', 'title'] // accepted keywords in value declaration for pop-up end-Activity
|
|
295
|
+
break
|
|
296
|
+
|
|
297
|
+
case data.type === 'popup-custom':
|
|
298
|
+
KeywordsList = ['$bvArgs', 'template'] // accepted keywords in value declaration for pop-up custom
|
|
299
|
+
//Must have required keywords
|
|
300
|
+
for (const key of KeywordsList) {
|
|
301
|
+
if (data.value[key]) continue
|
|
302
|
+
this.errors.push(
|
|
303
|
+
`Missing required attribute 👉${key}👈. Required attributes are ${[...KeywordsList]}`
|
|
304
|
+
)
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
break
|
|
308
|
+
default:
|
|
309
|
+
KeywordsList = [
|
|
310
|
+
'title',
|
|
311
|
+
'text_',
|
|
312
|
+
'image_',
|
|
313
|
+
'video_',
|
|
314
|
+
'audio_',
|
|
315
|
+
'link_',
|
|
316
|
+
'hypertext_',
|
|
317
|
+
'$bvArgs'
|
|
318
|
+
] // accepted keyword in value declaration for pop-up custom
|
|
319
|
+
}
|
|
320
|
+
//validate each key in value content
|
|
321
|
+
|
|
322
|
+
for (let key of Object.keys(data.value)) {
|
|
323
|
+
let expectedKey = key
|
|
324
|
+
// search if key match lists
|
|
325
|
+
if (key.includes('_') && !key.includes('cb_$'))
|
|
326
|
+
expectedKey = `${key.split('_')[0]}_`
|
|
327
|
+
|
|
328
|
+
//===============================================
|
|
329
|
+
const test = (regexp) => regexp.test(expectedKey) //defining the testing function
|
|
330
|
+
|
|
331
|
+
switch (true) {
|
|
332
|
+
case ![...KeywordsList].includes(expectedKey):
|
|
333
|
+
this.errors.push(
|
|
334
|
+
`Invalid attribute declaration 👉${key}👈 . Expected attributes are ${[...KeywordsList]}`
|
|
335
|
+
)
|
|
336
|
+
break
|
|
337
|
+
|
|
338
|
+
case test(/link/):
|
|
339
|
+
// Validating content of link element
|
|
340
|
+
if (!data.value[key].ref) {
|
|
341
|
+
this.errors.push('Missing ref for link')
|
|
342
|
+
}
|
|
343
|
+
break
|
|
344
|
+
|
|
345
|
+
case test(/image/):
|
|
346
|
+
// Validating content of link element
|
|
347
|
+
if (!data.value[key].path) {
|
|
348
|
+
this.errors.push('Missing path for image')
|
|
349
|
+
}
|
|
350
|
+
break
|
|
351
|
+
|
|
352
|
+
case test(/cb_\$/):
|
|
353
|
+
// validating content of cb_$ keys to be a function
|
|
354
|
+
if (data.value[key].constructor != Function)
|
|
355
|
+
this.errors.push(
|
|
356
|
+
`Invalid assignment for attribute 👉${expectedKey} popup. Must be a Function`
|
|
357
|
+
)
|
|
358
|
+
break
|
|
359
|
+
|
|
360
|
+
case test(/\$bvArgs/):
|
|
361
|
+
// validating content of cb_$ keys to be a function
|
|
362
|
+
|
|
363
|
+
if (data.value[key].constructor != Object)
|
|
364
|
+
this.errors.push(
|
|
365
|
+
`Invalid assignment for attribute 👉${expectedKey} popup. Must be an Object`
|
|
366
|
+
)
|
|
367
|
+
|
|
368
|
+
break
|
|
369
|
+
|
|
370
|
+
default: {
|
|
371
|
+
if (data.value[key].constructor != String) {
|
|
372
|
+
this.errors.push(
|
|
373
|
+
`Invalid assignment for attribute 👉${key} in popup. Must be a String`
|
|
374
|
+
)
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
} else this.errors.push('Invalid object declaration for value')
|
|
380
|
+
} else this.errors.push('Missing argument - value')
|
|
381
|
+
|
|
382
|
+
if (import.meta.env.DEV) {
|
|
383
|
+
for (const err of this.errors)
|
|
384
|
+
console.warn(
|
|
385
|
+
`%c WARNING!>>> POP-UP: ${err} `,
|
|
386
|
+
'background: orange; color: white; display: block; border-radius:5px; margin:5px;'
|
|
387
|
+
)
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
if (!this.errors.length) {
|
|
391
|
+
if (data.type === 'popup-endActivity') {
|
|
392
|
+
const { title, ...filtered } = data.value
|
|
393
|
+
this.pContent = filtered
|
|
394
|
+
this.pTitle = title
|
|
395
|
+
} else {
|
|
396
|
+
const { title, $bvArgs, ...filtered } = data.value
|
|
397
|
+
this.pContent = filtered
|
|
398
|
+
this.pTitle = title
|
|
399
|
+
this.pArgs = $bvArgs // native VDialog props
|
|
400
|
+
}
|
|
401
|
+
this.pType = data.type
|
|
402
|
+
this.pName = data.name
|
|
403
|
+
|
|
404
|
+
if (this.pType == 'popup-endActivity')
|
|
405
|
+
this.updateEndPopUp(true) //This will handle the activation of the element in the portal
|
|
406
|
+
else this.updateEndPopUp(false) //This will handle the activation of the element in the portal
|
|
407
|
+
if (this.getWidgetOpen) {
|
|
408
|
+
this.$bus.$emit('close-widget')
|
|
409
|
+
}
|
|
410
|
+
this.$open()
|
|
411
|
+
}
|
|
412
|
+
},
|
|
413
|
+
|
|
414
|
+
/**
|
|
415
|
+
* @description - method to open the popup
|
|
416
|
+
* @param {Function} cb
|
|
417
|
+
*/
|
|
418
|
+
$open(cb) {
|
|
419
|
+
this.dialogue = true
|
|
420
|
+
},
|
|
421
|
+
/**
|
|
422
|
+
* @description - method to close the popup
|
|
423
|
+
* @param {Function} cb
|
|
424
|
+
*/
|
|
425
|
+
$close(options, cb) {
|
|
426
|
+
if (this.pType === 'popup-endActivity') this.updateEndPopUp(false)
|
|
427
|
+
this.dialogue = false
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
</script>
|
|
432
|
+
<style lang="scss">
|
|
433
|
+
.v-overlay__scrim {
|
|
434
|
+
background: none !important;
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
.popup-info {
|
|
438
|
+
.v-overlay__content {
|
|
439
|
+
width: 565px !important;
|
|
440
|
+
padding: 16px 24px 24px 24px;
|
|
441
|
+
overflow: hidden;
|
|
442
|
+
|
|
443
|
+
.pop-outside {
|
|
444
|
+
.pop-header {
|
|
445
|
+
display: flex;
|
|
446
|
+
flex-direction: row;
|
|
447
|
+
justify-content: flex-end;
|
|
448
|
+
width: 100%;
|
|
449
|
+
|
|
450
|
+
#close-pop {
|
|
451
|
+
margin-right: 2px;
|
|
452
|
+
margin-top: 2px;
|
|
453
|
+
}
|
|
454
|
+
}
|
|
455
|
+
}
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
|
|
459
|
+
.popup-endActivity {
|
|
460
|
+
.v-overlay__content {
|
|
461
|
+
max-height: 277px !important;
|
|
462
|
+
margin: 0 !important;
|
|
463
|
+
width: 100% !important;
|
|
464
|
+
max-width: 100% !important;
|
|
465
|
+
|
|
466
|
+
.pop-outside {
|
|
467
|
+
display: flex;
|
|
468
|
+
flex-direction: column;
|
|
469
|
+
padding: 24px;
|
|
470
|
+
|
|
471
|
+
.pop-header {
|
|
472
|
+
display: flex;
|
|
473
|
+
justify-content: flex-end;
|
|
474
|
+
}
|
|
475
|
+
.pop-containt {
|
|
476
|
+
display: flex;
|
|
477
|
+
justify-content: center;
|
|
478
|
+
position: relative;
|
|
479
|
+
bottom: 8px;
|
|
480
|
+
|
|
481
|
+
#popHeader {
|
|
482
|
+
display: flex;
|
|
483
|
+
justify-content: center;
|
|
484
|
+
margin-bottom: 24px;
|
|
485
|
+
}
|
|
486
|
+
|
|
487
|
+
.popup-bottom-buttons {
|
|
488
|
+
display: flex;
|
|
489
|
+
justify-content: center;
|
|
490
|
+
|
|
491
|
+
.btn {
|
|
492
|
+
&:first-child {
|
|
493
|
+
margin-right: 24px;
|
|
494
|
+
}
|
|
495
|
+
}
|
|
496
|
+
}
|
|
497
|
+
}
|
|
498
|
+
}
|
|
499
|
+
}
|
|
500
|
+
}
|
|
501
|
+
|
|
502
|
+
.popup-custom {
|
|
503
|
+
.v-overlay__content {
|
|
504
|
+
margin: 0 !important;
|
|
505
|
+
width: 100% !important;
|
|
506
|
+
}
|
|
507
|
+
}
|
|
508
|
+
</style>
|