import React, { useMemo, useState } from "react"; import { HolderOutlined } from "@ant-design/icons"; import { Button, Form, Input, InputNumber, Popover, Row, Col, Tooltip, Select, } from "antd"; import { ColumnItem as ColumnItemType } from "@/type"; import { DATA_TYPE_OPTIONS } from "@/constants"; import { useSortable } from "@dnd-kit/sortable"; import { CSS } from "@dnd-kit/utilities"; import LangInput from "@/components/LangInput"; import { DataType } from "@/enum"; export default function ColumnItem({ column, onChange, onDelete, }: { column: ColumnItemType; onChange: (key: string, value: any) => void; onDelete: (id: string) => void; }) { const { setNodeRef, attributes, listeners, transform, transition } = useSortable({ id: column.id, transition: { duration: 500, easing: "cubic-bezier(0.25, 1, 0.5, 1)", }, }); const [code, setCode] = useState(column.schemaName); const [open, setOpen] = React.useState(false); const styles = { transform: CSS.Transform.toString(transform), transition, }; const validCodeErrMsg = useMemo(() => { setOpen(true); if (!code) return "编码不能为空"; if (code.length >= 50) { return "编码长度不能超过50"; } const regex = /^[a-z][a-z0-9_]*$/; if (!regex.test(code)) return "编码只能包含字母和数字, 必须小写字母开头!"; setOpen(false); return false; }, [code]); const handleSetCode = () => { if (code && !validCodeErrMsg) { onChange("schemaName", code); } if (!code) { setCode(column.schemaName); } }; return (
{validCodeErrMsg}} open={open} onOpenChange={(o) => setOpen(o && !!validCodeErrMsg)} trigger={["focus"]} > setCode(e.target.value)} onBlur={handleSetCode} status={validCodeErrMsg ? "error" : ""} /> onChange("defaultValue", e.target.value)} /> {column.type === DataType.Nvarchar && ( onChange("maxLength", num)} /> )} {column.type === DataType.Decimal && ( onChange("precision", num)} /> onChange("scale", num)} /> )} onChange("memo", e.target.value)} /> {!column.isPreDefined && ( )}
} >
); }