@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
@@ -1,26 +1,25 @@
1
1
  <template>
2
- <div class="d-contents">
2
+ <div class="d-contents vcs-list">
3
3
  <vcs-treeview-searchbar
4
4
  v-if="searchable"
5
5
  :placeholder="searchbarPlaceholder"
6
6
  v-model="query"
7
7
  />
8
- <v-list density="compact">
9
- <v-list-item v-if="showTitle" class="font-weight-bold">
8
+ <v-list :class="{ 'vcs-list__selectable': selectable }">
9
+ <v-list-item v-if="showTitle && title">
10
10
  <template #prepend>
11
11
  <v-icon v-if="icon">
12
12
  {{ icon }}
13
13
  </v-icon>
14
14
  </template>
15
- <v-list-item-title>
16
- <VcsTooltip :tooltip="$st(listHeaderTooltip)">
17
- <template #activator="{ props }">
18
- <span v-bind="props" ref="listHeader">
19
- {{ $st(title) }}
20
- </span>
21
- </template>
22
- </VcsTooltip>
23
- <span v-if="selectable && selected.length > 0">
15
+ <v-list-item-title class="font-weight-bold" ref="listHeader">
16
+ <span :class="{ 'vcs-list-title__selected': selected.length > 0 }">
17
+ {{ $st(title) }}
18
+ </span>
19
+ <v-tooltip v-if="listHeaderTooltip" activator="parent">
20
+ {{ $st(listHeaderTooltip) }}
21
+ </v-tooltip>
22
+ <span v-if="selectable && selected.length > 0" class="ml-1">
24
23
  {{ `(${selected.length})` }}
25
24
  </span>
26
25
  </v-list-item-title>
@@ -32,90 +31,49 @@
32
31
  />
33
32
  </template>
34
33
  </v-list-item>
35
- <div v-for="(item, index) in renderingItems" :key="`item-${index}`">
36
- <v-list-item
34
+ <template v-for="(item, index) in renderingItems">
35
+ <VcsListItem
36
+ v-if="item"
37
+ :dragging="dragging === index"
38
+ :item="item"
39
+ :key="`item-${index}`"
37
40
  :active="selected.includes(item)"
38
- :disabled="item.disabled"
39
41
  @mousedown.shift="$event.preventDefault()"
40
42
  @mouseover="hovering = index"
41
43
  @mouseout="hovering = undefined"
42
44
  :draggable="isDraggable"
43
45
  @dragstart="drag($event, item, index)"
44
46
  @mouseup="drop($event, index)"
45
- color="primary"
46
47
  :class="{
47
48
  'v-list-item__selected': selected.includes(item),
48
49
  'v-list-item__lighten_even': lightenEven,
49
50
  'v-list-item__lighten_odd': !lightenEven,
50
51
  'vcs-draggable-item': isDraggable,
51
52
  'v-list-item__dragged': dragging === index,
53
+ 'v-list-item__dragged_over': dragging !== undefined,
52
54
  'border-bottom': borderBottom(index),
53
55
  'border-top': borderTop(index),
54
56
  'cursor-pointer': selectable && !isDraggable,
55
57
  }"
56
58
  @click="select(item, $event)"
59
+ @item-renamed="$emit('item-renamed', $event)"
57
60
  >
58
- <template #prepend>
59
- <v-icon v-if="item.icon">
60
- {{ item.icon }}
61
- </v-icon>
61
+ <template #prepend-title>
62
+ <slot name="item.prepend-title" :item="item" :index="index" />
63
+ </template>
64
+ <template #title>
65
+ <slot name="item.title" :item="item" :index="index"></slot>
62
66
  </template>
63
- <VcsTooltip
64
- :tooltip="
65
- dragging !== undefined
66
- ? undefined
67
- : $st(item.tooltip || overflowTitle(index, item.title))
68
- "
69
- >
70
- <template #activator="{ props }">
71
- <v-list-item-title
72
- v-bind="props"
73
- ref="titles"
74
- class="d-flex gc-2"
75
- >
76
- <slot name="item.prepend-title" :item="item" :index="index" />
77
- <slot name="item.title" :item="item" :index="index">
78
- <VcsTextField
79
- v-if="item.rename"
80
- :model-value="item.title"
81
- autofocus
82
- :no-padding="true"
83
- @update:model-value="(value) => rename(item, value)"
84
- @click.stop
85
- @keydown.enter="item.rename = false"
86
- @blur="item.rename = false"
87
- :rules="[(v) => !!v || 'components.validation.required']"
88
- />
89
- <span v-else>
90
- {{ $st(item.title) }}
91
- </span>
92
- </slot>
93
- <slot
94
- name="item.append-title"
95
- :item="item"
96
- :index="index"
97
- class="ml-auto"
98
- />
99
- </v-list-item-title>
100
- </template>
101
- </VcsTooltip>
102
- <template #append>
103
- <VcsBadge v-if="item.hasUpdate" :color="'warning'" />
104
- <vcs-action-button-list
105
- v-if="item.actions?.length > 0"
106
- :actions="item.actions"
107
- :disabled="item.disabled"
108
- :block-overflow="true"
109
- :overflow-count="actionButtonListOverflowCount"
110
- />
67
+ <template #append-title>
68
+ <slot name="item.append-title" :item="item" :index="index" />
111
69
  </template>
112
- </v-list-item>
70
+ </VcsListItem>
113
71
  <slot name="item.intermediate" :item="item" :index="index" />
114
72
  <div
115
73
  v-if="hasIntermediateSlot"
116
74
  :key="`item-intermediate-child-balance-${index}`"
117
75
  />
118
- </div>
76
+ </template>
119
77
  </v-list>
120
78
  </div>
121
79
  </template>
@@ -130,12 +88,17 @@
130
88
  shallowRef,
131
89
  watch,
132
90
  } from 'vue';
133
- import { VList, VListItem, VIcon, VListItemTitle } from 'vuetify/components';
91
+ import {
92
+ VList,
93
+ VListItem,
94
+ VIcon,
95
+ VListItemTitle,
96
+ VTooltip,
97
+ } from 'vuetify/components';
134
98
  import VcsActionButtonList from '../buttons/VcsActionButtonList.vue';
135
- import VcsTooltip from '../notification/VcsTooltip.vue';
136
99
  import VcsTreeviewSearchbar from './VcsTreeviewSearchbar.vue';
137
- import VcsBadge from '../notification/VcsBadge.vue';
138
- import VcsTextField from '../form-inputs-controls/VcsTextField.vue';
100
+ import VcsListItem from './VcsListItem.vue';
101
+ import { createEllipseTooltip } from '../composables.js';
139
102
 
140
103
  /**
141
104
  * @param {import("vue").Ref<VcsListItem[]>} items
@@ -181,7 +144,7 @@
181
144
  * @property {string} name
182
145
  * @property {boolean} [visible] - Whether to display this item or not.
183
146
  * @property {boolean} [disabled] - Whether this item should be displayed as disabled.
184
- * @property {boolean} [rename] - Whether the title of this item is currently in edit mode.
147
+ * @property {boolean} [rename] - Whether the title of can be edited. will add a rename action to the end of the action list
185
148
  * @property {string} title - The title to be displayed
186
149
  * @property {string} [tooltip]
187
150
  * @property {string|HTMLCanvasElement|HTMLImageElement|undefined} [icon] - An optional icon to display with this item. Can be a URL or HTMLElement.
@@ -239,15 +202,14 @@
239
202
  export default {
240
203
  name: 'VcsList',
241
204
  components: {
242
- VcsBadge,
205
+ VcsListItem,
243
206
  VcsTreeviewSearchbar,
244
207
  VcsActionButtonList,
245
- VcsTooltip,
208
+ VTooltip,
246
209
  VList,
247
210
  VListItem,
248
211
  VIcon,
249
212
  VListItemTitle,
250
- VcsTextField,
251
213
  },
252
214
  props: {
253
215
  items: {
@@ -335,8 +297,7 @@
335
297
  return !(!props.searchable && !props.showTitle);
336
298
  });
337
299
  let firstSelected = null;
338
- const titles = ref([]);
339
- const listHeader = ref(null);
300
+ const listHeader = ref();
340
301
 
341
302
  watch(
342
303
  props,
@@ -383,7 +344,7 @@
383
344
  let draggedItem = null;
384
345
 
385
346
  const isDraggable = computed(() => {
386
- return query.value === '' && props.draggable;
347
+ return !query.value && props.draggable;
387
348
  });
388
349
 
389
350
  /**
@@ -587,31 +548,12 @@
587
548
  },
588
549
  drag,
589
550
  drop,
590
- titles,
591
- overflowTitle(index, alternative) {
592
- const elem = titles.value[index];
593
- if (elem && elem.offsetWidth < elem.scrollWidth) {
594
- return alternative;
595
- }
596
- return '';
597
- },
598
551
  listHeader,
599
- listHeaderTooltip: computed(() => {
600
- if (props.tooltip) {
601
- return props.tooltip;
602
- }
603
- const elem = listHeader.value;
604
- if (elem && elem.offsetWidth < elem.scrollWidth) {
605
- return props.title;
606
- }
607
- return '';
608
- }),
609
- rename(item, newTitle) {
610
- if (newTitle) {
611
- emit('item-renamed', { item, newTitle });
612
- item.titleChanged?.(newTitle);
613
- }
614
- },
552
+ listHeaderTooltip: createEllipseTooltip(
553
+ computed(() => listHeader.value?.$el),
554
+ computed(() => props.tooltip),
555
+ computed(() => props.title),
556
+ ),
615
557
  hasIntermediateSlot: computed(() => !!slots['item.intermediate']),
616
558
  };
617
559
  },
@@ -620,67 +562,56 @@
620
562
 
621
563
  <style lang="scss" scoped>
622
564
  :deep(.v-list) {
623
- .v-list-item__lighten_even {
624
- &:nth-child(even) {
625
- background-color: var(--v-base-lighten4);
626
- }
565
+ .v-list-item__lighten_even:nth-child(even) {
566
+ background-color: rgb(var(--v-theme-base-lighten-4));
627
567
  }
628
- .v-list-item__lighten_odd {
629
- &:nth-child(odd) {
630
- background-color: var(--v-base-lighten4);
631
- }
568
+ .v-list-item__lighten_odd:nth-child(odd) {
569
+ background-color: rgb(var(--v-theme-base-lighten-4));
632
570
  }
633
571
  .v-list-item__dragged {
634
- background-color: var(--v-base-lighten2) !important;
572
+ background-color: rgb(var(--v-theme-base-lighten-2)) !important;
573
+ }
574
+ .v-list-item__dragged_over:hover {
575
+ background-color: rgb(var(--v-theme-base-lighten-1)) !important;
635
576
  }
636
577
  .v-list-item__selected {
637
578
  border-left: solid 4px;
638
- border-left-color: var(--v-primary-base);
639
- padding-left: 12px !important;
579
+ border-left-color: rgb(var(--v-theme-primary));
580
+ padding-left: 13px !important;
581
+ }
582
+ .v-list-item--active {
583
+ .v-list-item__append {
584
+ color: rgb(var(--v-theme-on-surface));
585
+ }
640
586
  }
641
587
  .v-list-item {
642
- padding: 4px 8px 4px 16px;
643
588
  &.vcs-draggable-item:hover {
644
589
  cursor: grab;
645
590
  user-select: none;
646
591
  }
647
- &.border-bottom {
648
- border-bottom: solid;
649
- border-bottom-color: var(--v-base-lighten2);
650
- }
651
- &.border-top {
652
- border-top: solid;
653
- border-top-color: var(--v-base-lighten2);
654
- }
655
- &:after {
656
- display: none;
657
- }
658
- &.font-weight-bold {
659
- .v-list-item__title {
660
- font-weight: 700;
592
+ &:hover {
593
+ .v-list-item__overlay {
594
+ background-color: rgb(var(--v-theme-base));
661
595
  }
662
596
  }
663
- .v-list-item__action {
664
- .v-icon {
665
- font-size: 16px;
666
- }
667
- &:last-child {
668
- min-width: auto;
669
- }
597
+ .vcs-list-title__selected {
598
+ width: 90%;
599
+ display: inline-block;
600
+ overflow: hidden;
601
+ text-overflow: ellipsis;
602
+ vertical-align: bottom;
670
603
  }
671
- .v-list-item__content {
672
- flex-wrap: nowrap;
673
- column-gap: 4px;
674
- .v-icon,
675
- .action-btn-wrap {
676
- flex: 1 1 auto;
677
- }
678
- .v-icon {
679
- font-size: 16px;
680
- .v-icon__component {
681
- width: 16px;
682
- height: 16px;
683
- }
604
+ }
605
+
606
+ &:not(.vcs-list__selectable) {
607
+ .v-list-item--link {
608
+ cursor: auto;
609
+ }
610
+ cursor: auto;
611
+
612
+ &:hover {
613
+ .v-list-item__overlay {
614
+ background-color: transparent;
684
615
  }
685
616
  }
686
617
  }
@@ -97,11 +97,8 @@ declare const _default: import("vue").DefineComponent<{
97
97
  clear(): void;
98
98
  drag: (e: MouseEvent, item: VcsListItem, index: number) => void;
99
99
  drop: (e: MouseEvent, targetIndex: number) => void;
100
- titles: import("vue").Ref<never[]>;
101
- overflowTitle(index: any, alternative: any): any;
102
- listHeader: import("vue").Ref<null>;
100
+ listHeader: import("vue").Ref<any>;
103
101
  listHeaderTooltip: import("vue").ComputedRef<string>;
104
- rename(item: any, newTitle: any): void;
105
102
  hasIntermediateSlot: import("vue").ComputedRef<boolean>;
106
103
  }, any, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
107
104
  items: {
@@ -163,17 +160,17 @@ declare const _default: import("vue").DefineComponent<{
163
160
  };
164
161
  }>>, {
165
162
  title: string;
166
- modelValue: unknown[];
167
- tooltip: string;
168
163
  icon: string;
164
+ modelValue: unknown[];
169
165
  draggable: boolean;
166
+ tooltip: string;
170
167
  selectable: boolean;
171
168
  actions: unknown[];
172
169
  searchbarPlaceholder: string;
170
+ actionButtonListOverflowCount: number;
173
171
  singleSelect: boolean;
174
172
  searchable: boolean;
175
173
  showTitle: boolean;
176
- actionButtonListOverflowCount: number;
177
174
  }, {}>;
178
175
  export default _default;
179
176
  export type VcsListItem = {
@@ -187,7 +184,7 @@ export type VcsListItem = {
187
184
  */
188
185
  disabled?: boolean | undefined;
189
186
  /**
190
- * - Whether the title of this item is currently in edit mode.
187
+ * - Whether the title of can be edited. will add a rename action to the end of the action list
191
188
  */
192
189
  rename?: boolean | undefined;
193
190
  /**
@@ -0,0 +1,154 @@
1
+ <script setup>
2
+ import {
3
+ VListItem,
4
+ VIcon,
5
+ VListItemTitle,
6
+ VTooltip,
7
+ } from 'vuetify/components';
8
+ import { computed, ref } from 'vue';
9
+ import VcsBadge from '../notification/VcsBadge.vue';
10
+ import VcsActionButtonList from '../buttons/VcsActionButtonList.vue';
11
+ import VcsTextField from '../form-inputs-controls/VcsTextField.vue';
12
+ import { createEllipseTooltip } from '../composables.js';
13
+
14
+ const props = defineProps({
15
+ /** @type {import("./VcsList.vue").VcsListItem} */
16
+ item: {
17
+ type: Object,
18
+ required: true,
19
+ },
20
+ actionButtonListOverflowCount: {
21
+ type: Number,
22
+ default: undefined,
23
+ },
24
+ dragging: {
25
+ type: Boolean,
26
+ default: false,
27
+ },
28
+ });
29
+
30
+ const emits = defineEmits(['item-renamed']);
31
+
32
+ function renameOff() {
33
+ // eslint-disable-next-line vue/no-mutating-props
34
+ props.item.rename = false;
35
+ }
36
+
37
+ const title = ref();
38
+ const tooltip = createEllipseTooltip(
39
+ computed(() => {
40
+ if (props.item?.rename) {
41
+ return undefined;
42
+ }
43
+ return title.value?.$el;
44
+ }),
45
+ computed(() => props.item?.tooltip),
46
+ computed(() => props.item?.title),
47
+ );
48
+
49
+ function rename(item, newTitle) {
50
+ if (newTitle) {
51
+ emits('item-renamed', { item, newTitle });
52
+ item.titleChanged?.(newTitle);
53
+ }
54
+ }
55
+ </script>
56
+
57
+ <template>
58
+ <v-list-item :disabled="item.disabled" v-bind="$attrs">
59
+ <template #prepend>
60
+ <v-icon v-if="item.icon">
61
+ {{ item.icon }}
62
+ </v-icon>
63
+ </template>
64
+ <template #default>
65
+ <v-list-item-title ref="title">
66
+ <slot name="prepend-title" :item="item" />
67
+ <slot name="title" :item="item">
68
+ <vcs-text-field
69
+ v-if="item.rename"
70
+ :model-value="item.title"
71
+ autofocus
72
+ @update:model-value="(value) => rename(item, value)"
73
+ @click.stop
74
+ @keydown.enter="renameOff"
75
+ @blur="renameOff"
76
+ :rules="[(v) => !!v || 'components.validation.required']"
77
+ class="pa-0"
78
+ />
79
+ <template v-else>
80
+ {{ $st(item.title) }}
81
+ </template>
82
+ </slot>
83
+ <slot name="append-title" :item="item" class="ml-auto" />
84
+ <v-tooltip v-if="dragging === false && tooltip" activator="parent">
85
+ {{ $st(tooltip) }}
86
+ </v-tooltip>
87
+ </v-list-item-title>
88
+ </template>
89
+ <template #append>
90
+ <vcs-badge v-if="item.hasUpdate" class="mr-1" />
91
+ <vcs-action-button-list
92
+ v-if="item.actions?.length > 0"
93
+ :actions="item.actions"
94
+ :disabled="item.disabled"
95
+ :block-overflow="true"
96
+ :overflow-count="actionButtonListOverflowCount"
97
+ class="ml-2"
98
+ />
99
+ </template>
100
+ </v-list-item>
101
+ </template>
102
+
103
+ <style lang="scss" scoped>
104
+ .v-list-item {
105
+ padding: 4px 8px 4px 16px;
106
+ &.border-bottom {
107
+ border-bottom: solid;
108
+ border-bottom-color: rgb(var(--v-theme-base-lighten-2));
109
+ }
110
+ &.border-top {
111
+ border-top: solid;
112
+ border-top-color: rgb(var(--v-theme-base-lighten-2));
113
+ }
114
+ &:after {
115
+ display: none;
116
+ }
117
+ &.font-weight-bold {
118
+ .v-list-item__title {
119
+ font-weight: 700;
120
+ }
121
+ }
122
+ :deep(.v-list-item__action) {
123
+ .v-icon {
124
+ font-size: 16px;
125
+ }
126
+ &:last-child {
127
+ min-width: auto;
128
+ }
129
+ }
130
+ :deep(.v-list-item__content) {
131
+ flex-wrap: nowrap;
132
+ column-gap: 4px;
133
+ .v-icon,
134
+ .action-btn-wrap {
135
+ flex: 1 1 auto;
136
+ }
137
+ .v-icon {
138
+ font-size: 16px;
139
+ .v-icon__component {
140
+ width: 16px;
141
+ height: 16px;
142
+ }
143
+ }
144
+ }
145
+ :deep(.v-list-item__prepend > .v-badge ~ .v-list-item__spacer),
146
+ :deep(.v-list-item__prepend > .v-icon ~ .v-list-item__spacer),
147
+ :deep(.v-list-item__prepend > .v-tooltip ~ .v-list-item__spacer) {
148
+ width: 8px;
149
+ }
150
+ :deep(.v-list-item__overlay) {
151
+ background-color: transparent;
152
+ }
153
+ }
154
+ </style>
@@ -0,0 +1,21 @@
1
+ declare const _default: __VLS_WithTemplateSlots<import("vue").DefineComponent<{}, {
2
+ $emit: (event: "item-renamed", ...args: any[]) => void;
3
+ $props: {
4
+ readonly [x: string]: any;
5
+ };
6
+ }, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{}>>, {}, {}>, {
7
+ "prepend-title"?(_: {
8
+ item: any;
9
+ }): any;
10
+ title?(_: {
11
+ item: any;
12
+ }): any;
13
+ "append-title"?(_: {
14
+ item: any;
15
+ class: string;
16
+ }): any;
17
+ }>;
18
+ export default _default;
19
+ type __VLS_WithTemplateSlots<T, S> = T & (new () => {
20
+ $slots: S;
21
+ });
@@ -65,8 +65,8 @@
65
65
  </div>
66
66
  <v-tooltip
67
67
  activator="parent"
68
- :text="tooltip"
69
68
  v-if="tooltip"
69
+ :text="$st(tooltip)"
70
70
  location="bottom"
71
71
  />
72
72
  <template #append>
@@ -23,3 +23,14 @@ export function useProxiedAtomicModel<T>(props: Object, prop: string, emit: (eve
23
23
  * @template T
24
24
  */
25
25
  export function useProxiedComplexModel<T>(props: Object, prop: string, emit: (event: string, value: T) => void): import("vue").Ref<import("vue").UnwrapRef<T>>;
26
+ /**
27
+ * Helper function that returns a modelValue for VcsCheckbox depending on the availability of a specific property within a model object
28
+ * Getter returns true, if property is available, otherwise false.
29
+ * Setter applies provided defaultValue on the model object, if checked (true) and undefined, if unchecked (false)
30
+ * @param {import("vue").Ref<Object>} localValue The model object, e.g. provided by `useProxiedComplexModel` or a local ref object.
31
+ * @param {string} key The key of the localValue that should be return on get and updated on set.
32
+ * @param {D} defaultValue The default value that is set on checked (true)
33
+ * @returns {import('vue').WritableComputedRef<boolean>}
34
+ * @template D
35
+ */
36
+ export function useModelHasProperty<D>(localValue: import("vue").Ref<Object>, key: string, defaultValue: D): import('vue').WritableComputedRef<boolean>;
@@ -1,5 +1,6 @@
1
1
  import { computed, ref, toRaw, watch } from 'vue';
2
2
  import deepEqual from 'fast-deep-equal';
3
+ import { getLogger } from '@vcsuite/logger';
3
4
 
4
5
  /**
5
6
  * Can only be used in setup of Vue components!
@@ -59,7 +60,14 @@ export function useProxiedComplexModel(props, prop, emit) {
59
60
  if (deepEqual(internal.value, newValue)) {
60
61
  return;
61
62
  }
62
- internal.value = structuredClone(newValue);
63
+ try {
64
+ internal.value = structuredClone(newValue);
65
+ } catch (e) {
66
+ getLogger('modelHelper').error(
67
+ 'Failed to update internal value. You may have a provided a deeply nested ref, which caused',
68
+ e,
69
+ );
70
+ }
63
71
  },
64
72
  {
65
73
  deep: true,
@@ -77,7 +85,14 @@ export function useProxiedComplexModel(props, prop, emit) {
77
85
  if (deepEqual(value, newValue)) {
78
86
  return;
79
87
  }
80
- emit(`update:${prop}`, structuredClone(newValue));
88
+ try {
89
+ emit(`update:${prop}`, structuredClone(newValue));
90
+ } catch (e) {
91
+ getLogger('modelHelper').error(
92
+ 'Failed to emit value. You may have a provided a deeply nested ref, which caused',
93
+ e,
94
+ );
95
+ }
81
96
  },
82
97
  {
83
98
  deep: true,
@@ -86,3 +101,28 @@ export function useProxiedComplexModel(props, prop, emit) {
86
101
 
87
102
  return internal;
88
103
  }
104
+
105
+ /**
106
+ * Helper function that returns a modelValue for VcsCheckbox depending on the availability of a specific property within a model object
107
+ * Getter returns true, if property is available, otherwise false.
108
+ * Setter applies provided defaultValue on the model object, if checked (true) and undefined, if unchecked (false)
109
+ * @param {import("vue").Ref<Object>} localValue The model object, e.g. provided by `useProxiedComplexModel` or a local ref object.
110
+ * @param {string} key The key of the localValue that should be return on get and updated on set.
111
+ * @param {D} defaultValue The default value that is set on checked (true)
112
+ * @returns {import('vue').WritableComputedRef<boolean>}
113
+ * @template D
114
+ */
115
+ export function useModelHasProperty(localValue, key, defaultValue) {
116
+ const model = () => localValue.value;
117
+ return computed({
118
+ get() {
119
+ return model()[key] !== undefined;
120
+ },
121
+ set(value) {
122
+ const v = value ? defaultValue : undefined;
123
+ if (localValue.value[key] !== v) {
124
+ localValue.value[key] = v;
125
+ }
126
+ },
127
+ });
128
+ }