Skip to content

Commit 7c66570

Browse files
committed
it works!
1 parent 4705797 commit 7c66570

File tree

2 files changed

+41
-5
lines changed

2 files changed

+41
-5
lines changed

packages/gui/src/components/FieldArray.tsx

Lines changed: 35 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1+
import produce from 'immer'
12
import { useState } from 'react'
2-
import { flip, replace, remove } from '../lib/array'
3+
import { flip, replace, remove, insert } from '../lib/array'
34
import { EditorPropsWithLabel } from '../types/editor'
45
import { SchemaInput } from './inputs/SchemaInput'
56
import { DataTypeSchema } from './schemas/types'
@@ -27,12 +28,27 @@ export default function FieldArray<T>(props: FieldArrayProps<T>) {
2728
onChange(flip(value, i1, i2))
2829
}
2930

31+
const handleDragDrop = (i1: number, i2: number) => {
32+
const item = value[i1]
33+
const removed = remove(value, i1)
34+
if (i2 > i1) i2--
35+
const final = insert(removed, i2, item)
36+
onChange(final)
37+
}
38+
3039
return (
3140
<div sx={{ display: 'grid', gap: 2 }}>
3241
{value.map((item, i) => {
3342
return (
3443
<div>
35-
{isDragging && <DropZone />}
44+
{isDragging && (
45+
<DropZone
46+
onDrop={() => {
47+
handleDragDrop(dragIndex, i)
48+
setDragIndex(-1)
49+
}}
50+
/>
51+
)}
3652
<div
3753
key={i}
3854
sx={{
@@ -76,6 +92,14 @@ export default function FieldArray<T>(props: FieldArrayProps<T>) {
7692
</div>
7793
)
7894
})}
95+
{isDragging && (
96+
<DropZone
97+
onDrop={() => {
98+
handleDragDrop(dragIndex, value.length)
99+
setDragIndex(-1)
100+
}}
101+
/>
102+
)}
79103
<button
80104
onClick={() => {
81105
onChange(value.concat([itemSchema.defaultValue]))
@@ -100,9 +124,11 @@ export default function FieldArray<T>(props: FieldArrayProps<T>) {
100124
)
101125
}
102126

103-
interface DropZoneProps {}
127+
interface DropZoneProps {
128+
onDrop(): void
129+
}
104130

105-
function DropZone() {
131+
function DropZone({ onDrop }: DropZoneProps) {
106132
const [hovered, setHovered] = useState(false)
107133
return (
108134
<div sx={{ position: 'relative', height: '0px' }}>
@@ -124,8 +150,12 @@ function DropZone() {
124150
backgroundColor: hovered ? 'primary' : 'transparent',
125151
},
126152
}}
127-
onDragOver={() => setHovered(true)}
153+
onDragEnter={() => setHovered(true)}
128154
onDragLeave={() => setHovered(false)}
155+
onDragOver={(e) => {
156+
e.preventDefault()
157+
}}
158+
onDrop={onDrop}
129159
></div>
130160
</div>
131161
)

packages/gui/src/lib/array.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,12 @@ export function remove<T>(array: T[], index: number) {
1313
return copy
1414
}
1515

16+
export function insert<T>(array: T[], index: number, newValue: T) {
17+
const copy = [...array]
18+
copy.splice(index, 0, newValue)
19+
return copy
20+
}
21+
1622
export function replace<T>(array: T[], index: number, newValue: T) {
1723
const copy = [...array]
1824
copy.splice(index, 1, newValue)

0 commit comments

Comments
 (0)