@vcmap/ui 5.0.0-rc.21 → 5.0.0-rc.23

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 (153) hide show
  1. package/README.md +2 -2
  2. package/app.config.json +5 -0
  3. package/build/buildHelpers.js +1 -0
  4. package/build/buildPreview.js +2 -2
  5. package/build/commonViteConfig.js +1 -0
  6. package/config/aerowest.config.json +2 -0
  7. package/config/base.config.json +1 -0
  8. package/config/codes.config.json +2 -0
  9. package/config/dev.config.json +6 -0
  10. package/config/graphFeatureInfo.config.json +3 -1
  11. package/config/projects.config.json +27 -0
  12. package/config/www.config.json +27 -14
  13. package/dist/assets/cesium.js +1 -1
  14. package/dist/assets/{core.59d4d1.js → core.9342a1.js} +7912 -5474
  15. package/dist/assets/core.js +1 -1
  16. package/dist/assets/favicon.decf54cc.svg +10 -0
  17. package/dist/assets/index.fd041928.js +1 -0
  18. package/dist/assets/{ol.c1c512.js → ol.d2cba3.js} +12406 -12152
  19. package/dist/assets/ol.js +1 -1
  20. package/dist/assets/ui.c27597.css +5 -0
  21. package/dist/assets/{ui.80175f.js → ui.c27597.js} +6508 -5169
  22. package/dist/assets/ui.js +1 -1
  23. package/dist/assets/vue.js +2 -2
  24. package/dist/assets/vuetify.2f1432.css +5 -0
  25. package/dist/assets/{vuetify.efc158.js → vuetify.2f1432.js} +1 -1
  26. package/dist/assets/vuetify.js +2 -2
  27. package/dist/index.html +6 -1
  28. package/index.html +5 -0
  29. package/index.js +7 -3
  30. package/lib/olLib.js +15 -1
  31. package/package.json +5 -4
  32. package/plugins/@vcmap/project-selector/{ContextsListComponent.vue → ModulesListComponent.vue} +10 -10
  33. package/plugins/@vcmap/project-selector/ProjectSelectorComponent.vue +16 -16
  34. package/plugins/@vcmap/project-selector/README.md +15 -21
  35. package/plugins/@vcmap/project-selector/config.json +3 -3
  36. package/plugins/@vcmap/project-selector/de.json +3 -0
  37. package/plugins/@vcmap/project-selector/en.json +3 -0
  38. package/plugins/@vcmap/project-selector/index.js +76 -101
  39. package/plugins/@vcmap/simple-graph/index.js +1 -1
  40. package/plugins/@vcmap/theme-changer/ThemeChangerComponent.vue +10 -4
  41. package/plugins/@vcmap-show-case/category-tester/Categories.vue +2 -2
  42. package/plugins/@vcmap-show-case/category-tester/Category.vue +1 -4
  43. package/plugins/@vcmap-show-case/config-editor/editor.vue +14 -14
  44. package/plugins/@vcmap-show-case/form-inputs-example/FormInputsExample.vue +92 -81
  45. package/plugins/@vcmap-show-case/form-inputs-example/index.js +8 -3
  46. package/plugins/@vcmap-show-case/form-inputs-example/validation.js +1 -1
  47. package/plugins/@vcmap-show-case/list-example/ListExample.vue +5 -2
  48. package/plugins/@vcmap-show-case/table-example/DataTableExample.vue +202 -0
  49. package/plugins/@vcmap-show-case/table-example/README.md +3 -0
  50. package/plugins/@vcmap-show-case/table-example/index.js +47 -0
  51. package/plugins/@vcmap-show-case/table-example/package.json +5 -0
  52. package/plugins/@vcmap-show-case/wizard-example/wizardExample.vue +57 -23
  53. package/plugins/package.json +2 -1
  54. package/src/actions/actionHelper.js +16 -27
  55. package/src/actions/styleSelector.vue +26 -19
  56. package/src/application/VcsApp.vue +13 -5
  57. package/src/application/VcsAttributions.vue +2 -3
  58. package/src/application/VcsAttributionsFooter.vue +10 -16
  59. package/src/application/VcsNavbar.vue +1 -2
  60. package/src/application/VcsSettings.vue +21 -8
  61. package/src/assets/favicon-128.png +0 -0
  62. package/src/assets/favicon-180.png +0 -0
  63. package/src/assets/favicon-192.png +0 -0
  64. package/src/assets/favicon-32.png +0 -0
  65. package/src/assets/favicon.svg +10 -0
  66. package/src/components/buttons/VcsButton.vue +2 -3
  67. package/src/components/form-inputs-controls/VcsCheckbox.vue +46 -26
  68. package/src/components/form-inputs-controls/VcsDatePicker.vue +111 -0
  69. package/src/components/form-inputs-controls/VcsFormSection.vue +15 -13
  70. package/src/components/form-inputs-controls/VcsLabel.vue +10 -1
  71. package/src/components/form-inputs-controls/VcsRadio.vue +38 -18
  72. package/src/components/form-inputs-controls/VcsSelect.vue +117 -59
  73. package/src/components/form-inputs-controls/VcsTextArea.vue +101 -60
  74. package/src/components/form-inputs-controls/VcsTextField.vue +182 -69
  75. package/src/components/form-inputs-controls/VcsWizard.vue +23 -15
  76. package/src/components/form-inputs-controls/VcsWizardStep.vue +18 -16
  77. package/src/components/form-inputs-controls/composables.js +26 -0
  78. package/src/components/form-output/VcsFormattedNumber.vue +1 -1
  79. package/src/components/icons/2DDistanceIcon.vue +0 -3
  80. package/src/components/icons/3DDistanceIcon.vue +0 -3
  81. package/src/components/icons/3DHeightIcon.vue +0 -3
  82. package/src/components/icons/CheckboxCheckedIcon.vue +4 -11
  83. package/src/components/icons/CheckboxIcon.vue +9 -2
  84. package/src/components/icons/CheckboxIndeterminateIcon.vue +4 -21
  85. package/src/components/icons/CommentIcon.vue +1 -5
  86. package/src/components/icons/LegendIcon.vue +10 -60
  87. package/src/components/icons/ObliqueViewIcon.vue +6 -8
  88. package/src/components/icons/SimpleCircleOutlinedIcon.vue +1 -1
  89. package/src/components/icons/SplitViewIcon.vue +0 -4
  90. package/src/components/icons/ToolsIcon.vue +2 -4
  91. package/src/components/lists/VcsActionList.vue +0 -1
  92. package/src/components/lists/VcsList.vue +30 -30
  93. package/src/components/lists/VcsTreeview.vue +2 -2
  94. package/src/components/lists/VcsTreeviewLeaf.vue +3 -9
  95. package/src/components/lists/VcsTreeviewSearchbar.vue +4 -4
  96. package/src/components/notification/VcsBadge.vue +6 -2
  97. package/src/components/notification/VcsHelp.vue +39 -0
  98. package/src/components/tables/VcsDataTable.vue +386 -0
  99. package/src/components/tables/VcsTable.vue +55 -254
  100. package/src/contentTree/contentTreeCollection.js +1 -1
  101. package/src/contentTree/layerContentTreeItem.js +3 -0
  102. package/src/downloadHelper.js +49 -0
  103. package/src/featureInfo/AddressBalloonComponent.vue +1 -1
  104. package/src/featureInfo/BalloonComponent.vue +21 -15
  105. package/src/featureInfo/abstractFeatureInfoView.js +1 -1
  106. package/src/featureInfo/featureInfo.js +27 -9
  107. package/src/featureInfo/tableFeatureInfoView.js +4 -0
  108. package/src/i18n/de.js +13 -1
  109. package/src/i18n/en.js +13 -1
  110. package/src/i18n/i18nCollection.js +22 -22
  111. package/src/init.js +90 -7
  112. package/src/legend/styleLegendItem.vue +24 -2
  113. package/src/legend/vcsLegend.vue +24 -31
  114. package/src/manager/categoryManager/CategoryComponent.vue +56 -47
  115. package/src/manager/categoryManager/CategoryManager.vue +23 -10
  116. package/src/manager/categoryManager/categoryManager.js +11 -11
  117. package/src/manager/navbarManager.js +18 -0
  118. package/src/manager/toolbox/GroupToolboxComponent.vue +2 -3
  119. package/src/manager/toolbox/SelectToolboxComponent.vue +11 -5
  120. package/src/manager/toolbox/ToolboxManager.vue +0 -7
  121. package/src/manager/window/WindowComponent.vue +10 -16
  122. package/src/manager/window/WindowComponentHeader.vue +6 -4
  123. package/src/manager/window/WindowManager.vue +14 -15
  124. package/src/manager/window/windowHelper.js +1 -1
  125. package/src/manager/window/windowManager.js +18 -7
  126. package/src/navigation/mapNavCompass.vue +1 -1
  127. package/src/navigation/mapNavigation.vue +6 -6
  128. package/src/navigation/obliqueRotation.vue +36 -13
  129. package/src/navigation/orientationToolsButton.vue +0 -1
  130. package/src/navigation/overviewMap.js +11 -20
  131. package/src/navigation/tiltSlider.vue +30 -6
  132. package/src/navigation/vcsZoomButton.vue +37 -11
  133. package/src/pluginHelper.js +20 -0
  134. package/src/search/resultsComponent.vue +0 -1
  135. package/src/search/search.js +19 -20
  136. package/src/search/searchComponent.vue +21 -7
  137. package/src/state.js +6 -6
  138. package/src/styles/_theming.scss +72 -3
  139. package/src/styles/_typography.scss +0 -5
  140. package/src/styles/main.scss +1 -0
  141. package/src/styles/shades.scss +2 -0
  142. package/src/styles/variables.scss +40 -4
  143. package/src/uiConfig.js +4 -3
  144. package/src/vcsUiApp.js +49 -40
  145. package/src/vuePlugins/i18n.js +1 -0
  146. package/src/vuePlugins/vuetify.js +59 -13
  147. package/start.js +8 -2
  148. package/dist/assets/index.a3861d4e.js +0 -1
  149. package/dist/assets/ui.80175f.css +0 -1
  150. package/dist/assets/vuetify.efc158.css +0 -5
  151. package/map.config.json +0 -44
  152. /package/dist/assets/{cesium.49585c.js → cesium.166f91.js} +0 -0
  153. /package/dist/assets/{vue.a08ab1.js → vue.5d00e9.js} +0 -0
@@ -0,0 +1,386 @@
1
+ <template>
2
+ <v-card>
3
+ <VcsTreeviewSearchbar
4
+ v-if="showSearchbar"
5
+ :placeholder="$t(searchbarPlaceholder)"
6
+ v-model="search"
7
+ />
8
+ <v-data-table
9
+ dense
10
+ :headers="translatedHeaders"
11
+ :items="items"
12
+ :item-key="itemKey"
13
+ :items-per-page.sync="itemsPerPageRef"
14
+ :page.sync="page"
15
+ :search="search"
16
+ :custom-filter="handleFilter"
17
+ :no-data-text="$attrs.noDataText ?? $t('components.vcsDataTable.noDataPlaceholder')"
18
+ :no-results-text="$attrs.noResultsText ?? $t('components.vcsDataTable.noResultsPlaceholder')"
19
+ :single-select="singleSelect"
20
+ hide-default-footer
21
+ v-bind="$attrs"
22
+ v-on="$listeners"
23
+ class="vcs-table rounded-0"
24
+ >
25
+ <template v-for="(_, slot) of $scopedSlots" #[slot]="scope">
26
+ <slot :name="slot" v-bind="scope" />
27
+ </template>
28
+ <!-- eslint-disable-next-line -->
29
+ <template v-slot:header.data-table-select="{ props, on }">
30
+ <div v-if="on">
31
+ <v-icon
32
+ v-if="value.length === totalNumber"
33
+ @click="on.input(false)"
34
+ class="vcs-select-icon"
35
+ >
36
+ mdi-check-circle-outline
37
+ </v-icon>
38
+ <v-icon
39
+ v-else-if="props.indeterminate"
40
+ @click="on.input(true)"
41
+ class="vcs-select-icon"
42
+ >
43
+ mdi-minus-circle-outline
44
+ </v-icon>
45
+ <v-icon
46
+ v-else
47
+ @click="on.input(true)"
48
+ class="vcs-select-icon"
49
+ >
50
+ mdi-circle-outline
51
+ </v-icon>
52
+ </div>
53
+ </template>
54
+ <!-- eslint-disable-next-line -->
55
+ <template v-slot:item.data-table-select="{ isSelected, select, index }">
56
+ <div
57
+ @mouseover="hovering = index"
58
+ @mouseout="hovering = null"
59
+ >
60
+ <v-icon
61
+ v-if="isSelected"
62
+ @click="select(!isSelected)"
63
+ class="vcs-select-icon"
64
+ >
65
+ mdi-check-circle-outline
66
+ </v-icon>
67
+ <v-icon
68
+ v-else-if="hovering === index || (!singleSelect && value.length > 0)"
69
+ @click="select(!isSelected)"
70
+ class="vcs-select-icon"
71
+ >
72
+ mdi-circle-outline
73
+ </v-icon>
74
+ <v-icon
75
+ v-else
76
+ @click="select(!isSelected)"
77
+ class="vcs-select-icon"
78
+ >
79
+ mdi-circle-small
80
+ </v-icon>
81
+ </div>
82
+ </template>
83
+ <template #footer v-if="items.length > itemsPerPageRef">
84
+ <v-divider />
85
+ <v-container class="pa-2 vcs-pagination-bar">
86
+ <v-row
87
+ dense
88
+ no-gutters
89
+ justify="center"
90
+ >
91
+ <v-menu offset-y dense>
92
+ <template #activator="{ on, attrs }">
93
+ <VcsButton
94
+ small
95
+ color="primary"
96
+ v-bind="attrs"
97
+ v-on="on"
98
+ >
99
+ {{ itemsPerPageRef }}
100
+ <v-icon>mdi-chevron-down</v-icon>
101
+ </VcsButton>
102
+ </template>
103
+ <v-list>
104
+ <v-list-item
105
+ v-for="(number, index) in itemsPerPageArray"
106
+ :key="index"
107
+ @click="updateItemsPerPage(number)"
108
+ style="min-height: auto; height: 24px; text-align: right;"
109
+ >
110
+ <v-list-item-title>{{ number }}</v-list-item-title>
111
+ </v-list-item>
112
+ </v-list>
113
+ </v-menu>
114
+ <span class="mx-2">{{ $t('components.vcsDataTable.itemsPerPage') }}</span>
115
+ <span class="mx-2">
116
+ {{ itemsFrom }} - {{ itemsTo }} {{ $t('components.vcsDataTable.ofItems') }} {{ numberOfItems }}
117
+ </span>
118
+ <VcsButton
119
+ small
120
+ icon="mdi-chevron-left"
121
+ @click="formerPage"
122
+ tooltip="components.vcsDataTable.formerPage"
123
+ :disabled="page < 2"
124
+ class="ml-1"
125
+ />
126
+ <VcsButton
127
+ small
128
+ icon="mdi-chevron-right"
129
+ @click="nextPage"
130
+ tooltip="components.vcsDataTable.nextPage"
131
+ :disabled="page > numberOfPages - 1"
132
+ class="ml-1"
133
+ />
134
+ </v-row>
135
+ </v-container>
136
+ </template>
137
+ </v-data-table>
138
+ </v-card>
139
+ </template>
140
+ <script>
141
+ import { getCurrentInstance, ref, computed } from 'vue';
142
+ import {
143
+ VCard,
144
+ VDivider,
145
+ VContainer,
146
+ VDataTable,
147
+ VList,
148
+ VListItem,
149
+ VListItemTitle,
150
+ VMenu,
151
+ VIcon,
152
+ VRow,
153
+ } from 'vuetify/lib';
154
+ import VcsTreeviewSearchbar from '../lists/VcsTreeviewSearchbar.vue';
155
+ import VcsButton from '../buttons/VcsButton.vue';
156
+
157
+ /**
158
+ * @description A wrapper around {@link https://vuetifyjs.com/en/api/v-data-table/#props v-data-table } with custom pagination
159
+ * @vue-prop {Array<Object>} items - array of items, where each item must provide a unique key
160
+ * @vue-prop {string} itemKey - the key property, which is unique on all items.
161
+ * @vue-prop {Array<{text: string, value: string}>} [headers] - optional array defining column names. Text will be translated
162
+ * @vue-prop {boolean} [showSearchbar=true] - whether to show searchbar
163
+ * @vue-prop {string} [searchbarPlaceholder] - placeholder for searchbar
164
+ * @vue-prop {boolean} [singleSelect=false]
165
+ * @vue-computed {Array<TableItem>} filteredItems - array of items with search filter applied on. If search string is empty, same as items array.
166
+ * @vue-computed {Array<import("vuetify").DataTableHeader>} translatedHeaders - array of translated header items.
167
+ * @vue-computed {number} numberOfItems - number of filtered items (depending on search).
168
+ * @vue-computed {number} numberOfPages - number of pages depending on number of items, search and itemsPerPage.
169
+ * @vue-computed {number} itemsFrom - index of first item shown on current page.
170
+ * @vue-computed {number} itemsTo - index of last item shown on current page.
171
+ */
172
+ export default {
173
+ name: 'VcsDataTable',
174
+ components: {
175
+ VcsButton,
176
+ VcsTreeviewSearchbar,
177
+ VCard,
178
+ VDataTable,
179
+ VContainer,
180
+ VDivider,
181
+ VRow,
182
+ VMenu,
183
+ VIcon,
184
+ VList,
185
+ VListItem,
186
+ VListItemTitle,
187
+ },
188
+ props: {
189
+ headers: {
190
+ type: Array,
191
+ default: () => [],
192
+ },
193
+ items: {
194
+ type: Array,
195
+ default: () => [],
196
+ },
197
+ itemKey: {
198
+ type: String,
199
+ required: true,
200
+ },
201
+ itemsPerPage: {
202
+ type: Number,
203
+ default: 10,
204
+ },
205
+ itemsPerPageArray: {
206
+ type: Array,
207
+ default: () => [5, 10, 15],
208
+ },
209
+ showSearchbar: {
210
+ type: Boolean,
211
+ default: true,
212
+ },
213
+ searchbarPlaceholder: {
214
+ type: String,
215
+ default: 'components.vcsDataTable.searchbarPlaceholder',
216
+ },
217
+ singleSelect: {
218
+ type: Boolean,
219
+ default: false,
220
+ },
221
+ value: {
222
+ type: Array,
223
+ default: () => [],
224
+ },
225
+ },
226
+ setup(props) {
227
+ const vm = getCurrentInstance().proxy;
228
+ const hovering = ref(null);
229
+ /**
230
+ * @type {Ref<UnwrapRef<string>>}
231
+ */
232
+ const search = ref('');
233
+
234
+ /**
235
+ * @param {any} value
236
+ * @param {string|undefined} filter
237
+ * @param {TableItem} item
238
+ * @returns {boolean}
239
+ */
240
+ const handleFilter = (value, filter, item) => {
241
+ if (filter) {
242
+ const q = filter.toLocaleLowerCase();
243
+ return Object.values(item).some((i) => {
244
+ const content = i.toString();
245
+ const translated = vm.$t(content);
246
+ return translated.toLowerCase().includes(q) || content.toLowerCase().includes(q);
247
+ });
248
+ }
249
+ return true;
250
+ };
251
+
252
+ /**
253
+ * @type {ComputedRef<Array<Object>>}
254
+ */
255
+ const filteredItems = computed(() => props.items
256
+ .filter(item => handleFilter(item.value, search.value, item)));
257
+ const numberOfItems = computed(() => filteredItems.value.length);
258
+ const totalNumber = computed(() => props.items.length);
259
+
260
+ /**
261
+ * @type {ComputedRef<Array<Object>>}
262
+ */
263
+ const translatedHeaders = computed(() => {
264
+ return props.headers.map((hd) => {
265
+ hd.text = vm.$t(hd.text);
266
+ return hd;
267
+ });
268
+ });
269
+
270
+ /**
271
+ * @type {Ref<UnwrapRef<number>>}
272
+ */
273
+ const itemsPerPageRef = ref(props.itemsPerPage);
274
+ const numberOfPages = computed(() => {
275
+ return Math.ceil(numberOfItems.value / itemsPerPageRef.value);
276
+ });
277
+ /**
278
+ * @type {Ref<UnwrapRef<number>>}
279
+ */
280
+ const page = ref(1);
281
+ const itemsFrom = computed(() => ((page.value - 1) * itemsPerPageRef.value) + 1);
282
+ const itemsTo = computed(() => {
283
+ const last = page.value * itemsPerPageRef.value;
284
+ return last < numberOfItems.value ? last : numberOfItems.value;
285
+ });
286
+
287
+ return {
288
+ hovering,
289
+ search,
290
+ page,
291
+ filteredItems,
292
+ itemsPerPageRef,
293
+ itemsFrom,
294
+ itemsTo,
295
+ numberOfPages,
296
+ numberOfItems,
297
+ totalNumber,
298
+ nextPage() {
299
+ if (page.value + 1 <= numberOfPages.value) {
300
+ page.value += 1;
301
+ }
302
+ },
303
+ formerPage() {
304
+ if (page.value - 1 >= 1) {
305
+ page.value -= 1;
306
+ }
307
+ },
308
+ updateItemsPerPage(number) {
309
+ itemsPerPageRef.value = number;
310
+ },
311
+ handleFilter,
312
+ translatedHeaders,
313
+ };
314
+ },
315
+ };
316
+ </script>
317
+
318
+ <style lang="scss" scoped>
319
+ @import '../../styles/shades.scss';
320
+
321
+ .vcs-select-icon {
322
+ &.v-icon {
323
+ font-size: 16px;
324
+ .v-icon__component {
325
+ width: 16px;
326
+ height: 16px;
327
+ }
328
+ }
329
+ }
330
+
331
+ ::v-deep {
332
+ .vcs-table {
333
+ tbody tr {
334
+ &:hover {
335
+ background-color: transparent !important;
336
+ }
337
+ &:nth-child(odd) {
338
+ background-color: var(--v-base-lighten4) !important;
339
+ }
340
+ }
341
+ td {
342
+ font-size: 14px !important;
343
+ &.v-data-table__mobile-row {
344
+ justify-content: left;
345
+ height: 27px;
346
+ min-height: auto;
347
+ }
348
+ }
349
+ th.sortable {
350
+ padding: 0 8px;
351
+ overflow: hidden;
352
+ white-space: nowrap;
353
+ span {
354
+ vertical-align: middle;
355
+ padding: 0 4px 0 0;
356
+ }
357
+ }
358
+ &.theme--light {
359
+ thead tr th {
360
+ color: map-get($shades, 'black') !important;
361
+ }
362
+ }
363
+ &.theme--dark {
364
+ thead tr th {
365
+ color: map-get($shades, 'white') !important;
366
+ }
367
+ }
368
+ }
369
+ .v-btn.vcs-button--small {
370
+ height: 100% !important;
371
+ display: block;
372
+ }
373
+ }
374
+
375
+ .vcs-pagination-bar {
376
+ .vcs-button-wrap {
377
+ height: 25px;
378
+ border: 1px solid;
379
+ padding: 0 4px;
380
+ border-radius: 4px;
381
+ &:hover {
382
+ border: 1px solid var(--v-primary-base);
383
+ }
384
+ }
385
+ }
386
+ </style>