@vcmap/ui 6.0.12 → 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-1d7afc4a.js → core-9d0cfec3.js} +6861 -5788
- 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-21d54a73.js → ui-08446666.js} +17374 -19067
- package/dist/assets/ui.js +1 -1
- package/dist/assets/vue.js +1 -1
- package/dist/assets/{vuetify-e7de6710.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-21d54a73.css +0 -1
- /package/dist/assets/{cesium-72d0b355.js → cesium-11e5bbc6.js} +0 -0
- /package/dist/assets/{ol-6dcd0d3d.js → ol-0d0ebb27.js} +0 -0
- /package/dist/assets/{vue-24ff798c.js → vue-2f81c7f8.js} +0 -0
- /package/dist/assets/{vuetify-e7de6710.css → vuetify-67025c41.css} +0 -0
@@ -0,0 +1,67 @@
|
|
1
|
+
import { CesiumMap, startRotation } from '@vcmap/core';
|
2
|
+
import VcsCallback, { callbackClassRegistry } from './vcsCallback.js';
|
3
|
+
|
4
|
+
/**
|
5
|
+
* @typedef {import("./vcsCallback.js").VcsCallbackOptions & { viewpoint: string, timePerRotation: number }} StartRotationOptions
|
6
|
+
* @property {string?} viewpoint - name of the viewpoint
|
7
|
+
* @property {number?} timePerRotation - time in seconds for a full rotation
|
8
|
+
*/
|
9
|
+
|
10
|
+
/**
|
11
|
+
* @class
|
12
|
+
* @extends {VcsCallback}
|
13
|
+
*/
|
14
|
+
class StartRotationCallback extends VcsCallback {
|
15
|
+
/**
|
16
|
+
* @type {string}
|
17
|
+
*/
|
18
|
+
static get className() {
|
19
|
+
return 'StartRotationCallback';
|
20
|
+
}
|
21
|
+
|
22
|
+
/**
|
23
|
+
* @param {StartRotationOptions} options
|
24
|
+
* @param {import("@src/vcsUiApp.js").default} app
|
25
|
+
*/
|
26
|
+
constructor(options, app) {
|
27
|
+
super(options, app);
|
28
|
+
/**
|
29
|
+
* @type {string | undefined}
|
30
|
+
* @private
|
31
|
+
*/
|
32
|
+
this._viewpoint = options.viewpoint;
|
33
|
+
/**
|
34
|
+
* @type {number | undefined}
|
35
|
+
* @private
|
36
|
+
*/
|
37
|
+
this._timePerRotation = options.timePerRotation;
|
38
|
+
}
|
39
|
+
|
40
|
+
async callback() {
|
41
|
+
const vp = this._app.viewpoints.getByKey(this._viewpoint);
|
42
|
+
const speed = this._timePerRotation;
|
43
|
+
if (this._app.maps.activeMap instanceof CesiumMap) {
|
44
|
+
await startRotation(this._app, vp, speed);
|
45
|
+
}
|
46
|
+
}
|
47
|
+
|
48
|
+
/**
|
49
|
+
* @returns {StartRotationOptions}
|
50
|
+
*/
|
51
|
+
toJSON() {
|
52
|
+
const config = super.toJSON();
|
53
|
+
if (this._viewpoint) {
|
54
|
+
config.viewpoint = this._viewpoint;
|
55
|
+
}
|
56
|
+
if (this._timePerRotation) {
|
57
|
+
config.timePerRotation = this._timePerRotation;
|
58
|
+
}
|
59
|
+
return config;
|
60
|
+
}
|
61
|
+
}
|
62
|
+
|
63
|
+
export default StartRotationCallback;
|
64
|
+
callbackClassRegistry.registerClass(
|
65
|
+
StartRotationCallback.className,
|
66
|
+
StartRotationCallback,
|
67
|
+
);
|
@@ -0,0 +1,37 @@
|
|
1
|
+
import { rotationMapControlSymbol } from '@vcmap/core';
|
2
|
+
import VcsCallback, { callbackClassRegistry } from './vcsCallback.js';
|
3
|
+
|
4
|
+
/**
|
5
|
+
* @class
|
6
|
+
* @extends {VcsCallback}
|
7
|
+
*/
|
8
|
+
class StopRotationCallback extends VcsCallback {
|
9
|
+
/**
|
10
|
+
* @type {string}
|
11
|
+
*/
|
12
|
+
static get className() {
|
13
|
+
return 'StopRotationCallback';
|
14
|
+
}
|
15
|
+
|
16
|
+
// eslint-disable-next-line class-methods-use-this
|
17
|
+
callback() {
|
18
|
+
if (this._app.maps.exclusiveMapControlsId === rotationMapControlSymbol) {
|
19
|
+
this._app.maps.resetExclusiveMapControls();
|
20
|
+
}
|
21
|
+
}
|
22
|
+
|
23
|
+
/**
|
24
|
+
* @returns {import('./vcsCallback.js').VcsCallbackOptions}
|
25
|
+
*/
|
26
|
+
toJSON() {
|
27
|
+
return super.toJSON();
|
28
|
+
}
|
29
|
+
}
|
30
|
+
|
31
|
+
export default StopRotationCallback;
|
32
|
+
|
33
|
+
// Register the class
|
34
|
+
callbackClassRegistry.registerClass(
|
35
|
+
StopRotationCallback.className,
|
36
|
+
StopRotationCallback,
|
37
|
+
);
|
@@ -110,6 +110,7 @@ import ViewshedConeIcon from './ViewshedConeIcon.vue';
|
|
110
110
|
import WalkingIcon from './WalkingIcon.vue';
|
111
111
|
import WallIcon from './WallIcon.vue';
|
112
112
|
import WandIcon from './WandIcon.vue';
|
113
|
+
import View360Icon from './View360Icon.vue';
|
113
114
|
|
114
115
|
// * // IconMap.boundingBox
|
115
116
|
// * <v-icon size="16" v-text="'$vcsBoundingBox'" />
|
@@ -459,6 +460,9 @@ const IconMap = {
|
|
459
460
|
viewshed360: {
|
460
461
|
component: Viewshed360Icon,
|
461
462
|
},
|
463
|
+
view360: {
|
464
|
+
component: View360Icon,
|
465
|
+
},
|
462
466
|
viewshedCone: {
|
463
467
|
component: ViewshedConeIcon,
|
464
468
|
},
|
@@ -0,0 +1,55 @@
|
|
1
|
+
<!-- eslint-disable max-len -->
|
2
|
+
|
3
|
+
<template>
|
4
|
+
<svg
|
5
|
+
id="Ebene_1"
|
6
|
+
data-name="Ebene 1"
|
7
|
+
xmlns="http://www.w3.org/2000/svg"
|
8
|
+
viewBox="46 75 301 268"
|
9
|
+
>
|
10
|
+
<path
|
11
|
+
d="M302.18,95.55c0-5.63,1.98-10.41,5.94-14.35,3.96-3.94,8.73-5.9,14.31-5.9s10.36,1.98,14.31,5.93c3.96,3.96,5.93,8.73,5.93,14.31s-1.98,10.36-5.93,14.31c-3.96,3.96-8.73,5.93-14.31,5.93s-10.36-1.98-14.31-5.93c-3.96-3.96-5.94-8.73-5.94-14.31ZM312.72,95.55c0,2.67.95,4.95,2.86,6.86s4.19,2.86,6.86,2.86,4.95-.95,6.86-2.86,2.86-4.19,2.86-6.86-.95-4.95-2.86-6.86-4.19-2.86-6.86-2.86-4.95.95-6.86,2.86-2.86,4.19-2.86,6.86Z"
|
12
|
+
style="fill: currentColor; stroke-width: 0px"
|
13
|
+
/>
|
14
|
+
<path
|
15
|
+
d="M68.99,176.62s-17.77,19.47-7.44,43.07c10.78,23.59,58.52,59.55,147.63,57.9"
|
16
|
+
style="
|
17
|
+
fill: none;
|
18
|
+
stroke: currentColor;
|
19
|
+
stroke-miterlimit: 10;
|
20
|
+
stroke-width: 24px;
|
21
|
+
"
|
22
|
+
/>
|
23
|
+
<path
|
24
|
+
d="M88.05,150.42l18.59-2.26c.59,4.74,2.19,8.36,4.79,10.87,2.6,2.51,5.74,3.76,9.43,3.76,3.96,0,7.3-1.5,10.01-4.51,2.71-3.01,4.07-7.06,4.07-12.17,0-4.83-1.3-8.66-3.9-11.48-2.6-2.83-5.77-4.24-9.5-4.24-2.46,0-5.4.48-8.82,1.44l2.12-15.65c5.2.14,9.16-.99,11.89-3.38s4.1-5.57,4.1-9.54c0-3.37-1-6.06-3.01-8.07-2.01-2-4.67-3.01-8-3.01s-6.08,1.14-8.41,3.42c-2.32,2.28-3.74,5.61-4.24,9.98l-17.71-3.01c1.23-6.06,3.09-10.9,5.57-14.53,2.48-3.62,5.95-6.47,10.39-8.54,4.44-2.07,9.42-3.11,14.94-3.11,9.43,0,17,3.01,22.7,9.02,4.69,4.92,7.04,10.48,7.04,16.68,0,8.8-4.81,15.81-14.42,21.05,5.74,1.23,10.33,3.99,13.77,8.27,3.44,4.28,5.16,9.46,5.16,15.52,0,8.8-3.21,16.29-9.64,22.49-6.43,6.2-14.42,9.3-23.99,9.3-9.07,0-16.59-2.61-22.56-7.83-5.97-5.22-9.43-12.04-10.39-20.47Z"
|
25
|
+
style="fill: currentColor; stroke-width: 0px"
|
26
|
+
/>
|
27
|
+
<path
|
28
|
+
d="M227.48,101.33l-18.59,2.05c-.46-3.83-1.64-6.65-3.55-8.48-1.91-1.82-4.4-2.73-7.45-2.73-4.06,0-7.49,1.82-10.29,5.47-2.8,3.65-4.57,11.23-5.3,22.76,4.79-5.65,10.73-8.48,17.84-8.48,8.02,0,14.89,3.05,20.61,9.16,5.72,6.11,8.58,13.99,8.58,23.65,0,10.25-3.01,18.48-9.02,24.68-6.02,6.2-13.74,9.3-23.17,9.3-10.12,0-18.43-3.93-24.95-11.79-6.52-7.86-9.78-20.75-9.78-38.66s3.39-31.6,10.19-39.72c6.79-8.11,15.61-12.17,26.46-12.17,7.61,0,13.91,2.13,18.9,6.39,4.99,4.26,8.17,10.45,9.54,18.56ZM183.93,143.24c0,6.24,1.44,11.06,4.31,14.46,2.87,3.4,6.15,5.09,9.84,5.09s6.52-1.39,8.89-4.17c2.37-2.78,3.55-7.34,3.55-13.67s-1.28-11.29-3.83-14.32c-2.55-3.03-5.74-4.55-9.57-4.55s-6.81,1.45-9.37,4.34c-2.55,2.89-3.83,7.17-3.83,12.82Z"
|
29
|
+
style="fill: currentColor; stroke-width: 0px"
|
30
|
+
/>
|
31
|
+
<path
|
32
|
+
d="M268.53,76.38c9.71,0,17.29,3.46,22.76,10.39,6.52,8.2,9.78,21.81,9.78,40.81s-3.28,32.58-9.84,40.88c-5.42,6.84-12.99,10.25-22.7,10.25s-17.61-3.75-23.58-11.24c-5.97-7.5-8.96-20.86-8.96-40.09s3.28-32.45,9.84-40.74c5.42-6.84,12.99-10.25,22.7-10.25ZM268.53,92.31c-2.32,0-4.4.74-6.22,2.22-1.82,1.48-3.24,4.14-4.24,7.96-1.32,4.97-1.98,13.33-1.98,25.09s.59,19.84,1.78,24.23c1.18,4.4,2.68,7.33,4.48,8.78,1.8,1.46,3.86,2.19,6.19,2.19s4.4-.74,6.22-2.22c1.82-1.48,3.24-4.14,4.24-7.96,1.32-4.92,1.98-13.26,1.98-25.02s-.59-19.83-1.78-24.23c-1.19-4.4-2.68-7.34-4.48-8.82-1.8-1.48-3.86-2.22-6.19-2.22Z"
|
33
|
+
style="fill: currentColor; stroke-width: 0px"
|
34
|
+
/>
|
35
|
+
<polyline
|
36
|
+
points="167.32 222.17 212.66 279.35 161.89 325.7"
|
37
|
+
style="
|
38
|
+
fill: none;
|
39
|
+
stroke: currentColor;
|
40
|
+
stroke-linecap: square;
|
41
|
+
stroke-miterlimit: 10;
|
42
|
+
stroke-width: 24px;
|
43
|
+
"
|
44
|
+
/>
|
45
|
+
<path
|
46
|
+
d="M323.31,175.13s18.39,18.8,8.83,42.77c-7.13,17.07-32.78,41.11-79.15,54.13"
|
47
|
+
style="
|
48
|
+
fill: none;
|
49
|
+
stroke: currentColor;
|
50
|
+
stroke-miterlimit: 10;
|
51
|
+
stroke-width: 24px;
|
52
|
+
"
|
53
|
+
/>
|
54
|
+
</svg>
|
55
|
+
</template>
|
@@ -0,0 +1,237 @@
|
|
1
|
+
<template>
|
2
|
+
<div class="vcs-tree-node" v-if="matchFilter">
|
3
|
+
<v-row
|
4
|
+
no-gutters
|
5
|
+
class="treenode flex-nowrap text-truncate"
|
6
|
+
:class="`level-${level} ${children.length ? 'group' : 'item'}`"
|
7
|
+
>
|
8
|
+
<VBtn
|
9
|
+
v-if="children.length"
|
10
|
+
class="chevron-btn"
|
11
|
+
variant="text"
|
12
|
+
:icon="isOpen ? 'mdi-chevron-down' : 'mdi-chevron-right'"
|
13
|
+
@click="isOpen = !isOpen"
|
14
|
+
/>
|
15
|
+
<slot name="prepend" v-bind="{ item }">
|
16
|
+
<span class="prepend">
|
17
|
+
<div v-if="item.icon">
|
18
|
+
<v-icon v-if="typeof item?.icon === 'string'" :size="iconSize">
|
19
|
+
{{ item.icon }}
|
20
|
+
</v-icon>
|
21
|
+
<ImageElementInjector :element="item.icon" v-else />
|
22
|
+
</div>
|
23
|
+
</span>
|
24
|
+
</slot>
|
25
|
+
<slot name="title" v-bind="{ item }">
|
26
|
+
<VcsTreeviewTitle
|
27
|
+
:item="item"
|
28
|
+
:cursor-pointer="item.clickable || (openOnClick && !!children.length)"
|
29
|
+
@click="(event) => $emit('click', item, event)"
|
30
|
+
/>
|
31
|
+
</slot>
|
32
|
+
<slot name="append" v-bind="{ item }">
|
33
|
+
<VcsActionButtonList
|
34
|
+
v-if="item.actions?.length > 0"
|
35
|
+
:actions="item.actions"
|
36
|
+
:overflow-count="3"
|
37
|
+
:disabled="item.disabled"
|
38
|
+
right
|
39
|
+
tooltip-position="right"
|
40
|
+
block-overflow
|
41
|
+
class="col-4 pa-0 ml-auto pr-4"
|
42
|
+
/>
|
43
|
+
</slot>
|
44
|
+
</v-row>
|
45
|
+
<v-expand-transition>
|
46
|
+
<div v-if="isOpen && children.length" class="children">
|
47
|
+
<VcsTreeNode
|
48
|
+
v-for="child in children"
|
49
|
+
:key="child.name"
|
50
|
+
:item="child"
|
51
|
+
:search="search"
|
52
|
+
:level="level + 1"
|
53
|
+
:open-on-click="openOnClick"
|
54
|
+
:item-children="itemChildren"
|
55
|
+
:opened="opened"
|
56
|
+
@item-toggled="bubbleItemToggled(child, e)"
|
57
|
+
@click="bubbleItemClicked"
|
58
|
+
>
|
59
|
+
<template v-for="slot of forwardSlots" #[slot]="scope">
|
60
|
+
<slot :name="slot" v-bind="scope ?? {}" />
|
61
|
+
</template>
|
62
|
+
</VcsTreeNode>
|
63
|
+
</div>
|
64
|
+
</v-expand-transition>
|
65
|
+
</div>
|
66
|
+
</template>
|
67
|
+
|
68
|
+
<script>
|
69
|
+
import { computed, getCurrentInstance } from 'vue';
|
70
|
+
import { VBtn, VExpandTransition, VIcon, VRow } from 'vuetify/components';
|
71
|
+
import { useIconSize } from '../../vuePlugins/vuetify.js';
|
72
|
+
import { getForwardSlots } from '../composables.js';
|
73
|
+
import ImageElementInjector from '../ImageElementInjector.vue';
|
74
|
+
import VcsActionButtonList from '../buttons/VcsActionButtonList.vue';
|
75
|
+
import VcsTreeviewTitle from './VcsTreeviewTitle.vue';
|
76
|
+
|
77
|
+
/**
|
78
|
+
* @typedef {Object} VcsTreeNodeItem
|
79
|
+
* @property {string} name
|
80
|
+
* @property {string} [title] - An optional translatable title.
|
81
|
+
* @property {string} [tooltip]
|
82
|
+
* @property {boolean} [clickable] - Whether this item reacts to click events.
|
83
|
+
* @property {boolean} [disabled] - Whether this item should be displayed as disabled.
|
84
|
+
* @property {Array<import("../../actions/actionHelper.js").VcsAction>} [actions]
|
85
|
+
* @property {Array<VcsTreeNodeItem>} [children] - An optional array of children. Can be binded to another key, using the `item-children` attributes of the VcsTreeview component.
|
86
|
+
* @property {string|HTMLCanvasElement|HTMLImageElement|undefined} [icon] - An optional icon to display with this item. Can be a URL or HTMLElement.
|
87
|
+
* @property {function(string):void} [clicked] - A callback called when the item is clicked.
|
88
|
+
*/
|
89
|
+
|
90
|
+
/**
|
91
|
+
* @description
|
92
|
+
* A recursive component to render a treenode and its children.
|
93
|
+
* Exposes the `prepend`, `title` and `append` slots for customization.
|
94
|
+
* Emits `itemToggled` and `click` events.
|
95
|
+
* @vue-prop {VcsTreeNodeItem} item - The item to render.
|
96
|
+
* @vue-prop {Array<string>} opened - Names of the opened items.
|
97
|
+
* @vue-prop {number} [level=0] - The level of the item
|
98
|
+
* @vue-prop {string} [itemChildren='children'] - The property key of the children.
|
99
|
+
* @vue-prop {boolean} [openOnClick=false] - Whether to open items on title click..
|
100
|
+
* @vue-prop {string} [search] - The search string to filter the tree.
|
101
|
+
* @vue-data {slot} [#prepend] - A slot prepended to the item, binding the item. Default fallback renders an image.
|
102
|
+
* @vue-data {slot} [#title] - A slot to render the item title, binding the item. Default fallback renders a translatable title using the VcsTreeviewTitle component.
|
103
|
+
* @vue-data {slot} [#append] - A slot appended to the item, binding the item. Default fallback renders the VcsActionButtonList if the item has an array of Actions.
|
104
|
+
*/
|
105
|
+
export default {
|
106
|
+
name: 'VcsTreeNode',
|
107
|
+
components: {
|
108
|
+
ImageElementInjector,
|
109
|
+
VBtn,
|
110
|
+
VExpandTransition,
|
111
|
+
VIcon,
|
112
|
+
VRow,
|
113
|
+
VcsActionButtonList,
|
114
|
+
VcsTreeviewTitle,
|
115
|
+
},
|
116
|
+
props: {
|
117
|
+
/** @type {VcsTreeNodeItem} */
|
118
|
+
item: {
|
119
|
+
type: Object,
|
120
|
+
required: true,
|
121
|
+
},
|
122
|
+
opened: {
|
123
|
+
type: Array,
|
124
|
+
required: true,
|
125
|
+
},
|
126
|
+
level: {
|
127
|
+
type: Number,
|
128
|
+
default: 0,
|
129
|
+
},
|
130
|
+
openOnClick: {
|
131
|
+
type: Boolean,
|
132
|
+
default: false,
|
133
|
+
},
|
134
|
+
itemChildren: {
|
135
|
+
type: String,
|
136
|
+
default: 'children',
|
137
|
+
},
|
138
|
+
search: {
|
139
|
+
type: String,
|
140
|
+
default: undefined,
|
141
|
+
},
|
142
|
+
},
|
143
|
+
emits: ['itemToggled', 'click'],
|
144
|
+
setup(props, { emit, slots }) {
|
145
|
+
const vm = getCurrentInstance().proxy;
|
146
|
+
const iconSize = useIconSize();
|
147
|
+
const forwardSlots = getForwardSlots(slots);
|
148
|
+
|
149
|
+
const isOpen = computed({
|
150
|
+
get: () => props.opened?.includes(props.item.name),
|
151
|
+
set: (value) => {
|
152
|
+
emit('itemToggled', props.item.name, value);
|
153
|
+
},
|
154
|
+
});
|
155
|
+
|
156
|
+
const children = computed(() => props.item[props.itemChildren] ?? []);
|
157
|
+
|
158
|
+
const matchFilter = computed(() => {
|
159
|
+
if (!props.search) {
|
160
|
+
return true;
|
161
|
+
}
|
162
|
+
const translatedTitle = (item) =>
|
163
|
+
item.title ? vm.$t(item.title) : item.name;
|
164
|
+
|
165
|
+
const hasText = (item) =>
|
166
|
+
translatedTitle(item)
|
167
|
+
.toLocaleLowerCase()
|
168
|
+
.indexOf(props.search.toLocaleLowerCase()) > -1 ||
|
169
|
+
item[props.itemChildren]?.some(hasText);
|
170
|
+
|
171
|
+
return hasText(props.item);
|
172
|
+
});
|
173
|
+
|
174
|
+
return {
|
175
|
+
forwardSlots,
|
176
|
+
isOpen,
|
177
|
+
matchFilter,
|
178
|
+
iconSize,
|
179
|
+
children,
|
180
|
+
|
181
|
+
// Bubble up events for the nested tree-items
|
182
|
+
bubbleItemToggled: (itemName, openState) => {
|
183
|
+
emit('itemToggled', itemName, openState);
|
184
|
+
},
|
185
|
+
bubbleItemClicked: (item, event) => {
|
186
|
+
emit('click', item, event);
|
187
|
+
},
|
188
|
+
};
|
189
|
+
},
|
190
|
+
};
|
191
|
+
</script>
|
192
|
+
|
193
|
+
<style lang="scss" scoped>
|
194
|
+
.treenode {
|
195
|
+
align-items: center !important;
|
196
|
+
min-height: calc(var(--v-vcs-font-size) * 2 + 6px);
|
197
|
+
}
|
198
|
+
@for $i from 0 through 6 {
|
199
|
+
.level-#{$i} {
|
200
|
+
padding-left: calc(var(--v-vcs-font-size) * $i + 2px);
|
201
|
+
&.item {
|
202
|
+
& > .prepend:not(:has(.v-icon)) {
|
203
|
+
margin-left: calc(var(--v-vcs-font-size) * 2);
|
204
|
+
}
|
205
|
+
& > .prepend:has(.v-icon) {
|
206
|
+
margin-left: 4px;
|
207
|
+
}
|
208
|
+
}
|
209
|
+
}
|
210
|
+
}
|
211
|
+
.prepend {
|
212
|
+
:deep(.v-icon) {
|
213
|
+
margin-right: 6px;
|
214
|
+
display: flex;
|
215
|
+
align-items: start;
|
216
|
+
}
|
217
|
+
}
|
218
|
+
// Indent children padding
|
219
|
+
.children {
|
220
|
+
padding-left: var(--v-vcs-font-size);
|
221
|
+
}
|
222
|
+
// set the size of the buttons, except for the ActionButtonList
|
223
|
+
:deep(.v-btn):not(.vcs-button) {
|
224
|
+
width: var(--v-vcs-font-size);
|
225
|
+
height: var(--v-vcs-font-size);
|
226
|
+
// for alignment of chevron
|
227
|
+
display: flex;
|
228
|
+
&.chevron-btn {
|
229
|
+
margin-left: 4px;
|
230
|
+
margin-right: 8px;
|
231
|
+
}
|
232
|
+
}
|
233
|
+
// remove hover shadow over button
|
234
|
+
:deep(.v-btn__overlay) {
|
235
|
+
--v-hover-opacity: 0;
|
236
|
+
}
|
237
|
+
</style>
|
@@ -0,0 +1,31 @@
|
|
1
|
+
declare const _default: import("vue").DefineSetupFnComponent<Record<string, any>, {}, {}, Record<string, any> & {}, import("vue").PublicProps>;
|
2
|
+
export default _default;
|
3
|
+
export type VcsTreeNodeItem = {
|
4
|
+
name: string;
|
5
|
+
/**
|
6
|
+
* - An optional translatable title.
|
7
|
+
*/
|
8
|
+
title?: string | undefined;
|
9
|
+
tooltip?: string | undefined;
|
10
|
+
/**
|
11
|
+
* - Whether this item reacts to click events.
|
12
|
+
*/
|
13
|
+
clickable?: boolean | undefined;
|
14
|
+
/**
|
15
|
+
* - Whether this item should be displayed as disabled.
|
16
|
+
*/
|
17
|
+
disabled?: boolean | undefined;
|
18
|
+
actions?: import("../../actions/actionHelper.js", { with: { "resolution-mode": "import" } }).VcsAction[] | undefined;
|
19
|
+
/**
|
20
|
+
* - An optional array of children. Can be binded to another key, using the `item-children` attributes of the VcsTreeview component.
|
21
|
+
*/
|
22
|
+
children?: VcsTreeNodeItem[] | undefined;
|
23
|
+
/**
|
24
|
+
* - An optional icon to display with this item. Can be a URL or HTMLElement.
|
25
|
+
*/
|
26
|
+
icon?: string | HTMLCanvasElement | HTMLImageElement | undefined;
|
27
|
+
/**
|
28
|
+
* - A callback called when the item is clicked.
|
29
|
+
*/
|
30
|
+
clicked?: ((arg0: string) => void) | undefined;
|
31
|
+
};
|