@vcmap/ui 5.0.0-rc.6 → 5.0.0-rc.9
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 +72 -22
- package/build/build.js +0 -3
- package/build/buildHelpers.js +0 -1
- package/build/commonViteConfig.js +1 -1
- package/config/aerowest.config.json +2 -1
- package/config/base.config.json +7 -7
- package/config/dev.config.json +4 -4
- package/dist/assets/cesium/Workers/{AttributeCompression-27507afe.js → AttributeCompression-80665726.js} +1 -1
- package/dist/assets/cesium/Workers/{AxisAlignedBoundingBox-7565c1e8.js → AxisAlignedBoundingBox-a655a4bc.js} +1 -1
- package/dist/assets/cesium/Workers/{BoundingRectangle-9d707275.js → BoundingRectangle-c3b79029.js} +1 -1
- package/dist/assets/cesium/Workers/{BoxGeometry-fb31d3b5.js → BoxGeometry-f8f9c981.js} +1 -1
- package/dist/assets/cesium/Workers/{Color-56bb5728.js → Color-de06a177.js} +1 -1
- package/dist/assets/cesium/Workers/{CoplanarPolygonGeometryLibrary-72143c19.js → CoplanarPolygonGeometryLibrary-48cdc26d.js} +1 -1
- package/dist/assets/cesium/Workers/{CorridorGeometryLibrary-7bae1712.js → CorridorGeometryLibrary-ddc027d3.js} +1 -1
- package/dist/assets/cesium/Workers/{CylinderGeometry-331891fe.js → CylinderGeometry-82a8cbe6.js} +1 -1
- package/dist/assets/cesium/Workers/{EllipseGeometry-5e3f67b6.js → EllipseGeometry-32d55454.js} +1 -1
- package/dist/assets/cesium/Workers/{EllipseGeometryLibrary-dbc15162.js → EllipseGeometryLibrary-b2ae188a.js} +1 -1
- package/dist/assets/cesium/Workers/{EllipseOutlineGeometry-21191fce.js → EllipseOutlineGeometry-f05a5a27.js} +1 -1
- package/dist/assets/cesium/Workers/{EllipsoidGeodesic-cc3bace8.js → EllipsoidGeodesic-19e75e11.js} +1 -1
- package/dist/assets/cesium/Workers/{EllipsoidGeometry-8bfa24a9.js → EllipsoidGeometry-7c99fc81.js} +1 -1
- package/dist/assets/cesium/Workers/{EllipsoidOutlineGeometry-48d9c023.js → EllipsoidOutlineGeometry-21c243df.js} +1 -1
- package/dist/assets/cesium/Workers/{EllipsoidRhumbLine-125a8b72.js → EllipsoidRhumbLine-6145377b.js} +1 -1
- package/dist/assets/cesium/Workers/EllipsoidTangentPlane-a01286f6.js +1 -0
- package/dist/assets/cesium/Workers/{EncodedCartesian3-96fdc0ef.js → EncodedCartesian3-d9f5c4a4.js} +1 -1
- package/dist/assets/cesium/Workers/{FrustumGeometry-9ab86004.js → FrustumGeometry-17776af8.js} +1 -1
- package/dist/assets/cesium/Workers/GeometryAttribute-89a520b9.js +1 -0
- package/dist/assets/cesium/Workers/{GeometryInstance-13e4ff38.js → GeometryInstance-4fbf16ba.js} +1 -1
- package/dist/assets/cesium/Workers/{GeometryPipeline-e0eb4567.js → GeometryPipeline-309fad76.js} +1 -1
- package/dist/assets/cesium/Workers/IntersectionTests-58aa8f80.js +1 -0
- package/dist/assets/cesium/Workers/{Matrix2-37e55508.js → Matrix2-47e98d76.js} +0 -0
- package/dist/assets/cesium/Workers/{OrientedBoundingBox-e9c07538.js → OrientedBoundingBox-fcb5b750.js} +1 -1
- package/dist/assets/cesium/Workers/{Plane-6ee42cab.js → Plane-3f01019d.js} +1 -1
- package/dist/assets/cesium/Workers/{PolygonGeometryLibrary-b408c688.js → PolygonGeometryLibrary-0b29eb16.js} +1 -1
- package/dist/assets/cesium/Workers/{PolygonPipeline-7b8e4643.js → PolygonPipeline-a934c4dd.js} +1 -1
- package/dist/assets/cesium/Workers/{PolylinePipeline-6757400c.js → PolylinePipeline-8095c9bc.js} +1 -1
- package/dist/assets/cesium/Workers/{PolylineVolumeGeometryLibrary-eb972210.js → PolylineVolumeGeometryLibrary-67d12fff.js} +1 -1
- package/dist/assets/cesium/Workers/{PrimitivePipeline-f244975e.js → PrimitivePipeline-980e44c5.js} +1 -1
- package/dist/assets/cesium/Workers/{RectangleGeometryLibrary-1bd6152a.js → RectangleGeometryLibrary-621c6de8.js} +1 -1
- package/dist/assets/cesium/Workers/{TerrainEncoding-5a21a97f.js → TerrainEncoding-f96552d5.js} +1 -1
- package/dist/assets/cesium/Workers/{Transforms-eb5c1a84.js → Transforms-c8cb8f43.js} +3 -3
- package/dist/assets/cesium/Workers/{WallGeometryLibrary-a6b6a368.js → WallGeometryLibrary-c03d8479.js} +1 -1
- package/dist/assets/cesium/Workers/{WebMercatorProjection-2839e524.js → WebMercatorProjection-79b3214e.js} +1 -1
- package/dist/assets/cesium/Workers/combineGeometry.js +1 -1
- package/dist/assets/cesium/Workers/createBoxGeometry.js +1 -1
- package/dist/assets/cesium/Workers/createBoxOutlineGeometry.js +1 -1
- package/dist/assets/cesium/Workers/createCircleGeometry.js +1 -1
- package/dist/assets/cesium/Workers/createCircleOutlineGeometry.js +1 -1
- package/dist/assets/cesium/Workers/createCoplanarPolygonGeometry.js +1 -1
- package/dist/assets/cesium/Workers/createCoplanarPolygonOutlineGeometry.js +1 -1
- package/dist/assets/cesium/Workers/createCorridorGeometry.js +1 -1
- package/dist/assets/cesium/Workers/createCorridorOutlineGeometry.js +1 -1
- package/dist/assets/cesium/Workers/createCylinderGeometry.js +1 -1
- package/dist/assets/cesium/Workers/createCylinderOutlineGeometry.js +1 -1
- package/dist/assets/cesium/Workers/createEllipseGeometry.js +1 -1
- package/dist/assets/cesium/Workers/createEllipseOutlineGeometry.js +1 -1
- package/dist/assets/cesium/Workers/createEllipsoidGeometry.js +1 -1
- package/dist/assets/cesium/Workers/createEllipsoidOutlineGeometry.js +1 -1
- package/dist/assets/cesium/Workers/createFrustumGeometry.js +1 -1
- package/dist/assets/cesium/Workers/createFrustumOutlineGeometry.js +1 -1
- package/dist/assets/cesium/Workers/createGeometry.js +1 -1
- package/dist/assets/cesium/Workers/createGroundPolylineGeometry.js +1 -1
- package/dist/assets/cesium/Workers/createPlaneGeometry.js +1 -1
- package/dist/assets/cesium/Workers/createPlaneOutlineGeometry.js +1 -1
- package/dist/assets/cesium/Workers/createPolygonGeometry.js +1 -1
- package/dist/assets/cesium/Workers/createPolygonOutlineGeometry.js +1 -1
- package/dist/assets/cesium/Workers/createPolylineGeometry.js +1 -1
- package/dist/assets/cesium/Workers/createPolylineVolumeGeometry.js +1 -1
- package/dist/assets/cesium/Workers/createPolylineVolumeOutlineGeometry.js +1 -1
- package/dist/assets/cesium/Workers/createRectangleGeometry.js +1 -1
- package/dist/assets/cesium/Workers/createRectangleOutlineGeometry.js +1 -1
- package/dist/assets/cesium/Workers/createSimplePolylineGeometry.js +1 -1
- package/dist/assets/cesium/Workers/createSphereGeometry.js +1 -1
- package/dist/assets/cesium/Workers/createSphereOutlineGeometry.js +1 -1
- package/dist/assets/cesium/Workers/createVectorTileClampedPolylines.js +1 -1
- package/dist/assets/cesium/Workers/createVectorTileGeometries.js +1 -1
- package/dist/assets/cesium/Workers/createVectorTilePoints.js +1 -1
- package/dist/assets/cesium/Workers/createVectorTilePolygons.js +1 -1
- package/dist/assets/cesium/Workers/createVectorTilePolylines.js +1 -1
- package/dist/assets/cesium/Workers/createVerticesFromGoogleEarthEnterpriseBuffer.js +1 -1
- package/dist/assets/cesium/Workers/createVerticesFromHeightmap.js +1 -1
- package/dist/assets/cesium/Workers/createVerticesFromQuantizedTerrainMesh.js +1 -1
- package/dist/assets/cesium/Workers/createWallGeometry.js +1 -1
- package/dist/assets/cesium/Workers/createWallOutlineGeometry.js +1 -1
- package/dist/assets/cesium/Workers/upsampleQuantizedTerrainMesh.js +1 -1
- package/dist/assets/{cesium.fba8ca.js → cesium.4e40f4.js} +955 -968
- package/dist/assets/cesium.js +1 -1
- package/dist/assets/core.edcf5e.js +4 -0
- package/dist/assets/core.js +1 -1
- package/dist/assets/{index.6a83278e.js → index.889d0f3a.js} +1 -1
- package/dist/assets/{ol.abea3a.js → ol.246fd4.js} +0 -0
- package/dist/assets/ol.js +1 -1
- package/dist/assets/ui.df4f6d.css +1 -0
- package/dist/assets/ui.df4f6d.js +43 -0
- package/dist/assets/ui.js +1 -1
- package/dist/assets/{vue-composition-api.7051d7.js → vue-composition-api.a520f3.js} +1 -1
- package/dist/assets/vue-composition-api.js +2 -2
- package/dist/assets/{vue.9fd7f6.js → vue.2cee44.js} +0 -0
- package/dist/assets/vue.js +1 -1
- package/dist/assets/{vuetify.33dafc.css → vuetify.cc817b.css} +1 -1
- package/dist/assets/{vuetify.33dafc.js → vuetify.cc817b.js} +1 -1
- package/dist/assets/vuetify.js +2 -2
- package/dist/index.html +1 -1
- package/index.js +96 -6
- package/package.json +3 -4
- package/plugins/@vcmap/pluginExample/index.js +5 -5
- package/plugins/@vcmap/pluginExample/pluginExampleComponent.vue +1 -1
- package/plugins/@vcmap/project-selector/ContextsListComponent.vue +1 -1
- package/plugins/@vcmap/project-selector/index.js +5 -5
- package/plugins/@vcmap/project-selector/package.json +1 -2
- package/plugins/@vcmap/theme-changer/index.js +6 -6
- package/plugins/buttonExamples/ButtonExamples.vue +1 -1
- package/plugins/buttonExamples/index.js +5 -4
- package/plugins/categoryTest/Categories.vue +1 -1
- package/plugins/categoryTest/Category.vue +1 -1
- package/plugins/categoryTest/index.js +5 -5
- package/plugins/example/index.js +33 -14
- package/plugins/test/allIconsComponent.vue +34 -0
- package/plugins/test/editor.vue +1 -1
- package/plugins/test/index.js +40 -17
- package/plugins/test/toolbox-data.js +106 -26
- package/plugins/test/windowManagerExample.vue +1 -2
- package/src/actions/actionHelper.js +41 -1
- package/src/actions/styleSelector.vue +1 -1
- package/src/application/Navbar.vue +47 -6
- package/src/application/VcsApp.vue +37 -29
- package/src/application/VcsMap.vue +1 -20
- package/src/assets/logo-mobile.svg +9 -0
- package/src/assets/logo.svg +23 -23
- package/src/components/buttons/VcsActionButtonList.vue +99 -0
- package/src/components/buttons/VcsButton.vue +201 -0
- package/src/components/form-inputs-controls/VcsCheckbox.vue +73 -0
- package/src/components/form-inputs-controls/VcsColorPicker.vue +81 -0
- package/src/components/form-inputs-controls/VcsFormSection.vue +46 -0
- package/src/components/form-inputs-controls/VcsLabel.vue +38 -0
- package/src/components/form-inputs-controls/VcsSelect.vue +97 -0
- package/src/components/form-inputs-controls/VcsTextArea.vue +130 -0
- package/src/components/form-inputs-controls/VcsTextField.vue +129 -0
- package/src/components/form-output/VcsFormattedNumber.vue +103 -0
- package/src/components/lists/VcsActionList.vue +100 -0
- package/src/components/lists/VcsTreeview.vue +109 -0
- package/src/components/lists/VcsTreeviewLeaf.vue +105 -0
- package/src/components/lists/VcsTreeviewSearchbar.vue +156 -0
- package/src/components/notification/VcsBadge.vue +27 -0
- package/src/components/notification/VcsTooltip.vue +154 -0
- package/src/components/notification/validation.js +19 -0
- package/src/contentTree/LayerTree.vue +1 -1
- package/src/contentTree/contentTreeCollection.js +6 -2
- package/src/icons/+all.js +359 -0
- package/src/icons/2DAreaIcon.vue +21 -0
- package/src/icons/2DDistanceIcon.vue +18 -0
- package/src/icons/3DAreaIcon.vue +21 -0
- package/src/icons/3DDistanceIcon.vue +18 -0
- package/src/icons/3DHeightIcon.vue +18 -0
- package/src/icons/AngleIcon.vue +8 -0
- package/src/icons/AssociationsIcon.vue +34 -0
- package/src/icons/AxisIcon.vue +10 -0
- package/src/icons/BoundingBoxIcon.vue +15 -0
- package/src/icons/CheckboxCheckedIcon.vue +16 -0
- package/src/icons/CheckboxIcon.vue +23 -0
- package/src/icons/CheckboxIndeterminateIcon.vue +24 -0
- package/src/icons/CircleIcon.vue +10 -0
- package/src/icons/ColorSwatchIcon.vue +17 -0
- package/src/icons/CommentIcon.vue +19 -0
- package/src/icons/CompassIcon.vue +8 -0
- package/src/icons/ComponentsIcon.vue +7 -0
- package/src/icons/ConeIcon.vue +11 -0
- package/src/icons/DimensionsHouseIcon.vue +14 -0
- package/src/icons/ElevationProfileIcon.vue +111 -0
- package/src/icons/ExportAreaIcon.vue +7 -0
- package/src/icons/ExportFlightIcon.vue +7 -0
- package/src/icons/ExportIcon.vue +8 -0
- package/src/icons/ExternalLinkIcon.vue +10 -0
- package/src/icons/EyeIcon.vue +7 -0
- package/src/icons/FastForwardIcon.vue +7 -0
- package/src/icons/FilterIcon.vue +8 -0
- package/src/icons/GlobeNatureIcon.vue +14 -0
- package/src/icons/HealthCareIndustriesIcon.vue +118 -0
- package/src/icons/HelpIcon.vue +7 -0
- package/src/icons/HomePointIcon.vue +8 -0
- package/src/icons/HospitalsIcon.vue +237 -0
- package/src/icons/HouseIcon.vue +25 -0
- package/src/icons/ImportIcon.vue +8 -0
- package/src/icons/InfoIcon.vue +10 -0
- package/src/icons/KebabIcon.vue +36 -0
- package/src/icons/LabelIcon.vue +7 -0
- package/src/icons/LayersIcon.vue +26 -0
- package/src/icons/LegendIcon.vue +65 -0
- package/src/icons/LineIcon.vue +7 -0
- package/src/icons/LinkIcon.vue +7 -0
- package/src/icons/MapIcon.vue +8 -0
- package/src/icons/MenuIcon.vue +34 -0
- package/src/icons/MinusIcon.vue +8 -0
- package/src/icons/ObjectAttributeIcon.vue +18 -0
- package/src/icons/ObjectSelectIcon.vue +8 -0
- package/src/icons/ObliqueViewIcon.vue +13 -0
- package/src/icons/PdfIcon.vue +10 -0
- package/src/icons/PedestrianIcon.vue +8 -0
- package/src/icons/PenIcon.vue +14 -0
- package/src/icons/PlayCircleIcon.vue +10 -0
- package/src/icons/PlusIcon.vue +9 -0
- package/src/icons/PoiIcon.vue +7 -0
- package/src/icons/PointSelectIcon.vue +7 -0
- package/src/icons/PolygonIcon.vue +38 -0
- package/src/icons/PresentationModeIcon.vue +7 -0
- package/src/icons/ProgressIcon.vue +24 -0
- package/src/icons/QueryIcon.vue +15 -0
- package/src/icons/RectangleIcon.vue +9 -0
- package/src/icons/ReturnIcon.vue +7 -0
- package/src/icons/RewindIcon.vue +6 -0
- package/src/icons/SearchIcon.vue +8 -0
- package/src/icons/ShadowIcon.vue +9 -0
- package/src/icons/ShapesIcon.vue +28 -0
- package/src/icons/ShareIcon.vue +22 -0
- package/src/icons/SimpleCircleFilledIcon.vue +15 -0
- package/src/icons/SimpleCircleHalfFilledIcon.vue +12 -0
- package/src/icons/SimpleCircleOutlinedIcon.vue +15 -0
- package/src/icons/SkipNextIcon.vue +7 -0
- package/src/icons/SkipPreviousIcon.vue +9 -0
- package/src/icons/SplitViewIcon.vue +19 -0
- package/src/icons/TextStyleIcon.vue +14 -0
- package/src/icons/ThreeDimensionsIcon.vue +7 -0
- package/src/icons/ToolsIcon.vue +35 -0
- package/src/icons/TouchIcon.vue +8 -0
- package/src/icons/TrashCanIcon.vue +7 -0
- package/src/icons/TriangleIcon.vue +15 -0
- package/src/icons/TwoDimensionsIcon.vue +8 -0
- package/src/icons/UploadIcon.vue +14 -0
- package/src/icons/VideoRecorderIcon.vue +14 -0
- package/src/icons/WalkingIcon.vue +7 -0
- package/src/icons/WallIcon.vue +14 -0
- package/src/manager/buttonManager.js +5 -52
- package/src/manager/navbarManager.js +81 -0
- package/src/manager/toolbox/ToolboxGroupComponent.vue +128 -0
- package/src/manager/toolbox/ToolboxManager.vue +119 -76
- package/src/manager/toolbox/toolboxManager.js +204 -0
- package/src/manager/window/WindowComponent.vue +27 -20
- package/src/manager/window/WindowComponentHeader.vue +13 -6
- package/src/manager/window/WindowManager.vue +18 -1
- package/src/manager/window/windowManager.js +3 -5
- package/src/navigation/mapNavigation.vue +34 -5
- package/src/navigation/orientationToolsButton.vue +1 -1
- package/src/navigation/overviewMap.js +616 -0
- package/src/navigation/overviewMapClickedInteraction.js +38 -0
- package/src/navigation/tiltSlider.vue +1 -1
- package/src/styles/_theming.scss +10 -0
- package/src/styles/main.scss +3 -0
- package/src/styles/variables.scss +70 -0
- package/src/styles/vcsFont.scss +5 -0
- package/src/styles/vcsGrid.scss +4 -0
- package/src/vcsUiApp.js +18 -3
- package/src/vuePlugins/vuetify.js +1 -1
- package/dist/assets/cesium/Workers/EllipsoidTangentPlane-678e34e4.js +0 -1
- package/dist/assets/cesium/Workers/GeometryAttribute-3915ea0b.js +0 -1
- package/dist/assets/cesium/Workers/IntersectionTests-ac2459de.js +0 -1
- package/dist/assets/core.d5ed0f.js +0 -4
- package/dist/assets/ui.ad1ec9.css +0 -1
- package/dist/assets/ui.ad1ec9.js +0 -39
- package/dist/assets/uicomponents.161461.css +0 -1
- package/dist/assets/uicomponents.161461.js +0 -31
- package/dist/assets/uicomponents.js +0 -1
- package/lib/uicomponents.js +0 -1
- package/src/manager/toolbox/ToolboxMultiSelectButton.vue +0 -96
- package/src/manager/toolbox/ToolboxSingleSelectButton.vue +0 -98
- package/src/manager/toolbox/toolbox-manager.js +0 -203
@@ -1,43 +1,24 @@
|
|
1
|
+
<script src="../../vcsUiApp.js"></script>
|
1
2
|
<template>
|
2
3
|
<v-toolbar
|
4
|
+
v-if="toolboxOpen && actionGroups.length > 0 && $vuetify.breakpoint.mdAndUp"
|
3
5
|
dense
|
4
|
-
class="vcs-toolbox toolbar__secondary rounded-b mx-auto v-sheet"
|
5
|
-
:
|
6
|
+
class="vcs-toolbox toolbar__secondary rounded-b mx-auto v-sheet marginToTop"
|
7
|
+
:width="width"
|
6
8
|
>
|
7
9
|
<v-toolbar-items class="w-full">
|
8
10
|
<div class="d-flex align-center justify-space-between w-full">
|
9
|
-
<
|
10
|
-
v-for="group
|
11
|
+
<ToolboxGroupComponent
|
12
|
+
v-for="(group, idx) in actionGroups"
|
11
13
|
:key="group.id"
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
/>
|
21
|
-
<Button
|
22
|
-
v-if="group.type === 'toggleButton'"
|
23
|
-
:group="group"
|
24
|
-
:icon="'$vcsObjectAttribute'"
|
25
|
-
:value="group.active"
|
26
|
-
@click.native="group.active = !group.active"
|
27
|
-
/>
|
28
|
-
<ToolboxSingleSelectButton
|
29
|
-
v-if="toolboxGroupVisible(group) && group.type === 'singleSelectButton'"
|
30
|
-
:group="group"
|
31
|
-
@selected="id => selectSingleSelectOption(id)"
|
32
|
-
@set-open="({ id, open }) => setGroupOpen({ id, open })"
|
33
|
-
/>
|
34
|
-
<ToolboxMultiSelectButton
|
35
|
-
v-if="toolboxGroupVisible(group) && group.type === 'multiSelectButton'"
|
36
|
-
:group="group"
|
37
|
-
@selected="id => selectMultiSlectOption(id)"
|
38
|
-
@set-open="({ id, open }) => setGroupOpen({ id, open })"
|
39
|
-
/>
|
40
|
-
</span>
|
14
|
+
:group-icon="group.icon"
|
15
|
+
:group-title="group.title"
|
16
|
+
:actions="group.actions"
|
17
|
+
class="px-2"
|
18
|
+
:active="groupId === group.id"
|
19
|
+
:position="getPosition(idx)"
|
20
|
+
@click="toggleGroup(group.id)"
|
21
|
+
/>
|
41
22
|
</div>
|
42
23
|
</v-toolbar-items>
|
43
24
|
</v-toolbar>
|
@@ -60,55 +41,117 @@
|
|
60
41
|
background-color: #ffffffda;
|
61
42
|
}
|
62
43
|
}
|
44
|
+
|
45
|
+
.marginToTop {
|
46
|
+
margin-top: 2px;
|
47
|
+
}
|
63
48
|
</style>
|
64
49
|
|
65
50
|
<script>
|
66
51
|
|
67
|
-
|
68
|
-
|
52
|
+
import { inject, ref, computed, watch, onUnmounted } from '@vue/composition-api';
|
53
|
+
import ToolboxGroupComponent from './ToolboxGroupComponent.vue';
|
54
|
+
import {ButtonLocation, vcsAppSymbol} from '@vcmap/ui';
|
55
|
+
|
56
|
+
/**
|
57
|
+
* @typedef {Object} ActionGroup
|
58
|
+
* @property {string} id
|
59
|
+
* @property {string} icon
|
60
|
+
* @property {string} title
|
61
|
+
* @property {Array<VcsAction>} actions
|
62
|
+
*/
|
69
63
|
|
70
|
-
|
71
|
-
|
64
|
+
/**
|
65
|
+
* @description ToolboxManager component rendering toolbox using {@link ToolboxGroupComponent}.
|
66
|
+
* @vue-computed {Array<ActionGroup>} actionGroups - Array of group components
|
67
|
+
* @vue-computed {number} width - width of toolbox depending on number of groups
|
68
|
+
*/
|
69
|
+
export default {
|
70
|
+
name: 'VcsToolboxManager',
|
71
|
+
components: {
|
72
|
+
ToolboxGroupComponent,
|
73
|
+
},
|
74
|
+
setup() {
|
75
|
+
const app = inject('vcsApp');
|
72
76
|
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
77
|
+
const toolboxComponentIds = ref(app.toolboxManager.componentIds);
|
78
|
+
const actionGroups = computed(() => {
|
79
|
+
const groups = toolboxComponentIds.value.map(id => app.toolboxManager.get(id));
|
80
|
+
return groups
|
81
|
+
.map((g) => {
|
82
|
+
const buttonIds = ref(g.buttonManager.componentIds);
|
83
|
+
return {
|
84
|
+
id: g.id,
|
85
|
+
icon: g.icon,
|
86
|
+
title: g.title,
|
87
|
+
actions: buttonIds.value.map(id => g.buttonManager.get(id).action),
|
88
|
+
};
|
89
|
+
})
|
90
|
+
.filter(g => g.actions.length > 0);
|
91
|
+
});
|
92
|
+
|
93
|
+
const toolboxOpen = ref(true);
|
94
|
+
const toolboxToggleAction = {
|
95
|
+
name: 'toolboxToggleAction',
|
96
|
+
icon: '$vcsTools',
|
97
|
+
title: 'Toolbox',
|
98
|
+
active: true,
|
99
|
+
callback() {
|
100
|
+
this.active = !this.active;
|
101
|
+
toolboxOpen.value = this.active;
|
79
102
|
},
|
80
|
-
}
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
103
|
+
};
|
104
|
+
|
105
|
+
const stopWatching = watch([actionGroups],
|
106
|
+
([actionGroups]) => {
|
107
|
+
if (actionGroups.length > 0) {
|
108
|
+
if (!app.navbarManager.has('toolbox')) {
|
109
|
+
app.navbarManager.add(
|
110
|
+
{
|
111
|
+
id: 'toolbox',
|
112
|
+
action: toolboxToggleAction,
|
113
|
+
},
|
114
|
+
vcsAppSymbol,
|
115
|
+
ButtonLocation.TOOL,
|
116
|
+
);
|
117
|
+
}
|
118
|
+
} else {
|
119
|
+
app.navbarManager.remove('toolbox');
|
120
|
+
}
|
121
|
+
}
|
122
|
+
);
|
123
|
+
|
124
|
+
onUnmounted(() => {
|
125
|
+
stopWatching();
|
126
|
+
});
|
127
|
+
|
128
|
+
// XXX can this solved by CSS to get rid of the hardcoded size and padding?
|
129
|
+
const buttonSize = 54;
|
130
|
+
const buttonPadding = 8;
|
131
|
+
const size = buttonSize + (2 * buttonPadding);
|
132
|
+
const width = computed(() => actionGroups.value.length * size);
|
98
133
|
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
134
|
+
/**
|
135
|
+
* calculates relative x-position of a button from the left edge of toolbar
|
136
|
+
* @param {number} idx
|
137
|
+
* @returns {number}
|
138
|
+
*/
|
139
|
+
const getPosition = (idx) => (size * (idx + 1)) - (size / 2);
|
140
|
+
|
141
|
+
return {
|
142
|
+
toolboxOpen,
|
143
|
+
actionGroups,
|
144
|
+
width,
|
145
|
+
getPosition,
|
146
|
+
groupId: null,
|
147
|
+
toggleGroup(groupId) {
|
148
|
+
if (this.groupId === groupId) {
|
149
|
+
this.groupId = null;
|
150
|
+
} else {
|
151
|
+
this.groupId = groupId;
|
152
|
+
}
|
153
|
+
},
|
154
|
+
};
|
155
|
+
},
|
156
|
+
};
|
114
157
|
</script>
|
@@ -0,0 +1,204 @@
|
|
1
|
+
/* eslint-disable import/prefer-default-export */
|
2
|
+
import { VcsEvent } from '@vcmap/core';
|
3
|
+
import { reactive } from '@vue/composition-api';
|
4
|
+
import { check, checkMaybe } from '@vcsuite/check';
|
5
|
+
import { v4 as uuidv4 } from 'uuid';
|
6
|
+
import { ButtonManager } from '../buttonManager.js';
|
7
|
+
|
8
|
+
/**
|
9
|
+
* @typedef ToolboxGroupComponentOptions
|
10
|
+
* @property {string} [id] Optional ID, If not provided an uuid will be generated.
|
11
|
+
* @property {string} [icon] Optional group icon, for dropdowns
|
12
|
+
* @property {string} [title] Optional group title, for dropdowns
|
13
|
+
*/
|
14
|
+
|
15
|
+
/**
|
16
|
+
* @typedef ToolboxGroupComponent
|
17
|
+
* @property {string} id
|
18
|
+
* @property {string} title
|
19
|
+
* @property {ButtonManager} buttonManager
|
20
|
+
*/
|
21
|
+
|
22
|
+
/**
|
23
|
+
* Default groups predefining icon and title of the group
|
24
|
+
* @type {Array<ToolboxGroupComponentOptions>}
|
25
|
+
*/
|
26
|
+
const defaultGroups = [
|
27
|
+
{
|
28
|
+
id: 'select',
|
29
|
+
icon: '$vcsPen',
|
30
|
+
title: 'select',
|
31
|
+
},
|
32
|
+
{
|
33
|
+
id: 'measurement',
|
34
|
+
icon: '$vcsDimensionsHouse',
|
35
|
+
title: 'measurement',
|
36
|
+
},
|
37
|
+
{
|
38
|
+
id: 'flight',
|
39
|
+
icon: '$vcsVideoRecorder',
|
40
|
+
title: 'flight',
|
41
|
+
},
|
42
|
+
];
|
43
|
+
|
44
|
+
/**
|
45
|
+
* Requests default groups for a toolboxManager.
|
46
|
+
* Once requested, group id, icon and title are defined and cannot be changed or overwritten.
|
47
|
+
* @param {ToolboxManager} toolboxManager
|
48
|
+
* @param {Array<ToolboxGroupComponentOptions>} groups
|
49
|
+
*/
|
50
|
+
export function setupDefaultGroups(toolboxManager, groups = defaultGroups) {
|
51
|
+
groups.forEach(({ id, icon, title }) => toolboxManager.requestGroup(id, icon, title));
|
52
|
+
}
|
53
|
+
|
54
|
+
/**
|
55
|
+
* @class ToolboxManager
|
56
|
+
* @description Manages a set of Toolbox Groups
|
57
|
+
* @implements VcsComponentManager<ToolboxGroupComponent,ToolboxGroupComponentOptions>
|
58
|
+
*/
|
59
|
+
export class ToolboxManager {
|
60
|
+
constructor() {
|
61
|
+
/**
|
62
|
+
* @type {import("@vcmap/core").VcsEvent<ToolboxGroupComponent>}
|
63
|
+
*/
|
64
|
+
this.added = new VcsEvent();
|
65
|
+
/**
|
66
|
+
* @type {import("@vcmap/core").VcsEvent<ToolboxGroupComponent>}
|
67
|
+
*/
|
68
|
+
this.removed = new VcsEvent();
|
69
|
+
/**
|
70
|
+
* reactive ordered array of ids,
|
71
|
+
* @type {Array<string>}
|
72
|
+
*/
|
73
|
+
this.componentIds = reactive([]);
|
74
|
+
|
75
|
+
/**
|
76
|
+
* @type {Map<string, ToolboxGroupComponent>}
|
77
|
+
* @private
|
78
|
+
*/
|
79
|
+
this._toolboxGroups = new Map();
|
80
|
+
}
|
81
|
+
|
82
|
+
/**
|
83
|
+
* @param {string} id
|
84
|
+
* @returns {ToolboxGroupComponent}
|
85
|
+
*/
|
86
|
+
get(id) {
|
87
|
+
return this._toolboxGroups.get(id);
|
88
|
+
}
|
89
|
+
|
90
|
+
/**
|
91
|
+
* @param {string} id
|
92
|
+
* @returns {boolean}
|
93
|
+
*/
|
94
|
+
has(id) {
|
95
|
+
return this._toolboxGroups.has(id);
|
96
|
+
}
|
97
|
+
|
98
|
+
/**
|
99
|
+
* Toolbox groups should be static. Removing them can lead to undefined behavior.
|
100
|
+
* @param {string} id
|
101
|
+
*/
|
102
|
+
remove(id) {
|
103
|
+
check(id, String);
|
104
|
+
const toolboxGroupComponent = this._toolboxGroups.get(id);
|
105
|
+
if (toolboxGroupComponent) {
|
106
|
+
const index = this.componentIds.indexOf(id);
|
107
|
+
this.componentIds.splice(index, 1);
|
108
|
+
this._toolboxGroups.delete(id);
|
109
|
+
this.removed.raiseEvent(toolboxGroupComponent);
|
110
|
+
toolboxGroupComponent.buttonManager.destroy();
|
111
|
+
}
|
112
|
+
}
|
113
|
+
|
114
|
+
/**
|
115
|
+
* Do not call add directly. Use requestGroup for adding toolbox groups.
|
116
|
+
* @param {ToolboxGroupComponentOptions} toolboxGroupComponentOptions
|
117
|
+
* @throws {Error} if a buttonComponent with the same ID has already been added
|
118
|
+
* @returns {ToolboxGroupComponent}
|
119
|
+
*/
|
120
|
+
add(toolboxGroupComponentOptions) {
|
121
|
+
checkMaybe(toolboxGroupComponentOptions.id, String);
|
122
|
+
checkMaybe(toolboxGroupComponentOptions.icon, String);
|
123
|
+
checkMaybe(toolboxGroupComponentOptions.title, String);
|
124
|
+
|
125
|
+
if (toolboxGroupComponentOptions.id && this.has(toolboxGroupComponentOptions.id)) {
|
126
|
+
throw new Error(`A toolGroup with id ${toolboxGroupComponentOptions.id} has already been registered.`);
|
127
|
+
}
|
128
|
+
const id = toolboxGroupComponentOptions.id || uuidv4();
|
129
|
+
const icon = toolboxGroupComponentOptions.icon || undefined;
|
130
|
+
const title = toolboxGroupComponentOptions.title || undefined;
|
131
|
+
const buttonManager = new ButtonManager();
|
132
|
+
|
133
|
+
/**
|
134
|
+
* @type {ToolboxGroupComponent}
|
135
|
+
*/
|
136
|
+
const toolboxGroupComponent = {
|
137
|
+
get id() {
|
138
|
+
return id;
|
139
|
+
},
|
140
|
+
get icon() {
|
141
|
+
return icon;
|
142
|
+
},
|
143
|
+
get title() {
|
144
|
+
return title;
|
145
|
+
},
|
146
|
+
get buttonManager() {
|
147
|
+
return buttonManager;
|
148
|
+
},
|
149
|
+
};
|
150
|
+
|
151
|
+
this._toolboxGroups.set(id, toolboxGroupComponent);
|
152
|
+
this.componentIds.push(id);
|
153
|
+
this.added.raiseEvent(toolboxGroupComponent);
|
154
|
+
return toolboxGroupComponent;
|
155
|
+
}
|
156
|
+
|
157
|
+
/**
|
158
|
+
* Returns an existing group or creates a new group. Add toolbox groups with this API.
|
159
|
+
* @param {string} id
|
160
|
+
* @param {string} [icon='mdi-select-group']
|
161
|
+
* @param {string} [title='defaultGroup']
|
162
|
+
* @returns {ToolboxGroupComponent}
|
163
|
+
*/
|
164
|
+
requestGroup(id, icon = 'mdi-select-group', title = 'defaultGroup') {
|
165
|
+
check(id, String);
|
166
|
+
checkMaybe(icon, String);
|
167
|
+
checkMaybe(title, String);
|
168
|
+
|
169
|
+
if (this.has(id)) {
|
170
|
+
return this.get(id);
|
171
|
+
} else {
|
172
|
+
return this.add({ id, icon, title });
|
173
|
+
}
|
174
|
+
}
|
175
|
+
|
176
|
+
/**
|
177
|
+
* removes all {@link ButtonComponent}s of a specific owner and fires removed Events
|
178
|
+
* @param {string|vcsAppSymbol} owner
|
179
|
+
*/
|
180
|
+
removeOwner(owner) {
|
181
|
+
this.componentIds.forEach((id) => {
|
182
|
+
this.get(id).buttonManager.removeOwner(owner);
|
183
|
+
});
|
184
|
+
}
|
185
|
+
|
186
|
+
/**
|
187
|
+
* removes all buttonComponents and fires removed Events
|
188
|
+
*/
|
189
|
+
clear() {
|
190
|
+
const componentIds = [...this.componentIds];
|
191
|
+
componentIds.forEach((id) => { this.remove(id); });
|
192
|
+
}
|
193
|
+
|
194
|
+
/**
|
195
|
+
* destroys the ButtonManager;
|
196
|
+
*/
|
197
|
+
destroy() {
|
198
|
+
this.added.destroy();
|
199
|
+
this.removed.destroy();
|
200
|
+
this.clear();
|
201
|
+
this.componentIds.splice(0);
|
202
|
+
this._toolboxGroups.clear();
|
203
|
+
}
|
204
|
+
}
|
@@ -1,36 +1,43 @@
|
|
1
1
|
<template>
|
2
|
-
<
|
2
|
+
<v-sheet
|
3
3
|
:id="`window-component--${windowState.id}`"
|
4
|
-
class="
|
4
|
+
class="elevation-3 position-absolute d-flex flex-column"
|
5
5
|
ref="windowComponentRef"
|
6
6
|
@click="clicked"
|
7
|
+
:class="{
|
8
|
+
'rounded': !isDocked,
|
9
|
+
'marginToTop': isDocked
|
10
|
+
}"
|
7
11
|
>
|
8
|
-
<
|
12
|
+
<div
|
9
13
|
v-if="!windowState.hideHeader"
|
10
14
|
ref="draggableHeaderRef"
|
11
|
-
class="
|
15
|
+
class="pa-2"
|
12
16
|
:class="{
|
13
17
|
'cursor-grab': isDynamic,
|
14
18
|
'grey--text': !isOnTop,
|
15
|
-
'rounded-tl': !isDocked,
|
16
|
-
'rounded-tr': !isDocked,
|
17
19
|
}"
|
18
20
|
:draggable="isDynamic"
|
19
21
|
>
|
20
22
|
<slot name="headerComponent" />
|
21
|
-
</
|
22
|
-
<v-
|
23
|
-
|
24
|
-
|
25
|
-
'rounded-br': !isDocked,
|
26
|
-
'rounded-bl': !isDocked,
|
27
|
-
}"
|
23
|
+
</div>
|
24
|
+
<v-divider />
|
25
|
+
<div
|
26
|
+
class="overflow-x-hidden"
|
28
27
|
>
|
29
28
|
<slot />
|
30
|
-
</
|
31
|
-
</
|
29
|
+
</div>
|
30
|
+
</v-sheet>
|
32
31
|
</template>
|
33
32
|
|
33
|
+
<style scoped>
|
34
|
+
|
35
|
+
.marginToTop {
|
36
|
+
margin-top: 2px;
|
37
|
+
}
|
38
|
+
|
39
|
+
</style>
|
40
|
+
|
34
41
|
<script>
|
35
42
|
import {
|
36
43
|
onMounted, onUnmounted, computed, ref, nextTick,
|
@@ -58,8 +65,8 @@
|
|
58
65
|
setup({ windowState, slotWindow }, { emit }) {
|
59
66
|
const draggableHeaderRef = ref(null);
|
60
67
|
const windowComponentRef = ref(null);
|
61
|
-
const isDynamic = computed(() => slotWindow !== WindowSlot.STATIC);
|
62
|
-
const isDocked = computed(() => slotWindow !== WindowSlot.DETACHED);
|
68
|
+
const isDynamic = computed(() => slotWindow.value !== WindowSlot.STATIC);
|
69
|
+
const isDocked = computed(() => slotWindow.value !== WindowSlot.DETACHED);
|
63
70
|
const clicked = (e) => {
|
64
71
|
emit('click', e);
|
65
72
|
};
|
@@ -69,8 +76,7 @@
|
|
69
76
|
onMounted(() => {
|
70
77
|
if (!windowState.hideHeader && slotWindow.value !== WindowSlot.STATIC) {
|
71
78
|
nextTick(() => {
|
72
|
-
|
73
|
-
const dragStart = fromEvent(draggableHeaderRef.value.$el, 'dragstart');
|
79
|
+
const dragStart = fromEvent(draggableHeaderRef.value, 'dragstart');
|
74
80
|
const dragOver = fromEvent(document.body, 'dragover');
|
75
81
|
const drop = fromEvent(document.body, 'drop');
|
76
82
|
const dragThenDrop = dragStart.pipe(
|
@@ -82,7 +88,8 @@
|
|
82
88
|
});
|
83
89
|
}),
|
84
90
|
switchMap((startEvent) => {
|
85
|
-
|
91
|
+
// To get to the Root Element of a Custom Component .$el is used here.
|
92
|
+
const style = window.getComputedStyle(windowComponentRef.value.$el, null);
|
86
93
|
const windowPosition = {
|
87
94
|
top: parseInt(style.getPropertyValue('top'), 10),
|
88
95
|
left: parseInt(style.getPropertyValue('left'), 10),
|
@@ -1,27 +1,34 @@
|
|
1
1
|
<template>
|
2
|
-
<span class="d-flex justify-space-between">
|
2
|
+
<span class="d-flex justify-space-between align-center window-component-header">
|
3
3
|
<span>
|
4
4
|
<v-icon
|
5
5
|
v-if="windowState.headerIcon"
|
6
6
|
class="mr-2 primary--text"
|
7
7
|
v-text="windowState.headerIcon"
|
8
8
|
/>
|
9
|
-
<h3 class="font-size-14 d-inline-block user-select-none">
|
9
|
+
<h3 class="font-size-14 d-inline-block user-select-none font-weight-bold">
|
10
10
|
{{ windowState.headerTitle | translate }}
|
11
11
|
</h3>
|
12
12
|
</span>
|
13
|
-
<
|
14
|
-
class=".float-right"
|
13
|
+
<VcsButton
|
15
14
|
@click.stop="close"
|
16
|
-
|
17
|
-
|
15
|
+
small
|
16
|
+
icon="mdi-close-thick"
|
18
17
|
/>
|
19
18
|
</span>
|
20
19
|
</template>
|
21
20
|
|
21
|
+
<style>
|
22
|
+
.window-component-header{
|
23
|
+
max-height: 16px;
|
24
|
+
}
|
25
|
+
</style>
|
26
|
+
|
22
27
|
<script>
|
28
|
+
import VcsButton from '../../components/buttons/VcsButton.vue';
|
23
29
|
|
24
30
|
export default {
|
31
|
+
components: { VcsButton },
|
25
32
|
props: {
|
26
33
|
windowState: {
|
27
34
|
type: Object,
|
@@ -1,5 +1,5 @@
|
|
1
1
|
<template>
|
2
|
-
<div>
|
2
|
+
<div :class="$vuetify.breakpoint.xs ? 'win-container-mobile' : 'unset'">
|
3
3
|
<WindowComponent
|
4
4
|
v-for="(id, zIndex) in componentIds"
|
5
5
|
:key="id"
|
@@ -28,6 +28,23 @@
|
|
28
28
|
</div>
|
29
29
|
</template>
|
30
30
|
|
31
|
+
<style scoped lang="scss">
|
32
|
+
.win-container-mobile {
|
33
|
+
position: absolute;
|
34
|
+
z-index: 2;
|
35
|
+
width: 100%;
|
36
|
+
height: 100%;
|
37
|
+
}
|
38
|
+
.win-container-mobile > {
|
39
|
+
div{
|
40
|
+
width: 100% !important;
|
41
|
+
inset: unset !important;
|
42
|
+
border-radius: 0 !important;
|
43
|
+
}
|
44
|
+
}
|
45
|
+
|
46
|
+
</style>
|
47
|
+
|
31
48
|
<script>
|
32
49
|
import { inject } from '@vue/composition-api';
|
33
50
|
|
@@ -71,7 +71,7 @@ export const WindowPositions = {
|
|
71
71
|
|
72
72
|
/**
|
73
73
|
* @typedef WindowComponentOptions
|
74
|
-
* @property {string} [id] Optional ID, If not provided
|
74
|
+
* @property {string} [id] Optional ID, If not provided an uuid will be generated.
|
75
75
|
* @property {VueComponent} component Main Component which is shown below the header.
|
76
76
|
* @property {VueComponent} [headerComponent] Replaces the Header Component.
|
77
77
|
* @property {WindowPositionOptions} [position] Will be ignored if WindowSlot !== DETACHED, can be given otherwise or default will be used
|
@@ -199,10 +199,7 @@ export class WindowManager {
|
|
199
199
|
* @returns {WindowComponent}
|
200
200
|
*/
|
201
201
|
get(id) {
|
202
|
-
|
203
|
-
return this._windowComponents.get(id);
|
204
|
-
}
|
205
|
-
return undefined;
|
202
|
+
return this._windowComponents.get(id);
|
206
203
|
}
|
207
204
|
|
208
205
|
/**
|
@@ -219,6 +216,7 @@ export class WindowManager {
|
|
219
216
|
* @param {string} id
|
220
217
|
*/
|
221
218
|
remove(id) {
|
219
|
+
check(id, String);
|
222
220
|
const windowComponent = this._windowComponents.get(id);
|
223
221
|
if (windowComponent) {
|
224
222
|
const index = this.componentIds.indexOf(id);
|