@flozy/editor 4.0.6 → 4.0.7
Sign up to get free protection for your applications and to get access to all the features.
- package/dist/Editor/Elements/AI/PopoverAIInput.js +3 -2
- package/dist/Editor/Elements/FreeGrid/FreeGrid.js +20 -5
- package/dist/Editor/Elements/FreeGrid/Options/AddElement.js +5 -1
- package/dist/Editor/Elements/FreeGrid/Options/sectionItemOptions.js +3 -1
- package/dist/Editor/Elements/FreeGrid/styles.js +18 -0
- package/dist/Editor/Elements/Table/Table.js +2 -3
- package/dist/Editor/common/RnD/ElementSettings/Settings/TableSettings.js +77 -0
- package/dist/Editor/common/RnD/ElementSettings/Settings/index.js +3 -1
- package/dist/Editor/common/RnD/ElementSettings/settingsConstants.js +6 -4
- package/dist/Editor/common/RnD/index.js +0 -1
- package/dist/Editor/common/StyleBuilder/sectionStyle.js +2 -1
- package/dist/Editor/helper/index.js +2 -1
- package/dist/Editor/utils/freegrid.js +130 -17
- package/dist/Editor/utils/table.js +105 -0
- package/package.json +1 -1
@@ -22,10 +22,11 @@ const scrollToAIInput = editor => {
|
|
22
22
|
selectionRect = ReactEditor.toDOMRange(editor, getNextLine(editor).at).getBoundingClientRect();
|
23
23
|
}
|
24
24
|
const wrapperTop = slateWrapper.getBoundingClientRect().top;
|
25
|
-
const cursorViewPortPosition = selectionRect.
|
25
|
+
const cursorViewPortPosition = selectionRect.bottom - wrapperTop; // here the slatewrapper is the viewport, not the whole screen. We are finding the position of the cursor/selection relative to the slate wrapper, that why we are subracting the slate wrapper top with selection bottom
|
26
|
+
|
26
27
|
if (cursorViewPortPosition > 80) {
|
27
28
|
// scroll to top of the slateWrapper
|
28
|
-
slateWrapper.scrollBy(0,
|
29
|
+
slateWrapper.scrollBy(0, cursorViewPortPosition - 80);
|
29
30
|
}
|
30
31
|
}, 200);
|
31
32
|
} catch (err) {
|
@@ -18,6 +18,7 @@ import { onPasteRnDNode } from "../../helper";
|
|
18
18
|
import focusOnNewItem from "../../helper/RnD/focusOnNewItem";
|
19
19
|
import { appHeaderNode } from "../../utils/insertAppHeader";
|
20
20
|
import { FORM_NODE } from "../../utils/form";
|
21
|
+
import { DEFAULT_TABLE_NODE } from "../../utils/table";
|
21
22
|
import itemOptions from "./Options/sectionItemOptions";
|
22
23
|
import { jsx as _jsx } from "react/jsx-runtime";
|
23
24
|
import { jsxs as _jsxs } from "react/jsx-runtime";
|
@@ -158,7 +159,7 @@ const FreeGrid = props => {
|
|
158
159
|
marginTop: 0,
|
159
160
|
top: 0,
|
160
161
|
width: 170,
|
161
|
-
height:
|
162
|
+
height: 30
|
162
163
|
}], {
|
163
164
|
at: [...insertAt]
|
164
165
|
});
|
@@ -189,14 +190,16 @@ const FreeGrid = props => {
|
|
189
190
|
top: 12,
|
190
191
|
right: 12,
|
191
192
|
bottom: 12
|
192
|
-
}
|
193
|
+
},
|
194
|
+
textAlign: "center",
|
195
|
+
label: "Get Started"
|
193
196
|
}],
|
194
197
|
gridArea: "3 / 1 / 4 / 2",
|
195
198
|
left: 50,
|
196
199
|
marginTop: 0,
|
197
200
|
top: 0,
|
198
|
-
width:
|
199
|
-
height:
|
201
|
+
width: 143,
|
202
|
+
height: 50
|
200
203
|
}], {
|
201
204
|
at: [...insertAt]
|
202
205
|
});
|
@@ -237,6 +240,18 @@ const FreeGrid = props => {
|
|
237
240
|
at: [...insertAt]
|
238
241
|
});
|
239
242
|
break;
|
243
|
+
case "addTable":
|
244
|
+
Transforms.insertNodes(editor, [{
|
245
|
+
...insertFreeGridItem("table", {
|
246
|
+
...DEFAULT_TABLE_NODE()
|
247
|
+
}, {
|
248
|
+
height: 130,
|
249
|
+
width: 400
|
250
|
+
})
|
251
|
+
}], {
|
252
|
+
at: [...insertAt]
|
253
|
+
});
|
254
|
+
break;
|
240
255
|
case "addBox":
|
241
256
|
Transforms.insertNodes(editor, [{
|
242
257
|
...insertFreeGridItem("box", {
|
@@ -254,7 +269,7 @@ const FreeGrid = props => {
|
|
254
269
|
...insertFreeGridItem("form", {
|
255
270
|
...FORM_NODE()
|
256
271
|
}, {
|
257
|
-
height:
|
272
|
+
height: 92,
|
258
273
|
width: 400
|
259
274
|
})
|
260
275
|
}], {
|
@@ -24,7 +24,11 @@ const AddElement = props => {
|
|
24
24
|
}), /*#__PURE__*/_jsx(ListItemButton, {
|
25
25
|
className: "item-wrapper",
|
26
26
|
onClick: handleClick("addVideo"),
|
27
|
-
children: "Video"
|
27
|
+
children: "Embed or Video"
|
28
|
+
}), /*#__PURE__*/_jsx(ListItemButton, {
|
29
|
+
className: "item-wrapper",
|
30
|
+
onClick: handleClick("addTable"),
|
31
|
+
children: "Table"
|
28
32
|
}), /*#__PURE__*/_jsx(ListItemButton, {
|
29
33
|
className: "item-wrapper",
|
30
34
|
onClick: handleClick("addBox"),
|
@@ -4,6 +4,7 @@ const buttonOptions = ["settings", "link", "saveAsTemplate", "close"];
|
|
4
4
|
const imageOptions = ["settings", "link", "saveAsTemplate", "close"];
|
5
5
|
const boxOptions = ["settings", "link", "saveAsTemplate", "close"];
|
6
6
|
const appHeaderOptions = ["settings", "saveAsTemplate", "close"];
|
7
|
+
const tableOptions = ["drag", "edit", "settings", "saveAsTemplate", "close"];
|
7
8
|
const sectionOptions = ["addElement", "settings", "moveUp", "moveDown", "saveAsTemplate", "more"];
|
8
9
|
const formOptions = ["drag", "edit", "settings", "addFormField", "workFlow", "saveAsTemplate", "close"];
|
9
10
|
const itemOptions = {
|
@@ -14,6 +15,7 @@ const itemOptions = {
|
|
14
15
|
box: boxOptions,
|
15
16
|
appHeader: appHeaderOptions,
|
16
17
|
form: formOptions,
|
17
|
-
section: sectionOptions
|
18
|
+
section: sectionOptions,
|
19
|
+
table: tableOptions
|
18
20
|
};
|
19
21
|
export default itemOptions;
|
@@ -150,6 +150,9 @@ const useFreeGridStyles = ({
|
|
150
150
|
},
|
151
151
|
|
152
152
|
"& .fgi_type_form": {
|
153
|
+
"& .form-wrapper": {
|
154
|
+
padding: "0px !important"
|
155
|
+
},
|
153
156
|
"& legend": {
|
154
157
|
paddingLeft: "16px",
|
155
158
|
paddingTop: "16px",
|
@@ -170,6 +173,21 @@ const useFreeGridStyles = ({
|
|
170
173
|
}
|
171
174
|
}
|
172
175
|
},
|
176
|
+
"& .fgi_type_table": {
|
177
|
+
"& .tableToolBar": {
|
178
|
+
right: "0px",
|
179
|
+
left: "auto",
|
180
|
+
top: "-34px",
|
181
|
+
display: "flex",
|
182
|
+
flexDirection: "row-reverse",
|
183
|
+
"& .toolbtn.settings": {
|
184
|
+
display: "none"
|
185
|
+
},
|
186
|
+
"& .toolbtn.remove": {
|
187
|
+
display: "none"
|
188
|
+
}
|
189
|
+
}
|
190
|
+
},
|
173
191
|
/** element toolbar hide */
|
174
192
|
"& .element-toolbar": {
|
175
193
|
display: "none"
|
@@ -1,7 +1,7 @@
|
|
1
1
|
import React, { useState } from "react";
|
2
2
|
import { Transforms } from "slate";
|
3
3
|
import { useSelected, useSlateStatic } from "slate-react";
|
4
|
-
import { Box, IconButton, Tooltip, Table as TableComp, TableBody
|
4
|
+
import { Box, IconButton, Tooltip, Table as TableComp, TableBody } from "@mui/material";
|
5
5
|
import AlignHorizontalLeftIcon from "@mui/icons-material/AlignHorizontalLeft";
|
6
6
|
import AlignHorizontalRightIcon from "@mui/icons-material/AlignHorizontalRight";
|
7
7
|
import AlignVerticalTopIcon from "@mui/icons-material/AlignVerticalTop";
|
@@ -15,7 +15,6 @@ import { TableUtil } from "../../utils/table";
|
|
15
15
|
import TablePopup from "./TablePopup";
|
16
16
|
import { useEditorSelection } from "../../hooks/useMouseMove";
|
17
17
|
import TableStyles from "./Styles";
|
18
|
-
import useClickOutside from "../../hooks/useClickOutside";
|
19
18
|
import "./table.css";
|
20
19
|
import { jsx as _jsx } from "react/jsx-runtime";
|
21
20
|
import { jsxs as _jsxs } from "react/jsx-runtime";
|
@@ -150,7 +149,7 @@ const Table = props => {
|
|
150
149
|
title: text,
|
151
150
|
arrow: true,
|
152
151
|
children: /*#__PURE__*/_jsx(IconButton, {
|
153
|
-
className:
|
152
|
+
className: `toolbtn ${action?.type}`,
|
154
153
|
onClick: handleAction(action),
|
155
154
|
children: /*#__PURE__*/_jsx(Icon, {})
|
156
155
|
})
|
@@ -0,0 +1,77 @@
|
|
1
|
+
import React from "react";
|
2
|
+
import { Node, Transforms } from "slate";
|
3
|
+
import { Box } from "@mui/material";
|
4
|
+
import { StyleContent } from "../../../StyleBuilder";
|
5
|
+
import tableStyle from "../../../StyleBuilder/tableStyle";
|
6
|
+
import { TableUtil } from "../../../../utils/table";
|
7
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
8
|
+
const TableSettings = props => {
|
9
|
+
const {
|
10
|
+
editor,
|
11
|
+
path,
|
12
|
+
customProps
|
13
|
+
} = props;
|
14
|
+
const item_path = path?.split("|").map(m => parseInt(m));
|
15
|
+
const element_path = [...item_path, 0];
|
16
|
+
const element = Node.get(editor, element_path);
|
17
|
+
const getTableProps = () => {
|
18
|
+
try {
|
19
|
+
const firstTCell = [...element_path, 0, 0, 0, 0];
|
20
|
+
const firstTCellTarget = {
|
21
|
+
anchor: {
|
22
|
+
path: [...firstTCell],
|
23
|
+
offset: 0
|
24
|
+
},
|
25
|
+
focus: {
|
26
|
+
path: [...firstTCell],
|
27
|
+
offset: 0
|
28
|
+
}
|
29
|
+
};
|
30
|
+
Transforms.select(editor, firstTCellTarget);
|
31
|
+
const table = new TableUtil(editor);
|
32
|
+
const tableProps = table.getTableProps();
|
33
|
+
return {
|
34
|
+
table,
|
35
|
+
tableProps
|
36
|
+
};
|
37
|
+
} catch (err) {
|
38
|
+
return element;
|
39
|
+
}
|
40
|
+
};
|
41
|
+
const onChange = data => {
|
42
|
+
try {
|
43
|
+
const {
|
44
|
+
table,
|
45
|
+
tableProps
|
46
|
+
} = getTableProps();
|
47
|
+
const updateData = {
|
48
|
+
...data
|
49
|
+
};
|
50
|
+
delete updateData.children;
|
51
|
+
delete updateData.type;
|
52
|
+
table.updateTableStyle(updateData, {
|
53
|
+
...tableProps
|
54
|
+
});
|
55
|
+
} catch (err) {
|
56
|
+
console.log(err);
|
57
|
+
}
|
58
|
+
};
|
59
|
+
const handleClose = () => {
|
60
|
+
console.log("close");
|
61
|
+
};
|
62
|
+
return /*#__PURE__*/_jsx(Box, {
|
63
|
+
component: "div",
|
64
|
+
className: "item-w",
|
65
|
+
children: tableStyle?.map((m, i) => {
|
66
|
+
return /*#__PURE__*/_jsx(StyleContent, {
|
67
|
+
renderTabs: tableStyle,
|
68
|
+
value: m.value,
|
69
|
+
element: getTableProps()?.tableProps?.styleProps || {},
|
70
|
+
onChange: onChange,
|
71
|
+
customProps: customProps,
|
72
|
+
handleClose: handleClose
|
73
|
+
}, `tab_${m.value}_$${i}`);
|
74
|
+
})
|
75
|
+
});
|
76
|
+
};
|
77
|
+
export default TableSettings;
|
@@ -5,6 +5,7 @@ import VideoSettings from "./VideoSettings";
|
|
5
5
|
import BoxSettings from "./BoxSettings";
|
6
6
|
import AppHeaderSettings from "./AppHeaderSettings";
|
7
7
|
import FormSettings from "./FormSettings";
|
8
|
+
import TableSettings from "./TableSettings";
|
8
9
|
const SettingsComponents = {
|
9
10
|
text: TextSettings,
|
10
11
|
button: ButtonSettings,
|
@@ -12,6 +13,7 @@ const SettingsComponents = {
|
|
12
13
|
video: VideoSettings,
|
13
14
|
box: BoxSettings,
|
14
15
|
appHeader: AppHeaderSettings,
|
15
|
-
form: FormSettings
|
16
|
+
form: FormSettings,
|
17
|
+
table: TableSettings
|
16
18
|
};
|
17
19
|
export default SettingsComponents;
|
@@ -2,17 +2,19 @@ export const settingsLabel = {
|
|
2
2
|
text: "Text Settings",
|
3
3
|
button: "Button Settings",
|
4
4
|
image: "Image Settings",
|
5
|
-
video: "Video Settings",
|
5
|
+
video: "Embed or Video Settings",
|
6
6
|
box: "Box Settings",
|
7
7
|
appHeader: "App Header Settings",
|
8
|
-
form: "Form Settings"
|
8
|
+
form: "Form Settings",
|
9
|
+
table: "Table Settings"
|
9
10
|
};
|
10
11
|
export const ItemTypes = {
|
11
12
|
text: "Text",
|
12
13
|
button: "Button",
|
13
14
|
image: "Image",
|
14
|
-
video: "Video",
|
15
|
+
video: "Embed or Video",
|
15
16
|
box: "Box",
|
16
17
|
appHeader: "App Header",
|
17
|
-
form: "Form"
|
18
|
+
form: "Form",
|
19
|
+
table: "Table"
|
18
20
|
};
|
@@ -208,7 +208,8 @@ export const onPasteRnDNode = (editor, {
|
|
208
208
|
left: parsed_node?.left + 20,
|
209
209
|
marginTop: parsed_node?.marginTop + 20,
|
210
210
|
// to maintain unique drop location in different section also
|
211
|
-
gridArea: "1 / 1 / 2 / 2"
|
211
|
+
gridArea: "1 / 1 / 2 / 2",
|
212
|
+
xs_updatedOn: null
|
212
213
|
}], {
|
213
214
|
at: new_path
|
214
215
|
});
|
@@ -42,37 +42,150 @@ export const insertFreeGrid = (editor, path, extProps) => {
|
|
42
42
|
children: [{
|
43
43
|
type: "paragraph",
|
44
44
|
children: [{
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
45
|
+
type: "grid",
|
46
|
+
grid: "container",
|
47
|
+
children: [{
|
48
|
+
type: "grid-item",
|
49
|
+
grid: 12,
|
50
|
+
children: [{
|
51
|
+
type: "alignCenter",
|
52
|
+
children: [{
|
53
|
+
type: "paragraph",
|
54
|
+
children: [{
|
55
|
+
text: "Lorem ipsum sit ",
|
56
|
+
fontSize: {
|
57
|
+
xs: "80px",
|
58
|
+
sm: "80px",
|
59
|
+
md: "80px",
|
60
|
+
lg: "80px"
|
61
|
+
},
|
62
|
+
fontFamily: "PoppinsBold",
|
63
|
+
color: "rgb(132, 141, 151)"
|
64
|
+
}]
|
65
|
+
}]
|
66
|
+
}, {
|
67
|
+
type: "alignCenter",
|
68
|
+
children: [{
|
69
|
+
type: "paragraph",
|
70
|
+
children: [{
|
71
|
+
fontSize: {
|
72
|
+
xs: "80px",
|
73
|
+
sm: "80px",
|
74
|
+
md: "80px",
|
75
|
+
lg: "80px"
|
76
|
+
},
|
77
|
+
fontFamily: "PoppinsBold",
|
78
|
+
text: "amet.",
|
79
|
+
color: "rgb(132, 141, 151)"
|
80
|
+
}, {
|
81
|
+
fontSize: {
|
82
|
+
xs: "80px",
|
83
|
+
sm: "80px",
|
84
|
+
md: "80px",
|
85
|
+
lg: "80px"
|
86
|
+
},
|
87
|
+
fontFamily: "PoppinsBold",
|
88
|
+
text: " "
|
89
|
+
}, {
|
90
|
+
fontSize: {
|
91
|
+
xs: "80px",
|
92
|
+
sm: "80px",
|
93
|
+
md: "80px",
|
94
|
+
lg: "80px"
|
95
|
+
},
|
96
|
+
fontFamily: "PoppinsBold",
|
97
|
+
text: "Lorem",
|
98
|
+
color: "rgb(131, 96, 253)"
|
99
|
+
}]
|
100
|
+
}]
|
101
|
+
}],
|
102
|
+
bgColor: "rgba(255, 255, 255, 0)",
|
103
|
+
borderColor: "rgba(204, 204, 204, 0)",
|
104
|
+
lockSpacing: true,
|
105
|
+
bannerSpacing: {
|
106
|
+
top: "16",
|
107
|
+
left: "16",
|
108
|
+
right: "16",
|
109
|
+
bottom: "16"
|
110
|
+
}
|
111
|
+
}],
|
112
|
+
alignment: {
|
113
|
+
flexDirection: "column"
|
51
114
|
},
|
52
|
-
|
115
|
+
lockSpacing: false,
|
116
|
+
bannerSpacing: {
|
117
|
+
top: "32",
|
118
|
+
left: "16",
|
119
|
+
right: "16",
|
120
|
+
bottom: "16"
|
121
|
+
},
|
122
|
+
gridSize: 8
|
53
123
|
}]
|
54
124
|
}]
|
55
125
|
}],
|
56
|
-
gridArea: "
|
57
|
-
height:
|
126
|
+
gridArea: "1 / 1 / 2 / 2",
|
127
|
+
height: 323,
|
58
128
|
width: 746,
|
59
|
-
left:
|
60
|
-
marginTop:
|
129
|
+
left: 127,
|
130
|
+
marginTop: 25,
|
61
131
|
top_xs: 105.1875,
|
62
132
|
left_xs: 22,
|
63
133
|
marginTop_xs: 38,
|
64
134
|
width_xs: 272,
|
65
135
|
height_xs: 163.0078125,
|
66
136
|
gridArea_xs: "2 / 1 / 3 / 2",
|
67
|
-
updated_at:
|
68
|
-
lg_updatedOn:
|
69
|
-
xs_updatedOn:
|
137
|
+
updated_at: 1729055084817,
|
138
|
+
lg_updatedOn: 1729055010519,
|
139
|
+
xs_updatedOn: null
|
140
|
+
}, {
|
141
|
+
type: "freegridItem",
|
142
|
+
childType: "button",
|
143
|
+
children: [{
|
144
|
+
type: "button",
|
145
|
+
children: [{
|
146
|
+
text: ""
|
147
|
+
}],
|
148
|
+
buttonLink: {
|
149
|
+
linkType: "webAddress"
|
150
|
+
},
|
151
|
+
iconPosition: "start",
|
152
|
+
bgColor: "#2563EB",
|
153
|
+
textColor: "#FFF",
|
154
|
+
borderRadius: {
|
155
|
+
topLeft: 30,
|
156
|
+
topRight: 30,
|
157
|
+
bottomLeft: 30,
|
158
|
+
bottomRight: 30
|
159
|
+
},
|
160
|
+
bannerSpacing: {
|
161
|
+
left: 12,
|
162
|
+
top: 12,
|
163
|
+
right: 12,
|
164
|
+
bottom: 12
|
165
|
+
},
|
166
|
+
textAlign: "center",
|
167
|
+
label: "Get Started"
|
168
|
+
}],
|
169
|
+
gridArea: "7 / 1 / 8 / 2",
|
170
|
+
left: 428,
|
171
|
+
marginTop: 42,
|
172
|
+
top: 0,
|
173
|
+
width: 143,
|
174
|
+
height: 50,
|
175
|
+
lg_updatedOn: 1729055084816,
|
176
|
+
updated_at: 1729055084817,
|
177
|
+
top_xs: 366,
|
178
|
+
left_xs: 24,
|
179
|
+
marginTop_xs: 12,
|
180
|
+
width_xs: 272,
|
181
|
+
height_xs: 48,
|
182
|
+
gridArea_xs: "8 / 1 / 9 / 2"
|
70
183
|
}],
|
71
184
|
height_xs: 593.0625,
|
72
|
-
updated_at:
|
185
|
+
updated_at: 1729055084816,
|
73
186
|
width: 0,
|
74
|
-
sectionBgColor: "rgb(
|
75
|
-
xs_updatedOn:
|
187
|
+
sectionBgColor: "rgb(255, 255, 255)",
|
188
|
+
xs_updatedOn: null,
|
76
189
|
sectionName: "Home"
|
77
190
|
}];
|
78
191
|
const newPath = path ? path : editor?.selection?.anchor?.path;
|
@@ -1,6 +1,111 @@
|
|
1
1
|
import { Transforms, Editor, Range, Element, Path, Node } from "slate";
|
2
2
|
import { ReactEditor } from "slate-react";
|
3
3
|
import { customInsertNode } from "./helper";
|
4
|
+
export const DEFAULT_TABLE_NODE = () => ({
|
5
|
+
type: "table",
|
6
|
+
children: [{
|
7
|
+
type: "table-row",
|
8
|
+
children: [{
|
9
|
+
type: "table-cell",
|
10
|
+
children: [{
|
11
|
+
type: "paragraph",
|
12
|
+
children: [{
|
13
|
+
text: ""
|
14
|
+
}],
|
15
|
+
cellBgColor: "#FFFFFF"
|
16
|
+
}]
|
17
|
+
}, {
|
18
|
+
type: "table-cell",
|
19
|
+
children: [{
|
20
|
+
type: "paragraph",
|
21
|
+
children: [{
|
22
|
+
text: ""
|
23
|
+
}],
|
24
|
+
cellBgColor: "#FFFFFF"
|
25
|
+
}]
|
26
|
+
}, {
|
27
|
+
type: "table-cell",
|
28
|
+
children: [{
|
29
|
+
type: "paragraph",
|
30
|
+
children: [{
|
31
|
+
text: ""
|
32
|
+
}],
|
33
|
+
cellBgColor: "#FFFFFF"
|
34
|
+
}]
|
35
|
+
}]
|
36
|
+
}, {
|
37
|
+
type: "table-row",
|
38
|
+
children: [{
|
39
|
+
type: "table-cell",
|
40
|
+
children: [{
|
41
|
+
type: "paragraph",
|
42
|
+
children: [{
|
43
|
+
text: ""
|
44
|
+
}],
|
45
|
+
cellBgColor: "#FFFFFF"
|
46
|
+
}]
|
47
|
+
}, {
|
48
|
+
type: "table-cell",
|
49
|
+
children: [{
|
50
|
+
type: "paragraph",
|
51
|
+
children: [{
|
52
|
+
text: ""
|
53
|
+
}],
|
54
|
+
cellBgColor: "#FFFFFF"
|
55
|
+
}]
|
56
|
+
}, {
|
57
|
+
type: "table-cell",
|
58
|
+
children: [{
|
59
|
+
type: "paragraph",
|
60
|
+
children: [{
|
61
|
+
text: ""
|
62
|
+
}],
|
63
|
+
cellBgColor: "#FFFFFF"
|
64
|
+
}],
|
65
|
+
size: {
|
66
|
+
widthInPercent: 100,
|
67
|
+
height: 100,
|
68
|
+
width: 365.3307291666667
|
69
|
+
}
|
70
|
+
}]
|
71
|
+
}, {
|
72
|
+
type: "table-row",
|
73
|
+
children: [{
|
74
|
+
type: "table-cell",
|
75
|
+
children: [{
|
76
|
+
type: "paragraph",
|
77
|
+
children: [{
|
78
|
+
text: ""
|
79
|
+
}],
|
80
|
+
cellBgColor: "#FFFFFF"
|
81
|
+
}]
|
82
|
+
}, {
|
83
|
+
type: "table-cell",
|
84
|
+
children: [{
|
85
|
+
type: "paragraph",
|
86
|
+
children: [{
|
87
|
+
text: ""
|
88
|
+
}],
|
89
|
+
cellBgColor: "#FFFFFF"
|
90
|
+
}]
|
91
|
+
}, {
|
92
|
+
type: "table-cell",
|
93
|
+
children: [{
|
94
|
+
type: "paragraph",
|
95
|
+
children: [{
|
96
|
+
text: ""
|
97
|
+
}],
|
98
|
+
cellBgColor: "#FFFFFF"
|
99
|
+
}],
|
100
|
+
size: {
|
101
|
+
height: 300,
|
102
|
+
widthInPercent: 100
|
103
|
+
}
|
104
|
+
}]
|
105
|
+
}],
|
106
|
+
rows: 3,
|
107
|
+
columns: 3
|
108
|
+
});
|
4
109
|
const prefixKey = (obj, pk = "") => {
|
5
110
|
return Object.keys(obj).reduce((a, b) => {
|
6
111
|
a[`${pk}${b}`] = obj[b];
|