@vcmap/ui 6.2.0-rc.1 → 6.2.0-rc.3

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 (193) hide show
  1. package/build/build.js +52 -7
  2. package/build/postInstall.js +32 -0
  3. package/config/dev.config.json +40 -0
  4. package/config/pano.config.json +420 -0
  5. package/config/projects.config.json +5 -0
  6. package/dist/assets/cesium/Workers/{chunk-P6TRGU3S.js → chunk-2PFJ45KC.js} +2 -2
  7. package/dist/assets/cesium/Workers/{chunk-7ZZ5LMZY.js → chunk-35ALNMG5.js} +15 -15
  8. package/dist/assets/cesium/Workers/{chunk-7YIOHQWH.js → chunk-35EJBV7X.js} +13 -13
  9. package/dist/assets/cesium/Workers/{chunk-EJVGYGLF.js → chunk-3E3OH65K.js} +7 -7
  10. package/dist/assets/cesium/Workers/{chunk-JBSKHTNX.js → chunk-4FHUY275.js} +4 -4
  11. package/dist/assets/cesium/Workers/{chunk-Z2QP3CXW.js → chunk-565T3GIE.js} +2 -2
  12. package/dist/assets/cesium/Workers/{chunk-IZGUQO6Q.js → chunk-5LGDCKCZ.js} +13 -13
  13. package/dist/assets/cesium/Workers/{chunk-3IFRSGEY.js → chunk-6JXJYBWN.js} +9 -9
  14. package/dist/assets/cesium/Workers/{chunk-WGDFYAGC.js → chunk-6RAEC3AW.js} +4 -4
  15. package/dist/assets/cesium/Workers/{chunk-44QAAS4P.js → chunk-6Z67VIOY.js} +7 -7
  16. package/dist/assets/cesium/Workers/{chunk-NGZJIN5Z.js → chunk-ADDGROZ6.js} +4 -4
  17. package/dist/assets/cesium/Workers/{chunk-GBT7MJ6X.js → chunk-ASYGMBRG.js} +1 -1
  18. package/dist/assets/cesium/Workers/{chunk-C4WPMOKT.js → chunk-BABDQOWA.js} +5 -5
  19. package/dist/assets/cesium/Workers/{chunk-IBRIWOCM.js → chunk-BQHHGIFB.js} +13 -13
  20. package/dist/assets/cesium/Workers/{chunk-LLAF3CPH.js → chunk-C33B4KHN.js} +2 -2
  21. package/dist/assets/cesium/Workers/{chunk-JXVLNVXC.js → chunk-CMCR2ZK4.js} +7 -7
  22. package/dist/assets/cesium/Workers/{chunk-3HQMMUPU.js → chunk-EGGJIATZ.js} +1 -1
  23. package/dist/assets/cesium/Workers/{chunk-RJM36CNY.js → chunk-EWS5LXAB.js} +6 -6
  24. package/dist/assets/cesium/Workers/{chunk-OPP2SKMA.js → chunk-FDXPBTSX.js} +12 -12
  25. package/dist/assets/cesium/Workers/{chunk-QN6TBED4.js → chunk-FIFQP4YX.js} +11 -11
  26. package/dist/assets/cesium/Workers/{chunk-JISPSEF3.js → chunk-HOGDZ2EB.js} +4 -4
  27. package/dist/assets/cesium/Workers/{chunk-2PTKXHJB.js → chunk-I4NB77NH.js} +10 -10
  28. package/dist/assets/cesium/Workers/{chunk-QQOZO7KO.js → chunk-JX4A2BCF.js} +7 -7
  29. package/dist/assets/cesium/Workers/{chunk-XIUSRWL6.js → chunk-K6PDUSH6.js} +5 -5
  30. package/dist/assets/cesium/Workers/{chunk-KHZNBFOH.js → chunk-KFHZFU5O.js} +7 -7
  31. package/dist/assets/cesium/Workers/{chunk-U5HSOKPQ.js → chunk-KYGXRFA6.js} +1 -1
  32. package/dist/assets/cesium/Workers/{chunk-56EDBCGT.js → chunk-LNWNAP2C.js} +10 -10
  33. package/dist/assets/cesium/Workers/{chunk-YCDZX5LS.js → chunk-LWN2B3KW.js} +1 -1
  34. package/dist/assets/cesium/Workers/{chunk-TI3TRKIC.js → chunk-LXLABO2L.js} +10 -10
  35. package/dist/assets/cesium/Workers/{chunk-C3EQ27WF.js → chunk-MB6B2UUL.js} +6 -6
  36. package/dist/assets/cesium/Workers/{chunk-57H6I3SV.js → chunk-MZSRINXK.js} +5 -5
  37. package/dist/assets/cesium/Workers/{chunk-ZVUUPJEM.js → chunk-NBI3GZSK.js} +17 -17
  38. package/dist/assets/cesium/Workers/{chunk-O72GZTSE.js → chunk-NUAXNUP5.js} +2 -2
  39. package/dist/assets/cesium/Workers/{chunk-M24KHENR.js → chunk-PNZR4RLL.js} +2 -2
  40. package/dist/assets/cesium/Workers/{chunk-HJMNR3GC.js → chunk-Q4K22DSJ.js} +11 -11
  41. package/dist/assets/cesium/Workers/{chunk-2LOWCAMW.js → chunk-Q4OS4EFN.js} +13 -13
  42. package/dist/assets/cesium/Workers/{chunk-TK5IIG2F.js → chunk-QLIMO7TQ.js} +4 -4
  43. package/dist/assets/cesium/Workers/{chunk-EDLRS3AW.js → chunk-RQ4F6YFU.js} +6 -6
  44. package/dist/assets/cesium/Workers/{chunk-JSQJDZI4.js → chunk-SB67D3JL.js} +6 -6
  45. package/dist/assets/cesium/Workers/{chunk-RTJKHZWU.js → chunk-SS6WRJ5J.js} +6 -6
  46. package/dist/assets/cesium/Workers/{chunk-L5GODJAR.js → chunk-TC4NTWIJ.js} +14 -14
  47. package/dist/assets/cesium/Workers/{chunk-IZJ42N4W.js → chunk-TKNA6WSZ.js} +17 -17
  48. package/dist/assets/cesium/Workers/{chunk-HP5XLODI.js → chunk-VQYEP77L.js} +6 -6
  49. package/dist/assets/cesium/Workers/{chunk-YSIJTJ7N.js → chunk-WKS5H3VW.js} +5 -5
  50. package/dist/assets/cesium/Workers/{chunk-XWOUPGUF.js → chunk-WPGX7DEA.js} +1 -1
  51. package/dist/assets/cesium/Workers/{chunk-6SQMLVGV.js → chunk-X3EPFVG3.js} +7 -7
  52. package/dist/assets/cesium/Workers/{chunk-NDDI2LWR.js → chunk-XH7MSR3A.js} +6 -6
  53. package/dist/assets/cesium/Workers/{chunk-FFLMY4TE.js → chunk-YDEBBUNQ.js} +5 -5
  54. package/dist/assets/cesium/Workers/{chunk-YK3QIKY7.js → chunk-YSVI7YNN.js} +9 -9
  55. package/dist/assets/cesium/Workers/{chunk-BVKITG4N.js → chunk-YVAS5WPH.js} +7 -7
  56. package/dist/assets/cesium/Workers/{chunk-X7IQYYHF.js → chunk-Z4QVAZM6.js} +2 -2
  57. package/dist/assets/cesium/Workers/{chunk-LJ2JQHJT.js → chunk-ZXOK77EW.js} +7 -7
  58. package/dist/assets/cesium/Workers/combineGeometry.js +22 -22
  59. package/dist/assets/cesium/Workers/createBoxGeometry.js +16 -16
  60. package/dist/assets/cesium/Workers/createBoxOutlineGeometry.js +14 -14
  61. package/dist/assets/cesium/Workers/createCircleGeometry.js +24 -24
  62. package/dist/assets/cesium/Workers/createCircleOutlineGeometry.js +17 -17
  63. package/dist/assets/cesium/Workers/createCoplanarPolygonGeometry.js +31 -31
  64. package/dist/assets/cesium/Workers/createCoplanarPolygonOutlineGeometry.js +29 -29
  65. package/dist/assets/cesium/Workers/createCorridorGeometry.js +27 -27
  66. package/dist/assets/cesium/Workers/createCorridorOutlineGeometry.js +26 -26
  67. package/dist/assets/cesium/Workers/createCylinderGeometry.js +18 -18
  68. package/dist/assets/cesium/Workers/createCylinderOutlineGeometry.js +16 -16
  69. package/dist/assets/cesium/Workers/createEllipseGeometry.js +24 -24
  70. package/dist/assets/cesium/Workers/createEllipseOutlineGeometry.js +17 -17
  71. package/dist/assets/cesium/Workers/createEllipsoidGeometry.js +17 -17
  72. package/dist/assets/cesium/Workers/createEllipsoidOutlineGeometry.js +16 -16
  73. package/dist/assets/cesium/Workers/createFrustumGeometry.js +16 -16
  74. package/dist/assets/cesium/Workers/createFrustumOutlineGeometry.js +16 -16
  75. package/dist/assets/cesium/Workers/createGeometry.js +22 -22
  76. package/dist/assets/cesium/Workers/createGroundPolylineGeometry.js +20 -20
  77. package/dist/assets/cesium/Workers/createPlaneGeometry.js +14 -14
  78. package/dist/assets/cesium/Workers/createPlaneOutlineGeometry.js +13 -13
  79. package/dist/assets/cesium/Workers/createPolygonGeometry.js +30 -30
  80. package/dist/assets/cesium/Workers/createPolygonOutlineGeometry.js +28 -28
  81. package/dist/assets/cesium/Workers/createPolylineGeometry.js +23 -23
  82. package/dist/assets/cesium/Workers/createPolylineVolumeGeometry.js +29 -29
  83. package/dist/assets/cesium/Workers/createPolylineVolumeOutlineGeometry.js +25 -25
  84. package/dist/assets/cesium/Workers/createRectangleGeometry.js +25 -25
  85. package/dist/assets/cesium/Workers/createRectangleOutlineGeometry.js +18 -18
  86. package/dist/assets/cesium/Workers/createSimplePolylineGeometry.js +21 -21
  87. package/dist/assets/cesium/Workers/createSphereGeometry.js +17 -17
  88. package/dist/assets/cesium/Workers/createSphereOutlineGeometry.js +16 -16
  89. package/dist/assets/cesium/Workers/createTaskProcessorWorker.js +3 -3
  90. package/dist/assets/cesium/Workers/createVectorTileClampedPolylines.js +13 -13
  91. package/dist/assets/cesium/Workers/createVectorTileGeometries.js +22 -22
  92. package/dist/assets/cesium/Workers/createVectorTilePoints.js +12 -12
  93. package/dist/assets/cesium/Workers/createVectorTilePolygons.js +20 -20
  94. package/dist/assets/cesium/Workers/createVectorTilePolylines.js +13 -13
  95. package/dist/assets/cesium/Workers/createVerticesFromGoogleEarthEnterpriseBuffer.js +20 -20
  96. package/dist/assets/cesium/Workers/createVerticesFromHeightmap.js +20 -20
  97. package/dist/assets/cesium/Workers/createVerticesFromQuantizedTerrainMesh.js +17 -17
  98. package/dist/assets/cesium/Workers/createWallGeometry.js +22 -22
  99. package/dist/assets/cesium/Workers/createWallOutlineGeometry.js +21 -21
  100. package/dist/assets/cesium/Workers/decodeDraco.js +11 -11
  101. package/dist/assets/cesium/Workers/decodeGoogleEarthEnterprisePacket.js +5 -5
  102. package/dist/assets/cesium/Workers/decodeI3S.js +10 -10
  103. package/dist/assets/cesium/Workers/transcodeKTX2.js +7 -7
  104. package/dist/assets/cesium/Workers/transferTypedArrayTest.js +1 -1
  105. package/dist/assets/cesium/Workers/upsampleQuantizedTerrainMesh.js +20 -20
  106. package/dist/assets/{cesium-ac6c193a.js → cesium-7d4ab914.js} +44609 -44606
  107. package/dist/assets/cesium.js +1 -1
  108. package/dist/assets/core-deeb2b8d.js +34569 -0
  109. package/dist/assets/core-workers/panoramaImageWorker.js +1 -0
  110. package/dist/assets/core-workers/panoramaImageWorker.js-f8148bc6.js +34 -0
  111. package/dist/assets/core.js +1 -1
  112. package/dist/assets/{ol-94c57f2e.js → ol-8db5c824.js} +1 -1
  113. package/dist/assets/ol.js +1 -1
  114. package/dist/assets/start.js +3 -1
  115. package/dist/assets/ui-62439099.css +1 -0
  116. package/dist/assets/{ui-4f308e45.js → ui-62439099.js} +9581 -8853
  117. package/dist/assets/ui.js +1 -1
  118. package/dist/assets/vue.js +1 -1
  119. package/dist/assets/{vuetify-99195777.js → vuetify-439ba6d5.js} +1 -1
  120. package/dist/assets/vuetify.js +1 -1
  121. package/index.d.ts +14 -4
  122. package/index.js +8 -6
  123. package/package.json +5 -4
  124. package/plugins/@vcmap-show-case/panorama-inspector/package.json +10 -0
  125. package/plugins/@vcmap-show-case/panorama-inspector/src/PanoramaDebugInfo.vue +86 -0
  126. package/plugins/@vcmap-show-case/panorama-inspector/src/PanoramaDebugTools.vue +259 -0
  127. package/plugins/@vcmap-show-case/panorama-inspector/src/PanoramaInspector.vue +31 -0
  128. package/plugins/@vcmap-show-case/panorama-inspector/src/api.js +161 -0
  129. package/plugins/@vcmap-show-case/panorama-inspector/src/index.js +57 -0
  130. package/plugins/@vcmap-show-case/panorama-inspector/src/showClickInteraction.js +20 -0
  131. package/plugins/package.json +1 -1
  132. package/src/actions/actionHelper.d.ts +16 -11
  133. package/src/actions/actionHelper.js +190 -87
  134. package/src/actions/flightActions.d.ts +10 -0
  135. package/src/actions/flightActions.js +109 -13
  136. package/src/application/VcsApp.vue +11 -0
  137. package/src/application/VcsApp.vue.d.ts +4 -0
  138. package/src/application/VcsContainer.vue.d.ts +4 -0
  139. package/src/application/VcsMainMap.vue +40 -2
  140. package/src/application/VcsMainMap.vue.d.ts +4 -0
  141. package/src/application/VcsMap.vue +0 -9
  142. package/src/application/VcsNavbar.vue +2 -1
  143. package/src/callback/activateMapCallback.d.ts +30 -0
  144. package/src/callback/activateMapCallback.js +63 -0
  145. package/src/callback/activateOverviewMapCallback.d.ts +7 -0
  146. package/src/callback/activateOverviewMapCallback.js +26 -0
  147. package/src/callback/deactivateOverviewMapCallback.d.ts +7 -0
  148. package/src/callback/deactivateOverviewMapCallback.js +20 -0
  149. package/src/components/flight/VcsFlightAnchorsComponent.vue +1 -0
  150. package/src/components/flight/VcsFlightPlayer.vue +31 -17
  151. package/src/components/flight/VcsFlightPlayer.vue.d.ts +1 -0
  152. package/src/components/lists/VcsGroupedList.vue +10 -2
  153. package/src/components/lists/VcsTreeNode.vue +3 -0
  154. package/src/components/plugins/VcsLoadingOverlay.vue +138 -0
  155. package/src/components/plugins/VcsLoadingOverlay.vue.d.ts +2 -0
  156. package/src/components/plugins/VcsWorkspaceWrapper.vue +104 -0
  157. package/src/components/plugins/VcsWorkspaceWrapper.vue.d.ts +82 -0
  158. package/src/components/section/VcsExpansionPanel.vue +13 -3
  159. package/src/components/vector-properties/VcsFeatureEditingWindow.vue +20 -1
  160. package/src/components/vector-properties/VcsFeatureEditingWindow.vue.d.ts +11 -0
  161. package/src/components/vector-properties/VcsFeatureInputEditor.vue +166 -0
  162. package/src/components/vector-properties/VcsFeatureInputEditor.vue.d.ts +17 -0
  163. package/src/components/vector-properties/VcsVectorPropertiesComponent.vue.d.ts +1 -1
  164. package/src/contentTree/LayerSwap.vue +15 -6
  165. package/src/contentTree/contentTreeCollection.js +2 -2
  166. package/src/contentTree/contentTreeItem.d.ts +2 -2
  167. package/src/contentTree/wmsGroupContentTreeItem.js +10 -3
  168. package/src/featureInfo/featureInfo.js +6 -25
  169. package/src/featureInfo/iframeWmsFeatureInfoView.d.ts +10 -0
  170. package/src/featureInfo/iframeWmsFeatureInfoView.js +42 -0
  171. package/src/i18n/de.d.ts +25 -7
  172. package/src/i18n/de.js +14 -0
  173. package/src/i18n/en.d.ts +25 -7
  174. package/src/i18n/en.js +14 -0
  175. package/src/legend/VcsLegend.vue +5 -1
  176. package/src/navigation/MapNavigation.vue +82 -45
  177. package/src/navigation/MapNavigation.vue.d.ts +3 -34
  178. package/src/navigation/TiltSlider.vue +10 -2
  179. package/src/navigation/TiltSlider.vue.d.ts +20 -0
  180. package/src/navigation/VcsCompass.vue +3 -1
  181. package/src/navigation/overviewMap.d.ts +23 -8
  182. package/src/navigation/overviewMap.js +82 -60
  183. package/src/search/ResultsComponent.vue +8 -1
  184. package/src/search/SearchComponent.vue +3 -17
  185. package/src/search/SearchComponent.vue.d.ts +1 -2
  186. package/src/search/search.d.ts +13 -0
  187. package/src/search/search.js +21 -1
  188. package/src/uiConfig.d.ts +9 -0
  189. package/src/uiConfig.js +1 -0
  190. package/dist/assets/core-de8e51b5.js +0 -26236
  191. package/dist/assets/ui-4f308e45.css +0 -1
  192. /package/dist/assets/{vue-62303c82.js → vue-1b861f55.js} +0 -0
  193. /package/dist/assets/{vuetify-99195777.css → vuetify-439ba6d5.css} +0 -0
@@ -1,16 +1,21 @@
1
- import { reactive } from 'vue';
1
+ import { reactive, ref } from 'vue';
2
2
  import { check, maybe, ofEnum } from '@vcsuite/check';
3
3
  import { getLogger } from '@vcsuite/logger';
4
4
  import {
5
5
  createFlightVisualization,
6
+ createFlightMovie,
6
7
  exportFlightAsGeoJson,
7
8
  exportFlightPathAsGeoJson,
8
9
  FlightInstance,
9
10
  moduleIdSymbol,
10
11
  parseFlightOptionsFromGeoJson,
12
+ createFlightPlayer,
13
+ LayerState,
11
14
  } from '@vcmap/core';
12
15
  import { NotificationType } from '../notifier/notifier.js';
13
- import { downloadText } from '../downloadHelper.js';
16
+ import { downloadBlob, downloadText } from '../downloadHelper.js';
17
+ import { addLoadingOverlay, callSafeAction } from './actionHelper.js';
18
+ import { vcsAppSymbol } from '../pluginHelper.js';
14
19
 
15
20
  /**
16
21
  * @param {import("../vcsUiApp.js").default} app
@@ -97,10 +102,7 @@ export function createPlayAction(app, instance) {
97
102
  /**
98
103
  * @enum {string}
99
104
  */
100
- export const PlayerDirection = {
101
- Forward: 'forward',
102
- Backward: 'backward',
103
- };
105
+ export const PlayerDirection = { Forward: 'forward', Backward: 'backward' };
104
106
 
105
107
  /**
106
108
  * @param {import("../vcsUiApp.js").default} app
@@ -365,18 +367,32 @@ export async function createFlightVisualizationAction(
365
367
  instance,
366
368
  active = true,
367
369
  ) {
368
- let flightVis = await createFlightVisualization(instance, app);
370
+ let flightVis;
371
+ let flightVisListener;
372
+ let flightVisStateListener;
369
373
 
370
374
  const action = reactive({
371
375
  name: 'components.flight.hidePath',
372
376
  title: 'components.flight.hidePath',
373
377
  icon: '$vcsEye',
374
- active,
378
+ active: false,
375
379
  async callback() {
376
380
  if (!flightVis) {
377
381
  flightVis = await createFlightVisualization(instance, app);
382
+ flightVisListener?.();
383
+ flightVisListener = flightVis.destroyed.addEventListener(() => {
384
+ flightVis = undefined;
385
+ flightVisListener?.();
386
+ flightVisStateListener?.();
387
+ });
388
+ flightVisStateListener?.();
389
+ flightVisStateListener = flightVis.stateChanged.addEventListener(
390
+ (state) => {
391
+ action.active = state === LayerState.ACTIVE;
392
+ },
393
+ );
378
394
  }
379
- if (this.active) {
395
+ if (flightVis.state === LayerState.ACTIVE) {
380
396
  flightVis.deactivate();
381
397
  } else {
382
398
  flightVis.activate().catch(() => {
@@ -384,22 +400,102 @@ export async function createFlightVisualizationAction(
384
400
  this.active = false;
385
401
  });
386
402
  }
387
- this.active = !this.active;
403
+ this.active = flightVis.state === LayerState.ACTIVE;
388
404
  },
389
405
  });
390
406
 
391
407
  if (active) {
392
- await flightVis.activate();
408
+ callSafeAction(action);
393
409
  }
394
410
 
395
411
  const destroy = () => {
396
- flightVis.deactivate();
397
- flightVis.destroy();
412
+ flightVis?.deactivate?.();
413
+ flightVis?.destroy?.();
398
414
  };
399
415
 
400
416
  return { action, destroy };
401
417
  }
402
418
 
419
+ /**
420
+ *
421
+ * @param {import("../vcsUiApp.js").default} app
422
+ * @param {import("@vcmap/core").FlightInstance} instance
423
+ * @returns {{actions: import("./actionHelper.js").VcsAction[], destroy: function(): void}}
424
+ */
425
+ export function createFlightMovieActions(app, instance) {
426
+ const progress = ref(0);
427
+
428
+ function updateProgress(playerClock) {
429
+ const duration = playerClock.endTime - playerClock.startTime;
430
+ const currentTime = playerClock.currentTime - playerClock.startTime;
431
+ progress.value = currentTime / duration;
432
+ }
433
+
434
+ async function recordFlight(options = {}) {
435
+ let player;
436
+ let flightVis;
437
+ let playerListener = () => {};
438
+ let removeLoadingOverlay = () => {};
439
+ try {
440
+ flightVis = await createFlightVisualization(instance, app);
441
+ if (flightVis.state === LayerState.ACTIVE) {
442
+ flightVis.deactivate();
443
+ }
444
+ player = await createFlightPlayer(instance, app);
445
+ playerListener = player.clock.changed.addEventListener(updateProgress);
446
+ const { start, cancel } = createFlightMovie(app, player, options);
447
+ removeLoadingOverlay = addLoadingOverlay(
448
+ app,
449
+ vcsAppSymbol,
450
+ 'flight-recording',
451
+ {
452
+ progress,
453
+ title: 'components.flight.record.inProgress',
454
+ cancellable: true,
455
+ cancel,
456
+ },
457
+ );
458
+ const blob = await start();
459
+ removeLoadingOverlay?.();
460
+ app.notifier.add({
461
+ type: NotificationType.SUCCESS,
462
+ message: app.vueI18n.t('components.flight.record.success'),
463
+ });
464
+ const title = instance.properties?.title || 'flight';
465
+ downloadBlob(blob, `${title}.webm`);
466
+ } catch (e) {
467
+ getLogger('flightActions').error('Error while creating flight movie', e);
468
+ } finally {
469
+ player?.destroy();
470
+ flightVis?.destroy();
471
+ playerListener?.();
472
+ removeLoadingOverlay?.();
473
+ }
474
+ }
475
+
476
+ const actions = [
477
+ reactive({
478
+ name: 'components.flight.record.standard',
479
+ callback: recordFlight,
480
+ }),
481
+ reactive({
482
+ name: 'components.flight.record.high',
483
+ callback: recordFlight.bind(null, {
484
+ fps: 60,
485
+ highDefinition: true,
486
+ }),
487
+ }),
488
+ ];
489
+
490
+ const destroy = instance.anchorsChanged.addEventListener(() => {
491
+ actions.forEach((action) => {
492
+ action.disabled = !instance.isValid();
493
+ });
494
+ });
495
+
496
+ return { actions, destroy };
497
+ }
498
+
403
499
  /**
404
500
  *
405
501
  * @param {import("@vcmap/core").FlightInstance} instance
@@ -170,11 +170,14 @@
170
170
  OpenlayersMap: '$vcs2d',
171
171
  CesiumMap: '$vcs3d',
172
172
  ObliqueMap: '$vcsObliqueView',
173
+ PanoramaMap: 'mdi-panorama-variant-outline',
173
174
  };
175
+
174
176
  const mapBtnWeight = {
175
177
  OpenlayersMap: 3,
176
178
  CesiumMap: 2,
177
179
  ObliqueMap: 1,
180
+ PanoramaMap: 0,
178
181
  };
179
182
 
180
183
  const mapButtonActionDestroy = {};
@@ -322,6 +325,14 @@
322
325
  vcsAppSymbol,
323
326
  );
324
327
  }
328
+
329
+ if (
330
+ app.uiConfig.config.autoCloseLegend &&
331
+ newValue.length === 0 &&
332
+ app.windowManager.has(legendComponentId)
333
+ ) {
334
+ app.windowManager.remove(legendComponentId);
335
+ }
325
336
  currentEntryLength = newValue.length;
326
337
  });
327
338
 
@@ -398,6 +398,10 @@ declare const _default: import("vue").DefineComponent<{
398
398
  * - open the legend window, if new layer has a config
399
399
  */
400
400
  readonly openLegendOnAdd?: boolean | undefined;
401
+ /**
402
+ * - automatically close the legend window, if no layer has a config
403
+ */
404
+ readonly autoCloseLegend?: boolean | undefined;
401
405
  /**
402
406
  * - can be used to apply a scale factor to the overviewMap
403
407
  */
@@ -310,6 +310,10 @@ declare const _default: import("vue").DefineComponent<{
310
310
  * - open the legend window, if new layer has a config
311
311
  */
312
312
  readonly openLegendOnAdd?: boolean | undefined;
313
+ /**
314
+ * - automatically close the legend window, if no layer has a config
315
+ */
316
+ readonly autoCloseLegend?: boolean | undefined;
313
317
  /**
314
318
  * - can be used to apply a scale factor to the overviewMap
315
319
  */
@@ -2,14 +2,23 @@
2
2
  <div class="vcs-main-map">
3
3
  <VcsMap :map-id="mapId" />
4
4
  <MapNavigation v-if="showMapNavigation" />
5
+ <div
6
+ :id="overviewMapContainerId"
7
+ class="overviewmap-container"
8
+ :class="xs || mobileLandscape ? 'mobile' : ''"
9
+ :style="{ display: overviewMapState ? 'block' : 'none' }"
10
+ />
5
11
  </div>
6
12
  </template>
7
13
 
8
14
  <script>
9
15
  import { inject, onMounted, onUnmounted, ref, computed } from 'vue';
10
16
  import { v4 as uuid } from 'uuid';
11
- import MapNavigation from '../navigation/MapNavigation.vue';
17
+ import { useDisplay } from 'vuetify';
12
18
  import VcsMap from './VcsMap.vue';
19
+ import MapNavigation from '../navigation/MapNavigation.vue';
20
+ import { overviewMapContainerId } from '../navigation/overviewMap.js';
21
+ import { isMobileLandscape } from '../vuePlugins/vuetify.js';
13
22
 
14
23
  export function setupMapNavigation(app) {
15
24
  const mapSize = ref(app.maps.size);
@@ -48,6 +57,9 @@
48
57
  const id = uuid();
49
58
  const mapId = `mapCollection-${id}`;
50
59
 
60
+ const mobileLandscape = isMobileLandscape();
61
+ const { xs } = useDisplay();
62
+
51
63
  const { showMapNavigation, destroy: destroyMapNavigationListener } =
52
64
  setupMapNavigation(app);
53
65
 
@@ -63,9 +75,35 @@
63
75
  return {
64
76
  mapId,
65
77
  showMapNavigation,
78
+ overviewMapContainerId,
79
+ overviewMapState: app.overviewMap.currentState,
80
+ mobileLandscape,
81
+ xs,
66
82
  };
67
83
  },
68
84
  };
69
85
  </script>
70
86
 
71
- <style lang="scss" scoped></style>
87
+ <style lang="scss" scoped>
88
+ .overviewmap-container {
89
+ position: absolute;
90
+ right: 100px;
91
+ bottom: 25px;
92
+ width: 300px;
93
+ height: 240px;
94
+ background: rgb(var(--v-theme-surface));
95
+ border: 3px solid rgb(var(--v-theme-surface));
96
+ border-radius: 3px;
97
+ &.mobile {
98
+ width: 100%;
99
+ right: 0px;
100
+ bottom: 0px;
101
+ border-radius: 0px;
102
+ }
103
+ }
104
+
105
+ :deep(.overviewMapElement) {
106
+ width: 100%;
107
+ height: 100%;
108
+ }
109
+ </style>
@@ -5,5 +5,9 @@ export function setupMapNavigation(app: any): {
5
5
  declare const _default: import("vue").DefineComponent<{}, {
6
6
  mapId: string;
7
7
  showMapNavigation: import("vue").ComputedRef<boolean>;
8
+ overviewMapContainerId: string;
9
+ overviewMapState: any;
10
+ mobileLandscape: import("vue").ComputedRef<boolean>;
11
+ xs: import("vue").Ref<boolean>;
8
12
  }, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{}>>, {}, {}>;
9
13
  export default _default;
@@ -36,15 +36,6 @@
36
36
  overflow: hidden; /* Fix for iFrame content */
37
37
  }
38
38
 
39
- :deep(.overviewMapElement) {
40
- position: absolute;
41
- top: 3px;
42
- bottom: 3px;
43
- left: 3px;
44
- right: 3px;
45
- overflow: hidden; /* Fix for iFrame content */
46
- }
47
-
48
39
  :deep(.cesium-widget),
49
40
  :deep(.cesium-widget canvas) {
50
41
  width: 100%;
@@ -14,7 +14,7 @@
14
14
  <div class="d-flex">
15
15
  <VcsActionButtonList
16
16
  :actions="mapActions"
17
- :overflow-count="smAndDown ? 2 : 3"
17
+ :overflow-count="smAndDown ? 2 : 4"
18
18
  :force-overflow="false"
19
19
  button="VcsToolButton"
20
20
  />
@@ -104,6 +104,7 @@
104
104
  :tooltip="searchAction.title"
105
105
  :icon="searchAction.icon"
106
106
  :active="searchAction.active"
107
+ :background="searchAction.background"
107
108
  @click.stop="searchAction.callback($event)"
108
109
  v-bind="{ ...$attrs }"
109
110
  />
@@ -0,0 +1,30 @@
1
+ export default ActivateMapCallback;
2
+ export type ActivateMapCallbackOptions = import("./vcsCallback.js").VcsCallbackOptions & {
3
+ mapName: string;
4
+ };
5
+ /**
6
+ * @typedef {import("./vcsCallback.js").VcsCallbackOptions & { mapName: string }} ActivateMapCallbackOptions
7
+ * @property {string} mapName
8
+ */
9
+ /**
10
+ * Callback to activate a map by name using the app's map collection.
11
+ * @class
12
+ * @extends VcsCallback
13
+ */
14
+ declare class ActivateMapCallback extends VcsCallback {
15
+ /**
16
+ * @param {ActivateMapCallbackOptions} options
17
+ * @param {import("@src/vcsUiApp.js").default} app
18
+ */
19
+ constructor(options: ActivateMapCallbackOptions, app: import("@src/vcsUiApp.js").default);
20
+ /**
21
+ * @type {string}
22
+ * @private
23
+ */
24
+ private _mapName;
25
+ /**
26
+ * @returns {ActivateMapCallbackOptions}
27
+ */
28
+ toJSON(): ActivateMapCallbackOptions;
29
+ }
30
+ import VcsCallback from './vcsCallback.js';
@@ -0,0 +1,63 @@
1
+ import { getLogger } from '@vcsuite/logger';
2
+ import VcsCallback, { callbackClassRegistry } from './vcsCallback.js';
3
+
4
+ /**
5
+ * @typedef {import("./vcsCallback.js").VcsCallbackOptions & { mapName: string }} ActivateMapCallbackOptions
6
+ * @property {string} mapName
7
+ */
8
+
9
+ /**
10
+ * Callback to activate a map by name using the app's map collection.
11
+ * @class
12
+ * @extends VcsCallback
13
+ */
14
+ class ActivateMapCallback extends VcsCallback {
15
+ /**
16
+ * @param {ActivateMapCallbackOptions} options
17
+ * @param {import("@src/vcsUiApp.js").default} app
18
+ */
19
+ constructor(options, app) {
20
+ super(options, app);
21
+ /**
22
+ * @type {string}
23
+ * @private
24
+ */
25
+ this._mapName = options.mapName;
26
+ }
27
+
28
+ /**
29
+ * Activates the map with the given name.
30
+ */
31
+ callback() {
32
+ if (this._mapName) {
33
+ this._app.maps.setActiveMap(this._mapName).catch((error) => {
34
+ getLogger(ActivateMapCallback.className).error(
35
+ `Failed to activate map "${this._mapName}":`,
36
+ error,
37
+ );
38
+ });
39
+ }
40
+ }
41
+
42
+ /**
43
+ * @returns {ActivateMapCallbackOptions}
44
+ */
45
+ toJSON() {
46
+ const config = super.toJSON();
47
+ config.mapName = this._mapName;
48
+ return config;
49
+ }
50
+
51
+ /**
52
+ * @type {string}
53
+ */
54
+ static get className() {
55
+ return 'ActivateMapCallback';
56
+ }
57
+ }
58
+
59
+ callbackClassRegistry.registerClass(
60
+ ActivateMapCallback.className,
61
+ ActivateMapCallback,
62
+ );
63
+ export default ActivateMapCallback;
@@ -0,0 +1,7 @@
1
+ export default ActivateOverviewMapCallback;
2
+ /**
3
+ * Callback to activate the overview map using its API.
4
+ */
5
+ declare class ActivateOverviewMapCallback extends VcsCallback {
6
+ }
7
+ import VcsCallback from './vcsCallback.js';
@@ -0,0 +1,26 @@
1
+ import { getLogger } from '@vcsuite/logger';
2
+ import VcsCallback, { callbackClassRegistry } from './vcsCallback.js';
3
+
4
+ /**
5
+ * Callback to activate the overview map using its API.
6
+ */
7
+ class ActivateOverviewMapCallback extends VcsCallback {
8
+ static get className() {
9
+ return 'ActivateOverviewMapCallback';
10
+ }
11
+
12
+ callback() {
13
+ this._app.overviewMap.activate().catch((error) => {
14
+ getLogger(ActivateOverviewMapCallback.className).error(
15
+ 'Failed to activate overview map:',
16
+ error,
17
+ );
18
+ });
19
+ }
20
+ }
21
+
22
+ callbackClassRegistry.registerClass(
23
+ ActivateOverviewMapCallback.className,
24
+ ActivateOverviewMapCallback,
25
+ );
26
+ export default ActivateOverviewMapCallback;
@@ -0,0 +1,7 @@
1
+ export default DeactivateOverviewMapCallback;
2
+ /**
3
+ * Callback to deactivate the overview map using its API.
4
+ */
5
+ declare class DeactivateOverviewMapCallback extends VcsCallback {
6
+ }
7
+ import VcsCallback from './vcsCallback.js';
@@ -0,0 +1,20 @@
1
+ import VcsCallback, { callbackClassRegistry } from './vcsCallback.js';
2
+
3
+ /**
4
+ * Callback to deactivate the overview map using its API.
5
+ */
6
+ class DeactivateOverviewMapCallback extends VcsCallback {
7
+ static get className() {
8
+ return 'DeactivateOverviewMapCallback';
9
+ }
10
+
11
+ callback() {
12
+ this._app.overviewMap.deactivate();
13
+ }
14
+ }
15
+
16
+ callbackClassRegistry.registerClass(
17
+ DeactivateOverviewMapCallback.className,
18
+ DeactivateOverviewMapCallback,
19
+ );
20
+ export default DeactivateOverviewMapCallback;
@@ -58,6 +58,7 @@
58
58
  </v-container>
59
59
  </VcsFormSection>
60
60
  </template>
61
+
61
62
  <script>
62
63
  import { computed, inject, onMounted, onUnmounted, ref } from 'vue';
63
64
  import { VContainer, VSheet, VSpacer } from 'vuetify/components';
@@ -1,6 +1,15 @@
1
1
  <template>
2
2
  <v-container class="py-0 px-1 vcs-flight-player">
3
- <VcsLabel html-for="player">{{ $t('flight.player') }}</VcsLabel>
3
+ <v-row no-gutters class="d-flex align-center">
4
+ <VcsLabel html-for="player">{{ $t('flight.player') }}</VcsLabel>
5
+ <v-row class="d-flex justify-end px-1 gc-2" no-gutters>
6
+ <VcsActionButtonList
7
+ overflow-icon="$vcsShare"
8
+ :actions="recordingActions"
9
+ :disabled="!isCurrentPlayer || disabled"
10
+ />
11
+ </v-row>
12
+ </v-row>
4
13
  <VcsSlider
5
14
  v-if="clock"
6
15
  type="number"
@@ -32,22 +41,22 @@
32
41
  </div>
33
42
  </v-container>
34
43
  </template>
44
+
35
45
  <script>
36
46
  import { inject, onMounted, onUnmounted, ref } from 'vue';
37
- import { VContainer } from 'vuetify/components';
47
+ import { VContainer, VRow } from 'vuetify/components';
38
48
  import VcsSlider from '../form-inputs-controls/VcsSlider.vue';
39
49
  import VcsLabel from '../form-inputs-controls/VcsLabel.vue';
40
50
  import VcsButton from '../buttons/VcsButton.vue';
41
- import { createFlightPlayerActions } from '../../actions/flightActions.js';
51
+ import VcsActionButtonList from '../buttons/VcsActionButtonList.vue';
52
+ import {
53
+ createFlightMovieActions,
54
+ createFlightPlayerActions,
55
+ } from '../../actions/flightActions.js';
42
56
  import { getProvidedFlightInstance } from './composables.js';
43
57
 
44
58
  function getDefaultClock() {
45
- return {
46
- startTime: 0,
47
- endTime: 0,
48
- currentTime: 0,
49
- times: [],
50
- };
59
+ return { startTime: 0, endTime: 0, currentTime: 0, times: [] };
51
60
  }
52
61
 
53
62
  /**
@@ -70,18 +79,18 @@
70
79
  export default {
71
80
  name: 'VcsFlightPlayer',
72
81
  components: {
73
- VcsLabel,
74
- VcsButton,
75
82
  VContainer,
83
+ VRow,
84
+ VcsActionButtonList,
85
+ VcsButton,
86
+ VcsLabel,
76
87
  VcsSlider,
77
88
  },
78
- props: {
79
- disabled: {
80
- type: Boolean,
81
- default: false,
82
- },
83
- },
89
+ props: { disabled: { type: Boolean, default: false } },
84
90
  setup() {
91
+ /**
92
+ * @type {import("../../vcsUiApp.js").default}
93
+ */
85
94
  const app = inject('vcsApp');
86
95
  const flightInstance = getProvidedFlightInstance();
87
96
  const clock = ref(getDefaultClock());
@@ -113,6 +122,9 @@
113
122
  }
114
123
  }
115
124
 
125
+ const { actions: recordingActions, destroy: destroyRecordingActions } =
126
+ createFlightMovieActions(app, flightInstance);
127
+
116
128
  onMounted(async () => {
117
129
  flightInstancePlayer =
118
130
  await app.flights.setPlayerForFlight(flightInstance);
@@ -129,12 +141,14 @@
129
141
  onUnmounted(() => {
130
142
  destroy();
131
143
  playerChangedListener();
144
+ destroyRecordingActions();
132
145
  });
133
146
 
134
147
  return {
135
148
  clock,
136
149
  actions,
137
150
  isCurrentPlayer,
151
+ recordingActions,
138
152
  clockTime(seconds) {
139
153
  const mins = Math.floor(seconds / 60);
140
154
  const secs = Math.floor(seconds % 60);
@@ -12,6 +12,7 @@ declare const _default: import("vue").DefineComponent<{
12
12
  }>;
13
13
  actions: import("../../actions/actionHelper.js", { with: { "resolution-mode": "import" } }).VcsAction[];
14
14
  isCurrentPlayer: import("vue").Ref<boolean>;
15
+ recordingActions: import("../../actions/actionHelper.js", { with: { "resolution-mode": "import" } }).VcsAction[];
15
16
  clockTime(seconds: any): string;
16
17
  setTime(seconds: any): void;
17
18
  }, any, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
@@ -150,9 +150,10 @@
150
150
  />
151
151
  <v-expansion-panels
152
152
  variant="accordion"
153
+ flat
153
154
  multiple
154
155
  v-model="localOpenedGroups"
155
- class="rounded-0"
156
+ class="rounded-0 panels"
156
157
  >
157
158
  <vcs-expansion-panel
158
159
  v-for="(group, i) in groups"
@@ -176,4 +177,11 @@
176
177
  </div>
177
178
  </template>
178
179
 
179
- <style scoped lang="scss"></style>
180
+ <style scoped lang="scss">
181
+ .panels .vcs-expansion-panel:not(:last-child) {
182
+ border-bottom: 1px solid rgb(var(--v-theme-base-lighten-2));
183
+ }
184
+ :deep(.v-list-item-title) > span {
185
+ font-weight: bold;
186
+ }
187
+ </style>
@@ -307,6 +307,9 @@
307
307
  &.chevron-btn {
308
308
  margin-left: 4px;
309
309
  margin-right: 8px;
310
+ > span > i {
311
+ font-size: calc(var(--v-icon-size-multiplier) * 1.25em);
312
+ }
310
313
  }
311
314
  }
312
315
  // remove hover shadow over button