@vcmap/ui 6.1.0-rc.1 → 6.1.0-rc.3

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 (128) hide show
  1. package/config/base.config.json +6 -0
  2. package/config/clipping.config.json +384 -0
  3. package/config/cluster.config.json +106 -0
  4. package/config/concepts-show-case.config.json +4 -0
  5. package/config/projects.config.json +5 -2
  6. package/dist/assets/{cesium-11e5bbc6.js → cesium-87d5e72d.js} +438 -432
  7. package/dist/assets/cesium.js +1 -1
  8. package/dist/assets/{core-9d0cfec3.js → core-72f9f393.js} +4907 -4514
  9. package/dist/assets/core.js +1 -1
  10. package/dist/assets/{ol-0d0ebb27.js → ol-e468ba43.js} +23518 -22404
  11. package/dist/assets/ol.js +1 -1
  12. package/dist/assets/ui-73257b15.css +1 -0
  13. package/dist/assets/{ui-08446666.js → ui-73257b15.js} +13703 -12977
  14. package/dist/assets/ui.js +1 -1
  15. package/dist/assets/vue.js +1 -1
  16. package/dist/assets/{vuetify-67025c41.css → vuetify-2437380c.css} +2 -2
  17. package/dist/assets/{vuetify-67025c41.js → vuetify-2437380c.js} +8024 -7634
  18. package/dist/assets/vuetify.js +1 -1
  19. package/index.d.ts +40 -19
  20. package/index.js +36 -6
  21. package/lib/olLib.js +25 -3
  22. package/package.json +6 -6
  23. package/plugins/@vcmap-show-case/callback-tester/README.md +3 -0
  24. package/plugins/@vcmap-show-case/callback-tester/package.json +5 -0
  25. package/plugins/@vcmap-show-case/callback-tester/src/CallbackTester.vue +62 -0
  26. package/plugins/@vcmap-show-case/callback-tester/src/index.js +48 -0
  27. package/plugins/@vcmap-show-case/form-inputs-example/src/FormInputsExample.vue +1 -0
  28. package/src/actions/actionHelper.d.ts +1 -0
  29. package/src/actions/actionHelper.js +70 -19
  30. package/src/application/VcsApp.vue +83 -50
  31. package/src/application/VcsApp.vue.d.ts +28 -2
  32. package/src/application/VcsContainer.vue +5 -3
  33. package/src/application/VcsContainer.vue.d.ts +14 -0
  34. package/src/application/VcsNavbar.vue +10 -6
  35. package/src/application/VcsNavbar.vue.d.ts +2 -0
  36. package/src/application/VcsObliqueFooter.vue +9 -3
  37. package/src/application/VcsSplashScreen.vue +37 -0
  38. package/src/application/VcsSplashScreen.vue.d.ts +6 -0
  39. package/src/application/positionDisplayInteraction.js +1 -1
  40. package/src/callback/activateClippingPolygonCallback.d.ts +29 -0
  41. package/src/callback/activateClippingPolygonCallback.js +54 -0
  42. package/src/callback/closeSplashScreenCallback.d.ts +8 -0
  43. package/src/callback/closeSplashScreenCallback.js +33 -0
  44. package/src/callback/deactivateClippingPolygonCallback.d.ts +29 -0
  45. package/src/callback/deactivateClippingPolygonCallback.js +54 -0
  46. package/src/callback/openSplashScreenCallback.d.ts +8 -0
  47. package/src/callback/openSplashScreenCallback.js +35 -0
  48. package/src/callback/toggleNavbarButtonCallback.d.ts +36 -0
  49. package/src/callback/toggleNavbarButtonCallback.js +62 -0
  50. package/src/components/buttons/VcsActionButtonList.vue +6 -4
  51. package/src/components/buttons/VcsToolButton.vue +0 -1
  52. package/src/components/form-inputs-controls/VcsDatePicker.vue +7 -1
  53. package/src/components/form-inputs-controls/VcsDatePicker.vue.d.ts +9 -0
  54. package/src/components/form-inputs-controls/VcsSelect.vue +1 -1
  55. package/src/components/form-inputs-controls/VcsTextArea.vue +13 -8
  56. package/src/components/form-output/markdownHelper.d.ts +0 -25
  57. package/src/components/form-output/markdownHelper.js +1 -386
  58. package/src/components/import/VcsImportComponent.vue +2 -0
  59. package/src/components/lists/VcsGroupedList.vue +178 -0
  60. package/src/components/lists/VcsGroupedList.vue.d.ts +17 -0
  61. package/src/components/lists/VcsList.vue +144 -394
  62. package/src/components/lists/VcsList.vue.d.ts +38 -159
  63. package/src/components/lists/VcsTreeNode.vue +18 -11
  64. package/src/components/lists/VcsTreeview.vue +27 -20
  65. package/src/components/lists/VcsTreeview.vue.d.ts +18 -1
  66. package/src/components/lists/listHelper.d.ts +87 -0
  67. package/src/components/lists/listHelper.js +348 -0
  68. package/src/components/section/VcsFormSection.vue +7 -2
  69. package/src/components/section/VcsFormSection.vue.d.ts +9 -0
  70. package/src/components/tables/VcsDataTable.vue +14 -3
  71. package/src/components/tables/VcsDataTable.vue.d.ts +9 -0
  72. package/src/components/vector-properties/VcsVectorPropertiesComponent.vue.d.ts +1 -1
  73. package/src/contentTree/LayerTree.vue +2 -1
  74. package/src/contentTree/LayerTree.vue.d.ts +2 -0
  75. package/src/contentTree/contentTreeCollection.d.ts +1 -0
  76. package/src/contentTree/contentTreeCollection.js +7 -3
  77. package/src/contentTree/contentTreeItem.js +4 -2
  78. package/src/contentTree/groupContentTreeItem.js +5 -3
  79. package/src/featureInfo/ClusterFeatureComponent.vue +58 -0
  80. package/src/featureInfo/ClusterFeatureComponent.vue.d.ts +6 -0
  81. package/src/featureInfo/abstractFeatureInfoView.js +1 -2
  82. package/src/featureInfo/featureInfo.d.ts +87 -1
  83. package/src/featureInfo/featureInfo.js +342 -34
  84. package/src/featureInfo/featureInfoInteraction.js +18 -3
  85. package/src/featureInfo/iframeFeatureInfoView.js +1 -1
  86. package/src/featureInfo/markdownBalloonFeatureInfoView.js +2 -4
  87. package/src/featureInfo/markdownFeatureInfoView.js +1 -1
  88. package/src/i18n/de.d.ts +17 -4
  89. package/src/i18n/de.js +7 -0
  90. package/src/i18n/en.d.ts +17 -4
  91. package/src/i18n/en.js +7 -0
  92. package/src/legend/VcsLegend.vue +1 -1
  93. package/src/legend/legendHelper.d.ts +1 -1
  94. package/src/legend/legendHelper.js +52 -9
  95. package/src/localStorage.d.ts +21 -0
  96. package/src/localStorage.js +51 -0
  97. package/src/manager/collectionManager/CollectionComponent.vue +1 -1
  98. package/src/manager/collectionManager/CollectionComponentContent.vue +2 -3
  99. package/src/manager/collectionManager/CollectionComponentList.vue +2 -3
  100. package/src/manager/collectionManager/CollectionComponentStandalone.vue +1 -1
  101. package/src/manager/navbarManager.js +9 -4
  102. package/src/manager/toolbox/ToolboxManagerComponent.vue +14 -12
  103. package/src/manager/toolbox/ToolboxManagerComponent.vue.d.ts +13 -2
  104. package/src/manager/toolbox/toolboxManager.d.ts +5 -0
  105. package/src/manager/toolbox/toolboxManager.js +7 -1
  106. package/src/manager/window/WindowComponent.vue +10 -0
  107. package/src/manager/window/WindowComponent.vue.d.ts +1 -0
  108. package/src/manager/window/WindowManager.vue +14 -4
  109. package/src/manager/window/WindowManager.vue.d.ts +1 -0
  110. package/src/manager/window/windowHelper.d.ts +7 -3
  111. package/src/manager/window/windowHelper.js +30 -10
  112. package/src/navigation/MapNavigation.vue +5 -5
  113. package/src/navigation/MapNavigation.vue.d.ts +1 -1
  114. package/src/navigation/overviewMap.d.ts +7 -0
  115. package/src/navigation/overviewMap.js +18 -4
  116. package/src/pluginHelper.d.ts +7 -0
  117. package/src/pluginHelper.js +18 -4
  118. package/src/search/ResultItem.vue.d.ts +1 -1
  119. package/src/search/markText.d.ts +1 -1
  120. package/src/search/markText.js +4 -4
  121. package/src/search/search.js +1 -1
  122. package/src/state.d.ts +4 -2
  123. package/src/state.js +54 -31
  124. package/src/uiConfig.d.ts +36 -0
  125. package/src/uiConfig.js +17 -1
  126. package/src/vcsUiApp.js +7 -11
  127. package/dist/assets/ui-08446666.css +0 -1
  128. /package/dist/assets/{vue-2f81c7f8.js → vue-ff37ea23.js} +0 -0
@@ -40,7 +40,7 @@
40
40
  :active="selected.includes(item)"
41
41
  @mousedown.shift="$event.preventDefault()"
42
42
  :draggable="isDraggable"
43
- @dragstart="drag($event, item, index)"
43
+ @dragstart="dragStart($event, item, index)"
44
44
  @dragover.prevent="dragOver($event, index)"
45
45
  @dragend="dragEnd($event)"
46
46
  @drop="drop($event, index)"
@@ -81,71 +81,21 @@
81
81
  </div>
82
82
  </template>
83
83
 
84
- <script>
85
- import {
86
- computed,
87
- getCurrentInstance,
88
- inject,
89
- isReactive,
90
- reactive,
91
- ref,
92
- shallowRef,
93
- watch,
94
- } from 'vue';
84
+ <script setup>
85
+ import { computed, getCurrentInstance, ref, useSlots, watch } from 'vue';
95
86
  import {
87
+ VIcon,
96
88
  VList,
97
89
  VListItem,
98
- VIcon,
99
90
  VListItemTitle,
100
91
  VTooltip,
101
92
  } from 'vuetify/components';
93
+ import { setupDraggableList, setupSelectableList } from './listHelper.js';
102
94
  import VcsListItemComponent from './VcsListItemComponent.vue';
103
95
  import VcsActionButtonList from '../buttons/VcsActionButtonList.vue';
104
96
  import VcsTreeviewSearchbar from './VcsTreeviewSearchbar.vue';
105
97
  import { createEllipseTooltip } from '../composables.js';
106
98
 
107
- /**
108
- * @param {import("vue").Ref<import("./VcsListItemComponent.vue").VcsListItem[]>} items
109
- * @param {import("vue").ShallowRef<import("./VcsListItemComponent.vue").VcsListItem[]>} selected
110
- * @param {function(string, ...any[]):void} emit
111
- * @returns {Array<import("../../actions/actionHelper.js").VcsAction>}
112
- */
113
- export function createSelectionActions(items, selected, emit) {
114
- const selectAllAction = reactive({
115
- name: 'list.selectAll',
116
- tooltip: 'list.selectAll',
117
- disabled: computed(() => items.value.length - selected.value.length < 1),
118
- callback() {
119
- const currentSelection = [...selected.value];
120
- selected.value = items.value.filter((item) => !item.disabled);
121
-
122
- selected.value.forEach((item) => {
123
- if (item.selectionChanged && !currentSelection.includes(item)) {
124
- item.selectionChanged(true);
125
- }
126
- });
127
- emit('update:modelValue', selected.value);
128
- },
129
- });
130
-
131
- const clearSelectionAction = reactive({
132
- name: 'list.clearSelection',
133
- tooltip: 'list.clearSelection',
134
- disabled: computed(() => selected.value.length < 1),
135
- callback() {
136
- [...selected.value].forEach((item) => {
137
- if (item.selectionChanged) {
138
- item.selectionChanged(false);
139
- }
140
- });
141
- selected.value = [];
142
- emit('update:modelValue', selected.value);
143
- },
144
- });
145
-
146
- return [selectAllAction, clearSelectionAction];
147
- }
148
-
149
99
  /**
150
100
  * @typedef {Object} ItemMovedEvent
151
101
  * @property {import("./VcsListItemComponent.vue").VcsListItem} item
@@ -154,7 +104,7 @@
154
104
 
155
105
  /**
156
106
  * @description
157
- * The VCS list is intended to render items. Items can be selectable (by default, more than one) or only a single item can
107
+ * The VcsList is intended to render items. Items can be selectable (by default, more than one) or only a single item can
158
108
  * be selected. If items are disabled they cannot be selected. Items which are not visible are not rendered. These items can
159
109
  * no longer be selected or deselected either. Making a selected item invisible can lead to undefined behavior
160
110
  * in the selection state.
@@ -168,8 +118,9 @@
168
118
  * @vue-prop {boolean} [draggable=false]
169
119
  * @vue-prop {boolean} [selectable=false]
170
120
  * @vue-prop {boolean} [singleSelect=false]
171
- * @vue-prop {Array<import("./VcsListItemComponent.vue").VcsListItem>} [value=[]] - the initial items to be selected.
172
- * @vue-prop {boolean} [searchable=false] - if this list can have its items searched. you can provide your own predicate function by providing "filterPredicate" which is of type function(import("./VcsListItemComponent.vue").VcsListItem, string):boolean
121
+ * @vue-prop {Array<import("./VcsListItemComponent.vue").VcsListItem>} [modelValue=[]] - the initial items to be selected.
122
+ * @vue-prop {boolean} [searchable=false] - if this list can have its items searched.
123
+ * @vue-prop {function(import("./VcsListItemComponent.vue").VcsListItem, string):boolean} [customFilter] - a function to customize filtering when searching.
173
124
  * @vue-prop {string} [searchbarPlaceholder] - placeholder to render inside the search field
174
125
  * @vue-prop {boolean} [showTitle=true] - show the title component
175
126
  * @vue-prop {number} [actionButtonListOverflowCount] - overflow count to use for action lists in the title and items
@@ -177,362 +128,161 @@
177
128
  * @vue-prop {string} [icon] - icon to prepend to the list title
178
129
  * @vue-prop {string} [tooltip] - tooltip to render on the list title
179
130
  * @vue-prop {Array<import("../../actions/actionHelper.js").VcsAction>} [actions] - actions to render in the list title
180
- * @vue-event {ItemMovedEvent} item-moved - event triggered after item was dragged and is dropped
131
+ * @vue-event {ItemMovedEvent} itemMoved - event triggered after item was dragged and is dropped
181
132
  * @vue-data {slot} [#item.prepend] - A slot that forwads to v-list-item prepend slot. Binds v-list-item append slot props, item and item index.
182
133
  * @vue-data {slot} [#item.title] - A slot that forwards to v-list-item title slot. Binds v-list-item title slot props, item and item index.
183
134
  * @vue-data {slot} [#item.subtitle] - A slot that forwards to v-list-item subtitle slot. Binds v-list-item subtitle slot props, item and item index.
184
135
  * @vue-data {slot} [#item.append] - A slot that forwards to v-list-item append slot. Binds v-list-item append slot props, item and item index.
185
136
  * @vue-data {slot} [#item.intermediate] - A slot to introduce content, e.g. buttons between two list items. Binds item and item index.
186
137
  */
187
- export default {
188
- name: 'VcsList',
189
- components: {
190
- VcsListItemComponent,
191
- VcsTreeviewSearchbar,
192
- VcsActionButtonList,
193
- VTooltip,
194
- VList,
195
- VListItem,
196
- VIcon,
197
- VListItemTitle,
138
+
139
+ const props = defineProps({
140
+ items: {
141
+ type: Array,
142
+ required: true,
198
143
  },
199
- props: {
200
- items: {
201
- type: Array,
202
- required: true,
203
- },
204
- draggable: {
205
- type: Boolean,
206
- default: false,
207
- },
208
- selectable: {
209
- type: Boolean,
210
- default: false,
211
- },
212
- singleSelect: {
213
- type: Boolean,
214
- default: false,
215
- },
216
- modelValue: {
217
- type: Array,
218
- default: () => [],
219
- },
220
- searchable: {
221
- type: Boolean,
222
- default: false,
223
- },
224
- searchbarPlaceholder: {
225
- type: String,
226
- default: undefined,
227
- },
228
- showTitle: {
229
- type: Boolean,
230
- default: true,
231
- },
232
- actionButtonListOverflowCount: {
233
- type: Number,
234
- required: false,
235
- default: undefined,
236
- },
237
- title: {
238
- type: String,
239
- required: false,
240
- default: '',
241
- },
242
- icon: {
243
- type: String,
244
- required: false,
245
- default: undefined,
246
- },
247
- tooltip: {
248
- type: String,
249
- required: false,
250
- default: '',
251
- },
252
- actions: {
253
- type: Array,
254
- required: false,
255
- default: () => [],
256
- },
144
+ draggable: {
145
+ type: Boolean,
146
+ default: false,
257
147
  },
258
- setup(props, { emit, slots }) {
259
- /** @type {import("vue").ShallowRef<Array<import("./VcsListItemComponent.vue").VcsListItem>>} */
260
- const selected = shallowRef([]);
261
- /** @type {import("vue").Ref<string>} */
262
- const query = ref('');
263
- /** @type {import("vue").Ref<number|undefined>} */
264
- const hovering = ref(undefined);
265
- /** @type {import("vue").Ref<number|undefined>} */
266
- const dragging = ref(undefined);
267
- const borderBottom = (index) => {
268
- return (
269
- dragging.value !== undefined &&
270
- dragging.value < index &&
271
- index === hovering.value
272
- );
273
- };
274
- const borderTop = (index) => {
275
- return (
276
- dragging.value !== undefined &&
277
- dragging.value > index &&
278
- index === hovering.value
279
- );
280
- };
281
- const lightenEven = computed(() => {
282
- return !(!props.searchable && !props.showTitle);
283
- });
284
- let firstSelected = null;
285
- const listHeader = ref();
286
-
287
- watch(
288
- props,
289
- () => {
290
- if (selected.value !== props.modelValue) {
291
- selected.value = props.modelValue;
292
- }
293
- if (props.singleSelect && selected.value.length > 1) {
294
- selected.value
295
- .filter((i, index) => index && i.selectionChanged)
296
- .forEach((i) => i.selectionChanged(false));
297
- selected.value = [selected.value[0]];
298
- emit('update:modelValue', selected);
299
- }
300
- if (!props.selectable && selected.value.length > 0) {
301
- selected.value
302
- .filter((i) => i.selectionChanged)
303
- .forEach((i) => i.selectionChanged(false));
304
- selected.value = [];
305
- emit('update:modelValue', selected);
306
- }
307
- if (!props.searchable) {
308
- query.value = '';
309
- }
310
- },
311
- { immediate: true, deep: false },
312
- );
313
-
314
- const vm = getCurrentInstance().proxy;
315
- /** @type {function(import("./VcsListItemComponent.vue").VcsListItem, string):boolean} */
316
- const filterPredicate = inject(
317
- 'filterPredicate',
318
- (item, queryString = '') => {
319
- const translatedTitle = vm.$st(item.title);
320
- return translatedTitle
321
- .toLocaleLowerCase()
322
- .includes(queryString.toLocaleLowerCase());
323
- },
324
- );
325
-
326
- /**
327
- * @type {import("./VcsListItemComponent.vue").VcsListItem|null}
328
- */
329
- let draggedItem = null;
148
+ selectable: {
149
+ type: Boolean,
150
+ default: false,
151
+ },
152
+ singleSelect: {
153
+ type: Boolean,
154
+ default: false,
155
+ },
156
+ selectFunction: {
157
+ type: Function,
158
+ default: undefined,
159
+ },
160
+ modelValue: {
161
+ type: Array,
162
+ default: () => [],
163
+ },
164
+ searchable: {
165
+ type: Boolean,
166
+ default: false,
167
+ },
168
+ customFilter: {
169
+ type: Function,
170
+ default: undefined,
171
+ },
172
+ searchbarPlaceholder: {
173
+ type: String,
174
+ default: undefined,
175
+ },
176
+ showTitle: {
177
+ type: Boolean,
178
+ default: true,
179
+ },
180
+ actionButtonListOverflowCount: {
181
+ type: Number,
182
+ required: false,
183
+ default: undefined,
184
+ },
185
+ title: {
186
+ type: String,
187
+ required: false,
188
+ default: '',
189
+ },
190
+ icon: {
191
+ type: String,
192
+ required: false,
193
+ default: undefined,
194
+ },
195
+ tooltip: {
196
+ type: String,
197
+ required: false,
198
+ default: '',
199
+ },
200
+ actions: {
201
+ type: Array,
202
+ required: false,
203
+ default: () => [],
204
+ },
205
+ });
330
206
 
331
- const isDraggable = computed(() => {
332
- return !query.value && props.draggable;
333
- });
207
+ const emit = defineEmits(['update:modelValue', 'itemMoved']);
334
208
 
335
- /**
336
- * @param {MouseEvent} e
337
- * @param {number} targetIndex
338
- */
339
- function drop(e, targetIndex) {
340
- if (isDraggable.value) {
341
- if (draggedItem !== null && targetIndex !== undefined) {
342
- emit('item-moved', { item: draggedItem, targetIndex });
343
- }
344
- draggedItem = null;
345
- dragging.value = undefined;
346
- hovering.value = undefined;
347
- }
348
- }
209
+ const slots = useSlots();
349
210
 
350
- /**
351
- * @param {MouseEvent} e
352
- * @param {import("./VcsListItemComponent.vue").VcsListItem} item
353
- * @param {number} index
354
- */
355
- function drag(e, item, index) {
356
- e.stopPropagation();
357
- if (isDraggable.value) {
358
- dragging.value = index;
359
- draggedItem = item;
360
- e.dataTransfer.effectAllowed = 'move';
361
- }
362
- }
211
+ const lightenEven = computed(() => {
212
+ return !(!props.searchable && !props.showTitle);
213
+ });
363
214
 
364
- function dragOver(e, index) {
365
- e.stopPropagation();
366
- e.preventDefault();
367
- hovering.value = index;
368
- }
215
+ /** @type {import("vue").Ref<string>} */
216
+ const query = ref('');
369
217
 
370
- function dragLeave(e) {
371
- e.stopPropagation();
372
- e.preventDefault();
373
- hovering.value = undefined;
218
+ watch(
219
+ () => props.searchable,
220
+ (searchable) => {
221
+ if (!searchable) {
222
+ query.value = '';
374
223
  }
224
+ },
225
+ { immediate: true },
226
+ );
375
227
 
376
- function dragEnd(e) {
377
- e.stopPropagation();
378
- dragging.value = undefined;
379
- hovering.value = undefined;
380
- }
228
+ const vm = getCurrentInstance().proxy;
229
+ /** @type {function(import("./VcsListItemComponent.vue").VcsListItem, string):boolean} */
230
+ const filterPredicate = (item, queryString = '') => {
231
+ if (props.customFilter) {
232
+ return props.customFilter(item, queryString);
233
+ }
234
+ const translatedTitle = vm.$st(item.title);
235
+ return translatedTitle
236
+ .toLocaleLowerCase()
237
+ .includes(queryString.toLocaleLowerCase());
238
+ };
381
239
 
382
- /**
383
- * @type {import("vue").ComputedRef<Array<import("./VcsListItemComponent.vue").VcsListItem>>}
384
- */
385
- const renderingItems = computed(() => {
386
- let items = props.items.filter((i) => i.visible !== false);
387
- if (query.value) {
388
- items = items.filter((i) => filterPredicate(i, query.value));
389
- }
390
- return items;
391
- });
240
+ /**
241
+ * @type {import("vue").ComputedRef<Array<import("./VcsListItemComponent.vue").VcsListItem>>}
242
+ */
243
+ const renderingItems = computed(() => {
244
+ let items = props.items.filter((i) => i.visible !== false);
245
+ if (query.value) {
246
+ items = items.filter((i) => filterPredicate(i, query.value));
247
+ }
248
+ return items;
249
+ });
392
250
 
393
- const selectionActions = createSelectionActions(
394
- renderingItems,
395
- selected,
396
- emit,
397
- );
251
+ const {
252
+ dragging,
253
+ isDraggable,
254
+ borderBottom,
255
+ borderTop,
256
+ dragStart,
257
+ dragOver,
258
+ dragLeave,
259
+ dragEnd,
260
+ drop,
261
+ } = setupDraggableList(props, query, emit);
398
262
 
399
- /**
400
- * @type {import("vue").ComputedRef<Array<import("../../actions/actionHelper.js").VcsAction>>}
401
- */
402
- const renderingActions = computed(() => {
403
- if (props.selectable && !props.singleSelect) {
404
- return [...selectionActions, ...props.actions];
405
- }
406
- return props.actions;
407
- });
263
+ const { select, selected, selectionActions } = setupSelectableList(
264
+ props,
265
+ renderingItems,
266
+ emit,
267
+ );
408
268
 
409
- return {
410
- query,
411
- hovering,
412
- dragging,
413
- isDraggable,
414
- borderBottom,
415
- borderTop,
416
- lightenEven,
417
- /**
418
- * @type {import("vue").ComputedRef<Array<import("../../actions/actionHelper.js").VcsAction>>}
419
- */
420
- renderingActions,
421
- /**
422
- * @type {import("vue").ComputedRef<Array<import("./VcsListItemComponent.vue").VcsListItem>>}
423
- */
424
- renderingItems,
425
- /** @type {import("vue").ShallowRef<Array<import("./VcsListItemComponent.vue").VcsListItem>>} */
426
- selected,
427
- /**
428
- * @param {import("vue").UnwrapNestedRef<import("./VcsListItemComponent.vue").VcsListItem>} item
429
- * @param {PointerEvent} event
430
- */
431
- select(item, event) {
432
- if (!props.selectable || item.disabled) {
433
- return;
434
- }
435
- if (!isReactive(item)) {
436
- throw new Error('Trying to select an unreactive item');
437
- }
438
- if (Array.isArray(item.clickedCallbacks)) {
439
- item.clickedCallbacks.forEach((cb) => cb(event));
440
- }
441
- if (props.singleSelect) {
442
- if (selected.value[0] === item) {
443
- item.selectionChanged?.(false);
444
- selected.value = [];
445
- firstSelected = null;
446
- } else {
447
- selected.value[0]?.selectionChanged?.(false);
448
- item.selectionChanged?.(true);
449
- selected.value = [item];
450
- firstSelected = item;
451
- }
452
- } else if (event.shiftKey) {
453
- let firstIndex = 0;
454
- if (firstSelected) {
455
- firstIndex = renderingItems.value.indexOf(firstSelected);
456
- }
457
- const currentIndex = renderingItems.value.indexOf(item);
458
- if (firstIndex > -1 && currentIndex > -1) {
459
- const currentSelection = [...selected.value];
460
- selected.value = renderingItems.value.slice(
461
- Math.min(firstIndex, currentIndex),
462
- Math.max(firstIndex, currentIndex) + 1,
463
- );
464
- currentSelection.forEach((oldItem) => {
465
- if (
466
- oldItem.selectionChanged &&
467
- !selected.value.includes(oldItem)
468
- ) {
469
- oldItem.selectionChanged(false);
470
- }
471
- });
472
- selected.value.forEach((newItem) => {
473
- if (
474
- newItem.selectionChanged &&
475
- !currentSelection.includes(newItem)
476
- ) {
477
- newItem.selectionChanged(true);
478
- }
479
- });
480
- } else {
481
- selected.value
482
- .filter((i) => i !== item && i.selectionChanged)
483
- .forEach((i) => i.selectionChanged(false));
484
- selected.value = [];
485
- firstSelected = null;
486
- }
487
- } else if (selected.value.includes(item)) {
488
- if (event.ctrlKey) {
489
- item.selectionChanged?.(false);
490
- selected.value = selected.value.filter((i) => i !== item);
491
- } else if (selected.value.length > 1) {
492
- selected.value
493
- .filter((i) => i !== item && i.selectionChanged)
494
- .forEach((i) => {
495
- i.selectionChanged(false);
496
- });
497
- selected.value = [item];
498
- firstSelected = item;
499
- } else {
500
- item.selectionChanged?.(false);
501
- selected.value = [];
502
- firstSelected = null;
503
- }
504
- } else if (event.ctrlKey) {
505
- item.selectionChanged?.(true);
506
- selected.value = [...selected.value, item];
507
- if (selected.value.length === 1) {
508
- firstSelected = item;
509
- }
510
- } else {
511
- selected.value
512
- .filter((i) => i !== item && i.selectionChanged)
513
- .forEach((i) => i.selectionChanged(false));
514
- item.selectionChanged?.(true);
515
- selected.value = [item];
516
- firstSelected = item;
517
- }
269
+ /**
270
+ * @type {import("vue").ComputedRef<Array<import("../../actions/actionHelper.js").VcsAction>>}
271
+ */
272
+ const renderingActions = computed(() => {
273
+ if (props.selectable && !props.singleSelect) {
274
+ return [...selectionActions, ...props.actions];
275
+ }
276
+ return props.actions;
277
+ });
518
278
 
519
- emit('update:modelValue', selected.value);
520
- },
521
- drag,
522
- drop,
523
- dragOver,
524
- dragLeave,
525
- dragEnd,
526
- listHeader,
527
- listHeaderTooltip: createEllipseTooltip(
528
- computed(() => listHeader.value?.$el),
529
- computed(() => props.tooltip),
530
- computed(() => props.title),
531
- ),
532
- hasIntermediateSlot: computed(() => !!slots['item.intermediate']),
533
- };
534
- },
535
- };
279
+ const listHeader = ref();
280
+ const listHeaderTooltip = createEllipseTooltip(
281
+ computed(() => listHeader.value?.$el),
282
+ computed(() => props.tooltip),
283
+ computed(() => props.title),
284
+ );
285
+ const hasIntermediateSlot = computed(() => !!slots['item.intermediate']);
536
286
  </script>
537
287
 
538
288
  <style lang="scss" scoped>