@vcmap/ui 6.0.0-rc.7 → 6.0.0-rc.9

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 (147) hide show
  1. package/build/buildHelpers.js +1 -1
  2. package/config/base.config.json +3 -1
  3. package/config/dev.config.json +1 -3
  4. package/config/www.config.json +1 -3
  5. package/dist/assets/{cesium-2afc3568.js → cesium-a21a380a.js} +4672 -4704
  6. package/dist/assets/cesium.js +1 -1
  7. package/dist/assets/{core-3fd82bc2.js → core-ccecb5f4.js} +4953 -4782
  8. package/dist/assets/core.js +1 -1
  9. package/dist/assets/{ol-edf7bfb3.js → ol-3c6b9b5b.js} +12074 -11458
  10. package/dist/assets/ol.js +1 -1
  11. package/dist/assets/ui-8a8aef2a.css +1 -0
  12. package/dist/assets/{ui-c6eb55a5.js → ui-8a8aef2a.js} +6906 -6784
  13. package/dist/assets/ui.js +1 -1
  14. package/dist/assets/vue.js +1 -1
  15. package/dist/assets/{vuetify-c3b6c9b3.css → vuetify-ac50bfc8.css} +1 -1
  16. package/dist/assets/{vuetify-c3b6c9b3.js → vuetify-ac50bfc8.js} +4795 -4779
  17. package/dist/assets/vuetify.js +1 -1
  18. package/index.d.ts +2 -0
  19. package/index.js +1 -0
  20. package/lib/olLib.js +6 -0
  21. package/package.json +4 -4
  22. package/plugins/@vcmap-show-case/list-example/src/ListExample.vue +5 -2
  23. package/plugins/@vcmap-show-case/plugin-editors/src/PluginEditors.vue +3 -4
  24. package/plugins/package.json +19 -3
  25. package/src/actions/StyleSelector.vue +1 -1
  26. package/src/application/VcsApp.vue +29 -1
  27. package/src/application/VcsApp.vue.d.ts +8 -1
  28. package/src/application/VcsAppWrapper.vue +1 -1
  29. package/src/application/VcsAttributions.vue +1 -1
  30. package/src/application/VcsAttributionsFooter.vue +3 -1
  31. package/src/application/VcsContainer.vue.d.ts +8 -1
  32. package/src/application/VcsMainMap.vue +1 -1
  33. package/src/application/VcsMap.vue +1 -0
  34. package/src/application/VcsNavbar.vue +1 -1
  35. package/src/application/VcsPositionDisplay.vue +3 -3
  36. package/src/application/VcsSettings.vue +1 -1
  37. package/src/application/VcsSplashScreen.vue +1 -0
  38. package/src/application/VcsTextPage.vue +1 -1
  39. package/src/application/VcsTextPageFooter.vue +3 -1
  40. package/src/components/buttons/VcsActionButtonList.vue +5 -1
  41. package/src/components/buttons/VcsButton.vue +5 -5
  42. package/src/components/buttons/VcsButton.vue.d.ts +1 -1
  43. package/src/components/buttons/VcsFormButton.vue +4 -4
  44. package/src/components/buttons/VcsFormButton.vue.d.ts +1 -1
  45. package/src/components/buttons/VcsToolButton.vue +4 -4
  46. package/src/components/buttons/VcsToolButton.vue.d.ts +1 -1
  47. package/src/components/composables.d.ts +2 -2
  48. package/src/components/composables.js +3 -5
  49. package/src/components/extent/VcsExtent.vue +1 -1
  50. package/src/components/extent/VcsExtentEditor.vue +1 -0
  51. package/src/components/flight/VcsFlightAnchorsComponent.vue +1 -0
  52. package/src/components/flight/VcsFlightComponent.vue +1 -1
  53. package/src/components/flight/VcsFlightEditor.vue +1 -0
  54. package/src/components/flight/VcsFlightPlayer.vue +1 -1
  55. package/src/components/form-inputs-controls/VcsCheckbox.vue +11 -5
  56. package/src/components/form-inputs-controls/VcsCheckbox.vue.d.ts +10 -1
  57. package/src/components/form-inputs-controls/VcsFileInput.vue +2 -2
  58. package/src/components/form-inputs-controls/VcsFileInput.vue.d.ts +1 -1
  59. package/src/components/form-inputs-controls/VcsSelect.vue +2 -2
  60. package/src/components/form-inputs-controls/VcsSelect.vue.d.ts +1 -1
  61. package/src/components/form-inputs-controls/VcsSlider.vue +2 -2
  62. package/src/components/form-inputs-controls/VcsSlider.vue.d.ts +1 -1
  63. package/src/components/form-inputs-controls/VcsTextArea.vue +2 -2
  64. package/src/components/form-inputs-controls/VcsTextArea.vue.d.ts +1 -1
  65. package/src/components/form-inputs-controls/VcsTextField.vue +3 -3
  66. package/src/components/form-inputs-controls/VcsTextField.vue.d.ts +1 -1
  67. package/src/components/form-inputs-controls/VcsWizard.vue +3 -3
  68. package/src/components/form-inputs-controls/VcsWizard.vue.d.ts +1 -1
  69. package/src/components/form-inputs-controls/VcsWizardStep.vue +3 -2
  70. package/src/components/form-inputs-controls/VcsWizardStep.vue.d.ts +1 -1
  71. package/src/components/form-output/VcsMarkdown.vue +1 -1
  72. package/src/components/import/VcsFileDrop.vue +1 -1
  73. package/src/components/import/VcsImportComponent.vue +1 -1
  74. package/src/components/lists/VcsList.vue +14 -10
  75. package/src/components/lists/VcsListItemComponent.vue +18 -12
  76. package/src/components/lists/VcsListItemComponent.vue.d.ts +9 -5
  77. package/src/components/lists/VcsTreeview.vue +2 -2
  78. package/src/components/lists/VcsTreeview.vue.d.ts +1 -1
  79. package/src/components/lists/VcsTreeviewSearchbar.vue +1 -1
  80. package/src/components/lists/VcsTreeviewTitle.vue +1 -1
  81. package/src/components/notification/VcsBadge.vue +2 -2
  82. package/src/components/notification/VcsHelp.vue +1 -1
  83. package/src/components/plugins/AbstractConfigEditor.vue +1 -1
  84. package/src/components/section/VcsExpansionPanel.vue +5 -1
  85. package/src/components/style/MenuWrapper.vue +1 -1
  86. package/src/components/style/VcsFeatureStyleComponent.vue +1 -0
  87. package/src/components/style/VcsFillMenu.vue +1 -0
  88. package/src/components/style/VcsFillSelector.vue +1 -0
  89. package/src/components/style/VcsImageMenu.vue +1 -0
  90. package/src/components/style/VcsImageSelector.vue +1 -1
  91. package/src/components/style/VcsStrokeMenu.vue +1 -0
  92. package/src/components/style/VcsStrokeSelector.vue +1 -1
  93. package/src/components/style/VcsTextMenu.vue +1 -0
  94. package/src/components/style/VcsTextSelector.vue +1 -1
  95. package/src/components/style/VcsVectorStyleComponent.vue +1 -1
  96. package/src/components/tables/VcsDataTable.vue +3 -3
  97. package/src/components/tables/VcsDataTable.vue.d.ts +1 -1
  98. package/src/components/tables/VcsTable.vue +1 -0
  99. package/src/components/tables/VcsTableCell.vue +1 -1
  100. package/src/components/vector-properties/VcsFeatureEditingWindow.vue +1 -1
  101. package/src/components/vector-properties/VcsFeatureTransforms.vue +1 -1
  102. package/src/components/vector-properties/VcsVectorPropertiesComponent.vue +1 -0
  103. package/src/components/viewpoint/VcsViewpointComponent.vue +1 -1
  104. package/src/components/viewpoint/VcsViewpointEditor.vue +1 -0
  105. package/src/contentTree/LayerTree.vue +1 -1
  106. package/src/contentTree/obliqueCollectionContentTreeItem.js +6 -1
  107. package/src/featureInfo/AddressBalloonComponent.vue +1 -1
  108. package/src/featureInfo/BalloonComponent.vue +1 -1
  109. package/src/featureInfo/IframeComponent.vue +6 -1
  110. package/src/featureInfo/MarkdownBalloonComponent.vue +1 -1
  111. package/src/featureInfo/abstractFeatureInfoView.js +3 -2
  112. package/src/i18n/de.d.ts +35 -30
  113. package/src/i18n/de.js +5 -0
  114. package/src/i18n/en.d.ts +35 -30
  115. package/src/i18n/en.js +5 -0
  116. package/src/legend/StyleLegendItem.vue +1 -1
  117. package/src/legend/VcsLegend.vue +1 -1
  118. package/src/manager/collectionManager/CollectionComponent.vue +1 -0
  119. package/src/manager/collectionManager/collectionComponentClass.js +5 -1
  120. package/src/manager/contextMenu/ContextMenuComponent.vue +1 -1
  121. package/src/manager/panel/PanelManagerComponent.vue +2 -2
  122. package/src/manager/toolbox/GroupToolboxComponent.vue +2 -2
  123. package/src/manager/toolbox/SelectToolboxComponent.vue +2 -2
  124. package/src/manager/toolbox/ToolboxManagerComponent.vue +13 -2
  125. package/src/manager/window/WindowComponent.vue +1 -1
  126. package/src/manager/window/WindowManager.vue +4 -1
  127. package/src/manager/window/windowManager.d.ts +59 -3
  128. package/src/manager/window/windowManager.js +23 -2
  129. package/src/navigation/MapNavigation.vue +4 -1
  130. package/src/navigation/ObliqueRotation.vue +2 -2
  131. package/src/navigation/OrientationToolsButton.vue +1 -1
  132. package/src/navigation/TiltSlider.vue +1 -0
  133. package/src/navigation/VcsCompass.vue +1 -1
  134. package/src/navigation/VcsZoomButton.vue +1 -1
  135. package/src/notifier/NotifierComponent.vue +1 -1
  136. package/src/obliqueFallbackWarnings.d.ts +5 -0
  137. package/src/obliqueFallbackWarnings.js +54 -0
  138. package/src/search/ResultItem.vue +1 -1
  139. package/src/search/ResultsComponent.vue +1 -1
  140. package/src/search/SearchComponent.vue +3 -1
  141. package/src/uiConfig.d.ts +16 -4
  142. package/src/uiConfig.js +3 -2
  143. package/src/vcsUiApp.d.ts +43 -17
  144. package/src/vcsUiApp.js +17 -11
  145. package/src/vuePlugins/i18n.js +1 -0
  146. package/dist/assets/ui-c6eb55a5.css +0 -1
  147. /package/dist/assets/{vue-aefad438.js → vue-bcc58dd1.js} +0 -0
@@ -1,5 +1,8 @@
1
1
  <template>
2
- <div :class="{ 'win-container-mobile': addMobileClass }">
2
+ <div
3
+ :class="{ 'win-container-mobile': addMobileClass }"
4
+ class="window-manager"
5
+ >
3
6
  <WindowComponent
4
7
  v-for="id in componentIds"
5
8
  :key="id"
@@ -17,7 +17,7 @@ export function isSlotPosition(windowPosition: WindowPosition): boolean;
17
17
  * parentId?: string,
18
18
  * component: import("vue").Component<T>,
19
19
  * headerComponent?: import("vue").Component<T>,
20
- * state? : Partial<WindowState>,
20
+ * state? : WindowStateOptions,
21
21
  * position? : Partial<WindowPositionOptions>,
22
22
  * slot?: WindowSlot,
23
23
  * props?: T,
@@ -28,16 +28,34 @@ export function isSlotPosition(windowPosition: WindowPosition): boolean;
28
28
  * @property {string} [parentId] An optional ID of a parent window for 'dynamicChild' slot. Parent windows with slot dynamicRight are not supported.
29
29
  * @property {import("vue").Component<T, unknown, unknown>} component Main Component which is shown below the header.
30
30
  * @property {import("vue").Component<T, unknown, unknown>} [headerComponent] Replaces the Header Component.
31
- * @property {Partial<WindowState>} [state]
31
+ * @property {WindowStateOptions} [state]
32
32
  * @property {Partial<WindowPositionOptions>} [position] Will be merged with default position for slot
33
33
  * @property {WindowSlot} [slot]
34
34
  * @property {T} [props]
35
35
  * @property {Object} [provides]
36
36
  */
37
+ /**
38
+ * @typedef {T|import('vue').Ref<T>|import('vue').ComputedRef<T>} OptionsOrRef
39
+ * @template T
40
+ */
41
+ /**
42
+ * @typedef {Object} WindowStateOptions
43
+ * @property {OptionsOrRef<boolean>} [hideHeader] be used to not show the header.
44
+ * @property {OptionsOrRef<boolean>} [hidePin] be used to not show the pin button.
45
+ * @property {OptionsOrRef<string|string[]>} [headerTitle] An optional translatable header. If an array is provided all elements are translated and joined afterward.
46
+ * @property {OptionsOrRef<string>} [headerIcon]
47
+ * @property {OptionsOrRef<Array<import("../../actions/actionHelper.js").VcsAction>>} [headerActions]
48
+ * @property {OptionsOrRef<number>} [headerActionsOverflow]
49
+ * @property {OptionsOrRef<string>} [infoUrl] An optional url referencing help or further information on the window's content.
50
+ * @property {OptionsOrRef<function():string>} [infoUrlCallback] An optional function returning an url referencing help or further information. Can be used for urls depending on the app's locale, e.g. app.getHelpUrl()
51
+ * @property {Record<string, string>} [styles] Can be used to add additional styles to the root WindowComponent. Use Vue Style Bindings Object Syntax https://vuejs.org/v2/guide/class-and-style.html
52
+ * @property {Array<string>|Record<string,string>} [classes] Can be used to add additional classes to the root WindowComponent. Use Vue Class Bindings Syntax https://vuejs.org/v2/guide/class-and-style.html
53
+ */
37
54
  /**
38
55
  * @typedef {Object} WindowState
39
56
  * @property {string} id
40
57
  * @property {string|vcsAppSymbol} owner Owner of the window, set by windowManager on add
58
+ * @property {string|undefined} parentId - the parent of this window
41
59
  * @property {boolean} [hideHeader] be used to not show the header.
42
60
  * @property {boolean} [hidePin] be used to not show the pin button.
43
61
  * @property {string|string[]} [headerTitle] An optional translatable header. If an array is provided all elements are translated and joined afterward.
@@ -134,18 +152,56 @@ export type WindowComponentOptions<T = any> = {
134
152
  parentId?: string;
135
153
  component: import("vue").Component<T>;
136
154
  headerComponent?: import("vue").Component<T>;
137
- state?: Partial<WindowState>;
155
+ state?: WindowStateOptions;
138
156
  position?: Partial<WindowPositionOptions>;
139
157
  slot?: WindowSlot;
140
158
  props?: T;
141
159
  provides?: Record<string, unknown>;
142
160
  };
161
+ export type OptionsOrRef<T> = T | import('vue').Ref<T> | import('vue').ComputedRef<T>;
162
+ export type WindowStateOptions = {
163
+ /**
164
+ * be used to not show the header.
165
+ */
166
+ hideHeader?: OptionsOrRef<boolean> | undefined;
167
+ /**
168
+ * be used to not show the pin button.
169
+ */
170
+ hidePin?: OptionsOrRef<boolean> | undefined;
171
+ /**
172
+ * An optional translatable header. If an array is provided all elements are translated and joined afterward.
173
+ */
174
+ headerTitle?: OptionsOrRef<string | string[]> | undefined;
175
+ headerIcon?: OptionsOrRef<string> | undefined;
176
+ headerActions?: OptionsOrRef<import("../../actions/actionHelper.js").VcsAction[]> | undefined;
177
+ headerActionsOverflow?: OptionsOrRef<number> | undefined;
178
+ /**
179
+ * An optional url referencing help or further information on the window's content.
180
+ */
181
+ infoUrl?: OptionsOrRef<string> | undefined;
182
+ /**
183
+ * An optional function returning an url referencing help or further information. Can be used for urls depending on the app's locale, e.g. app.getHelpUrl()
184
+ */
185
+ infoUrlCallback?: OptionsOrRef<() => string> | undefined;
186
+ /**
187
+ * Can be used to add additional styles to the root WindowComponent. Use Vue Style Bindings Object Syntax https://vuejs.org/v2/guide/class-and-style.html
188
+ */
189
+ styles?: Record<string, string> | undefined;
190
+ /**
191
+ * Can be used to add additional classes to the root WindowComponent. Use Vue Class Bindings Syntax https://vuejs.org/v2/guide/class-and-style.html
192
+ */
193
+ classes?: string[] | Record<string, string> | undefined;
194
+ };
143
195
  export type WindowState = {
144
196
  id: string;
145
197
  /**
146
198
  * Owner of the window, set by windowManager on add
147
199
  */
148
200
  owner: string | symbol;
201
+ /**
202
+ * - the parent of this window
203
+ */
204
+ parentId: string | undefined;
149
205
  /**
150
206
  * be used to not show the header.
151
207
  */
@@ -107,7 +107,7 @@ export function isSlotPosition(windowPosition) {
107
107
  * parentId?: string,
108
108
  * component: import("vue").Component<T>,
109
109
  * headerComponent?: import("vue").Component<T>,
110
- * state? : Partial<WindowState>,
110
+ * state? : WindowStateOptions,
111
111
  * position? : Partial<WindowPositionOptions>,
112
112
  * slot?: WindowSlot,
113
113
  * props?: T,
@@ -118,17 +118,37 @@ export function isSlotPosition(windowPosition) {
118
118
  * @property {string} [parentId] An optional ID of a parent window for 'dynamicChild' slot. Parent windows with slot dynamicRight are not supported.
119
119
  * @property {import("vue").Component<T, unknown, unknown>} component Main Component which is shown below the header.
120
120
  * @property {import("vue").Component<T, unknown, unknown>} [headerComponent] Replaces the Header Component.
121
- * @property {Partial<WindowState>} [state]
121
+ * @property {WindowStateOptions} [state]
122
122
  * @property {Partial<WindowPositionOptions>} [position] Will be merged with default position for slot
123
123
  * @property {WindowSlot} [slot]
124
124
  * @property {T} [props]
125
125
  * @property {Object} [provides]
126
126
  */
127
127
 
128
+ /**
129
+ * @typedef {T|import('vue').Ref<T>|import('vue').ComputedRef<T>} OptionsOrRef
130
+ * @template T
131
+ */
132
+
133
+ /**
134
+ * @typedef {Object} WindowStateOptions
135
+ * @property {OptionsOrRef<boolean>} [hideHeader] be used to not show the header.
136
+ * @property {OptionsOrRef<boolean>} [hidePin] be used to not show the pin button.
137
+ * @property {OptionsOrRef<string|string[]>} [headerTitle] An optional translatable header. If an array is provided all elements are translated and joined afterward.
138
+ * @property {OptionsOrRef<string>} [headerIcon]
139
+ * @property {OptionsOrRef<Array<import("../../actions/actionHelper.js").VcsAction>>} [headerActions]
140
+ * @property {OptionsOrRef<number>} [headerActionsOverflow]
141
+ * @property {OptionsOrRef<string>} [infoUrl] An optional url referencing help or further information on the window's content.
142
+ * @property {OptionsOrRef<function():string>} [infoUrlCallback] An optional function returning an url referencing help or further information. Can be used for urls depending on the app's locale, e.g. app.getHelpUrl()
143
+ * @property {Record<string, string>} [styles] Can be used to add additional styles to the root WindowComponent. Use Vue Style Bindings Object Syntax https://vuejs.org/v2/guide/class-and-style.html
144
+ * @property {Array<string>|Record<string,string>} [classes] Can be used to add additional classes to the root WindowComponent. Use Vue Class Bindings Syntax https://vuejs.org/v2/guide/class-and-style.html
145
+ */
146
+
128
147
  /**
129
148
  * @typedef {Object} WindowState
130
149
  * @property {string} id
131
150
  * @property {string|vcsAppSymbol} owner Owner of the window, set by windowManager on add
151
+ * @property {string|undefined} parentId - the parent of this window
132
152
  * @property {boolean} [hideHeader] be used to not show the header.
133
153
  * @property {boolean} [hidePin] be used to not show the pin button.
134
154
  * @property {string|string[]} [headerTitle] An optional translatable header. If an array is provided all elements are translated and joined afterward.
@@ -599,6 +619,7 @@ class WindowManager {
599
619
  ? [...(windowComponentOptions?.state?.classes ?? [])]
600
620
  : { ...windowComponentOptions?.state?.classes };
601
621
 
622
+ /** @type {WindowState} */
602
623
  const state = reactive({
603
624
  id,
604
625
  parentId,
@@ -1,5 +1,8 @@
1
1
  <template>
2
- <v-container :class="xs ? 'nav-container mobile' : 'nav-container'">
2
+ <v-container
3
+ :class="xs ? 'nav-container mobile' : 'nav-container'"
4
+ class="map-navigation"
5
+ >
3
6
  <v-row>
4
7
  <VcsCompass
5
8
  :view-mode="viewMode"
@@ -1,5 +1,5 @@
1
1
  <template>
2
- <div class="d-inline-flex rounded vcs-oblique-orientation">
2
+ <div class="d-inline-flex rounded oblique-orientation">
3
3
  <div class="d-inline-flex rounded inner">
4
4
  <OrientationToolsButton
5
5
  @click="input(-90)"
@@ -56,7 +56,7 @@
56
56
  </script>
57
57
 
58
58
  <style lang="scss" scoped>
59
- .vcs-oblique-orientation {
59
+ .oblique-orientation {
60
60
  box-shadow: rgba(0, 0, 0, 0.15) 0 2px 2px 0;
61
61
  .inner {
62
62
  box-shadow: rgba(0, 0, 0, 0.25) 0 -2px 2px 0 inset;
@@ -1,6 +1,6 @@
1
1
  <template>
2
2
  <v-card
3
- class="d-flex align-center justify-center text-center btn-orientation-tools"
3
+ class="d-flex align-center justify-center text-center btn-orientation-tools orientation-tools-button"
4
4
  v-bind="{ ...$attrs }"
5
5
  :height="height"
6
6
  :width="width"
@@ -1,5 +1,6 @@
1
1
  <template>
2
2
  <v-card
3
+ class="tilt-slider"
3
4
  :width="minWidth"
4
5
  :height="minHeight"
5
6
  v-bind="props"
@@ -4,7 +4,7 @@
4
4
  transform: `rotate(${compassRotation}deg)`,
5
5
  }"
6
6
  @click="$emit('update:modelValue', 0)"
7
- class="d-flex flex-column justify-center align-center position-relative rounded-circle user-select-none transition-transform-200-ease"
7
+ class="d-flex flex-column justify-center align-center position-relative rounded-circle user-select-none transition-transform-200-ease vcs-compass"
8
8
  elevation="1"
9
9
  :height="height"
10
10
  :width="width"
@@ -1,5 +1,5 @@
1
1
  <template>
2
- <div class="rounded vcs-navigation-zoom">
2
+ <div class="rounded vcs-navigation-zoom vcs-zoom-button">
3
3
  <div class="rounded inner">
4
4
  <OrientationToolsButton
5
5
  @click="$emit('zoom-in')"
@@ -1,5 +1,5 @@
1
1
  <template>
2
- <div>
2
+ <div class="notifier-component">
3
3
  <v-snackbar
4
4
  v-for="notification in notifications"
5
5
  :key="notification.id"
@@ -0,0 +1,5 @@
1
+ /**
2
+ * @param {import("./vcsUiApp.js").default} app
3
+ * @returns {() => void}
4
+ */
5
+ export default function createObliqueFallbackWarnings(app: import("./vcsUiApp.js").default): () => void;
@@ -0,0 +1,54 @@
1
+ import { ObliqueMap } from '@vcmap/core';
2
+ import { NotificationType } from './notifier/notifier.js';
3
+
4
+ function createNotification(app) {
5
+ app.notifier.add({
6
+ title: 'navigation.obliqueFallback.title',
7
+ type: NotificationType.WARNING,
8
+ message: 'navigation.obliqueFallback.message',
9
+ });
10
+ }
11
+
12
+ /**
13
+ * @param {import("./vcsUiApp.js").default} app
14
+ * @returns {() => void}
15
+ */
16
+ export default function createObliqueFallbackWarnings(app) {
17
+ const fallbackMapEventListener =
18
+ app.maps.fallbackMapActivated.addEventListener(() => {
19
+ createNotification(app);
20
+ });
21
+
22
+ const mapListeners = new Map();
23
+ const setMapListener = (map) => {
24
+ mapListeners.set(
25
+ map,
26
+ map.failedToSetCollection.addEventListener(() => {
27
+ createNotification(app);
28
+ }),
29
+ );
30
+ };
31
+
32
+ app.maps.getByType(ObliqueMap.className).forEach(setMapListener);
33
+
34
+ const mapAddedListener = app.maps.added.addEventListener((map) => {
35
+ if (map instanceof ObliqueMap) {
36
+ setMapListener(map);
37
+ }
38
+ });
39
+
40
+ const mapRemovedListener = app.maps.removed.addEventListener((map) => {
41
+ mapListeners.get(map)?.();
42
+ mapListeners.delete(map);
43
+ });
44
+
45
+ return () => {
46
+ fallbackMapEventListener();
47
+ mapAddedListener();
48
+ mapRemovedListener();
49
+ [...mapListeners.values()].forEach((cb) => {
50
+ cb();
51
+ });
52
+ mapListeners.clear();
53
+ };
54
+ }
@@ -1,5 +1,5 @@
1
1
  <template>
2
- <v-list-item v-if="item" v-bind="$attrs">
2
+ <v-list-item v-if="item" v-bind="$attrs" class="result-item">
3
3
  <template #prepend v-if="item.icon">
4
4
  <v-icon>
5
5
  {{ item.icon }}
@@ -1,6 +1,6 @@
1
1
  <template>
2
2
  <v-list
3
- class="ma-0 overflow-y-auto vcs-search-results"
3
+ class="ma-0 overflow-y-auto vcs-search-results results-component"
4
4
  v-model:selected="highlighted"
5
5
  >
6
6
  <ResultItem
@@ -1,6 +1,8 @@
1
1
  <template>
2
2
  <v-sheet>
3
- <span class="d-flex justify-space-between align-center mt-1 ml-2">
3
+ <span
4
+ class="d-flex justify-space-between align-center mt-1 ml-2 search-component"
5
+ >
4
6
  <v-icon class="pa-1" :size="searchIconSize"> $vcsSearch </v-icon>
5
7
  <VcsTextField
6
8
  class="d-inline-block user-select-none w-100 mx-1"
package/src/uiConfig.d.ts CHANGED
@@ -137,9 +137,13 @@ export type UiConfigObject = {
137
137
  */
138
138
  displayQuality?: import("@vcmap/core").DisplayQualityOptions | undefined;
139
139
  /**
140
- * - Vuetify Theming, also see vuetify configuration https://vuetifyjs.com/en/features/theme/
140
+ * - Vuetify Theming, also see vuetify configuraton https://vuetifyjs.com/en/features/theme/
141
141
  */
142
142
  vuetifyTheme?: any;
143
+ /**
144
+ * - open the legend window, if new layer has a config
145
+ */
146
+ openLegendOnAdd?: boolean | undefined;
143
147
  };
144
148
  /**
145
149
  * @typedef {{
@@ -206,7 +210,8 @@ export type UiConfigObject = {
206
210
  * @property {boolean} [hideSettings] - can be used to hide the settings Window
207
211
  * @property {boolean} [overviewMapActiveOnStartup] - can be used to activate the overviewMap on startup
208
212
  * @property {import("@vcmap/core").DisplayQualityOptions} [displayQuality] - the display quality settings
209
- * @property {import("./vuetifyPlugins/vuetify.js").VcsThemes} [vuetifyTheme] - Vuetify Theming, also see vuetify configuration https://vuetifyjs.com/en/features/theme/
213
+ * @property {import("./vuetifyPlugins/vuetify.js").VcsThemes} [vuetifyTheme] - Vuetify Theming, also see vuetify configuraton https://vuetifyjs.com/en/features/theme/
214
+ * @property {boolean} [openLegendOnAdd] - open the legend window, if new layer has a config
210
215
  */
211
216
  /**
212
217
  * @extends {Collection<UiConfigurationItem<unknown>>}
@@ -233,7 +238,7 @@ declare class UiConfig extends Collection<UiConfigurationItem<unknown>> {
233
238
  */
234
239
  private _listeners;
235
240
  /**
236
- * @type {import("vue").DeepReadonly<import("vue").UnwrapNestedRefs<Object<string, *> & UiConfigObject>>}
241
+ * @type {import("vue").DeepReadonly<import("vue").UnwrapNestedRefs<Record<string, *> & UiConfigObject>>}
237
242
  */
238
243
  get config(): {
239
244
  readonly [x: string]: any;
@@ -451,6 +456,7 @@ declare class UiConfig extends Collection<UiConfigurationItem<unknown>> {
451
456
  readonly fogScreenSpaceErrorFactor?: number | undefined;
452
457
  readonly resolutionScale?: number | undefined;
453
458
  readonly layerSSEFactor?: number | undefined;
459
+ readonly msaa?: 1 | 2 | 4 | 8 | undefined;
454
460
  } | undefined;
455
461
  readonly medium?: {
456
462
  readonly sse?: number | undefined;
@@ -460,6 +466,7 @@ declare class UiConfig extends Collection<UiConfigurationItem<unknown>> {
460
466
  readonly fogScreenSpaceErrorFactor?: number | undefined;
461
467
  readonly resolutionScale?: number | undefined;
462
468
  readonly layerSSEFactor?: number | undefined;
469
+ readonly msaa?: 1 | 2 | 4 | 8 | undefined;
463
470
  } | undefined;
464
471
  readonly high?: {
465
472
  readonly sse?: number | undefined;
@@ -469,12 +476,17 @@ declare class UiConfig extends Collection<UiConfigurationItem<unknown>> {
469
476
  readonly fogScreenSpaceErrorFactor?: number | undefined;
470
477
  readonly resolutionScale?: number | undefined;
471
478
  readonly layerSSEFactor?: number | undefined;
479
+ readonly msaa?: 1 | 2 | 4 | 8 | undefined;
472
480
  } | undefined;
473
481
  } | undefined;
474
482
  /**
475
- * - Vuetify Theming, also see vuetify configuration https://vuetifyjs.com/en/features/theme/
483
+ * - Vuetify Theming, also see vuetify configuraton https://vuetifyjs.com/en/features/theme/
476
484
  */
477
485
  readonly vuetifyTheme?: any;
486
+ /**
487
+ * - open the legend window, if new layer has a config
488
+ */
489
+ readonly openLegendOnAdd?: boolean | undefined;
478
490
  };
479
491
  }
480
492
  import { Collection } from '@vcmap/core';
package/src/uiConfig.js CHANGED
@@ -70,7 +70,8 @@ import { reactive, readonly } from 'vue';
70
70
  * @property {boolean} [hideSettings] - can be used to hide the settings Window
71
71
  * @property {boolean} [overviewMapActiveOnStartup] - can be used to activate the overviewMap on startup
72
72
  * @property {import("@vcmap/core").DisplayQualityOptions} [displayQuality] - the display quality settings
73
- * @property {import("./vuetifyPlugins/vuetify.js").VcsThemes} [vuetifyTheme] - Vuetify Theming, also see vuetify configuration https://vuetifyjs.com/en/features/theme/
73
+ * @property {import("./vuetifyPlugins/vuetify.js").VcsThemes} [vuetifyTheme] - Vuetify Theming, also see vuetify configuraton https://vuetifyjs.com/en/features/theme/
74
+ * @property {boolean} [openLegendOnAdd] - open the legend window, if new layer has a config
74
75
  */
75
76
 
76
77
  /**
@@ -117,7 +118,7 @@ class UiConfig extends Collection {
117
118
  }
118
119
 
119
120
  /**
120
- * @type {import("vue").DeepReadonly<import("vue").UnwrapNestedRefs<Object<string, *> & UiConfigObject>>}
121
+ * @type {import("vue").DeepReadonly<import("vue").UnwrapNestedRefs<Record<string, *> & UiConfigObject>>}
121
122
  */
122
123
  get config() {
123
124
  return this._readonlyConfig;
package/src/vcsUiApp.d.ts CHANGED
@@ -70,20 +70,21 @@ declare class VcsUiApp extends VcsApp {
70
70
  */
71
71
  themeChanged: VcsEvent<void>;
72
72
  /**
73
- * @type {import("@vcmap/core").OverrideCollection<VcsPlugin, Collection<VcsPlugin>, Object>}
73
+ * @type {import("@vcmap/core").OverrideCollection<VcsPlugin<Object, Object>, Collection<VcsPlugin<Object, Object>>, Object>}
74
74
  * @private
75
75
  */
76
76
  private _plugins;
77
77
  /**
78
- * @type {Array<function():void>}
78
+ * I18n Collection adds plugin listener first, so the plugin i18n data is available on plugin initialize
79
+ * @type {I18nCollection<Object>}
79
80
  * @private
80
81
  */
81
- private _pluginListeners;
82
+ private _i18n;
82
83
  /**
83
- * @type {I18nCollection<Object>}
84
+ * @type {Array<function():void>}
84
85
  * @private
85
86
  */
86
- private _i18n;
87
+ private _pluginListeners;
87
88
  /**
88
89
  *
89
90
  * @type {import("vue-i18n").I18n}
@@ -194,10 +195,11 @@ declare class VcsUiApp extends VcsApp {
194
195
  */
195
196
  mounted: import("@vcmap/core").VcsEvent<string>;
196
197
  _destroySiteConfig: () => void;
198
+ _destroyObliqueFallback: () => void;
197
199
  /**
198
- * @type {import("@vcmap/core").OverrideCollection<VcsPlugin, Collection<VcsPlugin>, Object>}
200
+ * @type {import("@vcmap/core").OverrideCollection<VcsPlugin<Object, Object>, Collection<VcsPlugin<Object, Object>>, Object>}
199
201
  */
200
- get plugins(): import("@vcmap/core").OverrideCollection<any, Collection<any>, Object>;
202
+ get plugins(): import("@vcmap/core").OverrideCollection<VcsPlugin<Object, Object>, Collection<VcsPlugin<Object, Object>>, Object>;
201
203
  /**
202
204
  * @type {import("@vcmap/core").OverrideCollection<ContentTreeItem, ContentTreeCollection>}
203
205
  */
@@ -253,10 +255,6 @@ declare class VcsUiApp extends VcsApp {
253
255
  install: (app: import("vue").App<any>) => void;
254
256
  defaults: import("vue").Ref<import("vuetify").DefaultsInstance>;
255
257
  display: import("vuetify").DisplayInstance;
256
- /**
257
- * @type {NavbarManager}
258
- * @private
259
- */
260
258
  theme: import("vuetify").ThemeInstance & {
261
259
  install: (app: import("vue").App<any>) => void;
262
260
  };
@@ -284,17 +282,39 @@ declare class VcsUiApp extends VcsApp {
284
282
  formats?: any;
285
283
  }) => import("vuetify").DateInstance) | import("vuetify").DateInstance;
286
284
  formats?: Record<string, any> | undefined;
287
- locale: Record<string, any>;
285
+ locale: Record<string, any>; /**
286
+ * Interface for VcsPlugins.
287
+ * The function implementing the interface should not throw!
288
+ * @typedef {{
289
+ * name: string,
290
+ * version: string,
291
+ * mapVersion: string,
292
+ * i18n?: Object<string, unknown>,
293
+ * initialize?: function(import("@src/vcsUiApp.js").default, S=):void|Promise<void>,
294
+ * onVcsAppMounted?: function(import("@src/vcsUiApp.js").default):void,
295
+ * toJSON?: function(): C,
296
+ * getDefaultOptions?: function(): C,
297
+ * getState?: function(boolean=):S|Promise<S>,
298
+ * getConfigEditors?: function():Array<PluginConfigEditor<object>>,
299
+ * destroy?: function(): void
300
+ * }} VcsPlugin
301
+ * @template {Object} C - plugin config
302
+ * @template {Object} S - plugin state
303
+ * @property {Object<string, *>} [i18n] - the i18n messages of this plugin
304
+ * @property {function(import("@src/vcsUiApp.js").default, S=)} initialize - called on plugin added. Is passed the VcsUiApp and optionally, the state for the plugin
305
+ * @property {function(import("@src/vcsUiApp.js").default)} onVcsAppMounted - called on mounted of VcsApp.vue
306
+ * @property {function():C} [toJSON] - should return the plugin's serialization excluding all default values
307
+ * @property {function():C} [getDefaultOptions] - should return the plugin's default options
308
+ * @property {function(boolean=):S|Promise<S>} [getState] - should return the plugin's state or a promise for said state. is passed a "for url" flag. If true, only the state relevant for sharing a URL should be passed and short keys shall be used
309
+ * @property {Array<PluginConfigEditor>} [getConfigEditors] - should return components for configuring the plugin or custom items defined by the plugin
310
+ * @api
311
+ */
288
312
  };
289
313
  instance: {
290
314
  locale?: any;
291
315
  date: (value?: any) => unknown;
292
316
  format: (date: unknown, formatString: string) => string;
293
317
  toJsDate: (value: unknown) => Date;
294
- /**
295
- * @type {OverviewMap}
296
- * @private
297
- */
298
318
  parseISO: (date: string) => unknown;
299
319
  toISO: (date: unknown) => string;
300
320
  startOfDay: (date: unknown) => unknown;
@@ -303,6 +323,10 @@ declare class VcsUiApp extends VcsApp {
303
323
  endOfWeek: (date: unknown) => unknown;
304
324
  startOfMonth: (date: unknown) => unknown;
305
325
  endOfMonth: (date: unknown) => unknown;
326
+ /**
327
+ * @type {ContextMenuManager}
328
+ * @private
329
+ */
306
330
  startOfYear: (date: unknown) => unknown;
307
331
  endOfYear: (date: unknown) => unknown;
308
332
  isAfter: (date: unknown, comparing: unknown) => boolean;
@@ -324,7 +348,9 @@ declare class VcsUiApp extends VcsApp {
324
348
  getDiff: (date: unknown, comparing: unknown, unit?: string | undefined) => number;
325
349
  getWeekArray: (date: unknown, firstDayOfWeek?: string | number | undefined) => unknown[][];
326
350
  getWeekdays: (firstDayOfWeek?: string | number | undefined) => string[];
327
- getMonth: (date: unknown) => number;
351
+ getMonth: (date: unknown) => number; /**
352
+ * @type {import("@vcmap/core").OverrideClassRegistry<typeof AbstractFeatureInfoView>}
353
+ */
328
354
  setMonth: (date: unknown, month: number) => unknown;
329
355
  getDate: (date: unknown) => number;
330
356
  setDate: (date: unknown, day: number) => unknown;
package/src/vcsUiApp.js CHANGED
@@ -45,6 +45,7 @@ import { createVueI18n, setupI18n } from './vuePlugins/i18n.js';
45
45
  import { callbackClassRegistry } from './callback/vcsCallback.js';
46
46
  import createSiteConfig from './siteConfig.js';
47
47
  import { createVcsVuetify } from './vuePlugins/vuetify.js';
48
+ import createObliqueFallbackWarnings from './obliqueFallbackWarnings.js';
48
49
 
49
50
  /**
50
51
  * @typedef {import("@vcmap/core").VcsModuleConfig & {
@@ -170,7 +171,7 @@ class VcsUiApp extends VcsApp {
170
171
  */
171
172
  this.themeChanged = new VcsEvent();
172
173
  /**
173
- * @type {import("@vcmap/core").OverrideCollection<VcsPlugin, Collection<VcsPlugin>, Object>}
174
+ * @type {import("@vcmap/core").OverrideCollection<VcsPlugin<Object, Object>, Collection<VcsPlugin<Object, Object>>, Object>}
174
175
  * @private
175
176
  */
176
177
  this._plugins = makeOverrideCollection(
@@ -179,6 +180,17 @@ class VcsUiApp extends VcsApp {
179
180
  serializePlugin,
180
181
  deserializePlugin,
181
182
  );
183
+
184
+ /**
185
+ * I18n Collection adds plugin listener first, so the plugin i18n data is available on plugin initialize
186
+ * @type {I18nCollection<Object>}
187
+ * @private
188
+ */
189
+ this._i18n = makeOverrideCollection(
190
+ new I18nCollection(this._plugins),
191
+ () => this.dynamicModuleId,
192
+ );
193
+
182
194
  /**
183
195
  * @type {Array<function():void>}
184
196
  * @private
@@ -222,15 +234,6 @@ class VcsUiApp extends VcsApp {
222
234
  }),
223
235
  ];
224
236
 
225
- /**
226
- * @type {I18nCollection<Object>}
227
- * @private
228
- */
229
- this._i18n = makeOverrideCollection(
230
- new I18nCollection(this._plugins),
231
- () => this.dynamicModuleId,
232
- );
233
-
234
237
  /**
235
238
  *
236
239
  * @type {import("vue-i18n").I18n}
@@ -372,10 +375,12 @@ class VcsUiApp extends VcsApp {
372
375
  this.mounted = new VcsEvent();
373
376
 
374
377
  this._destroySiteConfig = createSiteConfig(this._uiConfig);
378
+
379
+ this._destroyObliqueFallback = createObliqueFallbackWarnings(this);
375
380
  }
376
381
 
377
382
  /**
378
- * @type {import("@vcmap/core").OverrideCollection<VcsPlugin, Collection<VcsPlugin>, Object>}
383
+ * @type {import("@vcmap/core").OverrideCollection<VcsPlugin<Object, Object>, Collection<VcsPlugin<Object, Object>>, Object>}
379
384
  */
380
385
  get plugins() {
381
386
  return this._plugins;
@@ -751,6 +756,7 @@ class VcsUiApp extends VcsApp {
751
756
  this._featureInfo.destroy();
752
757
  this._uiConfig.destroy();
753
758
  this._destroySiteConfig();
759
+ this._destroyObliqueFallback();
754
760
  super.destroy();
755
761
  }
756
762
  }
@@ -9,6 +9,7 @@ import { resolveValue } from '@intlify/core-base';
9
9
  export function createVueI18n() {
10
10
  return createI18n({
11
11
  legacy: false,
12
+ globalInjection: true,
12
13
  locale: 'en',
13
14
  missingWarn: false,
14
15
  fallbackWarn: false,