@vcmap/ui 6.0.11 → 6.1.0-rc.1
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.
- package/config/base.config.json +25 -3
- package/config/dev.config.json +17 -3
- package/config/splashscreen.config.json +13 -0
- package/dist/assets/cesium.js +1 -1
- package/dist/assets/{core-d78889f9.js → core-9d0cfec3.js} +6949 -5868
- package/dist/assets/core.js +1 -1
- package/dist/assets/ol.js +1 -1
- package/dist/assets/ui-08446666.css +1 -0
- package/dist/assets/{ui-f56287eb.js → ui-08446666.js} +17374 -19067
- package/dist/assets/ui.js +1 -1
- package/dist/assets/vue.js +1 -1
- package/dist/assets/{vuetify-03bc5f58.js → vuetify-67025c41.js} +1 -1
- package/dist/assets/vuetify.js +1 -1
- package/index.d.ts +11 -1
- package/index.js +6 -0
- package/package.json +2 -2
- package/plugins/@vcmap-show-case/dev-tools/package.json +5 -0
- package/plugins/@vcmap-show-case/dev-tools/src/eventLogger.js +35 -0
- package/plugins/@vcmap-show-case/dev-tools/src/index.js +59 -0
- package/plugins/@vcmap-show-case/search-example/src/searchImpl.js +10 -0
- package/src/application/VcsApp.vue.d.ts +22 -0
- package/src/application/VcsContainer.vue.d.ts +15 -0
- package/src/application/VcsSplashScreen.vue +35 -28
- package/src/application/VcsSplashScreen.vue.d.ts +1 -0
- package/src/callback/addModuleCallback.d.ts +29 -0
- package/src/callback/addModuleCallback.js +61 -0
- package/src/callback/removeModuleCallback.d.ts +29 -0
- package/src/callback/removeModuleCallback.js +53 -0
- package/src/callback/startRotationCallback.d.ts +37 -0
- package/src/callback/startRotationCallback.js +67 -0
- package/src/callback/stopRotationCallback.d.ts +8 -0
- package/src/callback/stopRotationCallback.js +37 -0
- package/src/components/icons/+all.js +4 -0
- package/src/components/icons/View360Icon.vue +55 -0
- package/src/components/icons/View360Icon.vue.d.ts +2 -0
- package/src/components/lists/VcsTreeNode.vue +237 -0
- package/src/components/lists/VcsTreeNode.vue.d.ts +31 -0
- package/src/components/lists/VcsTreeview.vue +103 -173
- package/src/components/lists/VcsTreeview.vue.d.ts +41 -4
- package/src/components/lists/VcsTreeviewTitle.vue +10 -3
- package/src/components/lists/VcsTreeviewTitle.vue.d.ts +2 -0
- package/src/featureInfo/BalloonComponent.vue +18 -47
- package/src/featureInfo/BalloonComponent.vue.d.ts +0 -1
- package/src/featureInfo/IframeComponent.vue +1 -32
- package/src/featureInfo/IframeComponent.vue.d.ts +1 -4
- package/src/i18n/de.d.ts +1 -0
- package/src/i18n/de.js +1 -0
- package/src/i18n/en.d.ts +1 -0
- package/src/i18n/en.js +1 -0
- package/src/init.d.ts +6 -0
- package/src/init.js +26 -14
- package/src/manager/window/WindowComponent.vue +1 -1
- package/src/navigation/MapNavigation.vue +83 -1
- package/src/navigation/MapNavigation.vue.d.ts +2 -0
- package/src/search/ResultItem.vue +1 -10
- package/src/search/ResultsComponent.vue +11 -1
- package/src/search/ResultsComponent.vue.d.ts +9 -0
- package/src/search/SearchComponent.vue +88 -11
- package/src/search/SearchComponent.vue.d.ts +7 -0
- package/src/search/search.d.ts +3 -0
- package/src/search/search.js +3 -2
- package/src/uiConfig.d.ts +31 -0
- package/src/uiConfig.js +5 -0
- package/src/vuePlugins/vuetify.js +2 -0
- package/dist/assets/ui-f56287eb.css +0 -1
- /package/dist/assets/{cesium-5a0d7ac6.js → cesium-11e5bbc6.js} +0 -0
- /package/dist/assets/{ol-27d44222.js → ol-0d0ebb27.js} +0 -0
- /package/dist/assets/{vue-41556557.js → vue-2f81c7f8.js} +0 -0
- /package/dist/assets/{vuetify-03bc5f58.css → vuetify-67025c41.css} +0 -0
@@ -1,163 +1,80 @@
|
|
1
1
|
<template>
|
2
|
-
<div class="
|
2
|
+
<div class="vcs-treeview">
|
3
3
|
<VcsTreeviewSearchbar
|
4
4
|
v-if="showSearchbar"
|
5
5
|
:placeholder="searchbarPlaceholder"
|
6
6
|
v-model="localSearchValue"
|
7
7
|
/>
|
8
|
-
<v-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
<VcsTreeviewTitle :item="scope.item"></VcsTreeviewTitle>
|
25
|
-
</slot>
|
26
|
-
</template>
|
27
|
-
<template v-for="slot of forwardSlots" #[slot]="scope">
|
28
|
-
<slot :name="slot" v-bind="scope ?? {}" />
|
29
|
-
</template>
|
30
|
-
<template #prepend="scope">
|
31
|
-
<slot name="prepend" v-bind="scope ?? {}">
|
32
|
-
<template v-if="scope.item?.icon">
|
33
|
-
<v-icon
|
34
|
-
v-if="typeof scope.item?.icon === 'string'"
|
35
|
-
:size="iconSize"
|
36
|
-
>
|
37
|
-
{{ scope.item.icon }}
|
38
|
-
</v-icon>
|
39
|
-
<ImageElementInjector :element="scope.item.icon" v-else />
|
40
|
-
</template>
|
41
|
-
</slot>
|
42
|
-
</template>
|
43
|
-
<template #append="scope">
|
44
|
-
<slot name="append" v-bind="scope ?? {}">
|
45
|
-
<VcsActionButtonList
|
46
|
-
v-if="scope.item.actions?.length > 0"
|
47
|
-
:actions="scope.item.actions"
|
48
|
-
:overflow-count="3"
|
49
|
-
:disabled="scope.item.disabled"
|
50
|
-
right
|
51
|
-
tooltip-position="right"
|
52
|
-
block-overflow
|
53
|
-
class="col-4 pa-0 d-flex align-center"
|
54
|
-
/>
|
55
|
-
</slot>
|
56
|
-
</template>
|
57
|
-
</v-treeview>
|
8
|
+
<div v-for="item in items" :key="item.name" class="vcs-treeitem">
|
9
|
+
<VcsTreeNode
|
10
|
+
class="root-node"
|
11
|
+
:item="item"
|
12
|
+
:search="localSearchValue"
|
13
|
+
v-model:opened="localOpenedItems"
|
14
|
+
:open-on-click="openOnClick"
|
15
|
+
:item-children="itemChildren"
|
16
|
+
@item-toggled="itemToggled"
|
17
|
+
@click="itemClicked"
|
18
|
+
>
|
19
|
+
<template v-for="slot of forwardSlots" #[slot]="scope">
|
20
|
+
<slot :name="slot" v-bind="scope ?? {}" />
|
21
|
+
</template>
|
22
|
+
</VcsTreeNode>
|
23
|
+
</div>
|
58
24
|
</div>
|
59
25
|
</template>
|
60
|
-
<style lang="scss" scoped>
|
61
|
-
:deep(.vcs-treeview) {
|
62
|
-
// Root Level Entries should be 40px high
|
63
|
-
> .v-list-item,
|
64
|
-
> .v-list-group > .v-list-item {
|
65
|
-
min-height: calc(var(--v-vcs-font-size) * 2 + 14px) !important;
|
66
|
-
padding-left: 6px;
|
67
|
-
}
|
68
|
-
// Border around root nodes with children included
|
69
|
-
> .v-list-item:not(:last-child),
|
70
|
-
> .v-list-group:not(:last-child) {
|
71
|
-
border-bottom: 1px solid rgb(var(--v-theme-base-lighten-2));
|
72
|
-
}
|
73
|
-
// Only Group Entries have a bold font
|
74
|
-
> .v-list-group
|
75
|
-
> .v-list-item
|
76
|
-
> .v-list-item__content
|
77
|
-
> .v-list-item-title {
|
78
|
-
font-weight: 700 !important;
|
79
|
-
}
|
80
|
-
}
|
81
|
-
|
82
|
-
// leaf indent
|
83
|
-
:deep(.v-list--slim .v-treeview-group.v-list-group) {
|
84
|
-
--prepend-width: 0px;
|
85
|
-
}
|
86
|
-
|
87
|
-
// Padding left of root nodes
|
88
|
-
:deep(.v-list-item__prepend) {
|
89
|
-
width: var(--v-vcs-font-size);
|
90
|
-
margin-right: 8px;
|
91
|
-
> .v-list-item-action > .v-btn {
|
92
|
-
width: var(--v-vcs-font-size);
|
93
|
-
height: var(--v-vcs-font-size);
|
94
|
-
margin: auto;
|
95
|
-
// for alignment of chevron
|
96
|
-
display: flex;
|
97
|
-
}
|
98
|
-
}
|
99
|
-
|
100
|
-
// Width of prepend for group nodes having two icons (chevron and custom icon)
|
101
|
-
:deep(.v-list-item__prepend:has(> .v-list-item-action + .v-icon)) {
|
102
|
-
width: calc(var(--v-vcs-font-size) + 23px);
|
103
|
-
.v-list-item-action {
|
104
|
-
margin-right: calc(22px - var(--v-vcs-font-size));
|
105
|
-
}
|
106
|
-
}
|
107
|
-
|
108
|
-
// remove hover shadow over button
|
109
|
-
:deep(.v-btn__overlay) {
|
110
|
-
--v-hover-opacity: 0;
|
111
|
-
}
|
112
|
-
// remove ripple effect
|
113
|
-
:deep(.v-ripple__container) {
|
114
|
-
display: none;
|
115
|
-
}
|
116
|
-
// hide active class
|
117
|
-
:deep(.v-list-item__overlay) {
|
118
|
-
display: none;
|
119
|
-
}
|
120
|
-
|
121
|
-
.d-contents {
|
122
|
-
display: contents;
|
123
|
-
}
|
124
|
-
</style>
|
125
26
|
|
126
27
|
<script>
|
127
|
-
import {
|
128
|
-
import {
|
129
|
-
|
130
|
-
|
28
|
+
import { watch } from 'vue';
|
29
|
+
import {
|
30
|
+
useProxiedAtomicModel,
|
31
|
+
useProxiedComplexModel,
|
32
|
+
} from '../modelHelper.js';
|
131
33
|
import { getForwardSlots } from '../composables.js';
|
132
34
|
import VcsTreeviewSearchbar from './VcsTreeviewSearchbar.vue';
|
133
|
-
import
|
134
|
-
import ImageElementInjector from '../ImageElementInjector.vue';
|
135
|
-
import VcsTreeviewTitle from './VcsTreeviewTitle.vue';
|
136
|
-
import { useIconSize } from '../../vuePlugins/vuetify.js';
|
35
|
+
import VcsTreeNode from './VcsTreeNode.vue';
|
137
36
|
|
138
37
|
/**
|
139
|
-
* @description
|
140
|
-
* Can render dynamic components as leaf items.
|
141
|
-
* In order to display an item needs to be registered and added to `availableComponents`.
|
38
|
+
* @description The VcsTreeview is heavily inspired by the Vuetify VTreeview component. Can render dynamic components as leaf items.
|
142
39
|
* Exposes the `search` value for filtering the treeview.
|
143
|
-
*
|
144
|
-
*
|
40
|
+
* Exposes the `opened` model-value for controlling the opened state of the treeview.
|
41
|
+
* Forwards the `prepend`, `title` and `append` slots to the VcsTreeNode component.
|
42
|
+
* @vue-prop {Array<import("./VcsTreeNode.vue").VcsTreeNodeItem>} items.
|
43
|
+
* @vue-prop {Array<import("./VcsTreeNode.vue").VcsTreeNodeItem>} opened - Array of name of opened nodes.
|
44
|
+
* @vue-prop {string} [itemChildren='children'] - The property key of the children.
|
45
|
+
* @vue-prop {boolean} [openAll=false] - Whether to open all root items on startup.
|
46
|
+
* @vue-prop {boolean} [openOnClick=false] - Whether to open items on title click.
|
47
|
+
* @vue-prop {string} [search=''] - The value used to filter the items.
|
48
|
+
* @vue-prop {boolean} [showSearchbar=false] - Whether there is a searchbar for this treeview.
|
49
|
+
* @vue-prop {string} [searchbarPlaceholder] - Placeholder text for the searchbar, will be translated.
|
145
50
|
*/
|
146
51
|
export default {
|
147
52
|
name: 'VcsTreeview',
|
148
53
|
components: {
|
149
|
-
VcsTreeviewTitle,
|
150
|
-
VIcon,
|
151
|
-
ImageElementInjector,
|
152
|
-
VcsActionButtonList,
|
153
54
|
VcsTreeviewSearchbar,
|
154
|
-
|
55
|
+
VcsTreeNode,
|
155
56
|
},
|
156
57
|
props: {
|
157
58
|
items: {
|
158
59
|
type: Array,
|
159
60
|
default: () => [],
|
160
61
|
},
|
62
|
+
opened: {
|
63
|
+
type: Array,
|
64
|
+
default: () => [],
|
65
|
+
},
|
66
|
+
itemChildren: {
|
67
|
+
type: String,
|
68
|
+
default: 'children',
|
69
|
+
},
|
70
|
+
openAll: {
|
71
|
+
type: Boolean,
|
72
|
+
default: false,
|
73
|
+
},
|
74
|
+
openOnClick: {
|
75
|
+
type: Boolean,
|
76
|
+
default: false,
|
77
|
+
},
|
161
78
|
search: {
|
162
79
|
type: String,
|
163
80
|
default: '',
|
@@ -171,58 +88,71 @@
|
|
171
88
|
default: undefined,
|
172
89
|
},
|
173
90
|
},
|
174
|
-
emits: ['update:search'],
|
91
|
+
emits: ['update:search', 'update:opened'],
|
175
92
|
setup(props, { emit, slots }) {
|
93
|
+
const forwardSlots = getForwardSlots(slots);
|
176
94
|
const localSearchValue = useProxiedAtomicModel(props, 'search', emit);
|
95
|
+
const localOpenedItems = useProxiedComplexModel(props, 'opened', emit);
|
177
96
|
|
178
|
-
|
97
|
+
if ((props.openAll ?? false) !== false) {
|
98
|
+
localOpenedItems.value = props.items.map((item) => item.name);
|
99
|
+
watch(
|
100
|
+
() => props.items,
|
101
|
+
(items) => {
|
102
|
+
const newItems = items.filter(
|
103
|
+
(item) => !localOpenedItems.value.includes(item.name),
|
104
|
+
);
|
105
|
+
localOpenedItems.value.push(...newItems.map((item) => item.name));
|
106
|
+
},
|
107
|
+
);
|
108
|
+
}
|
179
109
|
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
if (value == null || q == null) {
|
189
|
-
return -1;
|
110
|
+
function itemToggled(name, state) {
|
111
|
+
if (state) {
|
112
|
+
localOpenedItems.value.push(name);
|
113
|
+
} else {
|
114
|
+
const idx = localOpenedItems.value.indexOf(name);
|
115
|
+
if (idx >= 0) {
|
116
|
+
localOpenedItems.value.splice(idx, 1);
|
117
|
+
}
|
190
118
|
}
|
191
|
-
|
192
|
-
return translatedTitle
|
193
|
-
.toLocaleLowerCase()
|
194
|
-
.indexOf(q.toLocaleLowerCase());
|
195
|
-
};
|
119
|
+
}
|
196
120
|
|
197
|
-
const forwardSlots = getForwardSlots(slots, [
|
198
|
-
'append',
|
199
|
-
'title',
|
200
|
-
'prepend',
|
201
|
-
]);
|
202
|
-
const iconSize = useIconSize();
|
203
121
|
return {
|
204
|
-
iconSize,
|
205
122
|
localSearchValue,
|
206
|
-
|
123
|
+
localOpenedItems,
|
207
124
|
forwardSlots,
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
if (item.name === name) {
|
214
|
-
break;
|
215
|
-
}
|
216
|
-
if (item.children?.length > 0) {
|
217
|
-
items.push(...item.children);
|
125
|
+
itemToggled,
|
126
|
+
itemClicked(item, event) {
|
127
|
+
if (item?.clickable) {
|
128
|
+
if (item?.clicked && !item?.disabled) {
|
129
|
+
item.clicked(event);
|
218
130
|
}
|
219
|
-
}
|
220
|
-
|
221
|
-
if (item?.clicked && !item?.disabled) {
|
222
|
-
item.clicked(event);
|
131
|
+
} else if ((props.openOnClick ?? false) !== false) {
|
132
|
+
itemToggled(item.name, !localOpenedItems.value.includes(item.name));
|
223
133
|
}
|
224
134
|
},
|
225
135
|
};
|
226
136
|
},
|
227
137
|
};
|
228
138
|
</script>
|
139
|
+
|
140
|
+
<style lang="scss" scoped>
|
141
|
+
// Hide node component when not rendered (e.g. filtered by search)
|
142
|
+
.vcs-treeitem:not(:has(.vcs-tree-node)) {
|
143
|
+
display: none;
|
144
|
+
}
|
145
|
+
.vcs-treeitem:not(:last-child) {
|
146
|
+
border-bottom: 1px solid rgb(var(--v-theme-base-lighten-2));
|
147
|
+
}
|
148
|
+
.root-node {
|
149
|
+
:deep(.level-0) {
|
150
|
+
// Root Level Entries should be 40px high
|
151
|
+
min-height: calc(var(--v-vcs-font-size) * 2 + 14px) !important;
|
152
|
+
}
|
153
|
+
// Only Group Entries have a bold font
|
154
|
+
> :deep(.group) {
|
155
|
+
font-weight: 700 !important;
|
156
|
+
}
|
157
|
+
}
|
158
|
+
</style>
|
@@ -3,6 +3,22 @@ declare const _default: import("vue").DefineComponent<{
|
|
3
3
|
type: ArrayConstructor;
|
4
4
|
default: () => never[];
|
5
5
|
};
|
6
|
+
opened: {
|
7
|
+
type: ArrayConstructor;
|
8
|
+
default: () => never[];
|
9
|
+
};
|
10
|
+
itemChildren: {
|
11
|
+
type: StringConstructor;
|
12
|
+
default: string;
|
13
|
+
};
|
14
|
+
openAll: {
|
15
|
+
type: BooleanConstructor;
|
16
|
+
default: boolean;
|
17
|
+
};
|
18
|
+
openOnClick: {
|
19
|
+
type: BooleanConstructor;
|
20
|
+
default: boolean;
|
21
|
+
};
|
6
22
|
search: {
|
7
23
|
type: StringConstructor;
|
8
24
|
default: string;
|
@@ -16,16 +32,32 @@ declare const _default: import("vue").DefineComponent<{
|
|
16
32
|
default: undefined;
|
17
33
|
};
|
18
34
|
}, {
|
19
|
-
iconSize: import("vue").ComputedRef<number>;
|
20
35
|
localSearchValue: import("vue").Ref<any>;
|
21
|
-
|
36
|
+
localOpenedItems: import("vue").Ref<any>;
|
22
37
|
forwardSlots: string[];
|
23
|
-
|
24
|
-
|
38
|
+
itemToggled: (name: any, state: any) => void;
|
39
|
+
itemClicked(item: any, event: any): void;
|
40
|
+
}, any, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, ("update:opened" | "update:search")[], "update:opened" | "update:search", import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
|
25
41
|
items: {
|
26
42
|
type: ArrayConstructor;
|
27
43
|
default: () => never[];
|
28
44
|
};
|
45
|
+
opened: {
|
46
|
+
type: ArrayConstructor;
|
47
|
+
default: () => never[];
|
48
|
+
};
|
49
|
+
itemChildren: {
|
50
|
+
type: StringConstructor;
|
51
|
+
default: string;
|
52
|
+
};
|
53
|
+
openAll: {
|
54
|
+
type: BooleanConstructor;
|
55
|
+
default: boolean;
|
56
|
+
};
|
57
|
+
openOnClick: {
|
58
|
+
type: BooleanConstructor;
|
59
|
+
default: boolean;
|
60
|
+
};
|
29
61
|
search: {
|
30
62
|
type: StringConstructor;
|
31
63
|
default: string;
|
@@ -39,10 +71,15 @@ declare const _default: import("vue").DefineComponent<{
|
|
39
71
|
default: undefined;
|
40
72
|
};
|
41
73
|
}>> & {
|
74
|
+
"onUpdate:opened"?: ((...args: any[]) => any) | undefined;
|
42
75
|
"onUpdate:search"?: ((...args: any[]) => any) | undefined;
|
43
76
|
}, {
|
44
77
|
search: string;
|
78
|
+
openOnClick: boolean;
|
45
79
|
items: unknown[];
|
80
|
+
opened: unknown[];
|
81
|
+
itemChildren: string;
|
82
|
+
openAll: boolean;
|
46
83
|
showSearchbar: boolean;
|
47
84
|
searchbarPlaceholder: string;
|
48
85
|
}, {}>;
|
@@ -8,6 +8,10 @@
|
|
8
8
|
type: Object,
|
9
9
|
default: undefined,
|
10
10
|
},
|
11
|
+
cursorPointer: {
|
12
|
+
type: Boolean,
|
13
|
+
default: false,
|
14
|
+
},
|
11
15
|
});
|
12
16
|
|
13
17
|
const titleParent = ref();
|
@@ -23,14 +27,17 @@
|
|
23
27
|
overflow: hidden;
|
24
28
|
text-overflow: ellipsis;
|
25
29
|
}
|
30
|
+
.cursor-pointer {
|
31
|
+
cursor: pointer;
|
32
|
+
}
|
26
33
|
</style>
|
27
34
|
<template>
|
28
35
|
<div
|
29
|
-
class="title-parent pr-2 vcs-treeview-title"
|
36
|
+
class="title-parent pr-2 vcs-treeview-title w-100"
|
37
|
+
:class="{ 'cursor-pointer': cursorPointer }"
|
30
38
|
ref="titleParent"
|
31
|
-
@click.stop="item.clicked && !item.disabled && item.clicked($event)"
|
32
39
|
>
|
33
|
-
<span>
|
40
|
+
<span class="w-100">
|
34
41
|
{{ $st(item.title || item.name) }}
|
35
42
|
</span>
|
36
43
|
<v-tooltip v-if="tooltip" activator="parent">
|
@@ -1,6 +1,8 @@
|
|
1
1
|
declare const _default: import("vue").DefineComponent<{}, {
|
2
|
+
cursorPointer: boolean;
|
2
3
|
item?: Record<string, any> | undefined;
|
3
4
|
$props: {
|
5
|
+
readonly cursorPointer?: boolean | undefined;
|
4
6
|
readonly item?: Record<string, any> | undefined;
|
5
7
|
};
|
6
8
|
}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{}>>, {}, {}>;
|
@@ -1,5 +1,8 @@
|
|
1
1
|
<template>
|
2
|
-
<v-
|
2
|
+
<v-sheet
|
3
|
+
class="balloon-component d-flex flex-column flex-grow-1"
|
4
|
+
v-if="position"
|
5
|
+
>
|
3
6
|
<slot name="balloon-header" :attrs="{ ...$props, ...$attrs }">
|
4
7
|
<v-list-item class="px-1">
|
5
8
|
<template #prepend="prependScope">
|
@@ -32,21 +35,17 @@
|
|
32
35
|
|
33
36
|
<v-divider />
|
34
37
|
|
35
|
-
<
|
36
|
-
class="overflow-y-auto
|
37
|
-
:max-height="maxHeight"
|
38
|
-
color="transparent"
|
38
|
+
<div
|
39
|
+
class="overflow-x-hidden overflow-y-auto d-flex flex-column flex-grow-1"
|
39
40
|
>
|
40
41
|
<slot :attrs="{ ...$props, ...$attrs }">
|
41
|
-
<v-list
|
42
|
-
v-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
{{ $st(key) }}
|
49
|
-
</v-list-item-title>
|
42
|
+
<v-list color="transparent" class="py-2">
|
43
|
+
<v-list-item
|
44
|
+
v-for="(value, key, index) in attributes"
|
45
|
+
:key="`attribute-${index}`"
|
46
|
+
class="px-2"
|
47
|
+
:title="$st(key)"
|
48
|
+
>
|
50
49
|
<v-list-item-subtitle
|
51
50
|
:tag="getTag(tags, key)"
|
52
51
|
v-bind="getTagOptions(tags, key)"
|
@@ -56,13 +55,13 @@
|
|
56
55
|
</v-list-item>
|
57
56
|
</v-list>
|
58
57
|
</slot>
|
59
|
-
</
|
60
|
-
</v-
|
58
|
+
</div>
|
59
|
+
</v-sheet>
|
61
60
|
</template>
|
62
61
|
<script>
|
63
|
-
import { inject, onMounted, onUnmounted,
|
62
|
+
import { inject, onMounted, onUnmounted, watch } from 'vue';
|
64
63
|
import {
|
65
|
-
|
64
|
+
VSheet,
|
66
65
|
VDivider,
|
67
66
|
VIcon,
|
68
67
|
VList,
|
@@ -70,10 +69,6 @@
|
|
70
69
|
VListItemSubtitle,
|
71
70
|
VListItemTitle,
|
72
71
|
} from 'vuetify/components';
|
73
|
-
import {
|
74
|
-
getTargetSize,
|
75
|
-
posToNumber,
|
76
|
-
} from '../manager/window/windowHelper.js';
|
77
72
|
import { setupBalloonPositionListener } from './balloonHelper.js';
|
78
73
|
import VcsButton from '../components/buttons/VcsButton.vue';
|
79
74
|
import { getTag, getTagOptions } from '../components/tables/VcsTable.vue';
|
@@ -97,7 +92,7 @@
|
|
97
92
|
name: 'BalloonComponent',
|
98
93
|
components: {
|
99
94
|
VcsButton,
|
100
|
-
|
95
|
+
VSheet,
|
101
96
|
VList,
|
102
97
|
VListItem,
|
103
98
|
VIcon,
|
@@ -134,28 +129,6 @@
|
|
134
129
|
setup(props, { attrs }) {
|
135
130
|
const app = inject('vcsApp');
|
136
131
|
const windowId = attrs['window-state'].id;
|
137
|
-
function getMaxHeight() {
|
138
|
-
if (app.windowManager.get(windowId)?.position?.maxHeight) {
|
139
|
-
return (
|
140
|
-
posToNumber(
|
141
|
-
app.windowManager.get(windowId).position.maxHeight,
|
142
|
-
'maxHeight',
|
143
|
-
getTargetSize(app.maps.target),
|
144
|
-
) - 49 // 44px header offset with padding 5px
|
145
|
-
);
|
146
|
-
}
|
147
|
-
if (app.windowManager.get(windowId)?.position?.height) {
|
148
|
-
return (
|
149
|
-
posToNumber(
|
150
|
-
app.windowManager.get(windowId).position.height,
|
151
|
-
'height',
|
152
|
-
getTargetSize(app.maps.target),
|
153
|
-
) - 49 // 44px header offset with padding 5px
|
154
|
-
);
|
155
|
-
}
|
156
|
-
return 250;
|
157
|
-
}
|
158
|
-
const maxHeight = ref(getMaxHeight());
|
159
132
|
|
160
133
|
let balloonPositionListener = null;
|
161
134
|
const destroyListener = () => {
|
@@ -181,7 +154,6 @@
|
|
181
154
|
windowId,
|
182
155
|
props.position,
|
183
156
|
);
|
184
|
-
maxHeight.value = getMaxHeight();
|
185
157
|
},
|
186
158
|
);
|
187
159
|
|
@@ -199,7 +171,6 @@
|
|
199
171
|
close,
|
200
172
|
getTag,
|
201
173
|
getTagOptions,
|
202
|
-
maxHeight,
|
203
174
|
};
|
204
175
|
},
|
205
176
|
};
|
@@ -28,7 +28,6 @@ declare const _default: import("vue").DefineComponent<{
|
|
28
28
|
close: () => void;
|
29
29
|
getTag: typeof getTag;
|
30
30
|
getTagOptions: typeof getTagOptions;
|
31
|
-
maxHeight: import("vue").Ref<number>;
|
32
31
|
}, any, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
|
33
32
|
featureId: {
|
34
33
|
type: StringConstructor;
|
@@ -2,17 +2,10 @@
|
|
2
2
|
<iframe
|
3
3
|
:src="src"
|
4
4
|
:title="title"
|
5
|
-
|
6
|
-
class="iframe-component"
|
5
|
+
class="h-100 w-100 border-0 d-block flex-grow-1"
|
7
6
|
/>
|
8
7
|
</template>
|
9
8
|
<script>
|
10
|
-
import { inject } from 'vue';
|
11
|
-
import {
|
12
|
-
getTargetSize,
|
13
|
-
posToNumber,
|
14
|
-
} from '../manager/window/windowHelper.js';
|
15
|
-
|
16
9
|
/**
|
17
10
|
* @description An iframe component
|
18
11
|
* @vue-prop {string} src - Specifies the address of the document to embed in the <iframe>
|
@@ -38,30 +31,6 @@
|
|
38
31
|
default: () => {},
|
39
32
|
},
|
40
33
|
},
|
41
|
-
setup(props, { attrs }) {
|
42
|
-
const app = inject('vcsApp');
|
43
|
-
let { height, width } = app.windowManager.get(
|
44
|
-
attrs['window-state'].id,
|
45
|
-
).position;
|
46
|
-
|
47
|
-
// set iframe size to absolute px values
|
48
|
-
if (app.maps.target) {
|
49
|
-
const targetSize = getTargetSize(app.maps.target);
|
50
|
-
const heightNumber = posToNumber(height, 'height', targetSize);
|
51
|
-
if (heightNumber) {
|
52
|
-
height = `${heightNumber - 36}px`; // 32px header height + 4px margin
|
53
|
-
}
|
54
|
-
const widthNumber = posToNumber(width, 'width', targetSize);
|
55
|
-
if (widthNumber) {
|
56
|
-
width = `${widthNumber}px`;
|
57
|
-
}
|
58
|
-
}
|
59
|
-
|
60
|
-
return {
|
61
|
-
height,
|
62
|
-
width,
|
63
|
-
};
|
64
|
-
},
|
65
34
|
};
|
66
35
|
</script>
|
67
36
|
|
@@ -14,10 +14,7 @@ declare const _default: import("vue").DefineComponent<{
|
|
14
14
|
type: ObjectConstructor;
|
15
15
|
default: () => void;
|
16
16
|
};
|
17
|
-
}, {
|
18
|
-
height: any;
|
19
|
-
width: any;
|
20
|
-
}, any, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
|
17
|
+
}, any, any, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
|
21
18
|
src: {
|
22
19
|
type: StringConstructor;
|
23
20
|
required: true;
|
package/src/i18n/de.d.ts
CHANGED
package/src/i18n/de.js
CHANGED
package/src/i18n/en.d.ts
CHANGED