@vcmap/ui 5.0.0-rc.15 → 5.0.0-rc.17

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 (91) hide show
  1. package/build/buildHelpers.js +7 -1
  2. package/config/base.config.json +7 -45
  3. package/config/dev.config.json +5 -1
  4. package/config/www.config.json +14 -13
  5. package/dist/assets/{cesium.2e288a.js → cesium.41de56.js} +0 -0
  6. package/dist/assets/cesium.js +1 -1
  7. package/dist/assets/{core.8014d3.js → core.af84e3.js} +6077 -4544
  8. package/dist/assets/core.js +1 -1
  9. package/dist/assets/{index.3f74fa92.js → index.5b773cad.js} +1 -1
  10. package/dist/assets/{ol.31c3a5.js → ol.5c7490.js} +0 -0
  11. package/dist/assets/ol.js +1 -1
  12. package/dist/assets/ui.dffe32.css +1 -0
  13. package/dist/assets/{ui.36f84f.js → ui.dffe32.js} +7243 -6234
  14. package/dist/assets/ui.js +1 -1
  15. package/dist/assets/{vue.a39c10.js → vue.25da17.js} +0 -0
  16. package/dist/assets/vue.js +2 -2
  17. package/dist/assets/{vuetify.378637.css → vuetify.e4ece7.css} +1 -1
  18. package/dist/assets/{vuetify.378637.js → vuetify.e4ece7.js} +5 -2
  19. package/dist/assets/vuetify.js +2 -2
  20. package/dist/index.html +1 -1
  21. package/index.html +77 -0
  22. package/index.js +18 -3
  23. package/package.json +4 -2
  24. package/plugins/@vcmap/create-link/fallbackCreateLink.vue +4 -1
  25. package/plugins/@vcmap/create-link/index.js +4 -1
  26. package/plugins/@vcmap/pluginExample/exampleActions.js +45 -0
  27. package/plugins/@vcmap/pluginExample/index.js +26 -2
  28. package/plugins/@vcmap/pluginExample/pluginExampleComponent.vue +77 -42
  29. package/plugins/@vcmap/search-nominatim/nominatim.js +1 -1
  30. package/plugins/@vcmap/theme-changer/ThemeChangerComponent.vue +4 -2
  31. package/plugins/categoryTest/Categories.vue +27 -13
  32. package/plugins/categoryTest/Category.vue +7 -1
  33. package/plugins/categoryTest/index.js +1 -1
  34. package/plugins/notifier/index.js +31 -0
  35. package/plugins/notifier/notifierTester.vue +88 -0
  36. package/plugins/package.json +1 -1
  37. package/plugins/test/allIconsComponent.vue +5 -5
  38. package/plugins/test/emptyComponent.vue +1 -1
  39. package/plugins/test/index.js +27 -3
  40. package/plugins/test/myCustomHeader.vue +9 -1
  41. package/plugins/test/testList.vue +290 -0
  42. package/plugins/test/vcsContent.vue +1 -1
  43. package/plugins/test/windowManagerExample.vue +12 -7
  44. package/plugins/wizardExample/index.js +41 -0
  45. package/plugins/wizardExample/wizardExample.vue +77 -0
  46. package/src/actions/actionHelper.js +10 -9
  47. package/src/application/VcsApp.vue +43 -34
  48. package/src/components/form-inputs-controls/VcsCheckbox.vue +1 -0
  49. package/src/components/form-inputs-controls/VcsFormSection.vue +23 -15
  50. package/src/components/form-inputs-controls/VcsSelect.vue +33 -1
  51. package/src/components/form-inputs-controls/VcsTextField.vue +11 -3
  52. package/src/components/form-inputs-controls/VcsWizard.vue +133 -0
  53. package/src/components/imageElementInjector.vue +22 -0
  54. package/src/components/lists/VcsList.vue +468 -0
  55. package/src/components/lists/VcsTreeview.vue +1 -2
  56. package/src/components/lists/VcsTreeviewLeaf.vue +18 -50
  57. package/src/components/lists/VcsTreeviewSearchbar.vue +1 -23
  58. package/src/components/tables/VcsTable.vue +13 -1
  59. package/src/contentTree/LayerTree.vue +1 -1
  60. package/src/contentTree/contentTreeCollection.js +9 -0
  61. package/src/contentTree/contentTreeItem.js +13 -13
  62. package/src/contentTree/layerContentTreeItem.js +1 -1
  63. package/src/contentTree/subContentTreeItem.js +1 -1
  64. package/src/contentTree/vcsObjectContentTreeItem.js +1 -1
  65. package/src/featureInfo/BalloonComponent.vue +13 -8
  66. package/src/featureInfo/balloonFeatureInfoView.js +16 -22
  67. package/src/featureInfo/balloonHelper.js +26 -5
  68. package/src/featureInfo/featureInfo.js +14 -2
  69. package/src/featureInfo/featureInfoInteraction.js +1 -1
  70. package/src/i18n/de.js +13 -1
  71. package/src/i18n/en.js +13 -1
  72. package/src/icons/+all.js +4 -0
  73. package/src/icons/WandIcon.vue +63 -0
  74. package/src/manager/categoryManager/CategoryComponent.vue +115 -0
  75. package/src/manager/categoryManager/CategoryComponentList.vue +57 -0
  76. package/src/manager/categoryManager/CategoryManager.vue +35 -0
  77. package/src/manager/categoryManager/categoryManager.js +251 -165
  78. package/src/manager/contextMenu/contextMenuManager.js +8 -2
  79. package/src/manager/window/WindowComponent.vue +51 -70
  80. package/src/manager/window/WindowComponentHeader.vue +81 -13
  81. package/src/manager/window/WindowManager.vue +54 -30
  82. package/src/manager/window/windowHelper.js +341 -0
  83. package/src/manager/window/windowManager.js +173 -151
  84. package/src/navigation/overviewMap.js +10 -9
  85. package/src/notifier/notifier.js +120 -0
  86. package/src/notifier/notifierComponent.vue +84 -0
  87. package/src/styles/variables.scss +19 -3
  88. package/src/vcsUiApp.js +26 -2
  89. package/src/vuePlugins/vuetify.js +2 -0
  90. package/dist/assets/ui.36f84f.css +0 -1
  91. package/src/manager/categoryManager/ComponentsManager.vue +0 -30
@@ -0,0 +1,133 @@
1
+ <template>
2
+ <v-stepper
3
+ vertical
4
+ :value="value"
5
+ @change="(value) => emitValue(value)"
6
+ >
7
+ <slot />
8
+ </v-stepper>
9
+ </template>
10
+
11
+ <script>
12
+ import { VStepper } from 'vuetify/lib';
13
+
14
+ /**
15
+ * @description Stylized wrapper around {@link https://vuetifyjs.com/en/api/v-stepper/ |vuetify stepper}
16
+ * Is always vertical.
17
+ * Only passes the step property, all other props are ignored.
18
+ * @vue-prop {number} step - The current step of the stepper.
19
+ */
20
+ export default {
21
+ name: 'VcsWizard',
22
+ components: {
23
+ VStepper,
24
+ },
25
+ props: {
26
+ value: {
27
+ type: Number,
28
+ default: undefined,
29
+ },
30
+ },
31
+ setup(props, { emit }) {
32
+ function emitValue(newValue) {
33
+ emit('input', typeof newValue !== 'number' ? Number(newValue) : newValue);
34
+ }
35
+
36
+ return {
37
+ emitValue,
38
+ };
39
+ },
40
+ };
41
+ </script>
42
+ <style scoped lang="scss">
43
+ .v-stepper{
44
+ &.theme--light {
45
+ ::v-deep{
46
+ .v-stepper__step {
47
+ &--active {
48
+ background-color: rgba(34, 34, 34, 0.1);
49
+ .v-stepper__label {
50
+ color: rgba(34, 34, 34, 0.8);
51
+ }
52
+ }
53
+ &--complete {
54
+ .v-stepper__label {
55
+ color: rgba(0, 0, 0, 0.38);
56
+ }
57
+ }
58
+ }
59
+ .v-stepper__content {
60
+ &:not(:last-child) {
61
+ border-left: 2px solid rgba(0, 0, 0, 0.12) !important;
62
+ }
63
+ }
64
+ }
65
+ }
66
+ &.theme--dark {
67
+ ::v-deep{
68
+ .v-stepper__step {
69
+ &--active {
70
+ background-color: rgba(255, 255, 255, 0.5);
71
+ .v-stepper__label {
72
+ color: rgba(255, 255, 255, 1);
73
+ }
74
+ }
75
+ &--complete {
76
+ .v-stepper__label {
77
+ color: rgba(255, 255, 255, 0.5);
78
+ }
79
+ }
80
+ .v-stepper__step__step {
81
+ .v-icon {
82
+ color: transparent;
83
+ }
84
+ }
85
+ &.v-stepper__step--error{
86
+ .v-stepper__label{
87
+ color: var(--v-error-darken2);
88
+ }
89
+ .v-stepper__step__step{
90
+ background-color: var(--v-error-darken1);
91
+ }
92
+ }
93
+ }
94
+ .v-stepper__content {
95
+ &:not(:last-child) {
96
+ border-left: 2px solid rgba(255, 255, 255, 0.8) !important;
97
+ }
98
+ }
99
+ }
100
+ }
101
+ ::v-deep{
102
+ .v-stepper__step {
103
+ height: 40px;
104
+ .v-stepper__label {
105
+ font-weight: 700;
106
+ text-shadow: none !important;
107
+ }
108
+ .v-stepper__step__step {
109
+ color: transparent;
110
+ position: relative;
111
+ &:before{
112
+ content: '\25cf';
113
+ color: var(--v-basic-base);
114
+ font-size: 18px;
115
+ position: absolute;
116
+ top: -9px;
117
+ }
118
+ }
119
+ &.v-stepper__step--error {
120
+ .v-stepper__step__step{
121
+ background-color: var(--v-error-base);
122
+ }
123
+ .v-stepper__label{
124
+ color: var(--v-error-base);
125
+ }
126
+ }
127
+ }
128
+ .v-stepper__content.v-stepper__wrapper {
129
+ margin: 4px 0;
130
+ }
131
+ }
132
+ }
133
+ </style>
@@ -0,0 +1,22 @@
1
+ <template>
2
+ <div />
3
+ </template>
4
+
5
+ <script>
6
+ export default {
7
+ name: 'ImageElementInjector',
8
+ props: {
9
+ element: {
10
+ type: [HTMLCanvasElement, HTMLImageElement],
11
+ required: true,
12
+ },
13
+ },
14
+ mounted() {
15
+ this.$el.replaceWith(this.element);
16
+ },
17
+ };
18
+ </script>
19
+
20
+ <style scoped>
21
+
22
+ </style>
@@ -0,0 +1,468 @@
1
+ <template>
2
+ <div
3
+ class="d-contents"
4
+ >
5
+ <vcs-treeview-searchbar
6
+ v-if="searchable"
7
+ :placeholder="searchbarPlaceholder"
8
+ v-model="query"
9
+ />
10
+ <v-list
11
+ dense
12
+ >
13
+ <v-list-item
14
+ v-if="showTitle"
15
+ class="font-weight-bold"
16
+ >
17
+ <v-list-item-action
18
+ v-if="selectable"
19
+ >
20
+ <v-icon
21
+ v-if="selected.length === renderingItems.length"
22
+ @click="clear"
23
+ >
24
+ mdi-check-circle-outline
25
+ </v-icon>
26
+ <v-icon
27
+ v-else
28
+ @click="selectAll()"
29
+ >
30
+ mdi-circle-outline
31
+ </v-icon>
32
+ </v-list-item-action>
33
+
34
+ <v-list-item-content
35
+ :title="$t(tooltip || title)"
36
+ >
37
+ <v-icon v-if="icon">
38
+ {{ icon }}
39
+ </v-icon>
40
+
41
+ <v-list-item-title>
42
+ {{ $t(title) }}
43
+ </v-list-item-title>
44
+
45
+ <vcs-action-button-list
46
+ v-if="actions?.length > 0"
47
+ :actions="actions"
48
+ :block-overflow="true"
49
+ :overflow-count="actionButtonListOverflowCount"
50
+ small
51
+ right
52
+ />
53
+ </v-list-item-content>
54
+ </v-list-item>
55
+ <v-list-item
56
+ v-for="(item, index) in renderingItems"
57
+ :key="`item-${index}`"
58
+ :input-value="selected.includes(item)"
59
+ :disabled="item.disabled"
60
+ @mousedown.shift="$event.preventDefault()"
61
+ @mouseover="hovering = index"
62
+ @mouseout="hovering = null"
63
+ >
64
+ <v-list-item-action
65
+ v-if="selectable"
66
+ >
67
+ <v-icon
68
+ v-if="selected.includes(item)"
69
+ @click="remove(item)"
70
+ >
71
+ mdi-check-circle-outline
72
+ </v-icon>
73
+ <v-icon
74
+ v-else-if="hovering === index || (!singleSelect && selected.length > 0)"
75
+ @click="singleSelect ? select(item, $event) : add(item)"
76
+ >
77
+ mdi-circle-outline
78
+ </v-icon>
79
+ <v-icon
80
+ v-else
81
+ @click="select(item, $event)"
82
+ >
83
+ mdi-circle-small
84
+ </v-icon>
85
+ </v-list-item-action>
86
+
87
+ <v-list-item-content
88
+ :title="$t(item.tooltip || item.title)"
89
+ :class="[selectable ? 'cursor-pointer' : '']"
90
+ @click="select(item, $event)"
91
+ >
92
+ <v-icon v-if="item.icon">
93
+ {{ item.icon }}
94
+ </v-icon>
95
+
96
+ <v-list-item-title>
97
+ {{ $t(item.title) }}
98
+ </v-list-item-title>
99
+
100
+ <vcs-action-button-list
101
+ v-if="item.actions?.length > 0"
102
+ :actions="item.actions"
103
+ :block-overflow="true"
104
+ :overflow-count="actionButtonListOverflowCount"
105
+ small
106
+ right
107
+ />
108
+ </v-list-item-content>
109
+ </v-list-item>
110
+ </v-list>
111
+ </div>
112
+ </template>
113
+
114
+ <script>
115
+ import { computed, getCurrentInstance, inject, ref, watch } from 'vue';
116
+ import {
117
+ VList,
118
+ VListItem,
119
+ VListItemContent,
120
+ VListItemAction,
121
+ VIcon,
122
+ VListItemTitle,
123
+ } from 'vuetify/lib';
124
+ import VcsActionButtonList from '../buttons/VcsActionButtonList.vue';
125
+ import VcsTreeviewSearchbar from './VcsTreeviewSearchbar.vue';
126
+
127
+ /**
128
+ * @typedef {Object} VcsListItem
129
+ * @property {string} name
130
+ * @property {boolean} [visible] - Whether to display this item or not.
131
+ * @property {boolean} [disabled] - Whether this item should be displayed as disabled.
132
+ * @property {string} title - The title to be displayed
133
+ * @property {string} [tooltip]
134
+ * @property {string|HTMLCanvasElement|HTMLImageElement|undefined} [icon] - An optional icon to display with this item. Can be an URL or HTMLElement.
135
+ * @property {Array<VcsAction>} [actions]
136
+ * @property {function(boolean):void} [selectionChanged] - A callback called if the selection changes with the current selection status. called before value update
137
+ */
138
+
139
+ /**
140
+ * The VCS list is intended to render items. Items can be selectable (by default, more then one) or only a single item can
141
+ * be selected. If items are disabled they cannot selected. Items which are not visible are not rendered. This items can
142
+ * no longer be selected or deselected either. Making a selected item invisible can lead to undefined behavior
143
+ * in the selection state.
144
+ * Clicking an unselected item selects it.
145
+ * Clicking a selected item which is not part of a set or range, deselects it.
146
+ * Clicking a selected item of a list or range will deselect the other items in the range or set
147
+ * Clicking with CTRL adds or removes to a selection set.
148
+ * Clicking with SHIFT will create a selection range, starting or ending with the first item in the list
149
+ * or the last normally selected item (not the last item clicked with CTRL for instance).
150
+ * @vue-prop {Array<VcsListItem>} items
151
+ * @vue-prop {boolean} [selectable=false]
152
+ * @vue-prop {boolean} [singleSelect=false]
153
+ * @vue-prop {Array<VcsListItem>} [value=[]] - the initial items to be selected.
154
+ * @vue-prop {boolean} [searchable=false] - if this list can have its items searched. you can provide your own predicate function by providing "filterPredicate" which is of type function(VcsListItem, string):boolean
155
+ * @vue-prop {string} [searchbarPlaceholder] - placeholder to render inside the search field
156
+ * @vue-prop {boolean} [showTitle=true] - show the title component
157
+ * @vue-prop {number} [actionButtonListOverflowCount] - overflow count to use for action lists in the title and items
158
+ * @vue-prop {string} [title] - the lists title
159
+ * @vue-prop {string} [icon] - icon to prepend to the list title
160
+ * @vue-prop {string} [tooltip] - tooltip to render on the list title
161
+ * @vue-prop {Array<VcsAction>} [actions] - actions to render in the list title
162
+ */
163
+ export default {
164
+ name: 'VcsList',
165
+ components: {
166
+ VcsTreeviewSearchbar,
167
+ VcsActionButtonList,
168
+ VList,
169
+ VListItem,
170
+ VListItemContent,
171
+ VListItemAction,
172
+ VIcon,
173
+ VListItemTitle,
174
+ },
175
+ props: {
176
+ /** @type {Array<VcsListItem>} */
177
+ items: {
178
+ type: Array,
179
+ required: true,
180
+ },
181
+ selectable: {
182
+ type: Boolean,
183
+ default: false,
184
+ },
185
+ singleSelect: {
186
+ type: Boolean,
187
+ default: false,
188
+ },
189
+ /** @type {Array<VcsListItem>} */
190
+ value: {
191
+ type: Array,
192
+ default: () => [],
193
+ },
194
+ searchable: {
195
+ type: Boolean,
196
+ default: false,
197
+ },
198
+ searchbarPlaceholder: {
199
+ type: String,
200
+ default: undefined,
201
+ },
202
+ showTitle: {
203
+ type: Boolean,
204
+ default: true,
205
+ },
206
+ actionButtonListOverflowCount: {
207
+ type: Number,
208
+ required: false,
209
+ default: undefined,
210
+ },
211
+ title: {
212
+ type: String,
213
+ required: false,
214
+ default: '',
215
+ },
216
+ icon: {
217
+ type: String,
218
+ required: false,
219
+ default: undefined,
220
+ },
221
+ tooltip: {
222
+ type: String,
223
+ required: false,
224
+ default: '',
225
+ },
226
+ actions: {
227
+ type: Array,
228
+ required: false,
229
+ default: undefined,
230
+ },
231
+ },
232
+ setup(props, { emit }) {
233
+ /** @type {import("vue").Ref<Array<VcsListItem>>} */
234
+ const selected = ref(props.value);
235
+ /** @type {import("vue").Ref<string>} */
236
+ const query = ref('');
237
+ const hovering = ref(null);
238
+ let firstSelected = null;
239
+
240
+ watch(props, () => {
241
+ if (selected.value !== props.value) {
242
+ selected.value = props.value;
243
+ }
244
+ if (props.singleSelect && selected.value.length > 1) {
245
+ selected.value
246
+ .filter((i, index) => index && i.selectionChanged)
247
+ .forEach(i => i.selectionChanged(false));
248
+ selected.value = [selected.value[0]];
249
+ emit('input', selected);
250
+ }
251
+ if (!props.selectable && selected.value.length > 0) {
252
+ selected.value
253
+ .filter(i => i.selectionChanged)
254
+ .forEach(i => i.selectionChanged(false));
255
+ selected.value = [];
256
+ emit('input', selected);
257
+ }
258
+ if (!props.searchable) {
259
+ query.value = '';
260
+ }
261
+ }, { immediate: true, deep: false });
262
+
263
+ const vm = getCurrentInstance().proxy;
264
+ /** @type {function(VcsListItem, string):boolean} */
265
+ const filterPredicate = inject('filterPredicate', (item, queryString = '') => {
266
+ const translatedTitle = vm.$t(item.title);
267
+ return translatedTitle.toLocaleLowerCase().includes(queryString.toLocaleLowerCase());
268
+ });
269
+
270
+ return {
271
+ query,
272
+ hovering,
273
+ /**
274
+ * @type {import("vue").ComputedRef<Array<VcsListItem>>}
275
+ */
276
+ renderingItems: computed(() => {
277
+ let items = props.items.filter(i => i.visible !== false);
278
+ if (query.value) {
279
+ items = items.filter(i => filterPredicate(i, query.value));
280
+ }
281
+ return items;
282
+ }),
283
+ /** @type {import("vue").Ref<Array<VcsListItem>>} */
284
+ selected,
285
+ /**
286
+ * @param {VcsListItem} item
287
+ * @param {PointerEvent} event
288
+ */
289
+ select(item, event) {
290
+ if (!props.selectable || item.disabled) {
291
+ return;
292
+ }
293
+ if (props.singleSelect) {
294
+ if (selected.value[0] === item) {
295
+ item.selectionChanged?.(false);
296
+ selected.value = [];
297
+ firstSelected = null;
298
+ } else {
299
+ selected.value[0]?.selectionChanged?.(false);
300
+ item.selectionChanged?.(true);
301
+ selected.value = [item];
302
+ firstSelected = item;
303
+ }
304
+ } else if (event.shiftKey) {
305
+ let firstIndex = 0;
306
+ if (firstSelected) {
307
+ firstIndex = this.renderingItems.indexOf(firstSelected);
308
+ }
309
+ const currentIndex = this.renderingItems.indexOf(item);
310
+ if (firstIndex > -1 && currentIndex > -1) {
311
+ const currentSelection = [...selected.value];
312
+ selected.value = this.renderingItems.slice(
313
+ Math.min(firstIndex, currentIndex),
314
+ Math.max(firstIndex, currentIndex) + 1,
315
+ );
316
+ currentSelection.forEach((oldItem) => {
317
+ if (oldItem.selectionChanged && !selected.value.includes(oldItem)) {
318
+ oldItem.selectionChanged(false);
319
+ }
320
+ });
321
+ selected.value.forEach((newItem) => {
322
+ if (newItem.selectionChanged && !currentSelection.includes(newItem)) {
323
+ newItem.selectionChanged(true);
324
+ }
325
+ });
326
+ } else {
327
+ selected.value
328
+ .filter(i => i !== item && i.selectionChanged)
329
+ .forEach(i => i.selectionChanged(false));
330
+ selected.value = [];
331
+ firstSelected = null;
332
+ }
333
+ } else if (selected.value.includes(item)) {
334
+ if (event.ctrlKey) {
335
+ item.selectionChanged?.(false);
336
+ selected.value = selected.value.filter(i => i !== item);
337
+ } else if (selected.value.length > 1) {
338
+ selected.value
339
+ .filter(i => i !== item && i.selectionChanged)
340
+ .forEach(i => i.selectionChanged(false));
341
+ selected.value = [item];
342
+ firstSelected = item;
343
+ } else {
344
+ item.selectionChanged?.(false);
345
+ selected.value = [];
346
+ firstSelected = null;
347
+ }
348
+ } else if (event.ctrlKey) {
349
+ item.selectionChanged?.(true);
350
+ selected.value = [...selected.value, item];
351
+ if (selected.value.length === 1) {
352
+ firstSelected = item;
353
+ }
354
+ } else {
355
+ selected.value
356
+ .filter(i => i !== item && i.selectionChanged)
357
+ .forEach(i => i.selectionChanged(false));
358
+ item.selectionChanged?.(true);
359
+ selected.value = [item];
360
+ firstSelected = item;
361
+ }
362
+
363
+ emit('input', selected.value);
364
+ },
365
+ /**
366
+ * @param {VcsListItem} item
367
+ */
368
+ add(item) {
369
+ if (!selected.value.includes(item) && !item.disabled) {
370
+ item.selectionChanged?.(true);
371
+ selected.value = [...selected.value, item];
372
+ emit('input', selected.value);
373
+ }
374
+ },
375
+ /**
376
+ * @param {VcsListItem} item
377
+ */
378
+ remove(item) {
379
+ if (selected.value.includes(item) && !item.disabled) {
380
+ item.selectionChanged?.(false);
381
+ selected.value = selected.value.filter(i => i !== item);
382
+ emit('input', selected.value);
383
+ }
384
+ },
385
+ clear() {
386
+ selected.value
387
+ .filter(i => i.selectionChanged)
388
+ .forEach(i => i.selectionChanged(false));
389
+ selected.value = [];
390
+ firstSelected = null;
391
+ emit('input', selected.value);
392
+ },
393
+ selectAll() {
394
+ const currentSelection = [...selected.value];
395
+ selected.value = this.renderingItems.slice(0);
396
+ selected.value.forEach((item) => {
397
+ if (item.selectionChanged && !currentSelection.includes(item)) {
398
+ item.selectionChanged(true);
399
+ }
400
+ });
401
+ emit('input', selected.value);
402
+ },
403
+ };
404
+ },
405
+ };
406
+ </script>
407
+
408
+ <style lang="scss" scoped>
409
+ ::v-deep {
410
+ .v-list{
411
+ .v-list-item {
412
+ padding: 4px 8px 4px 16px;
413
+ display: grid;
414
+ grid-template-columns: auto auto;
415
+ &:after{
416
+ display: none;
417
+ }
418
+ &.font-weight-bold{
419
+ .v-list-item__title{
420
+ font-weight: 700;
421
+ }
422
+ }
423
+ &.v-list-item--active{
424
+ padding: 4px 8px 3px 16px;
425
+ &.theme--light{
426
+ background-color: var(--v-primary-base);
427
+ border-bottom: 1px solid var(--v-primary-darken1);
428
+ }
429
+ }
430
+ &.v-list-item.theme--dark{
431
+ &.v-list-item--active{
432
+ background-color: var(--v-primary-darken1);
433
+ border-bottom: 1px solid var(--v-primary-darken2);
434
+ &:nth-child(even){
435
+ background-color: var(--v-primary-darken1);
436
+ }
437
+ }
438
+ &:nth-child(even){
439
+ background-color: rgba(255, 255, 255, 0.15);
440
+ }
441
+ }
442
+ &:nth-child(even) {
443
+ background-color: var(--v-accent-base);
444
+ }
445
+ .v-list-item__action {
446
+ .v-icon {
447
+ font-size: 16px;
448
+ }
449
+ }
450
+ .v-list-item__content {
451
+ flex-wrap: nowrap;
452
+ column-gap: 4px;
453
+ .v-icon,
454
+ .action-btn-wrap {
455
+ flex: 1 1 auto;
456
+ }
457
+ .v-icon{
458
+ font-size: 16px;
459
+ .v-icon__component{
460
+ width: 16px;
461
+ height: 16px;
462
+ }
463
+ }
464
+ }
465
+ }
466
+ }
467
+ }
468
+ </style>
@@ -13,13 +13,12 @@
13
13
  item-key="name"
14
14
  :search="search"
15
15
  :filter="handleFilter"
16
- :activatable="false"
17
16
  >
18
17
  <template #label="{ item }">
19
18
  <VcsTreeviewLeaf
20
19
  :item="item"
21
20
  :class="[item.clickable ? 'cursor-pointer' : '']"
22
- @click.native="item.clickable && item.clicked()"
21
+ @click.native="item.clickable && item.clicked($event)"
23
22
  />
24
23
  </template>
25
24
  </v-treeview>