@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.
@@ -2,7 +2,7 @@
2
2
  <FSCard
3
3
  class="fs-data-iterator-item"
4
4
  padding="12px"
5
- width="100%"
5
+ width="50%"
6
6
  >
7
7
  <FSCol>
8
8
  <slot name="item.top" v-bind="{ item: $props.item }" />
@@ -17,7 +17,7 @@
17
17
  />
18
18
  <slot name="toolbar" />
19
19
  <v-spacer />
20
- <FSOptionGroup
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="!$props.sortDraggable"
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
- name="group-header"
163
- v-bind="props"
128
+ <slot name="group-header" v-bind="props">
129
+ <FSCard
130
+ padding="12px 16px"
164
131
  >
165
- <FSCard
166
- padding="12px 16px"
132
+ <FSRow
133
+ align="center-left"
134
+ width="hug"
167
135
  >
168
- <FSRow
169
- align="center-left"
170
- width="hug"
171
- >
172
- <FSText>
173
- <slot
174
- name="group-header-title"
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
- v-for="(header, index) in headersSlots"
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
- v-for="(item, index) in itemsSlots"
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-for="(_, name) in innerSlots"
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
- <FSDraggable
326
- v-for="(item, index) in items"
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
- v-for="(item, index) in itemsSlots"
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
- </FSDraggable>
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
- <FSDraggable
458
- v-for="(item, index) in items.filter((item) => item.type === 'item')"
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
- v-for="(item, index) in itemsSlots"
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
- </FSDraggable>
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 FSOptionGroup from "../FSOptionGroup.vue";
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
- FSOptionGroup,
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", "update:include", "update:items", "click:row"],
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: { key: string, width: string }[] = [];
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
- if (entry.boundingClientRect.bottom < window.innerHeight * 1.25) {
1037
- if (innerItems.value.length > size.value) {
1038
- size.value = Math.min(size.value + props.sizeIterator, innerItems.value.length);
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 changeIndex = (oldIndex: number, newIndex: number) => {
1052
- if (oldIndex === newIndex) {
1053
- return;
1054
- }
1055
- const items = innerItems.value.slice();
1056
- const itemToMove = items.splice(oldIndex, 1)[0];
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
- target.insertAdjacentElement("beforebegin", dragged);
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
- resetRowIndex(initialIndex, currentIndex, draggedElement, tbodyElement);
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.42",
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.42",
14
- "@dative-gpi/foundation-shared-services": "0.0.42",
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": "b04bea74796441bbb7176bcdd7d1a23317faa2b8"
35
+ "gitHead": "69165444c1ca673a3f96fc7e7fb00a13e6bc1dfc"
36
36
  }
@@ -99,4 +99,4 @@
99
99
  margin-top: -8px;
100
100
  height: 10px;
101
101
  width: 100%;
102
- }
102
+ }
@@ -19,7 +19,6 @@
19
19
  @import "fs_date_field.scss";
20
20
  @import "fs_dialog.scss";
21
21
  @import "fs_divider.scss";
22
- @import "fs_draggable.scss";
23
22
  @import "fs_error_toast.scss";
24
23
  @import "fs_fade_out.scss";
25
24
  @import "fs_filter_button.scss";
@@ -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
- }