fcad-core-dragon 2.0.0-beta.0 → 2.0.0-beta.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.
Files changed (84) hide show
  1. package/{.eslintrc.js → .eslintrc.cjs} +13 -18
  2. package/README.md +1 -1
  3. package/bk.scss +117 -0
  4. package/package.json +22 -40
  5. package/src/$locales/en.json +57 -19
  6. package/src/$locales/fr.json +66 -28
  7. package/src/components/AppBase.vue +790 -376
  8. package/src/components/AppBaseButton.vue +33 -5
  9. package/src/components/AppBaseErrorDisplay.vue +62 -25
  10. package/src/components/AppBaseModule.vue +831 -754
  11. package/src/components/AppBasePage.vue +60 -74
  12. package/src/components/AppCompAudio.vue +266 -0
  13. package/src/components/AppCompBranchButtons.vue +79 -89
  14. package/src/components/AppCompButtonProgress.vue +35 -61
  15. package/src/components/AppCompCarousel.vue +160 -249
  16. package/src/components/AppCompInputCheckBox.vue +9 -3
  17. package/src/components/AppCompInputDropdown.vue +2 -4
  18. package/src/components/AppCompInputRadio.vue +8 -15
  19. package/src/components/AppCompInputTextTable.vue +15 -12
  20. package/src/components/AppCompInputTextToFillDropdown.vue +16 -14
  21. package/src/components/AppCompInputTextToFillText.vue +2 -2
  22. package/src/components/AppCompJauge.vue +14 -3
  23. package/src/components/AppCompMenu.vue +284 -85
  24. package/src/components/AppCompMenuItem.vue +67 -92
  25. package/src/components/AppCompNavigation.vue +945 -0
  26. package/src/components/AppCompNoteCall.vue +141 -0
  27. package/src/components/AppCompNoteCredit.vue +267 -0
  28. package/src/components/AppCompPlayBar.vue +1122 -1391
  29. package/src/components/AppCompPlayBarProgress.vue +73 -0
  30. package/src/components/AppCompPopUp.vue +195 -135
  31. package/src/components/AppCompPopover.vue +27 -0
  32. package/src/components/AppCompQuiz.vue +90 -113
  33. package/src/components/AppCompQuizRecall.vue +277 -0
  34. package/src/components/AppCompSVG.vue +335 -0
  35. package/src/components/AppCompSettingsMenu.vue +7 -8
  36. package/src/components/AppCompTableOfContent.vue +264 -88
  37. package/src/components/AppCompTranscript.vue +19 -0
  38. package/src/components/AppCompVideoPlayer.vue +380 -0
  39. package/src/components/BaseModule.vue +37 -114
  40. package/src/main.js +130 -85
  41. package/src/mixins/$mediaMixins.js +827 -0
  42. package/src/mixins/$pageMixins.js +149 -115
  43. package/src/mixins/$quizMixins.js +12 -26
  44. package/src/mixins/timerMixin.js +39 -16
  45. package/src/module/store.js +218 -78
  46. package/src/module/xapi/ADL.js +90 -53
  47. package/src/module/xapi/Crypto/Hasher.js +8 -8
  48. package/src/module/xapi/Crypto/WordArray.js +6 -6
  49. package/src/module/xapi/Crypto/algorithms/BufferedBlockAlgorithm.js +4 -4
  50. package/src/module/xapi/Crypto/algorithms/C_algo.js +14 -18
  51. package/src/module/xapi/Crypto/algorithms/HMAC.js +1 -1
  52. package/src/module/xapi/Crypto/algorithms/SHA1.js +1 -1
  53. package/src/module/xapi/Crypto/encoders/Base.js +7 -7
  54. package/src/module/xapi/Crypto/encoders/Base64.js +3 -3
  55. package/src/module/xapi/Crypto/encoders/Hex.js +4 -3
  56. package/src/module/xapi/Crypto/encoders/Latin1.js +3 -3
  57. package/src/module/xapi/Crypto/encoders/Utf8.js +3 -3
  58. package/src/module/xapi/Statement/index.js +1 -1
  59. package/src/module/xapi/launch.js +10 -10
  60. package/src/module/xapi/utils.js +17 -17
  61. package/src/module/xapi/wrapper.js +127 -54
  62. package/src/module/xapi/xapiStatement.js +29 -29
  63. package/src/plugins/gsap.js +4 -1
  64. package/src/plugins/helper.js +58 -24
  65. package/src/plugins/i18n.js +23 -10
  66. package/src/plugins/idb.js +1 -0
  67. package/src/plugins/scorm.js +14 -14
  68. package/src/public/index.html +1 -1
  69. package/src/router/index.js +40 -0
  70. package/src/router/routes.js +317 -0
  71. package/src/shared/generalfuncs.js +91 -9
  72. package/src/shared/validators.js +959 -0
  73. package/.prettierrc.js +0 -5
  74. package/babel.config.js +0 -3
  75. package/src/components/AppBaseDragChoice.vue +0 -91
  76. package/src/components/AppBaseDropZone.vue +0 -112
  77. package/src/components/AppCompDragAndDrop.vue +0 -339
  78. package/src/components/AppCompInputAssociation.vue +0 -332
  79. package/src/components/AppCompMediaPlayer.vue +0 -365
  80. package/src/components/AppCompNavigationFull.vue +0 -1791
  81. package/src/components/AppCompToolTip.vue +0 -94
  82. package/src/plugins/timeManager.js +0 -77
  83. package/src/routes.js +0 -734
  84. package/vue.config.js +0 -83
@@ -16,7 +16,7 @@ card (optionel):
16
16
  Objet qui défini le contenu de la composante b-card
17
17
  exemple:
18
18
  {
19
- imgFile: 'imgCarte.jpg', (l'image doit se trouver dans le dossier src/assets/img du projet)
19
+ imgFile: '/src/assets/img/imgCarte.jpg', (l'image doit être appelé par un import ex : import imgCarte1 from '@/assets/img/imgCarte.jpg')
20
20
  title: 'Titre embranchment',
21
21
  text: 'Ceci est un embranchment factice, affiché sous la forme de carte.'
22
22
  brchName: 'P02_E01'
@@ -49,14 +49,6 @@ Si la composante est appelée sans prop, les boutons par défaut seront génér
49
49
  </b-col>
50
50
  </b-row>
51
51
  <b-row v-else>
52
- <b-col v-if="consigne">
53
- <!--- Paramètre ajouter pour la faire apparaitre au besoin --->
54
- <app-base-instruction
55
- v-show="consigne"
56
- :text-instruction="$t(`instruction.branch`)"
57
- :text-button="$t('button.instructions')"
58
- />
59
- </b-col>
60
52
  <b-col
61
53
  v-for="branch of branchsStateData"
62
54
  :id="branch.id"
@@ -75,7 +67,8 @@ Si la composante est appelée sans prop, les boutons par défaut seront génér
75
67
  </slot>
76
68
 
77
69
  <app-comp-button-progress
78
- :percent="branch.progression"
70
+ :set-target="sidebar"
71
+ :percent="branch.progression ? branch.progression : 0"
79
72
  :branch-data="branch"
80
73
  :btn-title="getMatchingElement(branch.id).btnTitle"
81
74
  no-interaction
@@ -85,14 +78,15 @@ Si la composante est appelée sans prop, les boutons par défaut seront génér
85
78
  v-else-if="isCard && cards.length"
86
79
  class="branch-btn-wrapper branch-btn-card"
87
80
  >
88
- <b-card style="max-width: 20rem;" no-body>
81
+ <b-card style="max-width: 20rem" no-body>
89
82
  <app-comp-button-progress
90
- :percent="branch.progression"
83
+ :set-target="sidebar"
84
+ :percent="branch.progression ? branch.progression : 0"
91
85
  :branch-data="branch"
92
86
  :btn-title="getMatchingElement(branch.id).btnTitle"
93
87
  ></app-comp-button-progress>
94
88
  <b-card-img
95
- :src="require(`@/assets/img/${branch.imgFile}`)"
89
+ :src="branch.imgFile"
96
90
  :alt="`${branch.imgAlt}`"
97
91
  ></b-card-img>
98
92
  <b-card-body>
@@ -107,7 +101,8 @@ Si la composante est appelée sans prop, les boutons par défaut seront génér
107
101
  </div>
108
102
  <div v-else class="branch-btn-wrapper">
109
103
  <app-comp-button-progress
110
- :percent="branch.progression"
104
+ :set-target="sidebar"
105
+ :percent="branch.progression ? branch.progression : 0"
111
106
  :branch-data="branch"
112
107
  :btn-title="branch.text"
113
108
  ></app-comp-button-progress>
@@ -130,6 +125,10 @@ export default {
130
125
  type: Boolean,
131
126
  default: false
132
127
  },
128
+ sidebar: {
129
+ type: String,
130
+ default: 'branch-viewer'
131
+ },
133
132
  btnTitle: {
134
133
  type: String,
135
134
  default: ' '
@@ -139,7 +138,7 @@ export default {
139
138
  default: () => null,
140
139
  validator(dataArray) {
141
140
  let isValid = true
142
- if (process.env.NODE_ENV === 'development') {
141
+ if (import.meta.env.DEV) {
143
142
  let errMsg = false
144
143
 
145
144
  //card must have at least 2 elements
@@ -166,27 +165,18 @@ export default {
166
165
 
167
166
  if (!el[k]) {
168
167
  isValid = false
169
- errMsg = `\n 💥 Missing 👉 ${k} 👈 in object ${index +
170
- 1} in ➡ card \n 🚩Allowed indexes are: 👉 ${requiredKeys}`
168
+ errMsg = `\n 💥 Missing 👉 ${k} 👈 in object ${
169
+ index + 1
170
+ } in ➡ card \n 🚩Allowed indexes are: 👉 ${requiredKeys}`
171
171
  break
172
172
  } else {
173
173
  if (el[k].constructor !== String) {
174
- errMsg = `\n 💥 Invalid 👉 ${k} 👈 declaration in ➡ object ${index +
175
- 1} of card. \n 🚩 Must be of type {String}`
174
+ errMsg = `\n 💥 Invalid 👉 ${k} 👈 declaration in ➡ object ${
175
+ index + 1
176
+ } ➡ of card. \n 🚩 Must be of type {String}`
176
177
  isValid = false
177
178
  break
178
179
  }
179
- // start validation of existance of image
180
- else if (k === 'imgFile') {
181
- const imgName = el.imgFile
182
- try {
183
- //test if all states exists
184
- require(`@/assets/img/${imgName}`)
185
- } catch (error) {
186
- isValid = false
187
- errMsg = `\n 💥 Problem loading image with name "${imgName}", \n double check if it is present in the img 📁`
188
- }
189
- }
190
180
  }
191
181
  if (!isValid) break
192
182
  }
@@ -205,7 +195,7 @@ export default {
205
195
  default: () => null,
206
196
  validator: (dataArray) => {
207
197
  let isValid = true
208
- if (process.env.NODE_ENV === 'development') {
198
+ if (import.meta.env.DEV) {
209
199
  let errMsg = false
210
200
  //card must have at least 2 elements
211
201
  if (dataArray.length < 2) {
@@ -230,13 +220,15 @@ export default {
230
220
 
231
221
  if (!el[k]) {
232
222
  isValid = false
233
- errMsg = `\n 💥 Missing 👉 ${k} 👈 in object ${index +
234
- 1} in ➡ customButtom \n 🚩Allowed indexes are: 👉 ${requiredKeys}`
223
+ errMsg = `\n 💥 Missing 👉 ${k} 👈 in object ${
224
+ index + 1
225
+ } in ➡ customButtom \n 🚩Allowed indexes are: 👉 ${requiredKeys}`
235
226
  break
236
227
  } else {
237
228
  if (el[k].constructor !== String) {
238
- errMsg = `\n 💥 Invalid 👉 ${k} 👈 declaration in ➡ object ${index +
239
- 1} of customButton. \n 🚩 Must be of type {String}`
229
+ errMsg = `\n 💥 Invalid 👉 ${k} 👈 declaration in ➡ object ${
230
+ index + 1
231
+ } ➡ of customButton. \n 🚩 Must be of type {String}`
240
232
  isValid = false
241
233
  break
242
234
  }
@@ -278,7 +270,7 @@ export default {
278
270
  ...mapGetters(['getAllCompleted', 'getAllActivities', 'getConnectionInfo']),
279
271
  hasErrors() {
280
272
  let error = false
281
- if (process.env.NODE_ENV === 'development') {
273
+ if (import.meta.env.DEV) {
282
274
  if (this.isCard) error = this.validateProp('cards')
283
275
  else if (this.isCustomButton) error = this.validateProp('customButtons')
284
276
  else error = false
@@ -287,19 +279,14 @@ export default {
287
279
  }
288
280
  },
289
281
  watch: {
290
- // getConnectionInfo:{
291
- // //in development environment (localhost), don't wait for the axios call
292
- // // immediate: process.env.NODE_ENV === 'development',
293
- // handler(){
294
- // this.getbranchsData()
295
- // }
296
- // },
297
-
298
282
  getAllCompleted: {
299
283
  //watch the completions to update the branches progression
300
284
  handler() {
301
- if (this.getAllCompleted[this.idActivity].length)
302
- this.getbranchsData()
285
+ if (
286
+ this.getAllCompleted[this.idActivity] &&
287
+ this.getAllCompleted[this.idActivity].length
288
+ )
289
+ this.getbranchsData()
303
290
  }
304
291
  }
305
292
  },
@@ -319,28 +306,31 @@ export default {
319
306
  this.branchsStateData = []
320
307
  this.branchs.forEach((branch, index) => {
321
308
  let branchData = {}
322
- branchData.id = branch._ref.slice(0, 7)
309
+ branchData.id = branch._ref
323
310
  branchData.route = branch._namedRoute
324
-
325
- const { state = "new", progression=0 } = this.getBranchProgression(branchData.id)
326
-
311
+ let { state = 'new', progression = 0 } = this.getBranchProgression(
312
+ branchData.id
313
+ )
327
314
  // if (!state || !progression) return
328
315
 
329
316
  branchData.state = state
330
317
  branchData.progression = progression
318
+ if (isNaN(branchData.progression)) branchData.progression = 0
331
319
 
332
320
  if (this.isCard) {
333
- const {
334
- title,
321
+ const { title, text, imgFile, imgAlt, btnTitle } =
322
+ this.getMatchingElement(branchData.id)
323
+
324
+ branchData = {
325
+ ...branchData,
335
326
  text,
327
+ title,
336
328
  imgFile,
337
329
  imgAlt,
338
330
  btnTitle
339
- } = this.getMatchingElement(branchData.id)
340
-
341
- branchData = { ...branchData, text, title, imgFile, imgAlt, btnTitle }
331
+ }
342
332
 
343
- if (typeof branchData.imgAlt === 'undefined') {
333
+ if (typeof branchData.imgAlt === 'undefined' && import.meta.env.DEV) {
344
334
  branchData.imgAlt = ''
345
335
  console.warn(
346
336
  `Bouton d’embranchement: ALT image sans valeur définie pour ${branchData.id}`
@@ -362,16 +352,16 @@ export default {
362
352
  if (!this.getAllCompleted[this.idActivity]) return result // no progression found for this activity return result
363
353
 
364
354
  const total = this.getBranchPagesCount(idBranch) // get all pages for in this branch
365
-
366
355
  //get all completed branches pages
367
356
  const completedPages = this.getAllCompleted[this.idActivity].filter(
368
357
  (page) => {
369
358
  return Object.keys(page)[0].search(idBranch) !== -1
370
359
  }
371
360
  )
372
-
373
361
  result.progression = Math.floor((completedPages.length / total) * 100)
374
362
 
363
+ if (isNaN(result.progression)) result.progression = 0
364
+
375
365
  if (result.progression === 0) {
376
366
  result.state = this.status.NEW
377
367
  } else if (result.progression === 100) {
@@ -388,11 +378,14 @@ export default {
388
378
  * @return {Array} /Return the total of pages in a specific branch
389
379
  */
390
380
  getBranchPagesCount(idBranch) {
391
- const allPages = this.getAllActivities.list
392
- .get(this.idActivity)
381
+ if (this.$router.currentRoute.meta.type !== 'branching') return
382
+
383
+ const allPages = this.getAllActivities()
384
+ .list.get(this.idActivity)
393
385
  .get(this.$router.currentRoute.meta.id)
394
- .get(idBranch.slice(4, 7))
395
- return allPages.size
386
+ .get(idBranch)
387
+
388
+ return allPages.size ? allPages.size : 1
396
389
  },
397
390
 
398
391
  /**
@@ -421,8 +414,9 @@ export default {
421
414
  if (el.constructor !== Object) {
422
415
  isValid = false
423
416
  let index = this.cards.indexOf(el)
424
- errMsg = `Le data pour la carte ${index +
425
- 1} n'est pas de type Object`
417
+ errMsg = `Le data pour la carte ${
418
+ index + 1
419
+ } n'est pas de type Object`
426
420
  }
427
421
  if (!isValid) break
428
422
  }
@@ -436,27 +430,18 @@ export default {
436
430
  for (let k of requiredKeys) {
437
431
  if (!el[k]) {
438
432
  isValid = false
439
- errMsg = `l'Attribut 👉 ${k} 👈 pour la carte ${index +
440
- 1} n'as pas été défini`
433
+ errMsg = `l'Attribut 👉 ${k} 👈 pour la carte ${
434
+ index + 1
435
+ } n'as pas été défini`
441
436
  break
442
437
  } else {
443
438
  if (el[k].constructor !== String) {
444
- errMsg = `l'Attribut 👉 ${k} 👈 pour la carte ${index +
445
- 1} doit être de type {String}`
439
+ errMsg = `l'Attribut 👉 ${k} 👈 pour la carte ${
440
+ index + 1
441
+ } doit être de type {String}`
446
442
  isValid = false
447
443
  break
448
444
  }
449
- // start validation of existance of image
450
- else if (k === 'imgFile') {
451
- const imgName = el.imgFile
452
- try {
453
- //test if all states exists
454
- require(`@/assets/img/${imgName}`)
455
- } catch (error) {
456
- isValid = false
457
- errMsg = `Problème de téléchargement pour le fichier 👉"${imgName}"👈. Êtes vous certain qu'il ce trouve dans le 📁 img du projet?`
458
- }
459
- }
460
445
  }
461
446
  if (!isValid) break
462
447
  }
@@ -469,8 +454,9 @@ export default {
469
454
  if (!searchEl) {
470
455
  errMsg = `Aucune branch correspondante avec le nom ${
471
456
  el.brchName
472
- } pour la carte ${index +
473
- 1}. Êtes vous sûre d'avoir indiqué la bonne branch?`
457
+ } pour la carte ${
458
+ index + 1
459
+ }. Êtes vous sûre d'avoir indiqué la bonne branch?`
474
460
  isValid = false
475
461
  }
476
462
 
@@ -495,8 +481,9 @@ export default {
495
481
  if (el.constructor !== Object) {
496
482
  isValid = false
497
483
  let index = this.customButtons.indexOf(el)
498
- errMsg = `Le data pour le button ${index +
499
- 1} n'est pas de type {Object}`
484
+ errMsg = `Le data pour le button ${
485
+ index + 1
486
+ } n'est pas de type {Object}`
500
487
  }
501
488
  if (!isValid) break
502
489
  }
@@ -511,8 +498,9 @@ export default {
511
498
  for (let k of requiredKeys) {
512
499
  if (!el[k]) {
513
500
  isValid = false
514
- errMsg = `l'Attribut 👉 ${k} 👈 pour la button ${index +
515
- 1} n'as pas été défini`
501
+ errMsg = `l'Attribut 👉 ${k} 👈 pour la button ${
502
+ index + 1
503
+ } n'as pas été défini`
516
504
  break
517
505
  } else {
518
506
  // Expecting String for properties name and brchName
@@ -520,8 +508,9 @@ export default {
520
508
  ['name', 'brchName'].includes(k) &&
521
509
  el[k].constructor !== String
522
510
  ) {
523
- errMsg = `l'Attribut 👉 ${k} 👈 pour la button ${index +
524
- 1} doit être de type {String}`
511
+ errMsg = `l'Attribut 👉 ${k} 👈 pour la button ${
512
+ index + 1
513
+ } doit être de type {String}`
525
514
  isValid = false
526
515
  break
527
516
  }
@@ -537,8 +526,9 @@ export default {
537
526
  if (!searchEl) {
538
527
  errMsg = `Aucune branch correspondante avec le nom ${
539
528
  el.brchName
540
- } pour le bouton ${index +
541
- 1}. Êtes vous sûre d'avoir indiqué la bonne branch?`
529
+ } pour le bouton ${
530
+ index + 1
531
+ }. Êtes vous sûre d'avoir indiqué la bonne branch?`
542
532
  isValid = false
543
533
  }
544
534
 
@@ -1,72 +1,21 @@
1
1
  <template>
2
2
  <div class="button-progress-wrapper">
3
- <!-- Building a Progress Ring, Quickly: https://css-tricks.com/building-progress-ring-quickly/ -->
4
- <svg class="progress-ring" width="54" height="54">
5
- <circle
6
- class="progress-ring__circle"
7
- stroke-width="3"
8
- fill="transparent"
9
- :r="radius"
10
- cx="25"
11
- cy="25"
12
- :stroke-dasharray="circumference"
13
- :stroke-dashoffset="
14
- circumference - (branchData.progression / 100) * circumference
15
- "
16
- ></circle>
17
- </svg>
18
3
  <button
19
4
  :id="`btn_branch_${branchData.id}`"
5
+ :target-ref="branchData.id"
20
6
  :title="btnTitle || $t('text.place_holder.for_title_btn_progress')"
21
7
  :class="
22
8
  branchData.state === status.COMPLETE
23
9
  ? 'branch-btn-default branche-complete'
24
10
  : 'branch-btn-default'
25
11
  "
26
- @click="$router.push({ name: branchData.route })"
12
+ @click="openBranch(branchData.id)"
27
13
  >
28
- <svg
29
- v-if="branchData.state === status.COMPLETE"
30
- id="branch-btn-crochet"
31
- xmlns="http://www.w3.org/2000/svg"
32
- width="24"
33
- height="24"
34
- viewBox="0 0 24 24"
35
- >
36
- <path
37
- id="Tracé_3833"
38
- data-name="Tracé 3833"
39
- d="M0,0H24V24H0Z"
40
- fill="none"
41
- />
42
- <path
43
- id="Tracé_3834"
44
- data-name="Tracé 3834"
45
- d="M9,16.2,4.8,12,3.4,13.4,9,19,21,7,19.6,5.6Z"
46
- fill="#e6f5ff"
47
- />
14
+ <svg v-if="branchData.state === status.COMPLETE" width="24" height="24">
15
+ <use href="#branch-crochet-icon"></use>
48
16
  </svg>
49
-
50
- <svg
51
- v-if="branchData.state != status.COMPLETE"
52
- id="navigate_next_black_24dp"
53
- xmlns="http://www.w3.org/2000/svg"
54
- width="24"
55
- height="24"
56
- viewBox="0 0 24 24"
57
- >
58
- <path
59
- id="Path_3899"
60
- data-name="Path 3899"
61
- d="M0,0H24V24H0Z"
62
- fill="none"
63
- />
64
- <path
65
- id="Path_3900"
66
- data-name="Path 3900"
67
- d="M10.02,6,8.61,7.41,13.19,12,8.61,16.59,10.02,18l6-6Z"
68
- fill="#fff"
69
- />
17
+ <svg v-if="branchData.state != status.COMPLETE" width="24" height="24">
18
+ <use href="#navigate-next-icon"></use>
70
19
  </svg>
71
20
  </button>
72
21
  </div>
@@ -79,7 +28,7 @@ export default {
79
28
  default: false
80
29
  },
81
30
  percent: {
82
- type: Number,
31
+ type: [Number],
83
32
  default: 0,
84
33
  required: true
85
34
  },
@@ -87,6 +36,11 @@ export default {
87
36
  type: Object,
88
37
  required: true
89
38
  },
39
+ setTarget: {
40
+ type: [String],
41
+ default: ''
42
+ },
43
+
90
44
  btnTitle: {
91
45
  type: String,
92
46
  default: null
@@ -101,11 +55,31 @@ export default {
101
55
  NEW: 'new',
102
56
  STARTED: 'started',
103
57
  COMPLETE: 'complete'
104
- }
58
+ },
59
+ withRouter: false, //Only for demo purpose. Remove after demo
60
+ isActive: false
105
61
  }
106
62
  },
107
- beforeMount() {},
108
- methods: {}
63
+
64
+ created() {
65
+ if (isNaN(this.percent)) this.percent = 0
66
+ this.$bus.$on('branching-hidden', this.resetIsActive)
67
+ },
68
+
69
+ beforeUnmount() {
70
+ this.$bus.$off('branching-hidden', this.resetIsActive)
71
+ },
72
+
73
+ methods: {
74
+ openBranch(e) {
75
+ this.isActive = true
76
+ this.$bus.$emit('open-sidebar', { ctx: 'ctxBranching', e })
77
+ },
78
+
79
+ resetIsActive() {
80
+ this.isActive = false
81
+ }
82
+ }
109
83
  }
110
84
  </script>
111
85
  <style lang="scss">