Skip to content

Commit 41e90b4

Browse files
authored
Merge pull request #3165 from YOUNGHO8762/master
react wrapper grid stack provider API to accept widget objects directly
2 parents a7c3e2d + efd8077 commit 41e90b4

File tree

3 files changed

+36
-39
lines changed

3 files changed

+36
-39
lines changed

react/lib/grid-stack-context.ts

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,15 @@ import { createContext, useContext } from "react";
44
export const GridStackContext = createContext<{
55
initialOptions: GridStackOptions;
66
gridStack: GridStack | null;
7-
addWidget: (fn: (id: string) => Omit<GridStackWidget, "id">) => void;
7+
addWidget: (widget: GridStackWidget & { id: Required<GridStackWidget>["id"] }) => void;
88
removeWidget: (id: string) => void;
99
addSubGrid: (
10-
fn: (
11-
id: string,
12-
withWidget: (w: Omit<GridStackWidget, "id">) => GridStackWidget
13-
) => Omit<GridStackWidget, "id">
10+
subGrid: GridStackWidget & {
11+
id: Required<GridStackWidget>["id"];
12+
subGridOpts: Required<GridStackWidget>["subGridOpts"] & {
13+
children: Array<GridStackWidget & { id: Required<GridStackWidget>["id"] }>
14+
}
15+
}
1416
) => void;
1517
saveOptions: () => GridStackOptions | GridStackWidget[] | undefined;
1618
removeAll: () => void;

react/lib/grid-stack-provider.tsx

Lines changed: 12 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -26,43 +26,30 @@ export function GridStackProvider({
2626
});
2727

2828
const addWidget = useCallback(
29-
(fn: (id: string) => Omit<GridStackWidget, "id">) => {
30-
const newId = `widget-${Math.random().toString(36).substring(2, 15)}`;
31-
const widget = fn(newId);
32-
gridStack?.addWidget({ ...widget, id: newId });
29+
(widget: GridStackWidget & { id: Required<GridStackWidget>["id"] }) => {
30+
gridStack?.addWidget(widget);
3331
setRawWidgetMetaMap((prev) => {
3432
const newMap = new Map<string, GridStackWidget>(prev);
35-
newMap.set(newId, widget);
33+
newMap.set(widget.id, widget);
3634
return newMap;
3735
});
3836
},
3937
[gridStack]
4038
);
4139

4240
const addSubGrid = useCallback(
43-
(
44-
fn: (
45-
id: string,
46-
withWidget: (w: Omit<GridStackWidget, "id">) => GridStackWidget
47-
) => Omit<GridStackWidget, "id">
48-
) => {
49-
const newId = `sub-grid-${Math.random().toString(36).substring(2, 15)}`;
50-
const subWidgetIdMap = new Map<string, GridStackWidget>();
51-
52-
const widget = fn(newId, (w) => {
53-
const subWidgetId = `widget-${Math.random()
54-
.toString(36)
55-
.substring(2, 15)}`;
56-
subWidgetIdMap.set(subWidgetId, w);
57-
return { ...w, id: subWidgetId };
58-
});
59-
60-
gridStack?.addWidget({ ...widget, id: newId });
41+
(subGrid: GridStackWidget & {
42+
id: Required<GridStackWidget>["id"];
43+
subGridOpts: Required<GridStackWidget>["subGridOpts"] & {
44+
children: Array<GridStackWidget & { id: Required<GridStackWidget>["id"] }>
45+
}
46+
}) => {
47+
gridStack?.addWidget(subGrid);
6148

6249
setRawWidgetMetaMap((prev) => {
6350
const newMap = new Map<string, GridStackWidget>(prev);
64-
subWidgetIdMap.forEach((meta, id) => {
65-
newMap.set(id, meta);
51+
subGrid.subGridOpts?.children?.forEach((meta: GridStackWidget & { id: Required<GridStackWidget>["id"] }) => {
52+
newMap.set(meta.id, meta);
6653
});
6754
return newMap;
6855
});

react/src/demo/demo.tsx

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -141,15 +141,15 @@ export function GridStackDemo() {
141141
<>
142142
<GridStackProvider initialOptions={initialOptions}>
143143
<Toolbar />
144-
<GridStackRenderProvider>
144+
<GridStackRenderProvider>
145145
<GridStackRender componentMap={COMPONENT_MAP} />
146146
</GridStackRenderProvider>
147147
<DebugInfo />
148148
</GridStackProvider>
149149

150150
<GridStackProvider initialOptions={initialOptions2}>
151151
<Toolbar />
152-
<GridStackRenderProvider>
152+
<GridStackRenderProvider>
153153
<GridStackRender componentMap={COMPONENT_MAP} />
154154
</GridStackRenderProvider>
155155
<DebugInfo />
@@ -175,7 +175,10 @@ function Toolbar() {
175175
>
176176
<button
177177
onClick={() => {
178-
addWidget((id) => ({
178+
const id = `widget-${Math.random().toString(36).substring(2, 15)}`;
179+
180+
addWidget({
181+
id,
179182
w: 2,
180183
h: 2,
181184
x: 0,
@@ -184,15 +187,19 @@ function Toolbar() {
184187
name: "Text",
185188
props: { content: id },
186189
}),
187-
}));
190+
});
188191
}}
189192
>
190193
Add Text (2x2)
191194
</button>
192195

193196
<button
194197
onClick={() => {
195-
addSubGrid((id, withWidget) => ({
198+
const subGridId = `sub-grid-${Math.random().toString(36).substring(2, 15)}`;
199+
const widgetId = `widget-${Math.random().toString(36).substring(2, 15)}`;
200+
201+
addSubGrid({
202+
id: subGridId,
196203
h: 5,
197204
noResize: false,
198205
sizeToContent: true,
@@ -203,7 +210,8 @@ function Toolbar() {
203210
minRow: 2,
204211
cellHeight: CELL_HEIGHT,
205212
children: [
206-
withWidget({
213+
{
214+
id: widgetId,
207215
h: 1,
208216
locked: true,
209217
noMove: true,
@@ -213,15 +221,15 @@ function Toolbar() {
213221
y: 0,
214222
content: JSON.stringify({
215223
name: "Text",
216-
props: { content: "Sub Grid 1 Title" + id },
224+
props: { content: "Sub Grid 1 Title" + widgetId },
217225
}),
218-
}),
226+
},
219227
],
220228
},
221229
w: 12,
222230
x: 0,
223231
y: 0,
224-
}));
232+
});
225233
}}
226234
>
227235
Add Sub Grid (12x1)

0 commit comments

Comments
 (0)