@vcmap/ui 6.0.0-rc.2 → 6.0.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 (178) hide show
  1. package/build/build.js +40 -60
  2. package/build/buildHelpers.js +2 -8
  3. package/build/info/conf.json +1 -1
  4. package/config/projects.config.json +2 -1
  5. package/config/splashscreen.config.json +45 -0
  6. package/dist/.htaccess +7 -0
  7. package/dist/assets/@mdi/font/README.md +25 -0
  8. package/dist/assets/@mdi/font/css/materialdesignicons.min-7a4f6be0.css +3 -0
  9. package/dist/assets/@mdi/font/css/materialdesignicons.min.css.map +16 -0
  10. package/dist/assets/@mdi/font/fonts/materialdesignicons-webfont.woff2 +0 -0
  11. package/dist/assets/cesium.js +1 -1
  12. package/dist/assets/{core.cbf44a.js → core-72f21835.js} +673 -641
  13. package/dist/assets/core.js +1 -1
  14. package/dist/assets/{ol.86e93c.js → ol-2d33bc8b.js} +42505 -44282
  15. package/dist/assets/ol.js +1 -1
  16. package/dist/assets/ui-2ab43a16.css +1 -0
  17. package/dist/assets/{ui.7c276c.js → ui-2ab43a16.js} +12026 -12100
  18. package/dist/assets/ui.js +1 -1
  19. package/dist/assets/vue.js +1 -1
  20. package/dist/assets/{vuetify.4d18fe.css → vuetify-760ced3b.css} +1 -1
  21. package/dist/assets/{vuetify.4d18fe.js → vuetify-760ced3b.js} +5720 -5662
  22. package/dist/assets/vuetify.js +1 -1
  23. package/dist/index.html +11 -10
  24. package/index.d.ts +7 -5
  25. package/index.html +5 -5
  26. package/index.js +3 -3
  27. package/lib/olLib.js +84 -23
  28. package/package.json +5 -5
  29. package/plugins/@vcmap-show-case/flight-component-example/src/FlightExample.vue +41 -1
  30. package/plugins/@vcmap-show-case/form-inputs-example/src/FormInputsExample.vue +70 -30
  31. package/plugins/@vcmap-show-case/form-inputs-example/src/exampleActions.js +7 -11
  32. package/plugins/@vcmap-show-case/form-inputs-example/src/index.js +2 -2
  33. package/plugins/@vcmap-show-case/list-example/src/ListExample.vue +21 -8
  34. package/plugins/@vcmap-show-case/style-input-example/src/StyleExample.vue +29 -90
  35. package/public/assets/@mdi/font/README.md +25 -0
  36. package/public/assets/@mdi/font/css/materialdesignicons.min.css +2 -2
  37. package/public/assets/@mdi/font/css/materialdesignicons.min.css.map +16 -0
  38. package/public/assets/@mdi/font/fonts/materialdesignicons-webfont.woff2 +0 -0
  39. package/src/actions/actionHelper.js +20 -20
  40. package/src/actions/flightActions.js +5 -5
  41. package/src/actions/listActions.d.ts +0 -7
  42. package/src/actions/listActions.js +4 -20
  43. package/src/actions/stateRefAction.js +2 -2
  44. package/src/application/VcsApp.vue +52 -27
  45. package/src/application/VcsApp.vue.d.ts +1 -0
  46. package/src/application/VcsAttributions.vue +2 -13
  47. package/src/application/VcsAttributionsFooter.vue +10 -11
  48. package/src/application/VcsPositionDisplay.vue +8 -23
  49. package/src/application/VcsPositionDisplay.vue.d.ts +0 -1
  50. package/src/application/VcsSettings.vue +10 -17
  51. package/src/application/VcsSplashScreen.vue +25 -42
  52. package/src/application/VcsSplashScreen.vue.d.ts +0 -2
  53. package/src/application/VcsTextPage.vue +12 -43
  54. package/src/application/VcsTextPage.vue.d.ts +4 -8
  55. package/src/application/VcsTextPageFooter.vue +22 -40
  56. package/src/components/extent/VcsExtentEditor.vue +1 -1
  57. package/src/components/flight/VcsFlightAnchorsComponent.vue +63 -36
  58. package/src/components/flight/VcsFlightComponent.vue +16 -21
  59. package/src/components/flight/VcsFlightPlayer.vue +27 -5
  60. package/src/components/form-inputs-controls/VcsCheckbox.vue +9 -5
  61. package/src/components/form-inputs-controls/VcsCoordinate.vue +13 -1
  62. package/src/components/form-inputs-controls/VcsCoordinate.vue.d.ts +5 -2
  63. package/src/components/form-inputs-controls/VcsDatePicker.vue +34 -60
  64. package/src/components/form-inputs-controls/VcsDatePicker.vue.d.ts +1 -63
  65. package/src/components/form-inputs-controls/VcsFileInput.vue +17 -18
  66. package/src/components/form-inputs-controls/VcsFileInput.vue.d.ts +1 -0
  67. package/src/components/form-inputs-controls/VcsLabel.vue +1 -1
  68. package/src/components/form-inputs-controls/VcsRadio.vue +17 -3
  69. package/src/components/form-inputs-controls/VcsRadio.vue.d.ts +1 -0
  70. package/src/components/form-inputs-controls/VcsSelect.vue +39 -27
  71. package/src/components/form-inputs-controls/VcsSelect.vue.d.ts +5 -2
  72. package/src/components/form-inputs-controls/VcsSlider.vue +14 -1
  73. package/src/components/form-inputs-controls/VcsSlider.vue.d.ts +5 -2
  74. package/src/components/form-inputs-controls/VcsTextArea.vue +26 -22
  75. package/src/components/form-inputs-controls/VcsTextArea.vue.d.ts +1 -0
  76. package/src/components/form-inputs-controls/VcsTextField.vue +6 -4
  77. package/src/components/form-inputs-controls/VcsWizardStep.vue +1 -1
  78. package/src/components/form-inputs-controls/vcsTextField.scss +8 -8
  79. package/src/components/form-output/VcsFormattedNumber.vue +15 -1
  80. package/src/components/form-output/VcsFormattedNumber.vue.d.ts +9 -0
  81. package/src/components/lists/VcsActionList.vue +7 -7
  82. package/src/components/lists/VcsList.vue +10 -17
  83. package/src/components/lists/VcsList.vue.d.ts +3 -7
  84. package/src/components/lists/VcsListItem.vue +51 -21
  85. package/src/components/lists/VcsListItem.vue.d.ts +11 -5
  86. package/src/components/section/VcsExpansionPanel.vue +101 -0
  87. package/src/components/section/VcsExpansionPanel.vue.d.ts +19 -0
  88. package/src/components/style/MenuWrapper.vue +24 -26
  89. package/src/components/style/MenuWrapper.vue.d.ts +4 -4
  90. package/src/components/style/VcsFillMenu.vue +9 -16
  91. package/src/components/style/VcsFillMenu.vue.d.ts +0 -18
  92. package/src/components/style/VcsFillSelector.vue +13 -16
  93. package/src/components/style/VcsImageMenu.vue +8 -25
  94. package/src/components/style/VcsImageMenu.vue.d.ts +0 -27
  95. package/src/components/style/VcsImageSelector.vue +102 -167
  96. package/src/components/style/VcsImageSelector.vue.d.ts +15 -15
  97. package/src/components/style/VcsStrokeMenu.vue +8 -15
  98. package/src/components/style/VcsStrokeMenu.vue.d.ts +0 -18
  99. package/src/components/style/VcsStrokeSelector.vue +11 -18
  100. package/src/components/style/VcsTextMenu.vue +9 -12
  101. package/src/components/style/VcsTextMenu.vue.d.ts +0 -9
  102. package/src/components/style/VcsTextSelector.vue +79 -95
  103. package/src/components/style/VcsTextSelector.vue.d.ts +20 -22
  104. package/src/components/style/VcsVectorStyleComponent.vue +7 -18
  105. package/src/components/style/VcsVectorStyleComponent.vue.d.ts +1 -1
  106. package/src/components/style/composables.d.ts +0 -14
  107. package/src/components/style/composables.js +0 -49
  108. package/src/components/vector-properties/VcsFeatureEditingWindow.vue +39 -6
  109. package/src/components/vector-properties/VcsVectorPropertiesComponent.vue +1 -1
  110. package/src/components/viewpoint/VcsViewpointComponent.vue +21 -8
  111. package/src/components/viewpoint/VcsViewpointEditor.vue +1 -0
  112. package/src/contentTree/contentTreeItem.d.ts +2 -2
  113. package/src/contentTree/contentTreeItem.js +7 -7
  114. package/src/featureInfo/featureInfo.js +8 -10
  115. package/src/init.d.ts +5 -38
  116. package/src/init.js +19 -18
  117. package/src/legend/StyleLegendItem.vue +4 -9
  118. package/src/legend/VcsLegend.vue +28 -54
  119. package/src/manager/buttonManager.js +4 -4
  120. package/src/manager/collectionManager/CollectionComponent.vue +17 -42
  121. package/src/manager/collectionManager/CollectionComponent.vue.d.ts +4 -2
  122. package/src/manager/collectionManager/CollectionComponentContent.vue +7 -6
  123. package/src/manager/collectionManager/CollectionComponentContent.vue.d.ts +3 -1
  124. package/src/manager/collectionManager/CollectionComponentList.vue +10 -8
  125. package/src/manager/collectionManager/CollectionComponentList.vue.d.ts +4 -2
  126. package/src/manager/collectionManager/CollectionComponentProvider.vue +1 -1
  127. package/src/manager/collectionManager/CollectionComponentStandalone.vue +3 -2
  128. package/src/manager/collectionManager/CollectionManager.vue +1 -1
  129. package/src/manager/collectionManager/collectionComponentClass.js +6 -9
  130. package/src/manager/collectionManager/collectionManager.js +10 -10
  131. package/src/manager/collectionManager/editorCollectionComponentClass.js +4 -4
  132. package/src/manager/contextMenu/contextMenuManager.js +2 -2
  133. package/src/manager/navbarManager.js +2 -2
  134. package/src/manager/panel/panelManager.js +3 -3
  135. package/src/manager/toolbox/toolboxManager.js +10 -10
  136. package/src/manager/window/windowManager.d.ts +2 -2
  137. package/src/manager/window/windowManager.js +4 -4
  138. package/src/search/search.js +2 -2
  139. package/src/siteConfig.js +1 -1
  140. package/src/state.js +4 -4
  141. package/src/vcsUiApp.d.ts +14 -10
  142. package/src/vcsUiApp.js +1 -1
  143. package/src/vuePlugins/vuetify.d.ts +2 -0
  144. package/src/vuePlugins/vuetify.js +11 -0
  145. package/dist/assets/@mdi/font/css/materialdesignicons.css.map +0 -16
  146. package/dist/assets/@mdi/font/css/materialdesignicons.min.e3f476.css +0 -3
  147. package/dist/assets/index-8eGauqjA.js +0 -1
  148. package/dist/assets/ui.7c276c.css +0 -1
  149. package/public/assets/@mdi/font/css/materialdesignicons.css.map +0 -16
  150. package/src/application/VcsCustomScreen.vue +0 -45
  151. package/src/application/VcsCustomScreen.vue.d.ts +0 -15
  152. /package/dist/assets/{cesium.0b750d.js → cesium-cb4dbfba.js} +0 -0
  153. /package/dist/assets/{favicon-128.4c4ce5.png → favicon-128-4c4ce5df.png} +0 -0
  154. /package/dist/assets/{favicon-180.5b99c0.png → favicon-180-4c4ce5df.png} +0 -0
  155. /package/dist/assets/{favicon-192.0e205e.png → favicon-192-4c4ce5df.png} +0 -0
  156. /package/dist/assets/{favicon-32.6b9add.png → favicon-32-4c4ce5df.png} +0 -0
  157. /package/dist/assets/{favicon.d5ec97.svg → favicon-4c4ce5df.svg} +0 -0
  158. /package/dist/assets/font/{TitilliumWeb-Regular.9ca076.woff2 → TitilliumWeb-Regular-9ca076be.woff2} +0 -0
  159. /package/dist/assets/style/{icon-marker.70960f.png → icon-marker-70960f05.png} +0 -0
  160. /package/dist/assets/style/{icon-marker-blue.534e37.png → icon-marker-blue-534e374b.png} +0 -0
  161. /package/dist/assets/style/{icon-marker-green.0b6a92.png → icon-marker-green-0b6a92bc.png} +0 -0
  162. /package/dist/assets/style/{icon-marker-o.036477.png → icon-marker-o-036477fa.png} +0 -0
  163. /package/dist/assets/style/{icon-marker-o-blue.7b6d62.png → icon-marker-o-blue-7b6d6279.png} +0 -0
  164. /package/dist/assets/style/{icon-marker-o-green.c863c0.png → icon-marker-o-green-c863c0fa.png} +0 -0
  165. /package/dist/assets/style/{icon-marker-o-red.93ff58.png → icon-marker-o-red-93ff58df.png} +0 -0
  166. /package/dist/assets/style/{icon-marker-red.313d03.png → icon-marker-red-313d03e8.png} +0 -0
  167. /package/dist/assets/style/{icon-pin.b7ce77.png → icon-pin-b7ce771e.png} +0 -0
  168. /package/dist/assets/style/{icon-pin-blue.7be369.png → icon-pin-blue-7be369a3.png} +0 -0
  169. /package/dist/assets/style/{icon-pin-green.cbb935.png → icon-pin-green-cbb935fe.png} +0 -0
  170. /package/dist/assets/style/{icon-pin-red.3f25b2.png → icon-pin-red-3f25b245.png} +0 -0
  171. /package/dist/assets/{vue.a3cd64.js → vue-03b265aa.js} +0 -0
  172. /package/public/assets/{favicon-128.png → favicon-128-4c4ce5df.png} +0 -0
  173. /package/public/assets/{favicon-180.png → favicon-180-4c4ce5df.png} +0 -0
  174. /package/public/assets/{favicon-192.png → favicon-192-4c4ce5df.png} +0 -0
  175. /package/public/assets/{favicon-32.png → favicon-32-4c4ce5df.png} +0 -0
  176. /package/public/assets/{favicon.svg → favicon-4c4ce5df.svg} +0 -0
  177. /package/src/components/{form-inputs-controls → section}/VcsFormSection.vue +0 -0
  178. /package/src/components/{form-inputs-controls → section}/VcsFormSection.vue.d.ts +0 -0
@@ -60,7 +60,7 @@
60
60
  pointVectorProperties,
61
61
  nonPointVectorProperties,
62
62
  } from './VcsVectorPropertiesComponent.vue';
63
- import VcsFormSection from '../form-inputs-controls/VcsFormSection.vue';
63
+ import VcsFormSection from '../section/VcsFormSection.vue';
64
64
 
65
65
  /**
66
66
  * @typedef {Object} EditorManager
@@ -290,6 +290,9 @@
290
290
  nFeatures: features.value.length,
291
291
  }));
292
292
 
293
+ /**
294
+ * @returns {{actions: VcsActions, destroy: function():void}}
295
+ */
293
296
  function getAllowedModifyActions() {
294
297
  const allowedModes = getAllowedEditorTransformationModes(
295
298
  currentGeometryTypes.value.types,
@@ -301,26 +304,49 @@
301
304
  name: mode,
302
305
  title: `components.editor.${mode}`,
303
306
  icon: EditorTransformationIcons[mode],
304
- active: computed(() => currentTransformationMode.value === mode),
307
+ active: mode === currentTransformationMode.value,
305
308
  callback: () => {
306
309
  toggleTransformationSession(mode);
307
310
  },
308
311
  };
309
312
  });
310
313
 
314
+ const transformationModeWatcher = watch(
315
+ currentTransformationMode,
316
+ (mode) => {
317
+ allowedActions.forEach((action) => {
318
+ if (Object.values(TransformationMode).includes(action.name)) {
319
+ action.active = mode === action.name;
320
+ }
321
+ });
322
+ },
323
+ );
324
+
325
+ let geometryEditingWatcher;
311
326
  if (features.value.length === 1) {
312
- allowedActions.unshift({
327
+ const editGeometryAction = {
313
328
  name: 'editGeometry',
314
329
  title: `components.editor.edit`,
315
330
  icon: '$vcsEditVertices',
316
- active: isGeometryEditing,
331
+ active: isGeometryEditing.value,
317
332
  callback: () => {
318
333
  toggleEditGeometrySession();
319
334
  },
335
+ };
336
+ allowedActions.unshift(editGeometryAction);
337
+
338
+ geometryEditingWatcher = watch(isGeometryEditing, () => {
339
+ editGeometryAction.active = isGeometryEditing.value;
320
340
  });
321
341
  }
322
342
 
323
- return allowedActions;
343
+ return {
344
+ actions: allowedActions,
345
+ destroy() {
346
+ transformationModeWatcher();
347
+ geometryEditingWatcher?.();
348
+ },
349
+ };
324
350
  }
325
351
 
326
352
  function getAllowedVectorProperties() {
@@ -350,6 +376,8 @@
350
376
  return properties;
351
377
  }
352
378
 
379
+ let destroyModifyActions = () => {};
380
+
353
381
  const geometryTypesWatcher = watch(
354
382
  currentGeometryTypes,
355
383
  (curr, prev) => {
@@ -359,7 +387,11 @@
359
387
  (curr.nFeatures > 1 && prev.nFeatures === 1) ||
360
388
  (prev.nFeatures > 1 && curr.nFeatures === 1)
361
389
  ) {
362
- availableModifyActions.value = getAllowedModifyActions();
390
+ destroyModifyActions();
391
+ const modifyActions = getAllowedModifyActions();
392
+ destroyModifyActions = modifyActions.destroy;
393
+
394
+ availableModifyActions.value = modifyActions.actions;
363
395
  availableVectorProperties.value = getAllowedVectorProperties();
364
396
  }
365
397
  },
@@ -379,6 +411,7 @@
379
411
  geometryTypesWatcher();
380
412
  propsWatcher();
381
413
  editorManager.stopEditing();
414
+ destroyModifyActions();
382
415
  });
383
416
 
384
417
  return {
@@ -460,7 +460,7 @@
460
460
  useProxiedComplexModel,
461
461
  useModelHasProperty,
462
462
  } from '../modelHelper.js';
463
- import VcsFormSection from '../form-inputs-controls/VcsFormSection.vue';
463
+ import VcsFormSection from '../section/VcsFormSection.vue';
464
464
  import VcsLabel from '../form-inputs-controls/VcsLabel.vue';
465
465
  import VcsTextField from '../form-inputs-controls/VcsTextField.vue';
466
466
  import VcsSelect from '../form-inputs-controls/VcsSelect.vue';
@@ -176,11 +176,12 @@
176
176
  onUnmounted,
177
177
  reactive,
178
178
  ref,
179
+ toRaw,
179
180
  watch,
180
181
  } from 'vue';
181
182
  import { VSheet, VContainer, VRow, VCol } from 'vuetify/components';
182
183
  import { CesiumMap, ObliqueMap, OpenlayersMap, Viewpoint } from '@vcmap/core';
183
- import VcsFormSection from '../form-inputs-controls/VcsFormSection.vue';
184
+ import VcsFormSection from '../section/VcsFormSection.vue';
184
185
  import VcsLabel from '../form-inputs-controls/VcsLabel.vue';
185
186
  import VcsTextField from '../form-inputs-controls/VcsTextField.vue';
186
187
  import VcsCheckbox from '../form-inputs-controls/VcsCheckbox.vue';
@@ -188,6 +189,20 @@
188
189
  import VcsSlider from '../form-inputs-controls/VcsSlider.vue';
189
190
  import { useProxiedComplexModel } from '../modelHelper.js';
190
191
 
192
+ /**
193
+ * Updates the localValue ref by keeping name and properties
194
+ * @param {import("vue").Ref<import("vue").UnwrapRef<import("@vcmap/core").ViewpointOptions>>} localValue
195
+ * @param {import("@vcmap/core").Viewpoint} viewpoint
196
+ */
197
+ function updateLocalValueFromViewpoint(localValue, viewpoint) {
198
+ const options = viewpoint.toJSON();
199
+ options.name = localValue.value.name;
200
+ if (localValue.value.properties) {
201
+ options.properties = toRaw(localValue.value.properties);
202
+ }
203
+ localValue.value = options;
204
+ }
205
+
191
206
  /**
192
207
  * Set up post render handler, if action is active.
193
208
  * If action is inactive, destroy post render handler to allow manual editing.
@@ -213,9 +228,7 @@
213
228
  ) {
214
229
  return;
215
230
  }
216
- const options = viewpoint.toJSON();
217
- options.name = localValue.value.name;
218
- localValue.value = options;
231
+ updateLocalValueFromViewpoint(localValue, viewpoint);
219
232
  cachedViewpoint = viewpoint;
220
233
  },
221
234
  );
@@ -416,10 +429,10 @@
416
429
  title: 'components.viewpoint.updateFromView',
417
430
  async callback() {
418
431
  if (app.maps.activeMap) {
419
- const viewpoint = await app.maps.activeMap.getViewpoint();
420
- const options = viewpoint.toJSON();
421
- options.name = localValue.value.name;
422
- localValue.value = options;
432
+ updateLocalValueFromViewpoint(
433
+ localValue,
434
+ await app.maps.activeMap.getViewpoint(),
435
+ );
423
436
  }
424
437
  },
425
438
  };
@@ -7,6 +7,7 @@
7
7
  v-bind="{ ...$attrs, ...$props }"
8
8
  >
9
9
  <VcsViewpointComponent
10
+ v-bind="$attrs"
10
11
  v-model="localConfig"
11
12
  hide-name
12
13
  :name-rules="nameRules"
@@ -272,11 +272,11 @@ declare class ContentTreeItem {
272
272
  /**
273
273
  * @param {(string|HTMLCanvasElement|HTMLImageElement)=} icon
274
274
  */
275
- set icon(icon: string | HTMLCanvasElement | HTMLImageElement | undefined);
275
+ set icon(icon: string | HTMLImageElement | HTMLCanvasElement | undefined);
276
276
  /**
277
277
  * @type {string|HTMLCanvasElement|HTMLImageElement|undefined}
278
278
  */
279
- get icon(): string | HTMLCanvasElement | HTMLImageElement | undefined;
279
+ get icon(): string | HTMLImageElement | HTMLCanvasElement | undefined;
280
280
  /**
281
281
  * @param {number} weight
282
282
  */
@@ -1,5 +1,5 @@
1
1
  import { ref, reactive, computed, shallowRef } from 'vue';
2
- import { check, checkMaybe } from '@vcsuite/check';
2
+ import { check, maybe, ofEnum, oneOf } from '@vcsuite/check';
3
3
  import { parseBoolean, parseNumber } from '@vcsuite/parsers';
4
4
  import { ClassRegistry, VcsEvent } from '@vcmap/core';
5
5
  import { createLinkAction } from '../actions/actionHelper.js';
@@ -258,7 +258,7 @@ class ContentTreeItem {
258
258
  * @param {StateActionState} state
259
259
  */
260
260
  set state(state) {
261
- check(state, Object.values(StateActionState));
261
+ check(state, ofEnum(StateActionState));
262
262
 
263
263
  if (this._state.value !== state) {
264
264
  this._state.value = state;
@@ -277,7 +277,7 @@ class ContentTreeItem {
277
277
  * @param {string} url
278
278
  */
279
279
  set infoUrl(url) {
280
- checkMaybe(url, String);
280
+ check(url, maybe(String));
281
281
 
282
282
  if (this._infoUrl !== url) {
283
283
  this._infoUrl = url;
@@ -309,7 +309,7 @@ class ContentTreeItem {
309
309
  * @param {string|undefined} title
310
310
  */
311
311
  set title(title) {
312
- checkMaybe(title, String);
312
+ check(title, maybe(String));
313
313
 
314
314
  this._title.value = title;
315
315
  }
@@ -325,7 +325,7 @@ class ContentTreeItem {
325
325
  * @param {string|undefined} tooltip
326
326
  */
327
327
  set tooltip(tooltip) {
328
- checkMaybe(tooltip, String);
328
+ check(tooltip, maybe(String));
329
329
 
330
330
  this._tooltip.value = tooltip;
331
331
  }
@@ -341,7 +341,7 @@ class ContentTreeItem {
341
341
  * @param {(string|HTMLCanvasElement|HTMLImageElement)=} icon
342
342
  */
343
343
  set icon(icon) {
344
- checkMaybe(icon, [String, HTMLElement]);
344
+ check(icon, maybe(oneOf(String, HTMLElement)));
345
345
 
346
346
  this._icon.value = icon;
347
347
  }
@@ -411,7 +411,7 @@ class ContentTreeItem {
411
411
  */
412
412
  addAction(action, weight = 11) {
413
413
  check(action.name, String);
414
- checkMaybe(weight, Number);
414
+ check(weight, maybe(Number));
415
415
 
416
416
  const index = this._getActionIndex(action.name);
417
417
  if (index > -1) {
@@ -21,7 +21,7 @@ import {
21
21
  Entity,
22
22
  } from '@vcmap-cesium/engine';
23
23
  import { Feature } from 'ol';
24
- import { check, checkMaybe } from '@vcsuite/check';
24
+ import { check, maybe, oneOf } from '@vcsuite/check';
25
25
 
26
26
  import { vcsAppSymbol } from '../pluginHelper.js';
27
27
  import FeatureInfoInteraction from './featureInfoInteraction.js';
@@ -390,15 +390,13 @@ class FeatureInfo extends Collection {
390
390
  * @returns {Promise<void>}
391
391
  */
392
392
  async selectFeature(feature, position, windowPosition, featureInfoView) {
393
- check(feature, [
394
- Feature,
395
- Entity,
396
- Cesium3DTileFeature,
397
- Cesium3DTilePointFeature,
398
- ]);
399
- checkMaybe(position, [Number]);
400
- checkMaybe(windowPosition, [Number]);
401
- checkMaybe(featureInfoView, AbstractFeatureInfoView);
393
+ check(
394
+ feature,
395
+ oneOf(Feature, Entity, Cesium3DTileFeature, Cesium3DTilePointFeature),
396
+ );
397
+ check(position, maybe([Number]));
398
+ check(windowPosition, maybe([Number]));
399
+ check(featureInfoView, maybe(AbstractFeatureInfoView));
402
400
 
403
401
  const usedFeatureInfoView =
404
402
  feature[featureInfoViewSymbol] ??
package/src/init.d.ts CHANGED
@@ -18,41 +18,8 @@ export function initAppFromModule(mountTarget: string, configUrl?: string | unde
18
18
  * @returns {Promise<import("@src/vcsUiApp.js").default>}
19
19
  */
20
20
  export function initAppFromAppConfig(mountTarget: string, appUrl: string): Promise<import("@src/vcsUiApp.js").default>;
21
- export namespace VcsUiAppConfigPattern {
22
- let id: (StringConstructor | undefined)[];
23
- let layers: ({
24
- type: StringConstructor;
25
- name: StringConstructor;
26
- }[] | undefined)[];
27
- let maps: ({
28
- type: StringConstructor;
29
- name: StringConstructor;
30
- }[] | undefined)[];
31
- let styles: ({
32
- type: StringConstructor;
33
- name: StringConstructor;
34
- }[] | undefined)[];
35
- let viewpoints: ({
36
- type: StringConstructor;
37
- name: StringConstructor;
38
- }[] | undefined)[];
39
- let startingViewpointName: (StringConstructor | undefined)[];
40
- let startingMapName: (StringConstructor | undefined)[];
41
- let projection: (ObjectConstructor | undefined)[];
42
- let categories: ({
43
- name: StringConstructor;
44
- items: ObjectConstructor[];
45
- }[] | undefined)[];
46
- let obliqueCollections: ({
47
- type: StringConstructor;
48
- name: StringConstructor;
49
- }[] | undefined)[];
50
- let plugins: (ObjectConstructor[] | undefined)[];
51
- let contentTree: (ObjectConstructor[] | undefined)[];
52
- let uiConfig: (ObjectConstructor[] | undefined)[];
53
- let featureInfo: ({
54
- type: StringConstructor;
55
- name: StringConstructor;
56
- }[] | undefined)[];
57
- let i18n: (ObjectConstructor[] | undefined)[];
58
- }
21
+ /**
22
+ * Base pattern to check VcsUiAppConfig
23
+ * @type {Record<string, import("@vcsuite/check").Pattern}
24
+ */
25
+ export const VcsUiAppConfigPattern: Record<string, import("@vcsuite/check").Pattern>;
package/src/init.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { createApp } from 'vue';
2
- import { check, checkMaybe, is } from '@vcsuite/check';
2
+ import { check, is, maybe, oneOf, optional } from '@vcsuite/check';
3
3
  import { VcsModule } from '@vcmap/core';
4
4
  import VcsAppComponentWrapper from './application/VcsAppWrapper.vue';
5
5
  import VcsUiApp from './vcsUiApp.js';
@@ -15,23 +15,24 @@ const VcsObjectPattern = {
15
15
 
16
16
  /**
17
17
  * Base pattern to check VcsUiAppConfig
18
+ * @type {Record<string, import("@vcsuite/check").Pattern}
18
19
  */
19
20
  export const VcsUiAppConfigPattern = {
20
- id: [undefined, String],
21
- layers: [undefined, [VcsObjectPattern]],
22
- maps: [undefined, [VcsObjectPattern]],
23
- styles: [undefined, [VcsObjectPattern]],
24
- viewpoints: [undefined, [VcsObjectPattern]],
25
- startingViewpointName: [undefined, String],
26
- startingMapName: [undefined, String],
27
- projection: [undefined, Object],
28
- categories: [undefined, [{ name: String, items: [Object] }]],
29
- obliqueCollections: [undefined, [VcsObjectPattern]],
30
- plugins: [undefined, [Object]],
31
- contentTree: [undefined, [Object]],
32
- uiConfig: [undefined, [Object]],
33
- featureInfo: [undefined, [VcsObjectPattern]],
34
- i18n: [undefined, [Object]],
21
+ id: optional(String),
22
+ layers: optional([VcsObjectPattern]),
23
+ maps: optional([VcsObjectPattern]),
24
+ styles: optional([VcsObjectPattern]),
25
+ viewpoints: optional([VcsObjectPattern]),
26
+ startingViewpointName: optional(String),
27
+ startingMapName: optional(String),
28
+ projection: optional(Object),
29
+ categories: optional([{ name: String, items: [Object] }]),
30
+ obliqueCollections: optional([VcsObjectPattern]),
31
+ plugins: optional([Object]),
32
+ contentTree: optional([Object]),
33
+ uiConfig: optional([Object]),
34
+ featureInfo: optional([VcsObjectPattern]),
35
+ i18n: optional([Object]),
35
36
  };
36
37
 
37
38
  /**
@@ -62,7 +63,7 @@ export default async function initApp(mountTarget) {
62
63
  */
63
64
  export async function initAppFromModule(mountTarget, configUrl) {
64
65
  check(mountTarget, String);
65
- checkMaybe(configUrl, String);
66
+ check(configUrl, maybe(String));
66
67
 
67
68
  const app = await initApp(mountTarget);
68
69
  if (configUrl) {
@@ -90,7 +91,7 @@ export async function initAppFromAppConfig(mountTarget, appUrl) {
90
91
  */
91
92
  const appConfig = await fetch(appUrl).then((response) => response.json());
92
93
 
93
- check(appConfig.modules, [String, Object]);
94
+ check(appConfig.modules, [oneOf(String, Object)]);
94
95
 
95
96
  const modules = await Promise.all(
96
97
  appConfig.modules.map(async (c) => {
@@ -1,17 +1,13 @@
1
1
  <template>
2
- <v-list density="compact">
3
- <v-row>
2
+ <v-list>
3
+ <v-row no-gutters>
4
4
  <v-col
5
5
  v-for="(row, idx) in item.rows"
6
6
  :key="idx"
7
7
  :cols="cols"
8
8
  :class="{ 'w-100': item.colNr === 1, 'w-50': item.colNr !== 1 }"
9
9
  >
10
- <v-list-item
11
- density="compact"
12
- class="pa-0"
13
- :class="determineInnerPadding(idx)"
14
- >
10
+ <v-list-item class="pa-0" :class="determineInnerPadding(idx)">
15
11
  <template #prepend>
16
12
  <v-img
17
13
  v-if="
@@ -20,7 +16,6 @@
20
16
  "
21
17
  width="32"
22
18
  height="24"
23
- cover
24
19
  :src="getImageSrcFromShape(row.image)"
25
20
  />
26
21
  <svg
@@ -93,7 +88,7 @@
93
88
  </template>
94
89
 
95
90
  <v-list-item-title
96
- class="pt-2"
91
+ class="pa-2"
97
92
  :title="$st(row.tooltip || row.title)"
98
93
  >
99
94
  {{ $st(row.title) }}
@@ -6,51 +6,37 @@
6
6
  v-if="entries.length > 0"
7
7
  class="rounded-0"
8
8
  >
9
- <v-expansion-panel
9
+ <vcs-expansion-panel
10
10
  v-for="(entry, i) in entries"
11
11
  :key="i"
12
- class="px-2"
12
+ :heading="entry.title"
13
+ :header-actions="entry.actions"
13
14
  @group:selected="entry.open = !entry.open"
14
15
  >
15
- <v-expansion-panel-title hide-actions>
16
- <template #default="{ open }">
17
- <div class="d-flex justify-space-between">
18
- <div class="d-flex align-center">
19
- <v-icon class="mr-1" :class="{ rotate: !open }">
20
- mdi-chevron-down
21
- </v-icon>
22
- {{ $st(entry.title) }}
23
- </div>
24
- <VcsActionButtonList :actions="entry.actions" />
16
+ <v-list class="pl-6 pb-2">
17
+ <div v-for="(item, idx) in entry.legend" :key="idx">
18
+ <div v-if="item.type === LegendType.Image">
19
+ <img
20
+ :src="$st(item.src)"
21
+ :alt="item.src"
22
+ class="legend-image"
23
+ :title="item.tooltip"
24
+ />
25
25
  </div>
26
- </template>
27
- </v-expansion-panel-title>
28
- <v-expansion-panel-text class="pl-6 pb-2">
29
- <v-list density="compact">
30
- <div v-for="(item, idx) in entry.legend" :key="idx">
31
- <div v-if="item.type === LegendType.Image">
32
- <img
33
- :src="$st(item.src)"
34
- :alt="item.src"
35
- class="legend-image"
36
- :title="item.tooltip"
37
- />
38
- </div>
39
- <div v-else-if="item.type === LegendType.Iframe">
40
- <iframe
41
- :id="`legendIframe${idx}`"
42
- :src="$st(item.src)"
43
- scrolling="no"
44
- style="width: 100%; height: 100%"
45
- frameBorder="0"
46
- @load="setIframeHeight(`legendIframe${idx}`)"
47
- />
48
- </div>
49
- <style-legend-item v-else :item="item" />
26
+ <div v-else-if="item.type === LegendType.Iframe">
27
+ <iframe
28
+ :id="`legendIframe${idx}`"
29
+ :src="$st(item.src)"
30
+ scrolling="no"
31
+ style="width: 100%; height: 100%"
32
+ frameBorder="0"
33
+ @load="setIframeHeight(`legendIframe${idx}`)"
34
+ />
50
35
  </div>
51
- </v-list>
52
- </v-expansion-panel-text>
53
- </v-expansion-panel>
36
+ <style-legend-item v-else :item="item" />
37
+ </div>
38
+ </v-list>
39
+ </vcs-expansion-panel>
54
40
  </v-expansion-panels>
55
41
  <v-sheet v-else class="ma-2">
56
42
  {{ $t('legend.empty') }}
@@ -59,19 +45,11 @@
59
45
  </template>
60
46
 
61
47
  <script>
62
- import {
63
- VExpansionPanels,
64
- VExpansionPanel,
65
- VExpansionPanelText,
66
- VExpansionPanelTitle,
67
- VIcon,
68
- VList,
69
- VSheet,
70
- } from 'vuetify/components';
48
+ import { VExpansionPanels, VList, VSheet } from 'vuetify/components';
71
49
  import { computed } from 'vue';
72
50
  import { LegendType } from './legendHelper.js';
73
51
  import StyleLegendItem from './StyleLegendItem.vue';
74
- import VcsActionButtonList from '../components/buttons/VcsActionButtonList.vue';
52
+ import VcsExpansionPanel from '../components/section/VcsExpansionPanel.vue';
75
53
 
76
54
  /**
77
55
  * @description A component rendering configured legend information for active layers.
@@ -81,13 +59,9 @@
81
59
  export default {
82
60
  name: 'VcsLegend',
83
61
  components: {
84
- VcsActionButtonList,
62
+ VcsExpansionPanel,
85
63
  StyleLegendItem,
86
64
  VExpansionPanels,
87
- VExpansionPanel,
88
- VExpansionPanelText,
89
- VExpansionPanelTitle,
90
- VIcon,
91
65
  VList,
92
66
  VSheet,
93
67
  },
@@ -1,7 +1,7 @@
1
1
  import { reactive } from 'vue';
2
2
  import { VcsEvent } from '@vcmap/core';
3
3
  import { v4 as uuidv4 } from 'uuid';
4
- import { check, checkMaybe } from '@vcsuite/check';
4
+ import { check, maybe, oneOf } from '@vcsuite/check';
5
5
  import { vcsAppSymbol } from '../pluginHelper.js';
6
6
  import { ActionPattern } from '../components/lists/VcsActionList.vue';
7
7
  import { getActionFromOptions } from '../actions/actionHelper.js';
@@ -101,10 +101,10 @@ class ButtonManager {
101
101
  * @returns {ButtonComponent}
102
102
  */
103
103
  add(buttonComponentOptions, owner) {
104
- checkMaybe(buttonComponentOptions.id, String);
105
- checkMaybe(buttonComponentOptions.weight, Number);
104
+ check(buttonComponentOptions.id, maybe(String));
105
+ check(buttonComponentOptions.weight, maybe(Number));
106
106
  check(buttonComponentOptions.action, ActionPattern);
107
- check(owner, [String, vcsAppSymbol]);
107
+ check(owner, oneOf(String, vcsAppSymbol));
108
108
 
109
109
  if (buttonComponentOptions.id && this.has(buttonComponentOptions.id)) {
110
110
  throw new Error(
@@ -1,39 +1,24 @@
1
1
  <template>
2
- <v-expansion-panel>
3
- <v-expansion-panel-title hide-actions class="px-2">
4
- <div class="d-flex justify-space-between">
5
- <div class="d-flex align-center gc-1">
6
- <v-icon :class="{ rotate: !open }"> mdi-chevron-down </v-icon>
7
- <span>
8
- {{ $st(title) }}
9
- </span>
10
- <span v-if="selectable && selection.length > 0">
11
- {{ `(${selection.length})` }}
12
- </span>
13
- </div>
14
- <VcsActionButtonList
15
- v-if="actions?.length > 0"
16
- :actions="actions"
17
- :overflow-count="overflowCount"
18
- />
19
- </div>
20
- </v-expansion-panel-title>
21
- <v-expansion-panel-text class="pb-1">
2
+ <vcs-expansion-panel
3
+ :heading="title"
4
+ :header-actions="actions"
5
+ :action-button-list-overflow-count="overflowCount"
6
+ >
7
+ <template #header-append>
8
+ <span v-if="selectable && selection.length > 0" class="ml-1">
9
+ {{ `(${selection.length})` }}
10
+ </span>
11
+ </template>
12
+ <template #default>
22
13
  <CollectionComponentContent @openList="(id) => $emit('openList', id)" />
23
- </v-expansion-panel-text>
24
- </v-expansion-panel>
14
+ </template>
15
+ </vcs-expansion-panel>
25
16
  </template>
26
17
 
27
18
  <script>
28
19
  import { computed, inject } from 'vue';
29
- import {
30
- VIcon,
31
- VExpansionPanel,
32
- VExpansionPanelTitle,
33
- VExpansionPanelText,
34
- } from 'vuetify/components';
20
+ import VcsExpansionPanel from '../../components/section/VcsExpansionPanel.vue';
35
21
  import { createSelectionActions } from '../../components/lists/VcsList.vue';
36
- import VcsActionButtonList from '../../components/buttons/VcsActionButtonList.vue';
37
22
  import CollectionComponentContent from './CollectionComponentContent.vue';
38
23
 
39
24
  /**
@@ -51,12 +36,8 @@
51
36
  export default {
52
37
  name: 'CollectionComponent',
53
38
  components: {
39
+ VcsExpansionPanel,
54
40
  CollectionComponentContent,
55
- VcsActionButtonList,
56
- VExpansionPanel,
57
- VExpansionPanelTitle,
58
- VExpansionPanelText,
59
- VIcon,
60
41
  },
61
42
  props: {
62
43
  open: {
@@ -64,6 +45,7 @@
64
45
  default: false,
65
46
  },
66
47
  },
48
+ emits: ['openList'],
67
49
  setup(_props, { emit }) {
68
50
  /**
69
51
  * @type {CollectionComponentClass}
@@ -97,11 +79,4 @@
97
79
  };
98
80
  </script>
99
81
 
100
- <style lang="scss" scoped>
101
- .rotate {
102
- transform: rotate(-90deg);
103
- }
104
- .v-icon {
105
- font-size: 16px;
106
- }
107
- </style>
82
+ <style lang="scss" scoped></style>