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

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 (101) hide show
  1. package/build/buildHelpers.js +1 -0
  2. package/build/commonViteConfig.js +1 -0
  3. package/config/www.config.json +25 -14
  4. package/dist/assets/cesium.js +1 -1
  5. package/dist/assets/{core.59d4d1.js → core.a66593.js} +2443 -2457
  6. package/dist/assets/core.js +1 -1
  7. package/dist/assets/favicon.decf54cc.svg +10 -0
  8. package/dist/assets/{index.a3861d4e.js → index.8b833ead.js} +1 -1
  9. package/dist/assets/{ol.c1c512.js → ol.d4539f.js} +12406 -12152
  10. package/dist/assets/ol.js +1 -1
  11. package/dist/assets/ui.d760e4.css +5 -0
  12. package/dist/assets/{ui.80175f.js → ui.d760e4.js} +5218 -4240
  13. package/dist/assets/ui.js +1 -1
  14. package/dist/assets/vue.js +2 -2
  15. package/dist/assets/vuetify.427322.css +5 -0
  16. package/dist/assets/{vuetify.efc158.js → vuetify.427322.js} +1 -1
  17. package/dist/assets/vuetify.js +2 -2
  18. package/dist/index.html +6 -1
  19. package/index.html +5 -0
  20. package/index.js +2 -1
  21. package/lib/olLib.js +15 -1
  22. package/package.json +4 -3
  23. package/plugins/@vcmap/project-selector/ProjectSelectorComponent.vue +1 -1
  24. package/plugins/@vcmap/theme-changer/ThemeChangerComponent.vue +10 -4
  25. package/plugins/@vcmap-show-case/form-inputs-example/FormInputsExample.vue +75 -81
  26. package/plugins/@vcmap-show-case/form-inputs-example/index.js +7 -3
  27. package/plugins/@vcmap-show-case/form-inputs-example/validation.js +1 -1
  28. package/plugins/@vcmap-show-case/list-example/ListExample.vue +5 -2
  29. package/plugins/@vcmap-show-case/wizard-example/wizardExample.vue +57 -23
  30. package/plugins/package.json +2 -1
  31. package/src/application/VcsApp.vue +13 -5
  32. package/src/application/VcsAttributions.vue +2 -3
  33. package/src/application/VcsAttributionsFooter.vue +10 -16
  34. package/src/application/VcsNavbar.vue +1 -2
  35. package/src/application/VcsSettings.vue +21 -8
  36. package/src/assets/favicon-128.png +0 -0
  37. package/src/assets/favicon-180.png +0 -0
  38. package/src/assets/favicon-192.png +0 -0
  39. package/src/assets/favicon-32.png +0 -0
  40. package/src/assets/favicon.svg +10 -0
  41. package/src/components/buttons/VcsButton.vue +2 -3
  42. package/src/components/form-inputs-controls/VcsCheckbox.vue +46 -26
  43. package/src/components/form-inputs-controls/VcsFormSection.vue +15 -13
  44. package/src/components/form-inputs-controls/VcsLabel.vue +10 -1
  45. package/src/components/form-inputs-controls/VcsRadio.vue +38 -18
  46. package/src/components/form-inputs-controls/VcsSelect.vue +117 -59
  47. package/src/components/form-inputs-controls/VcsTextArea.vue +101 -60
  48. package/src/components/form-inputs-controls/VcsTextField.vue +171 -69
  49. package/src/components/form-inputs-controls/VcsWizard.vue +20 -14
  50. package/src/components/form-inputs-controls/VcsWizardStep.vue +18 -16
  51. package/src/components/form-inputs-controls/composables.js +26 -0
  52. package/src/components/form-output/VcsFormattedNumber.vue +1 -1
  53. package/src/components/icons/2DDistanceIcon.vue +0 -3
  54. package/src/components/icons/3DDistanceIcon.vue +0 -3
  55. package/src/components/icons/3DHeightIcon.vue +0 -3
  56. package/src/components/icons/CheckboxCheckedIcon.vue +4 -11
  57. package/src/components/icons/CheckboxIcon.vue +9 -2
  58. package/src/components/icons/CheckboxIndeterminateIcon.vue +4 -21
  59. package/src/components/icons/CommentIcon.vue +1 -5
  60. package/src/components/icons/ObliqueViewIcon.vue +6 -8
  61. package/src/components/icons/SimpleCircleOutlinedIcon.vue +1 -1
  62. package/src/components/icons/SplitViewIcon.vue +0 -4
  63. package/src/components/icons/ToolsIcon.vue +2 -4
  64. package/src/components/lists/VcsActionList.vue +0 -1
  65. package/src/components/lists/VcsList.vue +6 -25
  66. package/src/components/lists/VcsTreeview.vue +2 -2
  67. package/src/components/lists/VcsTreeviewLeaf.vue +3 -9
  68. package/src/components/lists/VcsTreeviewSearchbar.vue +4 -4
  69. package/src/components/notification/VcsBadge.vue +6 -2
  70. package/src/components/notification/VcsHelp.vue +39 -0
  71. package/src/components/tables/VcsTable.vue +70 -24
  72. package/src/featureInfo/AddressBalloonComponent.vue +1 -1
  73. package/src/featureInfo/BalloonComponent.vue +14 -9
  74. package/src/featureInfo/featureInfo.js +25 -7
  75. package/src/featureInfo/tableFeatureInfoView.js +4 -0
  76. package/src/i18n/de.js +5 -1
  77. package/src/i18n/en.js +5 -1
  78. package/src/legend/styleLegendItem.vue +24 -2
  79. package/src/legend/vcsLegend.vue +24 -31
  80. package/src/manager/toolbox/GroupToolboxComponent.vue +2 -3
  81. package/src/manager/toolbox/SelectToolboxComponent.vue +11 -5
  82. package/src/manager/toolbox/ToolboxManager.vue +0 -7
  83. package/src/manager/window/WindowComponent.vue +0 -1
  84. package/src/manager/window/WindowComponentHeader.vue +2 -2
  85. package/src/navigation/overviewMap.js +6 -15
  86. package/src/navigation/tiltSlider.vue +30 -6
  87. package/src/search/resultsComponent.vue +0 -1
  88. package/src/search/search.js +7 -17
  89. package/src/search/searchComponent.vue +6 -7
  90. package/src/styles/_theming.scss +72 -3
  91. package/src/styles/_typography.scss +0 -5
  92. package/src/styles/main.scss +1 -0
  93. package/src/styles/shades.scss +2 -0
  94. package/src/styles/variables.scss +40 -4
  95. package/src/uiConfig.js +1 -0
  96. package/src/vcsUiApp.js +5 -0
  97. package/src/vuePlugins/vuetify.js +59 -13
  98. package/dist/assets/ui.80175f.css +0 -1
  99. package/dist/assets/vuetify.efc158.css +0 -5
  100. /package/dist/assets/{cesium.49585c.js → cesium.88cffd.js} +0 -0
  101. /package/dist/assets/{vue.a08ab1.js → vue.db5102.js} +0 -0
@@ -9,11 +9,7 @@
9
9
  d="M10942,13196v-22a1,1,0,1,1,2,0v22a1,1,0,1,1-2,0Zm9.5-9.25v-.5a.5.5,0,0,0-.5-.5h-4v-2h4a.5.5,0,0,0,.5-.5v-.5a.75.75,0,0,1,1.281-.53l2,2a.747.747,0,0,1,0,1.06l-2,2a.757.757,0,0,1-.529.218A.748.748,0,0,1,10951.5,13186.75Zm-18.279.53-2-2a.75.75,0,0,1,0-1.063l2-2a.736.736,0,0,1,.526-.219.747.747,0,0,1,.752.749v.5a.5.5,0,0,0,.5.5h4v2h-4a.5.5,0,0,0-.5.5v.5a.763.763,0,0,1-.218.534.754.754,0,0,1-1.061,0Zm5.779-1.53Zm8-2Z"
10
10
  transform="translate(-10931 -13172.998)"
11
11
  fill="currentColor"
12
- stroke="rgba(0,0,0,0)"
13
- stroke-miterlimit="10"
14
- stroke-width="1"
15
12
  />
16
- <rect id="size" width="24" height="24" fill="none" />
17
13
  </g>
18
14
  </svg>
19
15
  </template>
@@ -1,9 +1,7 @@
1
1
  <!-- eslint-disable max-len -->
2
2
  <template>
3
3
  <svg id="icon_24_tools" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
4
- <g id="Gruppe_1966" transform="translate(-500.726 -577.125)">
5
- <path id="Pfad_763" d="M519,578h-6a1,1,0,0,0-1,1v20a1,1,0,0,0,1,1h6a1,1,0,0,0,1-1V579A1,1,0,0,0,519,578Zm-1,20h-4v-2h1a1,1,0,0,0,0-2h-1v-2h1a1,1,0,0,0,0-2h-1v-2h1a1,1,0,0,0,0-2h-1v-2h1a1,1,0,0,0,0-2h-1v-2h4Z" transform="translate(0.726 0.125)" fill="currentColor" />
6
- <path id="Pfad_764" d="M507.363,580.719a1,1,0,0,0-1.827,0l-2,4.5a1,1,0,0,0-.086.406v11.5a3,3,0,0,0,6,0v-11.5a1,1,0,0,0-.087-.406Zm-1.913,6.9h2v7.511h-2Zm1-4.027.9,2.027h-1.8Zm0,14.538a1,1,0,0,1-1-1h2A1,1,0,0,1,506.45,598.125Z" transform="translate(0.275)" fill="currentColor" />
7
- </g>
4
+ <rect width="24" height="24" fill="none" />
5
+ <path d="M86.444,100.021l.363-.363a4.962,4.962,0,0,0,5.509-6.213,1,1,0,0,0-1.674-.451l-1.021,1.021a1.024,1.024,0,0,1-1.415,0,1,1,0,0,1,0-1.414l1.022-1.021a1,1,0,0,0-.451-1.674,4.962,4.962,0,0,0-6.213,5.51l-.363.363-3.03-3.03a1.008,1.008,0,0,0-.348-.227l-4.6-1.767a1,1,0,0,0-1.292,1.293l1.768,4.6a1,1,0,0,0,.226.348l3.03,3.03-.766.766A4.963,4.963,0,0,0,71.683,107a1,1,0,0,0,.707.71,1.016,1.016,0,0,0,.968-.259l1.02-1.021a1,1,0,1,1,1.415,1.414l-1.022,1.021a1,1,0,0,0,.452,1.674,5.045,5.045,0,0,0,1.286.167,4.951,4.951,0,0,0,4.926-5.677l.766-.766,4.394,4.395a3,3,0,0,0,4.244-4.242Zm-8.765-5.8L76.4,95.5l-.8-2.069Zm.07,2.757,1.414-1.414,1.624,1.624-1.414,1.414Zm1.895,7.01a1,1,0,0,0-.26.962,2.969,2.969,0,0,1-1.588,3.472,3,3,0,0,0-4-4,2.969,2.969,0,0,1,3.472-1.59,1,1,0,0,0,.963-.26l6.127-6.127a1,1,0,0,0,.259-.962A2.972,2.972,0,0,1,86.2,92.018a3.006,3.006,0,0,0,.589,3.412,3.068,3.068,0,0,0,3.412.588,2.966,2.966,0,0,1-3.471,1.588,1,1,0,0,0-.963.26Zm9.78,3.251a1.022,1.022,0,0,1-1.414,0l-4.4-4.4,1.415-1.414,4.394,4.4a1,1,0,0,1,0,1.414" transform="translate(-69.515 -87.739)" fill="currentColor" />
8
6
  </svg>
9
7
  </template>
@@ -12,7 +12,6 @@
12
12
  <template #activator="{ on, attrs }">
13
13
  <v-list-item
14
14
  :class="action.active ? 'primary--text' : ''"
15
- color="primary"
16
15
  @click="action.callback($event)"
17
16
  v-bind="{...$attrs, ...attrs}"
18
17
  v-on="{...$listeners, ...on}"
@@ -418,38 +418,19 @@
418
418
 
419
419
  <style lang="scss" scoped>
420
420
  ::v-deep {
421
- .v-list{
421
+ .v-list {
422
422
  .v-list-item {
423
423
  padding: 4px 8px 4px 16px;
424
424
  &:after{
425
425
  display: none;
426
426
  }
427
- &.font-weight-bold{
428
- .v-list-item__title{
427
+ &.font-weight-bold {
428
+ .v-list-item__title {
429
429
  font-weight: 700;
430
430
  }
431
431
  }
432
- &.v-list-item--active{
433
- padding: 4px 8px 3px 16px;
434
- &.theme--light{
435
- background-color: var(--v-primary-base);
436
- border-bottom: 1px solid var(--v-primary-darken1);
437
- }
438
- }
439
- &.v-list-item.theme--dark{
440
- &.v-list-item--active{
441
- background-color: var(--v-primary-darken1);
442
- border-bottom: 1px solid var(--v-primary-darken2);
443
- &:nth-child(even){
444
- background-color: var(--v-primary-darken1);
445
- }
446
- }
447
- &:nth-child(even){
448
- background-color: rgba(255, 255, 255, 0.15);
449
- }
450
- }
451
432
  &:nth-child(even) {
452
- background-color: var(--v-accent-base);
433
+ background-color: var(--v-base-lighten4);
453
434
  }
454
435
  .v-list-item__action {
455
436
  .v-icon {
@@ -463,9 +444,9 @@
463
444
  .action-btn-wrap {
464
445
  flex: 1 1 auto;
465
446
  }
466
- .v-icon{
447
+ .v-icon {
467
448
  font-size: 16px;
468
- .v-icon__component{
449
+ .v-icon__component {
469
450
  width: 16px;
470
451
  height: 16px;
471
452
  }
@@ -32,8 +32,8 @@
32
32
  min-height: 40px;
33
33
  }
34
34
  // Border around root nodes with children included
35
- > .v-treeview-node {
36
- border-bottom: 1px solid var(--v-gray-200-base);
35
+ > .v-treeview-node:not(:last-child) {
36
+ border-bottom: 1px solid var(--v-base-lighten2);
37
37
  }
38
38
  // Only Root Entries have a bold font
39
39
  > .v-treeview-node > .v-treeview-node__root > .v-treeview-node__content > .v-treeview-node__label {
@@ -4,10 +4,11 @@
4
4
  v-if="item"
5
5
  >
6
6
  <div
7
- class="position-relative col-8 pa-0 d-flex align-center vcs-treeview-leaf"
7
+ class="position-relative col-8 pa-0 d-flex align-center"
8
8
  >
9
9
  <span
10
10
  v-if="item.icon"
11
+ class="d-inline-flex"
11
12
  >
12
13
  <v-icon
13
14
  v-if="isStringIcon"
@@ -24,7 +25,7 @@
24
25
  <span
25
26
  v-bind="attrs"
26
27
  v-on="on"
27
- class="vcs-treeview-item-title"
28
+ class="d-inline-block text-truncate"
28
29
  >{{ $t(item.title) }}</span>
29
30
  </template>
30
31
  </VcsTooltip>
@@ -41,13 +42,6 @@
41
42
  />
42
43
  </div>
43
44
  </template>
44
- <style lang="css" scoped>
45
- .vcs-treeview-leaf .vcs-treeview-item-title{
46
- white-space: nowrap;
47
- overflow: hidden;
48
- text-overflow: ellipsis;
49
- }
50
- </style>
51
45
 
52
46
  <script>
53
47
  import { computed } from 'vue';
@@ -1,5 +1,5 @@
1
1
  <template>
2
- <div class="pa-2 accent position-relative d-flex flex-row justify-space-between align-center">
2
+ <div class="pa-2 base lighten-3 position-relative d-flex flex-row justify-space-between align-center rounded-0">
3
3
  <slot name="prepend">
4
4
  <v-icon
5
5
  class="search-icon my-0 ml-1"
@@ -14,7 +14,7 @@
14
14
  solo
15
15
  dense
16
16
  hide-details
17
- class="searchbar outlined rounded-xl align-center d-flex justify-center white pa-1 pl-6"
17
+ class="searchbar outlined rounded-xl align-center d-flex justify-center base lighten-4 pa-1 pl-6"
18
18
  :placeholder="$t(placeholder)"
19
19
  :value="value"
20
20
  v-on="$listeners"
@@ -44,7 +44,7 @@
44
44
  border-radius: 9999rem;
45
45
  outline-style: none;
46
46
  font-size: 12px;
47
- box-shadow: 0 0 0 1px #dedede;
47
+ box-shadow: 0 0 0 1px var(--v-base-lighten2);
48
48
 
49
49
  &:focus {
50
50
  box-shadow: 0 0 0 1px var(--v-primary-base);
@@ -81,7 +81,7 @@
81
81
  .v-input.outlined {
82
82
  outline-style: none;
83
83
  font-size: 12px;
84
- box-shadow: 0 0 0 1px #dedede;
84
+ box-shadow: 0 0 0 1px var(--v-base-lighten2);
85
85
 
86
86
  &:focus,
87
87
  &.v-input--is-focused {
@@ -3,9 +3,13 @@
3
3
  </template>
4
4
 
5
5
  <style lang="scss" scoped>
6
- .v-application .badge {
7
- border: 1px solid var(--v-basic-base) !important;
6
+ @import '../../styles/shades.scss';
7
+ .v-application .theme--light .badge {
8
+ border: 1px solid map-get($shades, 'white') !important;
8
9
  }
10
+ .v-application .theme--dark .badge {
11
+ border: 1px solid map-get($shades, 'black') !important;
12
+ }
9
13
  </style>
10
14
 
11
15
 
@@ -0,0 +1,39 @@
1
+ <template>
2
+ <v-alert
3
+ :value="show"
4
+ dense
5
+ text
6
+ class="mb-0 font-weight-regular rounded-0 px-2 pt-2"
7
+ >
8
+ <slot>
9
+ <span>{{ $t(text) }}</span>
10
+ </slot>
11
+ </v-alert>
12
+ </template>
13
+
14
+ <script>
15
+ import { VAlert } from 'vuetify/lib';
16
+
17
+ /**
18
+ * @description Wraps Vuetify VAlert for displaying help.
19
+ * @vue-data {slot} [#default] - Slot to specify html based help. Gets precedence over text prop.
20
+ * @vue-prop {boolean} show - If help should be displayed. If false, component is completely hidden.
21
+ * @vue-prop {string} [text] - Optional help text. Must be plain string. Use 'help' slot for html based help texts. Help slot has precedence over text prop.
22
+ */
23
+ export default {
24
+ name: 'VcsHelp',
25
+ components: {
26
+ VAlert,
27
+ },
28
+ props: {
29
+ text: {
30
+ type: String,
31
+ default: undefined,
32
+ },
33
+ show: {
34
+ type: Boolean,
35
+ required: true,
36
+ },
37
+ },
38
+ };
39
+ </script>
@@ -15,27 +15,36 @@
15
15
  :search="search"
16
16
  :custom-filter="handleFilter"
17
17
  hide-default-footer
18
- class="vcs-table"
18
+ class="vcs-table rounded-0"
19
19
  >
20
20
  <!-- eslint-disable-next-line -->
21
21
  <template #item.key="{ item }">
22
- <td class="vcs-table px-2 overflow-max-width" :title="$t(item.key)">
22
+ <td
23
+ :title="$t(item.key)"
24
+ class="vcs-table px-2 overflow-max-width rounded-0 noBorder"
25
+ :style="{'max-width': headers[0].width }"
26
+ >
23
27
  {{ $t(item.key) }}
24
28
  </td>
25
29
  </template>
26
30
  <!-- eslint-disable-next-line -->
27
31
  <template #item.value="{ item }">
28
- <td class="vcs-table px-2 overflow-max-width" :title="$t(item.value)">
29
- {{ $t(item.value) }}
32
+ <td
33
+ :title="$t(item.value)"
34
+ class="vcs-table px-2 overflow-max-width rounded-0 noBorder"
35
+ :style="{'max-width': headers[1].width }"
36
+ >
37
+ <span :class="{ 'single-line': !/\s/.test(item.value), 'multi-line': /\s/.test(item.value), }">
38
+ {{ $t(item.value) }}
39
+ </span>
30
40
  </td>
31
41
  </template>
32
- <template #footer>
42
+ <template #footer v-if="items.length > itemsPerPageRef">
33
43
  <v-divider />
34
- <v-container class="pa-2 vcs-pagination-bar accent" v-if="items.length > itemsPerPageRef">
44
+ <v-container class="pa-2 vcs-pagination-bar">
35
45
  <v-row
36
46
  dense
37
47
  no-gutters
38
- align="center"
39
48
  justify="center"
40
49
  >
41
50
  <v-menu offset-y dense>
@@ -291,46 +300,83 @@
291
300
  </script>
292
301
 
293
302
  <style lang="scss" scoped>
294
- ::v-deep{
303
+ @import '../../styles/shades.scss';
304
+
305
+ .single-line {
306
+ display: block;
307
+ white-space: nowrap;
308
+ overflow: hidden;
309
+ text-overflow: ellipsis;
310
+ }
311
+ .multi-line {
312
+ display: -webkit-box;
313
+ -webkit-box-orient: vertical;
314
+ -webkit-line-clamp: 3;
315
+ overflow: hidden;
316
+ height: auto;
317
+ max-height: 96px;
318
+ }
319
+
320
+ .noBorder {
321
+ border-bottom: none !important;
322
+ }
323
+
324
+ ::v-deep {
295
325
  .vcs-table {
296
- td {
297
- overflow: hidden;
298
- text-overflow: ellipsis;
299
- white-space: nowrap;
300
- &.overflow-max-width{
301
- max-width: 160px;
326
+ tbody tr {
327
+ &:hover {
328
+ background-color: transparent !important;
329
+ }
330
+ &:nth-child(odd) {
331
+ background-color: var(--v-base-lighten4) !important;
302
332
  }
303
- &.v-data-table__mobile-row{
333
+ }
334
+ td {
335
+ font-size: 14px !important;
336
+ &.v-data-table__mobile-row {
304
337
  justify-content: left;
305
338
  height: 27px;
306
339
  min-height: auto;
307
340
  }
308
341
  }
309
- th.sortable{
342
+ th.sortable {
310
343
  padding: 0 8px;
311
- span{
344
+ span {
312
345
  vertical-align: middle;
313
346
  padding: 0 4px 0 0;
314
347
  }
315
348
  }
349
+ &.theme--light {
350
+ thead tr th {
351
+ color: map-get($shades, 'black') !important;
352
+ }
353
+ }
354
+ &.theme--dark {
355
+ thead tr th {
356
+ color: map-get($shades, 'white') !important;
357
+ }
358
+ }
316
359
  }
317
- .v-data-table__mobile-row__cell{
318
- td.vcs-table.overflow-max-width{
360
+ .v-data-table__mobile-row__cell {
361
+ td.vcs-table.overflow-max-width {
319
362
  max-width: 260px;
320
363
  }
321
364
  }
322
- .v-btn.vcs-button--small{
365
+ .v-btn.vcs-button--small {
323
366
  height: 100% !important;
324
367
  display: block;
325
368
  }
326
369
  }
327
- .vcs-pagination-bar{
328
- .vcs-button-wrap{
370
+
371
+ .vcs-pagination-bar {
372
+ .vcs-button-wrap {
329
373
  height: 25px;
330
- border: 1px solid lightgrey;
374
+ border: 1px solid;
331
375
  padding: 0 4px;
332
- background-color: var(--v-basic-base);
333
376
  border-radius: 4px;
377
+ &:hover {
378
+ border: 1px solid var(--v-primary-base);
379
+ }
334
380
  }
335
381
  }
336
382
  </style>
@@ -8,7 +8,7 @@
8
8
  tile
9
9
  size="40"
10
10
  >
11
- <v-icon size="20" color="secondary">
11
+ <v-icon size="20">
12
12
  $vcsHomePoint
13
13
  </v-icon>
14
14
  </v-list-item-avatar>
@@ -1,6 +1,6 @@
1
1
  <template>
2
2
  <v-card
3
- class="mx-auto mb-1 elevation-0"
3
+ class="mx-auto elevation-0 rounded-0"
4
4
  max-width="400"
5
5
  v-if="position"
6
6
  >
@@ -16,8 +16,10 @@
16
16
  </v-icon>
17
17
  </v-list-item-avatar>
18
18
  <v-list-item-content class="py-2 pr-1 align-self-start">
19
- <v-list-item-title class="text-h6">
20
- {{ $t(balloonTitle) }}
19
+ <v-list-item-title>
20
+ <h3 class="font-weight-bold">
21
+ {{ $t(balloonTitle) }}
22
+ </h3>
21
23
  </v-list-item-title>
22
24
  <v-list-item-subtitle v-if="balloonSubtitle">
23
25
  {{ $t(balloonSubtitle) }}
@@ -28,15 +30,16 @@
28
30
  small
29
31
  icon="mdi-close-thick"
30
32
  tooltip="components.close"
33
+ class="mt-1 mr-1"
31
34
  />
32
35
  </v-list-item>
33
36
  </slot>
34
37
 
35
38
  <v-divider />
36
39
 
37
- <v-card class="overflow-y-auto py-2 elevation-0" max-height="250">
40
+ <v-card class="overflow-y-auto py-2 elevation-0" max-height="250" color="transparent">
38
41
  <slot :attrs="{...$props, ...$attrs}">
39
- <v-list v-for="(value, name, index) in attributes" :key="`attribute-${index}`">
42
+ <v-list v-for="(value, name, index) in attributes" :key="`attribute-${index}`" color="transparent">
40
43
  <v-list-item class="px-2">
41
44
  <v-list-item-content>
42
45
  <v-list-item-title>
@@ -150,6 +153,8 @@
150
153
  </script>
151
154
 
152
155
  <style lang="scss">
156
+ @import '../styles/shades.scss';
157
+
153
158
  .balloon {
154
159
  z-index: 0 !important;
155
160
  }
@@ -166,11 +171,11 @@
166
171
  display: block;
167
172
  width: 0;
168
173
  }
169
- .v-sheet.theme--light.balloon:after{
170
- border-color: #FFFFFF transparent;
174
+ .theme--light .balloon:after {
175
+ border-color: map-get($shades, 'white') transparent;
171
176
  }
172
- .v-sheet.theme--dark.balloon:after{
173
- border-color: #1E1E1E transparent;
177
+ .theme--dark .balloon:after {
178
+ border-color: map-get($shades, 'black') transparent;
174
179
  }
175
180
  .balloon .v-list-item .v-list-item__title,
176
181
  .balloon .v-list-item .v-list-item__subtitle {
@@ -33,7 +33,7 @@ import TableFeatureInfoView from './tableFeatureInfoView.js';
33
33
  import IframeFeatureInfoView from './iframeFeatureInfoView.js';
34
34
  import AddressBalloonFeatureInfoView from './addressBalloonFeatureInfoView.js';
35
35
  import BalloonFeatureInfoView from './balloonFeatureInfoView.js';
36
- import { defaultPrimaryColor } from '../vuePlugins/vuetify.js';
36
+ import { getDefaultPrimaryColor } from '../vuePlugins/vuetify.js';
37
37
  import { ToolboxType } from '../manager/toolbox/toolboxManager.js';
38
38
 
39
39
  /** @typedef {import("ol").Feature<import("ol/geom/Geometry").default>|import("@vcmap-cesium/engine").Cesium3DTileFeature|import("@vcmap-cesium/engine").Cesium3DTilePointFeature|import("@vcmap-cesium/engine").Entity} FeatureType */
@@ -126,6 +126,7 @@ export function createFeatureInfoSession(app) {
126
126
 
127
127
  /**
128
128
  * @param {VcsUiApp} app
129
+ * @returns {function():void}
129
130
  */
130
131
  function setupFeatureInfoTool(app) {
131
132
  /** @type {FeatureInfoSession|null} */
@@ -153,6 +154,9 @@ function setupFeatureInfoTool(app) {
153
154
  },
154
155
  };
155
156
 
157
+ if (app.uiConfig.getByKey('startingFeatureInfo')?.value !== false) {
158
+ action.callback();
159
+ }
156
160
  app.toolboxManager.add(
157
161
  {
158
162
  id: 'featureInfo',
@@ -161,6 +165,13 @@ function setupFeatureInfoTool(app) {
161
165
  },
162
166
  vcsAppSymbol,
163
167
  );
168
+
169
+ return () => {
170
+ if (session) {
171
+ session.stop();
172
+ }
173
+ app.toolboxManager.remove('featureInfo');
174
+ };
164
175
  }
165
176
 
166
177
  /**
@@ -266,7 +277,11 @@ class FeatureInfo {
266
277
  this.clear();
267
278
  }
268
279
  }),
269
- this._app.contextAdded.addEventListener(() => this.clear()),
280
+ this._app.contextAdded.addEventListener(() => {
281
+ this.clear();
282
+ this._destroyFeatureInfoTool();
283
+ this._destroyFeatureInfoTool = setupFeatureInfoTool(this._app);
284
+ }),
270
285
  this._app.contextRemoved.addEventListener(() => this.clear()),
271
286
  ];
272
287
  /**
@@ -275,8 +290,11 @@ class FeatureInfo {
275
290
  * @private
276
291
  */
277
292
  this._scratchLayer = null;
278
-
279
- setupFeatureInfoTool(this._app);
293
+ /**
294
+ * @type {function():void}
295
+ * @private
296
+ */
297
+ this._destroyFeatureInfoTool = setupFeatureInfoTool(this._app);
280
298
  }
281
299
 
282
300
  /**
@@ -386,7 +404,7 @@ class FeatureInfo {
386
404
  [featureId]: getHighlightStyle(
387
405
  feature,
388
406
  layer,
389
- this._app.uiConfig.config.value.primaryColor ?? defaultPrimaryColor,
407
+ this._app.uiConfig.config.value.primaryColor ?? getDefaultPrimaryColor(),
390
408
  ),
391
409
  });
392
410
  this._clearHighlightingCb = () => this._scratchLayer.featureVisibility.unHighlight([featureId]);
@@ -396,7 +414,7 @@ class FeatureInfo {
396
414
  [featureId]: getHighlightStyle(
397
415
  feature,
398
416
  layer,
399
- this._app.uiConfig.config.value.primaryColor ?? defaultPrimaryColor,
417
+ this._app.uiConfig.config.value.primaryColor ?? getDefaultPrimaryColor(),
400
418
  ),
401
419
  });
402
420
  this._clearHighlightingCb = () => layer.featureVisibility.unHighlight([featureId]);
@@ -458,7 +476,7 @@ class FeatureInfo {
458
476
  destroy() {
459
477
  this._clearInternal();
460
478
  this._featureChanged.destroy();
461
- this._app.toolboxManager.remove('featureInfo');
479
+ this._destroyFeatureInfoTool();
462
480
  if (this._scratchLayer) {
463
481
  this._app.layers.remove(this._scratchLayer);
464
482
  this._scratchLayer.destroy();
@@ -77,6 +77,10 @@ class TableFeatureInfoView extends AbstractFeatureInfoView {
77
77
  itemsPerPageArray: this.itemsPerPageArray,
78
78
  showSearchbar: this.showSearchbar,
79
79
  searchbarPlaceholder: this.searchbarPlaceholder,
80
+ headers: [
81
+ { text: 'components.vcsTable.key', value: 'key', width: '128px' },
82
+ { text: 'components.vcsTable.value', value: 'value', width: '192px' },
83
+ ],
80
84
  };
81
85
  }
82
86
 
package/src/i18n/de.js CHANGED
@@ -65,8 +65,12 @@ const messages = {
65
65
  settings: {
66
66
  title: 'Einstellungen',
67
67
  tooltip: 'Einstellungen',
68
- languageTitle: 'Spracheinstellungen',
69
68
  languageSelector: 'Sprache',
69
+ theme: {
70
+ title: 'Farbschema',
71
+ dark: 'Dunkel',
72
+ light: 'Hell',
73
+ },
70
74
  },
71
75
  featureInfo: {
72
76
  activateToolTitle: 'Informationstool aktivieren',
package/src/i18n/en.js CHANGED
@@ -65,8 +65,12 @@ const messages = {
65
65
  settings: {
66
66
  title: 'Settings',
67
67
  tooltip: 'Settings',
68
- languageTitle: 'Language settings',
69
68
  languageSelector: 'Language',
69
+ theme: {
70
+ title: 'Color theme',
71
+ dark: 'Dark',
72
+ light: 'Light',
73
+ },
70
74
  },
71
75
  featureInfo: {
72
76
  activateToolTitle: 'Activate Infotool',
@@ -6,7 +6,11 @@
6
6
  :key="idx"
7
7
  :class="{ 'w-full': item.colNr === 1, 'w-half': item.colNr !== 1 }"
8
8
  >
9
- <v-list-item dense>
9
+ <v-list-item
10
+ dense
11
+ class="pa-0"
12
+ :class="determineInnerPadding(idx)"
13
+ >
10
14
  <v-list-item-icon class="pr-2">
11
15
  <v-img
12
16
  v-if="row.type === StyleRowType.Icon || row.type === StyleRowType.Shape"
@@ -126,7 +130,24 @@
126
130
  required: true,
127
131
  },
128
132
  },
129
- setup() {
133
+ setup(props) {
134
+ /**
135
+ * Determines if a list item has padding right or left, so it has correct spacing to second row.
136
+ * @param {number} index The index of the list item. Starts with 0.
137
+ * @returns {string} Vuetify padding helper.
138
+ */
139
+ function determineInnerPadding(index) {
140
+ // check if there are more than two columns
141
+ if (props.item.colNr !== 1) {
142
+ // check if even number. If so, it is located in the left column and needs padding on the right.
143
+ if (index % 2 === 0) {
144
+ return 'pr-2';
145
+ } else {
146
+ return 'pl-2';
147
+ }
148
+ }
149
+ return '';
150
+ }
130
151
  return {
131
152
  StyleRowType,
132
153
  getImageSrcFromShape,
@@ -136,6 +157,7 @@
136
157
  }
137
158
  return null;
138
159
  },
160
+ determineInnerPadding,
139
161
  };
140
162
  },
141
163
  };