@vcmap/ui 6.2.0-rc.1 → 6.2.0-rc.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 (173) hide show
  1. package/build/build.js +52 -7
  2. package/config/dev.config.json +28 -0
  3. package/config/pano.config.json +420 -0
  4. package/config/projects.config.json +5 -0
  5. package/dist/assets/cesium/Workers/{chunk-P6TRGU3S.js → chunk-2PFJ45KC.js} +2 -2
  6. package/dist/assets/cesium/Workers/{chunk-7ZZ5LMZY.js → chunk-35ALNMG5.js} +15 -15
  7. package/dist/assets/cesium/Workers/{chunk-7YIOHQWH.js → chunk-35EJBV7X.js} +13 -13
  8. package/dist/assets/cesium/Workers/{chunk-EJVGYGLF.js → chunk-3E3OH65K.js} +7 -7
  9. package/dist/assets/cesium/Workers/{chunk-JBSKHTNX.js → chunk-4FHUY275.js} +4 -4
  10. package/dist/assets/cesium/Workers/{chunk-Z2QP3CXW.js → chunk-565T3GIE.js} +2 -2
  11. package/dist/assets/cesium/Workers/{chunk-IZGUQO6Q.js → chunk-5LGDCKCZ.js} +13 -13
  12. package/dist/assets/cesium/Workers/{chunk-3IFRSGEY.js → chunk-6JXJYBWN.js} +9 -9
  13. package/dist/assets/cesium/Workers/{chunk-WGDFYAGC.js → chunk-6RAEC3AW.js} +4 -4
  14. package/dist/assets/cesium/Workers/{chunk-44QAAS4P.js → chunk-6Z67VIOY.js} +7 -7
  15. package/dist/assets/cesium/Workers/{chunk-NGZJIN5Z.js → chunk-ADDGROZ6.js} +4 -4
  16. package/dist/assets/cesium/Workers/{chunk-GBT7MJ6X.js → chunk-ASYGMBRG.js} +1 -1
  17. package/dist/assets/cesium/Workers/{chunk-C4WPMOKT.js → chunk-BABDQOWA.js} +5 -5
  18. package/dist/assets/cesium/Workers/{chunk-IBRIWOCM.js → chunk-BQHHGIFB.js} +13 -13
  19. package/dist/assets/cesium/Workers/{chunk-LLAF3CPH.js → chunk-C33B4KHN.js} +2 -2
  20. package/dist/assets/cesium/Workers/{chunk-JXVLNVXC.js → chunk-CMCR2ZK4.js} +7 -7
  21. package/dist/assets/cesium/Workers/{chunk-3HQMMUPU.js → chunk-EGGJIATZ.js} +1 -1
  22. package/dist/assets/cesium/Workers/{chunk-RJM36CNY.js → chunk-EWS5LXAB.js} +6 -6
  23. package/dist/assets/cesium/Workers/{chunk-OPP2SKMA.js → chunk-FDXPBTSX.js} +12 -12
  24. package/dist/assets/cesium/Workers/{chunk-QN6TBED4.js → chunk-FIFQP4YX.js} +11 -11
  25. package/dist/assets/cesium/Workers/{chunk-JISPSEF3.js → chunk-HOGDZ2EB.js} +4 -4
  26. package/dist/assets/cesium/Workers/{chunk-2PTKXHJB.js → chunk-I4NB77NH.js} +10 -10
  27. package/dist/assets/cesium/Workers/{chunk-QQOZO7KO.js → chunk-JX4A2BCF.js} +7 -7
  28. package/dist/assets/cesium/Workers/{chunk-XIUSRWL6.js → chunk-K6PDUSH6.js} +5 -5
  29. package/dist/assets/cesium/Workers/{chunk-KHZNBFOH.js → chunk-KFHZFU5O.js} +7 -7
  30. package/dist/assets/cesium/Workers/{chunk-U5HSOKPQ.js → chunk-KYGXRFA6.js} +1 -1
  31. package/dist/assets/cesium/Workers/{chunk-56EDBCGT.js → chunk-LNWNAP2C.js} +10 -10
  32. package/dist/assets/cesium/Workers/{chunk-YCDZX5LS.js → chunk-LWN2B3KW.js} +1 -1
  33. package/dist/assets/cesium/Workers/{chunk-TI3TRKIC.js → chunk-LXLABO2L.js} +10 -10
  34. package/dist/assets/cesium/Workers/{chunk-C3EQ27WF.js → chunk-MB6B2UUL.js} +6 -6
  35. package/dist/assets/cesium/Workers/{chunk-57H6I3SV.js → chunk-MZSRINXK.js} +5 -5
  36. package/dist/assets/cesium/Workers/{chunk-ZVUUPJEM.js → chunk-NBI3GZSK.js} +17 -17
  37. package/dist/assets/cesium/Workers/{chunk-O72GZTSE.js → chunk-NUAXNUP5.js} +2 -2
  38. package/dist/assets/cesium/Workers/{chunk-M24KHENR.js → chunk-PNZR4RLL.js} +2 -2
  39. package/dist/assets/cesium/Workers/{chunk-HJMNR3GC.js → chunk-Q4K22DSJ.js} +11 -11
  40. package/dist/assets/cesium/Workers/{chunk-2LOWCAMW.js → chunk-Q4OS4EFN.js} +13 -13
  41. package/dist/assets/cesium/Workers/{chunk-TK5IIG2F.js → chunk-QLIMO7TQ.js} +4 -4
  42. package/dist/assets/cesium/Workers/{chunk-EDLRS3AW.js → chunk-RQ4F6YFU.js} +6 -6
  43. package/dist/assets/cesium/Workers/{chunk-JSQJDZI4.js → chunk-SB67D3JL.js} +6 -6
  44. package/dist/assets/cesium/Workers/{chunk-RTJKHZWU.js → chunk-SS6WRJ5J.js} +6 -6
  45. package/dist/assets/cesium/Workers/{chunk-L5GODJAR.js → chunk-TC4NTWIJ.js} +14 -14
  46. package/dist/assets/cesium/Workers/{chunk-IZJ42N4W.js → chunk-TKNA6WSZ.js} +17 -17
  47. package/dist/assets/cesium/Workers/{chunk-HP5XLODI.js → chunk-VQYEP77L.js} +6 -6
  48. package/dist/assets/cesium/Workers/{chunk-YSIJTJ7N.js → chunk-WKS5H3VW.js} +5 -5
  49. package/dist/assets/cesium/Workers/{chunk-XWOUPGUF.js → chunk-WPGX7DEA.js} +1 -1
  50. package/dist/assets/cesium/Workers/{chunk-6SQMLVGV.js → chunk-X3EPFVG3.js} +7 -7
  51. package/dist/assets/cesium/Workers/{chunk-NDDI2LWR.js → chunk-XH7MSR3A.js} +6 -6
  52. package/dist/assets/cesium/Workers/{chunk-FFLMY4TE.js → chunk-YDEBBUNQ.js} +5 -5
  53. package/dist/assets/cesium/Workers/{chunk-YK3QIKY7.js → chunk-YSVI7YNN.js} +9 -9
  54. package/dist/assets/cesium/Workers/{chunk-BVKITG4N.js → chunk-YVAS5WPH.js} +7 -7
  55. package/dist/assets/cesium/Workers/{chunk-X7IQYYHF.js → chunk-Z4QVAZM6.js} +2 -2
  56. package/dist/assets/cesium/Workers/{chunk-LJ2JQHJT.js → chunk-ZXOK77EW.js} +7 -7
  57. package/dist/assets/cesium/Workers/combineGeometry.js +22 -22
  58. package/dist/assets/cesium/Workers/createBoxGeometry.js +16 -16
  59. package/dist/assets/cesium/Workers/createBoxOutlineGeometry.js +14 -14
  60. package/dist/assets/cesium/Workers/createCircleGeometry.js +24 -24
  61. package/dist/assets/cesium/Workers/createCircleOutlineGeometry.js +17 -17
  62. package/dist/assets/cesium/Workers/createCoplanarPolygonGeometry.js +31 -31
  63. package/dist/assets/cesium/Workers/createCoplanarPolygonOutlineGeometry.js +29 -29
  64. package/dist/assets/cesium/Workers/createCorridorGeometry.js +27 -27
  65. package/dist/assets/cesium/Workers/createCorridorOutlineGeometry.js +26 -26
  66. package/dist/assets/cesium/Workers/createCylinderGeometry.js +18 -18
  67. package/dist/assets/cesium/Workers/createCylinderOutlineGeometry.js +16 -16
  68. package/dist/assets/cesium/Workers/createEllipseGeometry.js +24 -24
  69. package/dist/assets/cesium/Workers/createEllipseOutlineGeometry.js +17 -17
  70. package/dist/assets/cesium/Workers/createEllipsoidGeometry.js +17 -17
  71. package/dist/assets/cesium/Workers/createEllipsoidOutlineGeometry.js +16 -16
  72. package/dist/assets/cesium/Workers/createFrustumGeometry.js +16 -16
  73. package/dist/assets/cesium/Workers/createFrustumOutlineGeometry.js +16 -16
  74. package/dist/assets/cesium/Workers/createGeometry.js +22 -22
  75. package/dist/assets/cesium/Workers/createGroundPolylineGeometry.js +20 -20
  76. package/dist/assets/cesium/Workers/createPlaneGeometry.js +14 -14
  77. package/dist/assets/cesium/Workers/createPlaneOutlineGeometry.js +13 -13
  78. package/dist/assets/cesium/Workers/createPolygonGeometry.js +30 -30
  79. package/dist/assets/cesium/Workers/createPolygonOutlineGeometry.js +28 -28
  80. package/dist/assets/cesium/Workers/createPolylineGeometry.js +23 -23
  81. package/dist/assets/cesium/Workers/createPolylineVolumeGeometry.js +29 -29
  82. package/dist/assets/cesium/Workers/createPolylineVolumeOutlineGeometry.js +25 -25
  83. package/dist/assets/cesium/Workers/createRectangleGeometry.js +25 -25
  84. package/dist/assets/cesium/Workers/createRectangleOutlineGeometry.js +18 -18
  85. package/dist/assets/cesium/Workers/createSimplePolylineGeometry.js +21 -21
  86. package/dist/assets/cesium/Workers/createSphereGeometry.js +17 -17
  87. package/dist/assets/cesium/Workers/createSphereOutlineGeometry.js +16 -16
  88. package/dist/assets/cesium/Workers/createTaskProcessorWorker.js +3 -3
  89. package/dist/assets/cesium/Workers/createVectorTileClampedPolylines.js +13 -13
  90. package/dist/assets/cesium/Workers/createVectorTileGeometries.js +22 -22
  91. package/dist/assets/cesium/Workers/createVectorTilePoints.js +12 -12
  92. package/dist/assets/cesium/Workers/createVectorTilePolygons.js +20 -20
  93. package/dist/assets/cesium/Workers/createVectorTilePolylines.js +13 -13
  94. package/dist/assets/cesium/Workers/createVerticesFromGoogleEarthEnterpriseBuffer.js +20 -20
  95. package/dist/assets/cesium/Workers/createVerticesFromHeightmap.js +20 -20
  96. package/dist/assets/cesium/Workers/createVerticesFromQuantizedTerrainMesh.js +17 -17
  97. package/dist/assets/cesium/Workers/createWallGeometry.js +22 -22
  98. package/dist/assets/cesium/Workers/createWallOutlineGeometry.js +21 -21
  99. package/dist/assets/cesium/Workers/decodeDraco.js +11 -11
  100. package/dist/assets/cesium/Workers/decodeGoogleEarthEnterprisePacket.js +5 -5
  101. package/dist/assets/cesium/Workers/decodeI3S.js +10 -10
  102. package/dist/assets/cesium/Workers/transcodeKTX2.js +7 -7
  103. package/dist/assets/cesium/Workers/transferTypedArrayTest.js +1 -1
  104. package/dist/assets/cesium/Workers/upsampleQuantizedTerrainMesh.js +20 -20
  105. package/dist/assets/{cesium-ac6c193a.js → cesium-8dd00805.js} +44609 -44606
  106. package/dist/assets/cesium.js +1 -1
  107. package/dist/assets/core-6b5c0363.js +34173 -0
  108. package/dist/assets/core-workers/panoramaImageWorker.js +1 -0
  109. package/dist/assets/core-workers/panoramaImageWorker.js-0ce7d2f3.js +34 -0
  110. package/dist/assets/core.js +1 -1
  111. package/dist/assets/ol.js +1 -1
  112. package/dist/assets/start.js +3 -1
  113. package/dist/assets/ui-aadb7707.css +1 -0
  114. package/dist/assets/{ui-4f308e45.js → ui-aadb7707.js} +7917 -7606
  115. package/dist/assets/ui.js +1 -1
  116. package/dist/assets/vue.js +1 -1
  117. package/dist/assets/{vuetify-99195777.js → vuetify-533fb61b.js} +1 -1
  118. package/dist/assets/vuetify.js +1 -1
  119. package/index.d.ts +8 -0
  120. package/index.js +4 -0
  121. package/package.json +4 -4
  122. package/plugins/@vcmap-show-case/panorama-inspector/package.json +10 -0
  123. package/plugins/@vcmap-show-case/panorama-inspector/src/PanoramaDebugInfo.vue +86 -0
  124. package/plugins/@vcmap-show-case/panorama-inspector/src/PanoramaDebugTools.vue +259 -0
  125. package/plugins/@vcmap-show-case/panorama-inspector/src/PanoramaInspector.vue +31 -0
  126. package/plugins/@vcmap-show-case/panorama-inspector/src/api.js +161 -0
  127. package/plugins/@vcmap-show-case/panorama-inspector/src/index.js +57 -0
  128. package/plugins/@vcmap-show-case/panorama-inspector/src/showClickInteraction.js +20 -0
  129. package/src/actions/actionHelper.js +138 -26
  130. package/src/application/VcsApp.vue +11 -0
  131. package/src/application/VcsApp.vue.d.ts +4 -0
  132. package/src/application/VcsContainer.vue.d.ts +4 -0
  133. package/src/application/VcsNavbar.vue +2 -1
  134. package/src/callback/activateMapCallback.d.ts +30 -0
  135. package/src/callback/activateMapCallback.js +63 -0
  136. package/src/callback/activateOverviewMapCallback.d.ts +7 -0
  137. package/src/callback/activateOverviewMapCallback.js +26 -0
  138. package/src/callback/deactivateOverviewMapCallback.d.ts +7 -0
  139. package/src/callback/deactivateOverviewMapCallback.js +20 -0
  140. package/src/components/lists/VcsGroupedList.vue +10 -2
  141. package/src/components/lists/VcsTreeNode.vue +3 -0
  142. package/src/components/plugins/AbstractWorkspaceItemCreator.vue +104 -0
  143. package/src/components/plugins/AbstractWorkspaceItemCreator.vue.d.ts +82 -0
  144. package/src/components/section/VcsExpansionPanel.vue +13 -3
  145. package/src/components/vector-properties/VcsVectorPropertiesComponent.vue.d.ts +1 -1
  146. package/src/contentTree/LayerSwap.vue +15 -6
  147. package/src/featureInfo/featureInfo.js +6 -25
  148. package/src/featureInfo/iframeWmsFeatureInfoView.d.ts +10 -0
  149. package/src/featureInfo/iframeWmsFeatureInfoView.js +42 -0
  150. package/src/i18n/de.d.ts +4 -0
  151. package/src/i18n/de.js +3 -0
  152. package/src/i18n/en.d.ts +4 -0
  153. package/src/i18n/en.js +3 -0
  154. package/src/legend/VcsLegend.vue +5 -1
  155. package/src/navigation/MapNavigation.vue +60 -18
  156. package/src/navigation/MapNavigation.vue.d.ts +1 -0
  157. package/src/navigation/TiltSlider.vue +10 -2
  158. package/src/navigation/TiltSlider.vue.d.ts +20 -0
  159. package/src/navigation/VcsCompass.vue +3 -1
  160. package/src/navigation/overviewMap.d.ts +5 -0
  161. package/src/navigation/overviewMap.js +17 -0
  162. package/src/search/ResultsComponent.vue +8 -1
  163. package/src/search/SearchComponent.vue +3 -17
  164. package/src/search/SearchComponent.vue.d.ts +1 -2
  165. package/src/search/search.d.ts +13 -0
  166. package/src/search/search.js +21 -1
  167. package/src/uiConfig.d.ts +9 -0
  168. package/src/uiConfig.js +1 -0
  169. package/dist/assets/core-de8e51b5.js +0 -26236
  170. package/dist/assets/ui-4f308e45.css +0 -1
  171. /package/dist/assets/{ol-94c57f2e.js → ol-f58f403b.js} +0 -0
  172. /package/dist/assets/{vue-62303c82.js → vue-d7691a29.js} +0 -0
  173. /package/dist/assets/{vuetify-99195777.css → vuetify-533fb61b.css} +0 -0
@@ -0,0 +1,57 @@
1
+ import { ButtonLocation, createToggleAction, WindowSlot } from '@vcmap/ui';
2
+ import { name, version, mapVersion } from '../package.json';
3
+ import PanoramaInspector from './PanoramaInspector.vue';
4
+ import ShowClickInteraction from './showClickInteraction.js';
5
+
6
+ export default function panoramaInspector() {
7
+ let destroy;
8
+ let clickedInteraction;
9
+ let removeInteraction;
10
+ let clickedPrimitive;
11
+
12
+ return {
13
+ name,
14
+ version,
15
+ mapVersion,
16
+ get clickedInteraction() {
17
+ return clickedInteraction;
18
+ },
19
+ get clickedPrimitive() {
20
+ return clickedPrimitive;
21
+ },
22
+ async initialize(app) {
23
+ const { action, destroy: destroyAction } = createToggleAction(
24
+ {
25
+ name: 'Panorama Inspector',
26
+ },
27
+ {
28
+ id: 'panorama-inspector',
29
+ state: {
30
+ headerTitle: 'panoramaInspector.title',
31
+ },
32
+ component: PanoramaInspector,
33
+ slot: WindowSlot.DYNAMIC_RIGHT,
34
+ },
35
+ app.windowManager,
36
+ name,
37
+ );
38
+ app.navbarManager.add(
39
+ { id: 'panorama-inspector', action },
40
+ name,
41
+ ButtonLocation.MENU,
42
+ );
43
+ clickedInteraction = new ShowClickInteraction();
44
+ removeInteraction =
45
+ app.maps.eventHandler.addPersistentInteraction(clickedInteraction);
46
+ destroy = destroyAction;
47
+ },
48
+ destroy() {
49
+ destroy?.();
50
+ removeInteraction?.();
51
+ clickedInteraction?.destroy();
52
+ clickedInteraction = undefined;
53
+ clickedPrimitive?.destroy();
54
+ clickedPrimitive = undefined;
55
+ },
56
+ };
57
+ }
@@ -0,0 +1,20 @@
1
+ import { AbstractInteraction, EventType, VcsEvent } from '@vcmap/core';
2
+
3
+ export default class ShowClickInteraction extends AbstractInteraction {
4
+ constructor() {
5
+ super(EventType.CLICK);
6
+
7
+ this.clicked = new VcsEvent();
8
+ }
9
+
10
+ pipe(event) {
11
+ if (
12
+ event.map.className === 'PanoramaMap' &&
13
+ !event.map.getCesiumWidget().scene.screenSpaceCameraController
14
+ .enableInputs
15
+ ) {
16
+ this.clicked.raiseEvent(event);
17
+ }
18
+ return Promise.resolve(event);
19
+ }
20
+ }
@@ -6,6 +6,7 @@ import {
6
6
  Extent,
7
7
  MapCollection,
8
8
  mercatorProjection,
9
+ PanoramaMap,
9
10
  Viewpoint,
10
11
  } from '@vcmap/core';
11
12
  import { Feature } from 'ol';
@@ -56,6 +57,64 @@ export function getActionFromOptions(options) {
56
57
  return options;
57
58
  }
58
59
 
60
+ /**
61
+ * @param {import("@vcmap/core").PanoramaMap} map
62
+ * @param {import("../actions/actionHelper.js").VcsAction} action
63
+ * @returns {() => void}
64
+ */
65
+ function setupDisablePanorama(map, action) {
66
+ const datasetListeners = new Map();
67
+
68
+ action.disabled = true;
69
+ const setupDataset = (dataset) => {
70
+ datasetListeners.get(dataset.name)?.();
71
+ if (dataset.active) {
72
+ action.disabled = false;
73
+ }
74
+
75
+ const listener = dataset.stateChanged.addEventListener(() => {
76
+ if (!dataset.active) {
77
+ action.disabled = ![...map.layerCollection].find(
78
+ (d) => d.active && d.className === 'PanoramaDatasetLayer',
79
+ );
80
+ } else if (dataset.active) {
81
+ action.disabled = false;
82
+ }
83
+ });
84
+
85
+ datasetListeners.set(dataset.name, () => {
86
+ listener();
87
+ action.disabled = ![...map.layerCollection].find(
88
+ (d) => d.active && d.className === 'PanoramaDatasetLayer',
89
+ );
90
+ });
91
+ };
92
+
93
+ let datasetCollectionListeners = [];
94
+ const setupDatasets = () => {
95
+ datasetCollectionListeners.forEach((cb) => cb());
96
+ datasetListeners.forEach((cb) => cb());
97
+ datasetListeners.clear();
98
+
99
+ [...map.layerCollection].forEach(setupDataset);
100
+
101
+ datasetCollectionListeners = [
102
+ map.layerCollection.added.addEventListener(setupDataset),
103
+ map.layerCollection.removed.addEventListener((removedDataset) => {
104
+ datasetListeners.get(removedDataset.name)?.();
105
+ datasetListeners.delete(removedDataset.name);
106
+ }),
107
+ ];
108
+ };
109
+ setupDatasets();
110
+
111
+ return () => {
112
+ datasetCollectionListeners.forEach((cb) => cb());
113
+ datasetListeners.forEach((cb) => cb());
114
+ datasetListeners.clear();
115
+ };
116
+ }
117
+
59
118
  /**
60
119
  * @param {ActionOptions} actionOptions
61
120
  * @param {string} mapName
@@ -79,11 +138,23 @@ export function createMapButtonAction(actionOptions, mapName, maps) {
79
138
  maps.setActiveMap(mapName);
80
139
  },
81
140
  });
82
- const destroyListener = maps.mapActivated.addEventListener((map) => {
83
- action.active = map?.name === mapName;
141
+
142
+ const map = maps.getByKey(mapName);
143
+ let datasetListener;
144
+ if (map instanceof PanoramaMap) {
145
+ datasetListener = setupDisablePanorama(map, action);
146
+ }
147
+ const destroyListener = maps.mapActivated.addEventListener((activatedMap) => {
148
+ action.active = activatedMap?.name === mapName;
84
149
  });
85
150
 
86
- return { action, destroy: destroyListener };
151
+ return {
152
+ action,
153
+ destroy() {
154
+ datasetListener?.();
155
+ destroyListener();
156
+ },
157
+ };
87
158
  }
88
159
 
89
160
  /**
@@ -145,6 +216,64 @@ export function createToggleAction(
145
216
 
146
217
  export const searchComponentId = 'searchId';
147
218
 
219
+ /**
220
+ * @param {import("../vcsUiApp.js").default} app
221
+ * @returns {{action: import("vue").UnwrapRef<VcsAction>, destroy: function():void}}
222
+ */
223
+ function createSearchAction(app) {
224
+ const windowComponent = {
225
+ id: searchComponentId,
226
+ component: SearchComponent,
227
+ position: { width: 440 },
228
+ state: { hideHeader: true },
229
+ slot: WindowSlot.DYNAMIC_RIGHT,
230
+ };
231
+ const action = reactive({
232
+ name: 'search.title',
233
+ icon: '$vcsSearch',
234
+ title: 'search.tooltip',
235
+ active: false,
236
+ background: false,
237
+ callback() {
238
+ if (this.active && !this.background) {
239
+ app.windowManager.remove(searchComponentId);
240
+ this.active = false;
241
+ app.search.clearSearch();
242
+ } else {
243
+ app.windowManager.add(windowComponent, vcsAppSymbol);
244
+ }
245
+ },
246
+ });
247
+ const addedListener = app.windowManager.added.addEventListener(({ id }) => {
248
+ if (id === searchComponentId) {
249
+ action.active = true;
250
+ action.background = false;
251
+ }
252
+ });
253
+ const removedListener = app.windowManager.removed.addEventListener(
254
+ ({ id }) => {
255
+ if (id === searchComponentId) {
256
+ if (app.search.currentResults.value.length) {
257
+ action.active = true;
258
+ action.background = true;
259
+ } else {
260
+ action.active = false;
261
+ action.background = false;
262
+ app.search.clearSearch();
263
+ }
264
+ }
265
+ },
266
+ );
267
+
268
+ return {
269
+ action,
270
+ destroy: () => {
271
+ addedListener();
272
+ removedListener();
273
+ },
274
+ };
275
+ }
276
+
148
277
  /**
149
278
  * Creates a toggle button for the search tool, which is only available, if at least one search implementation is registered.
150
279
  * @param {import("../vcsUiApp.js").default} app
@@ -156,38 +285,21 @@ export function createSearchButtonAction(app) {
156
285
  const uiConfig = app.uiConfig.config;
157
286
 
158
287
  const determineAction = () => {
159
- if (app.windowManager.has(searchComponentId)) {
160
- app.windowManager.remove(searchComponentId);
161
- }
162
288
  if (
163
289
  !uiConfig.hideSearch &&
164
290
  app.search.size > 0 &&
165
291
  searchAction.value === null
166
292
  ) {
167
- const action = createToggleAction(
168
- {
169
- name: 'search.title',
170
- icon: '$vcsSearch',
171
- title: 'search.tooltip',
172
- },
173
- {
174
- id: searchComponentId,
175
- component: SearchComponent,
176
- state: { hideHeader: true },
177
- slot: WindowSlot.DYNAMIC_RIGHT,
178
- position: {
179
- width: 440,
180
- },
181
- },
182
- app.windowManager,
183
- vcsAppSymbol,
184
- );
185
- destroyAction = action.destroy;
186
- searchAction.value = reactive(action.action);
293
+ const { action, destroy } = createSearchAction(app);
294
+ destroyAction = destroy;
295
+ searchAction.value = action;
187
296
  } else if (
188
297
  (uiConfig.hideSearch || app.search.size === 0) &&
189
298
  searchAction.value !== null
190
299
  ) {
300
+ if (app.windowManager.has(searchComponentId)) {
301
+ app.windowManager.remove(searchComponentId);
302
+ }
191
303
  destroyAction();
192
304
  destroyAction = () => {};
193
305
  searchAction.value = null;
@@ -170,11 +170,14 @@
170
170
  OpenlayersMap: '$vcs2d',
171
171
  CesiumMap: '$vcs3d',
172
172
  ObliqueMap: '$vcsObliqueView',
173
+ PanoramaMap: 'mdi-image',
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
  */
@@ -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;
@@ -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
@@ -0,0 +1,104 @@
1
+ <template>
2
+ <v-container class="pa-0 abstract-workspace-item-creator">
3
+ <slot />
4
+ <div v-if="showFooter">
5
+ <v-divider class="mt-3" />
6
+ <div class="d-flex w-full justify-space-between px-2 pt-2 pb-1">
7
+ <VcsFormButton
8
+ v-if="showAdd && !workspaceHidden"
9
+ icon="$vcsComponentsPlus"
10
+ :disabled="disableAdd"
11
+ :tooltip="tooltipAdd"
12
+ @click="$emit('addClicked', $event)"
13
+ />
14
+ <div class="d-flex gc-2 w-100 justify-end">
15
+ <slot name="secondaryButton" />
16
+ <VcsFormButton
17
+ variant="filled"
18
+ :disabled="disableNew"
19
+ :tooltip="tooltipNew"
20
+ @click="$emit('newClicked', $event)"
21
+ >
22
+ {{ $st(newButtonTitle) }}
23
+ </VcsFormButton>
24
+ <VcsActionButtonList :actions="actions" button="VcsFormButton" />
25
+ </div>
26
+ </div>
27
+ </div>
28
+ </v-container>
29
+ </template>
30
+
31
+ <script>
32
+ import { VContainer, VDivider } from 'vuetify/components';
33
+ import { computed, inject } from 'vue';
34
+ import VcsFormButton from '../buttons/VcsFormButton.vue';
35
+ import VcsActionButtonList from '../buttons/VcsActionButtonList.vue';
36
+
37
+ /**
38
+ * @description Basic wrapper for all plugins interacting with MyWorkspace.
39
+ * Providing a footer with add and new buttons.
40
+ * @vue-prop {boolean} [showFooter=true] - Flag to hide the footer.
41
+ * @vue-prop {boolean} [showAdd=true] - Flag to show an add button in the footer. You need to handle @addClicked in a child component.
42
+ * @vue-prop {boolean} [disableAdd=false] - Flag to render add button disabled.
43
+ * @vue-prop {boolean} [tooltipAdd='components.addToMyWorkspace'] - Option to change the add button tooltip.
44
+ * @vue-prop {boolean} [disableNew=false] - Flag to render new button disabled.
45
+ * @vue-prop {boolean} [tooltipNew''] - Option to change the add a tooltip to the new button.
46
+ * @vue-prop {Array<VcsAction>} [actions] - Optional actions rendered as ActionButtonList in the footer.
47
+ * @vue-prop {string} [newButtonTitle='components.new'] - Option to change the new button title, e.g. to 'components.apply'.
48
+ * @vue-event {Event} addClicked - Event fired on clicking the reset button.
49
+ * @vue-event {Event} newClicked - Event fired on clicking the cancel button.
50
+ * @vue-slot secondaryButton An optionnal named slot to add a secondary button to the footer, rendered filled on the left of the new button.
51
+ */
52
+ export default {
53
+ name: 'AbstractWorkspaceItemCreator',
54
+ components: {
55
+ VContainer,
56
+ VDivider,
57
+ VcsFormButton,
58
+ VcsActionButtonList,
59
+ },
60
+ props: {
61
+ showFooter: {
62
+ type: Boolean,
63
+ default: true,
64
+ },
65
+ showAdd: {
66
+ type: Boolean,
67
+ default: true,
68
+ },
69
+ disableAdd: {
70
+ type: Boolean,
71
+ default: false,
72
+ },
73
+ tooltipAdd: {
74
+ type: String,
75
+ default: 'components.addToMyWorkspace',
76
+ },
77
+ newButtonTitle: {
78
+ type: String,
79
+ default: 'components.new',
80
+ },
81
+ disableNew: {
82
+ type: Boolean,
83
+ default: false,
84
+ },
85
+ tooltipNew: {
86
+ type: String,
87
+ default: '',
88
+ },
89
+ actions: {
90
+ type: Array,
91
+ default: () => [],
92
+ },
93
+ },
94
+ emits: ['addClicked', 'newClicked'],
95
+ setup() {
96
+ const app = inject('vcsApp');
97
+ return {
98
+ workspaceHidden: computed(() => !!app.uiConfig.config.workspaceHidden),
99
+ };
100
+ },
101
+ };
102
+ </script>
103
+
104
+ <style scoped></style>