diff --git a/frontend/src/pages/FormDesigner/components/ComponentPanel.tsx b/frontend/src/pages/FormDesigner/components/ComponentPanel.tsx index 64ea9461..9325cab1 100644 --- a/frontend/src/pages/FormDesigner/components/ComponentPanel.tsx +++ b/frontend/src/pages/FormDesigner/components/ComponentPanel.tsx @@ -49,6 +49,9 @@ const DraggableComponent: React.FC<{ component: ComponentMeta }> = ({ component const ComponentPanel: React.FC = () => { const componentsByCategory = getComponentsByCategory(); + // 定义分类显示顺序 + const categoryOrder = ['布局字段', '基础字段', '高级字段']; + return (
@@ -60,15 +63,20 @@ const ComponentPanel: React.FC = () => { ghost bordered={false} > - {Object.entries(componentsByCategory).map(([category, components]) => ( - -
- {components.map((component) => ( - - ))} -
-
- ))} + {categoryOrder.map((category) => { + const components = componentsByCategory[category]; + if (!components || components.length === 0) return null; + + return ( + +
+ {components.map((component) => ( + + ))} +
+
+ ); + })}
); diff --git a/frontend/src/pages/FormDesigner/components/GridField.tsx b/frontend/src/pages/FormDesigner/components/GridField.tsx index 2965317a..cd264019 100644 --- a/frontend/src/pages/FormDesigner/components/GridField.tsx +++ b/frontend/src/pages/FormDesigner/components/GridField.tsx @@ -28,14 +28,22 @@ const GridField: React.FC = ({ labelAlign = 'right', }) => { const columns = field.columns || 2; - const colSpan = 24 / columns; const children = field.children || Array(columns).fill([]); + + // 使用自定义列宽度或平均分配 + const getColSpan = (colIndex: number) => { + if (field.columnSpans && field.columnSpans.length > colIndex) { + return field.columnSpans[colIndex]; + } + return 24 / columns; // 平均分配 + }; return (
{children.map((columnFields, colIndex) => { const dropId = `grid-${field.id}-col-${colIndex}`; + const colSpan = getColSpan(colIndex); return ( = ({ const handleFieldUpdate = (changedValues: any) => { if (selectedField) { - let updatedField = { ...selectedField, ...changedValues }; - - // 特殊处理:栅格列数变化时,调整 children 数组 - if (selectedField.type === 'grid' && changedValues.columns !== undefined) { - const newColumns = changedValues.columns; - const oldChildren = selectedField.children || []; - const newChildren: FieldConfig[][] = []; - - // 保留旧数据,调整数组长度 - for (let i = 0; i < newColumns; i++) { - newChildren[i] = oldChildren[i] || []; - } - - updatedField = { ...updatedField, children: newChildren }; - } - - onFieldChange(updatedField); + onFieldChange({ ...selectedField, ...changedValues }); } }; @@ -111,15 +95,23 @@ const PropertyPanel: React.FC = ({ onValuesChange={handleFieldUpdate} style={{ padding: 16 }} > - - - + {/* 布局组件不显示字段标签和字段名称 */} + {selectedField.type !== 'divider' && selectedField.type !== 'grid' && selectedField.type !== 'text' && ( + <> + + + - - - + + + + + )} - {selectedField.type !== 'divider' && ( + {/* 只有实际表单字段才显示这些属性 */} + {selectedField.type !== 'divider' && + selectedField.type !== 'grid' && + selectedField.type !== 'text' && ( <> @@ -166,9 +158,102 @@ const PropertyPanel: React.FC = ({ {selectedField.type === 'grid' && ( <> - - - + +
+ 列配置项 + +
+ + + {(selectedField.columnSpans || [12, 12]).map((span, index) => ( + + {index + 1}. + { + if (value) { + const currentSpans = selectedField.columnSpans || [12, 12]; + const newSpans = [...currentSpans]; + newSpans[index] = value; + onFieldChange({ + ...selectedField, + columnSpans: newSpans, + }); + } + }} + style={{ flex: 1 }} + addonAfter="/24" + /> +