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
package/src/router/routes.js
CHANGED
|
@@ -1,312 +1,312 @@
|
|
|
1
|
-
import AppCompViewDisplay from '../components/AppCompViewDisplay.vue'
|
|
2
|
-
import { fileAssets } from '../shared/generalfuncs'
|
|
3
|
-
//import ModuleView from '@/views/ModuleView.vue' // Uncomment for Production
|
|
4
|
-
// import SummaryView from '@/views/SummaryView.vue' // Uncomment for Production
|
|
5
|
-
|
|
6
|
-
//import ModuleView from '../externalComps/ModuleView.vue' //Only for unit-Testing
|
|
7
|
-
//import SummaryView from '../externalComps/SummaryView.vue' //Only for unit-Testing
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* The router Module defines the routes of the App by:
|
|
11
|
-
* loading the required files for module and activities pages,
|
|
12
|
-
* dynamically creating the navigation route of module base on the file in VIEWS folder
|
|
13
|
-
* dynamically creating the navigation routes of activities and branchings base on the files contained in the MODULE
|
|
14
|
-
* Creating Redirection routes for navigation error
|
|
15
|
-
* Adding the pages for the module in the STORE
|
|
16
|
-
*/
|
|
17
|
-
|
|
18
|
-
const defaultRoutes = [] // routes of the app
|
|
19
|
-
let errorType = null
|
|
20
|
-
let viewRoute = null // holder for views routes
|
|
21
|
-
let mappedFiles = null // routes definitions
|
|
22
|
-
|
|
23
|
-
// Creating 1st route: redirection for none existing route to home(Module)
|
|
24
|
-
defaultRoutes.push({
|
|
25
|
-
path: '/:pathMatch(.*)*',
|
|
26
|
-
redirect: {
|
|
27
|
-
name: '404'
|
|
28
|
-
}
|
|
29
|
-
})
|
|
30
|
-
|
|
31
|
-
/**
|
|
32
|
-
* 2 - Creating the 2nd route: The App module route
|
|
33
|
-
*/
|
|
34
|
-
// Load all the files in the VIEWS folder
|
|
35
|
-
|
|
36
|
-
const defaultRoute = {
|
|
37
|
-
path: '/',
|
|
38
|
-
component: AppCompViewDisplay,
|
|
39
|
-
children: [],
|
|
40
|
-
meta: {}
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
if (fileAssets.getViews().length > 0) {
|
|
44
|
-
let hasModule = false
|
|
45
|
-
let hasSummary = false
|
|
46
|
-
let fileRef = null
|
|
47
|
-
let splitted = null
|
|
48
|
-
let fileName = null
|
|
49
|
-
let fileContent = null
|
|
50
|
-
|
|
51
|
-
for (let view of fileAssets.getViews()) {
|
|
52
|
-
fileRef = view.name.replace(/(\.\/)/g, '')
|
|
53
|
-
splitted = fileRef.split('/')
|
|
54
|
-
fileName = splitted[splitted.length - 1].replace(/(\.vue)/g, '')
|
|
55
|
-
fileContent = view.content
|
|
56
|
-
|
|
57
|
-
// Create route for the views
|
|
58
|
-
viewRoute = {
|
|
59
|
-
name: fileName.toLowerCase(),
|
|
60
|
-
|
|
61
|
-
meta: {}
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
if (fileName.toLowerCase() === 'moduleview' && fileContent.data) {
|
|
65
|
-
viewRoute.path = ''
|
|
66
|
-
viewRoute.name = 'module'
|
|
67
|
-
viewRoute.component = () => import(`@/views/ModuleView.vue`)
|
|
68
|
-
viewRoute.children = []
|
|
69
|
-
viewRoute.meta.children = []
|
|
70
|
-
hasModule = true
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
if (fileName.toLowerCase() == 'summaryview' && fileContent.data) {
|
|
74
|
-
viewRoute.path = '/menu'
|
|
75
|
-
viewRoute.name = 'menu'
|
|
76
|
-
viewRoute.component = () => import(`@/views/SummaryView.vue`)
|
|
77
|
-
viewRoute.meta.type = 'menu'
|
|
78
|
-
viewRoute.meta.id = 'pg_menu'
|
|
79
|
-
hasSummary = true
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
defaultRoute.children.push(viewRoute)
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
// Create activities routes for the ModuleView
|
|
86
|
-
if (hasModule) {
|
|
87
|
-
const moduleRoute = defaultRoute.children.find((r) => r.name == 'module') //Get ModuleView route
|
|
88
|
-
//================== Routes For Activities ================//
|
|
89
|
-
// Load files in module folder
|
|
90
|
-
const _allFiles = fileAssets.getActivities()
|
|
91
|
-
|
|
92
|
-
mappedFiles = fileAssets.buildMapTree(_allFiles)
|
|
93
|
-
let abstractRouteForActivity = {}
|
|
94
|
-
if (!mappedFiles.size) errorType = 'errorPage'
|
|
95
|
-
|
|
96
|
-
//There is a file in the module folder
|
|
97
|
-
/**
|
|
98
|
-
* Define a route for each Activity and its pages
|
|
99
|
-
* Set all nested routes in Activities
|
|
100
|
-
* Set the activies routes as children of module route
|
|
101
|
-
*/
|
|
102
|
-
let activityCount = 0
|
|
103
|
-
|
|
104
|
-
const buildRouteWithNested = ($arr, $folderName, ctx = '') => {
|
|
105
|
-
let bCounter = 0 //branch counter
|
|
106
|
-
|
|
107
|
-
let mainRoute = {}
|
|
108
|
-
for (const [key, value] of $arr) {
|
|
109
|
-
let pgIDtoNum = parseInt(key.slice(1))
|
|
110
|
-
let firstEl = $arr.entries().next().value
|
|
111
|
-
|
|
112
|
-
if (value.constructor === Map)
|
|
113
|
-
buildRouteWithNested(value, $folderName, ctx)
|
|
114
|
-
|
|
115
|
-
if (key == firstEl[0]) {
|
|
116
|
-
//Define the main route according to 1st page id
|
|
117
|
-
mainRoute = (() => {
|
|
118
|
-
//1st Page is branching
|
|
119
|
-
|
|
120
|
-
if (key == 'P01')
|
|
121
|
-
return {
|
|
122
|
-
path: `page-1`,
|
|
123
|
-
name: `${ctx.replace('-', '_')}`,
|
|
124
|
-
component: () => import(`@/${firstEl[1].ref}.vue`),
|
|
125
|
-
children: [],
|
|
126
|
-
meta: {
|
|
127
|
-
id: firstEl[0],
|
|
128
|
-
type: 'branching',
|
|
129
|
-
activity_ref: $folderName, // Axx
|
|
130
|
-
children: []
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
return {
|
|
135
|
-
path: `page-${pgIDtoNum}`,
|
|
136
|
-
name: `${ctx.replace('-', '_')}.page_${pgIDtoNum}`,
|
|
137
|
-
component: () => import(`@/${firstEl[1].ref}.vue`),
|
|
138
|
-
children: [],
|
|
139
|
-
meta: {
|
|
140
|
-
id: firstEl[0],
|
|
141
|
-
type: 'branching',
|
|
142
|
-
activity_ref: $folderName, // Axx
|
|
143
|
-
parent: {
|
|
144
|
-
_ref: 'P01',
|
|
145
|
-
_path: ctx, // activite-xx
|
|
146
|
-
_namedRoute: ctx.replace('-', '_') // activite_xx
|
|
147
|
-
},
|
|
148
|
-
children: []
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
})()
|
|
152
|
-
} else {
|
|
153
|
-
bCounter += 1
|
|
154
|
-
// build abstract route for branching
|
|
155
|
-
let branchRoute = {
|
|
156
|
-
path: `branche-${bCounter}`,
|
|
157
|
-
name: `${mainRoute.name}.branche_${bCounter}`,
|
|
158
|
-
component: () => import(`@/${value.ref}.vue`),
|
|
159
|
-
meta: {
|
|
160
|
-
id: key,
|
|
161
|
-
type: 'branch_page',
|
|
162
|
-
activity_ref: $folderName,
|
|
163
|
-
_branchingRef: `${firstEl[0]}.branch_${bCounter}`,
|
|
164
|
-
parent: {
|
|
165
|
-
_ref: firstEl[0],
|
|
166
|
-
_path: mainRoute.path,
|
|
167
|
-
_namedRoute: mainRoute.name
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
mainRoute.children.push(branchRoute)
|
|
172
|
-
mainRoute.meta.children.push({
|
|
173
|
-
_ref: key,
|
|
174
|
-
_path: branchRoute.path,
|
|
175
|
-
_namedRoute: branchRoute.name
|
|
176
|
-
})
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
return mainRoute
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
for (const [$folderName, $pages] of mappedFiles) {
|
|
184
|
-
let activityPageCount = 0 // page counter
|
|
185
|
-
//build a abstract route for each folder/activity
|
|
186
|
-
abstractRouteForActivity = {
|
|
187
|
-
component: AppCompViewDisplay,
|
|
188
|
-
meta: {
|
|
189
|
-
id: $folderName,
|
|
190
|
-
children: []
|
|
191
|
-
},
|
|
192
|
-
children: []
|
|
193
|
-
}
|
|
194
|
-
//Define the path for each folder
|
|
195
|
-
if ($folderName === 'A00') {
|
|
196
|
-
abstractRouteForActivity.path = 'introduction'
|
|
197
|
-
} else if ($folderName === 'A99') {
|
|
198
|
-
abstractRouteForActivity.path = 'conclusion'
|
|
199
|
-
} else {
|
|
200
|
-
activityCount++
|
|
201
|
-
abstractRouteForActivity.path = `activite-${activityCount}`
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
//Build the Route for each page of the Activity
|
|
205
|
-
for (const [$pageRef, $page] of $pages) {
|
|
206
|
-
let activityRoute
|
|
207
|
-
activityPageCount++
|
|
208
|
-
|
|
209
|
-
if ($page.constructor === Object) {
|
|
210
|
-
let firstPage = $pages.entries().next().value
|
|
211
|
-
if ($pageRef == firstPage[0]) {
|
|
212
|
-
activityRoute = {
|
|
213
|
-
path: 'page-1',
|
|
214
|
-
name: abstractRouteForActivity.path.replace('-', '_'), //activite_xx
|
|
215
|
-
component: () => import(`@/${$page.ref}.vue`),
|
|
216
|
-
meta: {
|
|
217
|
-
id: `${$pageRef}`,
|
|
218
|
-
activity_ref: $folderName,
|
|
219
|
-
type: (() => {
|
|
220
|
-
return abstractRouteForActivity.path.includes('activite')
|
|
221
|
-
? 'normal'
|
|
222
|
-
: abstractRouteForActivity.path
|
|
223
|
-
})(),
|
|
224
|
-
parent: {
|
|
225
|
-
_ref: `${$pageRef}`,
|
|
226
|
-
_path: abstractRouteForActivity.path,
|
|
227
|
-
_namedRoute: abstractRouteForActivity.path.replace('-', '_')
|
|
228
|
-
}
|
|
229
|
-
}
|
|
230
|
-
}
|
|
231
|
-
} else {
|
|
232
|
-
activityRoute = {
|
|
233
|
-
path: `page-${activityPageCount}`,
|
|
234
|
-
name: (() => {
|
|
235
|
-
let str = abstractRouteForActivity.path.replace('-', '_')
|
|
236
|
-
|
|
237
|
-
if (activityPageCount > 1)
|
|
238
|
-
str = `${str}.page_${activityPageCount}`
|
|
239
|
-
|
|
240
|
-
return str
|
|
241
|
-
})(),
|
|
242
|
-
component: () => import(`@/${$page.ref}.vue`),
|
|
243
|
-
meta: {
|
|
244
|
-
id: $pageRef,
|
|
245
|
-
activity_ref: $folderName,
|
|
246
|
-
type: (() => {
|
|
247
|
-
return abstractRouteForActivity.path.includes('activite')
|
|
248
|
-
? 'normal'
|
|
249
|
-
: abstractRouteForActivity.path
|
|
250
|
-
})(),
|
|
251
|
-
parent: {
|
|
252
|
-
_ref: `${$pageRef}`,
|
|
253
|
-
_path: abstractRouteForActivity.path,
|
|
254
|
-
_namedRoute: abstractRouteForActivity.path.replace('-', '_')
|
|
255
|
-
}
|
|
256
|
-
}
|
|
257
|
-
}
|
|
258
|
-
}
|
|
259
|
-
}
|
|
260
|
-
//Handling Branching Routes
|
|
261
|
-
if ($page.constructor === Map) {
|
|
262
|
-
const ctx = abstractRouteForActivity.path
|
|
263
|
-
activityRoute = buildRouteWithNested($page, $folderName, ctx)
|
|
264
|
-
}
|
|
265
|
-
//add page route into activity children
|
|
266
|
-
abstractRouteForActivity.children.push(activityRoute)
|
|
267
|
-
|
|
268
|
-
//add page route reference into in activity meta
|
|
269
|
-
abstractRouteForActivity.meta.children.push({
|
|
270
|
-
_ref: activityRoute.meta.id,
|
|
271
|
-
_path: activityRoute.path,
|
|
272
|
-
_namedRoute: activityRoute.name
|
|
273
|
-
})
|
|
274
|
-
}
|
|
275
|
-
|
|
276
|
-
moduleRoute.meta.children.push({
|
|
277
|
-
_ref: $folderName,
|
|
278
|
-
_path: abstractRouteForActivity.path,
|
|
279
|
-
_namedRoute: abstractRouteForActivity.path.replace('-', '_')
|
|
280
|
-
})
|
|
281
|
-
|
|
282
|
-
moduleRoute.children.push(abstractRouteForActivity)
|
|
283
|
-
}
|
|
284
|
-
} else errorType = 'errorModule'
|
|
285
|
-
if (!hasSummary) errorType = 'errorMenu'
|
|
286
|
-
} else errorType = 'errorModule'
|
|
287
|
-
|
|
288
|
-
if (!errorType) {
|
|
289
|
-
defaultRoutes.push(defaultRoute)
|
|
290
|
-
} else
|
|
291
|
-
defaultRoutes.push({
|
|
292
|
-
path: '/',
|
|
293
|
-
component: () => import(`../components/AppBaseErrorDisplay.vue`),
|
|
294
|
-
props: {
|
|
295
|
-
errorGroup: 'application',
|
|
296
|
-
errorType: errorType
|
|
297
|
-
}
|
|
298
|
-
})
|
|
299
|
-
|
|
300
|
-
// Routes for errors : 404
|
|
301
|
-
defaultRoutes.push({
|
|
302
|
-
path: '/404',
|
|
303
|
-
name: '404',
|
|
304
|
-
component: () => import(`../components/AppBaseErrorDisplay.vue`),
|
|
305
|
-
props: {
|
|
306
|
-
errorGroup: 'application',
|
|
307
|
-
errorType: '404'
|
|
308
|
-
}
|
|
309
|
-
})
|
|
310
|
-
|
|
311
|
-
export default defaultRoutes
|
|
312
|
-
export { mappedFiles }
|
|
1
|
+
import AppCompViewDisplay from '../components/AppCompViewDisplay.vue'
|
|
2
|
+
import { fileAssets } from '../shared/generalfuncs'
|
|
3
|
+
//import ModuleView from '@/views/ModuleView.vue' // Uncomment for Production
|
|
4
|
+
// import SummaryView from '@/views/SummaryView.vue' // Uncomment for Production
|
|
5
|
+
|
|
6
|
+
//import ModuleView from '../externalComps/ModuleView.vue' //Only for unit-Testing
|
|
7
|
+
//import SummaryView from '../externalComps/SummaryView.vue' //Only for unit-Testing
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* The router Module defines the routes of the App by:
|
|
11
|
+
* loading the required files for module and activities pages,
|
|
12
|
+
* dynamically creating the navigation route of module base on the file in VIEWS folder
|
|
13
|
+
* dynamically creating the navigation routes of activities and branchings base on the files contained in the MODULE
|
|
14
|
+
* Creating Redirection routes for navigation error
|
|
15
|
+
* Adding the pages for the module in the STORE
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
const defaultRoutes = [] // routes of the app
|
|
19
|
+
let errorType = null
|
|
20
|
+
let viewRoute = null // holder for views routes
|
|
21
|
+
let mappedFiles = null // routes definitions
|
|
22
|
+
|
|
23
|
+
// Creating 1st route: redirection for none existing route to home(Module)
|
|
24
|
+
defaultRoutes.push({
|
|
25
|
+
path: '/:pathMatch(.*)*',
|
|
26
|
+
redirect: {
|
|
27
|
+
name: '404'
|
|
28
|
+
}
|
|
29
|
+
})
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* 2 - Creating the 2nd route: The App module route
|
|
33
|
+
*/
|
|
34
|
+
// Load all the files in the VIEWS folder
|
|
35
|
+
|
|
36
|
+
const defaultRoute = {
|
|
37
|
+
path: '/',
|
|
38
|
+
component: AppCompViewDisplay,
|
|
39
|
+
children: [],
|
|
40
|
+
meta: {}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
if (fileAssets.getViews().length > 0) {
|
|
44
|
+
let hasModule = false
|
|
45
|
+
let hasSummary = false
|
|
46
|
+
let fileRef = null
|
|
47
|
+
let splitted = null
|
|
48
|
+
let fileName = null
|
|
49
|
+
let fileContent = null
|
|
50
|
+
|
|
51
|
+
for (let view of fileAssets.getViews()) {
|
|
52
|
+
fileRef = view.name.replace(/(\.\/)/g, '')
|
|
53
|
+
splitted = fileRef.split('/')
|
|
54
|
+
fileName = splitted[splitted.length - 1].replace(/(\.vue)/g, '')
|
|
55
|
+
fileContent = view.content
|
|
56
|
+
|
|
57
|
+
// Create route for the views
|
|
58
|
+
viewRoute = {
|
|
59
|
+
name: fileName.toLowerCase(),
|
|
60
|
+
|
|
61
|
+
meta: {}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
if (fileName.toLowerCase() === 'moduleview' && fileContent.data) {
|
|
65
|
+
viewRoute.path = ''
|
|
66
|
+
viewRoute.name = 'module'
|
|
67
|
+
viewRoute.component = () => import(`@/views/ModuleView.vue`)
|
|
68
|
+
viewRoute.children = []
|
|
69
|
+
viewRoute.meta.children = []
|
|
70
|
+
hasModule = true
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
if (fileName.toLowerCase() == 'summaryview' && fileContent.data) {
|
|
74
|
+
viewRoute.path = '/menu'
|
|
75
|
+
viewRoute.name = 'menu'
|
|
76
|
+
viewRoute.component = () => import(`@/views/SummaryView.vue`)
|
|
77
|
+
viewRoute.meta.type = 'menu'
|
|
78
|
+
viewRoute.meta.id = 'pg_menu'
|
|
79
|
+
hasSummary = true
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
defaultRoute.children.push(viewRoute)
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// Create activities routes for the ModuleView
|
|
86
|
+
if (hasModule) {
|
|
87
|
+
const moduleRoute = defaultRoute.children.find((r) => r.name == 'module') //Get ModuleView route
|
|
88
|
+
//================== Routes For Activities ================//
|
|
89
|
+
// Load files in module folder
|
|
90
|
+
const _allFiles = fileAssets.getActivities()
|
|
91
|
+
|
|
92
|
+
mappedFiles = fileAssets.buildMapTree(_allFiles)
|
|
93
|
+
let abstractRouteForActivity = {}
|
|
94
|
+
if (!mappedFiles.size) errorType = 'errorPage'
|
|
95
|
+
|
|
96
|
+
//There is a file in the module folder
|
|
97
|
+
/**
|
|
98
|
+
* Define a route for each Activity and its pages
|
|
99
|
+
* Set all nested routes in Activities
|
|
100
|
+
* Set the activies routes as children of module route
|
|
101
|
+
*/
|
|
102
|
+
let activityCount = 0
|
|
103
|
+
|
|
104
|
+
const buildRouteWithNested = ($arr, $folderName, ctx = '') => {
|
|
105
|
+
let bCounter = 0 //branch counter
|
|
106
|
+
|
|
107
|
+
let mainRoute = {}
|
|
108
|
+
for (const [key, value] of $arr) {
|
|
109
|
+
let pgIDtoNum = parseInt(key.slice(1))
|
|
110
|
+
let firstEl = $arr.entries().next().value
|
|
111
|
+
|
|
112
|
+
if (value.constructor === Map)
|
|
113
|
+
buildRouteWithNested(value, $folderName, ctx)
|
|
114
|
+
|
|
115
|
+
if (key == firstEl[0]) {
|
|
116
|
+
//Define the main route according to 1st page id
|
|
117
|
+
mainRoute = (() => {
|
|
118
|
+
//1st Page is branching
|
|
119
|
+
|
|
120
|
+
if (key == 'P01')
|
|
121
|
+
return {
|
|
122
|
+
path: `page-1`,
|
|
123
|
+
name: `${ctx.replace('-', '_')}`,
|
|
124
|
+
component: () => import(`@/${firstEl[1].ref}.vue`),
|
|
125
|
+
children: [],
|
|
126
|
+
meta: {
|
|
127
|
+
id: firstEl[0],
|
|
128
|
+
type: 'branching',
|
|
129
|
+
activity_ref: $folderName, // Axx
|
|
130
|
+
children: []
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
return {
|
|
135
|
+
path: `page-${pgIDtoNum}`,
|
|
136
|
+
name: `${ctx.replace('-', '_')}.page_${pgIDtoNum}`,
|
|
137
|
+
component: () => import(`@/${firstEl[1].ref}.vue`),
|
|
138
|
+
children: [],
|
|
139
|
+
meta: {
|
|
140
|
+
id: firstEl[0],
|
|
141
|
+
type: 'branching',
|
|
142
|
+
activity_ref: $folderName, // Axx
|
|
143
|
+
parent: {
|
|
144
|
+
_ref: 'P01',
|
|
145
|
+
_path: ctx, // activite-xx
|
|
146
|
+
_namedRoute: ctx.replace('-', '_') // activite_xx
|
|
147
|
+
},
|
|
148
|
+
children: []
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
})()
|
|
152
|
+
} else {
|
|
153
|
+
bCounter += 1
|
|
154
|
+
// build abstract route for branching
|
|
155
|
+
let branchRoute = {
|
|
156
|
+
path: `branche-${bCounter}`,
|
|
157
|
+
name: `${mainRoute.name}.branche_${bCounter}`,
|
|
158
|
+
component: () => import(`@/${value.ref}.vue`),
|
|
159
|
+
meta: {
|
|
160
|
+
id: key,
|
|
161
|
+
type: 'branch_page',
|
|
162
|
+
activity_ref: $folderName,
|
|
163
|
+
_branchingRef: `${firstEl[0]}.branch_${bCounter}`,
|
|
164
|
+
parent: {
|
|
165
|
+
_ref: firstEl[0],
|
|
166
|
+
_path: mainRoute.path,
|
|
167
|
+
_namedRoute: mainRoute.name
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
mainRoute.children.push(branchRoute)
|
|
172
|
+
mainRoute.meta.children.push({
|
|
173
|
+
_ref: key,
|
|
174
|
+
_path: branchRoute.path,
|
|
175
|
+
_namedRoute: branchRoute.name
|
|
176
|
+
})
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
return mainRoute
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
for (const [$folderName, $pages] of mappedFiles) {
|
|
184
|
+
let activityPageCount = 0 // page counter
|
|
185
|
+
//build a abstract route for each folder/activity
|
|
186
|
+
abstractRouteForActivity = {
|
|
187
|
+
component: AppCompViewDisplay,
|
|
188
|
+
meta: {
|
|
189
|
+
id: $folderName,
|
|
190
|
+
children: []
|
|
191
|
+
},
|
|
192
|
+
children: []
|
|
193
|
+
}
|
|
194
|
+
//Define the path for each folder
|
|
195
|
+
if ($folderName === 'A00') {
|
|
196
|
+
abstractRouteForActivity.path = 'introduction'
|
|
197
|
+
} else if ($folderName === 'A99') {
|
|
198
|
+
abstractRouteForActivity.path = 'conclusion'
|
|
199
|
+
} else {
|
|
200
|
+
activityCount++
|
|
201
|
+
abstractRouteForActivity.path = `activite-${activityCount}`
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
//Build the Route for each page of the Activity
|
|
205
|
+
for (const [$pageRef, $page] of $pages) {
|
|
206
|
+
let activityRoute
|
|
207
|
+
activityPageCount++
|
|
208
|
+
|
|
209
|
+
if ($page.constructor === Object) {
|
|
210
|
+
let firstPage = $pages.entries().next().value
|
|
211
|
+
if ($pageRef == firstPage[0]) {
|
|
212
|
+
activityRoute = {
|
|
213
|
+
path: 'page-1',
|
|
214
|
+
name: abstractRouteForActivity.path.replace('-', '_'), //activite_xx
|
|
215
|
+
component: () => import(`@/${$page.ref}.vue`),
|
|
216
|
+
meta: {
|
|
217
|
+
id: `${$pageRef}`,
|
|
218
|
+
activity_ref: $folderName,
|
|
219
|
+
type: (() => {
|
|
220
|
+
return abstractRouteForActivity.path.includes('activite')
|
|
221
|
+
? 'normal'
|
|
222
|
+
: abstractRouteForActivity.path
|
|
223
|
+
})(),
|
|
224
|
+
parent: {
|
|
225
|
+
_ref: `${$pageRef}`,
|
|
226
|
+
_path: abstractRouteForActivity.path,
|
|
227
|
+
_namedRoute: abstractRouteForActivity.path.replace('-', '_')
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
} else {
|
|
232
|
+
activityRoute = {
|
|
233
|
+
path: `page-${activityPageCount}`,
|
|
234
|
+
name: (() => {
|
|
235
|
+
let str = abstractRouteForActivity.path.replace('-', '_')
|
|
236
|
+
|
|
237
|
+
if (activityPageCount > 1)
|
|
238
|
+
str = `${str}.page_${activityPageCount}`
|
|
239
|
+
|
|
240
|
+
return str
|
|
241
|
+
})(),
|
|
242
|
+
component: () => import(`@/${$page.ref}.vue`),
|
|
243
|
+
meta: {
|
|
244
|
+
id: $pageRef,
|
|
245
|
+
activity_ref: $folderName,
|
|
246
|
+
type: (() => {
|
|
247
|
+
return abstractRouteForActivity.path.includes('activite')
|
|
248
|
+
? 'normal'
|
|
249
|
+
: abstractRouteForActivity.path
|
|
250
|
+
})(),
|
|
251
|
+
parent: {
|
|
252
|
+
_ref: `${$pageRef}`,
|
|
253
|
+
_path: abstractRouteForActivity.path,
|
|
254
|
+
_namedRoute: abstractRouteForActivity.path.replace('-', '_')
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
//Handling Branching Routes
|
|
261
|
+
if ($page.constructor === Map) {
|
|
262
|
+
const ctx = abstractRouteForActivity.path
|
|
263
|
+
activityRoute = buildRouteWithNested($page, $folderName, ctx)
|
|
264
|
+
}
|
|
265
|
+
//add page route into activity children
|
|
266
|
+
abstractRouteForActivity.children.push(activityRoute)
|
|
267
|
+
|
|
268
|
+
//add page route reference into in activity meta
|
|
269
|
+
abstractRouteForActivity.meta.children.push({
|
|
270
|
+
_ref: activityRoute.meta.id,
|
|
271
|
+
_path: activityRoute.path,
|
|
272
|
+
_namedRoute: activityRoute.name
|
|
273
|
+
})
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
moduleRoute.meta.children.push({
|
|
277
|
+
_ref: $folderName,
|
|
278
|
+
_path: abstractRouteForActivity.path,
|
|
279
|
+
_namedRoute: abstractRouteForActivity.path.replace('-', '_')
|
|
280
|
+
})
|
|
281
|
+
|
|
282
|
+
moduleRoute.children.push(abstractRouteForActivity)
|
|
283
|
+
}
|
|
284
|
+
} else errorType = 'errorModule'
|
|
285
|
+
if (!hasSummary) errorType = 'errorMenu'
|
|
286
|
+
} else errorType = 'errorModule'
|
|
287
|
+
|
|
288
|
+
if (!errorType) {
|
|
289
|
+
defaultRoutes.push(defaultRoute)
|
|
290
|
+
} else
|
|
291
|
+
defaultRoutes.push({
|
|
292
|
+
path: '/',
|
|
293
|
+
component: () => import(`../components/AppBaseErrorDisplay.vue`),
|
|
294
|
+
props: {
|
|
295
|
+
errorGroup: 'application',
|
|
296
|
+
errorType: errorType
|
|
297
|
+
}
|
|
298
|
+
})
|
|
299
|
+
|
|
300
|
+
// Routes for errors : 404
|
|
301
|
+
defaultRoutes.push({
|
|
302
|
+
path: '/404',
|
|
303
|
+
name: '404',
|
|
304
|
+
component: () => import(`../components/AppBaseErrorDisplay.vue`),
|
|
305
|
+
props: {
|
|
306
|
+
errorGroup: 'application',
|
|
307
|
+
errorType: '404'
|
|
308
|
+
}
|
|
309
|
+
})
|
|
310
|
+
|
|
311
|
+
export default defaultRoutes
|
|
312
|
+
export { mappedFiles }
|