@vcmap/ui 6.0.0-rc.1 → 6.0.0-rc.2

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 (200) hide show
  1. package/config/base.config.json +4 -4
  2. package/dist/assets/cesium/Assets/approximateTerrainHeights.json +1 -1
  3. package/dist/assets/cesium/ThirdParty/Workers/z-worker-pako.js +1 -1
  4. package/dist/assets/cesium/Workers/{chunk-ZA25DG4Y.js → chunk-3DRPXHZ4.js} +11 -11
  5. package/dist/assets/cesium/Workers/{chunk-OAVNIRB4.js → chunk-3GI7DWF7.js} +5 -7
  6. package/dist/assets/cesium/Workers/{chunk-TFC6TZ3S.js → chunk-4EW3HFFI.js} +33 -22
  7. package/dist/assets/cesium/Workers/{chunk-LLUNNUJV.js → chunk-4OX4RYLB.js} +5 -5
  8. package/dist/assets/cesium/Workers/{chunk-66QLLS45.js → chunk-4RJH3H6D.js} +11 -9
  9. package/dist/assets/cesium/Workers/{chunk-MPAZH4BF.js → chunk-5OUTANXX.js} +1 -1
  10. package/dist/assets/cesium/Workers/{chunk-WXTV4ATB.js → chunk-6DH5PLFD.js} +1 -1
  11. package/dist/assets/cesium/Workers/{chunk-A4JVFBQ3.js → chunk-6DXIYFX3.js} +2 -2
  12. package/dist/assets/cesium/Workers/chunk-A5C2A5O5.js +963 -0
  13. package/dist/assets/cesium/Workers/{chunk-HQF437NJ.js → chunk-AGTH5JMJ.js} +6 -6
  14. package/dist/assets/cesium/Workers/{chunk-RP2A7BR5.js → chunk-AVFIYUKX.js} +12 -14
  15. package/dist/assets/cesium/Workers/{chunk-227AJNOA.js → chunk-BAJAVGUF.js} +5 -5
  16. package/dist/assets/cesium/Workers/{chunk-N3JIFFX2.js → chunk-BPY4HDAK.js} +5 -6
  17. package/dist/assets/cesium/Workers/{chunk-ABADGKYE.js → chunk-D6PDWQXW.js} +2 -2
  18. package/dist/assets/cesium/Workers/{chunk-34YUDLRP.js → chunk-DR7LK6PG.js} +13 -13
  19. package/dist/assets/cesium/Workers/{chunk-OYFCF4PL.js → chunk-DTACCQDR.js} +6 -6
  20. package/dist/assets/cesium/Workers/{chunk-C3SXRKRW.js → chunk-EVU2UNBD.js} +7 -7
  21. package/dist/assets/cesium/Workers/{chunk-6BTKZDRG.js → chunk-F7IEM66T.js} +3 -5
  22. package/dist/assets/cesium/Workers/{chunk-QT3MPEMI.js → chunk-FSXNF76Y.js} +4 -4
  23. package/dist/assets/cesium/Workers/{chunk-PCJWUS4M.js → chunk-FYYT5EVH.js} +830 -14
  24. package/dist/assets/cesium/Workers/{chunk-QMEMZIJI.js → chunk-FZDKIUDT.js} +4 -4
  25. package/dist/assets/cesium/Workers/{chunk-XTY7B2N6.js → chunk-G6346EDR.js} +16 -16
  26. package/dist/assets/cesium/Workers/{chunk-CHHNOC2C.js → chunk-H7PSTL64.js} +95 -155
  27. package/dist/assets/cesium/Workers/{chunk-2R5O53JW.js → chunk-I67V66MN.js} +6 -6
  28. package/dist/assets/cesium/Workers/{chunk-JS3AW5BK.js → chunk-IALQGTA2.js} +6 -6
  29. package/dist/assets/cesium/Workers/{chunk-K36FEYS7.js → chunk-KNMGSIIN.js} +16 -12
  30. package/dist/assets/cesium/Workers/{chunk-J3JY6I2C.js → chunk-L4XQPD6P.js} +49 -88
  31. package/dist/assets/cesium/Workers/{chunk-X4SU25DT.js → chunk-LMTN7R7M.js} +10 -12
  32. package/dist/assets/cesium/Workers/{chunk-JB2LWGH4.js → chunk-LUYI3XCB.js} +14 -14
  33. package/dist/assets/cesium/Workers/{chunk-AFFLIKOH.js → chunk-N5MIFVXJ.js} +7 -7
  34. package/dist/assets/cesium/Workers/{chunk-MYZB7C4T.js → chunk-O7OUBDMZ.js} +10 -10
  35. package/dist/assets/cesium/Workers/{chunk-VLGOATD6.js → chunk-P24I5VUS.js} +22 -22
  36. package/dist/assets/cesium/Workers/{chunk-KD4Y7CZL.js → chunk-PIOKSAZH.js} +15 -17
  37. package/dist/assets/cesium/Workers/{chunk-3W63OHNJ.js → chunk-PRKEY4QK.js} +5 -5
  38. package/dist/assets/cesium/Workers/{chunk-O5AMBQ36.js → chunk-Q7PM4W34.js} +8 -8
  39. package/dist/assets/cesium/Workers/{chunk-GLZBE3ML.js → chunk-QLC66ZRL.js} +13 -13
  40. package/dist/assets/cesium/Workers/{chunk-OZJDGN5F.js → chunk-RRLGJV3Q.js} +16 -16
  41. package/dist/assets/cesium/Workers/{chunk-CCFQRR6D.js → chunk-S2UEXF6T.js} +1 -1
  42. package/dist/assets/cesium/Workers/{chunk-QIKODV5G.js → chunk-S4VTLNAJ.js} +4 -4
  43. package/dist/assets/cesium/Workers/{chunk-EW2GWJYB.js → chunk-SJC5PRDX.js} +2 -2
  44. package/dist/assets/cesium/Workers/{chunk-KTJSNCK4.js → chunk-T6TZXGG5.js} +230 -20
  45. package/dist/assets/cesium/Workers/{chunk-RW6LU2CJ.js → chunk-TLGODPEV.js} +5 -5
  46. package/dist/assets/cesium/Workers/{chunk-CTELOFLA.js → chunk-UC566ISB.js} +6 -6
  47. package/dist/assets/cesium/Workers/{chunk-ZFOBYDGF.js → chunk-UMX265HW.js} +2 -2
  48. package/dist/assets/cesium/Workers/{chunk-Z24VKNDO.js → chunk-V7WJDCPA.js} +12 -12
  49. package/dist/assets/cesium/Workers/{chunk-4MFFIWUA.js → chunk-VD6G7UPU.js} +2 -2
  50. package/dist/assets/cesium/Workers/{chunk-XY7MGBKC.js → chunk-WMVCLETM.js} +14 -16
  51. package/dist/assets/cesium/Workers/{chunk-IPA4EACJ.js → chunk-WOA6WSHH.js} +12 -12
  52. package/dist/assets/cesium/Workers/{chunk-PFQBCKBM.js → chunk-X67EJ6X6.js} +4398 -2722
  53. package/dist/assets/cesium/Workers/{chunk-V3NGATMV.js → chunk-XGI4FRXF.js} +11 -13
  54. package/dist/assets/cesium/Workers/{chunk-AHKEZ2OE.js → chunk-YFVI4SQI.js} +1 -1
  55. package/dist/assets/cesium/Workers/{chunk-HARLBUOL.js → chunk-YFYPR4MW.js} +11 -8
  56. package/dist/assets/cesium/Workers/combineGeometry.js +22 -23
  57. package/dist/assets/cesium/Workers/createBoxGeometry.js +16 -17
  58. package/dist/assets/cesium/Workers/createBoxOutlineGeometry.js +14 -15
  59. package/dist/assets/cesium/Workers/createCircleGeometry.js +29 -26
  60. package/dist/assets/cesium/Workers/createCircleOutlineGeometry.js +17 -18
  61. package/dist/assets/cesium/Workers/createCoplanarPolygonGeometry.js +35 -36
  62. package/dist/assets/cesium/Workers/createCoplanarPolygonOutlineGeometry.js +29 -30
  63. package/dist/assets/cesium/Workers/createCorridorGeometry.js +29 -30
  64. package/dist/assets/cesium/Workers/createCorridorOutlineGeometry.js +27 -28
  65. package/dist/assets/cesium/Workers/createCylinderGeometry.js +18 -19
  66. package/dist/assets/cesium/Workers/createCylinderOutlineGeometry.js +17 -19
  67. package/dist/assets/cesium/Workers/createEllipseGeometry.js +24 -25
  68. package/dist/assets/cesium/Workers/createEllipseOutlineGeometry.js +17 -18
  69. package/dist/assets/cesium/Workers/createEllipsoidGeometry.js +17 -18
  70. package/dist/assets/cesium/Workers/createEllipsoidOutlineGeometry.js +16 -17
  71. package/dist/assets/cesium/Workers/createFrustumGeometry.js +16 -17
  72. package/dist/assets/cesium/Workers/createFrustumOutlineGeometry.js +18 -18
  73. package/dist/assets/cesium/Workers/createGeometry.js +52 -33
  74. package/dist/assets/cesium/Workers/createGroundPolylineGeometry.js +28 -29
  75. package/dist/assets/cesium/Workers/createPlaneGeometry.js +14 -15
  76. package/dist/assets/cesium/Workers/createPlaneOutlineGeometry.js +13 -14
  77. package/dist/assets/cesium/Workers/createPolygonGeometry.js +451 -176
  78. package/dist/assets/cesium/Workers/createPolygonOutlineGeometry.js +29 -30
  79. package/dist/assets/cesium/Workers/createPolylineGeometry.js +24 -25
  80. package/dist/assets/cesium/Workers/createPolylineVolumeGeometry.js +31 -33
  81. package/dist/assets/cesium/Workers/createPolylineVolumeOutlineGeometry.js +27 -29
  82. package/dist/assets/cesium/Workers/createRectangleGeometry.js +30 -31
  83. package/dist/assets/cesium/Workers/createRectangleOutlineGeometry.js +21 -24
  84. package/dist/assets/cesium/Workers/createSimplePolylineGeometry.js +22 -23
  85. package/dist/assets/cesium/Workers/createSphereGeometry.js +17 -18
  86. package/dist/assets/cesium/Workers/createSphereOutlineGeometry.js +16 -17
  87. package/dist/assets/cesium/Workers/createTaskProcessorWorker.js +3 -3
  88. package/dist/assets/cesium/Workers/createVectorTileClampedPolylines.js +14 -16
  89. package/dist/assets/cesium/Workers/createVectorTileGeometries.js +22 -23
  90. package/dist/assets/cesium/Workers/createVectorTilePoints.js +12 -12
  91. package/dist/assets/cesium/Workers/createVectorTilePolygons.js +20 -21
  92. package/dist/assets/cesium/Workers/createVectorTilePolylines.js +14 -16
  93. package/dist/assets/cesium/Workers/createVerticesFromGoogleEarthEnterpriseBuffer.js +24 -25
  94. package/dist/assets/cesium/Workers/createVerticesFromHeightmap.js +25 -26
  95. package/dist/assets/cesium/Workers/createVerticesFromQuantizedTerrainMesh.js +19 -21
  96. package/dist/assets/cesium/Workers/createWallGeometry.js +23 -24
  97. package/dist/assets/cesium/Workers/createWallOutlineGeometry.js +22 -23
  98. package/dist/assets/cesium/Workers/decodeDraco.js +11 -11
  99. package/dist/assets/cesium/Workers/decodeGoogleEarthEnterprisePacket.js +12 -19
  100. package/dist/assets/cesium/Workers/decodeI3S.js +600 -92
  101. package/dist/assets/cesium/Workers/transcodeKTX2.js +46 -82
  102. package/dist/assets/cesium/Workers/transferTypedArrayTest.js +1 -1
  103. package/dist/assets/cesium/Workers/upsampleQuantizedTerrainMesh.js +21 -22
  104. package/dist/assets/{cesium.6b12b4.js → cesium.0b750d.js} +151166 -145641
  105. package/dist/assets/cesium.js +1 -1
  106. package/dist/assets/{core.074b78.js → core.cbf44a.js} +1944 -1902
  107. package/dist/assets/core.js +1 -1
  108. package/dist/assets/index-8eGauqjA.js +1 -0
  109. package/dist/assets/ol.js +1 -1
  110. package/dist/assets/ui.7c276c.css +1 -0
  111. package/dist/assets/{ui.715986.js → ui.7c276c.js} +13826 -12887
  112. package/dist/assets/ui.js +1 -1
  113. package/dist/assets/vue.js +1 -1
  114. package/dist/assets/{vuetify.28d881.js → vuetify.4d18fe.js} +1 -1
  115. package/dist/assets/vuetify.js +1 -1
  116. package/dist/index.html +1 -1
  117. package/index.d.ts +2 -0
  118. package/index.js +1 -0
  119. package/package.json +7 -6
  120. package/plugins/@vcmap-show-case/list-example/src/ListExample.vue +24 -86
  121. package/plugins/@vcmap-show-case/vector-properties-example/src/VectorPropertiesExample.vue +35 -10
  122. package/plugins/@vcmap-show-case/wizard-example/src/WizardExample.vue +40 -54
  123. package/src/application/VcsApp.vue +1 -2
  124. package/src/application/VcsCustomScreen.vue +4 -4
  125. package/src/application/VcsCustomScreen.vue.d.ts +1 -1
  126. package/src/application/VcsNavbar.vue.d.ts +1 -1
  127. package/src/application/VcsSplashScreen.vue +18 -21
  128. package/src/application/VcsSplashScreen.vue.d.ts +5 -5
  129. package/src/application/VcsTextPage.vue +4 -4
  130. package/src/application/VcsTextPage.vue.d.ts +1 -1
  131. package/src/application/markdownHelper.js +2 -17
  132. package/src/components/buttons/VcsButton.vue +1 -1
  133. package/src/components/buttons/VcsButton.vue.d.ts +3 -3
  134. package/src/components/buttons/VcsFormButton.vue +1 -1
  135. package/src/components/buttons/VcsFormButton.vue.d.ts +2 -2
  136. package/src/components/buttons/VcsToolButton.vue +1 -1
  137. package/src/components/buttons/VcsToolButton.vue.d.ts +4 -4
  138. package/src/components/composables.d.ts +7 -0
  139. package/src/components/composables.js +35 -1
  140. package/src/components/form-inputs-controls/VcsCheckbox.vue +12 -8
  141. package/src/components/form-inputs-controls/VcsCheckbox.vue.d.ts +1 -0
  142. package/src/components/form-inputs-controls/VcsChipArrayInput.vue +1 -1
  143. package/src/components/form-inputs-controls/VcsDatePicker.vue.d.ts +1 -1
  144. package/src/components/form-inputs-controls/VcsFileInput.vue +2 -2
  145. package/src/components/form-inputs-controls/VcsFormSection.vue.d.ts +1 -1
  146. package/src/components/form-inputs-controls/VcsLabel.vue +31 -1
  147. package/src/components/form-inputs-controls/VcsLabel.vue.d.ts +21 -1
  148. package/src/components/form-inputs-controls/VcsRadio.vue +2 -2
  149. package/src/components/form-inputs-controls/VcsSelect.vue +7 -16
  150. package/src/components/form-inputs-controls/VcsSelect.vue.d.ts +2 -2
  151. package/src/components/form-inputs-controls/VcsSlider.vue +36 -10
  152. package/src/components/form-inputs-controls/VcsSlider.vue.d.ts +25 -2
  153. package/src/components/form-inputs-controls/VcsTextArea.vue +35 -20
  154. package/src/components/form-inputs-controls/VcsTextField.vue +17 -12
  155. package/src/components/form-inputs-controls/VcsTextField.vue.d.ts +1 -0
  156. package/src/components/form-inputs-controls/VcsWizard.vue +89 -112
  157. package/src/components/form-inputs-controls/VcsWizard.vue.d.ts +3 -13
  158. package/src/components/form-inputs-controls/VcsWizardStep.vue +75 -57
  159. package/src/components/form-inputs-controls/VcsWizardStep.vue.d.ts +24 -11
  160. package/src/components/form-inputs-controls/vcsTextField.scss +5 -0
  161. package/src/components/form-output/VcsFormattedNumber.vue +25 -9
  162. package/src/components/form-output/VcsFormattedNumber.vue.d.ts +18 -0
  163. package/src/components/form-output/VcsMarkdown.vue +53 -0
  164. package/src/components/form-output/VcsMarkdown.vue.d.ts +16 -0
  165. package/src/components/lists/VcsActionList.vue +43 -27
  166. package/src/components/lists/VcsActionList.vue.d.ts +3 -1
  167. package/src/components/lists/VcsList.vue +82 -151
  168. package/src/components/lists/VcsList.vue.d.ts +5 -8
  169. package/src/components/lists/VcsListItem.vue +154 -0
  170. package/src/components/lists/VcsListItem.vue.d.ts +21 -0
  171. package/src/components/lists/VcsTreeviewLeaf.vue +1 -1
  172. package/src/components/modelHelper.d.ts +11 -0
  173. package/src/components/modelHelper.js +42 -2
  174. package/src/components/vector-properties/VcsFeatureEditingWindow.vue +14 -6
  175. package/src/components/vector-properties/VcsFeatureEditingWindow.vue.d.ts +3 -3
  176. package/src/components/vector-properties/VcsVectorPropertiesComponent.vue +474 -585
  177. package/src/components/vector-properties/VcsVectorPropertiesComponent.vue.d.ts +193 -22
  178. package/src/manager/window/windowManager.d.ts +4 -4
  179. package/src/manager/window/windowManager.js +2 -2
  180. package/src/navigation/MapNavigation.vue +6 -3
  181. package/src/navigation/OrientationToolsButton.vue +39 -26
  182. package/src/navigation/OrientationToolsButton.vue.d.ts +5 -1
  183. package/src/navigation/TiltSlider.vue +83 -88
  184. package/src/navigation/TiltSlider.vue.d.ts +10 -7
  185. package/src/navigation/VcsCompass.vue +17 -11
  186. package/src/navigation/VcsCompass.vue.d.ts +2 -0
  187. package/src/styles/_typography.scss +1 -0
  188. package/src/vcsUiApp.d.ts +11 -17
  189. package/src/vcsUiApp.js +10 -3
  190. package/src/vuePlugins/i18n.js +7 -0
  191. package/src/vuePlugins/vuetify.js +4 -0
  192. package/dist/assets/cesium/Workers/chunk-DUHWWBQQ.js +0 -3273
  193. package/dist/assets/cesium/Workers/chunk-QJ3DFBH3.js +0 -73
  194. package/dist/assets/index-ca7EmZ3d.js +0 -1
  195. package/dist/assets/ui.715986.css +0 -1
  196. package/src/components/vector-properties/composables.d.ts +0 -33
  197. package/src/components/vector-properties/composables.js +0 -100
  198. /package/dist/assets/{ol.8b2e3a.js → ol.86e93c.js} +0 -0
  199. /package/dist/assets/{vue.0f2c53.js → vue.a3cd64.js} +0 -0
  200. /package/dist/assets/{vuetify.28d881.css → vuetify.4d18fe.css} +0 -0
@@ -6,137 +6,134 @@
6
6
  :header-actions="headerActions"
7
7
  >
8
8
  <v-container class="px-1 py-0">
9
- <v-row
10
- v-if="visibleProperties.has('altitudeMode') && show3DProperties"
11
- no-gutters
12
- >
13
- <v-col>
14
- <VcsLabel html-for="vp-altitude-mode">{{
15
- $t('components.vectorProperties.altitudeMode')
16
- }}</VcsLabel>
17
- </v-col>
18
- <v-col>
19
- <VcsSelect
20
- id="vp-altitude-mode"
21
- :items="availableAltitudeModes"
22
- v-model="altitudeMode"
23
- dense
24
- />
25
- </v-col>
26
- </v-row>
27
- <v-row
28
- v-if="
29
- visibleProperties.has('heightAboveGround') &&
30
- altitudeMode === 'relativeToGround' &&
31
- show3DProperties
32
- "
33
- no-gutters
34
- >
35
- <v-col>
36
- <VcsLabel html-for="vp-height-above-ground">{{
37
- $t('components.vectorProperties.heightAboveGround')
38
- }}</VcsLabel>
39
- </v-col>
40
- <v-col>
41
- <VcsTextField
42
- id="vp-height-above-ground"
43
- v-model.number="heightAboveGround"
44
- :hide-spin-buttons="true"
45
- type="number"
46
- unit="m"
47
- :placeholder="'heightAboveGround' in value ? '0' : ''"
48
- />
49
- </v-col>
50
- </v-row>
51
- <v-row
52
- v-if="visibleProperties.has('groundLevel') && show3DProperties"
53
- no-gutters
54
- >
55
- <v-col>
56
- <VcsLabel html-for="vp-ground-level">{{
57
- $t('components.vectorProperties.groundLevel')
58
- }}</VcsLabel>
59
- </v-col>
60
- <v-col>
61
- <VcsTextField
62
- id="vp-ground-level"
63
- v-model.number="groundLevel"
64
- :hide-spin-buttons="true"
65
- type="number"
66
- unit="m"
67
- :placeholder="'groundLevel' in value ? '0' : ''"
68
- clearable
69
- />
70
- </v-col>
71
- </v-row>
72
- <v-row
73
- v-if="visibleProperties.has('scaleByDistance') && show3DProperties"
74
- no-gutters
75
- >
76
- <v-col>
77
- <VcsCheckbox
78
- label="components.vectorProperties.scaleByDistance"
79
- v-model="hasScaleByDistance"
80
- />
81
- </v-col>
82
- <v-col>
9
+ <template v-if="show3DProperties">
10
+ <v-row v-if="visibleProperties.has('altitudeMode')" no-gutters>
11
+ <v-col>
12
+ <VcsLabel html-for="vp-altitude-mode">{{
13
+ $t('components.vectorProperties.altitudeMode')
14
+ }}</VcsLabel>
15
+ </v-col>
16
+ <v-col>
17
+ <VcsSelect
18
+ id="vp-altitude-mode"
19
+ :items="availableAltitudeModes"
20
+ v-model="localValue.altitudeMode"
21
+ />
22
+ </v-col>
23
+ </v-row>
24
+ <v-row
25
+ v-if="
26
+ visibleProperties.has('heightAboveGround') &&
27
+ localValue.altitudeMode === 'relativeToGround'
28
+ "
29
+ no-gutters
30
+ >
31
+ <v-col>
32
+ <VcsLabel html-for="vp-height-above-ground">{{
33
+ $t('components.vectorProperties.heightAboveGround')
34
+ }}</VcsLabel>
35
+ </v-col>
36
+ <v-col>
37
+ <VcsTextField
38
+ id="vp-height-above-ground"
39
+ v-model.number="localValue.heightAboveGround"
40
+ :hide-spin-buttons="true"
41
+ type="number"
42
+ unit="m"
43
+ placeholder="0"
44
+ />
45
+ </v-col>
46
+ </v-row>
47
+ <v-row v-if="visibleProperties.has('groundLevel')" no-gutters>
48
+ <v-col>
49
+ <VcsLabel html-for="vp-ground-level">{{
50
+ $t('components.vectorProperties.groundLevel')
51
+ }}</VcsLabel>
52
+ </v-col>
53
+ <v-col>
54
+ <VcsTextField
55
+ id="vp-ground-level"
56
+ v-model.number="localValue.groundLevel"
57
+ :hide-spin-buttons="true"
58
+ type="number"
59
+ unit="m"
60
+ placeholder="0"
61
+ clearable
62
+ />
63
+ </v-col>
64
+ </v-row>
65
+ <template v-if="visibleProperties.has('scaleByDistance')">
83
66
  <v-row no-gutters>
84
- <v-col v-for="(nearFar, index) in scaleByDistance" :key="index">
85
- <VcsTextField
86
- v-model.number="nearFar.value"
87
- :hide-spin-buttons="true"
88
- type="number"
89
- :unit="index % 2 === 0 ? 'm' : ''"
90
- :disabled="!hasScaleByDistance"
91
- :placeholder="
92
- 'scaleByDistance' in value
93
- ? `${scaleByDistanceDefault[index]}`
94
- : ''
95
- "
96
- :rules="[
97
- (v) =>
98
- !hasScaleByDistance ||
99
- !isNaN(v) ||
100
- 'components.validation.required',
101
- ]"
67
+ <v-col cols="6">
68
+ <VcsCheckbox
69
+ label="components.vectorProperties.scaleByDistance"
70
+ v-model="hasScaleByDistance"
102
71
  />
103
72
  </v-col>
104
73
  </v-row>
105
- </v-col>
106
- </v-row>
107
- <v-row
108
- v-if="visibleProperties.has('eyeOffset') && show3DProperties"
109
- no-gutters
110
- >
111
- <v-col>
112
- <VcsCheckbox
113
- label="components.vectorProperties.eyeOffset"
114
- v-model="hasEyeOffset"
115
- />
116
- </v-col>
117
- <v-col v-for="(distance, index) in eyeOffset" :key="index" cols="2">
118
- <VcsTextField
119
- v-model.number="distance.value"
120
- unit="m"
121
- :hide-spin-buttons="true"
122
- type="number"
123
- :disabled="!hasEyeOffset"
124
- :prefix="dimensionsUpperCase[index]"
125
- :rules="[
126
- (v) =>
127
- !hasEyeOffset || !isNaN(v) || 'components.validation.required',
128
- ]"
129
- :placeholder="
130
- 'eyeOffset' in value ? `${eyeOffsetDefault[index]}` : ''
131
- "
132
- />
133
- </v-col>
134
- </v-row>
74
+ <template v-if="hasScaleByDistance">
75
+ <v-row no-gutters class="pb-2">
76
+ <v-col
77
+ v-for="(_, index) in localValue.scaleByDistance"
78
+ :key="index"
79
+ >
80
+ <VcsTextField
81
+ v-model="localValue.scaleByDistance[index]"
82
+ :hide-spin-buttons="true"
83
+ type="number"
84
+ :unit="index % 2 === 0 ? 'm' : ''"
85
+ :disabled="!localValue.scaleByDistance"
86
+ :placeholder="String(scaleByDistanceDefault[index])"
87
+ :rules="[
88
+ (v) =>
89
+ !hasScaleByDistance ||
90
+ !isNaN(v) ||
91
+ 'components.validation.required',
92
+ ]"
93
+ />
94
+ </v-col>
95
+ </v-row>
96
+ </template>
97
+ </template>
98
+ <template v-if="visibleProperties.has('eyeOffset')">
99
+ <v-row no-gutters>
100
+ <v-col>
101
+ <VcsCheckbox
102
+ label="components.vectorProperties.eyeOffset"
103
+ v-model="hasEyeOffset"
104
+ />
105
+ </v-col>
106
+ </v-row>
107
+ <template v-if="hasEyeOffset">
108
+ <v-row no-gutters class="pb-2">
109
+ <v-col v-for="(_, index) in localValue.eyeOffset" :key="index">
110
+ <VcsTextField
111
+ v-model.number="localValue.eyeOffset[index]"
112
+ unit="m"
113
+ :hide-spin-buttons="true"
114
+ type="number"
115
+ :disabled="!hasEyeOffset"
116
+ :prefix="dimensionsUpperCase[index]"
117
+ :rules="[
118
+ (v) =>
119
+ !hasEyeOffset ||
120
+ !isNaN(v) ||
121
+ 'components.validation.required',
122
+ ]"
123
+ :placeholder="String(eyeOffsetDefault[index])"
124
+ />
125
+ </v-col>
126
+ </v-row>
127
+ </template>
128
+ </template>
129
+ </template>
135
130
  <v-row v-if="visibleProperties.has('allowPicking')" no-gutters>
136
131
  <v-col>
137
132
  <VcsCheckbox
138
133
  label="components.vectorProperties.allowPicking"
139
- v-model="allowPicking"
134
+ v-model="localValue.allowPicking"
135
+ :true-value="true"
136
+ :false-value="false"
140
137
  />
141
138
  </v-col>
142
139
  </v-row>
@@ -145,336 +142,329 @@
145
142
  no-gutters
146
143
  >
147
144
  <v-col>
148
- <VcsLabel html-for="vp-classification-type" :dense="true">
145
+ <VcsLabel html-for="vp-classification-type">
149
146
  {{ $t('components.vectorProperties.classificationType') }}
150
147
  </VcsLabel>
151
148
  </v-col>
152
149
  <v-col>
153
150
  <VcsSelect
154
151
  id="vp-classification-type"
155
- :items="[
156
- { value: 'none', text: 'components.vectorProperties.none' },
157
- { value: 'both', text: 'components.vectorProperties.both' },
158
- {
159
- value: 'cesium3DTile',
160
- text: 'components.vectorProperties.cesium3DTile',
161
- },
162
- { value: 'terrain', text: 'components.vectorProperties.terrain' },
163
- ]"
152
+ :items="availableClassificationTypes"
164
153
  v-model="classificationType"
165
- dense
166
154
  />
167
155
  </v-col>
168
156
  </v-row>
169
157
  </v-container>
170
- <v-divider
171
- v-if="
172
- showDividers &&
173
- show3DProperties &&
174
- [
175
- 'extrudedHeight',
176
- 'skirt',
177
- 'storeysAboveGround',
178
- 'storeysBelowGround',
179
- 'storeyHeightsAboveGround',
180
- 'storeyHeightsBelowGround',
181
- ].some((prop) => visibleProperties.has(prop))
182
- "
183
- />
184
- <v-container class="px-1 py-0" v-if="show3DProperties">
185
- <v-row
158
+ <template v-if="show3DProperties">
159
+ <v-divider
186
160
  v-if="
187
- visibleProperties.has('storeysAboveGround') ||
188
- visibleProperties.has('storeyHeightsAboveGround')
161
+ showDividers &&
162
+ [
163
+ 'extrudedHeight',
164
+ 'skirt',
165
+ 'storeysAboveGround',
166
+ 'storeysBelowGround',
167
+ 'storeyHeightsAboveGround',
168
+ 'storeyHeightsBelowGround',
169
+ ].some((prop) => visibleProperties.has(prop))
189
170
  "
190
- no-gutters
191
- >
192
- <v-col>
193
- <VcsLabel>{{
194
- $t('components.vectorProperties.aboveGround')
195
- }}</VcsLabel>
196
- </v-col>
197
- </v-row>
198
- <v-row v-if="visibleProperties.has('extrudedHeight')" no-gutters>
199
- <v-col>
200
- <VcsLabel
201
- html-for="vp-extruded-height"
202
- :class="{
203
- 'px-4':
204
- visibleProperties.has('storeysAboveGround') ||
205
- visibleProperties.has('storeyHeightsAboveGround'),
206
- }"
207
- >{{ $t('components.vectorProperties.extrudedHeight') }}</VcsLabel
208
- >
209
- </v-col>
210
- <v-col>
211
- <VcsTextField
212
- id="vp-extruded-height"
213
- v-model.number="extrudedHeight"
214
- :hide-spin-buttons="true"
215
- type="number"
216
- unit="m"
217
- :placeholder="'extrudedHeight' in value ? '0' : ''"
218
- clearable
219
- :rules="[
220
- (v) => v >= 0 || isNaN(v) || 'components.validation.notValid',
221
- ]"
222
- />
223
- </v-col>
224
- </v-row>
225
- <v-row v-if="visibleProperties.has('storeysAboveGround')" no-gutters>
226
- <v-col>
227
- <VcsLabel html-for="vp-storeys-above" class="px-4">{{
228
- $t('components.vectorProperties.storeys')
229
- }}</VcsLabel>
230
- </v-col>
231
- <v-col>
232
- <VcsTextField
233
- id="vp-storeys-above"
234
- v-model.number="storeysAboveGround"
235
- :hide-spin-buttons="true"
236
- type="number"
237
- :placeholder="'storeysAboveGround' in value ? '0' : ''"
238
- clearable
239
- :rules="[
240
- (v) => v >= 0 || isNaN(v) || 'components.validation.notValid',
241
- ]"
242
- />
243
- </v-col>
244
- </v-row>
245
- <v-row
246
- v-if="visibleProperties.has('storeyHeightsAboveGround')"
247
- no-gutters
248
- >
249
- <v-col>
250
- <VcsLabel :html-for="'vp-storey-heights-above'" class="px-4">{{
251
- $t('components.vectorProperties.storeyHeights')
252
- }}</VcsLabel>
253
- </v-col>
254
- <v-col>
255
- <VcsChipArrayInput
256
- id="vp-storey-heights-above"
257
- dense
258
- column
259
- type="number"
260
- v-model="storeyHeights.storeyHeightsAboveGround.value"
261
- placeholder="3"
262
- :rules="[(v) => !(v <= 0) || 'components.validation.notValid']"
263
- />
264
- </v-col>
265
- </v-row>
266
- <v-row
171
+ />
172
+ <v-container class="px-1 py-0">
173
+ <v-row
174
+ v-if="
175
+ visibleProperties.has('storeysAboveGround') ||
176
+ visibleProperties.has('storeyHeightsAboveGround')
177
+ "
178
+ no-gutters
179
+ >
180
+ <v-col>
181
+ <VcsLabel>{{
182
+ $t('components.vectorProperties.aboveGround')
183
+ }}</VcsLabel>
184
+ </v-col>
185
+ </v-row>
186
+ <v-row v-if="visibleProperties.has('extrudedHeight')" no-gutters>
187
+ <v-col>
188
+ <VcsLabel
189
+ html-for="vp-extruded-height"
190
+ :class="{
191
+ 'px-4':
192
+ visibleProperties.has('storeysAboveGround') ||
193
+ visibleProperties.has('storeyHeightsAboveGround'),
194
+ }"
195
+ >{{ $t('components.vectorProperties.extrudedHeight') }}</VcsLabel
196
+ >
197
+ </v-col>
198
+ <v-col>
199
+ <VcsTextField
200
+ id="vp-extruded-height"
201
+ v-model.number="localValue.extrudedHeight"
202
+ :hide-spin-buttons="true"
203
+ type="number"
204
+ unit="m"
205
+ :placeholder="'extrudedHeight' in localValue ? '0' : ''"
206
+ clearable
207
+ :rules="[
208
+ (v) => v >= 0 || isNaN(v) || 'components.validation.notValid',
209
+ ]"
210
+ />
211
+ </v-col>
212
+ </v-row>
213
+ <v-row v-if="visibleProperties.has('storeysAboveGround')" no-gutters>
214
+ <v-col>
215
+ <VcsLabel html-for="vp-storeys-above" class="px-4">{{
216
+ $t('components.vectorProperties.storeys')
217
+ }}</VcsLabel>
218
+ </v-col>
219
+ <v-col>
220
+ <VcsTextField
221
+ id="vp-storeys-above"
222
+ v-model.number="localValue.storeysAboveGround"
223
+ :hide-spin-buttons="true"
224
+ type="number"
225
+ :placeholder="'storeysAboveGround' in localValue ? '0' : ''"
226
+ clearable
227
+ :rules="[
228
+ (v) => v >= 0 || isNaN(v) || 'components.validation.notValid',
229
+ ]"
230
+ />
231
+ </v-col>
232
+ </v-row>
233
+ <v-row
234
+ v-if="visibleProperties.has('storeyHeightsAboveGround')"
235
+ no-gutters
236
+ >
237
+ <v-col>
238
+ <VcsLabel :html-for="'vp-storey-heights-above'" class="px-4">{{
239
+ $t('components.vectorProperties.storeyHeights')
240
+ }}</VcsLabel>
241
+ </v-col>
242
+ <v-col>
243
+ <VcsChipArrayInput
244
+ id="vp-storey-heights-above"
245
+ column
246
+ type="number"
247
+ v-model="storeyHeights.storeyHeightsAboveGround.value"
248
+ placeholder="3"
249
+ :rules="[(v) => !(v <= 0) || 'components.validation.notValid']"
250
+ />
251
+ </v-col>
252
+ </v-row>
253
+ <v-row
254
+ v-if="
255
+ visibleProperties.has('storeysBelowGround') ||
256
+ visibleProperties.has('storeyHeightsBelowGround')
257
+ "
258
+ no-gutters
259
+ >
260
+ <v-col>
261
+ <VcsLabel>{{
262
+ $t('components.vectorProperties.belowGround')
263
+ }}</VcsLabel>
264
+ </v-col>
265
+ </v-row>
266
+ <v-row v-if="visibleProperties.has('skirt')" no-gutters>
267
+ <v-col>
268
+ <VcsLabel
269
+ html-for="vp-skirt"
270
+ :class="{
271
+ 'px-4':
272
+ visibleProperties.has('storeysBelowGround') ||
273
+ visibleProperties.has('storeyHeightsBelowGround'),
274
+ }"
275
+ >{{ $t('components.vectorProperties.skirt') }}</VcsLabel
276
+ >
277
+ </v-col>
278
+ <v-col>
279
+ <VcsTextField
280
+ id="vp-skirt"
281
+ v-model.number="localValue.skirt"
282
+ :hide-spin-buttons="true"
283
+ type="number"
284
+ unit="m"
285
+ :placeholder="'skirt' in localValue ? '0' : ''"
286
+ clearable
287
+ :rules="[
288
+ (v) => v >= 0 || isNaN(v) || 'components.validation.notValid',
289
+ ]"
290
+ />
291
+ </v-col>
292
+ </v-row>
293
+ <v-row v-if="visibleProperties.has('storeysBelowGround')" no-gutters>
294
+ <v-col>
295
+ <VcsLabel html-for="vp-storeys-below" class="px-4">{{
296
+ $t('components.vectorProperties.storeys')
297
+ }}</VcsLabel>
298
+ </v-col>
299
+ <v-col>
300
+ <VcsTextField
301
+ id="vp-storeys-below"
302
+ v-model.number="localValue.storeysBelowGround"
303
+ :hide-spin-buttons="true"
304
+ type="number"
305
+ :placeholder="'storeysBelowGround' in localValue ? '0' : ''"
306
+ clearable
307
+ :rules="[
308
+ (v) => v >= 0 || isNaN(v) || 'components.validation.notValid',
309
+ ]"
310
+ />
311
+ </v-col>
312
+ </v-row>
313
+ <v-row
314
+ v-if="visibleProperties.has('storeyHeightsBelowGround')"
315
+ no-gutters
316
+ >
317
+ <v-col>
318
+ <VcsLabel :html-for="'vp-storey-heights-below'" class="px-4">{{
319
+ $t('components.vectorProperties.storeyHeights')
320
+ }}</VcsLabel>
321
+ </v-col>
322
+ <v-col>
323
+ <VcsChipArrayInput
324
+ :id="'vp-storey-heights-below'"
325
+ column
326
+ type="number"
327
+ v-model="storeyHeights.storeyHeightsBelowGround.value"
328
+ placeholder="3"
329
+ />
330
+ </v-col>
331
+ </v-row>
332
+ </v-container>
333
+ <v-divider
267
334
  v-if="
268
- visibleProperties.has('storeysBelowGround') ||
269
- visibleProperties.has('storeyHeightsBelowGround')
335
+ showDividers &&
336
+ [
337
+ 'modelUrl',
338
+ 'modelScaleX',
339
+ 'modelScaleY',
340
+ 'modelScaleZ',
341
+ 'modelHeading',
342
+ 'modelPitch',
343
+ 'modelRoll',
344
+ 'baseUrl',
345
+ ].some((prop) => visibleProperties.has(prop))
270
346
  "
271
- no-gutters
272
- >
273
- <v-col>
274
- <VcsLabel>{{
275
- $t('components.vectorProperties.belowGround')
276
- }}</VcsLabel>
277
- </v-col>
278
- </v-row>
279
- <v-row v-if="visibleProperties.has('skirt')" no-gutters>
280
- <v-col>
281
- <VcsLabel
282
- html-for="vp-skirt"
283
- :class="{
284
- 'px-4':
285
- visibleProperties.has('storeysBelowGround') ||
286
- visibleProperties.has('storeyHeightsBelowGround'),
287
- }"
288
- >{{ $t('components.vectorProperties.skirt') }}</VcsLabel
289
- >
290
- </v-col>
291
- <v-col>
292
- <VcsTextField
293
- id="vp-skirt"
294
- v-model.number="skirt"
295
- :hide-spin-buttons="true"
296
- type="number"
297
- unit="m"
298
- :placeholder="'skirt' in value ? '0' : ''"
299
- clearable
300
- :rules="[
301
- (v) => v >= 0 || isNaN(v) || 'components.validation.notValid',
302
- ]"
303
- />
304
- </v-col>
305
- </v-row>
306
- <v-row v-if="visibleProperties.has('storeysBelowGround')" no-gutters>
307
- <v-col>
308
- <VcsLabel html-for="vp-storeys-below" class="px-4">{{
309
- $t('components.vectorProperties.storeys')
310
- }}</VcsLabel>
311
- </v-col>
312
- <v-col>
313
- <VcsTextField
314
- id="vp-storeys-below"
315
- v-model.number="storeysBelowGround"
316
- :hide-spin-buttons="true"
317
- type="number"
318
- :placeholder="'storeysBelowGround' in value ? '0' : ''"
319
- clearable
320
- :rules="[
321
- (v) => v >= 0 || isNaN(v) || 'components.validation.notValid',
322
- ]"
323
- />
324
- </v-col>
325
- </v-row>
326
- <v-row
327
- v-if="visibleProperties.has('storeyHeightsBelowGround')"
328
- no-gutters
329
- >
330
- <v-col>
331
- <VcsLabel :html-for="'vp-storey-heights-below'" class="px-4">{{
332
- $t('components.vectorProperties.storeyHeights')
333
- }}</VcsLabel>
334
- </v-col>
335
- <v-col>
336
- <VcsChipArrayInput
337
- :id="'vp-storey-heights-below'"
338
- dense
339
- column
340
- type="number"
341
- v-model="storeyHeights.storeyHeightsBelowGround.value"
342
- placeholder="3"
343
- />
344
- </v-col>
345
- </v-row>
346
- </v-container>
347
- <v-divider
348
- v-if="
349
- showDividers &&
350
- show3DProperties &&
351
- [
352
- 'modelUrl',
353
- 'modelScaleX',
354
- 'modelScaleY',
355
- 'modelScaleZ',
356
- 'modelHeading',
357
- 'modelPitch',
358
- 'modelRoll',
359
- 'baseUrl',
360
- ].some((prop) => visibleProperties.has(prop))
361
- "
362
- />
363
- <v-container class="px-1 py-0" v-if="show3DProperties">
364
- <v-row v-if="visibleProperties.has('modelUrl')" no-gutters>
365
- <v-col>
366
- <VcsLabel html-for="vp-model-url">
367
- {{ $t('components.vectorProperties.modelUrl') }}
368
- </VcsLabel>
369
- </v-col>
370
- <v-col>
371
- <VcsTextField
372
- id="vp-model-url"
373
- dense
374
- v-model="modelUrl"
375
- clearable
376
- :placeholder="'modelUrl' in value ? 'example.glb' : ''"
377
- />
378
- </v-col>
379
- </v-row>
380
- <v-row v-if="Object.keys(modelScale).length" no-gutters>
381
- <v-col cols="6">
382
- <VcsLabel>{{
383
- $t('components.vectorProperties.modelScale')
384
- }}</VcsLabel>
385
- </v-col>
386
- <v-col v-for="(dimension, key) in modelScale" :key="key">
387
- <VcsTextField
388
- v-model.number="dimension.value"
389
- :hide-spin-buttons="true"
390
- type="number"
391
- :placeholder="`modelScale${key}` in value ? '1' : ''"
392
- :prefix="key"
393
- :rules="[(v) => v > 0 || 'components.validation.notValid']"
394
- />
395
- </v-col>
396
- </v-row>
397
- <v-row v-if="visibleProperties.has('modelHeading')" no-gutters>
398
- <v-col cols="6">
399
- <VcsLabel>{{
400
- $t('components.vectorProperties.modelHeading')
401
- }}</VcsLabel>
402
- </v-col>
403
- <v-col>
404
- <VcsTextField
405
- v-model.number="modelHeading"
406
- :hide-spin-buttons="true"
407
- type="number"
408
- :placeholder="'modelHeading' in value ? '0' : ''"
409
- unit="°"
410
- clearable
411
- />
412
- </v-col>
413
- </v-row>
414
- <v-row v-if="visibleProperties.has('modelPitch')" no-gutters>
415
- <v-col cols="6">
416
- <VcsLabel>{{
417
- $t('components.vectorProperties.modelPitch')
418
- }}</VcsLabel>
419
- </v-col>
420
- <v-col>
421
- <VcsTextField
422
- v-model.number="modelPitch"
423
- :hide-spin-buttons="true"
424
- type="number"
425
- :placeholder="'modelPitch' in value ? '0' : ''"
426
- unit="°"
427
- clearable
428
- />
429
- </v-col>
430
- </v-row>
431
- <v-row v-if="visibleProperties.has('modelRoll')" no-gutters>
432
- <v-col cols="6">
433
- <VcsLabel>{{ $t('components.vectorProperties.modelRoll') }}</VcsLabel>
434
- </v-col>
435
- <v-col>
436
- <VcsTextField
437
- v-model.number="modelRoll"
438
- :hide-spin-buttons="true"
439
- type="number"
440
- :placeholder="'modelRoll' in value ? '0' : ''"
441
- unit="°"
442
- clearable
443
- />
444
- </v-col>
445
- </v-row>
446
- <v-row v-if="visibleProperties.has('baseUrl')" no-gutters>
447
- <v-col>
448
- <VcsLabel html-for="vp-base-url">{{
449
- $t('components.vectorProperties.baseUrl')
450
- }}</VcsLabel>
451
- </v-col>
452
- <v-col>
453
- <VcsTextField
454
- id="vp-base-url"
455
- dense
456
- clearable
457
- v-model="baseUrl"
458
- :placeholder="'baseUrl' in value ? 'path/to/files/' : ''"
459
- />
460
- </v-col>
461
- </v-row>
462
- </v-container>
347
+ />
348
+ <v-container class="px-1 py-0">
349
+ <v-row v-if="visibleProperties.has('modelUrl')" no-gutters>
350
+ <v-col>
351
+ <VcsLabel html-for="vp-model-url">
352
+ {{ $t('components.vectorProperties.modelUrl') }}
353
+ </VcsLabel>
354
+ </v-col>
355
+ <v-col>
356
+ <VcsTextField
357
+ id="vp-model-url"
358
+ v-model="localValue.modelUrl"
359
+ clearable
360
+ :placeholder="'modelUrl' in localValue ? 'example.glb' : ''"
361
+ />
362
+ </v-col>
363
+ </v-row>
364
+ <template v-if="Object.keys(modelScale).length">
365
+ <v-row no-gutters>
366
+ <v-col cols="6">
367
+ <VcsLabel>{{
368
+ $t('components.vectorProperties.modelScale')
369
+ }}</VcsLabel>
370
+ </v-col>
371
+ </v-row>
372
+ <v-row no-gutters class="pb-2">
373
+ <v-col v-for="(dimension, key) in modelScale" :key="key">
374
+ <VcsTextField
375
+ v-model.number="dimension.value"
376
+ :hide-spin-buttons="true"
377
+ type="number"
378
+ :placeholder="`modelScale${key}` in localValue ? '1' : ''"
379
+ :prefix="key"
380
+ :rules="[(v) => v > 0 || 'components.validation.notValid']"
381
+ />
382
+ </v-col>
383
+ </v-row>
384
+ </template>
385
+ <v-row v-if="visibleProperties.has('modelHeading')" no-gutters>
386
+ <v-col cols="6">
387
+ <VcsLabel>{{
388
+ $t('components.vectorProperties.modelHeading')
389
+ }}</VcsLabel>
390
+ </v-col>
391
+ <v-col>
392
+ <VcsTextField
393
+ v-model.number="localValue.modelHeading"
394
+ :hide-spin-buttons="true"
395
+ type="number"
396
+ :placeholder="'modelHeading' in localValue ? '0' : ''"
397
+ unit="°"
398
+ clearable
399
+ />
400
+ </v-col>
401
+ </v-row>
402
+ <v-row v-if="visibleProperties.has('modelPitch')" no-gutters>
403
+ <v-col cols="6">
404
+ <VcsLabel>{{
405
+ $t('components.vectorProperties.modelPitch')
406
+ }}</VcsLabel>
407
+ </v-col>
408
+ <v-col>
409
+ <VcsTextField
410
+ v-model.number="localValue.modelPitch"
411
+ :hide-spin-buttons="true"
412
+ type="number"
413
+ :placeholder="'modelPitch' in localValue ? '0' : ''"
414
+ unit="°"
415
+ clearable
416
+ />
417
+ </v-col>
418
+ </v-row>
419
+ <v-row v-if="visibleProperties.has('modelRoll')" no-gutters>
420
+ <v-col cols="6">
421
+ <VcsLabel>{{
422
+ $t('components.vectorProperties.modelRoll')
423
+ }}</VcsLabel>
424
+ </v-col>
425
+ <v-col>
426
+ <VcsTextField
427
+ v-model.number="localValue.modelRoll"
428
+ :hide-spin-buttons="true"
429
+ type="number"
430
+ :placeholder="'modelRoll' in localValue ? '0' : ''"
431
+ unit="°"
432
+ clearable
433
+ />
434
+ </v-col>
435
+ </v-row>
436
+ <v-row v-if="visibleProperties.has('baseUrl')" no-gutters>
437
+ <v-col>
438
+ <VcsLabel html-for="vp-base-url">{{
439
+ $t('components.vectorProperties.baseUrl')
440
+ }}</VcsLabel>
441
+ </v-col>
442
+ <v-col>
443
+ <VcsTextField
444
+ id="vp-base-url"
445
+ clearable
446
+ v-model="localValue.baseUrl"
447
+ :placeholder="'baseUrl' in localValue ? 'path/to/files/' : ''"
448
+ />
449
+ </v-col>
450
+ </v-row>
451
+ </v-container>
452
+ </template>
463
453
  </VcsFormSection>
464
454
  </template>
465
455
  <script>
466
456
  import { computed } from 'vue';
467
457
  import { VContainer, VRow, VCol, VDivider } from 'vuetify/components';
458
+ import { VectorProperties } from '@vcmap/core';
459
+ import {
460
+ useProxiedComplexModel,
461
+ useModelHasProperty,
462
+ } from '../modelHelper.js';
468
463
  import VcsFormSection from '../form-inputs-controls/VcsFormSection.vue';
469
464
  import VcsLabel from '../form-inputs-controls/VcsLabel.vue';
470
465
  import VcsTextField from '../form-inputs-controls/VcsTextField.vue';
471
466
  import VcsSelect from '../form-inputs-controls/VcsSelect.vue';
472
467
  import VcsCheckbox from '../form-inputs-controls/VcsCheckbox.vue';
473
- import {
474
- usePrimitiveProperty,
475
- useArrayProperty,
476
- useHasProperty,
477
- } from './composables.js';
478
468
  import VcsChipArrayInput from '../form-inputs-controls/VcsChipArrayInput.vue';
479
469
 
480
470
  export const genericVectorProperties = [
@@ -533,6 +523,7 @@
533
523
  */
534
524
  export default {
535
525
  name: 'VcsVectorPropertiesComponent',
526
+ methods: { computed },
536
527
  components: {
537
528
  VcsFormSection,
538
529
  VcsLabel,
@@ -548,7 +539,7 @@
548
539
  props: {
549
540
  modelValue: {
550
541
  type: Object,
551
- default: () => {},
542
+ default: () => VectorProperties.getDefaultOptions(),
552
543
  },
553
544
  valueDefault: {
554
545
  type: Object,
@@ -579,162 +570,99 @@
579
570
  default: true,
580
571
  },
581
572
  },
573
+ emits: ['update:modelValue'],
582
574
  setup(props, { emit }) {
575
+ /**
576
+ * @type {import("vue").Ref<import("vue").UnwrapRef<import("@vcmap/core").VectorProperties>>}
577
+ */
578
+ const localValue = useProxiedComplexModel(props, 'modelValue', emit);
579
+
583
580
  const visibleProperties = computed(() => {
584
581
  return new Set(props.properties);
585
582
  });
586
583
 
587
- const altitudeMode = usePrimitiveProperty(
588
- () => props.modelValue,
589
- 'altitudeMode',
590
- emit,
591
- );
592
-
593
584
  const availableAltitudeModes = computed(() => {
594
585
  const altitudeModes = [
595
586
  {
596
587
  value: 'clampToGround',
597
- text: 'components.vectorProperties.clampToGround',
588
+ title: 'components.vectorProperties.clampToGround',
598
589
  },
599
590
  {
600
591
  value: 'absolute',
601
- text: 'components.vectorProperties.absolute',
592
+ title: 'components.vectorProperties.absolute',
602
593
  },
603
594
  ];
604
595
 
605
596
  if (visibleProperties.value.has('heightAboveGround')) {
606
597
  altitudeModes.push({
607
598
  value: 'relativeToGround',
608
- text: 'components.vectorProperties.relativeToGround',
599
+ title: 'components.vectorProperties.relativeToGround',
609
600
  });
610
601
  }
611
602
 
612
603
  return altitudeModes;
613
604
  });
614
605
 
615
- const heightAboveGround = usePrimitiveProperty(
616
- () => props.modelValue,
617
- 'heightAboveGround',
618
- emit,
619
- );
620
- const allowPicking = computed({
621
- get() {
622
- return props.modelValue.allowPicking;
623
- },
624
- set(value) {
625
- if (props.modelValue.allowPicking !== value) {
626
- const newParams = structuredClone(props.modelValue);
627
- const changedParams = { allowPicking: value || false };
628
- emit('update:modelValue', Object.assign(newParams, changedParams));
629
- emit('propertyChange', changedParams);
630
- }
606
+ const availableClassificationTypes = [
607
+ { value: 'none', title: 'components.vectorProperties.none' },
608
+ { value: 'both', title: 'components.vectorProperties.both' },
609
+ {
610
+ value: 'cesium3DTile',
611
+ title: 'components.vectorProperties.cesium3DTile',
631
612
  },
632
- });
613
+ { value: 'terrain', title: 'components.vectorProperties.terrain' },
614
+ ];
615
+
633
616
  const classificationType = computed({
634
617
  get() {
635
- if ('classificationType' in props.modelValue) {
636
- return props.modelValue.classificationType || 'none';
618
+ if ('classificationType' in localValue.value) {
619
+ return localValue.value.classificationType || 'none';
637
620
  } else {
638
621
  return undefined;
639
622
  }
640
623
  },
641
624
  set(value) {
642
- if (props.modelValue.classificationType !== value) {
643
- const newParams = structuredClone(props.modelValue);
644
- const changedParams = {
645
- classificationType: value === 'none' ? undefined : value,
646
- };
647
- emit('update:modelValue', Object.assign(newParams, changedParams));
648
- emit('propertyChange', changedParams);
625
+ const v = value === 'none' ? undefined : value;
626
+ if (localValue.value.classificationType !== v) {
627
+ localValue.value.classificationType = v;
649
628
  }
650
629
  },
651
630
  });
652
- const scaleByDistance = useArrayProperty(
653
- () => props.modelValue,
654
- 'scaleByDistance',
655
- emit,
656
- 4,
657
- );
658
- const hasScaleByDistance = useHasProperty(
659
- () => props.modelValue,
631
+
632
+ const hasScaleByDistance = useModelHasProperty(
633
+ localValue,
660
634
  'scaleByDistance',
661
- emit,
662
635
  scaleByDistanceDefault,
663
636
  );
664
637
 
665
- const eyeOffset = useArrayProperty(
666
- () => props.modelValue,
638
+ const hasEyeOffset = useModelHasProperty(
639
+ localValue,
667
640
  'eyeOffset',
668
- emit,
669
- 3,
670
- );
671
- const hasEyeOffset = useHasProperty(
672
- () => props.modelValue,
673
- 'eyeOffset',
674
- emit,
675
641
  eyeOffsetDefault,
676
642
  );
677
643
 
678
- const groundLevel = usePrimitiveProperty(
679
- () => props.modelValue,
680
- 'groundLevel',
681
- emit,
682
- );
683
- const extrudedHeight = usePrimitiveProperty(
684
- () => props.modelValue,
685
- 'extrudedHeight',
686
- emit,
687
- );
688
- const skirt = usePrimitiveProperty(() => props.modelValue, 'skirt', emit);
689
- const storeysAboveGround = usePrimitiveProperty(
690
- () => props.modelValue,
691
- 'storeysAboveGround',
692
- emit,
693
- );
694
- const storeysBelowGround = usePrimitiveProperty(
695
- () => props.modelValue,
696
- 'storeysBelowGround',
697
- emit,
698
- );
699
-
700
644
  const storeyHeights = computed(() => {
701
645
  return ['storeyHeightsAboveGround', 'storeyHeightsBelowGround']
702
646
  .filter((key) => visibleProperties.value.has(key))
703
647
  .reduce((acc, key) => {
704
- return {
705
- ...acc,
706
- [key]: computed({
707
- get() {
708
- if (Array.isArray(props.modelValue?.[key])) {
709
- return props.modelValue?.[key];
710
- } else if (props.modelValue?.[key] > 0) {
711
- return [props.modelValue?.[key]];
712
- } else {
713
- return [];
714
- }
715
- },
716
- set(value) {
717
- const newParams = structuredClone(props.modelValue);
718
- const changedParams = {
719
- [key]: value,
720
- };
721
- emit(
722
- 'update:modelValue',
723
- Object.assign(newParams, changedParams),
724
- );
725
- emit('propertyChange', changedParams);
726
- },
727
- }),
728
- };
648
+ acc[key] = computed({
649
+ get() {
650
+ if (Array.isArray(localValue.value[key])) {
651
+ return localValue.value[key];
652
+ } else if (localValue.value[key] > 0) {
653
+ return [localValue.value[key]];
654
+ } else {
655
+ return [];
656
+ }
657
+ },
658
+ set(value) {
659
+ localValue.value[key] = value;
660
+ },
661
+ });
662
+ return acc;
729
663
  }, {});
730
664
  });
731
665
 
732
- const modelUrl = usePrimitiveProperty(
733
- () => props.modelValue,
734
- 'modelUrl',
735
- emit,
736
- );
737
-
738
666
  const modelScale = computed(() => {
739
667
  return dimensionsUpperCase
740
668
  .filter((dimension) =>
@@ -743,43 +671,18 @@
743
671
  .reduce((acc, dimension) => {
744
672
  return {
745
673
  ...acc,
746
- [dimension]: usePrimitiveProperty(
747
- () => props.modelValue,
748
- `modelScale${dimension}`,
749
- emit,
750
- ),
674
+ [dimension]: computed({
675
+ get() {
676
+ return localValue.value[`modelScale${dimension}`];
677
+ },
678
+ set(value) {
679
+ localValue.value[`modelScale${dimension}`] = value;
680
+ },
681
+ }),
751
682
  };
752
683
  }, {});
753
684
  });
754
685
 
755
- const modelHeading = usePrimitiveProperty(
756
- () => props.modelValue,
757
- 'modelHeading',
758
- emit,
759
- );
760
- const modelPitch = usePrimitiveProperty(
761
- () => props.modelValue,
762
- 'modelPitch',
763
- emit,
764
- );
765
- const modelRoll = usePrimitiveProperty(
766
- () => props.modelValue,
767
- 'modelRoll',
768
- emit,
769
- );
770
- const baseUrl = usePrimitiveProperty(
771
- () => props.modelValue,
772
- 'baseUrl',
773
- emit,
774
- );
775
-
776
- function reset() {
777
- const newParams = structuredClone(props.valueDefault);
778
-
779
- emit('update:modelValue', newParams);
780
- emit('propertyChange', newParams);
781
- }
782
-
783
686
  const headerActions = computed(() =>
784
687
  props.showReset
785
688
  ? [
@@ -788,7 +691,7 @@
788
691
  title: 'components.style.reset',
789
692
  icon: '$vcsReturn',
790
693
  callback: () => {
791
- reset();
694
+ localValue.value = props.valueDefault;
792
695
  },
793
696
  },
794
697
  ]
@@ -796,32 +699,18 @@
796
699
  );
797
700
 
798
701
  return {
702
+ localValue,
799
703
  headerActions,
800
704
  visibleProperties,
801
- altitudeMode,
802
705
  availableAltitudeModes,
803
- heightAboveGround,
804
- allowPicking,
706
+ availableClassificationTypes,
805
707
  classificationType,
806
- scaleByDistance,
807
708
  hasScaleByDistance,
808
709
  scaleByDistanceDefault,
809
- eyeOffset,
810
710
  hasEyeOffset,
811
711
  eyeOffsetDefault,
812
- groundLevel,
813
- extrudedHeight,
814
- skirt,
815
- storeysAboveGround,
816
- storeysBelowGround,
817
712
  storeyHeights,
818
- modelUrl,
819
713
  modelScale,
820
- modelHeading,
821
- modelPitch,
822
- modelRoll,
823
- baseUrl,
824
- reset,
825
714
  dimensionsUpperCase,
826
715
  };
827
716
  },