deepsea-components 5.16.3 → 5.16.4
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.
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { CSSProperties, ComponentProps, Key, ReactNode } from "react";
|
|
2
2
|
import { DragMoveEvents } from "soda-hooks";
|
|
3
|
+
export type MustBeReactNode<T> = false extends (T extends ReactNode ? true : false) ? false : true;
|
|
4
|
+
export type MustBeReactKey<T> = false extends (T extends Key ? true : false) ? false : true;
|
|
3
5
|
export type DraggableGridClassName = string | ((status: ContainerStatus) => string);
|
|
4
6
|
export type DraggableGridItemClassName = string | ((status: DraggableGridItemStatus) => string);
|
|
5
7
|
export type DraggableGridStyle = CSSProperties | ((status: ContainerStatus) => CSSProperties);
|
|
@@ -20,10 +22,10 @@ export interface DraggableGridItemStatus {
|
|
|
20
22
|
isDragging: boolean;
|
|
21
23
|
}
|
|
22
24
|
/** 元素的 key 到次序的映射 */
|
|
23
|
-
export type DraggableGridKeyToOrder = Map<
|
|
25
|
+
export type DraggableGridKeyToOrder<K extends Key> = Map<K, number>;
|
|
24
26
|
/** 次序到元素的 key 的映射 */
|
|
25
|
-
export type DraggableGridOrderToKey = Map<number,
|
|
26
|
-
export type DraggableGridProps<T> = Omit<ComponentProps<"div">, "className" | "children"> & DragMoveEvents<HTMLDivElement> & {
|
|
27
|
+
export type DraggableGridOrderToKey<K extends Key> = Map<number, K>;
|
|
28
|
+
export type DraggableGridProps<T, K extends Key = T extends Key ? T : never> = Omit<ComponentProps<"div">, "className" | "children"> & DragMoveEvents<HTMLDivElement> & {
|
|
27
29
|
/** 类名 */
|
|
28
30
|
className?: DraggableGridClassName;
|
|
29
31
|
/** 类名 */
|
|
@@ -58,28 +60,28 @@ export type DraggableGridProps<T> = Omit<ComponentProps<"div">, "className" | "c
|
|
|
58
60
|
/** 元素高度 */
|
|
59
61
|
itemHeight: number;
|
|
60
62
|
/** 元素的 key 到次序的映射 */
|
|
61
|
-
orderMap?: DraggableGridKeyToOrder
|
|
63
|
+
orderMap?: DraggableGridKeyToOrder<K>;
|
|
62
64
|
/** 次序变化时回调 */
|
|
63
|
-
onOrderMapChange?: (orderMap: DraggableGridKeyToOrder) => void;
|
|
65
|
+
onOrderMapChange?: (orderMap: DraggableGridKeyToOrder<K>) => void;
|
|
64
66
|
/** 禁用的元素 */
|
|
65
|
-
isItemDisabled?:
|
|
67
|
+
isItemDisabled?: K[] | ((item: T, key: K) => boolean);
|
|
66
68
|
/** 禁用的次序 */
|
|
67
69
|
isOrderDisabled?: number[] | ((order: number) => boolean);
|
|
68
70
|
/** 次序的优先级,可以通过此函数调整元素的优先放置的方向,左上,右上,左下,右下,中心,顺时针,逆时针等等 */
|
|
69
71
|
orderPriority?: (a: number, b: number) => number;
|
|
70
72
|
/** 触发移动的元素 */
|
|
71
|
-
handle?: string | HTMLElement | ((item: T, key:
|
|
72
|
-
} & (T extends
|
|
73
|
+
handle?: string | HTMLElement | ((item: T, key: K, element: HTMLDivElement) => HTMLElement | undefined | null) | undefined | null;
|
|
74
|
+
} & (MustBeReactNode<T> extends true ? {
|
|
73
75
|
/** 渲染函数,当 T 为 ReactNode 时,render 为可选 */
|
|
74
76
|
render?: (item: T, status: DraggableGridItemStatus) => ReactNode;
|
|
75
77
|
} : {
|
|
76
78
|
/** 渲染函数,当 T 为 ReactNode 时,render 为可选 */
|
|
77
79
|
render: (item: T, status: DraggableGridItemStatus) => ReactNode;
|
|
78
|
-
}) & (T extends
|
|
80
|
+
}) & (MustBeReactKey<T> extends true ? {
|
|
79
81
|
/** 获取 key 的函数,当 T 为 Key 时,keyExtractor 为可选 */
|
|
80
|
-
keyExtractor?: (item: T) =>
|
|
82
|
+
keyExtractor?: (item: T) => K;
|
|
81
83
|
} : {
|
|
82
84
|
/** 获取 key 的函数,当 T 为 Key 时,keyExtractor 为可选 */
|
|
83
|
-
keyExtractor: (item: T) =>
|
|
85
|
+
keyExtractor: (item: T) => K;
|
|
84
86
|
});
|
|
85
|
-
export declare function DraggableGrid<T>({ className, classNames, style, items, disabled, columns, rows, gap, gapX, gapY, itemWidth, itemHeight, orderMap, onOrderMapChange, render, keyExtractor, isItemDisabled: _isItemDisabled, isOrderDisabled, orderPriority, handle, onDragMoveStart: _onDragMoveStart, onDragMove: _onDragMove, onDragMoveEnd: _onDragMoveEnd, ...rest }: DraggableGridProps<T>): import("react/jsx-runtime").JSX.Element;
|
|
87
|
+
export declare function DraggableGrid<T, K extends Key = T extends Key ? T : never>({ className, classNames, style, items, disabled, columns, rows, gap, gapX, gapY, itemWidth, itemHeight, orderMap, onOrderMapChange, render, keyExtractor, isItemDisabled: _isItemDisabled, isOrderDisabled, orderPriority, handle, onDragMoveStart: _onDragMoveStart, onDragMove: _onDragMove, onDragMoveEnd: _onDragMoveEnd, ...rest }: DraggableGridProps<T, K>): import("react/jsx-runtime").JSX.Element;
|
package/package.json
CHANGED
|
@@ -4,6 +4,10 @@ import { DragMoveEvent, DragMoveEvents, useDragMove } from "soda-hooks"
|
|
|
4
4
|
|
|
5
5
|
import styles from "./DraggableGrid.module.css"
|
|
6
6
|
|
|
7
|
+
export type MustBeReactNode<T> = false extends (T extends ReactNode ? true : false) ? false : true
|
|
8
|
+
|
|
9
|
+
export type MustBeReactKey<T> = false extends (T extends Key ? true : false) ? false : true
|
|
10
|
+
|
|
7
11
|
export type DraggableGridClassName = string | ((status: ContainerStatus) => string)
|
|
8
12
|
|
|
9
13
|
export type DraggableGridItemClassName = string | ((status: DraggableGridItemStatus) => string)
|
|
@@ -30,10 +34,10 @@ export interface DraggableGridItemStatus {
|
|
|
30
34
|
}
|
|
31
35
|
|
|
32
36
|
/** 元素的 key 到次序的映射 */
|
|
33
|
-
export type DraggableGridKeyToOrder = Map<
|
|
37
|
+
export type DraggableGridKeyToOrder<K extends Key> = Map<K, number>
|
|
34
38
|
|
|
35
39
|
/** 次序到元素的 key 的映射 */
|
|
36
|
-
export type DraggableGridOrderToKey = Map<number,
|
|
40
|
+
export type DraggableGridOrderToKey<K extends Key> = Map<number, K>
|
|
37
41
|
|
|
38
42
|
function isTheSameArray<T>(a: T[], b: T[]) {
|
|
39
43
|
if (a.length !== b.length) return false
|
|
@@ -50,15 +54,15 @@ function isTheSameIterable<T>(a: Iterable<T>, b: Iterable<T>) {
|
|
|
50
54
|
return aSet.difference(bSet).size === 0
|
|
51
55
|
}
|
|
52
56
|
|
|
53
|
-
interface GetOrderMapParams {
|
|
54
|
-
prev?: DraggableGridKeyToOrder
|
|
57
|
+
interface GetOrderMapParams<K extends Key> {
|
|
58
|
+
prev?: DraggableGridKeyToOrder<K>
|
|
55
59
|
orders: number[]
|
|
56
|
-
keys:
|
|
60
|
+
keys: K[]
|
|
57
61
|
}
|
|
58
62
|
|
|
59
|
-
function getOrderMap({ prev, orders, keys }: GetOrderMapParams) {
|
|
63
|
+
function getOrderMap<K extends Key>({ prev, orders, keys }: GetOrderMapParams<K>) {
|
|
60
64
|
const orderSet = new Set(orders)
|
|
61
|
-
const orderMap = new Map<
|
|
65
|
+
const orderMap = new Map<K, number>()
|
|
62
66
|
const newKeys = keys.filter(key => {
|
|
63
67
|
if (!prev) return true
|
|
64
68
|
if (prev.has(key)) {
|
|
@@ -97,11 +101,11 @@ function getPosition({ order, columns, gapX, gapY, itemWidth, itemHeight }: GetP
|
|
|
97
101
|
}
|
|
98
102
|
}
|
|
99
103
|
|
|
100
|
-
function getOrderToKey(keyToOrder: DraggableGridKeyToOrder) {
|
|
104
|
+
function getOrderToKey<K extends Key>(keyToOrder: DraggableGridKeyToOrder<K>) {
|
|
101
105
|
return new Map(Array.from(keyToOrder.entries()).map(([key, order]) => [order, key]))
|
|
102
106
|
}
|
|
103
107
|
|
|
104
|
-
export type DraggableGridProps<T> = Omit<ComponentProps<"div">, "className" | "children"> &
|
|
108
|
+
export type DraggableGridProps<T, K extends Key = T extends Key ? T : never> = Omit<ComponentProps<"div">, "className" | "children"> &
|
|
105
109
|
DragMoveEvents<HTMLDivElement> & {
|
|
106
110
|
/** 类名 */
|
|
107
111
|
className?: DraggableGridClassName
|
|
@@ -137,18 +141,18 @@ export type DraggableGridProps<T> = Omit<ComponentProps<"div">, "className" | "c
|
|
|
137
141
|
/** 元素高度 */
|
|
138
142
|
itemHeight: number
|
|
139
143
|
/** 元素的 key 到次序的映射 */
|
|
140
|
-
orderMap?: DraggableGridKeyToOrder
|
|
144
|
+
orderMap?: DraggableGridKeyToOrder<K>
|
|
141
145
|
/** 次序变化时回调 */
|
|
142
|
-
onOrderMapChange?: (orderMap: DraggableGridKeyToOrder) => void
|
|
146
|
+
onOrderMapChange?: (orderMap: DraggableGridKeyToOrder<K>) => void
|
|
143
147
|
/** 禁用的元素 */
|
|
144
|
-
isItemDisabled?:
|
|
148
|
+
isItemDisabled?: K[] | ((item: T, key: K) => boolean)
|
|
145
149
|
/** 禁用的次序 */
|
|
146
150
|
isOrderDisabled?: number[] | ((order: number) => boolean)
|
|
147
151
|
/** 次序的优先级,可以通过此函数调整元素的优先放置的方向,左上,右上,左下,右下,中心,顺时针,逆时针等等 */
|
|
148
152
|
orderPriority?: (a: number, b: number) => number
|
|
149
153
|
/** 触发移动的元素 */
|
|
150
|
-
handle?: string | HTMLElement | ((item: T, key:
|
|
151
|
-
} & (T extends
|
|
154
|
+
handle?: string | HTMLElement | ((item: T, key: K, element: HTMLDivElement) => HTMLElement | undefined | null) | undefined | null
|
|
155
|
+
} & (MustBeReactNode<T> extends true
|
|
152
156
|
? {
|
|
153
157
|
/** 渲染函数,当 T 为 ReactNode 时,render 为可选 */
|
|
154
158
|
render?: (item: T, status: DraggableGridItemStatus) => ReactNode
|
|
@@ -157,24 +161,32 @@ export type DraggableGridProps<T> = Omit<ComponentProps<"div">, "className" | "c
|
|
|
157
161
|
/** 渲染函数,当 T 为 ReactNode 时,render 为可选 */
|
|
158
162
|
render: (item: T, status: DraggableGridItemStatus) => ReactNode
|
|
159
163
|
}) &
|
|
160
|
-
(T extends
|
|
164
|
+
(MustBeReactKey<T> extends true
|
|
161
165
|
? {
|
|
162
166
|
/** 获取 key 的函数,当 T 为 Key 时,keyExtractor 为可选 */
|
|
163
|
-
keyExtractor?: (item: T) =>
|
|
167
|
+
keyExtractor?: (item: T) => K
|
|
164
168
|
}
|
|
165
169
|
: {
|
|
166
170
|
/** 获取 key 的函数,当 T 为 Key 时,keyExtractor 为可选 */
|
|
167
|
-
keyExtractor: (item: T) =>
|
|
171
|
+
keyExtractor: (item: T) => K
|
|
168
172
|
})
|
|
169
173
|
|
|
170
|
-
interface DraggableGridItemProps<T> extends ComponentProps<"div">, DragMoveEvents<HTMLDivElement> {
|
|
174
|
+
interface DraggableGridItemProps<T, K extends Key = T extends Key ? T : never> extends ComponentProps<"div">, DragMoveEvents<HTMLDivElement> {
|
|
171
175
|
item: T
|
|
172
|
-
itemKey:
|
|
176
|
+
itemKey: K
|
|
173
177
|
/** 触发移动的元素 */
|
|
174
|
-
handle?: string | HTMLElement | ((item: T, key:
|
|
178
|
+
handle?: string | HTMLElement | ((item: T, key: K, element: HTMLDivElement) => HTMLElement | undefined | null) | undefined | null
|
|
175
179
|
}
|
|
176
180
|
|
|
177
|
-
function DraggableGridItem<T
|
|
181
|
+
function DraggableGridItem<T, K extends Key = T extends Key ? T : never>({
|
|
182
|
+
item,
|
|
183
|
+
itemKey,
|
|
184
|
+
handle,
|
|
185
|
+
onDragMoveStart,
|
|
186
|
+
onDragMove,
|
|
187
|
+
onDragMoveEnd,
|
|
188
|
+
...rest
|
|
189
|
+
}: DraggableGridItemProps<T, K>) {
|
|
178
190
|
const element = useRef<HTMLDivElement>(null)
|
|
179
191
|
|
|
180
192
|
useDragMove({
|
|
@@ -195,8 +207,8 @@ function DraggableGridItem<T>({ item, itemKey, handle, onDragMoveStart, onDragMo
|
|
|
195
207
|
return <div ref={element} {...rest} />
|
|
196
208
|
}
|
|
197
209
|
|
|
198
|
-
interface DraggingItem {
|
|
199
|
-
key:
|
|
210
|
+
interface DraggingItem<K extends Key> {
|
|
211
|
+
key: K
|
|
200
212
|
startX: number
|
|
201
213
|
startY: number
|
|
202
214
|
deltaX: number
|
|
@@ -208,10 +220,10 @@ interface DraggingItem {
|
|
|
208
220
|
gapY: number
|
|
209
221
|
itemWidth: number
|
|
210
222
|
itemHeight: number
|
|
211
|
-
keyToOrder: DraggableGridKeyToOrder
|
|
223
|
+
keyToOrder: DraggableGridKeyToOrder<K>
|
|
212
224
|
}
|
|
213
225
|
|
|
214
|
-
export function DraggableGrid<T>({
|
|
226
|
+
export function DraggableGrid<T, K extends Key = T extends Key ? T : never>({
|
|
215
227
|
className,
|
|
216
228
|
classNames,
|
|
217
229
|
style,
|
|
@@ -236,11 +248,11 @@ export function DraggableGrid<T>({
|
|
|
236
248
|
onDragMove: _onDragMove,
|
|
237
249
|
onDragMoveEnd: _onDragMoveEnd,
|
|
238
250
|
...rest
|
|
239
|
-
}: DraggableGridProps<T>) {
|
|
251
|
+
}: DraggableGridProps<T, K>) {
|
|
240
252
|
const keyToItem = useMemo(() => {
|
|
241
|
-
const keyToItem = new Map<
|
|
253
|
+
const keyToItem = new Map<K, T>()
|
|
242
254
|
items.forEach(item => {
|
|
243
|
-
const key = keyExtractor ? keyExtractor(item) : (item as
|
|
255
|
+
const key = keyExtractor ? keyExtractor(item) : (item as unknown as K)
|
|
244
256
|
keyToItem.set(key, item)
|
|
245
257
|
})
|
|
246
258
|
return keyToItem
|
|
@@ -269,7 +281,7 @@ export function DraggableGrid<T>({
|
|
|
269
281
|
})
|
|
270
282
|
|
|
271
283
|
/** 拖拽中的元素 */
|
|
272
|
-
const [dragging, setDragging] = useState<DraggingItem | undefined>(undefined)
|
|
284
|
+
const [dragging, setDragging] = useState<DraggingItem<K> | undefined>(undefined)
|
|
273
285
|
|
|
274
286
|
const { current: cache } = useRef({
|
|
275
287
|
orders,
|
|
@@ -321,7 +333,7 @@ export function DraggableGrid<T>({
|
|
|
321
333
|
else onOrderMapChange?.(keyToOrder)
|
|
322
334
|
}, [orderMap, keyToOrder, onOrderMapChange])
|
|
323
335
|
|
|
324
|
-
function onDragMoveStart(key:
|
|
336
|
+
function onDragMoveStart(key: K, event: DragMoveEvent<HTMLDivElement>) {
|
|
325
337
|
_onDragMoveStart?.(event)
|
|
326
338
|
const position = getPosition({ order: keyToOrder.get(key)!, columns, gapX, gapY, itemWidth, itemHeight })
|
|
327
339
|
recent.current = key
|
|
@@ -423,7 +435,7 @@ export function DraggableGrid<T>({
|
|
|
423
435
|
setDragging(undefined)
|
|
424
436
|
}
|
|
425
437
|
|
|
426
|
-
function isItemDisabled(key:
|
|
438
|
+
function isItemDisabled(key: K) {
|
|
427
439
|
if (!_isItemDisabled) return false
|
|
428
440
|
if (Array.isArray(_isItemDisabled)) return _isItemDisabled.includes(key)
|
|
429
441
|
return _isItemDisabled(keyToItem.get(key)!, key)
|