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

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.1457fa.js} +58656 -33170
  82. package/dist/assets/cesium.js +1 -1
  83. package/dist/assets/core.47836f.js +19060 -0
  84. package/dist/assets/core.js +1 -1
  85. package/dist/assets/index-bb372634.js +1 -0
  86. package/dist/assets/{ol.1c946a.js → ol.9e4d23.js} +27344 -12118
  87. package/dist/assets/ol.js +1 -1
  88. package/dist/assets/ui.6ed89d.css +5 -0
  89. package/dist/assets/ui.6ed89d.js +13461 -0
  90. package/dist/assets/ui.js +1 -1
  91. package/dist/assets/{vue.c1ece7.js → vue.7327e4.js} +834 -598
  92. package/dist/assets/vue.js +2 -2
  93. package/dist/assets/{vuetify.6efa21.css → vuetify.d2131d.css} +1 -1
  94. package/dist/assets/{vuetify.6efa21.js → vuetify.d2131d.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 +17 -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/public/assets/logo-mobile.svg +9 -0
  129. package/public/assets/logo.svg +26 -0
  130. package/src/application/VcsApp.vue +34 -5
  131. package/src/application/VcsAttributions.vue +20 -5
  132. package/src/application/VcsAttributionsFooter.vue +0 -1
  133. package/src/application/VcsNavbar.vue +18 -13
  134. package/src/callback/activateLayersCallback.js +54 -0
  135. package/src/callback/applyLayerStyleCallback.js +63 -0
  136. package/src/callback/deactivateLayersCallback.js +54 -0
  137. package/src/callback/goToViewpointCallback.js +54 -0
  138. package/src/callback/vcsCallback.js +66 -0
  139. package/src/components/buttons/VcsActionButtonList.vue +28 -10
  140. package/src/components/buttons/VcsButton.vue +38 -100
  141. package/src/components/buttons/VcsFormButton.vue +6 -4
  142. package/src/components/buttons/VcsToolButton.vue +161 -0
  143. package/src/components/form-inputs-controls/VcsDatePicker.vue +19 -5
  144. package/src/components/form-inputs-controls/VcsFormSection.vue +0 -1
  145. package/src/components/form-inputs-controls/VcsSelect.vue +16 -2
  146. package/src/components/form-inputs-controls/VcsSlider.vue +72 -0
  147. package/src/components/form-inputs-controls/VcsTextField.vue +24 -13
  148. package/src/components/form-inputs-controls/VcsWizard.vue +13 -14
  149. package/src/components/form-inputs-controls/VcsWizardStep.vue +0 -1
  150. package/src/components/lists/VcsList.vue +3 -2
  151. package/src/components/lists/VcsTreeviewLeaf.vue +0 -1
  152. package/src/components/tables/VcsDataTable.vue +2 -4
  153. package/src/contentTree/LayerTree.vue +15 -9
  154. package/src/contentTree/contentTreeCollection.js +1 -1
  155. package/src/contentTree/contentTreeItem.js +22 -3
  156. package/src/contentTree/groupContentTreeItem.js +1 -0
  157. package/src/contentTree/layerContentTreeItem.js +4 -14
  158. package/src/contentTree/layerGroupContentTreeItem.js +4 -14
  159. package/src/contentTree/obliqueCollectionContentTreeItem.js +4 -0
  160. package/src/contentTree/viewpointContentTreeItem.js +1 -0
  161. package/src/featureInfo/BalloonComponent.vue +0 -1
  162. package/src/featureInfo/abstractFeatureInfoView.js +16 -1
  163. package/src/featureInfo/featureInfo.js +45 -56
  164. package/src/i18n/de.js +5 -2
  165. package/src/i18n/en.js +5 -2
  166. package/src/i18n/i18nCollection.js +1 -2
  167. package/src/init.js +1 -4
  168. package/src/legend/vcsLegend.vue +1 -1
  169. package/src/manager/buttonManager.js +15 -0
  170. package/src/manager/{categoryManager/CategoryComponent.vue → collectionManager/CollectionComponent.vue} +57 -66
  171. package/src/manager/collectionManager/CollectionComponentList.vue +62 -0
  172. package/src/manager/collectionManager/CollectionComponentProvider.vue +38 -0
  173. package/src/manager/collectionManager/CollectionManager.vue +43 -0
  174. package/src/manager/collectionManager/categoryManager.js +83 -0
  175. package/src/manager/collectionManager/collectionComponent.js +453 -0
  176. package/src/manager/collectionManager/collectionManager.js +432 -0
  177. package/src/manager/navbarManager.js +5 -4
  178. package/src/manager/toolbox/GroupToolboxComponent.vue +5 -7
  179. package/src/manager/toolbox/SelectToolboxComponent.vue +6 -9
  180. package/src/manager/toolbox/ToolboxManager.vue +4 -5
  181. package/src/manager/window/WindowComponentHeader.vue +0 -4
  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 +2 -2
  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/assets/logo-mobile.svg → dist/assets/logo-mobile.2d10a6.svg} +0 -0
  212. /package/{src/assets/logo.svg → dist/assets/logo.27089a.svg} +0 -0
  213. /package/{src → public}/assets/favicon.svg +0 -0
  214. /package/{src → public}/assets/font/OFL.txt +0 -0
  215. /package/{src → public}/assets/font/TitilliumWeb-Regular.woff2 +0 -0
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>
@@ -0,0 +1,83 @@
1
+ import { moduleIdSymbol } from '@vcmap/core';
2
+ import { vcsAppSymbol } from '../../pluginHelper.js';
3
+ import CollectionManager from './collectionManager.js';
4
+
5
+ /**
6
+ * Manages all requested category collections.
7
+ * Provides an API to add/remove collectionsComponents.
8
+ * @implements {VcsComponentManager<CollectionComponent, CollectionComponentOptions>}
9
+ * @extends CollectionManager
10
+ */
11
+ class CategoryManager extends CollectionManager {
12
+ /**
13
+ * @param {import("@vcmap/ui").VcsUiApp} app
14
+ */
15
+ /**
16
+ * @param {import("@vcmap/ui").VcsUiApp} app
17
+ */
18
+ constructor(app) {
19
+ super();
20
+
21
+ /**
22
+ * @type {import("@vcmap/ui").VcsUiApp}
23
+ * @private
24
+ */
25
+ this._app = app;
26
+ /**
27
+ * @type {string}
28
+ * @private
29
+ */
30
+ this._dynamicModuleId = this._app.dynamicModuleId;
31
+
32
+ this._dynamicModuleIdFilter = (item) =>
33
+ item[moduleIdSymbol] === this._dynamicModuleId;
34
+
35
+ this.addFilterFunction(this._dynamicModuleIdFilter, vcsAppSymbol);
36
+
37
+ this._categoryListeners = [
38
+ this._app.dynamicModuleIdChanged.addEventListener((id) => {
39
+ this._dynamicModuleId = id;
40
+ this.reset();
41
+ }),
42
+ this._app.categories.removed.addEventListener((category) => {
43
+ const collectionComponents = this.getCollection(category.collection);
44
+ collectionComponents.forEach(({ id }) => this.remove(id));
45
+ }),
46
+ ];
47
+ }
48
+
49
+ /**
50
+ * Requests a new or existing category and adds its collection to this manager.
51
+ * The collectionComponent's id is always the category's name.
52
+ * Returns requested category and its corresponding collectionComponent.
53
+ * @param {import("@vcmap/core").CategoryOptions} options
54
+ * @param {string|symbol} owner
55
+ * @param {CollectionComponentUiOptions} collectionComponentOptions
56
+ * @return {{ collectionComponent:CollectionComponent,category:import("@vcmap/core").Category }}
57
+ */
58
+ async requestCategory(options, owner, collectionComponentOptions = {}) {
59
+ const category = await this._app.categories.requestCategory(options);
60
+ const id = category.name;
61
+ if (this.has(id)) {
62
+ const collectionComponent = this.get(id);
63
+ return { collectionComponent, category };
64
+ }
65
+ const collectionComponent = this.add(
66
+ {
67
+ ...collectionComponentOptions,
68
+ id,
69
+ title: collectionComponentOptions.title ?? category.title ?? id,
70
+ collection: category.collection,
71
+ },
72
+ owner,
73
+ );
74
+ return { collectionComponent, category };
75
+ }
76
+
77
+ destroy() {
78
+ super.destroy();
79
+ this._categoryListeners.forEach((cb) => cb());
80
+ }
81
+ }
82
+
83
+ export default CategoryManager;