@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.
- package/config/base.config.json +6 -0
- package/config/clipping.config.json +384 -0
- package/config/cluster.config.json +106 -0
- package/config/concepts-show-case.config.json +4 -0
- package/config/projects.config.json +5 -2
- package/dist/assets/{cesium-11e5bbc6.js → cesium-87d5e72d.js} +438 -432
- package/dist/assets/cesium.js +1 -1
- package/dist/assets/{core-9d0cfec3.js → core-72f9f393.js} +4907 -4514
- package/dist/assets/core.js +1 -1
- package/dist/assets/{ol-0d0ebb27.js → ol-e468ba43.js} +23518 -22404
- package/dist/assets/ol.js +1 -1
- package/dist/assets/ui-73257b15.css +1 -0
- package/dist/assets/{ui-08446666.js → ui-73257b15.js} +13703 -12977
- package/dist/assets/ui.js +1 -1
- package/dist/assets/vue.js +1 -1
- package/dist/assets/{vuetify-67025c41.css → vuetify-2437380c.css} +2 -2
- package/dist/assets/{vuetify-67025c41.js → vuetify-2437380c.js} +8024 -7634
- package/dist/assets/vuetify.js +1 -1
- package/index.d.ts +40 -19
- package/index.js +36 -6
- package/lib/olLib.js +25 -3
- package/package.json +6 -6
- package/plugins/@vcmap-show-case/callback-tester/README.md +3 -0
- package/plugins/@vcmap-show-case/callback-tester/package.json +5 -0
- package/plugins/@vcmap-show-case/callback-tester/src/CallbackTester.vue +62 -0
- package/plugins/@vcmap-show-case/callback-tester/src/index.js +48 -0
- package/plugins/@vcmap-show-case/form-inputs-example/src/FormInputsExample.vue +1 -0
- package/src/actions/actionHelper.d.ts +1 -0
- package/src/actions/actionHelper.js +70 -19
- package/src/application/VcsApp.vue +83 -50
- package/src/application/VcsApp.vue.d.ts +28 -2
- package/src/application/VcsContainer.vue +5 -3
- package/src/application/VcsContainer.vue.d.ts +14 -0
- package/src/application/VcsNavbar.vue +10 -6
- package/src/application/VcsNavbar.vue.d.ts +2 -0
- package/src/application/VcsObliqueFooter.vue +9 -3
- package/src/application/VcsSplashScreen.vue +37 -0
- package/src/application/VcsSplashScreen.vue.d.ts +6 -0
- package/src/application/positionDisplayInteraction.js +1 -1
- package/src/callback/activateClippingPolygonCallback.d.ts +29 -0
- package/src/callback/activateClippingPolygonCallback.js +54 -0
- package/src/callback/closeSplashScreenCallback.d.ts +8 -0
- package/src/callback/closeSplashScreenCallback.js +33 -0
- package/src/callback/deactivateClippingPolygonCallback.d.ts +29 -0
- package/src/callback/deactivateClippingPolygonCallback.js +54 -0
- package/src/callback/openSplashScreenCallback.d.ts +8 -0
- package/src/callback/openSplashScreenCallback.js +35 -0
- package/src/callback/toggleNavbarButtonCallback.d.ts +36 -0
- package/src/callback/toggleNavbarButtonCallback.js +62 -0
- package/src/components/buttons/VcsActionButtonList.vue +6 -4
- package/src/components/buttons/VcsToolButton.vue +0 -1
- package/src/components/form-inputs-controls/VcsDatePicker.vue +7 -1
- package/src/components/form-inputs-controls/VcsDatePicker.vue.d.ts +9 -0
- package/src/components/form-inputs-controls/VcsSelect.vue +1 -1
- package/src/components/form-inputs-controls/VcsTextArea.vue +13 -8
- package/src/components/form-output/markdownHelper.d.ts +0 -25
- package/src/components/form-output/markdownHelper.js +1 -386
- package/src/components/import/VcsImportComponent.vue +2 -0
- package/src/components/lists/VcsGroupedList.vue +178 -0
- package/src/components/lists/VcsGroupedList.vue.d.ts +17 -0
- package/src/components/lists/VcsList.vue +144 -394
- package/src/components/lists/VcsList.vue.d.ts +38 -159
- package/src/components/lists/VcsTreeNode.vue +18 -11
- package/src/components/lists/VcsTreeview.vue +27 -20
- package/src/components/lists/VcsTreeview.vue.d.ts +18 -1
- package/src/components/lists/listHelper.d.ts +87 -0
- package/src/components/lists/listHelper.js +348 -0
- package/src/components/section/VcsFormSection.vue +7 -2
- package/src/components/section/VcsFormSection.vue.d.ts +9 -0
- package/src/components/tables/VcsDataTable.vue +14 -3
- package/src/components/tables/VcsDataTable.vue.d.ts +9 -0
- package/src/components/vector-properties/VcsVectorPropertiesComponent.vue.d.ts +1 -1
- package/src/contentTree/LayerTree.vue +2 -1
- package/src/contentTree/LayerTree.vue.d.ts +2 -0
- package/src/contentTree/contentTreeCollection.d.ts +1 -0
- package/src/contentTree/contentTreeCollection.js +7 -3
- package/src/contentTree/contentTreeItem.js +4 -2
- package/src/contentTree/groupContentTreeItem.js +5 -3
- package/src/featureInfo/ClusterFeatureComponent.vue +58 -0
- package/src/featureInfo/ClusterFeatureComponent.vue.d.ts +6 -0
- package/src/featureInfo/abstractFeatureInfoView.js +1 -2
- package/src/featureInfo/featureInfo.d.ts +87 -1
- package/src/featureInfo/featureInfo.js +342 -34
- package/src/featureInfo/featureInfoInteraction.js +18 -3
- package/src/featureInfo/iframeFeatureInfoView.js +1 -1
- package/src/featureInfo/markdownBalloonFeatureInfoView.js +2 -4
- package/src/featureInfo/markdownFeatureInfoView.js +1 -1
- package/src/i18n/de.d.ts +17 -4
- package/src/i18n/de.js +7 -0
- package/src/i18n/en.d.ts +17 -4
- package/src/i18n/en.js +7 -0
- package/src/legend/VcsLegend.vue +1 -1
- package/src/legend/legendHelper.d.ts +1 -1
- package/src/legend/legendHelper.js +52 -9
- package/src/localStorage.d.ts +21 -0
- package/src/localStorage.js +51 -0
- package/src/manager/collectionManager/CollectionComponent.vue +1 -1
- package/src/manager/collectionManager/CollectionComponentContent.vue +2 -3
- package/src/manager/collectionManager/CollectionComponentList.vue +2 -3
- package/src/manager/collectionManager/CollectionComponentStandalone.vue +1 -1
- package/src/manager/navbarManager.js +9 -4
- package/src/manager/toolbox/ToolboxManagerComponent.vue +14 -12
- package/src/manager/toolbox/ToolboxManagerComponent.vue.d.ts +13 -2
- package/src/manager/toolbox/toolboxManager.d.ts +5 -0
- package/src/manager/toolbox/toolboxManager.js +7 -1
- package/src/manager/window/WindowComponent.vue +10 -0
- package/src/manager/window/WindowComponent.vue.d.ts +1 -0
- package/src/manager/window/WindowManager.vue +14 -4
- package/src/manager/window/WindowManager.vue.d.ts +1 -0
- package/src/manager/window/windowHelper.d.ts +7 -3
- package/src/manager/window/windowHelper.js +30 -10
- package/src/navigation/MapNavigation.vue +5 -5
- package/src/navigation/MapNavigation.vue.d.ts +1 -1
- package/src/navigation/overviewMap.d.ts +7 -0
- package/src/navigation/overviewMap.js +18 -4
- package/src/pluginHelper.d.ts +7 -0
- package/src/pluginHelper.js +18 -4
- package/src/search/ResultItem.vue.d.ts +1 -1
- package/src/search/markText.d.ts +1 -1
- package/src/search/markText.js +4 -4
- package/src/search/search.js +1 -1
- package/src/state.d.ts +4 -2
- package/src/state.js +54 -31
- package/src/uiConfig.d.ts +36 -0
- package/src/uiConfig.js +17 -1
- package/src/vcsUiApp.js +7 -11
- package/dist/assets/ui-08446666.css +0 -1
- /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="
|
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
|
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>} [
|
172
|
-
* @vue-prop {boolean} [searchable=false] - if this list can have its items searched.
|
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}
|
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
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
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
|
-
|
200
|
-
|
201
|
-
|
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
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
|
296
|
-
|
297
|
-
|
298
|
-
|
299
|
-
|
300
|
-
|
301
|
-
|
302
|
-
|
303
|
-
|
304
|
-
|
305
|
-
|
306
|
-
|
307
|
-
|
308
|
-
|
309
|
-
|
310
|
-
|
311
|
-
|
312
|
-
|
313
|
-
|
314
|
-
|
315
|
-
|
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
|
-
|
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
|
-
|
352
|
-
|
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
|
-
|
365
|
-
|
366
|
-
e.preventDefault();
|
367
|
-
hovering.value = index;
|
368
|
-
}
|
215
|
+
/** @type {import("vue").Ref<string>} */
|
216
|
+
const query = ref('');
|
369
217
|
|
370
|
-
|
371
|
-
|
372
|
-
|
373
|
-
|
218
|
+
watch(
|
219
|
+
() => props.searchable,
|
220
|
+
(searchable) => {
|
221
|
+
if (!searchable) {
|
222
|
+
query.value = '';
|
374
223
|
}
|
224
|
+
},
|
225
|
+
{ immediate: true },
|
226
|
+
);
|
375
227
|
|
376
|
-
|
377
|
-
|
378
|
-
|
379
|
-
|
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
|
-
|
384
|
-
|
385
|
-
|
386
|
-
|
387
|
-
|
388
|
-
|
389
|
-
|
390
|
-
|
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
|
-
|
394
|
-
|
395
|
-
|
396
|
-
|
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
|
-
|
401
|
-
|
402
|
-
|
403
|
-
|
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
|
-
|
410
|
-
|
411
|
-
|
412
|
-
|
413
|
-
|
414
|
-
|
415
|
-
|
416
|
-
|
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
|
-
|
520
|
-
|
521
|
-
|
522
|
-
|
523
|
-
|
524
|
-
|
525
|
-
|
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>
|