@dative-gpi/foundation-shared-components 0.0.42 → 0.0.43
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/components/lists/FSDataIteratorItem.vue +1 -1
- package/components/lists/FSDataTableUI.vue +71 -319
- package/package.json +4 -4
- package/styles/components/fs_data_table.scss +1 -1
- package/styles/components/index.scss +0 -1
- package/components/lists/FSDraggable.vue +0 -177
- package/styles/components/fs_draggable.scss +0 -25
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
/>
|
|
18
18
|
<slot name="toolbar" />
|
|
19
19
|
<v-spacer />
|
|
20
|
-
<
|
|
20
|
+
<FSToggleSet
|
|
21
21
|
v-if="!$props.disableTable && !$props.disableIterator"
|
|
22
22
|
:values="modeOptions"
|
|
23
23
|
:required="true"
|
|
@@ -36,10 +36,7 @@
|
|
|
36
36
|
@update:filter="(value) => toggleFilter(header.value, value)"
|
|
37
37
|
>
|
|
38
38
|
<template #default="{ filter }">
|
|
39
|
-
<slot
|
|
40
|
-
:name="filterSlot(header)"
|
|
41
|
-
v-bind="{ filter }"
|
|
42
|
-
/>
|
|
39
|
+
<slot :name="filterSlot(header)" v-bind="{ filter }" />
|
|
43
40
|
</template>
|
|
44
41
|
</FSFilterButton>
|
|
45
42
|
<FSChip
|
|
@@ -71,7 +68,7 @@
|
|
|
71
68
|
:items="innerItems"
|
|
72
69
|
:fixedHeader="true"
|
|
73
70
|
:multiSort="false"
|
|
74
|
-
:hover="
|
|
71
|
+
:hover="true"
|
|
75
72
|
:style="style"
|
|
76
73
|
:class="classes"
|
|
77
74
|
:page="innerPage"
|
|
@@ -80,10 +77,6 @@
|
|
|
80
77
|
@auxclick:row="onClickRow"
|
|
81
78
|
@click:row="onClickRow"
|
|
82
79
|
@update:sortBy="innerSortBy = $event ? $event[0] : null"
|
|
83
|
-
@dragover.prevent
|
|
84
|
-
@drop:row="(event, row) => onDrop(event, row, 'tr.v-data-table__tr')"
|
|
85
|
-
@dragover="onDragOver($event, 'tr.v-data-table__tr', 'tbody')"
|
|
86
|
-
@dragleave="onDragLeave"
|
|
87
80
|
>
|
|
88
81
|
<template #no-data>
|
|
89
82
|
<FSText
|
|
@@ -118,37 +111,11 @@
|
|
|
118
111
|
/>
|
|
119
112
|
</FSRow>
|
|
120
113
|
</template>
|
|
121
|
-
<template #[`item.data-table-draggable`]="props">
|
|
122
|
-
<FSDraggable
|
|
123
|
-
elementSelector="tr.v-data-table__tr"
|
|
124
|
-
:disabled="draggableDisabled"
|
|
125
|
-
:item="props"
|
|
126
|
-
@update:dragend="(event, dragged) => onDragEnd(event, dragged, 'tbody')"
|
|
127
|
-
>
|
|
128
|
-
<FSRow
|
|
129
|
-
class="fs-data-table-draggable"
|
|
130
|
-
align="bottom-center"
|
|
131
|
-
width="hug"
|
|
132
|
-
>
|
|
133
|
-
<FSIcon
|
|
134
|
-
size="l"
|
|
135
|
-
>
|
|
136
|
-
mdi-drag-vertical
|
|
137
|
-
</FSIcon>
|
|
138
|
-
</FSRow>
|
|
139
|
-
</FSDraggable>
|
|
140
|
-
</template>
|
|
141
114
|
<template #[`header.data-table-group`]="props">
|
|
142
|
-
<slot
|
|
143
|
-
name="header.data-table-group"
|
|
144
|
-
v-bind="props"
|
|
145
|
-
/>
|
|
115
|
+
<slot name="header.data-table-group" v-bind="props" />
|
|
146
116
|
</template>
|
|
147
117
|
<template #[`item.data-table-group`]="props">
|
|
148
|
-
<slot
|
|
149
|
-
name="item.data-table-group"
|
|
150
|
-
v-bind="props"
|
|
151
|
-
/>
|
|
118
|
+
<slot name="item.data-table-group" v-bind="props" />
|
|
152
119
|
</template>
|
|
153
120
|
<template #group-header="props">
|
|
154
121
|
<template :ref="() => { if (!props.isGroupOpen(props.item)) { props.toggleGroup(props.item) } }" />
|
|
@@ -158,39 +125,27 @@
|
|
|
158
125
|
class="fs-data-table-group-header"
|
|
159
126
|
:colspan="extraHeaders.concat(innerHeaders).length + 1"
|
|
160
127
|
>
|
|
161
|
-
<slot
|
|
162
|
-
|
|
163
|
-
|
|
128
|
+
<slot name="group-header" v-bind="props">
|
|
129
|
+
<FSCard
|
|
130
|
+
padding="12px 16px"
|
|
164
131
|
>
|
|
165
|
-
<
|
|
166
|
-
|
|
132
|
+
<FSRow
|
|
133
|
+
align="center-left"
|
|
134
|
+
width="hug"
|
|
167
135
|
>
|
|
168
|
-
<
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
v-bind="props"
|
|
176
|
-
>
|
|
177
|
-
{{ props.item.value }}
|
|
178
|
-
</slot>
|
|
179
|
-
</FSText>
|
|
180
|
-
</FSRow>
|
|
181
|
-
</FSCard>
|
|
136
|
+
<FSText>
|
|
137
|
+
<slot name="group-header-title" v-bind="props">
|
|
138
|
+
{{ props.item.value }}
|
|
139
|
+
</slot>
|
|
140
|
+
</FSText>
|
|
141
|
+
</FSRow>
|
|
142
|
+
</FSCard>
|
|
182
143
|
</slot>
|
|
183
144
|
</td>
|
|
184
145
|
</tr>
|
|
185
146
|
</template>
|
|
186
|
-
<template
|
|
187
|
-
|
|
188
|
-
#[header.slotName]="props"
|
|
189
|
-
>
|
|
190
|
-
<slot
|
|
191
|
-
:name="header.slotName"
|
|
192
|
-
v-bind="props"
|
|
193
|
-
>
|
|
147
|
+
<template v-for="(header, index) in headersSlots" #[header.slotName]="props">
|
|
148
|
+
<slot :name="header.slotName" v-bind="props">
|
|
194
149
|
<FSRow
|
|
195
150
|
align="center-left"
|
|
196
151
|
:wrap="false"
|
|
@@ -222,14 +177,8 @@
|
|
|
222
177
|
</FSRow>
|
|
223
178
|
</slot>
|
|
224
179
|
</template>
|
|
225
|
-
<template
|
|
226
|
-
|
|
227
|
-
#[item.slotName]="props"
|
|
228
|
-
>
|
|
229
|
-
<slot
|
|
230
|
-
:name="item.slotName"
|
|
231
|
-
v-bind="props"
|
|
232
|
-
>
|
|
180
|
+
<template v-for="(item, index) in itemsSlots" #[item.slotName]="props">
|
|
181
|
+
<slot :name="item.slotName" v-bind="props">
|
|
233
182
|
<FSRow
|
|
234
183
|
align="center-left"
|
|
235
184
|
:key="index"
|
|
@@ -300,14 +249,8 @@
|
|
|
300
249
|
/>
|
|
301
250
|
</FSRow>
|
|
302
251
|
</template>
|
|
303
|
-
<template
|
|
304
|
-
v-
|
|
305
|
-
#[name]="props"
|
|
306
|
-
>
|
|
307
|
-
<slot
|
|
308
|
-
:name="name"
|
|
309
|
-
v-bind="props"
|
|
310
|
-
/>
|
|
252
|
+
<template v-for="(_, name) in innerSlots" #[name]="props">
|
|
253
|
+
<slot :name="name" v-bind="props" />
|
|
311
254
|
</template>
|
|
312
255
|
</v-data-table>
|
|
313
256
|
<v-data-iterator
|
|
@@ -320,49 +263,25 @@
|
|
|
320
263
|
<template #default="{ items }">
|
|
321
264
|
<FSCol
|
|
322
265
|
width="fill"
|
|
323
|
-
class="fs-data-iterator-container"
|
|
324
266
|
>
|
|
325
|
-
<
|
|
326
|
-
v-
|
|
327
|
-
elementSelector=".fs-draggable-item"
|
|
328
|
-
:disabled="draggableDisabled"
|
|
329
|
-
:item="item"
|
|
330
|
-
:key="index"
|
|
331
|
-
@update:dragend="(event, dragged) => onDragEnd(event, dragged, '.fs-data-iterator-container')"
|
|
332
|
-
@dragover="onDragOver($event, '.fs-draggable-item', '.fs-data-iterator-container')"
|
|
333
|
-
@drop="(event) => onDrop(event, item, '.fs-draggable-item')"
|
|
334
|
-
@dragleave="onDragLeave"
|
|
335
|
-
@dragover.prevent
|
|
336
|
-
>
|
|
337
|
-
<slot
|
|
338
|
-
name="item.iterator"
|
|
339
|
-
v-bind="{ item, index }"
|
|
340
|
-
>
|
|
267
|
+
<template v-for="(item, index) in items">
|
|
268
|
+
<slot name="item.iterator" v-bind="{ item, index }">
|
|
341
269
|
<FSDataIteratorItem
|
|
342
270
|
v-if="item.type === 'item'"
|
|
271
|
+
:key="index"
|
|
272
|
+
:item="item.raw"
|
|
273
|
+
:color="$props.color"
|
|
274
|
+
:itemTo="$props.itemTo"
|
|
275
|
+
:showSelect="$props.showSelect"
|
|
343
276
|
:headers="innerHeaders.filter(h => !$props.sneakyHeaders.includes(h.value))"
|
|
344
277
|
:modelValue="innerValue.includes(item.raw[$props.itemValue])"
|
|
345
|
-
:showSelect="$props.showSelect"
|
|
346
|
-
:itemTo="$props.itemTo"
|
|
347
|
-
:color="$props.color"
|
|
348
|
-
:item="item.raw"
|
|
349
|
-
:key="index"
|
|
350
278
|
@update:modelValue="toggleSelect"
|
|
351
279
|
>
|
|
352
280
|
<template #[`item.top`]="props">
|
|
353
|
-
<slot
|
|
354
|
-
name="item.top"
|
|
355
|
-
v-bind="props"
|
|
356
|
-
/>
|
|
281
|
+
<slot name="item.top" v-bind="props" />
|
|
357
282
|
</template>
|
|
358
|
-
<template
|
|
359
|
-
|
|
360
|
-
#[item.slotName]="props"
|
|
361
|
-
>
|
|
362
|
-
<slot
|
|
363
|
-
:name="item.slotName"
|
|
364
|
-
v-bind="props"
|
|
365
|
-
>
|
|
283
|
+
<template v-for="(item, index) in itemsSlots" #[item.slotName]="props">
|
|
284
|
+
<slot :name="item.slotName" v-bind="props">
|
|
366
285
|
<FSText
|
|
367
286
|
:key="index"
|
|
368
287
|
>
|
|
@@ -371,14 +290,11 @@
|
|
|
371
290
|
</slot>
|
|
372
291
|
</template>
|
|
373
292
|
<template #[`item.bottom`]="props">
|
|
374
|
-
<slot
|
|
375
|
-
name="item.bottom"
|
|
376
|
-
v-bind="props"
|
|
377
|
-
/>
|
|
293
|
+
<slot name="item.bottom" v-bind="props" />
|
|
378
294
|
</template>
|
|
379
295
|
</FSDataIteratorItem>
|
|
380
296
|
</slot>
|
|
381
|
-
</
|
|
297
|
+
</template>
|
|
382
298
|
</FSCol>
|
|
383
299
|
</template>
|
|
384
300
|
<template #footer>
|
|
@@ -452,48 +368,24 @@
|
|
|
452
368
|
<template #default="{ items }">
|
|
453
369
|
<FSRow
|
|
454
370
|
width="hug"
|
|
455
|
-
class="fs-data-iterator-container"
|
|
456
371
|
>
|
|
457
|
-
<
|
|
458
|
-
v-
|
|
459
|
-
elementSelector=".fs-draggable-item"
|
|
460
|
-
:disabled="draggableDisabled"
|
|
461
|
-
:item="item"
|
|
462
|
-
:key="index"
|
|
463
|
-
@update:dragend="(event, dragged) => onDragEnd(event, dragged, '.fs-data-iterator-container')"
|
|
464
|
-
@dragover="onDragOver($event, '.fs-draggable-item', '.fs-data-iterator-container')"
|
|
465
|
-
@drop="(event) => onDrop(event, item, '.fs-draggable-item')"
|
|
466
|
-
@dragleave="onDragLeave"
|
|
467
|
-
@dragover.prevent
|
|
468
|
-
>
|
|
469
|
-
<slot
|
|
470
|
-
name="item.tile"
|
|
471
|
-
v-bind="{ index, item: item.raw, toggleSelect }"
|
|
472
|
-
>
|
|
372
|
+
<template v-for="(item, index) in items.filter((item) => item.type === 'item')">
|
|
373
|
+
<slot name="item.tile" v-bind="{ index, item: item.raw, toggleSelect }">
|
|
473
374
|
<FSDataIteratorItem
|
|
375
|
+
:key="index"
|
|
376
|
+
:item="item.raw"
|
|
377
|
+
:color="$props.color"
|
|
378
|
+
:itemTo="$props.itemTo"
|
|
379
|
+
:showSelect="$props.showSelect"
|
|
474
380
|
:headers="innerHeaders.filter(h => !$props.sneakyHeaders.includes(h.value))"
|
|
475
381
|
:modelValue="innerValue.includes(item.raw[$props.itemValue])"
|
|
476
|
-
:showSelect="$props.showSelect"
|
|
477
|
-
:itemTo="$props.itemTo"
|
|
478
|
-
:color="$props.color"
|
|
479
|
-
:item="item.raw"
|
|
480
|
-
:key="index"
|
|
481
382
|
@update:modelValue="toggleSelect"
|
|
482
383
|
>
|
|
483
384
|
<template #[`item.top`]="props">
|
|
484
|
-
<slot
|
|
485
|
-
name="item.top"
|
|
486
|
-
v-bind="props"
|
|
487
|
-
/>
|
|
385
|
+
<slot name="item.top" v-bind="props" />
|
|
488
386
|
</template>
|
|
489
|
-
<template
|
|
490
|
-
|
|
491
|
-
#[item.slotName]="props"
|
|
492
|
-
>
|
|
493
|
-
<slot
|
|
494
|
-
:name="item.slotName"
|
|
495
|
-
v-bind="props"
|
|
496
|
-
>
|
|
387
|
+
<template v-for="(item, index) in itemsSlots" #[item.slotName]="props">
|
|
388
|
+
<slot :name="item.slotName" v-bind="props">
|
|
497
389
|
<FSText
|
|
498
390
|
:key="index"
|
|
499
391
|
>
|
|
@@ -502,14 +394,11 @@
|
|
|
502
394
|
</slot>
|
|
503
395
|
</template>
|
|
504
396
|
<template #[`item.bottom`]="props">
|
|
505
|
-
<slot
|
|
506
|
-
name="item.bottom"
|
|
507
|
-
v-bind="props"
|
|
508
|
-
/>
|
|
397
|
+
<slot name="item.bottom" v-bind="props" />
|
|
509
398
|
</template>
|
|
510
399
|
</FSDataIteratorItem>
|
|
511
400
|
</slot>
|
|
512
|
-
</
|
|
401
|
+
</template>
|
|
513
402
|
</FSRow>
|
|
514
403
|
</template>
|
|
515
404
|
</v-data-iterator>
|
|
@@ -532,13 +421,11 @@ import FSSelectField from "../fields/FSSelectField.vue";
|
|
|
532
421
|
import FSFilterButton from "./FSFilterButton.vue";
|
|
533
422
|
import FSHiddenButton from "./FSHiddenButton.vue";
|
|
534
423
|
import FSHeaderButton from "./FSHeaderButton.vue";
|
|
535
|
-
import
|
|
424
|
+
import FSContainer from "../FSContainer.vue";
|
|
536
425
|
import FSToggleSet from "../FSToggleSet.vue";
|
|
537
|
-
import FSDraggable from "./FSDraggable.vue";
|
|
538
426
|
import FSCheckbox from "../FSCheckbox.vue";
|
|
539
427
|
import FSCard from "../FSCard.vue";
|
|
540
428
|
import FSChip from "../FSChip.vue";
|
|
541
|
-
import FSIcon from "../FSIcon.vue";
|
|
542
429
|
import FSText from "../FSText.vue";
|
|
543
430
|
import FSRow from "../FSRow.vue";
|
|
544
431
|
import FSCol from "../FSCol.vue";
|
|
@@ -552,13 +439,11 @@ export default defineComponent({
|
|
|
552
439
|
FSHeaderButton,
|
|
553
440
|
FSSearchField,
|
|
554
441
|
FSSelectField,
|
|
555
|
-
|
|
556
|
-
FSDraggable,
|
|
442
|
+
FSContainer,
|
|
557
443
|
FSToggleSet,
|
|
558
444
|
FSCheckbox,
|
|
559
445
|
FSCard,
|
|
560
446
|
FSChip,
|
|
561
|
-
FSIcon,
|
|
562
447
|
FSText,
|
|
563
448
|
FSRow,
|
|
564
449
|
FSCol
|
|
@@ -656,19 +541,9 @@ export default defineComponent({
|
|
|
656
541
|
type: Number,
|
|
657
542
|
required: false,
|
|
658
543
|
default: 20
|
|
659
|
-
},
|
|
660
|
-
sortDraggable: {
|
|
661
|
-
type: Boolean,
|
|
662
|
-
required: false,
|
|
663
|
-
default: false
|
|
664
|
-
},
|
|
665
|
-
includeDraggable: {
|
|
666
|
-
type: Boolean,
|
|
667
|
-
required: false,
|
|
668
|
-
default: false
|
|
669
544
|
}
|
|
670
545
|
},
|
|
671
|
-
emits: ["update:modelValue", "update:headers", "update:filters", "update:mode", "update:sortBy", "update:rowsPerPage", "update:page", "
|
|
546
|
+
emits: ["update:modelValue", "update:headers", "update:filters", "update:mode", "update:sortBy", "update:rowsPerPage", "update:page", "click:row"],
|
|
672
547
|
setup(props, { emit }) {
|
|
673
548
|
const { isExtraSmall } = useBreakpoints();
|
|
674
549
|
const { $tr } = useTranslationsProvider();
|
|
@@ -708,8 +583,6 @@ export default defineComponent({
|
|
|
708
583
|
delete slots["no-data"];
|
|
709
584
|
delete slots["header.data-table-select"];
|
|
710
585
|
delete slots["item.data-table-select"];
|
|
711
|
-
delete slots["header.data-table-draggable"];
|
|
712
|
-
delete slots["item.data-table-draggable"];
|
|
713
586
|
delete slots["header.data-table-group"];
|
|
714
587
|
delete slots["item.data-table-group"];
|
|
715
588
|
delete slots["group-header"];
|
|
@@ -733,8 +606,8 @@ export default defineComponent({
|
|
|
733
606
|
|
|
734
607
|
const style = computed((): { [code: string]: string } & Partial<CSSStyleDeclaration> => {
|
|
735
608
|
return {
|
|
736
|
-
"--fs-data-table-background-color": backgrounds.base,
|
|
737
|
-
"--fs-data-table-border-color": lights.base
|
|
609
|
+
"--fs-data-table-background-color" : backgrounds.base,
|
|
610
|
+
"--fs-data-table-border-color" : lights.base
|
|
738
611
|
};
|
|
739
612
|
});
|
|
740
613
|
|
|
@@ -747,19 +620,13 @@ export default defineComponent({
|
|
|
747
620
|
});
|
|
748
621
|
|
|
749
622
|
const extraHeaders = computed((): any[] => {
|
|
750
|
-
const extra
|
|
623
|
+
const extra = [];
|
|
751
624
|
if (props.groupBy) {
|
|
752
625
|
extra.push({
|
|
753
626
|
key: "data-table-group",
|
|
754
627
|
width: "0%"
|
|
755
628
|
});
|
|
756
629
|
}
|
|
757
|
-
if (props.sortDraggable || props.includeDraggable) {
|
|
758
|
-
extra.push({
|
|
759
|
-
key: "data-table-draggable",
|
|
760
|
-
width: "0%"
|
|
761
|
-
});
|
|
762
|
-
}
|
|
763
630
|
if (props.showSelect) {
|
|
764
631
|
extra.push({
|
|
765
632
|
key: "data-table-select",
|
|
@@ -849,31 +716,6 @@ export default defineComponent({
|
|
|
849
716
|
}
|
|
850
717
|
});
|
|
851
718
|
|
|
852
|
-
const onClickRow = computed(() => {
|
|
853
|
-
if (!!getCurrentInstance()?.vnode.props?.["onClick:row"] || props.itemTo) {
|
|
854
|
-
return (event: PointerEvent, row: any) => {
|
|
855
|
-
if (props.itemTo && router) {
|
|
856
|
-
if (event.metaKey || event.ctrlKey || event.button === 1) {
|
|
857
|
-
window.open(router.resolve(props.itemTo(row.item)).href, "_blank");
|
|
858
|
-
}
|
|
859
|
-
else {
|
|
860
|
-
router.push(props.itemTo(row.item));
|
|
861
|
-
}
|
|
862
|
-
}
|
|
863
|
-
else {
|
|
864
|
-
emit("click:row", row.item);
|
|
865
|
-
}
|
|
866
|
-
};
|
|
867
|
-
}
|
|
868
|
-
else {
|
|
869
|
-
return null;
|
|
870
|
-
}
|
|
871
|
-
});
|
|
872
|
-
|
|
873
|
-
const draggableDisabled = computed(() => {
|
|
874
|
-
return (!props.sortDraggable && !props.includeDraggable) || !(innerSortBy.value === null || innerSortBy.value === undefined);
|
|
875
|
-
});
|
|
876
|
-
|
|
877
719
|
const toggleSelectAll = (allSelected: boolean): void => {
|
|
878
720
|
if (allSelected) {
|
|
879
721
|
innerValue.value = [];
|
|
@@ -1033,11 +875,11 @@ export default defineComponent({
|
|
|
1033
875
|
if (!intersectionObserver.value) {
|
|
1034
876
|
intersectionObserver.value = new IntersectionObserver(entries => {
|
|
1035
877
|
entries.forEach((entry) => {
|
|
1036
|
-
|
|
1037
|
-
|
|
1038
|
-
|
|
878
|
+
if (entry.boundingClientRect.bottom < window.innerHeight * 1.25) {
|
|
879
|
+
if (innerItems.value.length > size.value) {
|
|
880
|
+
size.value = Math.min(size.value + props.sizeIterator, innerItems.value.length);
|
|
881
|
+
}
|
|
1039
882
|
}
|
|
1040
|
-
}
|
|
1041
883
|
});
|
|
1042
884
|
}, { threshold: [0.9] });
|
|
1043
885
|
}
|
|
@@ -1048,111 +890,26 @@ export default defineComponent({
|
|
|
1048
890
|
}
|
|
1049
891
|
}
|
|
1050
892
|
|
|
1051
|
-
const
|
|
1052
|
-
if (
|
|
1053
|
-
return
|
|
1054
|
-
|
|
1055
|
-
|
|
1056
|
-
|
|
1057
|
-
items.splice(newIndex, 0, itemToMove);
|
|
1058
|
-
return items;
|
|
1059
|
-
};
|
|
1060
|
-
|
|
1061
|
-
const resetRowIndex = (initialIndex: number, currentIndex: number, draggedElement: HTMLElement, tbodyElement: HTMLElement) => {
|
|
1062
|
-
if (initialIndex > currentIndex) {
|
|
1063
|
-
tbodyElement.children[initialIndex].insertAdjacentElement("afterend", draggedElement);
|
|
1064
|
-
}
|
|
1065
|
-
else {
|
|
1066
|
-
tbodyElement.children[initialIndex].insertAdjacentElement("beforebegin", draggedElement);
|
|
1067
|
-
}
|
|
1068
|
-
};
|
|
1069
|
-
|
|
1070
|
-
const onDragOver = (event: DragEvent, elementSelector: string, elementContainerSelector: string) => {
|
|
1071
|
-
const dragged = document.querySelector(".fs-draggable-dragging") as HTMLElement;
|
|
1072
|
-
|
|
1073
|
-
if (dragged != null) {
|
|
1074
|
-
const target = (event.target as HTMLElement)?.closest(elementSelector);
|
|
1075
|
-
|
|
1076
|
-
if (target != null) {
|
|
1077
|
-
if (props.includeDraggable) {
|
|
1078
|
-
if (!props.sortDraggable) {
|
|
1079
|
-
target.classList.add("fs-dropzone-include");
|
|
1080
|
-
}
|
|
1081
|
-
else {
|
|
1082
|
-
const rowHeight = target.clientHeight;
|
|
1083
|
-
const y = event.clientY - target.getBoundingClientRect().top;
|
|
1084
|
-
|
|
1085
|
-
if (y > rowHeight * (3 / 4)) {
|
|
1086
|
-
target.insertAdjacentElement("afterend", dragged);
|
|
1087
|
-
target.classList.remove("fs-dropzone-include");
|
|
1088
|
-
}
|
|
1089
|
-
else if (y < rowHeight * (1 / 4)) {
|
|
1090
|
-
target.insertAdjacentElement("beforebegin", dragged);
|
|
1091
|
-
target.classList.remove("fs-dropzone-include");
|
|
1092
|
-
}
|
|
1093
|
-
else if (dragged?.getAttribute("data-initial-index") !== null) {
|
|
1094
|
-
target.classList.add("fs-dropzone-include");
|
|
1095
|
-
const tbodyElement = (event.target as HTMLElement)?.closest(elementContainerSelector) as HTMLElement;
|
|
1096
|
-
resetRowIndex(+dragged?.getAttribute('data-initial-index'), Array.from(tbodyElement.children).indexOf(dragged), dragged, tbodyElement);
|
|
1097
|
-
}
|
|
1098
|
-
}
|
|
1099
|
-
}
|
|
1100
|
-
else if (props.sortDraggable) {
|
|
1101
|
-
const rowHeight = target.clientHeight;
|
|
1102
|
-
const y = event.clientY - target.getBoundingClientRect().top;
|
|
1103
|
-
if (y > rowHeight / 2) {
|
|
1104
|
-
target.insertAdjacentElement("afterend", dragged);
|
|
893
|
+
const onClickRow = computed(() => {
|
|
894
|
+
if (!!getCurrentInstance()?.vnode.props?.['onClick:row'] || props.itemTo) {
|
|
895
|
+
return (event: PointerEvent, row: any) => {
|
|
896
|
+
if (props.itemTo && router) {
|
|
897
|
+
if (event.metaKey || event.ctrlKey || event.button === 1) {
|
|
898
|
+
window.open(router.resolve(props.itemTo(row.item)).href, "_blank");
|
|
1105
899
|
}
|
|
1106
900
|
else {
|
|
1107
|
-
|
|
901
|
+
router.push(props.itemTo(row.item));
|
|
1108
902
|
}
|
|
1109
903
|
}
|
|
1110
|
-
|
|
1111
|
-
|
|
1112
|
-
}
|
|
1113
|
-
};
|
|
1114
|
-
|
|
1115
|
-
const onDragLeave = (event: DragEvent) => {
|
|
1116
|
-
const dropzone = (event.target as HTMLElement)?.closest(".fs-dropzone-include");
|
|
1117
|
-
if (dropzone && !(event.relatedTarget as HTMLElement)?.closest(".fs-dropzone-include")) {
|
|
1118
|
-
dropzone.classList.remove("fs-dropzone-include");
|
|
1119
|
-
}
|
|
1120
|
-
};
|
|
1121
|
-
|
|
1122
|
-
const onDragEnd = (event: DragEvent, draggedElement: HTMLElement, elementContainerSelector: string) => {
|
|
1123
|
-
const initialIndex = +(draggedElement.getAttribute("data-initial-index") ?? -1);
|
|
1124
|
-
|
|
1125
|
-
if (draggedElement != null && initialIndex !== -1) {
|
|
1126
|
-
if (props.sortDraggable) {
|
|
1127
|
-
const tbodyElement = (event.target as HTMLElement)?.closest(elementContainerSelector) as HTMLElement;
|
|
1128
|
-
const currentIndex = Array.from(tbodyElement.children).indexOf(draggedElement);
|
|
1129
|
-
const newItems = changeIndex(initialIndex, currentIndex);
|
|
1130
|
-
|
|
1131
|
-
if (newItems !== null && newItems !== undefined) {
|
|
1132
|
-
emit("update:items", newItems);
|
|
904
|
+
else {
|
|
905
|
+
emit("click:row", row.item);
|
|
1133
906
|
}
|
|
1134
|
-
|
|
1135
|
-
}
|
|
907
|
+
};
|
|
1136
908
|
}
|
|
1137
|
-
|
|
1138
|
-
|
|
1139
|
-
const onDrop = (event: DragEvent, row: any, elementSelector: string) => {
|
|
1140
|
-
const draggedElement = document.querySelector(".fs-draggable-dragging");
|
|
1141
|
-
|
|
1142
|
-
if (draggedElement != null) {
|
|
1143
|
-
const target = (event.target as HTMLElement)?.closest(elementSelector);
|
|
1144
|
-
const draggedData = JSON.parse(event.dataTransfer?.getData("text/plain") ?? "");
|
|
1145
|
-
const itemsData = draggedData.item ?? draggedData.raw;
|
|
1146
|
-
const rowData = row.item ?? row.raw;
|
|
1147
|
-
|
|
1148
|
-
if (target != null) {
|
|
1149
|
-
if (props.includeDraggable && itemsData[props.itemValue] != rowData[props.itemValue]) {
|
|
1150
|
-
emit("update:include", { draggedItem: itemsData, targetItem: rowData })
|
|
1151
|
-
}
|
|
1152
|
-
target.closest(".fs-dropzone-include")?.classList.remove("fs-dropzone-include");
|
|
1153
|
-
}
|
|
909
|
+
else {
|
|
910
|
+
return null;
|
|
1154
911
|
}
|
|
1155
|
-
};
|
|
912
|
+
});
|
|
1156
913
|
|
|
1157
914
|
onMounted(() => {
|
|
1158
915
|
computeFilters();
|
|
@@ -1218,7 +975,6 @@ export default defineComponent({
|
|
|
1218
975
|
size,
|
|
1219
976
|
onClickRow,
|
|
1220
977
|
isExtraSmall,
|
|
1221
|
-
draggableDisabled,
|
|
1222
978
|
toggleSelectAll,
|
|
1223
979
|
toggleSelect,
|
|
1224
980
|
updateHeader,
|
|
@@ -1227,10 +983,6 @@ export default defineComponent({
|
|
|
1227
983
|
filterSlot,
|
|
1228
984
|
sortColor,
|
|
1229
985
|
sortIcon,
|
|
1230
|
-
onDrop,
|
|
1231
|
-
onDragOver,
|
|
1232
|
-
onDragLeave,
|
|
1233
|
-
onDragEnd
|
|
1234
986
|
};
|
|
1235
987
|
}
|
|
1236
988
|
})
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dative-gpi/foundation-shared-components",
|
|
3
3
|
"sideEffects": false,
|
|
4
|
-
"version": "0.0.
|
|
4
|
+
"version": "0.0.43",
|
|
5
5
|
"description": "",
|
|
6
6
|
"publishConfig": {
|
|
7
7
|
"access": "public"
|
|
@@ -10,8 +10,8 @@
|
|
|
10
10
|
"author": "",
|
|
11
11
|
"license": "ISC",
|
|
12
12
|
"dependencies": {
|
|
13
|
-
"@dative-gpi/foundation-shared-domain": "0.0.
|
|
14
|
-
"@dative-gpi/foundation-shared-services": "0.0.
|
|
13
|
+
"@dative-gpi/foundation-shared-domain": "0.0.43",
|
|
14
|
+
"@dative-gpi/foundation-shared-services": "0.0.43",
|
|
15
15
|
"@fontsource/montserrat": "^5.0.16",
|
|
16
16
|
"@lexical/clipboard": "^0.12.5",
|
|
17
17
|
"@lexical/history": "^0.12.5",
|
|
@@ -32,5 +32,5 @@
|
|
|
32
32
|
"sass": "^1.69.5",
|
|
33
33
|
"sass-loader": "^13.3.2"
|
|
34
34
|
},
|
|
35
|
-
"gitHead": "
|
|
35
|
+
"gitHead": "69165444c1ca673a3f96fc7e7fb00a13e6bc1dfc"
|
|
36
36
|
}
|
|
@@ -1,177 +0,0 @@
|
|
|
1
|
-
<template>
|
|
2
|
-
<div
|
|
3
|
-
:draggable="!$props.disabled"
|
|
4
|
-
:class="classes"
|
|
5
|
-
@touchstart="onTouchStart"
|
|
6
|
-
@touchmove="onTouchMove"
|
|
7
|
-
@touchend="onTouchEnd"
|
|
8
|
-
@dragstart="onDragStart"
|
|
9
|
-
@dragend="onDragEnd"
|
|
10
|
-
@dragover.prevent
|
|
11
|
-
>
|
|
12
|
-
<slot />
|
|
13
|
-
</div>
|
|
14
|
-
</template>
|
|
15
|
-
|
|
16
|
-
<script lang="ts">
|
|
17
|
-
import { computed, defineComponent, ref } from "vue";
|
|
18
|
-
|
|
19
|
-
export default defineComponent({
|
|
20
|
-
name: "FSDraggable",
|
|
21
|
-
props: {
|
|
22
|
-
elementSelector: {
|
|
23
|
-
type: String,
|
|
24
|
-
default: null,
|
|
25
|
-
},
|
|
26
|
-
item: {
|
|
27
|
-
type: Object,
|
|
28
|
-
default: null,
|
|
29
|
-
},
|
|
30
|
-
disabled: {
|
|
31
|
-
type: Boolean,
|
|
32
|
-
default: false,
|
|
33
|
-
},
|
|
34
|
-
},
|
|
35
|
-
emits: ["update:dragstart", "update:dragend"],
|
|
36
|
-
setup(props, { emit }) {
|
|
37
|
-
let prevDragOverTarget: EventTarget | null = null;
|
|
38
|
-
|
|
39
|
-
const draggedElementCopy = ref<HTMLElement|null>(null);
|
|
40
|
-
const touchStartX = ref(0);
|
|
41
|
-
const touchStartY = ref(0);
|
|
42
|
-
const touchEndX = ref(0);
|
|
43
|
-
const touchEndY = ref(0);
|
|
44
|
-
|
|
45
|
-
const classes = computed((): string[] => {
|
|
46
|
-
const classNames = ["fs-draggable-item"];
|
|
47
|
-
if (!props.disabled) {
|
|
48
|
-
classNames.push("fs-draggable-enabled");
|
|
49
|
-
}
|
|
50
|
-
return classNames;
|
|
51
|
-
});
|
|
52
|
-
|
|
53
|
-
const onTouchStart = (event: TouchEvent) => {
|
|
54
|
-
if (props.disabled) {
|
|
55
|
-
return;
|
|
56
|
-
}
|
|
57
|
-
event.preventDefault();
|
|
58
|
-
const touch = event.touches[0];
|
|
59
|
-
touchStartX.value = touch.clientX;
|
|
60
|
-
touchStartY.value = touch.clientY;
|
|
61
|
-
|
|
62
|
-
const dragged = (event.target as HTMLElement)?.closest(props.elementSelector) as HTMLElement;
|
|
63
|
-
dragged.classList.add("fs-draggable-dragging");
|
|
64
|
-
dragged.dataset.initialIndex = props.item?.index ?? props.item?.value;
|
|
65
|
-
|
|
66
|
-
draggedElementCopy.value = dragged.cloneNode(true) as HTMLElement;
|
|
67
|
-
draggedElementCopy.value.style.position = "fixed";
|
|
68
|
-
draggedElementCopy.value.style.left = `${touchStartX.value - 25}px`;
|
|
69
|
-
draggedElementCopy.value.style.top = `${touchStartY.value - 25}px`;
|
|
70
|
-
draggedElementCopy.value.style.zIndex = "1000";
|
|
71
|
-
draggedElementCopy.value.style.pointerEvents = "none";
|
|
72
|
-
};
|
|
73
|
-
|
|
74
|
-
const onTouchMove = (event: TouchEvent) => {
|
|
75
|
-
if (props.disabled) {
|
|
76
|
-
return;
|
|
77
|
-
}
|
|
78
|
-
event.preventDefault();
|
|
79
|
-
const touch = event.touches[0];
|
|
80
|
-
touchEndX.value = touch.clientX;
|
|
81
|
-
touchEndY.value = touch.clientY;
|
|
82
|
-
|
|
83
|
-
draggedElementCopy.value.style.left = `${touchEndX.value - 25}px`;
|
|
84
|
-
draggedElementCopy.value.style.top = `${touchEndY.value - 25}px`;
|
|
85
|
-
document.body.appendChild(draggedElementCopy.value);
|
|
86
|
-
const dragOverTarget = document.elementFromPoint(touchEndX.value, touchEndY.value)?.closest(props.elementSelector);
|
|
87
|
-
|
|
88
|
-
if (dragOverTarget) {
|
|
89
|
-
const dragOverEvent = new Event("dragover", {
|
|
90
|
-
bubbles: true,
|
|
91
|
-
cancelable: true
|
|
92
|
-
});
|
|
93
|
-
dragOverTarget?.dispatchEvent(dragOverEvent);
|
|
94
|
-
if (dragOverTarget !== prevDragOverTarget) {
|
|
95
|
-
const dragLeaveEvent = new Event("dragleave", {
|
|
96
|
-
bubbles: true,
|
|
97
|
-
cancelable: true
|
|
98
|
-
});
|
|
99
|
-
prevDragOverTarget?.dispatchEvent(dragLeaveEvent);
|
|
100
|
-
}
|
|
101
|
-
prevDragOverTarget = dragOverTarget;
|
|
102
|
-
}
|
|
103
|
-
else if (prevDragOverTarget) {
|
|
104
|
-
const dragLeaveEvent = new Event("dragleave", {
|
|
105
|
-
bubbles: true,
|
|
106
|
-
cancelable: true
|
|
107
|
-
});
|
|
108
|
-
prevDragOverTarget?.dispatchEvent(dragLeaveEvent);
|
|
109
|
-
prevDragOverTarget = null;
|
|
110
|
-
}
|
|
111
|
-
};
|
|
112
|
-
|
|
113
|
-
const onTouchEnd = (event: TouchEvent) => {
|
|
114
|
-
if (props.disabled) {
|
|
115
|
-
return;
|
|
116
|
-
}
|
|
117
|
-
event.preventDefault();
|
|
118
|
-
const dragged = (event.target as HTMLElement)?.closest(props.elementSelector);
|
|
119
|
-
draggedElementCopy.value.remove();
|
|
120
|
-
draggedElementCopy.value = null;
|
|
121
|
-
|
|
122
|
-
const dropTarget = document.elementFromPoint(touchEndX.value, touchEndY.value);
|
|
123
|
-
const dragEndEvent = new Event("dragend");
|
|
124
|
-
Object.defineProperty(dragEndEvent, "srcElement", {
|
|
125
|
-
get: function () { return event.target; }
|
|
126
|
-
});
|
|
127
|
-
emit("update:dragend", dragEndEvent, dragged);
|
|
128
|
-
|
|
129
|
-
const dropEvent = new DragEvent("drop", {
|
|
130
|
-
bubbles: true,
|
|
131
|
-
cancelable: true,
|
|
132
|
-
});
|
|
133
|
-
dropEvent.dataTransfer?.setData("text/plain", JSON.stringify(props.item));
|
|
134
|
-
dropTarget?.dispatchEvent(dropEvent);
|
|
135
|
-
|
|
136
|
-
touchStartX.value = 0;
|
|
137
|
-
touchStartY.value = 0;
|
|
138
|
-
touchEndX.value = 0;
|
|
139
|
-
touchEndY.value = 0;
|
|
140
|
-
dragged.classList.remove("fs-draggable-dragging");
|
|
141
|
-
};
|
|
142
|
-
|
|
143
|
-
const onDragStart = (event: DragEvent) => {
|
|
144
|
-
if (props.disabled) {
|
|
145
|
-
event.preventDefault();
|
|
146
|
-
return;
|
|
147
|
-
}
|
|
148
|
-
const dragged = (event.target as HTMLElement)?.closest(props.elementSelector) as HTMLElement;
|
|
149
|
-
dragged.dataset.initialIndex = props.item?.index ?? props.item?.value;
|
|
150
|
-
event.dataTransfer?.setDragImage(dragged, 25, 25);
|
|
151
|
-
|
|
152
|
-
if (event.dataTransfer) {
|
|
153
|
-
event.dataTransfer.dropEffect = "move";
|
|
154
|
-
event.dataTransfer.effectAllowed = "move";
|
|
155
|
-
}
|
|
156
|
-
dragged?.classList.add("fs-draggable-dragging");
|
|
157
|
-
event.dataTransfer?.setData("text/plain", JSON.stringify(props.item));
|
|
158
|
-
emit("update:dragstart", event);
|
|
159
|
-
};
|
|
160
|
-
|
|
161
|
-
const onDragEnd = (event: DragEvent) => {
|
|
162
|
-
const dragged = (event.target as HTMLElement)?.closest(props.elementSelector);
|
|
163
|
-
dragged?.classList.remove("fs-draggable-dragging");
|
|
164
|
-
emit("update:dragend", event, dragged);
|
|
165
|
-
};
|
|
166
|
-
|
|
167
|
-
return {
|
|
168
|
-
classes,
|
|
169
|
-
onTouchStart,
|
|
170
|
-
onTouchMove,
|
|
171
|
-
onTouchEnd,
|
|
172
|
-
onDragStart,
|
|
173
|
-
onDragEnd
|
|
174
|
-
};
|
|
175
|
-
},
|
|
176
|
-
});
|
|
177
|
-
</script>
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
.fs-draggable-dragging {
|
|
2
|
-
opacity: 0.4;
|
|
3
|
-
filter: blur(1px);
|
|
4
|
-
}
|
|
5
|
-
|
|
6
|
-
.fs-dropzone-include {
|
|
7
|
-
transition: all 0.28s cubic-bezier(0.4, 0, 0.2, 1);
|
|
8
|
-
filter: brightness(0.85) contrast(1.1);
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
.fs-draggable-item {
|
|
12
|
-
transition: all 0.28s cubic-bezier(0.4, 0, 0.2, 1);
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
div.fs-dropzone-include {
|
|
16
|
-
transform: scale(1.04);
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
.fs-draggable-enabled {
|
|
20
|
-
cursor: move ;
|
|
21
|
-
cursor: grab ;
|
|
22
|
-
cursor: -moz-grab ;
|
|
23
|
-
cursor: -webkit-grab ;
|
|
24
|
-
user-select: none;
|
|
25
|
-
}
|