@vcmap/ui 5.0.0-rc.24 → 5.0.0-rc.26

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 (215) hide show
  1. package/build/build.js +132 -14
  2. package/build/buildHelpers.js +196 -92
  3. package/build/bundle.js +56 -0
  4. package/build/commonViteConfig.js +2 -2
  5. package/config/base.config.json +29 -2
  6. package/config/dev.config.json +29 -1
  7. package/config/www.config.json +81 -39
  8. package/dist/assets/@mdi/font/LICENSE +20 -0
  9. package/dist/assets/@mdi/font/css/materialdesignicons.css.map +16 -0
  10. package/dist/assets/@mdi/font/css/materialdesignicons.min.e3f476.css +3 -0
  11. package/dist/assets/@mdi/font/fonts/materialdesignicons-webfont.woff2 +0 -0
  12. package/dist/assets/cesium/Workers/{AxisAlignedBoundingBox-85d9e53a.js → AxisAlignedBoundingBox-4140c51f.js} +1 -1
  13. package/dist/assets/cesium/Workers/{BoundingRectangle-1ee7eb47.js → BoundingRectangle-c714b156.js} +1 -1
  14. package/dist/assets/cesium/Workers/{BoxGeometry-3b2be784.js → BoxGeometry-6f3da43d.js} +1 -1
  15. package/dist/assets/cesium/Workers/{Color-f107c84d.js → Color-8a565ff2.js} +5 -5
  16. package/dist/assets/cesium/Workers/{CoplanarPolygonGeometryLibrary-78d71993.js → CoplanarPolygonGeometryLibrary-4b4d4096.js} +1 -1
  17. package/dist/assets/cesium/Workers/{CorridorGeometryLibrary-50d99b33.js → CorridorGeometryLibrary-7b94502b.js} +1 -1
  18. package/dist/assets/cesium/Workers/{CylinderGeometry-51b0d9bf.js → CylinderGeometry-ca070b87.js} +1 -1
  19. package/dist/assets/cesium/Workers/{EllipseGeometry-bcfb5d87.js → EllipseGeometry-122e51fa.js} +1 -1
  20. package/dist/assets/cesium/Workers/{EllipseGeometryLibrary-e94f8472.js → EllipseGeometryLibrary-4d326efc.js} +1 -1
  21. package/dist/assets/cesium/Workers/{EllipseOutlineGeometry-28e3a1bb.js → EllipseOutlineGeometry-16cc2bd7.js} +1 -1
  22. package/dist/assets/cesium/Workers/{EllipsoidGeometry-b222fa63.js → EllipsoidGeometry-cb148ca2.js} +1 -1
  23. package/dist/assets/cesium/Workers/{EllipsoidOutlineGeometry-38a3fb5b.js → EllipsoidOutlineGeometry-0fa10c79.js} +1 -1
  24. package/dist/assets/cesium/Workers/{EllipsoidTangentPlane-8c89f28c.js → EllipsoidTangentPlane-6dd1b7af.js} +1 -1
  25. package/dist/assets/cesium/Workers/{FrustumGeometry-bdd3a04d.js → FrustumGeometry-ee73037c.js} +1 -1
  26. package/dist/assets/cesium/Workers/{GeometryAttribute-153115c5.js → GeometryAttribute-ff5b4fb1.js} +1 -1
  27. package/dist/assets/cesium/Workers/{GeometryPipeline-acb2399c.js → GeometryPipeline-1f8fbf05.js} +1 -1
  28. package/dist/assets/cesium/Workers/{IntersectionTests-271e513e.js → IntersectionTests-70d39ba9.js} +1 -1
  29. package/dist/assets/cesium/Workers/{OrientedBoundingBox-5e04e31f.js → OrientedBoundingBox-159cf1d6.js} +1 -1
  30. package/dist/assets/cesium/Workers/{PolygonGeometryLibrary-6762b65b.js → PolygonGeometryLibrary-076a5d25.js} +1 -1
  31. package/dist/assets/cesium/Workers/{PolygonPipeline-7dc7a431.js → PolygonPipeline-b9f2810a.js} +1 -1
  32. package/dist/assets/cesium/Workers/{PolylinePipeline-15fde655.js → PolylinePipeline-639192e0.js} +1 -1
  33. package/dist/assets/cesium/Workers/{PolylineVolumeGeometryLibrary-ba7dfed5.js → PolylineVolumeGeometryLibrary-b73549fb.js} +1 -1
  34. package/dist/assets/cesium/Workers/{PrimitivePipeline-68f0b9a2.js → PrimitivePipeline-10ede1b6.js} +1 -1
  35. package/dist/assets/cesium/Workers/{RectangleGeometryLibrary-8eaf23da.js → RectangleGeometryLibrary-c35a7356.js} +1 -1
  36. package/dist/assets/cesium/Workers/{TerrainEncoding-eb8a645a.js → TerrainEncoding-668d242f.js} +1 -1
  37. package/dist/assets/cesium/Workers/{Transforms-f6451f99.js → Transforms-a2a85221.js} +14 -0
  38. package/dist/assets/cesium/Workers/{WallGeometryLibrary-feef3109.js → WallGeometryLibrary-1938bf0d.js} +1 -1
  39. package/dist/assets/cesium/Workers/cesiumWorkerBootstrapper.js +1 -1
  40. package/dist/assets/cesium/Workers/combineGeometry.js +1 -1
  41. package/dist/assets/cesium/Workers/createBoxGeometry.js +1 -1
  42. package/dist/assets/cesium/Workers/createBoxOutlineGeometry.js +1 -1
  43. package/dist/assets/cesium/Workers/createCircleGeometry.js +1 -1
  44. package/dist/assets/cesium/Workers/createCircleOutlineGeometry.js +1 -1
  45. package/dist/assets/cesium/Workers/createCoplanarPolygonGeometry.js +1 -1
  46. package/dist/assets/cesium/Workers/createCoplanarPolygonOutlineGeometry.js +1 -1
  47. package/dist/assets/cesium/Workers/createCorridorGeometry.js +1 -1
  48. package/dist/assets/cesium/Workers/createCorridorOutlineGeometry.js +1 -1
  49. package/dist/assets/cesium/Workers/createCylinderGeometry.js +1 -1
  50. package/dist/assets/cesium/Workers/createCylinderOutlineGeometry.js +1 -1
  51. package/dist/assets/cesium/Workers/createEllipseGeometry.js +1 -1
  52. package/dist/assets/cesium/Workers/createEllipseOutlineGeometry.js +1 -1
  53. package/dist/assets/cesium/Workers/createEllipsoidGeometry.js +1 -1
  54. package/dist/assets/cesium/Workers/createEllipsoidOutlineGeometry.js +1 -1
  55. package/dist/assets/cesium/Workers/createFrustumGeometry.js +1 -1
  56. package/dist/assets/cesium/Workers/createFrustumOutlineGeometry.js +1 -1
  57. package/dist/assets/cesium/Workers/createGeometry.js +1 -1
  58. package/dist/assets/cesium/Workers/createGroundPolylineGeometry.js +1 -1
  59. package/dist/assets/cesium/Workers/createPlaneGeometry.js +1 -1
  60. package/dist/assets/cesium/Workers/createPlaneOutlineGeometry.js +1 -1
  61. package/dist/assets/cesium/Workers/createPolygonGeometry.js +1 -1
  62. package/dist/assets/cesium/Workers/createPolygonOutlineGeometry.js +1 -1
  63. package/dist/assets/cesium/Workers/createPolylineGeometry.js +1 -1
  64. package/dist/assets/cesium/Workers/createPolylineVolumeGeometry.js +1 -1
  65. package/dist/assets/cesium/Workers/createPolylineVolumeOutlineGeometry.js +1 -1
  66. package/dist/assets/cesium/Workers/createRectangleGeometry.js +1 -1
  67. package/dist/assets/cesium/Workers/createRectangleOutlineGeometry.js +1 -1
  68. package/dist/assets/cesium/Workers/createSimplePolylineGeometry.js +1 -1
  69. package/dist/assets/cesium/Workers/createSphereGeometry.js +1 -1
  70. package/dist/assets/cesium/Workers/createSphereOutlineGeometry.js +1 -1
  71. package/dist/assets/cesium/Workers/createVectorTileGeometries.js +1 -1
  72. package/dist/assets/cesium/Workers/createVectorTilePolygons.js +1 -1
  73. package/dist/assets/cesium/Workers/createVerticesFromGoogleEarthEnterpriseBuffer.js +1 -1
  74. package/dist/assets/cesium/Workers/createVerticesFromHeightmap.js +1 -1
  75. package/dist/assets/cesium/Workers/createVerticesFromQuantizedTerrainMesh.js +1 -1
  76. package/dist/assets/cesium/Workers/createWallGeometry.js +1 -1
  77. package/dist/assets/cesium/Workers/createWallOutlineGeometry.js +1 -1
  78. package/dist/assets/cesium/Workers/package.js +1 -1
  79. package/dist/assets/cesium/Workers/transferTypedArrayTest.js +1 -1
  80. package/dist/assets/cesium/Workers/upsampleQuantizedTerrainMesh.js +1 -1
  81. package/dist/assets/{cesium.253914.js → cesium.305b7c.js} +58656 -33170
  82. package/dist/assets/cesium.js +1 -1
  83. package/dist/assets/core.f3d6d4.js +19060 -0
  84. package/dist/assets/core.js +1 -1
  85. package/dist/assets/index-f94d5be3.js +1 -0
  86. package/dist/assets/{ol.1c946a.js → ol.39cc05.js} +27344 -12118
  87. package/dist/assets/ol.js +1 -1
  88. package/dist/assets/ui.74022f.css +5 -0
  89. package/dist/assets/ui.74022f.js +13466 -0
  90. package/dist/assets/ui.js +1 -1
  91. package/dist/assets/{vue.c1ece7.js → vue.9b8c6e.js} +834 -598
  92. package/dist/assets/vue.js +2 -2
  93. package/dist/assets/{vuetify.6efa21.css → vuetify.30486f.css} +1 -1
  94. package/dist/assets/{vuetify.6efa21.js → vuetify.30486f.js} +343 -103
  95. package/dist/assets/vuetify.js +2 -2
  96. package/dist/index.html +7 -6
  97. package/index.html +14 -6
  98. package/index.js +19 -2
  99. package/lib/olLib.js +19 -16
  100. package/package.json +15 -14
  101. package/plugins/@vcmap/create-link/fallbackCreateLink.vue +0 -2
  102. package/plugins/@vcmap/simple-graph/index.js +1 -1
  103. package/plugins/@vcmap-show-case/README.md +2 -1
  104. package/plugins/@vcmap-show-case/buttons-example/ButtonsExample.vue +55 -79
  105. package/plugins/@vcmap-show-case/category-tester/CategoriesExample.vue +135 -0
  106. package/plugins/@vcmap-show-case/category-tester/CollectionComponentOptions.vue +209 -0
  107. package/plugins/@vcmap-show-case/category-tester/index.js +19 -1
  108. package/plugins/@vcmap-show-case/collection-manager-example/CollectionManagerExample.vue +182 -0
  109. package/plugins/@vcmap-show-case/collection-manager-example/README.md +3 -0
  110. package/plugins/@vcmap-show-case/collection-manager-example/index.js +74 -0
  111. package/plugins/@vcmap-show-case/collection-manager-example/package.json +5 -0
  112. package/plugins/@vcmap-show-case/form-inputs-example/FormInputsExample.vue +20 -3
  113. package/plugins/@vcmap-show-case/switch-map-callback-example/README.md +21 -0
  114. package/plugins/@vcmap-show-case/switch-map-callback-example/SwitchMapCallback.js +47 -0
  115. package/plugins/@vcmap-show-case/switch-map-callback-example/config.json +3 -0
  116. package/plugins/@vcmap-show-case/switch-map-callback-example/index.js +34 -0
  117. package/plugins/@vcmap-show-case/switch-map-callback-example/package.json +5 -0
  118. package/plugins/@vcmap-show-case/table-example/DataTableExample.vue +0 -1
  119. package/plugins/package.json +3 -1
  120. package/public/assets/@mdi/font/LICENSE +20 -0
  121. package/public/assets/@mdi/font/css/materialdesignicons.css.map +16 -0
  122. package/public/assets/@mdi/font/css/materialdesignicons.min.css +3 -0
  123. package/public/assets/@mdi/font/fonts/materialdesignicons-webfont.woff2 +0 -0
  124. package/public/assets/favicon-128.png +0 -0
  125. package/public/assets/favicon-180.png +0 -0
  126. package/public/assets/favicon-192.png +0 -0
  127. package/public/assets/favicon-32.png +0 -0
  128. package/src/application/VcsApp.vue +38 -8
  129. package/src/application/VcsAttributions.vue +20 -5
  130. package/src/application/VcsAttributionsFooter.vue +0 -1
  131. package/src/application/VcsNavbar.vue +29 -22
  132. package/src/callback/activateLayersCallback.js +54 -0
  133. package/src/callback/applyLayerStyleCallback.js +63 -0
  134. package/src/callback/deactivateLayersCallback.js +54 -0
  135. package/src/callback/goToViewpointCallback.js +54 -0
  136. package/src/callback/vcsCallback.js +66 -0
  137. package/src/components/buttons/VcsActionButtonList.vue +28 -10
  138. package/src/components/buttons/VcsButton.vue +38 -100
  139. package/src/components/buttons/VcsFormButton.vue +6 -4
  140. package/src/components/buttons/VcsToolButton.vue +161 -0
  141. package/src/components/form-inputs-controls/VcsDatePicker.vue +19 -5
  142. package/src/components/form-inputs-controls/VcsFormSection.vue +0 -1
  143. package/src/components/form-inputs-controls/VcsSelect.vue +16 -2
  144. package/src/components/form-inputs-controls/VcsSlider.vue +72 -0
  145. package/src/components/form-inputs-controls/VcsTextField.vue +24 -13
  146. package/src/components/form-inputs-controls/VcsWizard.vue +13 -14
  147. package/src/components/form-inputs-controls/VcsWizardStep.vue +0 -1
  148. package/src/components/lists/VcsList.vue +3 -2
  149. package/src/components/lists/VcsTreeviewLeaf.vue +0 -1
  150. package/src/components/tables/VcsDataTable.vue +5 -5
  151. package/src/components/tables/VcsTable.vue +1 -1
  152. package/src/contentTree/LayerTree.vue +15 -9
  153. package/src/contentTree/contentTreeCollection.js +1 -1
  154. package/src/contentTree/contentTreeItem.js +22 -3
  155. package/src/contentTree/groupContentTreeItem.js +1 -0
  156. package/src/contentTree/layerContentTreeItem.js +4 -14
  157. package/src/contentTree/layerGroupContentTreeItem.js +4 -14
  158. package/src/contentTree/obliqueCollectionContentTreeItem.js +4 -0
  159. package/src/contentTree/viewpointContentTreeItem.js +1 -0
  160. package/src/featureInfo/BalloonComponent.vue +0 -1
  161. package/src/featureInfo/abstractFeatureInfoView.js +16 -1
  162. package/src/featureInfo/featureInfo.js +45 -56
  163. package/src/i18n/de.js +5 -2
  164. package/src/i18n/en.js +5 -2
  165. package/src/i18n/i18nCollection.js +1 -2
  166. package/src/init.js +1 -4
  167. package/src/legend/vcsLegend.vue +1 -1
  168. package/src/manager/buttonManager.js +15 -0
  169. package/src/manager/{categoryManager/CategoryComponent.vue → collectionManager/CollectionComponent.vue} +57 -66
  170. package/src/manager/collectionManager/CollectionComponentList.vue +62 -0
  171. package/src/manager/collectionManager/CollectionComponentProvider.vue +38 -0
  172. package/src/manager/collectionManager/CollectionManager.vue +43 -0
  173. package/src/manager/collectionManager/categoryManager.js +83 -0
  174. package/src/manager/collectionManager/collectionComponent.js +453 -0
  175. package/src/manager/collectionManager/collectionManager.js +432 -0
  176. package/src/manager/navbarManager.js +5 -4
  177. package/src/manager/toolbox/GroupToolboxComponent.vue +5 -7
  178. package/src/manager/toolbox/SelectToolboxComponent.vue +6 -9
  179. package/src/manager/toolbox/ToolboxManager.vue +4 -5
  180. package/src/manager/window/WindowComponentHeader.vue +0 -4
  181. package/src/manager/window/WindowManager.vue +22 -5
  182. package/src/navigation/mapNavigation.vue +34 -8
  183. package/src/navigation/overviewMap.js +7 -1
  184. package/src/notifier/notifierComponent.vue +0 -1
  185. package/src/pluginHelper.js +5 -0
  186. package/src/search/resultItem.vue +0 -1
  187. package/src/search/searchComponent.vue +7 -9
  188. package/src/styles/_theming.scss +0 -16
  189. package/src/styles/_typography.scss +2 -2
  190. package/src/styles/main.scss +8 -0
  191. package/src/styles/vcsFont.scss +1 -22
  192. package/src/vcsUiApp.js +76 -12
  193. package/src/vuePlugins/i18n.js +18 -19
  194. package/src/vuePlugins/vuetify.js +0 -1
  195. package/dist/assets/core.3a8205.js +0 -18426
  196. package/dist/assets/index.91ae2d55.js +0 -1
  197. package/dist/assets/ui.0025be.css +0 -5
  198. package/dist/assets/ui.0025be.js +0 -18534
  199. package/plugins/@vcmap-show-case/category-tester/Categories.vue +0 -291
  200. package/plugins/@vcmap-show-case/category-tester/Category.vue +0 -164
  201. package/src/manager/categoryManager/CategoryComponentList.vue +0 -82
  202. package/src/manager/categoryManager/CategoryManager.vue +0 -47
  203. package/src/manager/categoryManager/categoryManager.js +0 -633
  204. package/start.js +0 -9
  205. /package/{src/assets/favicon-128.png → dist/assets/favicon-128.4c4ce5.png} +0 -0
  206. /package/{src/assets/favicon-180.png → dist/assets/favicon-180.5b99c0.png} +0 -0
  207. /package/{src/assets/favicon-192.png → dist/assets/favicon-192.0e205e.png} +0 -0
  208. /package/{src/assets/favicon-32.png → dist/assets/favicon-32.6b9add.png} +0 -0
  209. /package/dist/assets/{favicon.decf54cc.svg → favicon.d5ec97.svg} +0 -0
  210. /package/dist/assets/font/{TitilliumWeb-Regular.woff2 → TitilliumWeb-Regular.9ca076.woff2} +0 -0
  211. /package/{src → public}/assets/favicon.svg +0 -0
  212. /package/{src → public}/assets/font/OFL.txt +0 -0
  213. /package/{src → public}/assets/font/TitilliumWeb-Regular.woff2 +0 -0
  214. /package/src/{assets/logo-mobile.svg → logo-mobile.svg} +0 -0
  215. /package/src/{assets/logo.svg → logo.svg} +0 -0
@@ -1,11 +1,8 @@
1
1
  import {
2
2
  EventType,
3
- makeOverrideCollection,
4
3
  Collection,
5
- getObjectFromClassRegistry,
6
4
  VcsEvent,
7
5
  vcsLayerName,
8
- OverrideClassRegistry,
9
6
  ClassRegistry,
10
7
  fromCesiumColor,
11
8
  VectorLayer,
@@ -155,23 +152,49 @@ function setupFeatureInfoTool(app) {
155
152
  },
156
153
  };
157
154
 
158
- if (app.uiConfig.getByKey('startingFeatureInfo')?.value !== false) {
159
- action.callback();
155
+ function addFeatureInfoButton() {
156
+ if (app.uiConfig.getByKey('startingFeatureInfo')?.value !== false) {
157
+ action.callback();
158
+ }
159
+ app.toolboxManager.add(
160
+ {
161
+ id: 'featureInfo',
162
+ type: ToolboxType.SINGLE,
163
+ action,
164
+ },
165
+ vcsAppSymbol,
166
+ );
160
167
  }
161
- app.toolboxManager.add(
162
- {
163
- id: 'featureInfo',
164
- type: ToolboxType.SINGLE,
165
- action,
166
- },
167
- vcsAppSymbol,
168
- );
168
+
169
+ if ([...app.layers].some((l) => l.properties?.featureInfo)) {
170
+ addFeatureInfoButton();
171
+ }
172
+
173
+ const listeners = [
174
+ app.layers.added.addEventListener((layer) => {
175
+ if (
176
+ layer?.properties?.featureInfo &&
177
+ !app.toolboxManager.has('featureInfo')
178
+ ) {
179
+ addFeatureInfoButton();
180
+ }
181
+ }),
182
+ app.layers.removed.addEventListener(() => {
183
+ if (
184
+ ![...app.layers].some((l) => l.properties?.featureInfo) &&
185
+ app.toolboxManager.has('featureInfo')
186
+ ) {
187
+ app.toolboxManager.remove('featureInfo');
188
+ }
189
+ }),
190
+ ];
169
191
 
170
192
  return () => {
171
193
  if (session) {
172
194
  session.stop();
173
195
  }
174
196
  app.toolboxManager.remove('featureInfo');
197
+ listeners.forEach((cb) => cb());
175
198
  };
176
199
  }
177
200
 
@@ -194,37 +217,22 @@ export const featureInfoViewSymbol = Symbol('featureInfoView');
194
217
 
195
218
  /**
196
219
  * @class FeatureInfo
197
- * @description Provides registration of featureInfoClasses and stores featureInfoView instances in its collection.
220
+ * @description Provides registration of featureInfoClasses and stores featureInfoView instances.
221
+ * @extends {Collection<AbstractFeatureInfoView>}
222
+ * @implements {import("@vcmap/core").OverrideCollectionInterface<AbstractFeatureInfoView>}
198
223
  */
199
- class FeatureInfo {
224
+ class FeatureInfo extends Collection {
200
225
  /**
201
226
  * @param {VcsUiApp} app
202
227
  */
203
228
  constructor(app) {
229
+ super();
230
+
204
231
  /**
205
232
  * @type {VcsUiApp}
206
233
  * @private
207
234
  */
208
235
  this._app = app;
209
- /**
210
- * @type {import("@vcmap/core").OverrideCollection<AbstractFeatureInfoView>}
211
- * @private
212
- */
213
- this._collection = makeOverrideCollection(
214
- new Collection(),
215
- () => this._app.dynamicModuleId,
216
- null,
217
- (config) =>
218
- getObjectFromClassRegistry(this._featureInfoClassRegistry, config),
219
- AbstractFeatureInfoView,
220
- );
221
- /**
222
- * @type {OverrideClassRegistry<AbstractFeatureInfoView>}
223
- * @private
224
- */
225
- this._featureInfoClassRegistry = new OverrideClassRegistry(
226
- featureInfoClassRegistry,
227
- );
228
236
  /**
229
237
  * @type {function():void|null}
230
238
  * @private
@@ -301,22 +309,6 @@ class FeatureInfo {
301
309
  this._destroyFeatureInfoTool = setupFeatureInfoTool(this._app);
302
310
  }
303
311
 
304
- /**
305
- * @type {import("@vcmap/core").OverrideCollection<AbstractFeatureInfoView>}
306
- * @readonly
307
- */
308
- get collection() {
309
- return this._collection;
310
- }
311
-
312
- /**
313
- * @type {OverrideClassRegistry<AbstractFeatureInfoView>}
314
- * @readonly
315
- */
316
- get classRegistry() {
317
- return this._featureInfoClassRegistry;
318
- }
319
-
320
312
  /**
321
313
  * @type {VcsEvent<null|FeatureType>}
322
314
  * @readonly
@@ -379,13 +371,11 @@ class FeatureInfo {
379
371
  );
380
372
  return null;
381
373
  }
382
- if (!this._collection.hasKey(name)) {
374
+ if (!this.hasKey(name)) {
383
375
  getLogger().warning(`No view with name '${name}' has been registered.`);
384
376
  return null;
385
377
  }
386
- return /** @type {AbstractFeatureInfoView} */ this._collection.getByKey(
387
- name,
388
- );
378
+ return /** @type {AbstractFeatureInfoView} */ this.getByKey(name);
389
379
  }
390
380
 
391
381
  /**
@@ -502,6 +492,7 @@ class FeatureInfo {
502
492
  * Destroys the feature info and all its events & listeners
503
493
  */
504
494
  destroy() {
495
+ super.destroy();
505
496
  this._clearInternal();
506
497
  this._featureChanged.destroy();
507
498
  this._destroyFeatureInfoTool();
@@ -511,8 +502,6 @@ class FeatureInfo {
511
502
  }
512
503
  this._listeners.forEach((cb) => cb());
513
504
  this._listeners.splice(0);
514
- this._collection.destroy();
515
- this._featureInfoClassRegistry.destroy();
516
505
  }
517
506
  }
518
507
 
package/src/i18n/de.js CHANGED
@@ -14,6 +14,7 @@ const messages = {
14
14
  },
15
15
  content: {
16
16
  title: 'Inhalte',
17
+ empty: 'Aktuell sind keine Einträge verfügbar.',
17
18
  search: {
18
19
  placeholder: 'Elemente suchen',
19
20
  },
@@ -41,8 +42,10 @@ const messages = {
41
42
  homeButton: 'Springe zur Startansicht',
42
43
  },
43
44
  categoryManager: {
44
- title: 'Komponenten',
45
- tooltip: 'Komponenten',
45
+ title: 'Mein Arbeitsbereich',
46
+ tooltip: 'Mein Arbeitsbereich',
47
+ },
48
+ collectionManager: {
46
49
  more: 'Weitere anzeigen...',
47
50
  empty: 'Es gibt noch keine Einträge.',
48
51
  },
package/src/i18n/en.js CHANGED
@@ -14,6 +14,7 @@ const messages = {
14
14
  },
15
15
  content: {
16
16
  title: 'Content',
17
+ empty: 'Currently there are no entries available.',
17
18
  search: {
18
19
  placeholder: 'Search elements',
19
20
  },
@@ -41,8 +42,10 @@ const messages = {
41
42
  homeButton: 'Go to starting view',
42
43
  },
43
44
  categoryManager: {
44
- title: 'Components',
45
- tooltip: 'Components',
45
+ title: 'My Workspace',
46
+ tooltip: 'My Workspace',
47
+ },
48
+ collectionManager: {
46
49
  more: 'Show more...',
47
50
  empty: 'There are no entries yet.',
48
51
  },
@@ -103,8 +103,7 @@ class I18nCollection extends IndexedCollection {
103
103
  async parseItems(configArray, moduleId) {
104
104
  if (Array.isArray(configArray)) {
105
105
  configArray.forEach((item) => {
106
- item[moduleIdSymbol] = moduleId;
107
- this.add(item);
106
+ this.add({ ...item, [moduleIdSymbol]: moduleId });
108
107
  });
109
108
  }
110
109
  }
package/src/init.js CHANGED
@@ -3,7 +3,6 @@ import { check, checkMaybe, is } from '@vcsuite/check';
3
3
  import { VcsModule } from '@vcmap/core';
4
4
  import VcsAppComponentWrapper from './application/vcsAppWrapper.vue';
5
5
  import { vuetify } from './vuePlugins/vuetify.js';
6
- import { createVueI18n, setupI18n } from './vuePlugins/i18n.js';
7
6
  import VcsUiApp from './vcsUiApp.js';
8
7
 
9
8
  /**
@@ -45,10 +44,9 @@ export const VcsUiAppConfigPattern = {
45
44
  export default async function initApp(mountTarget) {
46
45
  check(mountTarget, String);
47
46
  const app = new VcsUiApp();
48
- const i18n = createVueI18n();
49
47
  new Vue({
50
48
  vuetify,
51
- i18n,
49
+ i18n: app.vueI18n,
52
50
  render: (h) =>
53
51
  h(VcsAppComponentWrapper, {
54
52
  props: {
@@ -57,7 +55,6 @@ export default async function initApp(mountTarget) {
57
55
  }),
58
56
  }).$mount(mountTarget);
59
57
 
60
- setupI18n(app, i18n);
61
58
  return app;
62
59
  }
63
60
 
@@ -22,7 +22,7 @@
22
22
  </v-icon>
23
23
  {{ $t(entry.title) }}
24
24
  </div>
25
- <VcsActionButtonList small :actions="entry.actions" />
25
+ <VcsActionButtonList :actions="entry.actions" />
26
26
  </div>
27
27
  </template>
28
28
  </v-expansion-panel-header>
@@ -5,10 +5,20 @@ import { check, checkMaybe } from '@vcsuite/check';
5
5
  import { vcsAppSymbol } from '../pluginHelper.js';
6
6
  import { ActionPattern } from '../components/lists/VcsActionList.vue';
7
7
 
8
+ /**
9
+ * @param {number} weightA
10
+ * @param {number} weightB
11
+ * @returns {number}
12
+ */
13
+ export function sortByWeight(weightA, weightB) {
14
+ return weightB - weightA;
15
+ }
16
+
8
17
  /**
9
18
  * @typedef ButtonComponentOptions
10
19
  * @property {string} [id] Optional ID, If not provided an uuid will be generated.
11
20
  * @property {VcsAction} action Action performed by button.
21
+ * @property {number} [weight=0] Optional weight affecting the displaying order
12
22
  */
13
23
 
14
24
  /**
@@ -16,6 +26,7 @@ import { ActionPattern } from '../components/lists/VcsActionList.vue';
16
26
  * @property {string} id
17
27
  * @property {string|vcsAppSymbol} owner
18
28
  * @property {VcsAction} action
29
+ * @property {number} weight
19
30
  */
20
31
 
21
32
  /**
@@ -86,6 +97,7 @@ class ButtonManager {
86
97
  */
87
98
  add(buttonComponentOptions, owner) {
88
99
  checkMaybe(buttonComponentOptions.id, String);
100
+ checkMaybe(buttonComponentOptions.weight, Number);
89
101
  check(buttonComponentOptions.action, ActionPattern);
90
102
  check(owner, [String, vcsAppSymbol]);
91
103
 
@@ -109,6 +121,9 @@ class ButtonManager {
109
121
  get action() {
110
122
  return reactive(buttonComponentOptions.action);
111
123
  },
124
+ get weight() {
125
+ return buttonComponentOptions.weight || 0;
126
+ },
112
127
  };
113
128
 
114
129
  this._buttonComponents.set(id, buttonComponent);
@@ -1,47 +1,42 @@
1
1
  <template>
2
- <v-expansion-panel class="px-2" @change="active = !active">
3
- <v-expansion-panel-header hide-actions>
2
+ <v-expansion-panel @change="active = !active">
3
+ <v-expansion-panel-header hide-actions class="px-2">
4
4
  <template #default="{ open }">
5
5
  <div class="d-flex justify-space-between">
6
6
  <div class="d-flex align-center">
7
7
  <v-icon class="mr-1" :class="{ rotate: !open }">
8
8
  mdi-chevron-down
9
9
  </v-icon>
10
- {{ $t(category.title) }}
10
+ {{ $t(title) }}
11
11
  </div>
12
- <VcsActionButtonList
13
- v-if="category.actions?.length > 0"
14
- :actions="category.actions"
15
- small
16
- class="float-end"
17
- />
12
+ <VcsActionButtonList v-if="actions?.length > 0" :actions="actions" />
18
13
  </div>
19
14
  </template>
20
15
  </v-expansion-panel-header>
21
16
  <v-expansion-panel-content class="pb-1">
22
17
  <vcs-list
23
- :items="category.items.slice(0, 10)"
24
- :draggable="category.draggable"
25
- :selectable="category.selectable"
26
- :single-select="category.singleSelect"
18
+ :items="items.slice(0, 10)"
19
+ :draggable="draggable"
20
+ :selectable="selectable"
21
+ :single-select="singleSelect"
27
22
  v-model="selection"
28
23
  :show-title="false"
29
- @itemMoved="move"
24
+ @item-moved="move"
30
25
  />
31
- <v-sheet v-if="category.items.length > 10" class="ma-2 pl-2">
32
- <VcsButton @click="openCategoryItemWindow" small>
33
- {{ $t('categoryManager.more') }}
26
+ <v-sheet v-if="items.length > 10" class="ma-2 pl-2">
27
+ <VcsButton @click="openCollectionComponentList">
28
+ {{ $t('collectionManager.more') }}
34
29
  </VcsButton>
35
30
  </v-sheet>
36
- <v-sheet v-else-if="category.items.length === 0" class="ma-2 pl-2">
37
- {{ $t('categoryManager.empty') }}
31
+ <v-sheet v-else-if="items.length === 0" class="ma-2 pl-2">
32
+ {{ $t('collectionManager.empty') }}
38
33
  </v-sheet>
39
34
  </v-expansion-panel-content>
40
35
  </v-expansion-panel>
41
36
  </template>
42
37
 
43
38
  <script>
44
- import { computed, inject, ref } from 'vue';
39
+ import { inject, ref } from 'vue';
45
40
  import {
46
41
  VIcon,
47
42
  VExpansionPanel,
@@ -54,11 +49,15 @@
54
49
  import VcsActionButtonList from '../../components/buttons/VcsActionButtonList.vue';
55
50
  import VcsButton from '../../components/buttons/VcsButton.vue';
56
51
  import { vcsAppSymbol } from '../../pluginHelper.js';
57
- import CategoryComponentList from './CategoryComponentList.vue';
58
52
  import { WindowSlot } from '../window/windowManager.js';
53
+ import CollectionComponentList from './CollectionComponentList.vue';
59
54
 
55
+ /**
56
+ * Renders the first ten items of a collectionComponent in a List. Uses CollectionComponentList to render more items.
57
+ * The collectionComponent must be passed via {@link https://vuejs.org/api/composition-api-dependency-injection.html |provide }.
58
+ */
60
59
  export default {
61
- name: 'CategoryComponent',
60
+ name: 'CollectionComponent',
62
61
  components: {
63
62
  VcsActionButtonList,
64
63
  VcsButton,
@@ -69,45 +68,37 @@
69
68
  VSheet,
70
69
  VIcon,
71
70
  },
72
- props: {
73
- category: {
74
- type: Object,
75
- required: true,
76
- },
77
- },
78
- setup(props) {
71
+ setup() {
79
72
  /** @type {VcsUiApp} */
80
73
  const app = inject('vcsApp');
81
- const windowId = `${props.category.id}-category-list`;
82
- const active = ref(false);
83
-
84
- const selection = computed({
85
- get() {
86
- return props.category.selection;
87
- },
88
- set(value) {
89
- // eslint-disable-next-line vue/no-mutating-props
90
- props.category.selection = value;
91
- },
92
- });
93
-
94
- const { collection } = app.categories.getByKey(
95
- props.category.categoryName,
96
- );
97
74
  /**
98
- * index of the first item within the collection
99
- * @type {ComputedRef<number>}
75
+ * @type {CollectionComponent}
100
76
  */
101
- const collectionItemOffset = computed(() => {
102
- return [...collection].findIndex(
103
- (i) => i[collection.uniqueKey] === props.category.items[0]?.id,
104
- );
105
- });
77
+ const collectionComponent = inject('collectionComponent');
78
+ const windowId = `${collectionComponent.id}-list`;
79
+ const active = ref(false);
106
80
 
107
81
  return {
108
- selection,
82
+ title: collectionComponent.title,
83
+ items: collectionComponent.items,
84
+ selection: collectionComponent.selection,
85
+ draggable: collectionComponent.draggable,
86
+ selectable: collectionComponent.selectable,
87
+ singleSelect: collectionComponent.singleSelect,
88
+ actions: collectionComponent.getActions(),
89
+ move({ item, targetIndex }) {
90
+ if (collectionComponent.collection instanceof IndexedCollection) {
91
+ const collectionItem = collectionComponent.collection.getByKey(
92
+ item.name,
93
+ );
94
+ collectionComponent.collection.moveTo(
95
+ collectionItem,
96
+ targetIndex, // collectionItemOffset.value for paginated lists?
97
+ );
98
+ }
99
+ },
109
100
  active,
110
- openCategoryItemWindow() {
101
+ openCollectionComponentList() {
111
102
  if (app.windowManager.has(windowId)) {
112
103
  setTimeout(() => {
113
104
  app.windowManager.bringWindowToTop(windowId);
@@ -116,13 +107,12 @@
116
107
  app.windowManager.add(
117
108
  {
118
109
  id: windowId,
119
- component: CategoryComponentList,
110
+ component: CollectionComponentList,
120
111
  props: {
121
- category: props.category,
122
112
  windowId,
123
113
  },
124
114
  provides: {
125
- selection,
115
+ collectionComponent,
126
116
  },
127
117
  slot: WindowSlot.DYNAMIC_LEFT,
128
118
  },
@@ -130,15 +120,6 @@
130
120
  );
131
121
  }
132
122
  },
133
- move({ item, targetIndex }) {
134
- if (collection instanceof IndexedCollection) {
135
- const collectionItem = collection.getByKey(item.id);
136
- collection.moveTo(
137
- collectionItem,
138
- targetIndex + collectionItemOffset.value,
139
- );
140
- }
141
- },
142
123
  };
143
124
  },
144
125
  };
@@ -148,4 +129,14 @@
148
129
  .rotate {
149
130
  transform: rotate(-90deg);
150
131
  }
132
+ .v-icon {
133
+ font-size: 16px;
134
+ }
135
+ ::v-deep {
136
+ .v-list {
137
+ .v-list-item {
138
+ padding: 4px 8px 4px 28px;
139
+ }
140
+ }
141
+ }
151
142
  </style>
@@ -0,0 +1,62 @@
1
+ <template>
2
+ <vcs-list
3
+ :items="items"
4
+ :draggable="draggable"
5
+ :selectable="selectable"
6
+ :single-select="singleSelect"
7
+ v-model="selection"
8
+ :title="title"
9
+ @item-moved="move"
10
+ />
11
+ </template>
12
+
13
+ <script>
14
+ import { inject } from 'vue';
15
+ import { IndexedCollection } from '@vcmap/core';
16
+ import VcsList from '../../components/lists/VcsList.vue';
17
+
18
+ /**
19
+ * Renders the items of a CollectionComponent in a List.
20
+ * The collectionComponent must be passed via {@link https://vuejs.org/api/composition-api-dependency-injection.html |provide }.
21
+ */
22
+ export default {
23
+ name: 'CollectionComponentList',
24
+ components: {
25
+ VcsList,
26
+ },
27
+ props: {
28
+ windowId: {
29
+ type: String,
30
+ required: true,
31
+ },
32
+ },
33
+ setup() {
34
+ /**
35
+ * @type {CollectionComponent}
36
+ */
37
+ const collectionComponent = inject('collectionComponent');
38
+
39
+ return {
40
+ title: collectionComponent.title,
41
+ items: collectionComponent.items,
42
+ selection: collectionComponent.selection,
43
+ draggable: collectionComponent.draggable,
44
+ selectable: collectionComponent.selectable,
45
+ singleSelect: collectionComponent.singleSelect,
46
+ move({ item, targetIndex }) {
47
+ if (collectionComponent.collection instanceof IndexedCollection) {
48
+ const collectionItem = collectionComponent.collection.getByKey(
49
+ item.id,
50
+ );
51
+ collectionComponent.collection.moveTo(
52
+ collectionItem,
53
+ targetIndex, // collectionItemOffset.value for paginated lists?
54
+ );
55
+ }
56
+ },
57
+ };
58
+ },
59
+ };
60
+ </script>
61
+
62
+ <style lang="scss" scoped></style>
@@ -0,0 +1,38 @@
1
+ <template>
2
+ <div class="w-full">
3
+ <slot>
4
+ <collection-component />
5
+ </slot>
6
+ </div>
7
+ </template>
8
+
9
+ <script>
10
+ import { inject, provide } from 'vue';
11
+ import CollectionComponent from './CollectionComponent.vue';
12
+
13
+ /**
14
+ * Provides a CollectionComponent of a CollectionManager.
15
+ * The collectionManager must be passed via {@link https://vuejs.org/api/composition-api-dependency-injection.html |provide }.
16
+ * @vue-data {slot} [#default] - Slot rendering collection component.
17
+ */
18
+ export default {
19
+ name: 'CollectionManagerProvider',
20
+ components: {
21
+ CollectionComponent,
22
+ },
23
+ props: {
24
+ componentId: {
25
+ type: String,
26
+ required: true,
27
+ },
28
+ },
29
+ setup(props) {
30
+ /**
31
+ * @type {CollectionManager}
32
+ */
33
+ const collectionManager = inject('collectionManager');
34
+ const collectionComponent = collectionManager.get(props.componentId);
35
+ provide('collectionComponent', collectionComponent);
36
+ },
37
+ };
38
+ </script>
@@ -0,0 +1,43 @@
1
+ <template>
2
+ <v-container class="pa-0">
3
+ <v-expansion-panels
4
+ accordion
5
+ multiple
6
+ v-if="componentIds.length > 0"
7
+ class="rounded-0"
8
+ >
9
+ <collection-component-provider
10
+ v-for="componentId in componentIds"
11
+ :component-id="componentId"
12
+ :key="componentId"
13
+ />
14
+ </v-expansion-panels>
15
+ </v-container>
16
+ </template>
17
+
18
+ <script>
19
+ import { inject, ref } from 'vue';
20
+ import { VExpansionPanels, VContainer } from 'vuetify/lib';
21
+ import CollectionComponentProvider from './CollectionComponentProvider.vue';
22
+
23
+ /**
24
+ * Renders the all managed CollectionComponents of a CollectionManager.
25
+ * The collectionManager must be passed via {@link https://vuejs.org/api/composition-api-dependency-injection.html |provide }.
26
+ */
27
+ export default {
28
+ name: 'CollectionManager',
29
+ components: {
30
+ VExpansionPanels,
31
+ VContainer,
32
+ CollectionComponentProvider,
33
+ },
34
+ setup() {
35
+ const collectionManager = inject('collectionManager');
36
+ const componentIds = ref(collectionManager.componentIds);
37
+
38
+ return {
39
+ componentIds,
40
+ };
41
+ },
42
+ };
43
+ </script>