@vcmap/ui 5.0.0-rc.12 → 5.0.0-rc.13
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/README.md +1 -1
- package/dist/assets/{cesium.4057e6.js → cesium.21663e.js} +0 -0
- package/dist/assets/cesium.js +1 -1
- package/dist/assets/{core.deb2b7.js → core.63242d.js} +1 -1
- package/dist/assets/core.js +1 -1
- package/dist/assets/{index.7aa11f5a.js → index.44b91cfe.js} +1 -1
- package/dist/assets/{ol.70b137.js → ol.88ba9d.js} +0 -0
- package/dist/assets/ol.js +1 -1
- package/dist/assets/ui.3c2933.css +1 -0
- package/dist/assets/{ui.9eb282.js → ui.3c2933.js} +43 -42
- package/dist/assets/ui.js +1 -1
- package/dist/assets/{vue.65d93f.js → vue.c897fc.js} +0 -0
- package/dist/assets/vue.js +2 -2
- package/dist/assets/{vuetify.149dde.css → vuetify.147c3a.css} +0 -0
- package/dist/assets/{vuetify.149dde.js → vuetify.147c3a.js} +1 -1
- package/dist/assets/vuetify.js +2 -2
- package/dist/index.html +1 -1
- package/index.js +1 -0
- package/package.json +12 -2
- package/plugins/example/index.js +10 -23
- package/plugins/test/index.js +13 -4
- package/plugins/test/toolbox-data.js +82 -57
- package/src/application/VcsApp.vue +1 -1
- package/src/components/lists/VcsActionList.vue +13 -7
- package/src/featureInfo/BalloonComponent.vue +2 -0
- package/src/featureInfo/featureInfo.js +5 -3
- package/src/i18n/de.js +4 -0
- package/src/i18n/en.js +4 -0
- package/src/manager/buttonManager.js +2 -7
- package/src/manager/navbarManager.js +1 -1
- package/src/manager/toolbox/GroupToolboxComponent.vue +118 -0
- package/src/manager/toolbox/SelectToolboxComponent.vue +128 -0
- package/src/manager/toolbox/ToolboxManager.vue +116 -99
- package/src/manager/toolbox/toolboxManager.js +233 -88
- package/src/vcsUiApp.js +1 -1
- package/dist/assets/ui.9eb282.css +0 -1
- package/src/manager/toolbox/ToolboxGroupComponent.vue +0 -132
package/dist/assets/ui.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export * from "./ui.
|
|
1
|
+
export * from "./ui.3c2933.js";
|
|
File without changes
|
package/dist/assets/vue.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export * from "./vue.
|
|
2
|
-
export { default } from "./vue.
|
|
1
|
+
export * from "./vue.c897fc.js";
|
|
2
|
+
export { default } from "./vue.c897fc.js";
|
|
File without changes
|
|
@@ -10,7 +10,7 @@ function loadCss(href) {
|
|
|
10
10
|
elem.onerror = reject;
|
|
11
11
|
document.head.appendChild(elem);
|
|
12
12
|
});
|
|
13
|
-
} await loadCss('./assets/vuetify.
|
|
13
|
+
} await loadCss('./assets/vuetify.147c3a.css');var Qr=Object.defineProperty,Jr=Object.defineProperties;var to=Object.getOwnPropertyDescriptors;var oe=Object.getOwnPropertySymbols;var Ki=Object.prototype.hasOwnProperty,Xi=Object.prototype.propertyIsEnumerable;var Ui=(t,e,i)=>e in t?Qr(t,e,{enumerable:!0,configurable:!0,writable:!0,value:i}):t[e]=i,s=(t,e)=>{for(var i in e||(e={}))Ki.call(e,i)&&Ui(t,i,e[i]);if(oe)for(var i of oe(e))Xi.call(e,i)&&Ui(t,i,e[i]);return t},h=(t,e)=>Jr(t,to(e));var q=(t,e)=>{var i={};for(var a in t)Ki.call(t,a)&&e.indexOf(a)<0&&(i[a]=t[a]);if(t!=null&&oe)for(var a of oe(t))e.indexOf(a)<0&&Xi.call(t,a)&&(i[a]=t[a]);return i};import _ from"./vue.c897fc.js";var qd=(()=>`.theme--light.v-application{background:#FFFFFF;color:#000000de}.theme--light.v-application .text--primary{color:#000000de!important}.theme--light.v-application .text--secondary{color:#0009!important}.theme--light.v-application .text--disabled{color:#00000061!important}.theme--dark.v-application{background:#121212;color:#fff}.theme--dark.v-application .text--primary{color:#fff!important}.theme--dark.v-application .text--secondary{color:#ffffffb3!important}.theme--dark.v-application .text--disabled{color:#ffffff80!important}.v-application{display:flex;position:relative}.v-application a{cursor:pointer}.v-application--is-rtl{direction:rtl}.v-application--wrap{flex:1 1 auto;backface-visibility:hidden;display:flex;flex-direction:column;min-height:100vh;max-width:100%;position:relative}@-moz-document url-prefix(){@media print{.v-application,.v-application--wrap{display:block}}}
|
|
14
14
|
`)();const je=_.extend().extend({name:"themeable",provide(){return{theme:this.themeableProvide}},inject:{theme:{default:{isDark:!1}}},props:{dark:{type:Boolean,default:null},light:{type:Boolean,default:null}},data(){return{themeableProvide:{isDark:!1}}},computed:{appIsDark(){return this.$vuetify.theme.dark||!1},isDark(){return this.dark===!0?!0:this.light===!0?!1:this.theme.isDark},themeClasses(){return{"theme--dark":this.isDark,"theme--light":!this.isDark}},rootIsDark(){return this.dark===!0?!0:this.light===!0?!1:this.appIsDark},rootThemeClasses(){return{"theme--dark":this.rootIsDark,"theme--light":!this.rootIsDark}}},watch:{isDark:{handler(t,e){t!==e&&(this.themeableProvide.isDark=this.isDark)},immediate:!0}}});var y=je;function qi(t){const e=s(s({},t.props),t.injections),i=je.options.computed.isDark.call(e);return je.options.computed.themeClasses.call({isDark:i})}function v(...t){return _.extend({mixins:t})}var eo=v(y).extend({name:"v-app",props:{dark:{type:Boolean,default:void 0},id:{type:String,default:"app"},light:{type:Boolean,default:void 0}},computed:{isDark(){return this.$vuetify.theme.dark}},beforeCreate(){if(!this.$vuetify||this.$vuetify===this.$root)throw new Error("Vuetify is not properly initialized, see https://vuetifyjs.com/getting-started/quick-start#bootstrapping-the-vuetify-object")},render(t){const e=t("div",{staticClass:"v-application--wrap"},this.$slots.default);return t("div",{staticClass:"v-application",class:s({"v-application--is-rtl":this.$vuetify.rtl,"v-application--is-ltr":!this.$vuetify.rtl},this.themeClasses),attrs:{"data-app":!0},domProps:{id:this.id}},[e])}}),Zd=(()=>`.theme--light.v-app-bar.v-toolbar.v-sheet{background-color:#f5f5f5}.theme--dark.v-app-bar.v-toolbar.v-sheet{background-color:#272727}.v-sheet.v-app-bar.v-toolbar{border-radius:0}.v-sheet.v-app-bar.v-toolbar:not(.v-sheet--outlined){box-shadow:0 2px 4px -1px #0003,0 4px 5px #00000024,0 1px 10px #0000001f}.v-sheet.v-app-bar.v-toolbar.v-sheet--shaped{border-radius:24px 0}.v-app-bar:not([data-booted=true]){transition:none!important}.v-app-bar.v-app-bar--fixed{position:fixed;top:0;z-index:5}.v-app-bar.v-app-bar.v-app-bar--hide-shadow{box-shadow:0 0 #0003,0 0 #00000024,0 0 #0000001f!important}.v-app-bar--fade-img-on-scroll .v-toolbar__image .v-image__image{transition:.4s opacity cubic-bezier(.4,0,.2,1)}.v-app-bar.v-toolbar--prominent.v-app-bar--shrink-on-scroll .v-toolbar__image{will-change:opacity}.v-app-bar.v-toolbar--prominent.v-app-bar--shrink-on-scroll.v-app-bar--collapse-on-scroll .v-toolbar__extension{display:none}.v-app-bar.v-toolbar--prominent.v-app-bar--shrink-on-scroll.v-app-bar--is-scrolled .v-toolbar__title{padding-top:9px}.v-app-bar.v-toolbar--prominent.v-app-bar--shrink-on-scroll.v-app-bar--is-scrolled:not(.v-app-bar--bottom) .v-toolbar__title{padding-bottom:9px}.v-app-bar.v-app-bar--shrink-on-scroll .v-toolbar__title{font-size:inherit}.v-app-bar-title__placeholder,.v-app-bar-title__content{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.v-app-bar-title__content{position:absolute}
|
|
15
15
|
`)(),Qd=(()=>`.theme--light.v-toolbar.v-sheet{background-color:#fff}.theme--dark.v-toolbar.v-sheet{background-color:#272727}.v-sheet.v-toolbar{border-radius:0}.v-sheet.v-toolbar:not(.v-sheet--outlined){box-shadow:0 2px 4px -1px #0003,0 4px 5px #00000024,0 1px 10px #0000001f}.v-sheet.v-toolbar.v-sheet--shaped{border-radius:24px 0}.v-toolbar{contain:layout;display:block;flex:1 1 auto;max-width:100%;transition:.2s cubic-bezier(.4,0,.2,1) transform,.2s cubic-bezier(.4,0,.2,1) background-color,.2s cubic-bezier(.4,0,.2,1) left,.2s cubic-bezier(.4,0,.2,1) right,.28s cubic-bezier(.4,0,.2,1) box-shadow,.25s cubic-bezier(.4,0,.2,1) max-width,.25s cubic-bezier(.4,0,.2,1) width;position:relative;box-shadow:0 2px 4px -1px #0003,0 4px 5px #00000024,0 1px 10px #0000001f}.v-toolbar .v-input{padding-top:0;margin-top:0}.v-toolbar__content,.v-toolbar__extension{padding:4px 16px}.v-toolbar__content .v-btn.v-btn--icon.v-size--default,.v-toolbar__extension .v-btn.v-btn--icon.v-size--default{height:48px;width:48px}.v-application--is-ltr .v-toolbar__content>.v-btn.v-btn--icon:first-child,.v-application--is-ltr .v-toolbar__extension>.v-btn.v-btn--icon:first-child{margin-left:-12px}.v-application--is-rtl .v-toolbar__content>.v-btn.v-btn--icon:first-child,.v-application--is-rtl .v-toolbar__extension>.v-btn.v-btn--icon:first-child{margin-right:-12px}.v-application--is-ltr .v-toolbar__content>.v-btn.v-btn--icon:first-child+.v-toolbar__title,.v-application--is-ltr .v-toolbar__extension>.v-btn.v-btn--icon:first-child+.v-toolbar__title{padding-left:20px}.v-application--is-rtl .v-toolbar__content>.v-btn.v-btn--icon:first-child+.v-toolbar__title,.v-application--is-rtl .v-toolbar__extension>.v-btn.v-btn--icon:first-child+.v-toolbar__title{padding-right:20px}.v-application--is-ltr .v-toolbar__content>.v-btn.v-btn--icon:last-child,.v-application--is-ltr .v-toolbar__extension>.v-btn.v-btn--icon:last-child{margin-right:-12px}.v-application--is-rtl .v-toolbar__content>.v-btn.v-btn--icon:last-child,.v-application--is-rtl .v-toolbar__extension>.v-btn.v-btn--icon:last-child{margin-left:-12px}.v-toolbar__content>.v-tabs,.v-toolbar__extension>.v-tabs{height:inherit;margin-top:-4px;margin-bottom:-4px}.v-toolbar__content>.v-tabs>.v-slide-group.v-tabs-bar,.v-toolbar__extension>.v-tabs>.v-slide-group.v-tabs-bar{background-color:inherit;height:inherit}.v-toolbar__content>.v-tabs:first-child,.v-toolbar__extension>.v-tabs:first-child{margin-left:-16px}.v-toolbar__content>.v-tabs:last-child,.v-toolbar__extension>.v-tabs:last-child{margin-right:-16px}.v-toolbar__content,.v-toolbar__extension{align-items:center;display:flex;position:relative;z-index:0}.v-toolbar__image{border-radius:inherit;position:absolute;top:0;bottom:0;width:100%;z-index:0;contain:strict}.v-toolbar__image .v-image{border-radius:inherit}.v-toolbar__items{display:flex;height:inherit}.v-toolbar__items>.v-btn{border-radius:0;height:100%!important;max-height:none}.v-toolbar__title{font-size:1.25rem;line-height:1.5;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.v-toolbar.v-toolbar--absolute{position:absolute;top:0;z-index:1}.v-toolbar.v-toolbar--bottom{top:initial;bottom:0}.v-toolbar.v-toolbar--collapse .v-toolbar__title{white-space:nowrap}.v-toolbar.v-toolbar--collapsed{max-width:112px;overflow:hidden}.v-application--is-ltr .v-toolbar.v-toolbar--collapsed{border-bottom-right-radius:24px}.v-application--is-rtl .v-toolbar.v-toolbar--collapsed{border-bottom-left-radius:24px}.v-toolbar.v-toolbar--collapsed .v-toolbar__title,.v-toolbar.v-toolbar--collapsed .v-toolbar__extension{display:none}.v-toolbar--dense .v-toolbar__content,.v-toolbar--dense .v-toolbar__extension{padding-top:0;padding-bottom:0}.v-toolbar--flat{box-shadow:0 0 #0003,0 0 #00000024,0 0 #0000001f!important}.v-toolbar--floating{display:inline-flex}.v-toolbar--prominent .v-toolbar__content{align-items:flex-start}.v-toolbar--prominent .v-toolbar__title{font-size:1.5rem;padding-top:6px}.v-toolbar--prominent:not(.v-toolbar--bottom) .v-toolbar__title{align-self:flex-end;padding-bottom:6px;padding-top:0}
|
|
16
16
|
`)(),Jd=(()=>`.theme--light.v-sheet{background-color:#fff;border-color:#fff;color:#000000de}.theme--light.v-sheet--outlined{border:thin solid rgba(0,0,0,.12)}.theme--dark.v-sheet{background-color:#1e1e1e;border-color:#1e1e1e;color:#fff}.theme--dark.v-sheet--outlined{border:thin solid rgba(255,255,255,.12)}.v-sheet{border-radius:0}.v-sheet:not(.v-sheet--outlined){box-shadow:0 0 #0003,0 0 #00000024,0 0 #0000001f}.v-sheet.v-sheet--shaped{border-radius:24px 0}
|
package/dist/assets/vuetify.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export * from "./vuetify.
|
|
2
|
-
export { default } from "./vuetify.
|
|
1
|
+
export * from "./vuetify.147c3a.js";
|
|
2
|
+
export { default } from "./vuetify.147c3a.js";
|
package/dist/index.html
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
<head>
|
|
4
4
|
<meta charset="utf-8" />
|
|
5
5
|
<meta name="viewport" content="width=device-width,initial-scale=1.0" />
|
|
6
|
-
<script type="module" crossorigin src="./assets/index.
|
|
6
|
+
<script type="module" crossorigin src="./assets/index.44b91cfe.js"></script>
|
|
7
7
|
</head>
|
|
8
8
|
<body style="height: 100vH;">
|
|
9
9
|
<noscript>
|
package/index.js
CHANGED
|
@@ -59,6 +59,7 @@ export {
|
|
|
59
59
|
|
|
60
60
|
export { default as ButtonManager } from './src/manager/buttonManager.js';
|
|
61
61
|
export { NavbarManager, ButtonLocation, getActionsByLocation } from './src/manager/navbarManager.js';
|
|
62
|
+
export { default as ToolboxManager, ToolboxType } from './src/manager/toolbox/toolboxManager.js';
|
|
62
63
|
export { default as CategoryManager } from './src/manager/categoryManager/categoryManager.js';
|
|
63
64
|
export { default as ComponentsManager } from './src/manager/categoryManager/ComponentsManager.vue';
|
|
64
65
|
export { default as ContextMenuManager } from './src/manager/contextMenu/contextMenuManager.js';
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vcmap/ui",
|
|
3
|
-
"version": "5.0.0-rc.
|
|
3
|
+
"version": "5.0.0-rc.13",
|
|
4
4
|
"author": "Virtual City Systems",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"scripts": {
|
|
@@ -121,5 +121,15 @@
|
|
|
121
121
|
"node": "^16.14.0",
|
|
122
122
|
"npm": "^8.3.1"
|
|
123
123
|
},
|
|
124
|
-
"type": "module"
|
|
124
|
+
"type": "module",
|
|
125
|
+
"exports": {
|
|
126
|
+
".": "./index.js",
|
|
127
|
+
"./config/*.json": "./config/*.json",
|
|
128
|
+
"./src/assets/logo.svg": "./src/assets/logo.svg",
|
|
129
|
+
"./src/assets/logo-mobile.svg": "./src/assets/logo-mobile.svg",
|
|
130
|
+
"./build/buildHelpers.js": "./build/buildHelpers.js",
|
|
131
|
+
"./build/getPluginProxies.js": "./build/getPluginProxies.js",
|
|
132
|
+
"./build/determineHost.js": "./build/determineHost.js",
|
|
133
|
+
"./src/styles/variables.scss": "./src/styles/variables.scss"
|
|
134
|
+
}
|
|
125
135
|
}
|
package/plugins/example/index.js
CHANGED
|
@@ -40,30 +40,17 @@ export default async function (config) {
|
|
|
40
40
|
'@vcmap/example',
|
|
41
41
|
ButtonLocation.TOOL,
|
|
42
42
|
);
|
|
43
|
-
const
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
},
|
|
53
|
-
},
|
|
54
|
-
{
|
|
55
|
-
id: 'area3D',
|
|
56
|
-
action: {
|
|
57
|
-
name: 'area3D',
|
|
58
|
-
title: '3D area',
|
|
59
|
-
icon: '$vcs3dArea',
|
|
60
|
-
active: false,
|
|
61
|
-
callback() { this.active = !this.active; },
|
|
62
|
-
},
|
|
43
|
+
const miscGroup = app.toolboxManager.get('miscellaneous');
|
|
44
|
+
miscGroup.buttonManager.add({
|
|
45
|
+
id: 'example',
|
|
46
|
+
action: {
|
|
47
|
+
name: 'example',
|
|
48
|
+
title: 'example',
|
|
49
|
+
icon: 'mdi-circle-small',
|
|
50
|
+
active: false,
|
|
51
|
+
callback() { this.active = !this.active; },
|
|
63
52
|
},
|
|
64
|
-
|
|
65
|
-
const measurementGroup = app.toolboxManager.requestGroup('measurement');
|
|
66
|
-
buttonComponents.forEach(c => measurementGroup.buttonManager.add(c, '@vcmap/example'));
|
|
53
|
+
}, '@vcmap/example');
|
|
67
54
|
},
|
|
68
55
|
destroy() {
|
|
69
56
|
if (this._destroyAction) {
|
package/plugins/test/index.js
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import VectorSource from 'ol/source/Vector.js';
|
|
2
2
|
import { Feature } from 'ol';
|
|
3
|
-
import {
|
|
3
|
+
import {
|
|
4
|
+
ButtonLocation, createModalAction, createToggleAction, setStateToUrl, ToolboxType, WindowSlot,
|
|
5
|
+
} from '@vcmap/ui';
|
|
4
6
|
import { toolboxData } from './toolbox-data.js';
|
|
5
7
|
import editor from './editor.vue';
|
|
6
8
|
import windowManagerExample from './windowManagerExample.vue';
|
|
@@ -136,9 +138,16 @@ export default async function () {
|
|
|
136
138
|
'@vcmap/test',
|
|
137
139
|
ButtonLocation.TOOL,
|
|
138
140
|
);
|
|
139
|
-
toolboxData.forEach(([{
|
|
140
|
-
|
|
141
|
-
|
|
141
|
+
toolboxData.forEach(([{ buttonComponents, ...toolboxComponentOptions }, owner]) => {
|
|
142
|
+
let group;
|
|
143
|
+
if (app.toolboxManager.has(toolboxComponentOptions.id)) {
|
|
144
|
+
group = app.toolboxManager.get(toolboxComponentOptions.id);
|
|
145
|
+
} else {
|
|
146
|
+
group = app.toolboxManager.add(toolboxComponentOptions, owner);
|
|
147
|
+
}
|
|
148
|
+
if (group.type === ToolboxType.GROUP && buttonComponents) {
|
|
149
|
+
buttonComponents.forEach(c => group.buttonManager.add(c, owner));
|
|
150
|
+
}
|
|
142
151
|
});
|
|
143
152
|
|
|
144
153
|
app.contextMenuManager.addEventHandler(async (event) => {
|
|
@@ -1,104 +1,129 @@
|
|
|
1
|
+
import { ToolboxType } from '@vcmap/ui';
|
|
2
|
+
|
|
3
|
+
const dummySelectAction = {
|
|
4
|
+
active: false,
|
|
5
|
+
currentIndex: 0,
|
|
6
|
+
_stop() {
|
|
7
|
+
console.log('stopping session', this._session);
|
|
8
|
+
this._session = null;
|
|
9
|
+
this.active = false;
|
|
10
|
+
},
|
|
11
|
+
_start() {
|
|
12
|
+
const startSession = tool => ({ type: tool });
|
|
13
|
+
this._session = startSession(this.tools[this.currentIndex].name);
|
|
14
|
+
this.active = true;
|
|
15
|
+
console.log('starting session', this._session);
|
|
16
|
+
},
|
|
17
|
+
callback() {
|
|
18
|
+
if (this.active) {
|
|
19
|
+
this._stop();
|
|
20
|
+
} else {
|
|
21
|
+
this._start();
|
|
22
|
+
}
|
|
23
|
+
},
|
|
24
|
+
selected(index) {
|
|
25
|
+
this.currentIndex = index;
|
|
26
|
+
if (this.active) {
|
|
27
|
+
this._session.type = this.tools[this.currentIndex].name;
|
|
28
|
+
console.log('updating active session', this._session);
|
|
29
|
+
} else {
|
|
30
|
+
this._start();
|
|
31
|
+
}
|
|
32
|
+
},
|
|
33
|
+
};
|
|
34
|
+
|
|
1
35
|
// eslint-disable-next-line import/prefer-default-export
|
|
2
36
|
export const toolboxData = [
|
|
3
37
|
[
|
|
4
38
|
{
|
|
5
|
-
id: '
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
callback() { this.active = !this.active; },
|
|
15
|
-
},
|
|
16
|
-
},
|
|
17
|
-
],
|
|
39
|
+
id: 'singleSelect',
|
|
40
|
+
type: ToolboxType.SINGLE,
|
|
41
|
+
action: {
|
|
42
|
+
name: 'select',
|
|
43
|
+
title: 'single select',
|
|
44
|
+
icon: '$vcsPointSelect',
|
|
45
|
+
active: false,
|
|
46
|
+
callback() { this.active = !this.active; },
|
|
47
|
+
},
|
|
18
48
|
},
|
|
19
49
|
'@vcmap/test',
|
|
20
50
|
],
|
|
21
51
|
[
|
|
22
52
|
{
|
|
23
53
|
id: 'multiSelect',
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
54
|
+
type: ToolboxType.SELECT,
|
|
55
|
+
action: {
|
|
56
|
+
name: 'multiSelect',
|
|
57
|
+
title: 'multi select',
|
|
58
|
+
...dummySelectAction,
|
|
59
|
+
tools: [
|
|
60
|
+
{
|
|
30
61
|
name: 'pen',
|
|
31
62
|
title: 'Item 1',
|
|
32
63
|
icon: '$vcsPen',
|
|
33
|
-
active: false,
|
|
34
|
-
callback() { this.active = !this.active; },
|
|
35
64
|
},
|
|
36
|
-
|
|
37
|
-
{
|
|
38
|
-
id: 'object',
|
|
39
|
-
action: {
|
|
65
|
+
{
|
|
40
66
|
name: 'object',
|
|
41
67
|
title: 'Item 2',
|
|
42
68
|
icon: '$vcsObjectSelect',
|
|
43
|
-
active: false,
|
|
44
|
-
callback() { this.active = !this.active; },
|
|
45
69
|
},
|
|
46
|
-
|
|
47
|
-
|
|
70
|
+
],
|
|
71
|
+
},
|
|
48
72
|
},
|
|
49
73
|
'@vcmap/test',
|
|
50
74
|
],
|
|
51
75
|
[
|
|
52
76
|
{
|
|
53
77
|
id: 'measurement',
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
78
|
+
type: ToolboxType.SELECT,
|
|
79
|
+
action: {
|
|
80
|
+
name: 'measurement',
|
|
81
|
+
title: 'measurement',
|
|
82
|
+
...dummySelectAction,
|
|
83
|
+
tools: [
|
|
84
|
+
{
|
|
60
85
|
name: 'distance',
|
|
61
86
|
title: '2D distance',
|
|
62
87
|
icon: '$vcs2dDistance',
|
|
63
|
-
active: false,
|
|
64
|
-
callback() { this.active = !this.active; },
|
|
65
88
|
},
|
|
66
|
-
|
|
67
|
-
{
|
|
68
|
-
id: 'area',
|
|
69
|
-
action: {
|
|
89
|
+
{
|
|
70
90
|
name: 'area',
|
|
71
91
|
title: '2D area',
|
|
72
92
|
icon: '$vcs2dArea',
|
|
73
|
-
active: false,
|
|
74
|
-
callback() { this.active = !this.active; },
|
|
75
93
|
},
|
|
76
|
-
|
|
77
|
-
|
|
94
|
+
{
|
|
95
|
+
name: 'distance3D',
|
|
96
|
+
title: '3D distance',
|
|
97
|
+
icon: '$vcs3dDistance',
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
name: 'area3D',
|
|
101
|
+
title: '3D area',
|
|
102
|
+
icon: '$vcs3dArea',
|
|
103
|
+
},
|
|
104
|
+
],
|
|
105
|
+
},
|
|
78
106
|
},
|
|
79
107
|
'@vcmap/test',
|
|
80
108
|
],
|
|
81
109
|
[
|
|
82
110
|
{
|
|
83
111
|
id: 'toggle',
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
callback() { this.active = !this.active; },
|
|
93
|
-
},
|
|
94
|
-
},
|
|
95
|
-
],
|
|
112
|
+
type: ToolboxType.SINGLE,
|
|
113
|
+
action: {
|
|
114
|
+
name: 'split',
|
|
115
|
+
title: 'split view',
|
|
116
|
+
icon: '$vcsSplitView',
|
|
117
|
+
active: false,
|
|
118
|
+
callback() { this.active = !this.active; },
|
|
119
|
+
},
|
|
96
120
|
},
|
|
97
121
|
'@vcmap/test',
|
|
98
122
|
],
|
|
99
123
|
[
|
|
100
124
|
{
|
|
101
125
|
id: 'flight',
|
|
126
|
+
type: ToolboxType.GROUP,
|
|
102
127
|
icon: '$vcsVideoRecorder',
|
|
103
128
|
title: 'flight',
|
|
104
129
|
buttonComponents: [
|
|
@@ -279,7 +279,7 @@
|
|
|
279
279
|
ButtonLocation.CONTENT,
|
|
280
280
|
);
|
|
281
281
|
}
|
|
282
|
-
watch(app.categoryManager.items, () => {
|
|
282
|
+
watch(app.categoryManager.items.value, () => {
|
|
283
283
|
if (app.categoryManager.items.value.length > 0) {
|
|
284
284
|
if (!app.navbarManager.has('component-manager')) {
|
|
285
285
|
app.navbarManager.add(
|
|
@@ -51,18 +51,24 @@
|
|
|
51
51
|
* @property {boolean} [active=false] - optional state of button. If active, button is rendered in primary color
|
|
52
52
|
*/
|
|
53
53
|
|
|
54
|
+
/**
|
|
55
|
+
* pattern to check actions
|
|
56
|
+
* @type {Object}
|
|
57
|
+
*/
|
|
58
|
+
export const ActionPattern = {
|
|
59
|
+
name: String,
|
|
60
|
+
title: [undefined, String],
|
|
61
|
+
icon: [undefined, String],
|
|
62
|
+
callback: Function,
|
|
63
|
+
active: [undefined, Boolean],
|
|
64
|
+
};
|
|
65
|
+
|
|
54
66
|
/**
|
|
55
67
|
* @param {VcsAction} action
|
|
56
68
|
* @returns {boolean}
|
|
57
69
|
*/
|
|
58
70
|
export function validateAction(action) {
|
|
59
|
-
return is(action,
|
|
60
|
-
name: String,
|
|
61
|
-
title: [undefined, String],
|
|
62
|
-
icon: [undefined, String],
|
|
63
|
-
callback: Function,
|
|
64
|
-
active: [undefined, Boolean],
|
|
65
|
-
});
|
|
71
|
+
return is(action, ActionPattern);
|
|
66
72
|
}
|
|
67
73
|
|
|
68
74
|
/**
|
|
@@ -51,6 +51,7 @@
|
|
|
51
51
|
|
|
52
52
|
import { inject, onMounted, onUnmounted, watch } from 'vue';
|
|
53
53
|
import { setupBalloonPositionListener } from './balloonHelper.js';
|
|
54
|
+
import VcsButton from '../components/buttons/VcsButton.vue';
|
|
54
55
|
|
|
55
56
|
/**
|
|
56
57
|
* @description A balloon viewing feature attributes. Size dynamic dependent on number of attributes.
|
|
@@ -65,6 +66,7 @@
|
|
|
65
66
|
*/
|
|
66
67
|
export default {
|
|
67
68
|
name: 'BalloonComponent',
|
|
69
|
+
components: { VcsButton },
|
|
68
70
|
props: {
|
|
69
71
|
featureId: {
|
|
70
72
|
type: String,
|
|
@@ -27,6 +27,7 @@ import { Feature } from 'ol';
|
|
|
27
27
|
import { check, checkMaybe } from '@vcsuite/check';
|
|
28
28
|
import { v4 as uuidv4 } from 'uuid';
|
|
29
29
|
|
|
30
|
+
import { ToolboxType } from '@vcmap/ui';
|
|
30
31
|
import { vcsAppSymbol } from '../pluginHelper.js';
|
|
31
32
|
import FeatureInfoInteraction from './featureInfoInteraction.js';
|
|
32
33
|
import AbstractFeatureInfoView from './abstractFeatureInfoView.js';
|
|
@@ -153,9 +154,10 @@ function setupFeatureInfoTool(app) {
|
|
|
153
154
|
},
|
|
154
155
|
};
|
|
155
156
|
|
|
156
|
-
app.toolboxManager.
|
|
157
|
+
app.toolboxManager.add(
|
|
157
158
|
{
|
|
158
|
-
id: '
|
|
159
|
+
id: 'featureInfo',
|
|
160
|
+
type: ToolboxType.SINGLE,
|
|
159
161
|
action,
|
|
160
162
|
},
|
|
161
163
|
vcsAppSymbol,
|
|
@@ -436,7 +438,7 @@ class FeatureInfo {
|
|
|
436
438
|
destroy() {
|
|
437
439
|
this._clearInternal();
|
|
438
440
|
this._featureChanged.destroy();
|
|
439
|
-
this._app.toolboxManager.
|
|
441
|
+
this._app.toolboxManager.remove('featureInfo');
|
|
440
442
|
if (this._scratchLayer) {
|
|
441
443
|
this._app.layers.remove(this._scratchLayer);
|
|
442
444
|
this._scratchLayer.destroy();
|
package/src/i18n/de.js
CHANGED
package/src/i18n/en.js
CHANGED
|
@@ -3,6 +3,7 @@ import { VcsEvent } from '@vcmap/core';
|
|
|
3
3
|
import { v4 as uuidv4 } from 'uuid';
|
|
4
4
|
import { check, checkMaybe } from '@vcsuite/check';
|
|
5
5
|
import { vcsAppSymbol } from '../pluginHelper.js';
|
|
6
|
+
import { ActionPattern } from '../components/lists/VcsActionList.vue';
|
|
6
7
|
|
|
7
8
|
/**
|
|
8
9
|
* @typedef ButtonComponentOptions
|
|
@@ -86,13 +87,7 @@ class ButtonManager {
|
|
|
86
87
|
*/
|
|
87
88
|
add(buttonComponentOptions, owner) {
|
|
88
89
|
checkMaybe(buttonComponentOptions.id, String);
|
|
89
|
-
check(buttonComponentOptions.action,
|
|
90
|
-
name: String,
|
|
91
|
-
title: [undefined, String],
|
|
92
|
-
icon: [undefined, String],
|
|
93
|
-
callback: Function,
|
|
94
|
-
active: [undefined, Boolean],
|
|
95
|
-
});
|
|
90
|
+
check(buttonComponentOptions.action, ActionPattern);
|
|
96
91
|
check(owner, [String, vcsAppSymbol]);
|
|
97
92
|
|
|
98
93
|
if (buttonComponentOptions.id && this.has(buttonComponentOptions.id)) {
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<div v-if="orderedButtons.length > 0">
|
|
3
|
+
<v-menu
|
|
4
|
+
v-model="open"
|
|
5
|
+
@input="$emit('toggle', open)"
|
|
6
|
+
offset-y
|
|
7
|
+
:nudge-left="nudgeLeft"
|
|
8
|
+
z-index="0"
|
|
9
|
+
>
|
|
10
|
+
<template #activator="{ on, attrs }">
|
|
11
|
+
<VcsButton
|
|
12
|
+
class="vcs-toolbox-toogle-button"
|
|
13
|
+
width="48"
|
|
14
|
+
:icon="group.icon"
|
|
15
|
+
:tooltip="group.title"
|
|
16
|
+
:active="open || hasActiveAction"
|
|
17
|
+
:color="hasActiveAction ? 'primary' : 'basic'"
|
|
18
|
+
v-bind="attrs"
|
|
19
|
+
v-on="on"
|
|
20
|
+
large
|
|
21
|
+
>
|
|
22
|
+
<v-icon v-text="open ? 'mdi-chevron-up' : 'mdi-chevron-down'" color="accent" class="text--darken-3" />
|
|
23
|
+
</VcsButton>
|
|
24
|
+
</template>
|
|
25
|
+
|
|
26
|
+
<v-toolbar
|
|
27
|
+
id="vcs-toolbox-toolbar--secondary"
|
|
28
|
+
class="vcs-toolbox-2 toolbar__secondary mx-auto v-sheet marginToTop"
|
|
29
|
+
:height="40"
|
|
30
|
+
width="fit-content"
|
|
31
|
+
color="basic"
|
|
32
|
+
dense
|
|
33
|
+
>
|
|
34
|
+
<v-toolbar-items class="w-full">
|
|
35
|
+
<div class="d-flex align-center justify-space-between w-full mx-1">
|
|
36
|
+
<VcsButton
|
|
37
|
+
v-for="({id, action}) in orderedButtons"
|
|
38
|
+
:key="id"
|
|
39
|
+
:tooltip="action.title"
|
|
40
|
+
:icon="action.icon"
|
|
41
|
+
:active="action.active"
|
|
42
|
+
@click="action.callback($event)"
|
|
43
|
+
v-bind="{...$attrs}"
|
|
44
|
+
large
|
|
45
|
+
/>
|
|
46
|
+
</div>
|
|
47
|
+
</v-toolbar-items>
|
|
48
|
+
</v-toolbar>
|
|
49
|
+
</v-menu>
|
|
50
|
+
</div>
|
|
51
|
+
</template>
|
|
52
|
+
<style lang="scss">
|
|
53
|
+
.vcs-toolbox-2 {
|
|
54
|
+
.v-toolbar__content {
|
|
55
|
+
padding: 0;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
.marginToTop {
|
|
60
|
+
margin-top: 3px;
|
|
61
|
+
}
|
|
62
|
+
</style>
|
|
63
|
+
<script>
|
|
64
|
+
import { computed, ref } from 'vue';
|
|
65
|
+
import VcsButton from '../../components/buttons/VcsButton.vue';
|
|
66
|
+
import { getComponentsByOrder } from './toolboxManager.js';
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* @description
|
|
70
|
+
* A Toolbox Button rendering a menu dropdown with actions using {@link https://vuetifyjs.com/en/api/v-menu/|vuetify v-menu} and {@link VcsButton}.
|
|
71
|
+
* The button is rendered in primary color if at least one action is active.
|
|
72
|
+
* The button is rendered in basic color if menu is open and no action is active.
|
|
73
|
+
* @vue-prop {GroupToolboxComponent} group - A toolbox group of type 'group'.
|
|
74
|
+
* @vue-computed {Array<ButtonComponent>} buttons - Buttons of the group.
|
|
75
|
+
* @vue-computed {Array<ButtonComponent>} orderedButtons - Buttons of the group sorted by owner.
|
|
76
|
+
* @vue-computed {boolean} hasActiveAction - Whether the group has an active action.
|
|
77
|
+
* @vue-computed {number} nudgeLeft - offset of the dropdown toolbar to the left
|
|
78
|
+
*/
|
|
79
|
+
export default {
|
|
80
|
+
name: 'ToolboxActionGroup',
|
|
81
|
+
components: { VcsButton },
|
|
82
|
+
props: {
|
|
83
|
+
group: {
|
|
84
|
+
type: Object,
|
|
85
|
+
required: true,
|
|
86
|
+
},
|
|
87
|
+
},
|
|
88
|
+
setup(props) {
|
|
89
|
+
const open = ref(false);
|
|
90
|
+
|
|
91
|
+
const buttons = computed(() => {
|
|
92
|
+
const { buttonManager } = props.group;
|
|
93
|
+
const buttonIds = ref(buttonManager.componentIds);
|
|
94
|
+
return buttonIds.value.map(id => buttonManager.get(id));
|
|
95
|
+
});
|
|
96
|
+
const orderedButtons = computed(() => getComponentsByOrder(buttons.value));
|
|
97
|
+
const hasActiveAction = computed(() => orderedButtons.value.some(a => a.action.active));
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* v-menu auto prop is not working as expected.
|
|
101
|
+
* Workaround using hardcoded button sizes and paddings
|
|
102
|
+
* @type {ComputedRef<number>}
|
|
103
|
+
*/
|
|
104
|
+
const nudgeLeft = computed(() => {
|
|
105
|
+
const toolboxBtnWidth = 42 + 8; // with padding
|
|
106
|
+
const menuBtnWidth = 48;
|
|
107
|
+
return (buttons.value.length * (toolboxBtnWidth / 2)) - (menuBtnWidth / 2);
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
return {
|
|
111
|
+
open,
|
|
112
|
+
orderedButtons,
|
|
113
|
+
nudgeLeft,
|
|
114
|
+
hasActiveAction,
|
|
115
|
+
};
|
|
116
|
+
},
|
|
117
|
+
};
|
|
118
|
+
</script>
|