Skip to content

Commit 5e7f9c4

Browse files
committed
demo: add group, ungroup demo #947
1 parent 8434ed1 commit 5e7f9c4

File tree

8 files changed

+136
-2
lines changed

8 files changed

+136
-2
lines changed

lerna.json

+7
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,13 @@
1515
"demo/release/latest/dist"
1616
]
1717
},
18+
{
19+
"basePath": "packages/helper/dist",
20+
"dists": [
21+
"demo/helper/release/{{version}}/dist",
22+
"demo/helper/release/latest/dist"
23+
]
24+
},
1825
{
1926
"basePath": "doc",
2027
"dists": [

packages/react-moveable/.storybook/main.js

+2
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@ module.exports = {
3434
config.resolve.alias["@/stories"] = path.resolve(__dirname, "../stories");
3535
config.resolve.alias["moveable-helper"] = path.resolve(__dirname, "../stories/moveable-helper");
3636
config.resolve.alias["@/react-moveable"] = path.resolve(__dirname, "../src");
37+
config.resolve.alias["@/helper"] = path.resolve(__dirname, "../../helper/src");
38+
3739
return config;
3840
},
3941
stories: [

packages/react-moveable/croffle.config.js

+1
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,7 @@ const config = [
180180
croissant.addSirup(PreviewPropsSirup);
181181
croissant.addSirup(sirup => {
182182
sirup.convertImport("@/react-moveable", "react-moveable");
183+
sirup.convertImport("@/helper", "@moveable/helper");
183184
});
184185
croissant.addSirup(DefaultModulePrefixSirup);
185186
return croissant;

packages/react-moveable/package.json

-1
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,6 @@
7171
"@croffle/bakery": "^0.0.21",
7272
"@daybrush/builder": "^0.1.2",
7373
"@daybrush/tester": "^0.1.3",
74-
"@moveable/helper": "~0.1.2",
7574
"@scena/react-guides": "^0.17.1",
7675
"@storybook/addon-actions": "6.5.16",
7776
"@storybook/addon-controls": "6.5.16",

packages/react-moveable/stories/9A-Components/0-Components.stories.tsx

+6
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,12 @@ export const ComponentsSelectoWithMultipleGroup = add("Use Selecto with Multiple
1515
path: require.resolve("./ReactSelectoMultipleGroupApp"),
1616
});
1717

18+
export const ComponentsSelectoWitGroupUngroup = add("Use Selecto with Group & Ungroup", {
19+
app: require("./ReactSelectoMultipleGroupUngroupApp").default,
20+
path: require.resolve("./ReactSelectoMultipleGroupUngroupApp"),
21+
});
22+
23+
1824

1925
export const ComponentsInfiniteViewer = add("Use Infinite Viewer", {
2026
app: require("./ReactInfiniteViewerApp").default,

packages/react-moveable/stories/9A-Components/ReactSelectoMultipleGroupApp.tsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import * as React from "react";
33
import { useKeycon } from "react-keycon";
44
import Selecto from "react-selecto";
55
import Moveable, { MoveableTargetGroupsType } from "@/react-moveable";
6-
import { GroupManager, TargetList } from "@moveable/helper";
6+
import { GroupManager, TargetList } from "@/helper";
77

88
export default function App() {
99
const { isKeydown: isCommand } = useKeycon({ keys: "meta" });
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
import { deepFlat } from "@daybrush/utils";
2+
import * as React from "react";
3+
import Selecto from "react-selecto";
4+
import Moveable, { MoveableTargetGroupsType } from "@/react-moveable";
5+
import { GroupManager, TargetList } from "@/helper";
6+
7+
export default function App() {
8+
const groupManager = React.useMemo<GroupManager>(() => new GroupManager([]), []);
9+
const [targets, setTargets] = React.useState<MoveableTargetGroupsType>([]);
10+
const moveableRef = React.useRef<Moveable>(null);
11+
const selectoRef = React.useRef<Selecto>(null);
12+
const cubes = [];
13+
14+
for (let i = 0; i < 30; ++i) {
15+
cubes.push(i);
16+
}
17+
const setSelectedTargets = React.useCallback((nextTargetes: MoveableTargetGroupsType) => {
18+
selectoRef.current!.setSelectedTargets(deepFlat(nextTargetes));
19+
setTargets(nextTargetes);
20+
}, []);
21+
React.useEffect(() => {
22+
// [[0, 1], 2], 3, 4, [5, 6], 7, 8, 9
23+
const elements = selectoRef.current!.getSelectableElements();
24+
25+
groupManager.set([], elements);
26+
}, []);
27+
28+
return <div className="root">
29+
<div className="container">
30+
<button onClick={() => {
31+
const nextGroup = groupManager.group(targets, true);
32+
33+
if (nextGroup) {
34+
setTargets(nextGroup);
35+
}
36+
}}>Group</button>
37+
&nbsp;
38+
<button onClick={() => {
39+
const nextGroup = groupManager.ungroup(targets);
40+
41+
if (nextGroup) {
42+
setTargets(nextGroup);
43+
}
44+
}}>Ungrooup</button>
45+
<Moveable
46+
ref={moveableRef}
47+
draggable={true}
48+
rotatable={true}
49+
scalable={true}
50+
target={targets}
51+
onDrag={e => {
52+
e.target.style.transform = e.transform;
53+
}}
54+
onRenderGroup={e => {
55+
e.events.forEach(ev => {
56+
ev.target.style.cssText += ev.cssText;
57+
});
58+
}}
59+
></Moveable>
60+
<Selecto
61+
ref={selectoRef}
62+
dragContainer={window}
63+
selectableTargets={[".selecto-area .cube"]}
64+
hitRate={0}
65+
selectByClick={true}
66+
selectFromInside={false}
67+
toggleContinueSelect={["shift"]}
68+
ratio={0}
69+
onDragStart={e => {
70+
const moveable = moveableRef.current!;
71+
const target = e.inputEvent.target;
72+
const flatted = deepFlat(targets);
73+
74+
if (
75+
target.tagName === "BUTTON"
76+
|| moveable.isMoveableElement(target)
77+
|| flatted.some(t => t === target || t.contains(target))
78+
) {
79+
e.stop();
80+
}
81+
}}
82+
onSelectEnd={e => {
83+
const {
84+
isDragStart,
85+
added,
86+
removed,
87+
inputEvent,
88+
} = e;
89+
const moveable = moveableRef.current!;
90+
91+
if (isDragStart) {
92+
inputEvent.preventDefault();
93+
94+
moveable.waitToChangeTarget().then(() => {
95+
moveable.dragStart(inputEvent);
96+
});
97+
}
98+
let nextChilds: TargetList;
99+
100+
if (isDragStart) {
101+
nextChilds = groupManager.selectCompletedChilds(targets, added, removed);
102+
} else {
103+
nextChilds = groupManager.selectSameDepthChilds(targets, added, removed);
104+
}
105+
106+
e.currentTarget.setSelectedTargets(nextChilds.flatten());
107+
setSelectedTargets(nextChilds.targets());
108+
}}
109+
></Selecto>
110+
<div className="elements selecto-area">
111+
{cubes.map(i => <div className="cube" key={i}>{i}</div>)}
112+
</div>
113+
<div className="empty elements"></div>
114+
</div>
115+
</div>;
116+
}

packages/react-moveable/tsconfig.json

+3
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,9 @@
2929
],
3030
"@/react-moveable": [
3131
"./src/"
32+
],
33+
"@/helper": [
34+
"../helper/src/"
3235
]
3336
}
3437
},

0 commit comments

Comments
 (0)