@soned/schema-generate 1.0.0

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.
package/README.md ADDED
@@ -0,0 +1,34 @@
1
+ # @sone/schema-generate
2
+
3
+ Schema表单布局设计器组件,提供可视化的表单布局配置界面。
4
+
5
+ ## 安装
6
+
7
+ ```bash
8
+ npm install @sone/schema-generate
9
+ ```
10
+
11
+ ## 使用
12
+
13
+ ### GridBuilder - 可视化表单布局设计器
14
+
15
+ ```tsx
16
+ import { GridBuilder } from "@sone/schema-generate";
17
+ // 注意:需要导入 CSS 文件以应用自定义样式
18
+ import "@sone/schema-generate/dist/GridBuilder.css";
19
+
20
+ function App() {
21
+ const [schema, setSchema] = useState(null);
22
+
23
+ return <GridBuilder value={schema} onChange={setSchema} />;
24
+ }
25
+ ```
26
+
27
+ ## API
28
+
29
+ ### GridBuilder
30
+
31
+ | 参数 | 说明 | 类型 | 默认值 |
32
+ | -------- | -------------- | ------------------------------ | ------ |
33
+ | value | 当前Schema值 | `SchemaForm` | - |
34
+ | onChange | Schema变化回调 | `(schema: SchemaForm) => void` | - |
@@ -0,0 +1,12 @@
1
+ .sone-grid-container {
2
+ min-height: 400px;
3
+ background: #12121a;
4
+ margin-top: 10px;
5
+ border: 1px solid rgba(0, 240, 255, 0.2);
6
+ background-image:
7
+ linear-gradient(rgba(0, 240, 255, 0.05) 1px, transparent 1px),
8
+ linear-gradient(90deg, rgba(0, 240, 255, 0.05) 1px, transparent 1px);
9
+ background-size: 20px 20px;
10
+ position: relative;
11
+ transition: height 200ms ease;
12
+ }
package/dist/index.js ADDED
@@ -0,0 +1,343 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+
30
+ // src/index.ts
31
+ var src_exports = {};
32
+ __export(src_exports, {
33
+ GridBuilder: () => GridBuilder_default
34
+ });
35
+ module.exports = __toCommonJS(src_exports);
36
+
37
+ // src/components/GridBuilder.tsx
38
+ var import_icons = require("@ant-design/icons");
39
+ var import_antd = require("antd");
40
+ var import_react = require("react");
41
+ var import_react_grid_layout = __toESM(require("react-grid-layout"));
42
+ var import_react_grid_layout2 = require("react-grid-layout");
43
+ var import_styles = require("react-grid-layout/css/styles.css");
44
+ var import_GridBuilder = require("./GridBuilder-TQWQAMLN.css");
45
+ var import_jsx_runtime = require("react/jsx-runtime");
46
+ var fieldTypes = [
47
+ { label: "\u6587\u672C\u8F93\u5165", value: "input" },
48
+ { label: "\u591A\u884C\u6587\u672C", value: "textarea" },
49
+ { label: "\u6570\u5B57\u8F93\u5165", value: "number" },
50
+ { label: "\u4E0B\u62C9\u9009\u62E9", value: "select" },
51
+ { label: "\u65E5\u671F\u9009\u62E9", value: "date" },
52
+ { label: "\u65E5\u671F\u8303\u56F4", value: "dateRange" },
53
+ { label: "\u5F00\u5173", value: "switch" },
54
+ { label: "\u5355\u9009\u6846", value: "radio" },
55
+ { label: "\u6309\u94AE\u5F0F\u5355\u9009", value: "radioButton" },
56
+ { label: "\u590D\u9009\u6846", value: "checkbox" },
57
+ { label: "\u8B66\u544A\u63D0\u793A", value: "alert" },
58
+ { label: "\u5206\u5272\u7EBF", value: "divider" },
59
+ { label: "\u5206\u6BB5\u5668", value: "segmented" },
60
+ { label: "\u6811\u5F62\u9009\u62E9", value: "treeSelect" },
61
+ { label: "\u7EA7\u8054\u9009\u62E9", value: "cascader" },
62
+ { label: "\u81EA\u52A8\u5B8C\u6210", value: "autoComplete" },
63
+ { label: "\u6570\u5B57\u8303\u56F4", value: "digitRange" },
64
+ { label: "\u8BC4\u5206", value: "rate" }
65
+ ];
66
+ var GridBuilder = ({ value, onChange }) => {
67
+ const { width, containerRef, mounted } = (0, import_react_grid_layout2.useContainerWidth)();
68
+ const [schema, setSchema] = (0, import_react.useState)(
69
+ value || {
70
+ fields: [],
71
+ gridConfig: {
72
+ cols: 12,
73
+ rowHeight: 60,
74
+ margin: [10, 10],
75
+ containerPadding: [10, 10]
76
+ }
77
+ }
78
+ );
79
+ const [editingField, setEditingField] = (0, import_react.useState)(null);
80
+ const [isModalVisible, setIsModalVisible] = (0, import_react.useState)(false);
81
+ const generateLayout = (0, import_react.useCallback)(() => {
82
+ return schema.fields.map((field) => ({
83
+ i: field.key,
84
+ x: field.gridItem?.x ?? 0,
85
+ y: field.gridItem?.y ?? 0,
86
+ w: field.gridItem?.w ?? 6,
87
+ h: field.gridItem?.h ?? 2,
88
+ minW: field.gridItem?.minW ?? 3,
89
+ maxW: field.gridItem?.maxW ?? 12,
90
+ minH: field.gridItem?.minH ?? 1,
91
+ maxH: field.gridItem?.maxH ?? 4,
92
+ static: field.gridItem?.static ?? false
93
+ }));
94
+ }, [schema.fields]);
95
+ const handleLayoutChange = (layout) => {
96
+ const updatedFields = schema.fields.map((field) => {
97
+ const layoutItem = layout.find((item) => item.i === field.key);
98
+ if (layoutItem) {
99
+ return {
100
+ ...field,
101
+ gridItem: {
102
+ x: layoutItem.x,
103
+ y: layoutItem.y,
104
+ w: layoutItem.w,
105
+ h: layoutItem.h,
106
+ minW: layoutItem.minW,
107
+ maxW: layoutItem.maxW,
108
+ minH: layoutItem.minH,
109
+ maxH: layoutItem.maxH,
110
+ static: layoutItem.static
111
+ }
112
+ };
113
+ }
114
+ return field;
115
+ });
116
+ const newSchema = { ...schema, fields: updatedFields };
117
+ setSchema(newSchema);
118
+ onChange?.(newSchema);
119
+ };
120
+ const handleAddField = () => {
121
+ const newField = {
122
+ key: `field_${Date.now()}`,
123
+ label: "\u65B0\u5B57\u6BB5",
124
+ type: "input",
125
+ required: false,
126
+ gridItem: {
127
+ x: 0,
128
+ y: Infinity,
129
+ // 自动放置在最后一行
130
+ w: 6,
131
+ h: 2
132
+ }
133
+ };
134
+ const newSchema = {
135
+ ...schema,
136
+ fields: [...schema.fields, newField]
137
+ };
138
+ setSchema(newSchema);
139
+ onChange?.(newSchema);
140
+ };
141
+ const handleRemoveField = (key) => {
142
+ const newFields = schema.fields.filter((field) => field.key !== key);
143
+ const newSchema = { ...schema, fields: newFields };
144
+ setSchema(newSchema);
145
+ onChange?.(newSchema);
146
+ };
147
+ const handleEditField = (field) => {
148
+ setEditingField({ ...field });
149
+ setIsModalVisible(true);
150
+ };
151
+ const handleSaveField = () => {
152
+ if (!editingField)
153
+ return;
154
+ const newFields = schema.fields.map(
155
+ (field) => field.key === editingField.key ? editingField : field
156
+ );
157
+ const newSchema = { ...schema, fields: newFields };
158
+ setSchema(newSchema);
159
+ onChange?.(newSchema);
160
+ setIsModalVisible(false);
161
+ setEditingField(null);
162
+ };
163
+ const renderGridItem = (field) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
164
+ import_antd.Card,
165
+ {
166
+ size: "small",
167
+ title: field.label,
168
+ extra: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_antd.Space, { children: [
169
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
170
+ import_antd.Button,
171
+ {
172
+ type: "text",
173
+ size: "small",
174
+ onClick: () => handleEditField(field),
175
+ children: "\u7F16\u8F91"
176
+ }
177
+ ),
178
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
179
+ import_antd.Button,
180
+ {
181
+ type: "text",
182
+ size: "small",
183
+ danger: true,
184
+ onClick: () => handleRemoveField(field.key),
185
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_icons.DeleteOutlined, {})
186
+ }
187
+ )
188
+ ] }),
189
+ style: { height: "100%", overflow: "auto" },
190
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { style: { padding: "8px 0" }, children: [
191
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { style: { marginBottom: 4, color: "#999", fontSize: 12 }, children: [
192
+ "\u7C7B\u578B: ",
193
+ fieldTypes.find((t) => t.value === field.type)?.label
194
+ ] }),
195
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { style: { marginBottom: 4, color: "#999", fontSize: 12 }, children: [
196
+ "\u6807\u8BC6: ",
197
+ field.key
198
+ ] }),
199
+ field.required && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { style: { color: "#ff4d4f", fontSize: 12 }, children: "\u5FC5\u586B" })
200
+ ] })
201
+ }
202
+ );
203
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { children: [
204
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
205
+ import_antd.Card,
206
+ {
207
+ title: "\u53EF\u89C6\u5316\u8868\u5355\u5E03\u5C40\u8BBE\u8BA1\u5668",
208
+ extra: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
209
+ import_antd.Button,
210
+ {
211
+ type: "primary",
212
+ icon: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_icons.PlusOutlined, {}),
213
+ onClick: handleAddField,
214
+ children: "\u6DFB\u52A0\u5B57\u6BB5"
215
+ }
216
+ ),
217
+ children: [
218
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_antd.Form, { layout: "inline", style: { marginBottom: 16 }, children: [
219
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_antd.Form.Item, { label: "\u7F51\u683C\u5217\u6570", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
220
+ import_antd.Select,
221
+ {
222
+ value: schema.gridConfig?.cols ?? 12,
223
+ onChange: (value2) => {
224
+ const newSchema = {
225
+ ...schema,
226
+ gridConfig: { ...schema.gridConfig, cols: value2 }
227
+ };
228
+ setSchema(newSchema);
229
+ onChange?.(newSchema);
230
+ },
231
+ style: { width: 100 },
232
+ options: [
233
+ { label: "6\u5217", value: 6 },
234
+ { label: "8\u5217", value: 8 },
235
+ { label: "10\u5217", value: 10 },
236
+ { label: "12\u5217", value: 12 },
237
+ { label: "16\u5217", value: 16 },
238
+ { label: "24\u5217", value: 24 }
239
+ ]
240
+ }
241
+ ) }),
242
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_antd.Form.Item, { label: "\u884C\u9AD8", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
243
+ import_antd.Input,
244
+ {
245
+ type: "number",
246
+ value: schema.gridConfig?.rowHeight ?? 60,
247
+ onChange: (e) => {
248
+ const newSchema = {
249
+ ...schema,
250
+ gridConfig: {
251
+ ...schema.gridConfig,
252
+ rowHeight: Number(e.target.value)
253
+ }
254
+ };
255
+ setSchema(newSchema);
256
+ onChange?.(newSchema);
257
+ },
258
+ suffix: "px"
259
+ }
260
+ ) })
261
+ ] }),
262
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { ref: containerRef, className: "sone-grid-container", children: mounted && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
263
+ import_react_grid_layout.default,
264
+ {
265
+ layout: generateLayout(),
266
+ cols: schema.gridConfig?.cols ?? 12,
267
+ rowHeight: schema.gridConfig?.rowHeight ?? 60,
268
+ margin: schema.gridConfig?.margin ?? [10, 10],
269
+ containerPadding: schema.gridConfig?.containerPadding ?? [10, 10],
270
+ width,
271
+ onLayoutChange: handleLayoutChange,
272
+ draggableHandle: ".ant-card-head",
273
+ resizeHandles: ["se"],
274
+ isDraggable: true,
275
+ isResizable: true,
276
+ children: schema.fields.map((field) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { children: renderGridItem(field) }, field.key))
277
+ }
278
+ ) })
279
+ ]
280
+ }
281
+ ),
282
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
283
+ import_antd.Modal,
284
+ {
285
+ title: "\u7F16\u8F91\u5B57\u6BB5",
286
+ open: isModalVisible,
287
+ onOk: handleSaveField,
288
+ onCancel: () => {
289
+ setIsModalVisible(false);
290
+ setEditingField(null);
291
+ },
292
+ width: 600,
293
+ children: editingField && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_antd.Form, { layout: "vertical", children: [
294
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_antd.Form.Item, { label: "\u5B57\u6BB5\u6807\u8BC6", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
295
+ import_antd.Input,
296
+ {
297
+ value: editingField.key,
298
+ onChange: (e) => setEditingField({ ...editingField, key: e.target.value })
299
+ }
300
+ ) }),
301
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_antd.Form.Item, { label: "\u5B57\u6BB5\u6807\u7B7E", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
302
+ import_antd.Input,
303
+ {
304
+ value: editingField.label,
305
+ onChange: (e) => setEditingField({ ...editingField, label: e.target.value })
306
+ }
307
+ ) }),
308
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_antd.Form.Item, { label: "\u5B57\u6BB5\u7C7B\u578B", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
309
+ import_antd.Select,
310
+ {
311
+ value: editingField.type,
312
+ onChange: (value2) => setEditingField({ ...editingField, type: value2 }),
313
+ options: fieldTypes
314
+ }
315
+ ) }),
316
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_antd.Form.Item, { label: "\u662F\u5426\u5FC5\u586B", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
317
+ import_antd.Switch,
318
+ {
319
+ checked: editingField.required,
320
+ onChange: (checked) => setEditingField({ ...editingField, required: checked })
321
+ }
322
+ ) }),
323
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_antd.Form.Item, { label: "\u5360\u4F4D\u7B26", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
324
+ import_antd.Input,
325
+ {
326
+ value: editingField.placeholder,
327
+ onChange: (e) => setEditingField({
328
+ ...editingField,
329
+ placeholder: e.target.value
330
+ })
331
+ }
332
+ ) })
333
+ ] })
334
+ }
335
+ )
336
+ ] });
337
+ };
338
+ var GridBuilder_default = GridBuilder;
339
+ // Annotate the CommonJS export names for ESM import in node:
340
+ 0 && (module.exports = {
341
+ GridBuilder
342
+ });
343
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/components/GridBuilder.tsx"],"sourcesContent":["export { default as GridBuilder } from \"./components/GridBuilder\";\r\nexport * from \"./types/schema\";\r\n","import { DeleteOutlined, PlusOutlined } from \"@ant-design/icons\";\r\nimport { Button, Card, Form, Input, Modal, Select, Space, Switch } from \"antd\";\r\nimport React, { useCallback, useState } from \"react\";\r\nimport ReactGridLayout from \"react-grid-layout\";\r\n// @ts-ignore - useContainerWidth 在运行时存在但类型定义可能缺失\r\nimport { useContainerWidth } from \"react-grid-layout\";\r\nimport \"react-grid-layout/css/styles.css\";\r\nimport type { SchemaField, SchemaForm } from \"../types/schema\";\r\nimport \"./GridBuilder.css\";\r\n\r\ninterface GridBuilderProps {\r\n value?: SchemaForm;\r\n onChange?: (schema: SchemaForm) => void;\r\n}\r\n\r\nconst fieldTypes = [\r\n { label: \"文本输入\", value: \"input\" },\r\n { label: \"多行文本\", value: \"textarea\" },\r\n { label: \"数字输入\", value: \"number\" },\r\n { label: \"下拉选择\", value: \"select\" },\r\n { label: \"日期选择\", value: \"date\" },\r\n { label: \"日期范围\", value: \"dateRange\" },\r\n { label: \"开关\", value: \"switch\" },\r\n { label: \"单选框\", value: \"radio\" },\r\n { label: \"按钮式单选\", value: \"radioButton\" },\r\n { label: \"复选框\", value: \"checkbox\" },\r\n { label: \"警告提示\", value: \"alert\" },\r\n { label: \"分割线\", value: \"divider\" },\r\n { label: \"分段器\", value: \"segmented\" },\r\n { label: \"树形选择\", value: \"treeSelect\" },\r\n { label: \"级联选择\", value: \"cascader\" },\r\n { label: \"自动完成\", value: \"autoComplete\" },\r\n { label: \"数字范围\", value: \"digitRange\" },\r\n { label: \"评分\", value: \"rate\" },\r\n];\r\n\r\n// react-grid-layout 2.x 中使用 useContainerWidth Hook\r\nconst GridBuilder: React.FC<GridBuilderProps> = ({ value, onChange }) => {\r\n const { width, containerRef, mounted } = useContainerWidth();\r\n\r\n const [schema, setSchema] = useState<SchemaForm>(\r\n value || {\r\n fields: [],\r\n gridConfig: {\r\n cols: 12,\r\n rowHeight: 60,\r\n margin: [10, 10],\r\n containerPadding: [10, 10],\r\n },\r\n },\r\n );\r\n const [editingField, setEditingField] = useState<SchemaField | null>(null);\r\n const [isModalVisible, setIsModalVisible] = useState(false);\r\n\r\n // 生成网格布局数据\r\n const generateLayout = useCallback(() => {\r\n return schema.fields.map((field) => ({\r\n i: field.key,\r\n x: field.gridItem?.x ?? 0,\r\n y: field.gridItem?.y ?? 0,\r\n w: field.gridItem?.w ?? 6,\r\n h: field.gridItem?.h ?? 2,\r\n minW: field.gridItem?.minW ?? 3,\r\n maxW: field.gridItem?.maxW ?? 12,\r\n minH: field.gridItem?.minH ?? 1,\r\n maxH: field.gridItem?.maxH ?? 4,\r\n static: field.gridItem?.static ?? false,\r\n }));\r\n }, [schema.fields]);\r\n\r\n // 处理布局变化\r\n const handleLayoutChange = (layout: any) => {\r\n const updatedFields = schema.fields.map((field) => {\r\n const layoutItem = layout.find((item: any) => item.i === field.key);\r\n if (layoutItem) {\r\n return {\r\n ...field,\r\n gridItem: {\r\n x: layoutItem.x,\r\n y: layoutItem.y,\r\n w: layoutItem.w,\r\n h: layoutItem.h,\r\n minW: layoutItem.minW,\r\n maxW: layoutItem.maxW,\r\n minH: layoutItem.minH,\r\n maxH: layoutItem.maxH,\r\n static: layoutItem.static,\r\n },\r\n };\r\n }\r\n return field;\r\n });\r\n\r\n const newSchema = { ...schema, fields: updatedFields };\r\n setSchema(newSchema);\r\n onChange?.(newSchema);\r\n };\r\n\r\n // 添加字段\r\n const handleAddField = () => {\r\n const newField: SchemaField = {\r\n key: `field_${Date.now()}`,\r\n label: \"新字段\",\r\n type: \"input\",\r\n required: false,\r\n gridItem: {\r\n x: 0,\r\n y: Infinity, // 自动放置在最后一行\r\n w: 6,\r\n h: 2,\r\n },\r\n };\r\n const newSchema = {\r\n ...schema,\r\n fields: [...schema.fields, newField],\r\n };\r\n setSchema(newSchema);\r\n onChange?.(newSchema);\r\n };\r\n\r\n // 删除字段\r\n const handleRemoveField = (key: string) => {\r\n const newFields = schema.fields.filter((field) => field.key !== key);\r\n const newSchema = { ...schema, fields: newFields };\r\n setSchema(newSchema);\r\n onChange?.(newSchema);\r\n };\r\n\r\n // 编辑字段\r\n const handleEditField = (field: SchemaField) => {\r\n setEditingField({ ...field });\r\n setIsModalVisible(true);\r\n };\r\n\r\n // 保存字段编辑\r\n const handleSaveField = () => {\r\n if (!editingField) return;\r\n\r\n const newFields = schema.fields.map((field) =>\r\n field.key === editingField.key ? editingField : field,\r\n );\r\n const newSchema = { ...schema, fields: newFields };\r\n setSchema(newSchema);\r\n onChange?.(newSchema);\r\n setIsModalVisible(false);\r\n setEditingField(null);\r\n };\r\n\r\n // 渲染网格项内容\r\n const renderGridItem = (field: SchemaField) => (\r\n <Card\r\n size=\"small\"\r\n title={field.label}\r\n extra={\r\n <Space>\r\n <Button\r\n type=\"text\"\r\n size=\"small\"\r\n onClick={() => handleEditField(field)}\r\n >\r\n 编辑\r\n </Button>\r\n <Button\r\n type=\"text\"\r\n size=\"small\"\r\n danger\r\n onClick={() => handleRemoveField(field.key)}\r\n >\r\n <DeleteOutlined />\r\n </Button>\r\n </Space>\r\n }\r\n style={{ height: \"100%\", overflow: \"auto\" }}\r\n >\r\n <div style={{ padding: \"8px 0\" }}>\r\n <div style={{ marginBottom: 4, color: \"#999\", fontSize: 12 }}>\r\n 类型: {fieldTypes.find((t) => t.value === field.type)?.label}\r\n </div>\r\n <div style={{ marginBottom: 4, color: \"#999\", fontSize: 12 }}>\r\n 标识: {field.key}\r\n </div>\r\n {field.required && (\r\n <div style={{ color: \"#ff4d4f\", fontSize: 12 }}>必填</div>\r\n )}\r\n </div>\r\n </Card>\r\n );\r\n\r\n return (\r\n <div>\r\n <Card\r\n title=\"可视化表单布局设计器\"\r\n extra={\r\n <Button\r\n type=\"primary\"\r\n icon={<PlusOutlined />}\r\n onClick={handleAddField}\r\n >\r\n 添加字段\r\n </Button>\r\n }\r\n >\r\n <Form layout=\"inline\" style={{ marginBottom: 16 }}>\r\n <Form.Item label=\"网格列数\">\r\n <Select\r\n value={schema.gridConfig?.cols ?? 12}\r\n onChange={(value) => {\r\n const newSchema = {\r\n ...schema,\r\n gridConfig: { ...schema.gridConfig, cols: value },\r\n };\r\n setSchema(newSchema);\r\n onChange?.(newSchema);\r\n }}\r\n style={{ width: 100 }}\r\n options={[\r\n { label: \"6列\", value: 6 },\r\n { label: \"8列\", value: 8 },\r\n { label: \"10列\", value: 10 },\r\n { label: \"12列\", value: 12 },\r\n { label: \"16列\", value: 16 },\r\n { label: \"24列\", value: 24 },\r\n ]}\r\n />\r\n </Form.Item>\r\n <Form.Item label=\"行高\">\r\n <Input\r\n type=\"number\"\r\n value={schema.gridConfig?.rowHeight ?? 60}\r\n onChange={(e) => {\r\n const newSchema = {\r\n ...schema,\r\n gridConfig: {\r\n ...schema.gridConfig,\r\n rowHeight: Number(e.target.value),\r\n },\r\n };\r\n setSchema(newSchema);\r\n onChange?.(newSchema);\r\n }}\r\n suffix=\"px\"\r\n />\r\n </Form.Item>\r\n </Form>\r\n\r\n <div ref={containerRef as any} className=\"sone-grid-container\">\r\n {mounted && (\r\n <ReactGridLayout\r\n layout={generateLayout()}\r\n // @ts-ignore\r\n cols={schema.gridConfig?.cols ?? 12}\r\n rowHeight={schema.gridConfig?.rowHeight ?? 60}\r\n margin={schema.gridConfig?.margin ?? [10, 10]}\r\n containerPadding={schema.gridConfig?.containerPadding ?? [10, 10]}\r\n width={width}\r\n onLayoutChange={handleLayoutChange}\r\n draggableHandle=\".ant-card-head\"\r\n resizeHandles={[\"se\"]}\r\n isDraggable={true}\r\n isResizable={true}\r\n >\r\n {schema.fields.map((field) => (\r\n <div key={field.key}>{renderGridItem(field)}</div>\r\n ))}\r\n </ReactGridLayout>\r\n )}\r\n </div>\r\n </Card>\r\n\r\n {/* 字段编辑弹窗 */}\r\n <Modal\r\n title=\"编辑字段\"\r\n open={isModalVisible}\r\n onOk={handleSaveField}\r\n onCancel={() => {\r\n setIsModalVisible(false);\r\n setEditingField(null);\r\n }}\r\n width={600}\r\n >\r\n {editingField && (\r\n <Form layout=\"vertical\">\r\n <Form.Item label=\"字段标识\">\r\n <Input\r\n value={editingField.key}\r\n onChange={(e) =>\r\n setEditingField({ ...editingField, key: e.target.value })\r\n }\r\n />\r\n </Form.Item>\r\n <Form.Item label=\"字段标签\">\r\n <Input\r\n value={editingField.label}\r\n onChange={(e) =>\r\n setEditingField({ ...editingField, label: e.target.value })\r\n }\r\n />\r\n </Form.Item>\r\n <Form.Item label=\"字段类型\">\r\n <Select\r\n value={editingField.type}\r\n onChange={(value) =>\r\n setEditingField({ ...editingField, type: value })\r\n }\r\n options={fieldTypes}\r\n />\r\n </Form.Item>\r\n <Form.Item label=\"是否必填\">\r\n <Switch\r\n checked={editingField.required}\r\n onChange={(checked) =>\r\n setEditingField({ ...editingField, required: checked })\r\n }\r\n />\r\n </Form.Item>\r\n <Form.Item label=\"占位符\">\r\n <Input\r\n value={editingField.placeholder}\r\n onChange={(e) =>\r\n setEditingField({\r\n ...editingField,\r\n placeholder: e.target.value,\r\n })\r\n }\r\n />\r\n </Form.Item>\r\n </Form>\r\n )}\r\n </Modal>\r\n </div>\r\n );\r\n};\r\n\r\nexport default GridBuilder;\r\n"],"mappings":"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","names":["import_react_grid_layout","value","ReactGridLayout"]}
package/dist/index.mjs ADDED
@@ -0,0 +1,306 @@
1
+ // src/components/GridBuilder.tsx
2
+ import { DeleteOutlined, PlusOutlined } from "@ant-design/icons";
3
+ import { Button, Card, Form, Input, Modal, Select, Space, Switch } from "antd";
4
+ import { useCallback, useState } from "react";
5
+ import ReactGridLayout from "react-grid-layout";
6
+ import { useContainerWidth } from "react-grid-layout";
7
+ import "react-grid-layout/css/styles.css";
8
+ import "./GridBuilder-TQWQAMLN.css";
9
+ import { jsx, jsxs } from "react/jsx-runtime";
10
+ var fieldTypes = [
11
+ { label: "\u6587\u672C\u8F93\u5165", value: "input" },
12
+ { label: "\u591A\u884C\u6587\u672C", value: "textarea" },
13
+ { label: "\u6570\u5B57\u8F93\u5165", value: "number" },
14
+ { label: "\u4E0B\u62C9\u9009\u62E9", value: "select" },
15
+ { label: "\u65E5\u671F\u9009\u62E9", value: "date" },
16
+ { label: "\u65E5\u671F\u8303\u56F4", value: "dateRange" },
17
+ { label: "\u5F00\u5173", value: "switch" },
18
+ { label: "\u5355\u9009\u6846", value: "radio" },
19
+ { label: "\u6309\u94AE\u5F0F\u5355\u9009", value: "radioButton" },
20
+ { label: "\u590D\u9009\u6846", value: "checkbox" },
21
+ { label: "\u8B66\u544A\u63D0\u793A", value: "alert" },
22
+ { label: "\u5206\u5272\u7EBF", value: "divider" },
23
+ { label: "\u5206\u6BB5\u5668", value: "segmented" },
24
+ { label: "\u6811\u5F62\u9009\u62E9", value: "treeSelect" },
25
+ { label: "\u7EA7\u8054\u9009\u62E9", value: "cascader" },
26
+ { label: "\u81EA\u52A8\u5B8C\u6210", value: "autoComplete" },
27
+ { label: "\u6570\u5B57\u8303\u56F4", value: "digitRange" },
28
+ { label: "\u8BC4\u5206", value: "rate" }
29
+ ];
30
+ var GridBuilder = ({ value, onChange }) => {
31
+ const { width, containerRef, mounted } = useContainerWidth();
32
+ const [schema, setSchema] = useState(
33
+ value || {
34
+ fields: [],
35
+ gridConfig: {
36
+ cols: 12,
37
+ rowHeight: 60,
38
+ margin: [10, 10],
39
+ containerPadding: [10, 10]
40
+ }
41
+ }
42
+ );
43
+ const [editingField, setEditingField] = useState(null);
44
+ const [isModalVisible, setIsModalVisible] = useState(false);
45
+ const generateLayout = useCallback(() => {
46
+ return schema.fields.map((field) => ({
47
+ i: field.key,
48
+ x: field.gridItem?.x ?? 0,
49
+ y: field.gridItem?.y ?? 0,
50
+ w: field.gridItem?.w ?? 6,
51
+ h: field.gridItem?.h ?? 2,
52
+ minW: field.gridItem?.minW ?? 3,
53
+ maxW: field.gridItem?.maxW ?? 12,
54
+ minH: field.gridItem?.minH ?? 1,
55
+ maxH: field.gridItem?.maxH ?? 4,
56
+ static: field.gridItem?.static ?? false
57
+ }));
58
+ }, [schema.fields]);
59
+ const handleLayoutChange = (layout) => {
60
+ const updatedFields = schema.fields.map((field) => {
61
+ const layoutItem = layout.find((item) => item.i === field.key);
62
+ if (layoutItem) {
63
+ return {
64
+ ...field,
65
+ gridItem: {
66
+ x: layoutItem.x,
67
+ y: layoutItem.y,
68
+ w: layoutItem.w,
69
+ h: layoutItem.h,
70
+ minW: layoutItem.minW,
71
+ maxW: layoutItem.maxW,
72
+ minH: layoutItem.minH,
73
+ maxH: layoutItem.maxH,
74
+ static: layoutItem.static
75
+ }
76
+ };
77
+ }
78
+ return field;
79
+ });
80
+ const newSchema = { ...schema, fields: updatedFields };
81
+ setSchema(newSchema);
82
+ onChange?.(newSchema);
83
+ };
84
+ const handleAddField = () => {
85
+ const newField = {
86
+ key: `field_${Date.now()}`,
87
+ label: "\u65B0\u5B57\u6BB5",
88
+ type: "input",
89
+ required: false,
90
+ gridItem: {
91
+ x: 0,
92
+ y: Infinity,
93
+ // 自动放置在最后一行
94
+ w: 6,
95
+ h: 2
96
+ }
97
+ };
98
+ const newSchema = {
99
+ ...schema,
100
+ fields: [...schema.fields, newField]
101
+ };
102
+ setSchema(newSchema);
103
+ onChange?.(newSchema);
104
+ };
105
+ const handleRemoveField = (key) => {
106
+ const newFields = schema.fields.filter((field) => field.key !== key);
107
+ const newSchema = { ...schema, fields: newFields };
108
+ setSchema(newSchema);
109
+ onChange?.(newSchema);
110
+ };
111
+ const handleEditField = (field) => {
112
+ setEditingField({ ...field });
113
+ setIsModalVisible(true);
114
+ };
115
+ const handleSaveField = () => {
116
+ if (!editingField)
117
+ return;
118
+ const newFields = schema.fields.map(
119
+ (field) => field.key === editingField.key ? editingField : field
120
+ );
121
+ const newSchema = { ...schema, fields: newFields };
122
+ setSchema(newSchema);
123
+ onChange?.(newSchema);
124
+ setIsModalVisible(false);
125
+ setEditingField(null);
126
+ };
127
+ const renderGridItem = (field) => /* @__PURE__ */ jsx(
128
+ Card,
129
+ {
130
+ size: "small",
131
+ title: field.label,
132
+ extra: /* @__PURE__ */ jsxs(Space, { children: [
133
+ /* @__PURE__ */ jsx(
134
+ Button,
135
+ {
136
+ type: "text",
137
+ size: "small",
138
+ onClick: () => handleEditField(field),
139
+ children: "\u7F16\u8F91"
140
+ }
141
+ ),
142
+ /* @__PURE__ */ jsx(
143
+ Button,
144
+ {
145
+ type: "text",
146
+ size: "small",
147
+ danger: true,
148
+ onClick: () => handleRemoveField(field.key),
149
+ children: /* @__PURE__ */ jsx(DeleteOutlined, {})
150
+ }
151
+ )
152
+ ] }),
153
+ style: { height: "100%", overflow: "auto" },
154
+ children: /* @__PURE__ */ jsxs("div", { style: { padding: "8px 0" }, children: [
155
+ /* @__PURE__ */ jsxs("div", { style: { marginBottom: 4, color: "#999", fontSize: 12 }, children: [
156
+ "\u7C7B\u578B: ",
157
+ fieldTypes.find((t) => t.value === field.type)?.label
158
+ ] }),
159
+ /* @__PURE__ */ jsxs("div", { style: { marginBottom: 4, color: "#999", fontSize: 12 }, children: [
160
+ "\u6807\u8BC6: ",
161
+ field.key
162
+ ] }),
163
+ field.required && /* @__PURE__ */ jsx("div", { style: { color: "#ff4d4f", fontSize: 12 }, children: "\u5FC5\u586B" })
164
+ ] })
165
+ }
166
+ );
167
+ return /* @__PURE__ */ jsxs("div", { children: [
168
+ /* @__PURE__ */ jsxs(
169
+ Card,
170
+ {
171
+ title: "\u53EF\u89C6\u5316\u8868\u5355\u5E03\u5C40\u8BBE\u8BA1\u5668",
172
+ extra: /* @__PURE__ */ jsx(
173
+ Button,
174
+ {
175
+ type: "primary",
176
+ icon: /* @__PURE__ */ jsx(PlusOutlined, {}),
177
+ onClick: handleAddField,
178
+ children: "\u6DFB\u52A0\u5B57\u6BB5"
179
+ }
180
+ ),
181
+ children: [
182
+ /* @__PURE__ */ jsxs(Form, { layout: "inline", style: { marginBottom: 16 }, children: [
183
+ /* @__PURE__ */ jsx(Form.Item, { label: "\u7F51\u683C\u5217\u6570", children: /* @__PURE__ */ jsx(
184
+ Select,
185
+ {
186
+ value: schema.gridConfig?.cols ?? 12,
187
+ onChange: (value2) => {
188
+ const newSchema = {
189
+ ...schema,
190
+ gridConfig: { ...schema.gridConfig, cols: value2 }
191
+ };
192
+ setSchema(newSchema);
193
+ onChange?.(newSchema);
194
+ },
195
+ style: { width: 100 },
196
+ options: [
197
+ { label: "6\u5217", value: 6 },
198
+ { label: "8\u5217", value: 8 },
199
+ { label: "10\u5217", value: 10 },
200
+ { label: "12\u5217", value: 12 },
201
+ { label: "16\u5217", value: 16 },
202
+ { label: "24\u5217", value: 24 }
203
+ ]
204
+ }
205
+ ) }),
206
+ /* @__PURE__ */ jsx(Form.Item, { label: "\u884C\u9AD8", children: /* @__PURE__ */ jsx(
207
+ Input,
208
+ {
209
+ type: "number",
210
+ value: schema.gridConfig?.rowHeight ?? 60,
211
+ onChange: (e) => {
212
+ const newSchema = {
213
+ ...schema,
214
+ gridConfig: {
215
+ ...schema.gridConfig,
216
+ rowHeight: Number(e.target.value)
217
+ }
218
+ };
219
+ setSchema(newSchema);
220
+ onChange?.(newSchema);
221
+ },
222
+ suffix: "px"
223
+ }
224
+ ) })
225
+ ] }),
226
+ /* @__PURE__ */ jsx("div", { ref: containerRef, className: "sone-grid-container", children: mounted && /* @__PURE__ */ jsx(
227
+ ReactGridLayout,
228
+ {
229
+ layout: generateLayout(),
230
+ cols: schema.gridConfig?.cols ?? 12,
231
+ rowHeight: schema.gridConfig?.rowHeight ?? 60,
232
+ margin: schema.gridConfig?.margin ?? [10, 10],
233
+ containerPadding: schema.gridConfig?.containerPadding ?? [10, 10],
234
+ width,
235
+ onLayoutChange: handleLayoutChange,
236
+ draggableHandle: ".ant-card-head",
237
+ resizeHandles: ["se"],
238
+ isDraggable: true,
239
+ isResizable: true,
240
+ children: schema.fields.map((field) => /* @__PURE__ */ jsx("div", { children: renderGridItem(field) }, field.key))
241
+ }
242
+ ) })
243
+ ]
244
+ }
245
+ ),
246
+ /* @__PURE__ */ jsx(
247
+ Modal,
248
+ {
249
+ title: "\u7F16\u8F91\u5B57\u6BB5",
250
+ open: isModalVisible,
251
+ onOk: handleSaveField,
252
+ onCancel: () => {
253
+ setIsModalVisible(false);
254
+ setEditingField(null);
255
+ },
256
+ width: 600,
257
+ children: editingField && /* @__PURE__ */ jsxs(Form, { layout: "vertical", children: [
258
+ /* @__PURE__ */ jsx(Form.Item, { label: "\u5B57\u6BB5\u6807\u8BC6", children: /* @__PURE__ */ jsx(
259
+ Input,
260
+ {
261
+ value: editingField.key,
262
+ onChange: (e) => setEditingField({ ...editingField, key: e.target.value })
263
+ }
264
+ ) }),
265
+ /* @__PURE__ */ jsx(Form.Item, { label: "\u5B57\u6BB5\u6807\u7B7E", children: /* @__PURE__ */ jsx(
266
+ Input,
267
+ {
268
+ value: editingField.label,
269
+ onChange: (e) => setEditingField({ ...editingField, label: e.target.value })
270
+ }
271
+ ) }),
272
+ /* @__PURE__ */ jsx(Form.Item, { label: "\u5B57\u6BB5\u7C7B\u578B", children: /* @__PURE__ */ jsx(
273
+ Select,
274
+ {
275
+ value: editingField.type,
276
+ onChange: (value2) => setEditingField({ ...editingField, type: value2 }),
277
+ options: fieldTypes
278
+ }
279
+ ) }),
280
+ /* @__PURE__ */ jsx(Form.Item, { label: "\u662F\u5426\u5FC5\u586B", children: /* @__PURE__ */ jsx(
281
+ Switch,
282
+ {
283
+ checked: editingField.required,
284
+ onChange: (checked) => setEditingField({ ...editingField, required: checked })
285
+ }
286
+ ) }),
287
+ /* @__PURE__ */ jsx(Form.Item, { label: "\u5360\u4F4D\u7B26", children: /* @__PURE__ */ jsx(
288
+ Input,
289
+ {
290
+ value: editingField.placeholder,
291
+ onChange: (e) => setEditingField({
292
+ ...editingField,
293
+ placeholder: e.target.value
294
+ })
295
+ }
296
+ ) })
297
+ ] })
298
+ }
299
+ )
300
+ ] });
301
+ };
302
+ var GridBuilder_default = GridBuilder;
303
+ export {
304
+ GridBuilder_default as GridBuilder
305
+ };
306
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/GridBuilder.tsx"],"sourcesContent":["import { DeleteOutlined, PlusOutlined } from \"@ant-design/icons\";\r\nimport { Button, Card, Form, Input, Modal, Select, Space, Switch } from \"antd\";\r\nimport React, { useCallback, useState } from \"react\";\r\nimport ReactGridLayout from \"react-grid-layout\";\r\n// @ts-ignore - useContainerWidth 在运行时存在但类型定义可能缺失\r\nimport { useContainerWidth } from \"react-grid-layout\";\r\nimport \"react-grid-layout/css/styles.css\";\r\nimport type { SchemaField, SchemaForm } from \"../types/schema\";\r\nimport \"./GridBuilder.css\";\r\n\r\ninterface GridBuilderProps {\r\n value?: SchemaForm;\r\n onChange?: (schema: SchemaForm) => void;\r\n}\r\n\r\nconst fieldTypes = [\r\n { label: \"文本输入\", value: \"input\" },\r\n { label: \"多行文本\", value: \"textarea\" },\r\n { label: \"数字输入\", value: \"number\" },\r\n { label: \"下拉选择\", value: \"select\" },\r\n { label: \"日期选择\", value: \"date\" },\r\n { label: \"日期范围\", value: \"dateRange\" },\r\n { label: \"开关\", value: \"switch\" },\r\n { label: \"单选框\", value: \"radio\" },\r\n { label: \"按钮式单选\", value: \"radioButton\" },\r\n { label: \"复选框\", value: \"checkbox\" },\r\n { label: \"警告提示\", value: \"alert\" },\r\n { label: \"分割线\", value: \"divider\" },\r\n { label: \"分段器\", value: \"segmented\" },\r\n { label: \"树形选择\", value: \"treeSelect\" },\r\n { label: \"级联选择\", value: \"cascader\" },\r\n { label: \"自动完成\", value: \"autoComplete\" },\r\n { label: \"数字范围\", value: \"digitRange\" },\r\n { label: \"评分\", value: \"rate\" },\r\n];\r\n\r\n// react-grid-layout 2.x 中使用 useContainerWidth Hook\r\nconst GridBuilder: React.FC<GridBuilderProps> = ({ value, onChange }) => {\r\n const { width, containerRef, mounted } = useContainerWidth();\r\n\r\n const [schema, setSchema] = useState<SchemaForm>(\r\n value || {\r\n fields: [],\r\n gridConfig: {\r\n cols: 12,\r\n rowHeight: 60,\r\n margin: [10, 10],\r\n containerPadding: [10, 10],\r\n },\r\n },\r\n );\r\n const [editingField, setEditingField] = useState<SchemaField | null>(null);\r\n const [isModalVisible, setIsModalVisible] = useState(false);\r\n\r\n // 生成网格布局数据\r\n const generateLayout = useCallback(() => {\r\n return schema.fields.map((field) => ({\r\n i: field.key,\r\n x: field.gridItem?.x ?? 0,\r\n y: field.gridItem?.y ?? 0,\r\n w: field.gridItem?.w ?? 6,\r\n h: field.gridItem?.h ?? 2,\r\n minW: field.gridItem?.minW ?? 3,\r\n maxW: field.gridItem?.maxW ?? 12,\r\n minH: field.gridItem?.minH ?? 1,\r\n maxH: field.gridItem?.maxH ?? 4,\r\n static: field.gridItem?.static ?? false,\r\n }));\r\n }, [schema.fields]);\r\n\r\n // 处理布局变化\r\n const handleLayoutChange = (layout: any) => {\r\n const updatedFields = schema.fields.map((field) => {\r\n const layoutItem = layout.find((item: any) => item.i === field.key);\r\n if (layoutItem) {\r\n return {\r\n ...field,\r\n gridItem: {\r\n x: layoutItem.x,\r\n y: layoutItem.y,\r\n w: layoutItem.w,\r\n h: layoutItem.h,\r\n minW: layoutItem.minW,\r\n maxW: layoutItem.maxW,\r\n minH: layoutItem.minH,\r\n maxH: layoutItem.maxH,\r\n static: layoutItem.static,\r\n },\r\n };\r\n }\r\n return field;\r\n });\r\n\r\n const newSchema = { ...schema, fields: updatedFields };\r\n setSchema(newSchema);\r\n onChange?.(newSchema);\r\n };\r\n\r\n // 添加字段\r\n const handleAddField = () => {\r\n const newField: SchemaField = {\r\n key: `field_${Date.now()}`,\r\n label: \"新字段\",\r\n type: \"input\",\r\n required: false,\r\n gridItem: {\r\n x: 0,\r\n y: Infinity, // 自动放置在最后一行\r\n w: 6,\r\n h: 2,\r\n },\r\n };\r\n const newSchema = {\r\n ...schema,\r\n fields: [...schema.fields, newField],\r\n };\r\n setSchema(newSchema);\r\n onChange?.(newSchema);\r\n };\r\n\r\n // 删除字段\r\n const handleRemoveField = (key: string) => {\r\n const newFields = schema.fields.filter((field) => field.key !== key);\r\n const newSchema = { ...schema, fields: newFields };\r\n setSchema(newSchema);\r\n onChange?.(newSchema);\r\n };\r\n\r\n // 编辑字段\r\n const handleEditField = (field: SchemaField) => {\r\n setEditingField({ ...field });\r\n setIsModalVisible(true);\r\n };\r\n\r\n // 保存字段编辑\r\n const handleSaveField = () => {\r\n if (!editingField) return;\r\n\r\n const newFields = schema.fields.map((field) =>\r\n field.key === editingField.key ? editingField : field,\r\n );\r\n const newSchema = { ...schema, fields: newFields };\r\n setSchema(newSchema);\r\n onChange?.(newSchema);\r\n setIsModalVisible(false);\r\n setEditingField(null);\r\n };\r\n\r\n // 渲染网格项内容\r\n const renderGridItem = (field: SchemaField) => (\r\n <Card\r\n size=\"small\"\r\n title={field.label}\r\n extra={\r\n <Space>\r\n <Button\r\n type=\"text\"\r\n size=\"small\"\r\n onClick={() => handleEditField(field)}\r\n >\r\n 编辑\r\n </Button>\r\n <Button\r\n type=\"text\"\r\n size=\"small\"\r\n danger\r\n onClick={() => handleRemoveField(field.key)}\r\n >\r\n <DeleteOutlined />\r\n </Button>\r\n </Space>\r\n }\r\n style={{ height: \"100%\", overflow: \"auto\" }}\r\n >\r\n <div style={{ padding: \"8px 0\" }}>\r\n <div style={{ marginBottom: 4, color: \"#999\", fontSize: 12 }}>\r\n 类型: {fieldTypes.find((t) => t.value === field.type)?.label}\r\n </div>\r\n <div style={{ marginBottom: 4, color: \"#999\", fontSize: 12 }}>\r\n 标识: {field.key}\r\n </div>\r\n {field.required && (\r\n <div style={{ color: \"#ff4d4f\", fontSize: 12 }}>必填</div>\r\n )}\r\n </div>\r\n </Card>\r\n );\r\n\r\n return (\r\n <div>\r\n <Card\r\n title=\"可视化表单布局设计器\"\r\n extra={\r\n <Button\r\n type=\"primary\"\r\n icon={<PlusOutlined />}\r\n onClick={handleAddField}\r\n >\r\n 添加字段\r\n </Button>\r\n }\r\n >\r\n <Form layout=\"inline\" style={{ marginBottom: 16 }}>\r\n <Form.Item label=\"网格列数\">\r\n <Select\r\n value={schema.gridConfig?.cols ?? 12}\r\n onChange={(value) => {\r\n const newSchema = {\r\n ...schema,\r\n gridConfig: { ...schema.gridConfig, cols: value },\r\n };\r\n setSchema(newSchema);\r\n onChange?.(newSchema);\r\n }}\r\n style={{ width: 100 }}\r\n options={[\r\n { label: \"6列\", value: 6 },\r\n { label: \"8列\", value: 8 },\r\n { label: \"10列\", value: 10 },\r\n { label: \"12列\", value: 12 },\r\n { label: \"16列\", value: 16 },\r\n { label: \"24列\", value: 24 },\r\n ]}\r\n />\r\n </Form.Item>\r\n <Form.Item label=\"行高\">\r\n <Input\r\n type=\"number\"\r\n value={schema.gridConfig?.rowHeight ?? 60}\r\n onChange={(e) => {\r\n const newSchema = {\r\n ...schema,\r\n gridConfig: {\r\n ...schema.gridConfig,\r\n rowHeight: Number(e.target.value),\r\n },\r\n };\r\n setSchema(newSchema);\r\n onChange?.(newSchema);\r\n }}\r\n suffix=\"px\"\r\n />\r\n </Form.Item>\r\n </Form>\r\n\r\n <div ref={containerRef as any} className=\"sone-grid-container\">\r\n {mounted && (\r\n <ReactGridLayout\r\n layout={generateLayout()}\r\n // @ts-ignore\r\n cols={schema.gridConfig?.cols ?? 12}\r\n rowHeight={schema.gridConfig?.rowHeight ?? 60}\r\n margin={schema.gridConfig?.margin ?? [10, 10]}\r\n containerPadding={schema.gridConfig?.containerPadding ?? [10, 10]}\r\n width={width}\r\n onLayoutChange={handleLayoutChange}\r\n draggableHandle=\".ant-card-head\"\r\n resizeHandles={[\"se\"]}\r\n isDraggable={true}\r\n isResizable={true}\r\n >\r\n {schema.fields.map((field) => (\r\n <div key={field.key}>{renderGridItem(field)}</div>\r\n ))}\r\n </ReactGridLayout>\r\n )}\r\n </div>\r\n </Card>\r\n\r\n {/* 字段编辑弹窗 */}\r\n <Modal\r\n title=\"编辑字段\"\r\n open={isModalVisible}\r\n onOk={handleSaveField}\r\n onCancel={() => {\r\n setIsModalVisible(false);\r\n setEditingField(null);\r\n }}\r\n width={600}\r\n >\r\n {editingField && (\r\n <Form layout=\"vertical\">\r\n <Form.Item label=\"字段标识\">\r\n <Input\r\n value={editingField.key}\r\n onChange={(e) =>\r\n setEditingField({ ...editingField, key: e.target.value })\r\n }\r\n />\r\n </Form.Item>\r\n <Form.Item label=\"字段标签\">\r\n <Input\r\n value={editingField.label}\r\n onChange={(e) =>\r\n setEditingField({ ...editingField, label: e.target.value })\r\n }\r\n />\r\n </Form.Item>\r\n <Form.Item label=\"字段类型\">\r\n <Select\r\n value={editingField.type}\r\n onChange={(value) =>\r\n setEditingField({ ...editingField, type: value })\r\n }\r\n options={fieldTypes}\r\n />\r\n </Form.Item>\r\n <Form.Item label=\"是否必填\">\r\n <Switch\r\n checked={editingField.required}\r\n onChange={(checked) =>\r\n setEditingField({ ...editingField, required: checked })\r\n }\r\n />\r\n </Form.Item>\r\n <Form.Item label=\"占位符\">\r\n <Input\r\n value={editingField.placeholder}\r\n onChange={(e) =>\r\n setEditingField({\r\n ...editingField,\r\n placeholder: e.target.value,\r\n })\r\n }\r\n />\r\n </Form.Item>\r\n </Form>\r\n )}\r\n </Modal>\r\n </div>\r\n );\r\n};\r\n\r\nexport default GridBuilder;\r\n"],"mappings":"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","names":["value"]}
package/package.json ADDED
@@ -0,0 +1,48 @@
1
+ {
2
+ "name": "@soned/schema-generate",
3
+ "version": "1.0.0",
4
+ "description": "Schema表单构建器组件",
5
+ "main": "dist/index.js",
6
+ "module": "dist/index.mjs",
7
+ "types": "dist/index.d.ts",
8
+ "files": [
9
+ "dist",
10
+ "src/**/*.css"
11
+ ],
12
+ "keywords": [
13
+ "react",
14
+ "schema",
15
+ "form-builder"
16
+ ],
17
+ "author": "",
18
+ "license": "MIT",
19
+ "publishConfig": {
20
+ "access": "public"
21
+ },
22
+ "peerDependencies": {
23
+ "@ant-design/icons": "^6.0.0",
24
+ "antd": "^6.0.0",
25
+ "react": ">=18.0.0",
26
+ "react-dom": ">=18.0.0",
27
+ "react-grid-layout": "^2.2.3"
28
+ },
29
+ "devDependencies": {
30
+ "@ant-design/icons": "^6.0.0",
31
+ "@types/react": "^18.0.0",
32
+ "@types/react-dom": "^18.0.0",
33
+ "antd": "^6.0.0",
34
+ "react": "^18.0.0",
35
+ "react-dom": "^18.0.0",
36
+ "react-grid-layout": "^2.2.3",
37
+ "tsup": "^7.0.0",
38
+ "typescript": "^5.0.0"
39
+ },
40
+ "scripts": {
41
+ "dev": "tsup --watch",
42
+ "build": "pnpm run build:js && pnpm run build:types",
43
+ "build:js": "tsup",
44
+ "build:types": "tsc --emitDeclarationOnly",
45
+ "clean": "rimraf dist",
46
+ "lint": "eslint src --ext .ts,.tsx"
47
+ }
48
+ }
@@ -0,0 +1,12 @@
1
+ .sone-grid-container {
2
+ min-height: 400px;
3
+ background: #12121a;
4
+ margin-top: 10px;
5
+ border: 1px solid rgba(0, 240, 255, 0.2);
6
+ background-image:
7
+ linear-gradient(rgba(0, 240, 255, 0.05) 1px, transparent 1px),
8
+ linear-gradient(90deg, rgba(0, 240, 255, 0.05) 1px, transparent 1px);
9
+ background-size: 20px 20px;
10
+ position: relative;
11
+ transition: height 200ms ease;
12
+ }