@kwiz/fluentui 1.0.21 → 1.0.24
Sign up to get free protection for your applications and to get access to all the features.
- package/.github/workflows/npm-publish.yml +4 -15
- package/dist/_modules/config.d.ts +1 -0
- package/dist/_modules/config.js +9 -0
- package/dist/_modules/config.js.map +1 -0
- package/dist/_modules/constants.d.ts +2 -0
- package/dist/_modules/constants.js +3 -0
- package/dist/_modules/constants.js.map +1 -0
- package/dist/controls/accordion.d.ts +13 -0
- package/dist/controls/accordion.js +27 -0
- package/dist/controls/accordion.js.map +1 -0
- package/dist/controls/button.d.ts +28 -0
- package/dist/controls/button.js +113 -0
- package/dist/controls/button.js.map +1 -0
- package/dist/controls/centered.d.ts +5 -0
- package/dist/controls/centered.js +14 -0
- package/dist/controls/centered.js.map +1 -0
- package/dist/controls/date.d.ts +8 -0
- package/dist/controls/date.js +32 -0
- package/dist/controls/date.js.map +1 -0
- package/dist/controls/dropdown.d.ts +36 -0
- package/dist/controls/dropdown.js +35 -0
- package/dist/controls/dropdown.js.map +1 -0
- package/dist/controls/error-boundary.d.ts +23 -0
- package/dist/controls/error-boundary.js +33 -0
- package/dist/controls/error-boundary.js.map +1 -0
- package/dist/controls/field-editor.d.ts +13 -0
- package/dist/controls/field-editor.js +15 -0
- package/dist/controls/field-editor.js.map +1 -0
- package/dist/controls/file-upload.d.ts +18 -0
- package/dist/controls/file-upload.js +41 -0
- package/dist/controls/file-upload.js.map +1 -0
- package/dist/controls/horizontal.d.ts +8 -0
- package/dist/controls/horizontal.js +23 -0
- package/dist/controls/horizontal.js.map +1 -0
- package/dist/controls/input.d.ts +13 -0
- package/dist/controls/input.js +43 -0
- package/dist/controls/input.js.map +1 -0
- package/dist/controls/kwizoverflow.d.ts +14 -0
- package/dist/controls/kwizoverflow.js +45 -0
- package/dist/controls/kwizoverflow.js.map +1 -0
- package/dist/controls/list.d.ts +21 -0
- package/dist/controls/list.js +72 -0
- package/dist/controls/list.js.map +1 -0
- package/dist/controls/loading.d.ts +5 -0
- package/dist/controls/loading.js +7 -0
- package/dist/controls/loading.js.map +1 -0
- package/dist/controls/please-wait.d.ts +18 -0
- package/dist/controls/please-wait.js +16 -0
- package/dist/controls/please-wait.js.map +1 -0
- package/dist/controls/prompt.d.ts +32 -0
- package/dist/controls/prompt.js +31 -0
- package/dist/controls/prompt.js.map +1 -0
- package/dist/controls/search.d.ts +13 -0
- package/dist/controls/search.js +47 -0
- package/dist/controls/search.js.map +1 -0
- package/dist/controls/section.d.ts +14 -0
- package/dist/controls/section.js +27 -0
- package/dist/controls/section.js.map +1 -0
- package/dist/controls/svg.d.ts +23 -0
- package/dist/controls/svg.js +45 -0
- package/dist/controls/svg.js.map +1 -0
- package/dist/controls/toolbar.d.ts +12 -0
- package/dist/controls/toolbar.js +23 -0
- package/dist/controls/toolbar.js.map +1 -0
- package/dist/controls/vertical-content.d.ts +6 -0
- package/dist/controls/vertical-content.js +37 -0
- package/dist/controls/vertical-content.js.map +1 -0
- package/dist/controls/vertical.d.ts +8 -0
- package/dist/controls/vertical.js +23 -0
- package/dist/controls/vertical.js.map +1 -0
- package/dist/helpers/context.d.ts +26 -0
- package/dist/helpers/context.js +15 -0
- package/dist/helpers/context.js.map +1 -0
- package/dist/helpers/drag-drop/drag-drop-container.d.ts +15 -0
- package/dist/helpers/drag-drop/drag-drop-container.js +13 -0
- package/dist/helpers/drag-drop/drag-drop-container.js.map +1 -0
- package/dist/helpers/drag-drop/drag-drop-context.d.ts +30 -0
- package/dist/helpers/drag-drop/drag-drop-context.js +47 -0
- package/dist/helpers/drag-drop/drag-drop-context.js.map +1 -0
- package/dist/helpers/drag-drop/exports.d.ts +4 -0
- package/dist/helpers/drag-drop/exports.js +3 -0
- package/dist/helpers/drag-drop/exports.js.map +1 -0
- package/dist/helpers/drag-drop/use-draggable.d.ts +13 -0
- package/dist/helpers/drag-drop/use-draggable.js +33 -0
- package/dist/helpers/drag-drop/use-draggable.js.map +1 -0
- package/dist/helpers/drag-drop/use-droppable.d.ts +14 -0
- package/dist/helpers/drag-drop/use-droppable.js +28 -0
- package/dist/helpers/drag-drop/use-droppable.js.map +1 -0
- package/dist/helpers/hooks.d.ts +62 -0
- package/dist/helpers/hooks.js +287 -0
- package/dist/helpers/hooks.js.map +1 -0
- package/dist/index.d.ts +26 -0
- package/dist/index.js +26 -0
- package/dist/index.js.map +1 -0
- package/dist/styles/styles.d.ts +19 -0
- package/dist/styles/styles.js +79 -0
- package/dist/styles/styles.js.map +1 -0
- package/dist/styles/theme.d.ts +6 -0
- package/dist/styles/theme.js +77 -0
- package/dist/styles/theme.js.map +1 -0
- package/package.json +3 -1
- package/src/controls/dropdown.tsx +33 -28
- package/src/helpers/drag-drop/drag-drop-container.tsx +47 -0
- package/src/helpers/drag-drop/drag-drop-context.tsx +67 -0
- package/src/helpers/drag-drop/exports.ts +4 -0
- package/src/helpers/drag-drop/readme.md +76 -0
- package/src/helpers/drag-drop/use-draggable.ts +56 -0
- package/src/helpers/drag-drop/use-droppable.ts +48 -0
- package/src/index.ts +1 -0
@@ -0,0 +1,47 @@
|
|
1
|
+
import { isNullOrEmptyString } from "@kwiz/common";
|
2
|
+
import { useDragDropContext } from "./drag-drop-context";
|
3
|
+
import { iDraggedItemType, iDraggableProps } from "./use-draggable";
|
4
|
+
import { iDroppableProps } from "./use-droppable";
|
5
|
+
|
6
|
+
interface one<DragItemType extends iDraggedItemType<string>> {
|
7
|
+
dragInfo: iDraggableProps<DragItemType>;
|
8
|
+
}
|
9
|
+
interface other<
|
10
|
+
DropInfoTypes extends string = never,
|
11
|
+
DropInfoItemTypes extends iDraggedItemType<DropInfoTypes> = never,
|
12
|
+
> {
|
13
|
+
dropInfo: iDroppableProps<DropInfoTypes, DropInfoItemTypes>;
|
14
|
+
}
|
15
|
+
type iDragDropProps<
|
16
|
+
DragItemType extends iDraggedItemType<string>,
|
17
|
+
DropInfoTypes extends string = never,
|
18
|
+
DropInfoItemTypes extends iDraggedItemType<DropInfoTypes> = never,
|
19
|
+
> = one<DragItemType>
|
20
|
+
| other<DropInfoTypes, DropInfoItemTypes>
|
21
|
+
| (one<DragItemType> & other<DropInfoTypes, DropInfoItemTypes>);
|
22
|
+
|
23
|
+
type iProps<DragItemType extends iDraggedItemType<string>, DropInfoTypes extends string, DropInfoItemTypes extends iDraggedItemType<DropInfoTypes>> =
|
24
|
+
//all DIV props, except ref - we need ref.
|
25
|
+
Omit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref">
|
26
|
+
//pass drag class names
|
27
|
+
& {
|
28
|
+
onDraggingClassName?: string;
|
29
|
+
onDragOverClassName?: string;
|
30
|
+
}
|
31
|
+
//drag/drop info
|
32
|
+
& iDragDropProps<DragItemType, DropInfoTypes, DropInfoItemTypes>
|
33
|
+
|
34
|
+
export function DragDropContainer<
|
35
|
+
DragItemType extends iDraggedItemType<string> = never,
|
36
|
+
DropInfoTypes extends string = never,
|
37
|
+
DropInfoItemTypes extends iDraggedItemType<DropInfoTypes> = never
|
38
|
+
>(props: React.PropsWithChildren<iProps<DragItemType, DropInfoTypes, DropInfoItemTypes>>) {
|
39
|
+
|
40
|
+
const { drag, drop, dragDropRef } = useDragDropContext(props);
|
41
|
+
|
42
|
+
const classNames: string[] = isNullOrEmptyString(props.className) ? [] : props.className.split(' ');
|
43
|
+
if (drag.isDragging && props.onDraggingClassName) classNames.push(props.onDraggingClassName);
|
44
|
+
if (drop.isOver && props.onDragOverClassName) classNames.push(props.onDragOverClassName);
|
45
|
+
|
46
|
+
return <div {...(props || {})} ref={dragDropRef} className={classNames.join(' ')}>{props.children}</div>;
|
47
|
+
}
|
@@ -0,0 +1,67 @@
|
|
1
|
+
import { isNullOrUndefined } from "@kwiz/common";
|
2
|
+
import React, { useContext } from "react";
|
3
|
+
import { DndProvider } from "react-dnd";
|
4
|
+
import { HTML5Backend } from "react-dnd-html5-backend";
|
5
|
+
import { useStateEX } from "../hooks";
|
6
|
+
import { iDraggableProps, iDraggedItemType, useDraggable } from "./use-draggable";
|
7
|
+
import useDroppable, { iDroppableProps } from "./use-droppable";
|
8
|
+
|
9
|
+
export interface iDragDropContext {
|
10
|
+
isDragging: boolean;
|
11
|
+
setIsDragging: (value: boolean) => void;
|
12
|
+
}
|
13
|
+
//create context
|
14
|
+
export const DragDropContext = React.createContext<iDragDropContext>(null);
|
15
|
+
//use context from within controls
|
16
|
+
export function useDragDropContextInternal() {
|
17
|
+
const dragDropContext = useContext(DragDropContext);
|
18
|
+
return dragDropContext;
|
19
|
+
}
|
20
|
+
export function useDragDropContext<
|
21
|
+
DragItemType extends iDraggedItemType<string> = never,
|
22
|
+
DropInfoType extends iDroppableProps<string, any> = never
|
23
|
+
>(info: {
|
24
|
+
dragInfo?: iDraggableProps<DragItemType>;
|
25
|
+
dropInfo?: DropInfoType;
|
26
|
+
}) {
|
27
|
+
const dragDropContext = useDragDropContextInternal();
|
28
|
+
const isDraggable = !isNullOrUndefined(info.dragInfo);
|
29
|
+
const isDroppable = !isNullOrUndefined(info.dropInfo);
|
30
|
+
const drag = useDraggable(info?.dragInfo);
|
31
|
+
const drop = useDroppable(info?.dropInfo);
|
32
|
+
const acceptDrops = isDroppable && !drag.isDragging && dragDropContext.isDragging;
|
33
|
+
|
34
|
+
return {
|
35
|
+
dragDropContext,
|
36
|
+
drag,
|
37
|
+
drop,
|
38
|
+
dragDropRef: isDraggable && !isDroppable
|
39
|
+
? drag.dragRef
|
40
|
+
: !isDraggable && isDroppable
|
41
|
+
? drop.dropRef
|
42
|
+
//both drag and drop allowed
|
43
|
+
: acceptDrops ? drop.dropRef : drag.dragRef
|
44
|
+
};
|
45
|
+
}
|
46
|
+
export function useDragDropContextProvider(): iDragDropContext {
|
47
|
+
const [isDragging, setIsDragging] = useStateEX(false);
|
48
|
+
|
49
|
+
//build context
|
50
|
+
const ctx: iDragDropContext = {
|
51
|
+
isDragging, setIsDragging
|
52
|
+
};
|
53
|
+
|
54
|
+
|
55
|
+
return ctx;
|
56
|
+
}
|
57
|
+
|
58
|
+
interface iProps {
|
59
|
+
}
|
60
|
+
export const DragDropContextProvider: React.FunctionComponent<React.PropsWithChildren<iProps>> = (props) => {
|
61
|
+
const provider = useDragDropContextProvider();
|
62
|
+
return <DragDropContext.Provider value={provider}>
|
63
|
+
<DndProvider backend={HTML5Backend}>
|
64
|
+
{props.children}
|
65
|
+
</DndProvider>
|
66
|
+
</DragDropContext.Provider>;
|
67
|
+
}
|
@@ -0,0 +1,76 @@
|
|
1
|
+
Use drag drop with types examples:
|
2
|
+
|
3
|
+
Wrap everything within drag/drop context:
|
4
|
+
```tsx
|
5
|
+
<DragDropContextProvider>
|
6
|
+
...
|
7
|
+
</DragDropContextProvider>
|
8
|
+
```
|
9
|
+
|
10
|
+
Define the types you want to allow drag/drop:
|
11
|
+
```tsx
|
12
|
+
export type dragColumnType = "column";
|
13
|
+
export type dragCellType = "cell";
|
14
|
+
export interface dragColumn extends iDraggedItemType<dragColumnType> {
|
15
|
+
data: iDesignerContextFields
|
16
|
+
}
|
17
|
+
|
18
|
+
export interface dragCell extends iDraggedItemType<dragCellType> {
|
19
|
+
row: number;
|
20
|
+
cell: number;
|
21
|
+
}
|
22
|
+
export interface dropCellOrColumn extends iDroppableProps<dragColumnType | dragCellType, dragColumn | dragCell> {
|
23
|
+
}
|
24
|
+
```
|
25
|
+
|
26
|
+
use within a control:
|
27
|
+
```tsx
|
28
|
+
const { drag, drop, dragDropRef } = useDragDropContext<
|
29
|
+
dragCell, dropCellOrColumn
|
30
|
+
>({
|
31
|
+
dragInfo: {
|
32
|
+
item: {
|
33
|
+
type: "cell",
|
34
|
+
cell: props.index,
|
35
|
+
row: props.rowIndex
|
36
|
+
},
|
37
|
+
},
|
38
|
+
dropInfo: {
|
39
|
+
acceptTypes: ["cell", "column"],
|
40
|
+
onItemDrop: item => {
|
41
|
+
switch (item.type) {
|
42
|
+
case "cell":
|
43
|
+
alert(item.cell);
|
44
|
+
break;
|
45
|
+
case "column":
|
46
|
+
alert(item.data.title);
|
47
|
+
break;
|
48
|
+
}
|
49
|
+
}
|
50
|
+
}
|
51
|
+
});
|
52
|
+
|
53
|
+
...
|
54
|
+
|
55
|
+
<Section css={[
|
56
|
+
drop.isOver && classes.hover,
|
57
|
+
drag.isDragging && classes.dragging
|
58
|
+
]}
|
59
|
+
ref={dragDropRef}>
|
60
|
+
...
|
61
|
+
</Section>
|
62
|
+
```
|
63
|
+
|
64
|
+
Use with a wrapper:
|
65
|
+
|
66
|
+
```tsx
|
67
|
+
<DragDropContainer<dragColumn>
|
68
|
+
dragInfo={{
|
69
|
+
item: {
|
70
|
+
type: "column",
|
71
|
+
data: f
|
72
|
+
}
|
73
|
+
}}>
|
74
|
+
<ButtonEX ... />
|
75
|
+
</DragDropContainer>
|
76
|
+
```
|
@@ -0,0 +1,56 @@
|
|
1
|
+
import { useEffect } from 'react';
|
2
|
+
import { ConnectDragSource, DragSourceMonitor, useDrag } from 'react-dnd';
|
3
|
+
import { useDragDropContextInternal } from './drag-drop-context';
|
4
|
+
|
5
|
+
export interface iDraggedItemType<DragType extends string> {
|
6
|
+
type: DragType;
|
7
|
+
}
|
8
|
+
export interface iDraggableProps<ItemType extends iDraggedItemType<string>> {
|
9
|
+
item: ItemType;
|
10
|
+
onBeginDrag?: () => void;
|
11
|
+
onEndDrag?: (dropResult: any) => void;
|
12
|
+
}
|
13
|
+
|
14
|
+
export function useDraggable<ItemType extends iDraggedItemType<string>>(props?: iDraggableProps<ItemType>): {
|
15
|
+
isDragging: boolean;
|
16
|
+
dragRef: ConnectDragSource
|
17
|
+
} {
|
18
|
+
const {
|
19
|
+
item,
|
20
|
+
onBeginDrag,
|
21
|
+
onEndDrag,
|
22
|
+
} = props || {
|
23
|
+
item: {
|
24
|
+
type: "~invalid~"
|
25
|
+
}
|
26
|
+
};
|
27
|
+
|
28
|
+
const dragDropContext = useDragDropContextInternal();
|
29
|
+
|
30
|
+
const [{ isDragging }, dragRef] = useDrag(
|
31
|
+
() => ({
|
32
|
+
type: item.type,
|
33
|
+
item,
|
34
|
+
collect: (monitor: DragSourceMonitor) => ({
|
35
|
+
isDragging: monitor.isDragging(),
|
36
|
+
}),
|
37
|
+
end: (item, monitor) => {
|
38
|
+
dragDropContext.setIsDragging(false);
|
39
|
+
onEndDrag && onEndDrag(monitor.getDropResult());
|
40
|
+
},
|
41
|
+
}),
|
42
|
+
[item, item.type]
|
43
|
+
);
|
44
|
+
|
45
|
+
useEffect(() => {
|
46
|
+
if (isDragging) {
|
47
|
+
dragDropContext.setIsDragging(true);
|
48
|
+
onBeginDrag && onBeginDrag();
|
49
|
+
}
|
50
|
+
}, [isDragging, onBeginDrag])
|
51
|
+
|
52
|
+
return {
|
53
|
+
isDragging,
|
54
|
+
dragRef,
|
55
|
+
};
|
56
|
+
}
|
@@ -0,0 +1,48 @@
|
|
1
|
+
import { ConnectDropTarget, DropTargetMonitor, useDrop } from 'react-dnd';
|
2
|
+
import { iDraggedItemType } from './use-draggable';
|
3
|
+
|
4
|
+
export interface iDroppableProps<DropTypes extends string, ItemTypes extends iDraggedItemType<DropTypes>> {
|
5
|
+
acceptTypes: DropTypes[];
|
6
|
+
onItemDrop: (item: ItemTypes) => void;
|
7
|
+
onHover?: (item: ItemTypes) => void;
|
8
|
+
onDrop?: () => void;
|
9
|
+
}
|
10
|
+
|
11
|
+
function useDroppable<DropType extends string, ItemType extends iDraggedItemType<DropType>>(props?: iDroppableProps<DropType, ItemType>): {
|
12
|
+
canDrop: boolean;
|
13
|
+
isOver: boolean;
|
14
|
+
dropRef: ConnectDropTarget;
|
15
|
+
} {
|
16
|
+
const {
|
17
|
+
acceptTypes,
|
18
|
+
onItemDrop,
|
19
|
+
onHover,
|
20
|
+
onDrop,
|
21
|
+
} = props || {
|
22
|
+
acceptTypes: [],
|
23
|
+
onItemDrop: () => { }
|
24
|
+
};
|
25
|
+
|
26
|
+
const [{ canDrop, isOver }, dropRef] = useDrop({
|
27
|
+
accept: acceptTypes,
|
28
|
+
drop: (item: ItemType) => {
|
29
|
+
onItemDrop(item);
|
30
|
+
onDrop?.();
|
31
|
+
},
|
32
|
+
hover: (item: ItemType) => {
|
33
|
+
onHover?.(item);
|
34
|
+
},
|
35
|
+
collect: (monitor: DropTargetMonitor) => ({
|
36
|
+
canDrop: monitor.canDrop(),
|
37
|
+
isOver: monitor.isOver(),
|
38
|
+
}),
|
39
|
+
});
|
40
|
+
|
41
|
+
return {
|
42
|
+
canDrop,
|
43
|
+
isOver,
|
44
|
+
dropRef,
|
45
|
+
};
|
46
|
+
}
|
47
|
+
|
48
|
+
export default useDroppable;
|
package/src/index.ts
CHANGED
@@ -21,6 +21,7 @@ export * from './controls/vertical';
|
|
21
21
|
export * from './controls/vertical-content';
|
22
22
|
export { KWIZFluentContext, useKWIZFluentContext } from './helpers/context';
|
23
23
|
export type { iKWIZFluentContext } from './helpers/context';
|
24
|
+
export * from './helpers/drag-drop/exports';
|
24
25
|
export * from './helpers/hooks';
|
25
26
|
export { KnownClassNames } from './styles/styles';
|
26
27
|
|