@vcmap/ui 5.1.7 → 5.2.0

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 (91) hide show
  1. package/build/buildTypes.js +9 -0
  2. package/config/base.config.json +33 -2
  3. package/config/dev.config.json +22 -2
  4. package/dist/assets/cesium.js +1 -1
  5. package/dist/assets/{core.42b085.js → core.627882.js} +4097 -3978
  6. package/dist/assets/core.js +1 -1
  7. package/dist/assets/index-76acacac.js +1 -0
  8. package/dist/assets/ol.js +1 -1
  9. package/dist/assets/{ui.d91b1c.css → ui.895896.css} +2 -2
  10. package/dist/assets/{ui.d91b1c.js → ui.895896.js} +8629 -7658
  11. package/dist/assets/ui.js +1 -1
  12. package/dist/assets/vue.js +2 -2
  13. package/dist/assets/{vuetify.be3c1c.js → vuetify.1621f3.js} +1 -1
  14. package/dist/assets/vuetify.js +2 -2
  15. package/dist/index.html +1 -1
  16. package/index.d.ts +16 -0
  17. package/index.js +23 -0
  18. package/package.json +2 -2
  19. package/plugins/@vcmap-show-case/collection-manager-example/src/CollectionManagerExample.vue +110 -37
  20. package/plugins/@vcmap-show-case/collection-manager-example/src/index.js +4 -0
  21. package/plugins/@vcmap-show-case/form-inputs-example/src/FormInputsExample.vue +10 -3
  22. package/plugins/@vcmap-show-case/panel-tester/README.md +3 -0
  23. package/plugins/@vcmap-show-case/panel-tester/package.json +5 -0
  24. package/plugins/@vcmap-show-case/panel-tester/src/IframePanelExample.vue +15 -0
  25. package/plugins/@vcmap-show-case/panel-tester/src/ImgPanelExample.vue +19 -0
  26. package/plugins/@vcmap-show-case/panel-tester/src/PanelExample.vue +128 -0
  27. package/plugins/@vcmap-show-case/panel-tester/src/TextPanelExample.vue +34 -0
  28. package/plugins/@vcmap-show-case/panel-tester/src/index.js +63 -0
  29. package/src/actions/actionHelper.js +2 -2
  30. package/src/actions/flightActions.d.ts +38 -2
  31. package/src/actions/flightActions.js +257 -6
  32. package/src/application/VcsApp.vue +4 -104
  33. package/src/application/VcsApp.vue.d.ts +0 -6
  34. package/src/application/VcsContainer.vue +105 -0
  35. package/src/application/VcsContainer.vue.d.ts +14 -0
  36. package/src/application/VcsMainMap.vue +68 -0
  37. package/src/application/VcsMainMap.vue.d.ts +9 -0
  38. package/src/application/markdownHelper.d.ts +7 -0
  39. package/src/application/markdownHelper.js +57 -1
  40. package/src/components/form-inputs-controls/VcsRadioGrid.vue +27 -42
  41. package/src/contentTree/LayerTree.vue +40 -14
  42. package/src/downloadHelper.d.ts +0 -2
  43. package/src/downloadHelper.js +2 -4
  44. package/src/featureInfo/BalloonComponent.vue +31 -3
  45. package/src/featureInfo/BalloonComponent.vue.d.ts +1 -0
  46. package/src/featureInfo/MarkdownBalloonComponent.vue +24 -0
  47. package/src/featureInfo/MarkdownBalloonComponent.vue.d.ts +12 -0
  48. package/src/featureInfo/abstractFeatureInfoView.js +54 -22
  49. package/src/featureInfo/addressBalloonFeatureInfoView.d.ts +2 -2
  50. package/src/featureInfo/addressBalloonFeatureInfoView.js +1 -1
  51. package/src/featureInfo/balloonFeatureInfoView.js +1 -1
  52. package/src/featureInfo/balloonHelper.js +16 -9
  53. package/src/featureInfo/featureInfo.js +10 -0
  54. package/src/featureInfo/markdownBalloonFeatureInfoView.d.ts +47 -0
  55. package/src/featureInfo/markdownBalloonFeatureInfoView.js +81 -0
  56. package/src/featureInfo/markdownFeatureInfoView.d.ts +47 -0
  57. package/src/featureInfo/markdownFeatureInfoView.js +95 -0
  58. package/src/i18n/de.d.ts +8 -3
  59. package/src/i18n/de.js +3 -0
  60. package/src/i18n/en.d.ts +32 -26
  61. package/src/i18n/en.js +4 -1
  62. package/src/manager/collectionManager/CollectionComponent.vue +12 -49
  63. package/src/manager/collectionManager/CollectionComponent.vue.d.ts +5 -9
  64. package/src/manager/collectionManager/CollectionComponentContent.vue +102 -0
  65. package/src/manager/collectionManager/CollectionComponentContent.vue.d.ts +17 -0
  66. package/src/manager/collectionManager/CollectionComponentList.vue +10 -2
  67. package/src/manager/collectionManager/CollectionComponentList.vue.d.ts +9 -0
  68. package/src/manager/collectionManager/CollectionComponentStandalone.vue +91 -0
  69. package/src/manager/collectionManager/CollectionComponentStandalone.vue.d.ts +9 -0
  70. package/src/manager/collectionManager/collectionManager.d.ts +2 -2
  71. package/src/manager/collectionManager/collectionManager.js +21 -19
  72. package/src/manager/panel/PanelComponent.vue +110 -0
  73. package/src/manager/panel/PanelComponent.vue.d.ts +19 -0
  74. package/src/manager/panel/PanelManagerComponent.vue +224 -0
  75. package/src/manager/panel/PanelManagerComponent.vue.d.ts +36 -0
  76. package/src/manager/panel/panelHelper.d.ts +83 -0
  77. package/src/manager/panel/panelHelper.js +272 -0
  78. package/src/manager/panel/panelManager.d.ts +338 -0
  79. package/src/manager/panel/panelManager.js +381 -0
  80. package/src/manager/window/WindowManager.vue +14 -0
  81. package/src/manager/window/windowHelper.js +1 -1
  82. package/src/search/ResultItem.vue +1 -1
  83. package/src/search/search.d.ts +2 -2
  84. package/src/search/search.js +2 -2
  85. package/src/vcsUiApp.d.ts +14 -0
  86. package/src/vcsUiApp.js +18 -0
  87. package/dist/assets/index-c055a222.js +0 -1
  88. /package/dist/assets/{cesium.0b68c5.js → cesium.9e39f4.js} +0 -0
  89. /package/dist/assets/{ol.9e8753.js → ol.fe8c0e.js} +0 -0
  90. /package/dist/assets/{vue.33980b.js → vue.4b3319.js} +0 -0
  91. /package/dist/assets/{vuetify.be3c1c.css → vuetify.1621f3.css} +0 -0
@@ -0,0 +1,381 @@
1
+ import { reactive } from 'vue';
2
+ import { VcsEvent } from '@vcmap/core';
3
+ import { check } from '@vcsuite/check';
4
+ import { v4 as uuidv4 } from 'uuid';
5
+ import { parseBoolean } from '@vcsuite/parsers';
6
+ import { vcsAppSymbol } from '../../pluginHelper.js';
7
+
8
+ export const panelLocationSymbol = Symbol('panelLocation');
9
+ export const panelPositionSymbol = Symbol('panelPosition');
10
+
11
+ /**
12
+ * @readonly
13
+ * @enum {string}
14
+ * @property {string} LEFT - left panel (vertical)
15
+ * @property {string} RIGHT - right panel (vertical)
16
+ * @property {string} BOTTOM - bottom panel (horizontal)
17
+ */
18
+ export const PanelLocation = {
19
+ LEFT: 'vcs-left',
20
+ RIGHT: 'vcs-right',
21
+ BOTTOM: 'vcs-bottom',
22
+ };
23
+
24
+ /**
25
+ * @typedef {Object} VerticalPanelPositionOptions
26
+ * @property {string} [width] Can be a css position string (e.g. '320px' or '50%')
27
+ * @property {string} [maxWidth] Can be a css position string (e.g. '320px' or '50%')
28
+ * @property {string} [minWidth] Can be a css position string (e.g. '320px' or '50%')
29
+ */
30
+
31
+ /**
32
+ * @typedef {Object} HorizontalPanelPositionOptions
33
+ * @property {string} [height] Can be a css position string (e.g. '320px' or '50%')
34
+ * @property {string} [maxHeight] Can be a css position string (e.g. '320px' or '50%')
35
+ * @property {string} [minHeight] Can be a css position string (e.g. '320px' or '50%')
36
+ */
37
+
38
+ /**
39
+ * @typedef {Object} PanelPosition
40
+ * @property {string?} left - The left CSS property participates in specifying the horizontal position of a panel.
41
+ * @property {string?} top - The top CSS property participates in specifying the vertical position of a panel.
42
+ * @property {string?} right - The right CSS property participates in specifying the horizontal position of a panel.
43
+ * @property {string?} bottom - The bottom CSS property participates in specifying the vertical position of a panel.
44
+ * @property {string} width - The width CSS property sets an element's width.
45
+ * @property {string} height - The height CSS property sets an element's height.
46
+ * @property {string} maxHeight - The maxHeight CSS property sets an element's maximal height.
47
+ * @property {string} maxWidth - The maxWidth CSS property sets an element's maximal width.
48
+ * @property {string} minHeight - The minHeight CSS property sets an element's minimal height.
49
+ * @property {string} minWidth - The minWidth CSS property sets an element's minimal width.
50
+ */
51
+
52
+ /**
53
+ * @readonly
54
+ * @enum {Partial<PanelPosition>}
55
+ * @private
56
+ */
57
+ export const DefaultPanelPositions = {
58
+ [PanelLocation.LEFT]: {
59
+ left: '0px',
60
+ width: '25%',
61
+ minWidth: '10%',
62
+ height: '100%',
63
+ },
64
+ [PanelLocation.RIGHT]: {
65
+ right: '0px',
66
+ width: '25%',
67
+ minWidth: '10%',
68
+ height: '100%',
69
+ },
70
+ [PanelLocation.BOTTOM]: {
71
+ bottom: '0px',
72
+ width: '100%',
73
+ height: '25%',
74
+ minHeight: '10%',
75
+ maxHeight: '75%',
76
+ },
77
+ };
78
+
79
+ /**
80
+ * @typedef {Object} PanelComponentOptions
81
+ * @property {string} [id] - Optional id, which will be set as HTML container ID. If not provided an uuid will be generated.
82
+ * @property {import("vue").Component} [component] Optional component to be rendered in the panel.
83
+ * @property {Partial<PanelState>} [state]
84
+ * @property {Partial<VerticalPanelPositionOptions|HorizontalPanelPositionOptions>} [position] Will be merged with default position for panel
85
+ * @property {Object} [props]
86
+ * @property {Object} [provides]
87
+ */
88
+
89
+ /**
90
+ * @typedef {Object} PanelState
91
+ * @property {string} id
92
+ * @property {string|vcsAppSymbol} owner Owner of the panel, set by panelManager on add
93
+ * @property {PanelLocation} location Location of the panel, set by panelManager on add
94
+ * @property {boolean} [resizable=true] Whether size of panel can be adapted
95
+ * @property {Object<string, string>} [styles] Can be used to add additional styles to the root PanelComponent. Use Vue Style Bindings Object Syntax https://vuejs.org/v2/guide/class-and-style.html
96
+ * @property {Array<string>|Object<string,string>} [classes] Can be used to add additional classes to the root PanelComponent. Use Vue Class Bindings Syntax https://vuejs.org/v2/guide/class-and-style.html
97
+ */
98
+
99
+ /**
100
+ * @typedef {Object} PanelComponent
101
+ * @property {string} id
102
+ * @property {import("vue").Component} component
103
+ * @property {Partial<PanelState>} state
104
+ * @property {Object} props
105
+ * @property {Object} provides
106
+ */
107
+
108
+ /**
109
+ * @param {Partial<PanelComponent>} panelComponent
110
+ * @returns {PanelPosition|undefined}
111
+ */
112
+ export function getPanelPosition(panelComponent) {
113
+ return panelComponent?.[panelPositionSymbol];
114
+ }
115
+
116
+ /**
117
+ * @param {PanelComponent} panelComponent
118
+ * @param {Partial<PanelPosition>} panelPosition
119
+ */
120
+ export function setPanelPosition(panelComponent, panelPosition) {
121
+ const position = getPanelPosition(panelComponent);
122
+ const toUpdate = Object.keys(panelPosition).reduce((acc, key) => {
123
+ if (position?.[key] !== panelPosition[key]) {
124
+ acc[key] = panelPosition[key];
125
+ }
126
+ return acc;
127
+ }, {});
128
+ if (Object.keys(toUpdate).length > 0) {
129
+ Object.assign(panelComponent[panelPositionSymbol], panelPosition);
130
+ }
131
+ }
132
+
133
+ /**
134
+ * @typedef {import("../../vcsUiApp.js").VcsComponentManager<PanelComponent,PanelComponentOptions>} IPanelManager
135
+ */
136
+
137
+ /**
138
+ * @class PanelManager
139
+ * @description Manages a set of Panels
140
+ * @implements {IPanelManager}
141
+ */
142
+ class PanelManager {
143
+ constructor() {
144
+ /**
145
+ * @type {import("@vcmap/core").VcsEvent<PanelComponent>}
146
+ */
147
+ this.added = new VcsEvent();
148
+ /**
149
+ * @type {import("@vcmap/core").VcsEvent<PanelComponent>}
150
+ */
151
+ this.removed = new VcsEvent();
152
+ /**
153
+ * reactive ordered array of ids,
154
+ * @type {Array<string>}
155
+ */
156
+ this.componentIds = [];
157
+ /**
158
+ * @type {Map<PanelLocation, string>}
159
+ * @private
160
+ */
161
+ this._panelLocations = new Map();
162
+ /**
163
+ * @type {Map<string, PanelComponent>}
164
+ * @private
165
+ */
166
+ this._panelComponents = new Map();
167
+ /**
168
+ * @type {Map<string, PanelPosition>}
169
+ * @private
170
+ */
171
+ this._panelPositionsCache = new Map();
172
+ }
173
+
174
+ /**
175
+ * @param {string} id
176
+ * @returns {PanelComponent}
177
+ */
178
+ get(id) {
179
+ return this._panelComponents.get(id);
180
+ }
181
+
182
+ /**
183
+ * @param {string} id
184
+ * @returns {boolean}
185
+ */
186
+ has(id) {
187
+ return this._panelComponents.has(id);
188
+ }
189
+
190
+ /**
191
+ *
192
+ * @param {PanelLocation} location
193
+ * @returns {PanelComponent}
194
+ */
195
+ getLocation(location) {
196
+ return this._panelComponents.get(this._panelLocations.get(location));
197
+ }
198
+
199
+ /**
200
+ *
201
+ * @param {PanelLocation} location
202
+ * @returns {boolean}
203
+ */
204
+ hasLocation(location) {
205
+ return this._panelLocations.has(location);
206
+ }
207
+
208
+ /**
209
+ *
210
+ * @param {PanelLocation} location
211
+ */
212
+ removePanelAtLocation(location) {
213
+ if (this.hasLocation(location)) {
214
+ this.remove(this.getLocation(location).id);
215
+ }
216
+ }
217
+
218
+ /**
219
+ * @param {string} id
220
+ * @returns {Partial<PanelPosition>|undefined}
221
+ */
222
+ getCachedPosition(id) {
223
+ return this._panelPositionsCache.get(id);
224
+ }
225
+
226
+ /**
227
+ * removes a panel, Component will not be rendered anymore and will be destroyed. Add PanelComponent again
228
+ * to show the component again
229
+ * @param {string} id
230
+ */
231
+ remove(id) {
232
+ check(id, String);
233
+ const panelComponent = this._panelComponents.get(id);
234
+ if (panelComponent) {
235
+ const { left, right, top, bottom, ...widthAndHeightOptions } =
236
+ getPanelPosition(panelComponent);
237
+ this._panelPositionsCache.set(panelComponent.id, {
238
+ ...widthAndHeightOptions,
239
+ });
240
+ this.componentIds.splice(this.componentIds.indexOf(id), 1);
241
+ this._panelComponents.delete(id);
242
+ this._panelLocations.delete(panelComponent[panelLocationSymbol]);
243
+ this.removed.raiseEvent(panelComponent);
244
+ }
245
+ }
246
+
247
+ /**
248
+ * Set width for LEFT and RIGHT or height for BOTTOM panels
249
+ * @param {string} id
250
+ * @param {VerticalPanelPositionOptions|HorizontalPanelPositionOptions} panelPositionOptions
251
+ */
252
+ setPanelPosition(id, panelPositionOptions) {
253
+ const panelComponent = this.get(id);
254
+ if (panelComponent) {
255
+ const { location } = panelComponent.state;
256
+ let allowedKeys = [];
257
+ if (location === PanelLocation.LEFT || location === PanelLocation.RIGHT) {
258
+ allowedKeys = ['width', 'minWidth', 'maxWidth'];
259
+ } else if (location === PanelLocation.BOTTOM) {
260
+ allowedKeys = ['height', 'minHeight', 'maxHeight'];
261
+ }
262
+ const toUpdate = Object.keys(panelPositionOptions)
263
+ .filter((key) => allowedKeys.includes(key))
264
+ .reduce((acc, key) => {
265
+ acc[key] = panelPositionOptions[key];
266
+ return acc;
267
+ }, {});
268
+ if (Object.keys(toUpdate).length > 0) {
269
+ setPanelPosition(panelComponent, toUpdate);
270
+ }
271
+ }
272
+ }
273
+
274
+ /**
275
+ * adds a panelComponent to the PanelManager and renders the Panel
276
+ * @param {PanelComponentOptions|PanelComponent} panelComponentOptions
277
+ * @param {string|symbol} owner pluginName or vcsAppSymbol
278
+ * @param {PanelLocation} location panel render position
279
+ * @returns {PanelComponent}
280
+ */
281
+ add(panelComponentOptions, owner, location) {
282
+ check(owner, [String, vcsAppSymbol]);
283
+ check(location, Object.values(PanelLocation));
284
+
285
+ const id = panelComponentOptions.id || uuidv4();
286
+ const { component, position: panelPosition } = panelComponentOptions;
287
+
288
+ const styles = { ...panelComponentOptions?.state?.styles };
289
+ const classes = Array.isArray(panelComponentOptions?.state?.classes)
290
+ ? [...(panelComponentOptions?.state?.classes ?? [])]
291
+ : { ...panelComponentOptions?.state?.classes };
292
+
293
+ const state = reactive({
294
+ id,
295
+ owner,
296
+ location,
297
+ resizable: parseBoolean(panelComponentOptions?.state?.resizable, true),
298
+ styles,
299
+ classes,
300
+ });
301
+
302
+ const props = panelComponentOptions.props || {};
303
+ const provides = panelComponentOptions.provides || {};
304
+
305
+ const defaultPosition = DefaultPanelPositions[location];
306
+ const cachedPosition = this.getCachedPosition(id) || {};
307
+ const position = reactive({
308
+ ...defaultPosition,
309
+ ...cachedPosition,
310
+ ...panelPosition,
311
+ });
312
+ /**
313
+ * @type {PanelComponent}
314
+ */
315
+ const panelComponent = {
316
+ get id() {
317
+ return id;
318
+ },
319
+ get state() {
320
+ return state;
321
+ },
322
+ get component() {
323
+ return component;
324
+ },
325
+ get props() {
326
+ return props;
327
+ },
328
+ get provides() {
329
+ return provides;
330
+ },
331
+ [panelPositionSymbol]: position,
332
+ [panelLocationSymbol]: location,
333
+ };
334
+
335
+ this.remove(id);
336
+ this.removePanelAtLocation(location);
337
+ this._panelComponents.set(id, panelComponent);
338
+ this._panelLocations.set(location, id);
339
+ this.componentIds.push(id);
340
+ this.added.raiseEvent(panelComponent);
341
+ return panelComponent;
342
+ }
343
+
344
+ /**
345
+ * removes all panelComponents of a specific owner (plugin) and fires removed Events
346
+ * @param {string|vcsAppSymbol} owner
347
+ */
348
+ removeOwner(owner) {
349
+ const componentIds = [...this.componentIds];
350
+ componentIds.forEach((id) => {
351
+ const { state } = this.get(id);
352
+ if (owner === state.owner) {
353
+ this.remove(id);
354
+ }
355
+ });
356
+ }
357
+
358
+ /**
359
+ * removes all panelComponents and fires removed Events
360
+ */
361
+ clear() {
362
+ const componentIds = [...this.componentIds];
363
+ componentIds.forEach((id) => {
364
+ this.remove(id);
365
+ });
366
+ this._panelPositionsCache.clear();
367
+ }
368
+
369
+ /**
370
+ * destroys the panelManager;
371
+ */
372
+ destroy() {
373
+ this.added.destroy();
374
+ this.removed.destroy();
375
+ this.componentIds.splice(0);
376
+ this._panelComponents.clear();
377
+ this._panelPositionsCache.clear();
378
+ }
379
+ }
380
+
381
+ export default PanelManager;
@@ -60,6 +60,7 @@
60
60
 
61
61
  import WindowComponent from './WindowComponent.vue';
62
62
  import WindowComponentHeader from './WindowComponentHeader.vue';
63
+ import BalloonComponent from '../../featureInfo/BalloonComponent.vue';
63
64
  import {
64
65
  getPositionAppliedOnTarget,
65
66
  getTargetSize,
@@ -110,6 +111,19 @@
110
111
  const parentComponent =
111
112
  !windowComponent?.state?.dockable &&
112
113
  windowManager.get(windowComponent.parentId);
114
+
115
+ if (
116
+ windowComponent.component.name === BalloonComponent.name ||
117
+ (windowComponent.component.components &&
118
+ Object.hasOwn(
119
+ windowComponent.component.components,
120
+ BalloonComponent.name,
121
+ ))
122
+ ) {
123
+ // do not clip balloons to target
124
+ return windowComponent?.position;
125
+ }
126
+
113
127
  return getPositionAppliedOnTarget(
114
128
  windowComponent?.position,
115
129
  targetSize.value,
@@ -40,7 +40,7 @@ export function getTargetSize(target) {
40
40
  if (!target) {
41
41
  return null;
42
42
  }
43
- return target.parentElement.getBoundingClientRect();
43
+ return target.parentElement?.parentElement?.parentElement?.getBoundingClientRect();
44
44
  }
45
45
 
46
46
  /**
@@ -37,7 +37,7 @@
37
37
  partials.forEach((partial) => {
38
38
  replacement = replacement.replaceAll(
39
39
  new RegExp(`(^|[^>])(${partial})`, 'ig'),
40
- '<span class="primary--text">$2</span>',
40
+ '<span>$1<span class="primary--text">$2</span></span>',
41
41
  );
42
42
  });
43
43
  }
@@ -24,8 +24,8 @@ export type SearchImpl = {
24
24
  * Name of the implementation. Must be the name of the plugin the SearchImpl is owned by
25
25
  */
26
26
  name: string;
27
- search: (arg0: string) => Array<ResultItem>;
28
- suggest?: ((arg0: string) => Array<string>) | undefined;
27
+ search: (arg0: string) => Promise<Array<ResultItem>>;
28
+ suggest?: ((arg0: string) => Promise<Array<string>>) | undefined;
29
29
  /**
30
30
  * - should abort any ongoing requests to search or suggest without throwing an error
31
31
  */
@@ -34,8 +34,8 @@ import { getViewpointFromFeature } from '../actions/actionHelper.js';
34
34
  /**
35
35
  * @typedef {Object} SearchImpl
36
36
  * @property {string} name Name of the implementation. Must be the name of the plugin the SearchImpl is owned by
37
- * @property {function(string):Array<ResultItem>} search
38
- * @property {function(string):Array<string>} [suggest] // XXX currently not implemented in UI at Beta state
37
+ * @property {function(string):Promise<Array<ResultItem>>} search
38
+ * @property {function(string):Promise<Array<string>>} [suggest] // XXX currently not implemented in UI at Beta state
39
39
  * @property{function():void} abort - should abort any ongoing requests to search or suggest without throwing an error
40
40
  * @property {function():void} destroy
41
41
  */
package/src/vcsUiApp.d.ts CHANGED
@@ -32,6 +32,10 @@ export type PluginConfigEditor = {
32
32
  * - The item the editor can be used for. Can be a name or className. Default is the plugin's name.
33
33
  */
34
34
  itemName?: string | undefined;
35
+ /**
36
+ * - An optional function returning an url referencing help or further information regarding the config editor.
37
+ */
38
+ infoUrlCallback?: (() => string) | undefined;
35
39
  };
36
40
  export type createPlugin<P extends Object, S extends Object> = (arg0: P, arg1: string) => VcsPlugin<P, S>;
37
41
  /**
@@ -115,6 +119,11 @@ declare class VcsUiApp extends VcsApp {
115
119
  * @private
116
120
  */
117
121
  private _windowManager;
122
+ /**
123
+ * @type {PanelManager}
124
+ * @private
125
+ */
126
+ private _panelManager;
118
127
  /**
119
128
  * @type {NavbarManager}
120
129
  * @private
@@ -217,6 +226,10 @@ declare class VcsUiApp extends VcsApp {
217
226
  * @returns {WindowManager}
218
227
  */
219
228
  get windowManager(): WindowManager;
229
+ /**
230
+ * @returns {PanelManager}
231
+ */
232
+ get panelManager(): PanelManager;
220
233
  /**
221
234
  * @returns {NavbarManager}
222
235
  */
@@ -292,6 +305,7 @@ import { OverrideClassRegistry } from '@vcmap/core';
292
305
  import AbstractFeatureInfoView from './featureInfo/abstractFeatureInfoView.js';
293
306
  import ToolboxManager from './manager/toolbox/toolboxManager.js';
294
307
  import WindowManager from './manager/window/windowManager.js';
308
+ import PanelManager from './manager/panel/panelManager.js';
295
309
  import NavbarManager from './manager/navbarManager.js';
296
310
  import FeatureInfo from './featureInfo/featureInfo.js';
297
311
  import OverviewMap from './navigation/overviewMap.js';
package/src/vcsUiApp.js CHANGED
@@ -18,6 +18,7 @@ import ToolboxManager, {
18
18
  setupDefaultGroups,
19
19
  } from './manager/toolbox/toolboxManager.js';
20
20
  import WindowManager from './manager/window/windowManager.js';
21
+ import PanelManager from './manager/panel/panelManager.js';
21
22
  import NavbarManager from './manager/navbarManager.js';
22
23
  // eslint-disable-next-line no-unused-vars
23
24
  import ContentTreeCollection, { // imported for type
@@ -66,6 +67,7 @@ import createSiteConfig from './siteConfig.js';
66
67
  * @property {import("vue").Component & { title: string | undefined}} component - A editor component to configure a plugin or item
67
68
  * @property {string} [collectionName='plugins'] - The collection the item belongs to. Default is plugins collection.
68
69
  * @property {string} [itemName] - The item the editor can be used for. Can be a name or className. Default is the plugin's name.
70
+ * @property {function():string} [infoUrlCallback] - An optional function returning an url referencing help or further information regarding the config editor.
69
71
  */
70
72
 
71
73
  /**
@@ -170,6 +172,7 @@ class VcsUiApp extends VcsApp {
170
172
  this._pluginListeners = [
171
173
  this._plugins.added.addEventListener((plugin) => {
172
174
  this._windowManager.removeOwner(plugin.name);
175
+ this._panelManager.removeOwner(plugin.name);
173
176
  this._navbarManager.removeOwner(plugin.name);
174
177
  this._toolboxManager.removeOwner(plugin.name);
175
178
  this._categoryManager.removeOwner(plugin.name);
@@ -195,6 +198,7 @@ class VcsUiApp extends VcsApp {
195
198
  }),
196
199
  this._plugins.removed.addEventListener(async (plugin) => {
197
200
  this._windowManager.removeOwner(plugin.name);
201
+ this._panelManager.removeOwner(plugin.name);
198
202
  this._navbarManager.removeOwner(plugin.name);
199
203
  this._toolboxManager.removeOwner(plugin.name);
200
204
  this._categoryManager.removeOwner(plugin.name);
@@ -238,6 +242,12 @@ class VcsUiApp extends VcsApp {
238
242
  * @private
239
243
  */
240
244
  this._windowManager = new WindowManager();
245
+ /**
246
+ * @type {PanelManager}
247
+ * @private
248
+ */
249
+ this._panelManager = new PanelManager();
250
+
241
251
  /**
242
252
  * @type {NavbarManager}
243
253
  * @private
@@ -384,6 +394,13 @@ class VcsUiApp extends VcsApp {
384
394
  return this._windowManager;
385
395
  }
386
396
 
397
+ /**
398
+ * @returns {PanelManager}
399
+ */
400
+ get panelManager() {
401
+ return this._panelManager;
402
+ }
403
+
387
404
  /**
388
405
  * @returns {NavbarManager}
389
406
  */
@@ -667,6 +684,7 @@ class VcsUiApp extends VcsApp {
667
684
  */
668
685
  destroy() {
669
686
  this.windowManager.destroy();
687
+ this.panelManager.destroy();
670
688
  this.navbarManager.destroy();
671
689
  this.toolboxManager.destroy();
672
690
  this.categoryManager.destroy();
@@ -1 +0,0 @@
1
- import{initAppFromAppConfig as p}from"./ui.d91b1c.js";p("#app","app.config.json");
File without changes
File without changes