jch-config-editor 0.1.10 → 0.1.13

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.
@@ -1 +1 @@
1
- {"version":3,"file":"config-editor.umd.js","sources":["../node_modules/.pnpm/@babel+runtime@7.28.6/node_modules/@babel/runtime/helpers/interopRequireDefault.js","../node_modules/.pnpm/@rc-component+pagination@1.2.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/@rc-component/pagination/lib/locale/zh_CN.js","../node_modules/.pnpm/@rc-component+picker@1.9.0_dayjs@1.11.19_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/@rc-component/picker/lib/locale/common.js","../node_modules/.pnpm/@rc-component+picker@1.9.0_dayjs@1.11.19_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/@rc-component/picker/lib/locale/zh_CN.js","../node_modules/.pnpm/antd@6.3.2_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/antd/lib/time-picker/locale/zh_CN.js","../node_modules/.pnpm/antd@6.3.2_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/antd/lib/date-picker/locale/zh_CN.js","../node_modules/.pnpm/antd@6.3.2_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/antd/lib/calendar/locale/zh_CN.js","../node_modules/.pnpm/antd@6.3.2_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/antd/lib/locale/zh_CN.js","../node_modules/.pnpm/antd@6.3.2_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/antd/locale/zh_CN.js","../node_modules/.pnpm/zustand@5.0.11_@types+react@19.2.14_immer@11.1.4_react@19.2.4/node_modules/zustand/esm/middleware/immer.mjs","../src/store/editorStore.ts","../src/utils/initData.ts","../src/components/MaterialPanel/index.tsx","../src/components/NodeRenderer/index.tsx","../src/components/ColorPicker/index.tsx","../src/components/Canvas/index.tsx","../src/components/PropertyPanel/editors/TextMaterialEditor.tsx","../src/components/PropertyPanel/editors/ImageMaterialEditor.tsx","../src/components/PropertyPanel/editors/LineMaterialEditor.tsx","../src/components/PropertyPanel/editors/MaterialPropertyEditor.tsx","../src/components/PropertyPanel/editors/GroupNodeStatusEditor.tsx","../src/components/PropertyPanel/index.tsx","../src/components/ConfigEditor/index.tsx"],"sourcesContent":["function _interopRequireDefault(e) {\n return e && e.__esModule ? e : {\n \"default\": e\n };\n}\nmodule.exports = _interopRequireDefault, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\nconst locale = {\n // Options\n items_per_page: '条/页',\n jump_to: '跳至',\n jump_to_confirm: '确定',\n page: '页',\n // Pagination\n prev_page: '上一页',\n next_page: '下一页',\n prev_5: '向前 5 页',\n next_5: '向后 5 页',\n prev_3: '向前 3 页',\n next_3: '向后 3 页',\n page_size: '页码'\n};\nvar _default = exports.default = locale;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.commonLocale = void 0;\nvar commonLocale = exports.commonLocale = {\n yearFormat: 'YYYY',\n dayFormat: 'D',\n cellMeridiemFormat: 'A',\n monthBeforeYear: true\n};","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\nvar _common = require(\"./common\");\nfunction _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\nfunction ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\nfunction _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == _typeof(i) ? i : String(i); }\nfunction _toPrimitive(t, r) { if (\"object\" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != _typeof(i)) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\nvar locale = _objectSpread(_objectSpread({}, _common.commonLocale), {}, {\n locale: 'zh_CN',\n today: '今天',\n now: '此刻',\n backToToday: '返回今天',\n ok: '确定',\n timeSelect: '选择时间',\n dateSelect: '选择日期',\n weekSelect: '选择周',\n clear: '清除',\n week: '周',\n month: '月',\n year: '年',\n previousMonth: '上个月 (翻页上键)',\n nextMonth: '下个月 (翻页下键)',\n monthSelect: '选择月份',\n yearSelect: '选择年份',\n decadeSelect: '选择年代',\n previousYear: '上一年 (Control键加左方向键)',\n nextYear: '下一年 (Control键加右方向键)',\n previousDecade: '上一年代',\n nextDecade: '下一年代',\n previousCentury: '上一世纪',\n nextCentury: '下一世纪',\n yearFormat: 'YYYY年',\n cellDateFormat: 'D',\n monthBeforeYear: false\n});\nvar _default = exports.default = locale;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\nconst locale = {\n placeholder: '请选择时间',\n rangePlaceholder: ['开始时间', '结束时间']\n};\nvar _default = exports.default = locale;","\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\").default;\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\nvar _zh_CN = _interopRequireDefault(require(\"@rc-component/picker/locale/zh_CN\"));\nvar _zh_CN2 = _interopRequireDefault(require(\"../../time-picker/locale/zh_CN\"));\n// 统一合并为完整的 Locale\nconst locale = {\n lang: {\n placeholder: '请选择日期',\n yearPlaceholder: '请选择年份',\n quarterPlaceholder: '请选择季度',\n monthPlaceholder: '请选择月份',\n weekPlaceholder: '请选择周',\n rangePlaceholder: ['开始日期', '结束日期'],\n rangeYearPlaceholder: ['开始年份', '结束年份'],\n rangeMonthPlaceholder: ['开始月份', '结束月份'],\n rangeQuarterPlaceholder: ['开始季度', '结束季度'],\n rangeWeekPlaceholder: ['开始周', '结束周'],\n ..._zh_CN.default\n },\n timePickerLocale: {\n ..._zh_CN2.default\n }\n};\n// should add whitespace between char in Button\nlocale.lang.ok = '确定';\n// All settings at:\n// https://github.com/ant-design/ant-design/blob/master/components/date-picker/locale/example.json\nvar _default = exports.default = locale;","\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\").default;\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\nvar _zh_CN = _interopRequireDefault(require(\"../../date-picker/locale/zh_CN\"));\nvar _default = exports.default = _zh_CN.default;","\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\").default;\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\nvar _zh_CN = _interopRequireDefault(require(\"@rc-component/pagination/lib/locale/zh_CN\"));\nvar _zh_CN2 = _interopRequireDefault(require(\"../calendar/locale/zh_CN\"));\nvar _zh_CN3 = _interopRequireDefault(require(\"../date-picker/locale/zh_CN\"));\nvar _zh_CN4 = _interopRequireDefault(require(\"../time-picker/locale/zh_CN\"));\nconst typeTemplate = '${label}不是一个有效的${type}';\nconst localeValues = {\n locale: 'zh-cn',\n Pagination: _zh_CN.default,\n DatePicker: _zh_CN3.default,\n TimePicker: _zh_CN4.default,\n Calendar: _zh_CN2.default,\n // locales for all components\n global: {\n placeholder: '请选择',\n close: '关闭',\n sortable: '可排序'\n },\n Table: {\n filterTitle: '筛选',\n filterConfirm: '确定',\n filterReset: '重置',\n filterEmptyText: '无筛选项',\n filterCheckAll: '全选',\n filterSearchPlaceholder: '在筛选项中搜索',\n emptyText: '暂无数据',\n selectAll: '全选当页',\n selectInvert: '反选当页',\n selectNone: '清空所有',\n selectionAll: '全选所有',\n sortTitle: '排序',\n expand: '展开行',\n collapse: '关闭行',\n triggerDesc: '点击降序',\n triggerAsc: '点击升序',\n cancelSort: '取消排序'\n },\n Modal: {\n okText: '确定',\n cancelText: '取消',\n justOkText: '知道了'\n },\n Tour: {\n Next: '下一步',\n Previous: '上一步',\n Finish: '结束导览'\n },\n Popconfirm: {\n cancelText: '取消',\n okText: '确定'\n },\n Transfer: {\n titles: ['', ''],\n searchPlaceholder: '请输入搜索内容',\n itemUnit: '项',\n itemsUnit: '项',\n remove: '删除',\n selectCurrent: '全选当页',\n removeCurrent: '删除当页',\n selectAll: '全选所有',\n deselectAll: '取消全选',\n removeAll: '删除全部',\n selectInvert: '反选当页'\n },\n Upload: {\n uploading: '文件上传中',\n removeFile: '删除文件',\n uploadError: '上传错误',\n previewFile: '预览文件',\n downloadFile: '下载文件'\n },\n Empty: {\n description: '暂无数据'\n },\n Icon: {\n icon: '图标'\n },\n Text: {\n edit: '编辑',\n copy: '复制',\n copied: '复制成功',\n expand: '展开',\n collapse: '收起'\n },\n Form: {\n optional: '(可选)',\n defaultValidateMessages: {\n default: '字段验证错误${label}',\n required: '请输入${label}',\n enum: '${label}必须是其中一个[${enum}]',\n whitespace: '${label}不能为空字符',\n date: {\n format: '${label}日期格式无效',\n parse: '${label}不能转换为日期',\n invalid: '${label}是一个无效日期'\n },\n types: {\n string: typeTemplate,\n method: typeTemplate,\n array: typeTemplate,\n object: typeTemplate,\n number: typeTemplate,\n date: typeTemplate,\n boolean: typeTemplate,\n integer: typeTemplate,\n float: typeTemplate,\n regexp: typeTemplate,\n email: typeTemplate,\n url: typeTemplate,\n hex: typeTemplate\n },\n string: {\n len: '${label}须为${len}个字符',\n min: '${label}最少${min}个字符',\n max: '${label}最多${max}个字符',\n range: '${label}须在${min}-${max}字符之间'\n },\n number: {\n len: '${label}必须等于${len}',\n min: '${label}最小值为${min}',\n max: '${label}最大值为${max}',\n range: '${label}须在${min}-${max}之间'\n },\n array: {\n len: '须为${len}个${label}',\n min: '最少${min}个${label}',\n max: '最多${max}个${label}',\n range: '${label}数量须在${min}-${max}之间'\n },\n pattern: {\n mismatch: '${label}与模式不匹配${pattern}'\n }\n }\n },\n QRCode: {\n expired: '二维码过期',\n refresh: '点击刷新',\n scanned: '已扫描'\n },\n ColorPicker: {\n presetEmpty: '暂无',\n transparent: '无色',\n singleColor: '单色',\n gradientColor: '渐变色'\n }\n};\nvar _default = exports.default = localeValues;","module.exports = require('../lib/locale/zh_CN');","import { produce } from 'immer';\n\nconst immerImpl = (initializer) => (set, get, store) => {\n store.setState = (updater, replace, ...args) => {\n const nextState = typeof updater === \"function\" ? produce(updater) : updater;\n return set(nextState, replace, ...args);\n };\n return initializer(store.setState, get, store);\n};\nconst immer = immerImpl;\n\nexport { immer };\n","import { create } from 'zustand';\nimport { immer } from 'zustand/middleware/immer';\nimport { nanoid } from 'nanoid';\n// @ts-ignore - 导入 csstype 用于类型推断\nimport type {} from 'csstype';\nimport type { \n EditorState, \n Node, \n Material,\n NodeStatus,\n EditorEvent, \n EventType,\n SchemeJSON,\n NodeStyle,\n ContentInfo,\n ControlInfo,\n CanvasConfig\n} from '../types';\n\n// 初始状态\nconst initialState: EditorState = {\n nodes: [],\n materials: [],\n selectedNodeId: null,\n selectedStatusId: null,\n canvas: {\n width: 1920,\n height: 1080,\n background: '#ffffff',\n showGrid: true,\n },\n viewport: {\n scale: 1,\n positionX: 0,\n positionY: 0,\n },\n history: {\n past: [],\n future: [],\n },\n mode: 'select',\n lineDrawing: {\n isDrawing: false,\n material: null,\n startPoint: null,\n endPoint: null,\n },\n};\n\n// 创建事件\nconst createEvent = (type: EventType, targetId?: string, payload?: any): EditorEvent => ({\n id: nanoid(),\n type,\n targetId,\n payload,\n timestamp: Date.now(),\n});\n\n// Store 接口\ninterface EditorStore extends EditorState {\n // 节点操作\n addNode: (node: Omit<Node, 'id'>, autoSelect?: boolean) => void;\n updateNode: (id: string, updates: Partial<Node>) => void;\n updateNodeStyle: (id: string, style: Partial<NodeStyle>) => void;\n updateNodeContent: (id: string, content: Partial<ContentInfo>) => void;\n updateNodeControl: (id: string, control: Partial<ControlInfo>) => void;\n removeNode: (id: string) => void;\n selectNode: (id: string | null) => void;\n \n // 状态操作(新架构)\n addStatus: (nodeId: string, status: Omit<NodeStatus, 'id'>) => void;\n removeStatus: (nodeId: string, statusId: string) => void;\n updateStatus: (nodeId: string, statusId: string, updates: Partial<NodeStatus>) => void;\n selectStatus: (statusId: string | null) => void;\n evaluateCurrentStatus: (nodeId: string, data: any) => string | undefined;\n \n // 物料库操作\n addMaterial: (material: Omit<Material, 'id'>) => void;\n updateMaterial: (id: string, updates: Partial<Material>) => void;\n removeMaterial: (id: string) => void;\n \n // 视口操作\n setViewport: (viewport: Partial<EditorState['viewport']>) => void;\n \n // 画布配置操作\n setCanvasConfig: (config: Partial<CanvasConfig>) => void;\n \n // 模式切换\n setMode: (mode: EditorState['mode']) => void;\n \n // 线条绘制操作\n startLineDrawing: (material: Material) => void;\n updateLineDrawing: (endPoint: { x: number; y: number }) => void;\n endLineDrawing: () => void;\n cancelLineDrawing: () => void;\n \n // 历史操作\n undo: () => void;\n redo: () => void;\n \n // 导入导出\n exportScheme: () => SchemeJSON;\n importScheme: (scheme: SchemeJSON) => void;\n \n // 事件记录\n recordEvent: (event: EditorEvent) => void;\n}\n\nexport const useEditorStore = create<EditorStore>()(\n immer((set, get) => ({\n ...initialState,\n // ========== 节点操作 ==========\n addNode: (node, autoSelect = true) => {\n set((state) => {\n const newNode = {\n ...node,\n id: nanoid(),\n } as Node;\n state.nodes.push(newNode);\n if (autoSelect) {\n state.selectedNodeId = newNode.id;\n state.history.past.push(createEvent('NODE_SELECT', newNode.id));\n }\n });\n },\n\n updateNode: (id, updates) => {\n set((state) => {\n const node = state.nodes.find((n) => n.id === id);\n if (node) {\n Object.assign(node, updates);\n state.history.past.push(createEvent('PROPERTY_CHANGE', id, updates));\n }\n });\n },\n\n updateNodeStyle: (id, style) => {\n set((state) => {\n const node = state.nodes.find((n) => n.id === id);\n if (node) {\n Object.assign(node.normalStyle, style);\n state.history.past.push(createEvent('PROPERTY_CHANGE', id, { normalStyle: style }));\n }\n });\n },\n\n updateNodeContent: (id, content) => {\n set((state) => {\n const node = state.nodes.find((n) => n.id === id);\n if (node) {\n // 创建新的 contentInfo 对象以确保引用变化\n node.contentInfo = { ...node.contentInfo, ...content };\n state.history.past.push(createEvent('PROPERTY_CHANGE', id, { contentInfo: content }));\n }\n });\n },\n\n updateNodeControl: (id, control) => {\n set((state) => {\n const node = state.nodes.find((n) => n.id === id);\n if (node) {\n Object.assign(node.controlInfo, control);\n state.history.past.push(createEvent('PROPERTY_CHANGE', id, { controlInfo: control }));\n }\n });\n },\n\n removeNode: (id) => {\n set((state) => {\n const index = state.nodes.findIndex((n) => n.id === id);\n if (index !== -1) {\n state.nodes.splice(index, 1);\n if (state.selectedNodeId === id) {\n state.selectedNodeId = null;\n state.selectedStatusId = null;\n }\n state.history.past.push(createEvent('NODE_DELETE', id));\n }\n });\n },\n\n selectNode: (id) => {\n set((state) => {\n state.selectedNodeId = id;\n state.selectedStatusId = null;\n if (id) {\n state.history.past.push(createEvent('NODE_SELECT', id));\n }\n });\n },\n\n // ========== 状态操作 ==========\n addStatus: (nodeId, status) => {\n set((state) => {\n const node = state.nodes.find((n) => n.id === nodeId);\n if (!node) return;\n\n const newStatus: NodeStatus = {\n ...status,\n id: nanoid(),\n };\n\n node.contentInfo.statusList.push(newStatus);\n state.history.past.push(createEvent('MATERIAL_STATUS_CHANGE', nodeId, { statusId: newStatus.id }));\n });\n },\n\n removeStatus: (nodeId, statusId) => {\n set((state) => {\n const node = state.nodes.find((n) => n.id === nodeId);\n if (!node) return;\n\n const index = node.contentInfo.statusList.findIndex((s) => s.id === statusId);\n if (index !== -1) {\n node.contentInfo.statusList.splice(index, 1);\n if (node.contentInfo.currentStatusId === statusId) {\n node.contentInfo.currentStatusId = undefined;\n }\n if (state.selectedStatusId === statusId) {\n state.selectedStatusId = null;\n }\n }\n });\n },\n\n updateStatus: (nodeId, statusId, updates) => {\n set((state) => {\n const node = state.nodes.find((n) => n.id === nodeId);\n if (!node) return;\n\n const status = node.contentInfo.statusList.find((s) => s.id === statusId);\n if (status) {\n Object.assign(status, updates);\n }\n });\n },\n\n selectStatus: (statusId) => {\n set((state) => {\n state.selectedStatusId = statusId;\n });\n },\n\n evaluateCurrentStatus: (nodeId, data) => {\n const state = get();\n const node = state.nodes.find((n) => n.id === nodeId);\n if (!node) return undefined;\n\n for (const status of node.contentInfo.statusList) {\n try {\n const fn = new Function('data', 'bindCodes', 'status', status.expression);\n const result = fn(data, status.bindCodes, status);\n if (result === true) {\n return status.id;\n }\n } catch (error) {\n console.warn('状态表达式执行失败:', status.name, error);\n }\n }\n\n return undefined;\n },\n\n // ========== 物料库操作 ==========\n addMaterial: (material) => {\n set((state) => {\n const newMaterial = {\n ...material,\n id: nanoid(),\n };\n state.materials.push(newMaterial as Material);\n state.history.past.push(createEvent('MATERIAL_ADD', newMaterial.id));\n });\n },\n\n updateMaterial: (id, updates) => {\n set((state) => {\n const material = state.materials.find((m) => m.id === id);\n if (material) {\n Object.assign(material, updates);\n }\n });\n },\n\n removeMaterial: (id) => {\n set((state) => {\n const index = state.materials.findIndex((m) => m.id === id);\n if (index !== -1) {\n state.materials.splice(index, 1);\n }\n });\n },\n\n // ========== 视口操作 ==========\n setViewport: (viewport) => {\n set((state) => {\n Object.assign(state.viewport, viewport);\n });\n },\n\n // ========== 画布配置操作 ==========\n setCanvasConfig: (config) => {\n set((state) => {\n state.canvas = { ...state.canvas, ...config };\n });\n },\n\n // ========== 模式切换 ==========\n setMode: (mode) => {\n set((state) => {\n state.mode = mode;\n });\n },\n\n // ========== 线条绘制操作 ==========\n startLineDrawing: (material) => {\n set((state) => {\n state.mode = 'line-draw';\n state.lineDrawing = {\n isDrawing: true,\n material,\n startPoint: null,\n endPoint: null,\n };\n });\n },\n\n updateLineDrawing: (endPoint) => {\n set((state) => {\n if (state.lineDrawing.isDrawing) {\n state.lineDrawing.endPoint = endPoint;\n }\n });\n },\n\n endLineDrawing: () => {\n set((state) => {\n state.mode = 'select';\n state.lineDrawing = {\n isDrawing: false,\n material: null,\n startPoint: null,\n endPoint: null,\n };\n });\n },\n\n cancelLineDrawing: () => {\n set((state) => {\n state.mode = 'select';\n state.lineDrawing = {\n isDrawing: false,\n material: null,\n startPoint: null,\n endPoint: null,\n };\n });\n },\n\n // ========== 历史操作 ==========\n undo: () => {\n set((state) => {\n const lastEvent = state.history.past.pop();\n if (lastEvent) {\n state.history.future.push(lastEvent);\n }\n });\n },\n\n redo: () => {\n set((state) => {\n const nextEvent = state.history.future.pop();\n if (nextEvent) {\n state.history.past.push(nextEvent);\n }\n });\n },\n\n recordEvent: (event) => {\n set((state) => {\n state.history.past.push(event);\n state.history.future = [];\n });\n },\n\n // ========== 导入导出 ==========\n exportScheme: () => {\n const state = get();\n return {\n version: '1.1.0',\n nodes: state.nodes,\n materials: state.materials,\n viewport: state.viewport,\n metadata: {\n name: '未命名组态',\n description: '',\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n },\n };\n },\n\n importScheme: (scheme) => {\n set((state) => {\n state.nodes = scheme.nodes || [];\n state.materials = scheme.materials || [];\n state.viewport = scheme.viewport || initialState.viewport;\n state.selectedNodeId = null;\n state.selectedStatusId = null;\n state.history = { past: [], future: [] };\n });\n },\n }))\n);\n","import type { Material, Node, NodeStatus } from '../types';\nimport { nanoid } from 'nanoid';\n\n// 初始化物料库数据\nexport const initMaterials: Material[] = [\n // 基础形状\n {\n id: nanoid(),\n name: '矩形',\n type: 'IMAGE',\n src: `data:image/svg+xml,${encodeURIComponent(`<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"100\" height=\"60\"><rect width=\"100\" height=\"60\" fill=\"#1890ff\" rx=\"4\"/></svg>`)}`,\n },\n {\n id: nanoid(),\n name: '圆形',\n type: 'IMAGE',\n src: `data:image/svg+xml,${encodeURIComponent(`<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"80\" height=\"80\"><circle cx=\"40\" cy=\"40\" r=\"38\" fill=\"#52c41a\"/></svg>`)}`,\n },\n {\n id: nanoid(),\n name: '圆角矩形',\n type: 'IMAGE',\n src: `data:image/svg+xml,${encodeURIComponent(`<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"100\" height=\"60\"><rect width=\"100\" height=\"60\" fill=\"#faad14\" rx=\"20\"/></svg>`)}`,\n },\n \n // 设备图标\n {\n id: nanoid(),\n name: '阀门',\n type: 'IMAGE',\n src: `data:image/svg+xml,${encodeURIComponent(`<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"60\" height=\"60\"><path d=\"M10 20 L30 10 L50 20 L50 40 L30 50 L10 40 Z\" fill=\"#bfbfbf\" stroke=\"#595959\" stroke-width=\"2\"/><circle cx=\"30\" cy=\"30\" r=\"8\" fill=\"#1890ff\"/></svg>`)}`,\n },\n {\n id: nanoid(),\n name: '泵',\n type: 'IMAGE',\n src: `data:image/svg+xml,${encodeURIComponent(`<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"60\" height=\"60\"><circle cx=\"30\" cy=\"35\" r=\"20\" fill=\"#bfbfbf\" stroke=\"#595959\" stroke-width=\"2\"/><rect x=\"25\" y=\"5\" width=\"10\" height=\"15\" fill=\"#595959\"/><path d=\"M30 20 L30 35 M20 30 Q30 45 40 30\" stroke=\"#595959\" stroke-width=\"2\" fill=\"none\"/></svg>`)}`,\n },\n {\n id: nanoid(),\n name: '罐体',\n type: 'IMAGE',\n src: `data:image/svg+xml,${encodeURIComponent(`<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"60\" height=\"80\"><ellipse cx=\"30\" cy=\"10\" rx=\"25\" ry=\"10\" fill=\"#d9d9d9\" stroke=\"#595959\" stroke-width=\"2\"/><rect x=\"5\" y=\"10\" width=\"50\" height=\"60\" fill=\"#f0f0f0\" stroke=\"#595959\" stroke-width=\"2\"/><ellipse cx=\"30\" cy=\"70\" rx=\"25\" ry=\"10\" fill=\"#d9d9d9\" stroke=\"#595959\" stroke-width=\"2\"/></svg>`)}`,\n },\n \n // 文本\n {\n id: nanoid(),\n name: '文本标签',\n type: 'TEXT',\n content: {\n label: '标签',\n value: '值',\n labelStyle: {\n fontSize: 14,\n fontWeight: 'bold',\n color: '#262626',\n textAlign: 'left',\n },\n valueStyle: {\n fontSize: 14,\n fontWeight: 'normal',\n color: '#1890ff',\n textAlign: 'left',\n },\n },\n },\n \n // 线条 - 通用线条物料,通过属性配置实现不同线型\n {\n id: nanoid(),\n name: '线条',\n type: 'LINE',\n config: {\n thickness: 2,\n lineWeight: 2,\n color: '#262626',\n lineType: 'solid',\n },\n },\n];\n\n// 创建默认状态\nexport const createDefaultStatus = (material: Material): NodeStatus => ({\n id: nanoid(),\n name: '默认状态',\n expression: 'return true;',\n material: { ...material, id: nanoid() },\n bindCodes: [],\n});\n\n// 创建默认节点\nexport const createDefaultNode = (\n x: number,\n y: number,\n material?: Material\n): Node => {\n // 如果是群组物料,创建群组节点\n if (material?.type === 'CUSTOM' && material.config?.nodes) {\n const children = material.config.nodes.map((childNode: Node) => ({\n ...childNode,\n id: nanoid(), // 重新生成子节点ID\n }));\n \n // 计算群组边界\n let minX = Infinity, minY = Infinity;\n let maxX = -Infinity, maxY = -Infinity;\n \n children.forEach((child: Node) => {\n const cx = child.normalStyle.x || 0;\n const cy = child.normalStyle.y || 0;\n const cw = child.normalStyle.width || 0;\n const ch = child.normalStyle.height || 0;\n minX = Math.min(minX, cx);\n minY = Math.min(minY, cy);\n maxX = Math.max(maxX, cx + cw);\n maxY = Math.max(maxY, cy + ch);\n });\n \n // 调整子节点位置为相对坐标,并移除 scale 避免双重缩放\n const relativeChildren = children.map((child: Node) => ({\n ...child,\n normalStyle: {\n ...child.normalStyle,\n x: (child.normalStyle.x || 0) - minX,\n y: (child.normalStyle.y || 0) - minY,\n scale: undefined, // 移除 scale,由父级容器统一控制\n },\n }));\n \n return {\n id: nanoid(),\n name: material.name || '群组节点',\n type: 'group',\n normalStyle: {\n width: maxX - minX,\n height: maxY - minY,\n x,\n y,\n // 不设置背景和边框,由 NodeRenderer 控制\n },\n contentInfo: {\n statusList: [],\n currentStatusId: undefined,\n },\n controlInfo: {\n isDraggable: true,\n isClickable: true,\n isResizable: true,\n isSelectable: true,\n },\n children: relativeChildren,\n } as Node;\n }\n\n // 普通节点\n return {\n id: nanoid(),\n name: '新节点',\n type: 'normal',\n normalStyle: {\n width: 120,\n height: 100,\n x,\n y,\n background: 'transparent',\n padding: 8,\n },\n contentInfo: {\n statusList: material ? [createDefaultStatus(material)] : [],\n currentStatusId: undefined,\n },\n controlInfo: {\n isDraggable: true,\n isClickable: true,\n isResizable: true,\n isSelectable: true,\n },\n };\n};\n","import React, { useEffect, useState } from \"react\";\nimport { Collapse, Upload, Button, List, Empty, Typography, Image, Tag } from \"antd\";\nimport { UploadOutlined, DeleteOutlined, EditOutlined } from \"@ant-design/icons\";\nimport { useEditorStore } from \"../../store/editorStore\";\nimport { initMaterials } from \"../../utils/initData\";\nimport type { Material } from \"../../types\";\n\nconst { Panel } = Collapse;\nconst { Text } = Typography;\n\nexport const MaterialPanel: React.FC = () => {\n const {\n materials,\n addMaterial,\n removeMaterial,\n selectedStatusId,\n selectStatus,\n mode,\n lineDrawing,\n startLineDrawing,\n cancelLineDrawing,\n } = useEditorStore();\n const [activeKeys, setActiveKeys] = useState<string[]>([\n \"basic\",\n \"device\",\n \"text\",\n \"line\",\n ]);\n\n // 初始化默认物料\n // useEffect(() => {\n // if (materials.length === 0) {\n // initMaterials.forEach((m) => addMaterial(m));\n // }\n // }, []);\n\n // 处理 SVG 上传\n const handleUpload = (file: File) => {\n const reader = new FileReader();\n reader.onload = (e) => {\n const src = e.target?.result as string;\n addMaterial({\n name: file.name.replace(\".svg\", \"\"),\n type: \"IMAGE\",\n src,\n } as Material);\n };\n reader.readAsDataURL(file);\n return false;\n };\n\n // 按类型分组物料\n const groupedMaterials = {\n basic: materials.filter((m) =>\n [\"矩形\", \"圆形\", \"圆角矩形\"].includes(m.name),\n ),\n device: materials.filter(\n (m) =>\n [\"阀门\", \"泵\", \"罐体\"].includes(m.name) ||\n (m.type === \"IMAGE\" &&\n ![\"矩形\", \"圆形\", \"圆角矩形\"].includes(m.name) &&\n m.name !== \"自定义\"),\n ),\n text: materials.filter((m) => m.type === \"TEXT\"),\n line: materials.filter((m) => m.type === \"LINE\"),\n group: materials.filter((m) => m.type === \"CUSTOM\" && m.config?.nodes),\n custom: materials.filter(\n (m) =>\n (m.type === \"CUSTOM\" && !m.config?.nodes) ||\n (m.type === \"IMAGE\" &&\n ![\"矩形\", \"圆形\", \"圆角矩形\", \"阀门\", \"泵\", \"罐体\"].includes(m.name)),\n ),\n };\n\n // 处理拖拽开始\n const handleDragStart = (e: React.DragEvent, material: Material) => {\n e.dataTransfer.effectAllowed = \"copy\";\n e.dataTransfer.setData(\"application/json\", JSON.stringify(material));\n const dragImage = e.currentTarget.querySelector(\n \".material-preview\",\n ) as HTMLElement;\n if (dragImage) {\n e.dataTransfer.setDragImage(dragImage, 20, 20);\n }\n };\n\n // 处理线条物料点击(进入绘制模式)\n const handleLineMaterialClick = (material: Material) => {\n if (material.type === \"LINE\") {\n startLineDrawing(material);\n }\n };\n\n // 渲染物料项\n const renderMaterialItem = (material: Material, isLineMode: boolean = false) => {\n // 物料库中的物料不再被\"选中\",而是用于拖拽创建节点或在属性面板中选择绑定到状态\n const isSelected = false;\n // 确保 isLineMode 是布尔值\n const isLineMaterial = isLineMode === true;\n // 只有当前物料是正在绘制的那条线时才显示\"绘制中\"\n const isDrawingLine = mode === \"line-draw\" && isLineMaterial && lineDrawing.material?.id === material.id;\n\n return (\n <List.Item\n key={material.id}\n draggable={!isLineMaterial}\n onDragStart={(e) => handleDragStart(e, material)}\n onClick={() => isLineMaterial && handleLineMaterialClick(material)}\n className={`\n rounded-lg transition-all duration-200 select-none\n ${isLineMaterial ? \"cursor-pointer\" : \"cursor-move\"}\n ${isSelected ? \"bg-blue-100 ring-2 ring-blue-400\" : \"hover:bg-gray-100\"}\n ${isDrawingLine ? \"bg-blue-50 ring-2 ring-blue-400\" : \"\"}\n `}\n actions={[\n isLineMaterial ? (\n <Button\n key=\"draw\"\n type=\"text\"\n size=\"small\"\n icon={<EditOutlined />}\n onClick={(e) => {\n e.stopPropagation();\n handleLineMaterialClick(material);\n }}\n >\n 绘制\n </Button>\n ) : null,\n <Button\n key=\"delete\"\n type=\"text\"\n size=\"small\"\n danger\n icon={<DeleteOutlined />}\n onClick={(e) => {\n e.stopPropagation();\n removeMaterial(material.id);\n }}\n />,\n ].filter(Boolean)}>\n <div className={`flex items-center gap-3 w-full py-2 ${isLineMaterial ? \"\" : \"pointer-events-none\"}`}>\n <div className=\"material-preview w-12 h-12 flex items-center justify-center bg-white rounded border border-gray-200\">\n {material.type === \"IMAGE\" && (material as any).src ? (\n <Image\n src={(material as any).src}\n alt={material.name}\n width={40}\n height={40}\n preview={false}\n />\n ) : material.type === \"TEXT\" ? (\n <span className=\"text-xs text-gray-500\">T</span>\n ) : material.type === \"LINE\" ? (\n <div className=\"w-8 h-0.5 bg-gray-400\" />\n ) : material.type === \"CUSTOM\" && material.config?.nodes ? (\n <span className=\"text-xs text-blue-500 font-bold\">G</span>\n ) : (\n <span className=\"text-xs text-gray-500\">?</span>\n )}\n </div>\n\n <div className=\"flex-1 min-w-0\">\n <Text strong className=\"block truncate\">\n {material.name}\n </Text>\n <div className=\"flex items-center gap-1\">\n <Text type=\"secondary\" className=\"text-xs\">\n {material.type}\n </Text>\n {isDrawingLine && (\n <Tag color=\"blue\" className=\"text-xs\">\n 绘制中\n </Tag>\n )}\n </div>\n </div>\n </div>\n </List.Item>\n );\n };\n\n return (\n <div className=\"h-full flex flex-col bg-white border-r border-gray-200\">\n <div className=\"p-4 border-b border-gray-200\">\n <h3 className=\"text-lg font-semibold text-gray-800\">物料库</h3>\n <Text type=\"secondary\" className=\"text-sm\">\n 拖拽物料到画布创建节点\n </Text>\n </div>\n\n <div className=\"p-3 border-b border-gray-200\">\n <Upload\n accept=\".svg\"\n beforeUpload={handleUpload}\n showUploadList={false}>\n <Button icon={<UploadOutlined />} block type=\"dashed\">\n 上传 SVG\n </Button>\n </Upload>\n </div>\n\n <div className=\"flex-1 overflow-y-auto p-2\">\n <Collapse\n activeKey={activeKeys}\n onChange={(keys) => setActiveKeys(keys as string[])}\n ghost\n expandIconPosition=\"end\">\n <Panel header=\"基础形状\" key=\"basic\">\n <List\n dataSource={groupedMaterials.basic}\n renderItem={(item) => renderMaterialItem(item, false)}\n locale={{\n emptyText: (\n <Empty\n description=\"暂无物料\"\n image={Empty.PRESENTED_IMAGE_SIMPLE}\n />\n ),\n }}\n />\n </Panel>\n\n <Panel header=\"设备图标\" key=\"device\">\n <List\n dataSource={groupedMaterials.device}\n renderItem={(item) => renderMaterialItem(item, false)}\n locale={{\n emptyText: (\n <Empty\n description=\"暂无物料\"\n image={Empty.PRESENTED_IMAGE_SIMPLE}\n />\n ),\n }}\n />\n </Panel>\n\n <Panel header=\"文本\" key=\"text\">\n <List\n dataSource={groupedMaterials.text}\n renderItem={(item) => renderMaterialItem(item, false)}\n locale={{\n emptyText: (\n <Empty\n description=\"暂无物料\"\n image={Empty.PRESENTED_IMAGE_SIMPLE}\n />\n ),\n }}\n />\n </Panel>\n\n <Panel \n header={\n <div className=\"flex items-center justify-between\">\n <span>线条</span>\n {mode === \"line-draw\" && (\n <Tag color=\"blue\" className=\"text-xs\">\n 绘制模式\n </Tag>\n )}\n </div>\n } \n key=\"line\">\n <List\n dataSource={groupedMaterials.line}\n renderItem={(item) => renderMaterialItem(item, true)}\n locale={{\n emptyText: (\n <Empty\n description=\"暂无物料\"\n image={Empty.PRESENTED_IMAGE_SIMPLE}\n />\n ),\n }}\n />\n {mode === \"line-draw\" && (\n <div className=\"mt-2 p-2 bg-blue-50 rounded text-xs text-blue-600\">\n <div>点击线条物料开始绘制</div>\n <div>点击画布确定起点和终点</div>\n </div>\n )}\n </Panel>\n\n {groupedMaterials.group.length > 0 && (\n <Panel header=\"群组\" key=\"group\">\n <List\n dataSource={groupedMaterials.group}\n renderItem={(item) => renderMaterialItem(item, false)}\n locale={{\n emptyText: (\n <Empty\n description=\"暂无物料\"\n image={Empty.PRESENTED_IMAGE_SIMPLE}\n />\n ),\n }}\n />\n </Panel>\n )}\n\n {groupedMaterials.custom.length > 0 && (\n <Panel header=\"自定义\" key=\"custom\">\n <List\n dataSource={groupedMaterials.custom}\n renderItem={(item) => renderMaterialItem(item, false)}\n locale={{\n emptyText: (\n <Empty\n description=\"暂无物料\"\n image={Empty.PRESENTED_IMAGE_SIMPLE}\n />\n ),\n }}\n />\n </Panel>\n )}\n </Collapse>\n </div>\n\n <div className=\"p-3 border-t border-gray-200 bg-gray-50\">\n <Text type=\"secondary\" className=\"text-xs\">\n {mode === \"line-draw\" ? (\n <>\n 💡 提示:点击绘制线段,可连续绘制多段线,双击结束绘制,ESC 取消\n </>\n ) : (\n <>\n 💡 提示:拖拽物料到画布创建节点,点击线条物料进入绘制模式\n </>\n )}\n </Text>\n </div>\n </div>\n );\n};\n","import React, { useMemo, useState, useCallback, useRef, useEffect } from \"react\";\nimport type { CSSProperties } from \"react\";\nimport type { Node, Material, NodeStatus, LineMaterial } from \"../../types\";\nimport { Image, Typography } from \"antd\";\n\nconst { Text } = Typography;\n\ninterface NodeRendererProps {\n node: Node;\n isSelected?: boolean;\n onClick?: (e: React.MouseEvent) => void;\n onMouseDown?: (e: React.MouseEvent) => void;\n // 外部数据,用于状态表达式计算\n data?: any;\n // 更新节点回调\n onUpdateNode?: (nodeId: string, updates: Partial<Node>) => void;\n // 当前缩放比例\n scale?: number;\n}\n\n// 执行状态表达式\nconst evaluateStatusExpression = (status: NodeStatus, data?: any): boolean => {\n try {\n //生成函数所需要的参数列表\n const params =\n data && Array.isArray(data)\n ? data.map((d: any, index: number) => d.paramsName)\n : [\"A\"]; //大写英文字符\n const fn = new Function(...params, status.expression);\n const result = fn(...data.map((d: any) => d.value));\n console.log(\n `Evaluating status [${status.name}] with data:`,\n data,\n \"Result:\",\n result,\n );\n return result === true;\n } catch (error) {\n console.warn(`状态表达式执行失败 [${status.name}]:`, error);\n return false;\n }\n};\n\n// 找到第一个满足条件的状态\nconst findActiveStatus = (\n statusList: NodeStatus[],\n data?: any,\n): NodeStatus | undefined => {\n for (const status of statusList) {\n console.log(status, \"status\");\n let bindData: Record<string, any>[] = [];\n if (Array.isArray(data)) {\n console.log(status.bindCodes, \"bindCodes\");\n bindData = data.filter((d: any) =>\n status.bindCodes?.includes(d.paramsCode),\n );\n } else {\n bindData = data;\n }\n if (evaluateStatusExpression(status, bindData)) {\n return status;\n }\n }\n return undefined;\n};\n\n// 从数据中获取字段值\nconst getDataValue = (\n data: any,\n valueSourceCode?: string,\n): { value: any; unit?: string } => {\n if (!valueSourceCode || !data) {\n return { value: undefined };\n }\n\n // 数据是数组格式:查找 paramsCode 匹配的项\n if (Array.isArray(data)) {\n const dataItem = data.find((d) => d.paramsCode === valueSourceCode);\n if (dataItem) {\n return {\n value: dataItem.value,\n unit: dataItem.unit,\n };\n }\n }\n // 数据是对象格式:直接取字段\n else if (typeof data === \"object\" && valueSourceCode in data) {\n return {\n value: data[valueSourceCode],\n unit: data.unit,\n };\n }\n\n return { value: undefined };\n};\n\n// 格式化数值,根据小数位配置\nconst formatValue = (value: any, decimals?: number): string => {\n if (value === undefined || value === null || value === \"\") return \"\";\n\n // -1 表示不格式化\n if (decimals === -1) return String(value);\n\n // 检查是否为有效数值\n const num = Number(value);\n if (isNaN(num)) return String(value);\n\n // 格式化小数位\n return num.toFixed(decimals ?? 2);\n};\n\n// 渲染物料\nconst renderMaterial = (material: Material, data?: any, isSelected?: boolean, node?: Node) => {\n switch (material.type) {\n case \"IMAGE\":\n const imageMaterial = material as any;\n const bgColor = imageMaterial.backgroundColor;\n const fillColor = imageMaterial.fillColor;\n\n // 如果是基本形状且有填充颜色,动态生成 SVG\n let src = imageMaterial.src;\n if (fillColor && src && src.includes('data:image/svg+xml')) {\n if (material.name === '矩形') {\n src = `data:image/svg+xml,${encodeURIComponent(`<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"100\" height=\"60\"><rect width=\"100\" height=\"60\" fill=\"${fillColor}\" rx=\"4\"/></svg>`)}`;\n } else if (material.name === '圆形') {\n src = `data:image/svg+xml,${encodeURIComponent(`<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"80\" height=\"80\"><circle cx=\"40\" cy=\"40\" r=\"38\" fill=\"${fillColor}\"/></svg>`)}`;\n } else if (material.name === '圆角矩形') {\n src = `data:image/svg+xml,${encodeURIComponent(`<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"100\" height=\"60\"><rect width=\"100\" height=\"60\" fill=\"${fillColor}\" rx=\"20\"/></svg>`)}`;\n }\n }\n\n return (\n <div\n className=\"w-full h-full flex items-center justify-center overflow-hidden\"\n style={{ backgroundColor: bgColor }}\n >\n {src ? (\n <img\n src={src}\n alt={material.name}\n style={{\n width: \"100%\",\n height: \"100%\",\n objectFit: \"contain\",\n }}\n />\n ) : (\n <div className=\"w-full h-full flex items-center justify-center\">\n <span className=\"text-gray-400 text-xs\">无图片</span>\n </div>\n )}\n </div>\n );\n\n case \"TEXT\":\n const textMaterial = material as any;\n const {\n label,\n value: configValue,\n valueSourceCode,\n unit: configUnit,\n decimals,\n labelStyle,\n valueStyle,\n customStyle,\n } = textMaterial.content || {};\n\n // 如果有 valueSourceCode,从数据中获取值\n const { value: dataValue, unit: dataUnit } = valueSourceCode\n ? getDataValue(data, valueSourceCode)\n : { value: undefined, unit: undefined };\n\n // 优先使用数据中的值,否则使用配置的默认值\n const rawValue = dataValue !== undefined ? dataValue : configValue;\n // 格式化数值\n const displayValue = formatValue(rawValue, decimals);\n // 优先使用配置的单位,否则使用数据中的单位\n const displayUnit = configUnit || dataUnit || \"\";\n\n return (\n <div\n className=\"w-full h-full flex flex-col justify-center gap-1\"\n style={{ ...customStyle }}>\n {label && (\n <Text\n style={{\n fontSize: 14,\n fontWeight: \"bold\",\n color: \"#262626\",\n textAlign: \"left\",\n ...labelStyle,\n }}>\n {label}\n </Text>\n )}\n {displayValue && (\n <Text\n style={{\n fontSize: 14,\n color: \"#1890ff\",\n textAlign: \"left\",\n ...valueStyle,\n }}>\n {displayValue}\n {displayUnit ? ` ${displayUnit}` : \"\"}\n </Text>\n )}\n </div>\n );\n\n case \"LINE\":\n const lineMaterial = material as any;\n const {\n thickness = 2,\n color = \"#d9d9d9\",\n dashed = false,\n lineType = dashed ? \"dashed\" : \"solid\",\n lineWeight = thickness,\n // 起点和终点的相对坐标\n startX = 0,\n startY = 0,\n endX = 100,\n endY = 0,\n } = lineMaterial.config || {};\n\n // 根据线型计算 dash array\n const getDashArray = (type: string): string => {\n const baseWeight = Math.max(lineWeight, 1);\n switch (type) {\n case \"solid\":\n return \"\";\n case \"dashed\":\n return `${baseWeight * 8},${baseWeight * 4}`;\n case \"center\":\n return `${baseWeight * 12},${baseWeight * 3},${baseWeight * 2},${baseWeight * 3}`;\n case \"phantom\":\n return `${baseWeight * 12},${baseWeight * 3},${baseWeight * 2},${baseWeight * 3},${baseWeight * 2},${baseWeight * 3}`;\n case \"dot\":\n return `${baseWeight},${baseWeight * 3}`;\n case \"dash-dot\":\n return `${baseWeight * 8},${baseWeight * 3},${baseWeight},${baseWeight * 3}`;\n default:\n return \"\";\n }\n };\n\n const dashArray = getDashArray(lineType);\n\n // 选中时高亮颜色\n const strokeColor = isSelected ? \"#1890ff\" : color;\n\n // 直接使用保存的相对坐标画线\n // 这和预览线的逻辑一模一样:从起点画到终点\n return (\n <div className=\"w-full h-full relative\" style={{ overflow: \"visible\" }}>\n <svg\n className=\"absolute top-0 left-0\"\n width=\"100%\"\n height=\"100%\"\n style={{ overflow: \"visible\", pointerEvents: \"none\" }}>\n {/* 看不见的宽线用于捕获点击事件 */}\n <line\n x1={startX}\n y1={startY}\n x2={endX}\n y2={endY}\n stroke=\"transparent\"\n strokeWidth={Math.max(lineWeight, 10)}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n style={{ pointerEvents: \"stroke\", cursor: \"pointer\" }}\n />\n {/* 实际显示的线 */}\n <line\n x1={startX}\n y1={startY}\n x2={endX}\n y2={endY}\n stroke={strokeColor}\n strokeWidth={lineWeight}\n strokeDasharray={dashArray}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n style={{ pointerEvents: \"none\" }}\n />\n </svg>\n </div>\n );\n\n case \"CUSTOM\":\n const customMaterial = material as any;\n if (customMaterial.render) {\n return customMaterial.render({});\n }\n return (\n <div className=\"w-full h-full flex items-center justify-center bg-gray-100\">\n <span className=\"text-gray-400 text-xs\">自定义组件</span>\n </div>\n );\n\n default:\n return (\n <div className=\"w-full h-full flex items-center justify-center bg-gray-100\">\n <span className=\"text-gray-400 text-xs\">未知类型</span>\n </div>\n );\n }\n};\n\nconst NodeRendererComponent: React.FC<NodeRendererProps> = ({\n node,\n isSelected = false,\n onClick,\n onMouseDown,\n data,\n onUpdateNode,\n scale: canvasScale = 1,\n}) => {\n const { normalStyle, contentInfo, controlInfo } = node;\n const { statusList } = contentInfo;\n const { isClickable, isDraggable, isResizable } = controlInfo;\n\n // 使用 ref 存储 onClick,避免 memo 导致的旧闭包问题\n const onClickRef = useRef(onClick);\n onClickRef.current = onClick;\n\n // 线条端点拖拽状态\n const [draggingPoint, setDraggingPoint] = useState<'start' | 'end' | null>(null);\n const dragOriginRef = useRef<{\n mouseX: number;\n mouseY: number;\n startX: number;\n startY: number;\n endX: number;\n endY: number;\n nodeX: number;\n nodeY: number;\n } | null>(null);\n // 端点拖拽过程中的最终计算结果,仅在 mouseup 时同步到 store\n const dragResultRef = useRef<{\n nodeX: number; nodeY: number;\n width: number; height: number;\n startX: number; startY: number;\n endX: number; endY: number;\n } | null>(null);\n // 缩放拖拽过程中的最终计算结果\n const resizeResultRef = useRef<{\n x: number; y: number;\n width: number; height: number;\n } | null>(null);\n const nodeRef = useRef<HTMLDivElement>(null);\n\n // 缩放拖拽状态\n const [resizing, setResizing] = useState<{\n corner: 'nw' | 'ne' | 'sw' | 'se';\n startX: number;\n startY: number;\n startWidth: number;\n startHeight: number;\n startNodeX: number;\n startNodeY: number;\n } | null>(null);\n\n // 旋转拖拽状态\n const [rotating, setRotating] = useState<{\n startX: number;\n startY: number;\n startAngle: number;\n centerX: number;\n centerY: number;\n } | null>(null);\n // 旋转过程中的实时角度(ref),防止 React 重渲染覆盖 DOM 操作的角度\n const rotatingAngleRef = useRef<number | null>(null);\n\n // 计算当前应该显示的状态(完全由表达式决定)\n const currentStatus = useMemo(() => {\n if (statusList.length === 0) return undefined;\n\n // 执行状态表达式,找到第一个返回 true 的状态\n const activeStatus = findActiveStatus(statusList, data);\n if (activeStatus) return activeStatus;\n\n // 如果没有状态满足条件,返回第一个状态作为默认\n return statusList[0];\n }, [statusList, data]);\n\n // 获取当前状态绑定的物料\n const currentMaterial = currentStatus?.material;\n\n // 判断当前物料是否是线条\n const isLine = currentMaterial?.type === 'LINE';\n\n // 获取线条配置\n const lineConfig = isLine ? (currentMaterial as LineMaterial).config : null;\n\n // 计算缩放比例\n const nodeScale = normalStyle.scale ?? 1;\n const scaledWidth = (normalStyle.width || 100) * nodeScale;\n const scaledHeight = (normalStyle.height || 100) * nodeScale;\n\n // 通过 DOM 测量推算画布实际缩放比,避免依赖可能不同步的 prop\n const getEffectiveCanvasScale = useCallback(() => {\n const canvasEl = nodeRef.current?.closest('[data-canvas=\"true\"]') as HTMLElement;\n if (!canvasEl) return canvasScale;\n const canvasRect = canvasEl.getBoundingClientRect();\n const logicalWidth = parseFloat(canvasEl.style.width);\n if (!logicalWidth) return canvasScale;\n return canvasRect.width / logicalWidth;\n }, [canvasScale]);\n\n // 处理端点拖拽开始:记录初始鼠标位置和线条配置快照\n const handlePointMouseDown = useCallback((e: React.MouseEvent, point: 'start' | 'end') => {\n e.stopPropagation();\n e.preventDefault();\n dragOriginRef.current = {\n mouseX: e.clientX,\n mouseY: e.clientY,\n startX: lineConfig?.startX || 0,\n startY: lineConfig?.startY || 0,\n endX: lineConfig?.endX || 0,\n endY: lineConfig?.endY || 0,\n nodeX: normalStyle.x || 0,\n nodeY: normalStyle.y || 0,\n };\n setDraggingPoint(point);\n }, [lineConfig, normalStyle.x, normalStyle.y]);\n\n // 处理端点拖拽:拖拽中仅操作 DOM,mouseup 时一次性同步到 store\n useEffect(() => {\n if (!draggingPoint || !isLine || !lineConfig || !onUpdateNode) return;\n\n const handleMouseMove = (e: MouseEvent) => {\n const origin = dragOriginRef.current;\n if (!origin || !nodeRef.current) return;\n\n const effectiveScale = getEffectiveCanvasScale();\n const totalDx = (e.clientX - origin.mouseX) / effectiveScale;\n const totalDy = (e.clientY - origin.mouseY) / effectiveScale;\n\n let newStartX = origin.startX;\n let newStartY = origin.startY;\n let newEndX = origin.endX;\n let newEndY = origin.endY;\n let newNodeX = origin.nodeX;\n let newNodeY = origin.nodeY;\n\n if (draggingPoint === 'start') {\n newStartX = origin.startX + totalDx;\n newStartY = origin.startY + totalDy;\n if (newStartX < 0) {\n newNodeX = origin.nodeX + newStartX;\n newEndX = origin.endX - newStartX;\n newStartX = 0;\n }\n if (newStartY < 0) {\n newNodeY = origin.nodeY + newStartY;\n newEndY = origin.endY - newStartY;\n newStartY = 0;\n }\n } else {\n newEndX = origin.endX + totalDx;\n newEndY = origin.endY + totalDy;\n if (newEndX < 0) {\n newNodeX = origin.nodeX + newEndX;\n newStartX = origin.startX - newEndX;\n newEndX = 0;\n }\n if (newEndY < 0) {\n newNodeY = origin.nodeY + newEndY;\n newStartY = origin.startY - newEndY;\n newEndY = 0;\n }\n }\n\n const minNodeSize = Math.max((lineConfig.lineWeight || 2) * 2, 4);\n const maxX = Math.max(newStartX, newEndX);\n const maxY = Math.max(newStartY, newEndY);\n const newWidth = Math.max(maxX, minNodeSize);\n const newHeight = Math.max(maxY, minNodeSize);\n\n // 存储计算结果供 mouseup 同步\n dragResultRef.current = {\n nodeX: newNodeX, nodeY: newNodeY,\n width: newWidth, height: newHeight,\n startX: newStartX, startY: newStartY,\n endX: newEndX, endY: newEndY,\n };\n\n // 直接操作 DOM —— 不触发 React 渲染\n const el = nodeRef.current;\n el.style.left = `${newNodeX}px`;\n el.style.top = `${newNodeY}px`;\n el.style.width = `${newWidth}px`;\n el.style.height = `${newHeight}px`;\n\n // 更新 SVG 线条坐标\n const lines = el.querySelectorAll('svg line');\n lines.forEach(line => {\n line.setAttribute('x1', String(newStartX));\n line.setAttribute('y1', String(newStartY));\n line.setAttribute('x2', String(newEndX));\n line.setAttribute('y2', String(newEndY));\n });\n\n // 更新端点手柄位置\n const startHandle = el.querySelector('[data-handle=\"start\"]') as HTMLElement;\n const endHandle = el.querySelector('[data-handle=\"end\"]') as HTMLElement;\n if (startHandle) {\n startHandle.style.left = `${newStartX - 6}px`;\n startHandle.style.top = `${newStartY - 6}px`;\n }\n if (endHandle) {\n endHandle.style.left = `${newEndX - 6}px`;\n endHandle.style.top = `${newEndY - 6}px`;\n }\n };\n\n const handleMouseUp = () => {\n const result = dragResultRef.current;\n if (result) {\n onUpdateNode(node.id, {\n normalStyle: {\n ...normalStyle,\n x: result.nodeX,\n y: result.nodeY,\n width: result.width,\n height: result.height,\n },\n contentInfo: {\n ...contentInfo,\n statusList: statusList.map(s => ({\n ...s,\n material: s.material.type === 'LINE' ? {\n ...s.material,\n config: {\n ...lineConfig,\n startX: result.startX,\n startY: result.startY,\n endX: result.endX,\n endY: result.endY,\n },\n } : s.material,\n })),\n },\n });\n }\n setDraggingPoint(null);\n dragOriginRef.current = null;\n dragResultRef.current = null;\n };\n\n window.addEventListener('mousemove', handleMouseMove);\n window.addEventListener('mouseup', handleMouseUp);\n\n return () => {\n window.removeEventListener('mousemove', handleMouseMove);\n window.removeEventListener('mouseup', handleMouseUp);\n };\n }, [draggingPoint, isLine, lineConfig, node.id, normalStyle, contentInfo, statusList, onUpdateNode, getEffectiveCanvasScale]);\n\n // 处理缩放拖拽:拖拽中仅操作 DOM,mouseup 时一次性同步到 store\n useEffect(() => {\n if (!resizing || !onUpdateNode) return;\n\n const handleMouseMove = (e: MouseEvent) => {\n if (!nodeRef.current) return;\n const effectiveScale = getEffectiveCanvasScale();\n const dx = (e.clientX - resizing.startX) / effectiveScale;\n const dy = (e.clientY - resizing.startY) / effectiveScale;\n\n let newWidth = resizing.startWidth;\n let newHeight = resizing.startHeight;\n let newX = resizing.startNodeX;\n let newY = resizing.startNodeY;\n\n switch (resizing.corner) {\n case 'se':\n newWidth = Math.max(20, resizing.startWidth + dx);\n newHeight = Math.max(20, resizing.startHeight + dy);\n break;\n case 'sw':\n newWidth = Math.max(20, resizing.startWidth - dx);\n newHeight = Math.max(20, resizing.startHeight + dy);\n newX = resizing.startNodeX + (resizing.startWidth - newWidth);\n break;\n case 'ne':\n newWidth = Math.max(20, resizing.startWidth + dx);\n newHeight = Math.max(20, resizing.startHeight - dy);\n newY = resizing.startNodeY + (resizing.startHeight - newHeight);\n break;\n case 'nw':\n newWidth = Math.max(20, resizing.startWidth - dx);\n newHeight = Math.max(20, resizing.startHeight - dy);\n newX = resizing.startNodeX + (resizing.startWidth - newWidth);\n newY = resizing.startNodeY + (resizing.startHeight - newHeight);\n break;\n }\n\n resizeResultRef.current = { x: newX, y: newY, width: newWidth, height: newHeight };\n\n const el = nodeRef.current;\n el.style.left = `${newX}px`;\n el.style.top = `${newY}px`;\n el.style.width = `${newWidth}px`;\n el.style.height = `${newHeight}px`;\n };\n\n const handleMouseUp = () => {\n const result = resizeResultRef.current;\n if (result) {\n onUpdateNode(node.id, {\n normalStyle: {\n ...normalStyle,\n x: result.x,\n y: result.y,\n width: result.width,\n height: result.height,\n },\n });\n }\n setResizing(null);\n resizeResultRef.current = null;\n };\n\n window.addEventListener('mousemove', handleMouseMove);\n window.addEventListener('mouseup', handleMouseUp);\n\n return () => {\n window.removeEventListener('mousemove', handleMouseMove);\n window.removeEventListener('mouseup', handleMouseUp);\n };\n }, [resizing, onUpdateNode, node.id, normalStyle, getEffectiveCanvasScale]);\n\n // 处理缩放开始\n const handleResizeStart = useCallback((e: React.MouseEvent, corner: 'nw' | 'ne' | 'sw' | 'se') => {\n e.stopPropagation();\n e.preventDefault();\n setResizing({\n corner,\n startX: e.clientX,\n startY: e.clientY,\n startWidth: normalStyle.width || 100,\n startHeight: normalStyle.height || 100,\n startNodeX: normalStyle.x || 0,\n startNodeY: normalStyle.y || 0,\n });\n }, [normalStyle.width, normalStyle.height, normalStyle.x, normalStyle.y]);\n\n // 处理旋转开始\n const handleRotateStart = useCallback((e: React.MouseEvent) => {\n e.stopPropagation();\n e.preventDefault();\n\n // 计算节点中心点(屏幕坐标)\n const rect = nodeRef.current?.getBoundingClientRect();\n if (!rect) return;\n\n setRotating({\n startX: e.clientX,\n startY: e.clientY,\n startAngle: normalStyle.rotate || 0,\n centerX: rect.left + rect.width / 2,\n centerY: rect.top + rect.height / 2,\n });\n }, [normalStyle.rotate]);\n\n // 处理旋转拖拽:仅通过直接 DOM 操作 + ref 更新角度,不触发 React 渲染\n useEffect(() => {\n if (!rotating) return;\n\n const handleMouseMove = (e: MouseEvent) => {\n const dx = e.clientX - rotating.centerX;\n const dy = e.clientY - rotating.centerY;\n const angle = Math.atan2(dy, dx) * (180 / Math.PI);\n\n let newAngle = (angle + 90) % 360;\n if (newAngle < 0) newAngle += 360;\n\n // 同步更新 ref 和 DOM,确保 React 重渲染时 containerStyle 与 DOM 一致\n rotatingAngleRef.current = newAngle;\n if (nodeRef.current) {\n const extra = normalStyle.transform || '';\n nodeRef.current.style.transform = `rotate(${newAngle}deg) ${extra}`.trim();\n }\n };\n\n const handleMouseUp = () => {\n const finalAngle = rotatingAngleRef.current ?? rotating.startAngle;\n rotatingAngleRef.current = null;\n\n if (onUpdateNode) {\n onUpdateNode(node.id, {\n normalStyle: {\n ...normalStyle,\n rotate: Math.round(finalAngle),\n },\n });\n }\n setRotating(null);\n };\n\n window.addEventListener('mousemove', handleMouseMove);\n window.addEventListener('mouseup', handleMouseUp);\n\n return () => {\n window.removeEventListener('mousemove', handleMouseMove);\n window.removeEventListener('mouseup', handleMouseUp);\n };\n }, [rotating, onUpdateNode, node.id, normalStyle]);\n\n // 判断是否为群组节点\n const isGroup = node.type === 'group';\n\n // 样式计算\n const containerStyle: CSSProperties = {\n position: \"absolute\",\n left: normalStyle.x || 0,\n top: normalStyle.y || 0,\n width: scaledWidth,\n height: scaledHeight,\n // 群组节点不显示背景和边框,只作为容器\n background: isGroup ? 'transparent' : (normalStyle.background || \"transparent\"),\n backgroundImage: isGroup ? undefined : (normalStyle.backgroundImage\n ? `url(${normalStyle.backgroundImage})`\n : undefined),\n backgroundSize: \"cover\",\n backgroundPosition: \"center\",\n padding: Array.isArray(normalStyle.padding)\n ? normalStyle.padding.join(\"px \") + \"px\"\n : normalStyle.padding,\n margin: Array.isArray(normalStyle.margin)\n ? normalStyle.margin.join(\"px \") + \"px\"\n : normalStyle.margin,\n borderRadius: isGroup ? undefined : normalStyle.borderRadius,\n // 线条物料选中时不显示边框,而是通过高亮线条颜色来表示\n // 群组节点选中时显示边框,平时不显示\n border: isSelected && !isLine\n ? \"2px solid #1890ff\"\n : isLine\n ? \"none\"\n : isGroup\n ? \"none\"\n : normalStyle.border || \"1px dashed transparent\",\n // 线条节点需要捕获点击事件,但由内部 SVG 的透明线处理具体点击区域\n pointerEvents: \"auto\",\n opacity: normalStyle.opacity ?? 1,\n transform: `rotate(${rotatingAngleRef.current ?? (normalStyle.rotate || 0)}deg) ${normalStyle.transform || ''}`.trim(),\n transformOrigin: 'center center',\n zIndex: isSelected ? 1000 : (normalStyle.zIndex ?? 1),\n cursor: isDraggable && !draggingPoint ? \"move\" : isClickable ? \"pointer\" : \"default\",\n boxSizing: \"border-box\",\n // 选中、线条和群组节点使用 visible overflow,避免裁剪手柄\n overflow: isSelected || isLine || isGroup ? \"visible\" : \"hidden\",\n };\n\n // 获取线条端点位置用于显示拖拽手柄\n const startPointPos = lineConfig ? { x: lineConfig.startX || 0, y: lineConfig.startY || 0 } : { x: 0, y: 0 };\n const endPointPos = lineConfig ? { x: lineConfig.endX || 0, y: lineConfig.endY || 0 } : { x: 0, y: 0 };\n\n return (\n <div\n ref={nodeRef}\n data-node-id={node.id}\n style={containerStyle}\n onClick={(e) => {\n console.log('NodeRenderer onClick', node.id, 'isClickable:', isClickable);\n // 使用 ref 获取最新函数\n const latestOnClick = onClickRef.current;\n if (isClickable && latestOnClick && !draggingPoint && !resizing && !rotating) {\n e.stopPropagation();\n latestOnClick(e);\n }\n // 如果没有 onClick 处理器,不阻止传播,让父节点(如 group)处理\n }}\n onMouseDown={(e) => {\n if (isDraggable && onMouseDown && !draggingPoint) {\n onMouseDown(e);\n }\n }}>\n {/* 选中时的调整手柄 */}\n {isSelected && !isLine && !isGroup && (\n <>\n {/* 四角手柄 - 支持拖拽缩放 */}\n <div\n className=\"absolute top-0 left-0 w-3 h-3 bg-blue-500 border-2 border-white rounded-full\"\n style={{ zIndex: 9999, pointerEvents: 'auto', cursor: 'nw-resize', marginTop: '-6px', marginLeft: '-6px' }}\n onMouseDown={(e) => handleResizeStart(e, 'nw')}\n title=\"拖拽调整大小\"\n />\n <div\n className=\"absolute top-0 right-0 w-3 h-3 bg-blue-500 border-2 border-white rounded-full\"\n style={{ zIndex: 9999, pointerEvents: 'auto', cursor: 'ne-resize', marginTop: '-6px', marginRight: '-6px' }}\n onMouseDown={(e) => handleResizeStart(e, 'ne')}\n title=\"拖拽调整大小\"\n />\n <div\n className=\"absolute bottom-0 left-0 w-3 h-3 bg-blue-500 border-2 border-white rounded-full\"\n style={{ zIndex: 9999, pointerEvents: 'auto', cursor: 'sw-resize', marginBottom: '-6px', marginLeft: '-6px' }}\n onMouseDown={(e) => handleResizeStart(e, 'sw')}\n title=\"拖拽调整大小\"\n />\n <div\n className=\"absolute bottom-0 right-0 w-3 h-3 bg-blue-500 border-2 border-white rounded-full\"\n style={{ zIndex: 9999, pointerEvents: 'auto', cursor: 'se-resize', marginBottom: '-6px', marginRight: '-6px' }}\n onMouseDown={(e) => handleResizeStart(e, 'se')}\n title=\"拖拽调整大小\"\n />\n\n {/* 旋转手柄 */}\n <div\n className=\"absolute top-0 left-1/2 w-4 h-4 bg-green-500 border-2 border-white rounded-full\"\n style={{ zIndex: 9999, pointerEvents: 'auto', cursor: 'grab', marginTop: '-20px', transform: 'translateX(-50%)', boxShadow: '0 0 4px rgba(0,0,0,0.3)' }}\n onMouseDown={(e) => handleRotateStart(e)}\n title=\"拖拽旋转\"\n />\n {/* 旋转连接线 */}\n <div\n className=\"absolute top-0 left-1/2 w-0.5 h-3 bg-green-500\"\n style={{ zIndex: 9998, pointerEvents: 'none', marginTop: '-14px', transform: 'translateX(-50%)' }}\n />\n\n {/* 节点名称和当前状态标签 */}\n <div className=\"absolute -top-6 left-0 bg-blue-500 text-white text-xs px-2 py-0.5 rounded whitespace-nowrap\">\n {node.name} {currentStatus ? `(${currentStatus.name})` : \"\"}\n </div>\n </>\n )}\n\n {/* 线条端点拖拽手柄 */}\n {isSelected && isLine && lineConfig && onUpdateNode && (\n <>\n {/* 起点拖拽手柄 */}\n <div\n data-handle=\"start\"\n className=\"absolute w-3 h-3 bg-blue-500 border-2 border-white rounded-full cursor-move z-50\"\n style={{\n left: startPointPos.x - 6,\n top: startPointPos.y - 6,\n boxShadow: '0 0 4px rgba(0,0,0,0.3)',\n }}\n onMouseDown={(e) => handlePointMouseDown(e, 'start')}\n title=\"拖拽调整起点\"\n />\n {/* 终点拖拽手柄 */}\n <div\n data-handle=\"end\"\n className=\"absolute w-3 h-3 bg-blue-500 border-2 border-white rounded-full cursor-move z-50\"\n style={{\n left: endPointPos.x - 6,\n top: endPointPos.y - 6,\n boxShadow: '0 0 4px rgba(0,0,0,0.3)',\n }}\n onMouseDown={(e) => handlePointMouseDown(e, 'end')}\n title=\"拖拽调整终点\"\n />\n\n {/* 节点名称 */}\n <div className=\"absolute -top-6 left-0 bg-blue-500 text-white text-xs px-2 py-0.5 rounded whitespace-nowrap\">\n {node.name}\n </div>\n </>\n )}\n\n {/* 渲染当前状态绑定的物料 */}\n <div className=\"w-full h-full relative\">\n {currentMaterial ? (\n <div className=\"w-full h-full\">\n {renderMaterial(currentMaterial, data, isSelected, node)}\n </div>\n ) : !isGroup ? (\n // 只有非群组节点才显示\"无状态\"\n <div className=\"w-full h-full flex items-center justify-center text-gray-300 text-xs\">\n 无状态\n </div>\n ) : null}\n </div>\n\n {/* 渲染群组节点的子节点 */}\n {node.type === 'group' && node.children && (\n <div className=\"absolute inset-0 pointer-events-none\">\n {node.children.map(childNode => (\n <div key={childNode.id} className=\"pointer-events-auto\">\n <NodeRenderer\n node={childNode}\n isSelected={false}\n data={data}\n onUpdateNode={onUpdateNode}\n scale={canvasScale}\n />\n </div>\n ))}\n </div>\n )}\n </div>\n )\n};\n\n// 使用 React.memo 避免不必要的重渲染,提高拖拽性能\n// 注意:只在节点位置、选中状态、缩放比例、状态内容变化时才重渲染\n// 忽略 data、onClick、onMouseDown、onUpdateNode 等频繁变化的 props\nexport const NodeRenderer = React.memo(NodeRendererComponent, (prevProps, nextProps) => {\n const nodeA = prevProps.node;\n const nodeB = nextProps.node;\n\n // 比较节点位置和尺寸\n const nodeStyleEqual =\n nodeA.id === nodeB.id &&\n nodeA.normalStyle.x === nodeB.normalStyle.x &&\n nodeA.normalStyle.y === nodeB.normalStyle.y &&\n nodeA.normalStyle.width === nodeB.normalStyle.width &&\n nodeA.normalStyle.height === nodeB.normalStyle.height;\n\n // 比较节点内容引用(contentInfo 对象在更新时会创建新引用)\n const contentEqual = nodeA.contentInfo === nodeB.contentInfo;\n\n // 比较其他关键 props\n const otherPropsEqual =\n prevProps.isSelected === nextProps.isSelected &&\n prevProps.scale === nextProps.scale;\n\n return nodeStyleEqual && contentEqual && otherPropsEqual;\n});\n","import React, { useState, useRef, useEffect } from 'react';\n\ninterface ColorPickerProps {\n value?: string;\n onChange?: (color: { toHexString: () => string }) => void;\n onChangeComplete?: (color: { toHexString: () => string }) => void;\n}\n\nconst presetColors = [\n '#1890ff', '#52c41a', '#faad14', '#f5222d',\n '#722ed1', '#eb2f96', '#13c2c2', '#fa8c16',\n '#595959', '#262626', '#8c8c8c', '#d9d9d9',\n '#ffffff', '#000000', '#ff4d4f', '#73d13d',\n];\n\nexport const ColorPicker: React.FC<ColorPickerProps> = ({ \n value = '#1890ff', \n onChange,\n onChangeComplete \n}) => {\n const [visible, setVisible] = useState(false);\n const [innerValue, setInnerValue] = useState(value);\n const popoverRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n setInnerValue(value);\n }, [value]);\n\n useEffect(() => {\n const handleClickOutside = (e: MouseEvent) => {\n if (popoverRef.current && !popoverRef.current.contains(e.target as Node)) {\n setVisible(false);\n onChangeComplete?.({ toHexString: () => innerValue });\n }\n };\n if (visible) {\n document.addEventListener('mousedown', handleClickOutside);\n }\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, [visible, onChangeComplete, innerValue]);\n\n const handleColorChange = (color: string) => {\n setInnerValue(color);\n onChange?.({ toHexString: () => color });\n };\n\n return (\n <div ref={popoverRef} style={{ position: 'relative', display: 'inline-block' }}>\n <div\n onClick={() => setVisible(!visible)}\n style={{\n width: 28,\n height: 28,\n backgroundColor: innerValue,\n border: '1px solid #d9d9d9',\n borderRadius: 4,\n cursor: 'pointer',\n }}\n />\n {visible && (\n <div\n style={{\n position: 'absolute',\n top: 32,\n left: 0,\n zIndex: 1000,\n background: '#fff',\n padding: 8,\n borderRadius: 4,\n boxShadow: '0 2px 8px rgba(0,0,0,0.15)',\n border: '1px solid #f0f0f0',\n }}\n >\n <div style={{ display: 'grid', gridTemplateColumns: 'repeat(8, 1fr)', gap: 4 }}>\n {presetColors.map((color) => (\n <div\n key={color}\n onClick={() => {\n handleColorChange(color);\n setVisible(false);\n onChangeComplete?.({ toHexString: () => color });\n }}\n style={{\n width: 20,\n height: 20,\n backgroundColor: color,\n border: innerValue === color ? '2px solid #1890ff' : '1px solid #d9d9d9',\n borderRadius: 2,\n cursor: 'pointer',\n }}\n />\n ))}\n </div>\n <input\n type=\"color\"\n value={innerValue}\n onChange={(e) => handleColorChange(e.target.value)}\n onBlur={() => onChangeComplete?.({ toHexString: () => innerValue })}\n style={{ \n width: '100%', \n marginTop: 8,\n height: 28,\n border: '1px solid #d9d9d9',\n borderRadius: 4,\n }}\n />\n </div>\n )}\n </div>\n );\n};\n","import React, { useRef, useCallback, useState, useEffect, useMemo } from \"react\";\nimport {\n TransformWrapper,\n TransformComponent,\n type ReactZoomPanPinchRef,\n} from \"react-zoom-pan-pinch\";\nimport { Button, Space, Tooltip, Modal, Form, Input, InputNumber, Switch } from \"antd\";\nimport {\n ZoomInOutlined,\n ZoomOutOutlined,\n UndoOutlined,\n RedoOutlined,\n SelectOutlined,\n DragOutlined,\n EyeOutlined,\n DeleteOutlined,\n ExperimentOutlined,\n GroupOutlined,\n VerticalAlignTopOutlined,\n VerticalAlignBottomOutlined,\n AlignLeftOutlined,\n AlignRightOutlined,\n EditOutlined,\n SettingOutlined,\n CopyOutlined,\n UngroupOutlined,\n ColumnWidthOutlined,\n ColumnHeightOutlined,\n} from \"@ant-design/icons\";\nimport { useEditorStore } from \"../../store/editorStore\";\nimport { NodeRenderer } from \"../NodeRenderer\";\nimport { ColorPicker } from '../ColorPicker';\nimport { createDefaultNode, createDefaultStatus } from \"../../utils/initData\";\nimport type { Node, NormalNode, Material, LineMaterial, GroupNode } from \"../../types\";\nimport { nanoid } from \"nanoid\";\n\nconst { TextArea } = Input;\n\ninterface CanvasProps {\n defaultTestData?: any;\n}\n\nexport const Canvas: React.FC<CanvasProps> = ({ defaultTestData }) => {\n const transformRef = useRef<ReactZoomPanPinchRef>(null);\n const canvasRef = useRef<HTMLDivElement>(null);\n const wrapperRef = useRef<HTMLDivElement>(null);\n\n const {\n nodes,\n selectedNodeId,\n mode,\n lineDrawing,\n viewport,\n canvas,\n setViewport,\n setCanvasConfig,\n addNode,\n selectNode,\n updateNode,\n removeNode,\n undo,\n redo,\n setMode,\n startLineDrawing,\n endLineDrawing,\n cancelLineDrawing,\n } = useEditorStore();\n // console.log('mode', mode);\n const [isDragOver, setIsDragOver] = useState(false);\n const [, forceUpdate] = useState({});\n const modeRef = useRef(mode);\n useEffect(() => {\n modeRef.current = mode;\n }, [mode]);\n // 拖拽状态\n const isDraggingRef = useRef(false);\n const dragStartRef = useRef({ x: 0, y: 0 });\n const dragOffsetRef = useRef({ x: 0, y: 0, newX: 0, newY: 0 });\n const draggingNodeRef = useRef<Node | null>(null);\n\n // 线条绘制状态\n const [linePreview, setLinePreview] = useState<{\n start: { x: number; y: number } | null;\n end: { x: number; y: number } | null;\n isDrawing: boolean;\n }>({ start: null, end: null, isDrawing: false });\n\n // 框选状态\n const [selectionBox, setSelectionBox] = useState<{\n start: { x: number; y: number } | null;\n end: { x: number; y: number } | null;\n }>({ start: null, end: null });\n const [selectedNodeIds, setSelectedNodeIds] = useState<string[]>([]);\n\n // 框选模式辅助:用于判断是否在框选过程中\n const isBoxSelectingRef = useRef(false);\n\n // 数据模拟\n const [dataModalVisible, setDataModalVisible] = useState(false);\n const [dataInput, setDataInput] = useState(\n JSON.stringify(defaultTestData, null, 2)\n );\n\n // 画布配置弹窗\n const [canvasConfigVisible, setCanvasConfigVisible] = useState(false);\n\n // 空格键临时拖拽模式\n const [isSpacePressed, setIsSpacePressed] = useState(false);\n\n // 坐标转换:屏幕坐标 → 画布逻辑坐标\n // 通过 DOM 实际尺寸推算有效缩放比,避免依赖可能不同步的 ref state\n const getCanvasPosition = useCallback((clientX: number, clientY: number) => {\n if (!canvasRef.current) return { x: 0, y: 0 };\n\n const canvasRect = canvasRef.current.getBoundingClientRect();\n\n const mouseXInCanvas = clientX - canvasRect.left;\n const mouseYInCanvas = clientY - canvasRect.top;\n\n const effectiveScaleX = canvasRect.width / canvas.width;\n const effectiveScaleY = canvasRect.height / canvas.height;\n\n const x = mouseXInCanvas / effectiveScaleX;\n const y = mouseYInCanvas / effectiveScaleY;\n return { x: Math.round(x), y: Math.round(y) };\n }, [canvas.width, canvas.height]);\n\n // 坐标转换(仅用于框选)- 复用同样的 DOM 推算逻辑\n const getBoxSelectionPosition = useCallback((clientX: number, clientY: number) => {\n return getCanvasPosition(clientX, clientY);\n }, [getCanvasPosition]);\n\n // 创建线条节点\n const createLineNode = useCallback(\n (start: { x: number; y: number }, end: { x: number; y: number }, continueDrawing: boolean = true) => {\n if (!lineDrawing.material) return;\n\n const material = lineDrawing.material as LineMaterial;\n const config = material.config || {};\n const lineWeight = config.lineWeight || config.thickness || 2;\n\n const x = Math.min(start.x, end.x);\n const y = Math.min(start.y, end.y);\n\n const relativeStartX = Math.round(start.x - x);\n const relativeStartY = Math.round(start.y - y);\n const relativeEndX = Math.round(end.x - x);\n const relativeEndY = Math.round(end.y - y);\n\n const minNodeSize = Math.max(lineWeight * 2, 4);\n const nodeWidth = Math.max(Math.abs(start.x - end.x), minNodeSize);\n const nodeHeight = Math.max(Math.abs(start.y - end.y), minNodeSize);\n\n const lineMaterial: LineMaterial = {\n ...material,\n id: nanoid(),\n config: {\n color: config.color,\n lineWeight,\n thickness: lineWeight,\n lineType: config.lineType,\n startX: relativeStartX,\n startY: relativeStartY,\n endX: relativeEndX,\n endY: relativeEndY,\n },\n };\n\n const newNode: Node = {\n id: nanoid(),\n name: `${material.name}_${Date.now()}`,\n type: 'normal',\n normalStyle: {\n width: nodeWidth,\n height: nodeHeight,\n x,\n y,\n background: 'transparent',\n },\n contentInfo: {\n statusList: [createDefaultStatus(lineMaterial)],\n currentStatusId: undefined,\n },\n controlInfo: {\n isDraggable: true,\n isClickable: true,\n isResizable: true,\n isSelectable: true,\n },\n };\n\n addNode(newNode, false);\n\n if (continueDrawing) {\n const nextStart = { x: end.x, y: end.y };\n setLinePreview({\n start: nextStart,\n end: { ...nextStart },\n isDrawing: true,\n });\n } else {\n setLinePreview({ start: null, end: null, isDrawing: false });\n endLineDrawing();\n }\n },\n [lineDrawing.material, addNode, endLineDrawing]\n );\n\n // 视口变换\n const handleTransform = useCallback(() => {\n const state = transformRef.current?.state;\n if (state) {\n setViewport({\n scale: state.scale,\n positionX: state.positionX,\n positionY: state.positionY,\n });\n }\n }, [setViewport]);\n\n // 画布点击\n const handleCanvasClick = useCallback(\n (e: React.MouseEvent) => {\n if (isDraggingRef.current) return;\n // 框选模式下点击画布不清空选择\n if (mode === 'box-select') return;\n if (\n e.target === canvasRef.current ||\n (e.target as HTMLElement).dataset?.canvas === \"true\"\n ) {\n selectNode(null);\n setSelectedNodeIds([]);\n }\n },\n [selectNode, mode]\n );\n\n // 画布鼠标按下(线条绘制/框选)\n const handleCanvasMouseDown = useCallback(\n (e: React.MouseEvent) => {\n if (e.button !== 0) return;\n\n // 线条绘制模式\n if (mode === \"line-draw\" && lineDrawing.material) {\n e.stopPropagation();\n const pos = getCanvasPosition(e.clientX, e.clientY);\n if (!linePreview.isDrawing) {\n setLinePreview({ start: pos, end: pos, isDrawing: true });\n } else if (linePreview.start) {\n createLineNode(linePreview.start, pos, true);\n }\n return;\n }\n\n // 框选模式(空格键按下时进入拖拽模式,不执行框选)\n if (mode === 'box-select' && !isSpacePressed) {\n const pos = getBoxSelectionPosition(e.clientX, e.clientY);\n setSelectionBox({ start: pos, end: pos });\n setSelectedNodeIds([]);\n e.preventDefault();\n e.stopPropagation();\n }\n },\n [mode, lineDrawing.material, linePreview.isDrawing, linePreview.start, isSpacePressed, createLineNode, getCanvasPosition, getBoxSelectionPosition]\n );\n\n // 画布双击(结束线条绘制)\n const handleCanvasDoubleClick = useCallback(\n (e: React.MouseEvent) => {\n if (mode !== \"line-draw\" || !lineDrawing.material) return;\n if (linePreview.isDrawing && linePreview.start) {\n const pos = getCanvasPosition(e.clientX, e.clientY);\n createLineNode(linePreview.start, pos, false);\n }\n },\n [mode, lineDrawing.material, linePreview.isDrawing, linePreview.start, createLineNode, getCanvasPosition]\n );\n\n // 拖拽悬停\n const handleDragOver = useCallback((e: React.DragEvent) => {\n e.preventDefault();\n e.dataTransfer.dropEffect = \"copy\";\n setIsDragOver(true);\n }, []);\n\n const handleDragLeave = useCallback((e: React.DragEvent) => {\n e.preventDefault();\n setIsDragOver(false);\n }, []);\n\n // 放置物料\n const handleDrop = useCallback(\n (e: React.DragEvent) => {\n e.preventDefault();\n setIsDragOver(false);\n if (!canvasRef.current || mode !== \"select\") return;\n\n try {\n const data = e.dataTransfer.getData(\"application/json\");\n if (!data) return;\n const material = JSON.parse(data);\n const pos = getCanvasPosition(e.clientX, e.clientY);\n const x = pos.x - 50;\n const y = pos.y - 50;\n const newNode = createDefaultNode(x, y, material);\n addNode(newNode);\n } catch (error) {\n console.error(\"Failed to parse dropped material:\", error);\n }\n },\n [mode, addNode, getCanvasPosition]\n );\n\n // 节点拖拽开始\n const handleNodeMouseDown = useCallback(\n (e: React.MouseEvent, node: Node) => {\n // 选择模式或框选模式下都可以拖拽\n if ((mode !== \"select\" && mode !== \"box-select\") || !node.controlInfo.isDraggable) return;\n e.stopPropagation();\n selectNode(node.id);\n isDraggingRef.current = true;\n dragStartRef.current = { x: e.clientX, y: e.clientY };\n dragOffsetRef.current = {\n x: node.normalStyle.x || 0,\n y: node.normalStyle.y || 0,\n newX: node.normalStyle.x || 0,\n newY: node.normalStyle.y || 0,\n };\n draggingNodeRef.current = node;\n e.preventDefault();\n },\n [mode, selectNode]\n );\n\n // 鼠标事件\n useEffect(() => {\n const handleMouseMove = (e: MouseEvent) => {\n // 拖拽\n if (isDraggingRef.current && selectedNodeId && draggingNodeRef.current) {\n if (!canvasRef.current) return;\n const canvasRect = canvasRef.current.getBoundingClientRect();\n const effectiveScaleX = canvasRect.width / canvas.width;\n const effectiveScaleY = canvasRect.height / canvas.height;\n const screenDx = e.clientX - dragStartRef.current.x;\n const screenDy = e.clientY - dragStartRef.current.y;\n const canvasDx = screenDx / effectiveScaleX;\n const canvasDy = screenDy / effectiveScaleY;\n const newX = dragOffsetRef.current.x + canvasDx;\n const newY = dragOffsetRef.current.y + canvasDy;\n const nodeEl = document.querySelector(\n `[data-node-id=\"${selectedNodeId}\"]`\n ) as HTMLElement;\n if (nodeEl) {\n nodeEl.style.left = `${newX}px`;\n nodeEl.style.top = `${newY}px`;\n }\n dragOffsetRef.current.newX = newX;\n dragOffsetRef.current.newY = newY;\n }\n // 框选\n if (mode === 'box-select' && selectionBox.start) {\n const pos = getBoxSelectionPosition(e.clientX, e.clientY);\n setSelectionBox((prev) => ({ ...prev, end: pos }));\n }\n // 线条预览\n if (mode === \"line-draw\" && linePreview.isDrawing) {\n const pos = getCanvasPosition(e.clientX, e.clientY);\n setLinePreview((prev) => ({ ...prev, end: pos }));\n }\n };\n\n const handleMouseUp = () => {\n if (isDraggingRef.current && selectedNodeId && draggingNodeRef.current) {\n const store = useEditorStore.getState();\n const newX = dragOffsetRef.current.newX ?? dragOffsetRef.current.x;\n const newY = dragOffsetRef.current.newY ?? dragOffsetRef.current.y;\n store.updateNode(selectedNodeId, {\n normalStyle: {\n ...draggingNodeRef.current.normalStyle,\n x: newX,\n y: newY,\n },\n });\n }\n isDraggingRef.current = false;\n draggingNodeRef.current = null;\n forceUpdate({});\n // 框选结束,计算选中的节点\n if (mode === 'box-select' && selectionBox.start && selectionBox.end) {\n const minX = Math.min(selectionBox.start.x, selectionBox.end.x);\n const maxX = Math.max(selectionBox.start.x, selectionBox.end.x);\n const minY = Math.min(selectionBox.start.y, selectionBox.end.y);\n const maxY = Math.max(selectionBox.start.y, selectionBox.end.y);\n\n const selectedIds = nodes\n .filter((node) => {\n const nodeX = node.normalStyle.x || 0;\n const nodeY = node.normalStyle.y || 0;\n const nodeW = node.normalStyle.width || 0;\n const nodeH = node.normalStyle.height || 0;\n const centerX = nodeX + nodeW / 2;\n const centerY = nodeY + nodeH / 2;\n return centerX >= minX && centerX <= maxX && centerY >= minY && centerY <= maxY;\n })\n .map((node) => node.id);\n\n setSelectedNodeIds(selectedIds);\n setSelectionBox({ start: null, end: null });\n }\n };\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === \"Escape\" && mode === \"line-draw\") {\n setLinePreview({ start: null, end: null, isDrawing: false });\n cancelLineDrawing();\n }\n if (e.key === \"Delete\") {\n if (selectedNodeId) removeNode(selectedNodeId);\n else if (selectedNodeIds.length > 0) {\n selectedNodeIds.forEach((id) => removeNode(id));\n setSelectedNodeIds([]);\n }\n }\n if (e.ctrlKey && e.key === \"z\") {\n e.preventDefault();\n undo();\n }\n if (e.ctrlKey && e.key === \"y\") {\n e.preventDefault();\n redo();\n }\n // 空格键按下:进入临时拖拽模式(所有模式都支持)\n if (e.key === \" \" && !isSpacePressed) {\n e.preventDefault();\n setIsSpacePressed(true);\n }\n };\n\n const handleKeyUp = (e: KeyboardEvent) => {\n // 空格键松开:退出临时拖拽模式\n if (e.key === \" \" && isSpacePressed) {\n setIsSpacePressed(false);\n }\n };\n\n window.addEventListener(\"mousemove\", handleMouseMove);\n window.addEventListener(\"mouseup\", handleMouseUp);\n window.addEventListener(\"keydown\", handleKeyDown);\n window.addEventListener(\"keyup\", handleKeyUp);\n return () => {\n window.removeEventListener(\"mousemove\", handleMouseMove);\n window.removeEventListener(\"mouseup\", handleMouseUp);\n window.removeEventListener(\"keydown\", handleKeyDown);\n window.removeEventListener(\"keyup\", handleKeyUp);\n };\n }, [\n selectedNodeId,\n\n selectionBox,\n mode,\n linePreview.isDrawing,\n selectedNodeIds,\n nodes,\n canvas.width,\n canvas.height,\n removeNode,\n undo,\n isSpacePressed,\n redo,\n cancelLineDrawing,\n getCanvasPosition,\n getBoxSelectionPosition,\n setSelectedNodeIds,\n ]);\n\n // 复制节点\n const handleCopyNodes = useCallback(() => {\n // 确定要复制的节点列表\n const nodesToCopy = selectedNodeIds.length > 0\n ? selectedNodeIds.map((id) => nodes.find((n) => n.id === id)).filter(Boolean) as Node[]\n : selectedNodeId\n ? [nodes.find((n) => n.id === selectedNodeId)].filter(Boolean) as Node[]\n : [];\n\n if (nodesToCopy.length === 0) return;\n\n // 复制每个节点,并向右下方偏移20px\n const newNodeIds: string[] = [];\n nodesToCopy.forEach((node) => {\n const newNode = {\n ...node,\n id: nanoid(),\n name: `${node.name}_副本`,\n normalStyle: {\n ...node.normalStyle,\n x: (node.normalStyle.x || 0) + 20,\n y: (node.normalStyle.y || 0) + 20,\n },\n };\n addNode(newNode);\n newNodeIds.push(newNode.id);\n });\n\n // 选中新复制的节点\n if (newNodeIds.length === 1) {\n selectNode(newNodeIds[0]);\n } else {\n setSelectedNodeIds(newNodeIds);\n }\n }, [selectedNodeId, selectedNodeIds, nodes, addNode, selectNode, setSelectedNodeIds]);\n\n // 组合选中的节点\n const handleGroupNodes = useCallback(() => {\n if (selectedNodeIds.length < 2) return;\n const selectedNodes: Node[] = [];\n for (let i = 0; i < selectedNodeIds.length; i++) {\n const id = selectedNodeIds[i];\n const node = nodes.find((n) => n.id === id);\n if (!node) continue;\n if (node?.type === \"group\") {\n //拆分放入\n const children = node.children;\n // 将子节点从相对坐标转换为绝对坐标\n children.forEach((child) => selectedNodes.push({\n ...child,\n normalStyle: {\n ...child.normalStyle,\n x: (node.normalStyle.x || 0) + (child.normalStyle.x || 0),\n y: (node.normalStyle.y || 0) + (child.normalStyle.y || 0),\n },\n }));\n // 删除群组节点\n removeNode(id);\n continue;\n }\n selectedNodes.push(node);\n }\n if (selectedNodes.length < 2) return;\n\n // 计算边界框\n let minX = Infinity, minY = Infinity;\n let maxX = -Infinity, maxY = -Infinity;\n\n selectedNodes.forEach((node) => {\n const x = node.normalStyle.x || 0;\n const y = node.normalStyle.y || 0;\n const w = node.normalStyle.width || 0;\n const h = node.normalStyle.height || 0;\n minX = Math.min(minX, x);\n minY = Math.min(minY, y);\n maxX = Math.max(maxX, x + w);\n maxY = Math.max(maxY, y + h);\n });\n\n // 调整子节点位置为相对坐标\n const children = selectedNodes.map((node) => ({\n ...node,\n normalStyle: {\n ...node.normalStyle,\n x: (node.normalStyle.x || 0) - minX,\n y: (node.normalStyle.y || 0) - minY,\n },\n }));\n\n // 创建群组节点\n const groupNode: GroupNode = {\n id: nanoid(),\n name: `群组_${Date.now()}`,\n type: \"group\",\n normalStyle: {\n x: minX,\n y: minY,\n width: maxX - minX,\n height: maxY - minY,\n background: \"transparent\",\n },\n contentInfo: {\n statusList: [],\n currentStatusId: undefined,\n },\n controlInfo: {\n isDraggable: true,\n isClickable: true,\n isResizable: true,\n isSelectable: true,\n },\n children,\n };\n\n // 删除原子节点并添加群组节点\n selectedNodeIds.forEach((id) => removeNode(id));\n addNode(groupNode);\n setSelectedNodeIds([]);\n selectNode(groupNode.id);\n }, [selectedNodeIds, nodes, removeNode, addNode, selectNode]);\n\n // 解除组合\n const handleUngroupNodes = useCallback(() => {\n // 获取选中的群组节点\n const groupNodesToUngroup = selectedNodeIds.length > 0\n ? selectedNodeIds\n .map((id) => nodes.find((n) => n.id === id))\n .filter((n): n is GroupNode => !!n && n.type === \"group\")\n : selectedNodeId\n ? [nodes.find((n) => n.id === selectedNodeId)].filter((n): n is GroupNode => !!n && n.type === \"group\")\n : [];\n\n if (groupNodesToUngroup.length === 0) return;\n\n // 解除每个群组节点\n groupNodesToUngroup.forEach((groupNode) => {\n if (!groupNode.children || groupNode.children.length === 0) return;\n\n // 将子节点从相对坐标转换为绝对坐标\n const absoluteChildren = groupNode.children.map((child) => ({\n ...child,\n normalStyle: {\n ...child.normalStyle,\n x: (groupNode.normalStyle.x || 0) + (child.normalStyle.x || 0),\n y: (groupNode.normalStyle.y || 0) + (child.normalStyle.y || 0),\n },\n }));\n\n // 删除群组节点并添加子节点\n removeNode(groupNode.id);\n absoluteChildren.forEach((child) => addNode(child));\n });\n\n // 清空选中状态\n setSelectedNodeIds([]);\n selectNode(null);\n }, [selectedNodeId, selectedNodeIds, nodes, removeNode, addNode, selectNode, setSelectedNodeIds]);\n\n // 分布节点\n const handleDistributeNodes = useCallback(\n (direction: \"horizontal\" | \"vertical\") => {\n if (selectedNodeIds.length < 2) return;\n\n const selectedNodes = selectedNodeIds\n .map((id) => nodes.find((n) => n.id === id))\n .filter((n): n is Node => !!n && n.type !== \"group\");\n\n if (selectedNodes.length < 2) return;\n\n // 计算边界\n let minX = Infinity, maxX = -Infinity;\n let minY = Infinity, maxY = -Infinity;\n\n selectedNodes.forEach((node) => {\n const x = node.normalStyle.x || 0;\n const y = node.normalStyle.y || 0;\n minX = Math.min(minX, x);\n maxX = Math.max(maxX, x);\n minY = Math.min(minY, y);\n maxY = Math.max(maxY, y);\n });\n\n // 按坐标排序,便于均匀分布\n const sortedNodes = [...selectedNodes].sort((a, b) => {\n if (direction === \"horizontal\") {\n return (a.normalStyle.x || 0) - (b.normalStyle.x || 0);\n } else {\n return (a.normalStyle.y || 0) - (b.normalStyle.y || 0);\n }\n });\n\n // 计算间隔\n const count = sortedNodes.length;\n if (direction === \"horizontal\") {\n const totalWidth = maxX - minX;\n const step = totalWidth / (count - 1);\n sortedNodes.forEach((node, index) => {\n const newX = minX + step * index;\n updateNode(node.id, {\n normalStyle: { ...node.normalStyle, x: newX },\n });\n });\n } else {\n const totalHeight = maxY - minY;\n const step = totalHeight / (count - 1);\n sortedNodes.forEach((node, index) => {\n const newY = minY + step * index;\n updateNode(node.id, {\n normalStyle: { ...node.normalStyle, y: newY },\n });\n });\n }\n },\n [selectedNodeIds, nodes, updateNode]\n );\n\n // 对齐节点\n const handleAlignNodes = useCallback(\n (direction: \"left\" | \"right\" | \"top\" | \"bottom\") => {\n if (selectedNodeIds.length < 2) return;\n const store = useEditorStore.getState();\n const selectedNodes = selectedNodeIds\n .map((id) => nodes.find((n) => n.id === id))\n .filter((n): n is Node => !!n && n.type !== \"group\");\n if (selectedNodes.length < 2) return;\n\n let alignValue = 0;\n switch (direction) {\n case \"left\":\n alignValue = Math.min(...selectedNodes.map((n) => n.normalStyle.x || 0));\n break;\n case \"right\":\n alignValue = Math.max(\n ...selectedNodes.map((n) => (n.normalStyle.x || 0) + (n.normalStyle.width || 0))\n );\n break;\n case \"top\":\n alignValue = Math.min(...selectedNodes.map((n) => n.normalStyle.y || 0));\n break;\n case \"bottom\":\n alignValue = Math.max(\n ...selectedNodes.map((n) => (n.normalStyle.y || 0) + (n.normalStyle.height || 0))\n );\n break;\n }\n\n selectedNodes.forEach((node) => {\n let newX = node.normalStyle.x || 0;\n let newY = node.normalStyle.y || 0;\n switch (direction) {\n case \"left\":\n newX = alignValue;\n break;\n case \"right\":\n newX = alignValue - (node.normalStyle.width || 0);\n break;\n case \"top\":\n newY = alignValue;\n break;\n case \"bottom\":\n newY = alignValue - (node.normalStyle.height || 0);\n break;\n }\n store.updateNode(node.id, {\n normalStyle: { ...node.normalStyle, x: newX, y: newY },\n });\n });\n },\n [selectedNodeIds, nodes]\n );\n\n // 工具栏按钮\n const toolbarButtons = [\n {\n icon: <SelectOutlined />,\n title: \"选择模式\",\n active: mode === \"select\",\n onClick: () => {\n setMode(\"select\");\n },\n },\n {\n icon: <GroupOutlined />,\n title: \"框选模式\",\n active: mode === \"box-select\",\n onClick: () => {\n setMode(\"box-select\");\n setSelectedNodeIds([]);\n },\n },\n {\n icon: <DragOutlined />,\n title: \"拖拽模式\",\n active: mode === \"drag\",\n onClick: () => {\n setMode(\"drag\");\n },\n },\n {\n icon: <EditOutlined />,\n title: \"线条绘制\",\n active: mode === \"line-draw\",\n onClick: () => {\n setMode(\"line-draw\");\n },\n },\n {\n icon: <EyeOutlined />,\n title: \"预览模式\",\n active: mode === \"preview\",\n onClick: () => {\n setMode(\"preview\");\n },\n },\n ];\n\n const actionButtons = useMemo(\n () => [\n { icon: <UndoOutlined />, title: \"撤销 (Ctrl+Z)\", onClick: undo },\n { icon: <RedoOutlined />, title: \"重做 (Ctrl+Y)\", onClick: redo },\n {\n icon: <CopyOutlined />,\n title: \"复制节点\",\n disabled: !selectedNodeId && selectedNodeIds.length === 0,\n onClick: handleCopyNodes,\n },\n {\n icon: <GroupOutlined />,\n title: \"组合选中节点\",\n disabled: selectedNodeIds.length < 2,\n onClick: handleGroupNodes,\n },\n {\n icon: <UngroupOutlined />,\n title: \"解除组合\",\n disabled: !selectedNodeId && selectedNodeIds.length === 0,\n onClick: handleUngroupNodes,\n },\n {\n icon: <AlignLeftOutlined />,\n title: \"左对齐\",\n disabled: selectedNodeIds.length < 2,\n onClick: () => handleAlignNodes(\"left\"),\n },\n {\n icon: <AlignRightOutlined />,\n title: \"右对齐\",\n disabled: selectedNodeIds.length < 2,\n onClick: () => handleAlignNodes(\"right\"),\n },\n {\n icon: <VerticalAlignTopOutlined />,\n title: \"上对齐\",\n disabled: selectedNodeIds.length < 2,\n onClick: () => handleAlignNodes(\"top\"),\n },\n {\n icon: <VerticalAlignBottomOutlined />,\n title: \"下对齐\",\n disabled: selectedNodeIds.length < 2,\n onClick: () => handleAlignNodes(\"bottom\"),\n },\n {\n icon: <ColumnWidthOutlined />,\n title: \"水平分布\",\n disabled: selectedNodeIds.length < 2,\n onClick: () => handleDistributeNodes(\"horizontal\"),\n },\n {\n icon: <ColumnHeightOutlined />,\n title: \"垂直分布\",\n disabled: selectedNodeIds.length < 2,\n onClick: () => handleDistributeNodes(\"vertical\"),\n },\n {\n icon: <SettingOutlined />,\n title: \"画布配置\",\n onClick: () => setCanvasConfigVisible(true),\n },\n {\n icon: <ExperimentOutlined />,\n title: \"数据模拟\",\n type: \"primary\" as const,\n onClick: () => setDataModalVisible(true),\n },\n {\n icon: <DeleteOutlined />,\n title: \"删除选中 (Delete)\",\n disabled: !selectedNodeId && selectedNodeIds.length === 0,\n onClick: () => {\n if (selectedNodeId) removeNode(selectedNodeId);\n else if (selectedNodeIds.length > 0) {\n selectedNodeIds.forEach((id) => removeNode(id));\n setSelectedNodeIds([]);\n }\n },\n },\n ],\n [\n undo,\n redo,\n mode,\n setMode,\n setSelectedNodeIds,\n selectedNodeIds,\n handleGroupNodes,\n handleUngroupNodes,\n handleCopyNodes,\n handleAlignNodes,\n handleDistributeNodes,\n setCanvasConfigVisible,\n setDataModalVisible,\n selectedNodeId,\n removeNode,\n ]\n );\n\n\n return (\n <div className=\"flex-1 flex flex-col h-full bg-gray-100\">\n {/* 工具栏 */}\n <div className=\"h-12 bg-white border-b border-gray-200 flex items-center justify-between px-4\">\n <Space>\n {toolbarButtons.map((btn) => (\n <Tooltip key={btn.title} title={btn.title}>\n <Button\n type={btn.active ? \"primary\" : \"default\"}\n icon={btn.icon}\n onClick={btn.onClick}\n />\n </Tooltip>\n ))}\n </Space>\n <Space>\n {actionButtons.map((btn) => (\n <Tooltip key={btn.title} title={btn.title}>\n <Button\n type={(btn as any).active ? \"primary\" : btn.type || \"default\"}\n icon={btn.icon}\n onClick={btn.onClick}\n disabled={btn.disabled}\n />\n </Tooltip>\n ))}\n </Space>\n </div>\n\n {/* 画布 */}\n <div ref={wrapperRef} className=\"flex-1 relative\">\n <TransformWrapper\n ref={transformRef}\n initialScale={1}\n initialPositionX={0}\n initialPositionY={0}\n minScale={0.5}\n maxScale={5}\n onTransformed={handleTransform}\n limitToBounds={false}\n centerZoomedOut={false}\n panning={{ disabled: !isSpacePressed && (mode === 'select' || mode === 'line-draw' || mode === 'box-select'), velocityDisabled: true }}\n wheel={{ disabled: false, step: 0.1 }}\n pinch={{ disabled: false }}\n doubleClick={{ disabled: true }}\n >\n {({ zoomIn, zoomOut, resetTransform }) => (\n <>\n {/* 缩放控制 */}\n <div className=\"absolute bottom-4 right-4 z-10 bg-white rounded-lg shadow-lg p-2\">\n <Space direction=\"vertical\">\n <Tooltip title=\"放大\">\n <Button icon={<ZoomInOutlined />} onClick={() => zoomIn()} />\n </Tooltip>\n <Tooltip title=\"缩小\">\n <Button icon={<ZoomOutOutlined />} onClick={() => zoomOut()} />\n </Tooltip>\n <Tooltip title=\"重置视图\">\n <Button onClick={() => resetTransform()}>100%</Button>\n </Tooltip>\n <div className=\"text-center text-xs text-gray-500\">\n {Math.round(viewport.scale * 100)}%\n </div>\n </Space>\n </div>\n\n <TransformComponent\n wrapperStyle={{ width: \"100%\", height: \"100%\", position: \"relative\" }}\n contentStyle={{\n width: \"100%\",\n height: \"100%\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n }}\n >\n <div\n ref={canvasRef}\n data-canvas=\"true\"\n className={`relative ${isDragOver ? \"ring-4 ring-blue-400 ring-opacity-50\" : \"\"\n } ${mode === \"line-draw\" ? \"cursor-crosshair\" : \"\"} ${isSpacePressed ? \"cursor-grab\" : \"\"}`}\n style={{\n width: canvas.width,\n height: canvas.height,\n flexShrink: 0,\n backgroundColor: canvas.background,\n backgroundImage: canvas.backgroundImage ? `url(${canvas.backgroundImage})` : undefined,\n backgroundSize: 'cover',\n backgroundPosition: 'center',\n }}\n onClick={handleCanvasClick}\n onMouseDown={handleCanvasMouseDown}\n onDoubleClick={handleCanvasDoubleClick}\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n onDrop={handleDrop}\n >\n {/* 网格背景 */}\n {canvas.showGrid !== false && (\n <svg className=\"absolute top-0 left-0 pointer-events-none\" width={canvas.width} height={canvas.height}>\n <defs>\n <pattern id=\"grid\" width=\"20\" height=\"20\" patternUnits=\"userSpaceOnUse\">\n <path d=\"M 20 0 L 0 0 0 20\" fill=\"none\" stroke=\"#f0f0f0\" strokeWidth=\"1\" />\n </pattern>\n </defs>\n <rect width=\"100%\" height=\"100%\" fill=\"url(#grid)\" />\n </svg>\n )}\n\n {/* 节点 */}\n {nodes.map((node) => (\n <NodeRenderer\n key={`${node.id}`}\n node={node}\n isSelected={\n selectedNodeId === node.id || selectedNodeIds.includes(node.id)\n }\n data={defaultTestData}\n onClick={() => {\n console.log('Node onClick:', node.id, 'mode:', modeRef.current);\n // 绘制模式下不触发节点选中\n if (modeRef.current === \"line-draw\") return;\n selectNode(node.id);\n }}\n onMouseDown={(e) => handleNodeMouseDown(e, node)}\n onUpdateNode={(nodeId, updates) => updateNode(nodeId, updates)}\n scale={viewport.scale}\n />\n ))}\n\n {/* 线条预览 */}\n {mode === \"line-draw\" && linePreview.isDrawing && linePreview.start && linePreview.end && (\n <svg className=\"absolute top-0 left-0 pointer-events-none\" width={canvas.width} height={canvas.height}>\n <line\n x1={linePreview.start.x}\n y1={linePreview.start.y}\n x2={linePreview.end.x}\n y2={linePreview.end.y}\n stroke=\"#1890ff\"\n strokeWidth=\"2\"\n strokeDasharray=\"5,5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )}\n\n {/* 框选框 */}\n {mode === 'box-select' && selectionBox.start && selectionBox.end && (\n <div\n className=\"absolute border-2 border-blue-500 bg-blue-500/10 pointer-events-none\"\n style={{\n left: Math.min(selectionBox.start.x, selectionBox.end.x),\n top: Math.min(selectionBox.start.y, selectionBox.end.y),\n width: Math.abs(selectionBox.end.x - selectionBox.start.x),\n height: Math.abs(selectionBox.end.y - selectionBox.start.y),\n zIndex: 9999,\n }}\n />\n )}\n </div>\n </TransformComponent>\n </>\n )}\n </TransformWrapper>\n </div>\n\n {/* 数据模拟弹窗 */}\n <Modal\n title=\"数据模拟\"\n open={dataModalVisible}\n onCancel={() => setDataModalVisible(false)}\n footer={null}\n >\n <Form layout=\"vertical\">\n <Form.Item label=\"测试数据 (JSON)\">\n <TextArea\n value={dataInput}\n onChange={(e) => setDataInput(e.target.value)}\n rows={10}\n placeholder=\"输入 JSON 格式的测试数据\"\n />\n </Form.Item>\n </Form>\n </Modal>\n\n {/* 画布配置弹窗 */}\n <Modal\n title=\"画布配置\"\n open={canvasConfigVisible}\n onCancel={() => setCanvasConfigVisible(false)}\n footer={null}\n >\n <Form layout=\"vertical\">\n <Form.Item label=\"宽度\">\n <InputNumber\n value={canvas.width}\n onChange={(v) => setCanvasConfig({ width: v || 1920 })}\n min={100}\n max={5000}\n style={{ width: '100%' }}\n />\n </Form.Item>\n <Form.Item label=\"高度\">\n <InputNumber\n value={canvas.height}\n onChange={(v) => setCanvasConfig({ height: v || 1080 })}\n min={100}\n max={5000}\n style={{ width: '100%' }}\n />\n </Form.Item>\n <Form.Item label=\"显示网格\">\n <Switch\n checked={canvas.showGrid !== false}\n onChange={(checked) => setCanvasConfig({ showGrid: checked })}\n />\n </Form.Item>\n <Form.Item label=\"背景色\">\n <div className=\"flex items-center gap-2\">\n <ColorPicker\n value={canvas.background || '#ffffff'}\n onChange={(color) => setCanvasConfig({ background: color.toHexString() })}\n />\n <Input\n value={canvas.background}\n onChange={(e) => setCanvasConfig({ background: e.target.value })}\n placeholder=\"#ffffff\"\n />\n </div>\n </Form.Item>\n <Form.Item label=\"背景图片 URL\">\n <Input\n value={canvas.backgroundImage}\n onChange={(e) => setCanvasConfig({ backgroundImage: e.target.value })}\n placeholder=\"输入图片 URL\"\n />\n </Form.Item>\n </Form>\n </Modal>\n </div>\n );\n};\n\nexport default Canvas;\n","import React, { useEffect, useState } from \"react\";\nimport { Form, Input, InputNumber, Select, Divider, Space, Tag } from \"antd\";\nimport { ColorPicker } from '../../ColorPicker';\nimport type { Material, TextMaterial } from \"../../../types\";\nimport type { DataOption } from \"../types\";\n\nconst { Option } = Select;\n\ninterface TextMaterialEditorProps {\n material: Material;\n onSave: (updates: Partial<Material>) => void;\n bindCodes?: string[];\n dataOptions?: DataOption[];\n}\n\nexport const TextMaterialEditor: React.FC<TextMaterialEditorProps> = ({\n material,\n onSave,\n bindCodes = [],\n dataOptions = [],\n}) => {\n const textMaterial = material as TextMaterial;\n const content = textMaterial.content || {};\n\n const [formData, setFormData] = useState({\n label: content.label || \"\",\n value: content.value || \"\",\n valueSourceCode: content.valueSourceCode || \"\",\n unit: content.unit || \"\",\n decimals: content.decimals ?? 2,\n labelFontSize: content.labelStyle?.fontSize || 14,\n labelFontWeight: content.labelStyle?.fontWeight || \"bold\",\n labelColor: content.labelStyle?.color || \"#262626\",\n valueFontSize: content.valueStyle?.fontSize || 14,\n valueFontWeight: content.valueStyle?.fontWeight || \"normal\",\n valueColor: content.valueStyle?.color || \"#1890ff\",\n });\n\n useEffect(() => {\n setFormData({\n label: content.label || \"\",\n value: content.value || \"\",\n valueSourceCode: content.valueSourceCode || \"\",\n unit: content.unit || \"\",\n decimals: content.decimals ?? 2,\n labelFontSize: content.labelStyle?.fontSize || 14,\n labelFontWeight: content.labelStyle?.fontWeight || \"bold\",\n labelColor: content.labelStyle?.color || \"#262626\",\n valueFontSize: content.valueStyle?.fontSize || 14,\n valueFontWeight: content.valueStyle?.fontWeight || \"normal\",\n valueColor: content.valueStyle?.color || \"#1890ff\",\n });\n }, [material.id]);\n\n const handleChange = (field: string, value: unknown) => {\n setFormData((prev) => ({ ...prev, [field]: value }));\n };\n\n const handleValueSourceChange = (code: string) => {\n const selectedOption = dataOptions.find((opt) => opt.paramsCode === code);\n const autoUnit = selectedOption?.unit || \"\";\n\n setFormData((prev) => ({\n ...prev,\n valueSourceCode: code,\n unit: autoUnit,\n value: String(selectedOption?.value || \"\"),\n }));\n\n setTimeout(() => {\n onSave({\n content: {\n ...content,\n valueSourceCode: code,\n value: String(selectedOption?.value || \"\"),\n unit: autoUnit,\n },\n } as Partial<Material>);\n }, 0);\n };\n\n const handleSave = () => {\n onSave({\n content: {\n ...content,\n label: formData.label,\n value: formData.value,\n valueSourceCode: formData.valueSourceCode,\n unit: formData.unit,\n decimals: formData.decimals,\n labelStyle: {\n fontSize: formData.labelFontSize,\n fontWeight: formData.labelFontWeight,\n color: formData.labelColor,\n },\n valueStyle: {\n fontSize: formData.valueFontSize,\n fontWeight: formData.valueFontWeight,\n color: formData.valueColor,\n },\n },\n } as Partial<Material>);\n };\n\n const boundDataOptions = dataOptions.filter((opt) =>\n bindCodes.includes(opt.paramsCode),\n );\n\n return (\n <div className=\"space-y-4\">\n <Divider style={{ marginTop: 0 }}>文本内容</Divider>\n\n <Form layout=\"vertical\">\n <Form.Item label=\"标签文本 (label)\">\n <Input\n value={formData.label}\n onChange={(e) => handleChange(\"label\", e.target.value)}\n onBlur={handleSave}\n placeholder=\"输入标签文本\"\n />\n </Form.Item>\n\n <Form.Item\n label=\"值来源\"\n help=\"从绑定的数据中选择字段,优先级高于手动输入的值\">\n <Select\n value={formData.valueSourceCode || undefined}\n onChange={handleValueSourceChange}\n placeholder=\"选择数据字段(可选)\"\n allowClear\n style={{ width: \"100%\" }}\n fieldNames={{\n value: \"paramsCode\",\n label: \"paramsName\",\n }}\n options={boundDataOptions}\n />\n </Form.Item>\n\n <Form.Item\n label={formData.valueSourceCode ? \"默认值(备用)\" : \"值文本\"}\n help={\n formData.valueSourceCode\n ? \"已绑定数据源,实际值将来自数据字段,此处仅设置无数据时的备用显示\"\n : \"手动输入显示的值\"\n }>\n <Input\n value={formData.value}\n onChange={(e) => handleChange(\"value\", e.target.value)}\n onBlur={handleSave}\n placeholder={\n formData.valueSourceCode\n ? \"数据字段无值时显示此备用值\"\n : \"输入值文本\"\n }\n disabled={!!formData.valueSourceCode}\n variant={formData.valueSourceCode ? \"filled\" : undefined}\n />\n </Form.Item>\n\n <Form.Item label=\"单位\" help=\"优先从绑定数据自动获取,也可手动输入\">\n <Input\n value={formData.unit}\n onChange={(e) => handleChange(\"unit\", e.target.value)}\n onBlur={handleSave}\n placeholder=\"单位(如°C、%、MPa等)\"\n suffix={\n formData.valueSourceCode && boundDataOptions.length > 0 ? (\n <Tag color=\"blue\" style={{ marginRight: -8 }}>\n 自动\n </Tag>\n ) : null\n }\n />\n </Form.Item>\n\n <Form.Item\n label=\"保留小数位\"\n help=\"数值格式化时保留的小数位数,-1表示不格式化\">\n <InputNumber\n value={formData.decimals}\n onChange={(v) => handleChange(\"decimals\", v ?? 2)}\n onBlur={handleSave}\n min={-1}\n max={10}\n style={{ width: \"100%\" }}\n />\n </Form.Item>\n </Form>\n\n <Divider>标签样式</Divider>\n\n <Form layout=\"vertical\">\n <Space>\n <Form.Item label=\"字体大小\">\n <InputNumber\n value={formData.labelFontSize}\n onChange={(v) => handleChange(\"labelFontSize\", v || 14)}\n onBlur={handleSave}\n min={8}\n max={72}\n />\n </Form.Item>\n\n <Form.Item label=\"字体粗细\">\n <Select\n value={formData.labelFontWeight}\n onChange={(v) => {\n handleChange(\"labelFontWeight\", v);\n setTimeout(handleSave, 0);\n }}\n style={{ width: 100 }}>\n <Option value=\"normal\">正常</Option>\n <Option value=\"bold\">粗体</Option>\n </Select>\n </Form.Item>\n </Space>\n\n <Form.Item label=\"文字颜色\">\n <div className=\"flex items-center gap-2\">\n <ColorPicker\n value={formData.labelColor || '#262626'}\n onChange={(color) => {\n handleChange(\"labelColor\", color.toHexString());\n }}\n onChangeComplete={(color) => {\n onSave({\n content: {\n ...content,\n label: formData.label,\n value: formData.value,\n valueSourceCode: formData.valueSourceCode,\n unit: formData.unit,\n decimals: formData.decimals,\n labelStyle: {\n fontSize: formData.labelFontSize,\n fontWeight: formData.labelFontWeight,\n color: color.toHexString(),\n },\n valueStyle: {\n fontSize: formData.valueFontSize,\n fontWeight: formData.valueFontWeight,\n color: formData.valueColor,\n },\n },\n } as Partial<Material>);\n }}\n />\n <Input\n value={formData.labelColor}\n onChange={(e) => handleChange(\"labelColor\", e.target.value)}\n onBlur={handleSave}\n placeholder=\"#262626\"\n style={{ width: 100 }}\n />\n </div>\n </Form.Item>\n </Form>\n\n <Divider>值样式</Divider>\n\n <Form layout=\"vertical\">\n <Space>\n <Form.Item label=\"字体大小\">\n <InputNumber\n value={formData.valueFontSize}\n onChange={(v) => handleChange(\"valueFontSize\", v || 14)}\n onBlur={handleSave}\n min={8}\n max={72}\n />\n </Form.Item>\n\n <Form.Item label=\"字体粗细\">\n <Select\n value={formData.valueFontWeight}\n onChange={(v) => {\n handleChange(\"valueFontWeight\", v);\n setTimeout(handleSave, 0);\n }}\n style={{ width: 100 }}>\n <Option value=\"normal\">正常</Option>\n <Option value=\"bold\">粗体</Option>\n </Select>\n </Form.Item>\n </Space>\n\n <Form.Item label=\"文字颜色\">\n <div className=\"flex items-center gap-2\">\n <ColorPicker\n value={formData.valueColor || '#1890ff'}\n onChange={(color) => {\n handleChange(\"valueColor\", color.toHexString());\n }}\n onChangeComplete={(color) => {\n onSave({\n content: {\n ...content,\n label: formData.label,\n value: formData.value,\n valueSourceCode: formData.valueSourceCode,\n unit: formData.unit,\n decimals: formData.decimals,\n labelStyle: {\n fontSize: formData.labelFontSize,\n fontWeight: formData.labelFontWeight,\n color: formData.labelColor,\n },\n valueStyle: {\n fontSize: formData.valueFontSize,\n fontWeight: formData.valueFontWeight,\n color: color.toHexString(),\n },\n },\n } as Partial<Material>);\n }}\n />\n <Input\n value={formData.valueColor}\n onChange={(e) => handleChange(\"valueColor\", e.target.value)}\n onBlur={handleSave}\n placeholder=\"#1890ff\"\n style={{ width: 100 }}\n />\n </div>\n </Form.Item>\n </Form>\n </div>\n );\n};\n\nexport default TextMaterialEditor;\n","import React, { useEffect, useState } from \"react\";\nimport { Form, Input, Divider } from \"antd\";\nimport { ColorPicker } from '../../ColorPicker';\nimport type { Material, ImageMaterial } from \"../../../types\";\n\ninterface ImageMaterialEditorProps {\n material: Material;\n onSave: (updates: Partial<Material>) => void;\n}\n\nexport const ImageMaterialEditor: React.FC<ImageMaterialEditorProps> = ({\n material,\n onSave,\n}) => {\n const imageMaterial = material as ImageMaterial;\n\n const [formData, setFormData] = useState({\n name: material.name,\n src: imageMaterial.src || \"\",\n backgroundColor: imageMaterial.backgroundColor || \"\",\n fillColor: imageMaterial.fillColor || \"\",\n });\n\n useEffect(() => {\n setFormData({\n name: material.name,\n src: imageMaterial.src || \"\",\n backgroundColor: imageMaterial.backgroundColor || \"\",\n fillColor: imageMaterial.fillColor || \"\",\n });\n }, [material.id]);\n\n const handleChange = (field: string, value: string) => {\n setFormData((prev) => ({ ...prev, [field]: value }));\n };\n\n const handleSave = () => {\n onSave({\n name: formData.name,\n src: formData.src,\n backgroundColor: formData.backgroundColor,\n } as Partial<Material>);\n };\n\n return (\n <div className=\"space-y-4\">\n <Divider style={{ marginTop: 0 }}>图片属性</Divider>\n\n <Form layout=\"vertical\">\n <Form.Item label=\"图片名称\">\n <Input\n value={formData.name}\n onChange={(e) => handleChange(\"name\", e.target.value)}\n onBlur={handleSave}\n />\n </Form.Item>\n\n <Form.Item label=\"图片地址 (src)\">\n <Input.TextArea\n value={formData.src}\n onChange={(e) => handleChange(\"src\", e.target.value)}\n onBlur={handleSave}\n rows={4}\n placeholder=\"输入图片 URL 或 Data URI\"\n />\n </Form.Item>\n\n <Form.Item label=\"填充颜色(基本形状)\">\n <div className=\"flex items-center gap-2\">\n <ColorPicker\n value={formData.fillColor || '#1890ff'}\n onChange={(color) => {\n const newColor = color.toHexString();\n handleChange(\"fillColor\", newColor);\n // 立即保存到 store\n onSave({\n name: formData.name,\n src: formData.src,\n backgroundColor: formData.backgroundColor,\n fillColor: newColor,\n } as Partial<Material>);\n }}\n />\n <Input\n value={formData.fillColor}\n onChange={(e) => handleChange(\"fillColor\", e.target.value)}\n onBlur={handleSave}\n placeholder=\"#1890ff\"\n />\n </div>\n </Form.Item>\n\n <Form.Item label=\"背景颜色\">\n <div className=\"flex items-center gap-2\">\n <ColorPicker\n value={formData.backgroundColor || '#1890ff'}\n onChange={(color) => {\n const newColor = color.toHexString();\n handleChange(\"backgroundColor\", newColor);\n // 立即保存到 store\n onSave({\n name: formData.name,\n src: formData.src,\n backgroundColor: newColor,\n fillColor: formData.fillColor,\n } as Partial<Material>);\n }}\n />\n <Input\n value={formData.backgroundColor}\n onChange={(e) => handleChange(\"backgroundColor\", e.target.value)}\n onBlur={handleSave}\n placeholder=\"#1890ff\"\n />\n </div>\n </Form.Item>\n </Form>\n </div>\n );\n};\n\nexport default ImageMaterialEditor;\n","import React, { useEffect, useState } from \"react\";\nimport { Form, InputNumber, Select, Divider, Button, Space, Input } from \"antd\";\nimport { ColorPicker } from '../../ColorPicker';\nimport type { Material, LineMaterial } from \"../../../types\";\n\nconst { Option } = Select;\n\ninterface LineMaterialEditorProps {\n material: Material;\n onSave: (updates: Partial<Material>) => void;\n}\n\nexport const LineMaterialEditor: React.FC<LineMaterialEditorProps> = ({\n material,\n onSave,\n}) => {\n const lineConfig = (material as LineMaterial).config || {};\n\n const [formData, setFormData] = useState({\n lineWeight: lineConfig.lineWeight || lineConfig.thickness || 2,\n color: lineConfig.color || \"#262626\",\n lineType: lineConfig.lineType || \"solid\",\n startX: lineConfig.startX ?? 0,\n startY: lineConfig.startY ?? 0,\n endX: lineConfig.endX ?? 100,\n endY: lineConfig.endY ?? 0,\n });\n\n useEffect(() => {\n setFormData({\n lineWeight: lineConfig.lineWeight || lineConfig.thickness || 2,\n color: lineConfig.color || \"#262626\",\n lineType: lineConfig.lineType || \"solid\",\n startX: lineConfig.startX ?? 0,\n startY: lineConfig.startY ?? 0,\n endX: lineConfig.endX ?? 100,\n endY: lineConfig.endY ?? 0,\n });\n }, [material.id]);\n\n const handleSaveWithValues = (newValues: Partial<typeof formData>) => {\n const newFormData = { ...formData, ...newValues };\n setFormData(newFormData);\n \n onSave({\n config: {\n ...lineConfig,\n thickness: newFormData.lineWeight,\n lineWeight: newFormData.lineWeight,\n color: newFormData.color,\n lineType: newFormData.lineType,\n startX: newFormData.startX,\n startY: newFormData.startY,\n endX: newFormData.endX,\n endY: newFormData.endY,\n },\n } as Partial<Material>);\n };\n\n const lineTypeOptions = [\n { value: \"solid\", label: \"实线\", desc: \"连续实线\" },\n { value: \"dashed\", label: \"虚线\", desc: \"长划间隔\" },\n { value: \"center\", label: \"点画线(中心线)\", desc: \"长点-短点交替\" },\n { value: \"phantom\", label: \"假想线\", desc: \"长划-双点交替\" },\n { value: \"dot\", label: \"点线\", desc: \"密集点状\" },\n { value: \"dash-dot\", label: \"画点线\", desc: \"长划-点交替\" },\n ];\n\n return (\n <div className=\"space-y-4\">\n <Divider style={{ marginTop: 0 }}>起止位置(相对节点)</Divider>\n \n <Form layout=\"vertical\">\n <div className=\"grid grid-cols-2 gap-2\">\n <Form.Item label=\"起点 X\" className=\"mb-2\">\n <InputNumber\n value={formData.startX}\n onChange={(v) => handleSaveWithValues({ startX: v ?? 0 })}\n style={{ width: '100%' }}\n />\n </Form.Item>\n <Form.Item label=\"起点 Y\" className=\"mb-2\">\n <InputNumber\n value={formData.startY}\n onChange={(v) => handleSaveWithValues({ startY: v ?? 0 })}\n style={{ width: '100%' }}\n />\n </Form.Item>\n <Form.Item label=\"终点 X\" className=\"mb-2\">\n <InputNumber\n value={formData.endX}\n onChange={(v) => handleSaveWithValues({ endX: v ?? 100 })}\n style={{ width: '100%' }}\n />\n </Form.Item>\n <Form.Item label=\"终点 Y\" className=\"mb-2\">\n <InputNumber\n value={formData.endY}\n onChange={(v) => handleSaveWithValues({ endY: v ?? 0 })}\n style={{ width: '100%' }}\n />\n </Form.Item>\n </div>\n \n <Form.Item label=\"快速对齐\" className=\"mt-4\">\n <Space>\n <Button \n size=\"small\" \n onClick={() => {\n // 使用 lineConfig 中的最新值,确保同步\n const currentStartY = lineConfig.startY ?? formData.startY;\n handleSaveWithValues({ endY: currentStartY });\n }}\n title=\"将线条变为水平线\">\n 水平\n </Button>\n <Button \n size=\"small\" \n onClick={() => {\n // 使用 lineConfig 中的最新值,确保同步\n const currentStartX = lineConfig.startX ?? formData.startX;\n handleSaveWithValues({ endX: currentStartX });\n }}\n title=\"将线条变为垂直线\">\n 垂直\n </Button>\n <Button \n size=\"small\"\n onClick={() => {\n // 使用 lineConfig 中的最新值,确保同步\n const currentStartX = lineConfig.startX ?? formData.startX;\n const currentStartY = lineConfig.startY ?? formData.startY;\n const currentEndX = lineConfig.endX ?? formData.endX;\n const currentEndY = lineConfig.endY ?? formData.endY;\n handleSaveWithValues({ \n startX: currentEndX,\n startY: currentEndY,\n endX: currentStartX,\n endY: currentStartY,\n });\n }}\n title=\"交换起点和终点\">\n 反向\n </Button>\n </Space>\n </Form.Item>\n </Form>\n\n <Divider>线条属性</Divider>\n\n <Form layout=\"vertical\">\n <Form.Item label=\"线型\" help=\"选择线条样式\">\n <Select\n value={formData.lineType}\n onChange={(v) => handleSaveWithValues({ lineType: v })}>\n {lineTypeOptions.map((opt) => (\n <Option key={opt.value} value={opt.value}>\n <div className=\"flex flex-col\">\n <span>{opt.label}</span>\n <span className=\"text-xs text-gray-400\">{opt.desc}</span>\n </div>\n </Option>\n ))}\n </Select>\n </Form.Item>\n\n <Form.Item label=\"线宽(像素)\">\n <InputNumber\n value={formData.lineWeight}\n onChange={(v) => handleSaveWithValues({ lineWeight: v || 2 })}\n min={1}\n max={20}\n style={{ width: 120 }}\n />\n </Form.Item>\n\n <Form.Item label=\"颜色\">\n <div className=\"flex items-center gap-2\">\n <ColorPicker\n value={formData.color || '#d9d9d9'}\n onChange={(color) => handleSaveWithValues({ color: color.toHexString() })}\n />\n <Input\n value={formData.color}\n onChange={(e) => handleSaveWithValues({ color: e.target.value })}\n placeholder=\"#d9d9d9\"\n style={{ width: 100 }}\n />\n </div>\n </Form.Item>\n </Form>\n </div>\n );\n};\n\nexport default LineMaterialEditor;\n","import React from \"react\";\nimport { TextMaterialEditor } from \"./TextMaterialEditor\";\nimport { ImageMaterialEditor } from \"./ImageMaterialEditor\";\nimport { LineMaterialEditor } from \"./LineMaterialEditor\";\nimport type { Material } from \"../../../types\";\nimport type { DataOption } from \"../types\";\n\ninterface MaterialPropertyEditorProps {\n material: Material;\n onSave: (updates: Partial<Material>) => void;\n bindCodes?: string[];\n dataOptions?: DataOption[];\n}\n\nexport const MaterialPropertyEditor: React.FC<MaterialPropertyEditorProps> = ({\n material,\n onSave,\n bindCodes,\n dataOptions,\n}) => {\n switch (material.type) {\n case \"TEXT\":\n return (\n <TextMaterialEditor\n material={material}\n onSave={onSave}\n bindCodes={bindCodes}\n dataOptions={dataOptions}\n />\n );\n case \"IMAGE\":\n return <ImageMaterialEditor material={material} onSave={onSave} />;\n case \"LINE\":\n return <LineMaterialEditor material={material} onSave={onSave} />;\n default:\n return (\n <div className=\"text-center text-gray-400 py-8\">\n 暂不支持编辑此类型的物料\n </div>\n );\n }\n};\n\nexport default MaterialPropertyEditor;\n","import React from \"react\";\nimport { Collapse, Button, Form, Input, Select, Tag, Space, Divider } from \"antd\";\nimport { PlusOutlined, DeleteOutlined, ArrowUpOutlined, ArrowDownOutlined } from \"@ant-design/icons\";\nimport { nanoid } from \"nanoid\";\nimport type { Material, NodeStatus, Node, GroupNode } from \"../../../types\";\nimport type { DataOption } from \"../types\";\nimport { MaterialPropertyEditor } from \"./MaterialPropertyEditor\";\n\nconst { Panel } = Collapse;\nconst { TextArea } = Input;\n\ninterface GroupNodeStatusEditorProps {\n node: GroupNode;\n updateNode: (nodeId: string, updates: Partial<Node>) => void;\n materials: Material[];\n bindCodes?: string[];\n dataOptions?: DataOption[];\n}\n\nexport const GroupNodeStatusEditor: React.FC<GroupNodeStatusEditorProps> = ({\n node,\n updateNode,\n materials,\n}) => {\n // 获取可用的物料列表(排除群组类型)\n const availableMaterials = materials.filter(m => m.type !== 'CUSTOM' || !m.config?.nodes);\n\n // 更新子节点的状态列表\n const handleUpdateChildStatusList = (childId: string, newStatusList: NodeStatus[]) => {\n const newChildren = node.children?.map(child => {\n if (child.id === childId) {\n return {\n ...child,\n contentInfo: {\n ...child.contentInfo,\n statusList: newStatusList,\n },\n };\n }\n return child;\n });\n\n updateNode(node.id, {\n children: newChildren,\n } as Partial<Node>);\n };\n\n // 添加状态到子节点\n const handleAddChildStatus = (childId: string) => {\n const child = node.children?.find(c => c.id === childId);\n if (!child) return;\n\n const newStatus: NodeStatus = {\n id: nanoid(),\n name: `状态${child.contentInfo.statusList.length + 1}`,\n expression: child.contentInfo.statusList.length === 0 ? 'return true;' : 'return false;',\n material: { ...availableMaterials[0], id: nanoid() } as Material,\n bindCodes: [],\n };\n\n handleUpdateChildStatusList(childId, [...child.contentInfo.statusList, newStatus]);\n };\n\n // 删除子节点的状态\n const handleDeleteChildStatus = (childId: string, statusId: string) => {\n const child = node.children?.find(c => c.id === childId);\n if (!child) return;\n\n const newStatusList = child.contentInfo.statusList.filter(s => s.id !== statusId);\n handleUpdateChildStatusList(childId, newStatusList);\n };\n\n // 更新子节点的某个状态\n const handleUpdateChildStatus = (childId: string, statusId: string, updates: Partial<NodeStatus>) => {\n const child = node.children?.find(c => c.id === childId);\n if (!child) return;\n\n const newStatusList = child.contentInfo.statusList.map(s => {\n if (s.id === statusId) {\n return { ...s, ...updates } as NodeStatus;\n }\n return s;\n });\n\n handleUpdateChildStatusList(childId, newStatusList);\n };\n\n // 移动子节点状态\n const handleMoveChildStatus = (childId: string, statusId: string, direction: 'up' | 'down') => {\n const child = node.children?.find(c => c.id === childId);\n if (!child) return;\n\n const index = child.contentInfo.statusList.findIndex(s => s.id === statusId);\n if (index === -1) return;\n\n const newStatusList = [...child.contentInfo.statusList];\n if (direction === 'up' && index > 0) {\n [newStatusList[index], newStatusList[index - 1]] = [newStatusList[index - 1], newStatusList[index]];\n } else if (direction === 'down' && index < newStatusList.length - 1) {\n [newStatusList[index], newStatusList[index + 1]] = [newStatusList[index + 1], newStatusList[index]];\n }\n\n handleUpdateChildStatusList(childId, newStatusList);\n };\n\n // 更换子节点状态的物料\n const handleChangeChildStatusMaterial = (childId: string, statusId: string, materialId: string) => {\n const selectedMaterial = materials.find(m => m.id === materialId);\n if (!selectedMaterial) return;\n\n handleUpdateChildStatus(childId, statusId, {\n material: { ...selectedMaterial, id: nanoid() },\n });\n };\n\n return (\n <div className=\"space-y-4\">\n <div className=\"p-3 bg-blue-50 border border-blue-200 rounded-lg mb-4\">\n <div className=\"text-sm text-blue-700\">\n <strong>群组节点</strong>:为每个子节点配置多个状态和绑定\n </div>\n </div>\n\n <Collapse ghost>\n {node.children?.map((child, childIndex) => (\n <Panel\n key={child.id}\n header={\n <div className=\"flex items-center justify-between w-full pr-4\">\n <span className=\"font-medium text-sm\">子节点 {childIndex + 1}</span>\n <Tag color=\"blue\" style={{ fontSize: '12px', padding: '0 4px' }}>\n {child.contentInfo.statusList.length} 个状态\n </Tag>\n </div>\n }>\n <div className=\"space-y-3\">\n {/* 添加状态按钮 */}\n <div className=\"flex justify-between items-center mb-3\">\n <span className=\"text-sm text-gray-600\">状态列表</span>\n <Button\n type=\"primary\"\n size=\"small\"\n icon={<PlusOutlined />}\n onClick={() => handleAddChildStatus(child.id)}\n >\n 添加状态\n </Button>\n </div>\n\n {child.contentInfo.statusList.length === 0 ? (\n <div className=\"text-center text-gray-400 py-4 bg-gray-50 rounded-lg\">\n 暂无状态,点击上方按钮添加\n </div>\n ) : (\n <Collapse ghost>\n {child.contentInfo.statusList.map((status, statusIndex) => (\n <Panel\n key={status.id}\n header={\n <div className=\"flex items-center gap-2\">\n <span className=\"text-xs text-gray-400 w-5\">{statusIndex + 1}</span>\n <span className=\"font-medium\">{status.name}</span>\n <Tag color=\"default\" className=\"text-xs\">{status.material.type}</Tag>\n </div>\n }\n extra={\n <Space size=\"small\" onClick={(e) => e.stopPropagation()}>\n <Button\n type=\"text\"\n size=\"small\"\n icon={<ArrowUpOutlined />}\n disabled={statusIndex === 0}\n onClick={(e) => {\n e.stopPropagation();\n handleMoveChildStatus(child.id, status.id, 'up');\n }}\n />\n <Button\n type=\"text\"\n size=\"small\"\n icon={<ArrowDownOutlined />}\n disabled={statusIndex === child.contentInfo.statusList.length - 1}\n onClick={(e) => {\n e.stopPropagation();\n handleMoveChildStatus(child.id, status.id, 'down');\n }}\n />\n <Button\n type=\"text\"\n size=\"small\"\n danger\n icon={<DeleteOutlined />}\n onClick={(e) => {\n e.stopPropagation();\n handleDeleteChildStatus(child.id, status.id);\n }}\n />\n </Space>\n }\n >\n <Form layout=\"vertical\">\n {/* 状态名称 */}\n <Form.Item label=\"状态名称\">\n <Input\n value={status.name}\n onChange={(e) => handleUpdateChildStatus(child.id, status.id, { name: e.target.value })}\n placeholder=\"输入状态名称\"\n />\n </Form.Item>\n\n {/* 执行表达式 */}\n <Form.Item\n label=\"执行表达式\"\n help=\"返回 true 时激活此状态,可使用 data 变量访问绑定数据\"\n >\n <TextArea\n value={status.expression}\n onChange={(e) => handleUpdateChildStatus(child.id, status.id, { expression: e.target.value })}\n rows={3}\n placeholder=\"return true;\"\n />\n </Form.Item>\n\n {/* 绑定数据源 */}\n <Form.Item label=\"绑定数据源 (bindCodes)\">\n <Select\n mode=\"tags\"\n value={status.bindCodes || []}\n onChange={(value) => handleUpdateChildStatus(child.id, status.id, { bindCodes: value })}\n placeholder=\"输入数据源 code\"\n tokenSeparators={[\",\", \" \"]}\n />\n </Form.Item>\n\n {/* 更换物料 */}\n <Form.Item label=\"更换物料\">\n <div className=\"flex items-center gap-2\">\n <Tag color=\"blue\">{status.material.name}</Tag>\n <Tag color=\"default\">{status.material.type}</Tag>\n <Select\n placeholder=\"选择新物料\"\n style={{ width: 150 }}\n value={undefined}\n onChange={(value) => value && handleChangeChildStatusMaterial(child.id, status.id, value)}\n options={availableMaterials.map(m => ({\n value: m.id,\n label: `${m.name} (${m.type})`,\n }))}\n />\n </div>\n </Form.Item>\n\n {/* 物料属性编辑 */}\n <Divider style={{ margin: '12px 0' }} />\n <div className=\"bg-gray-50 rounded-lg p-3 border border-gray-200\">\n <div className=\"flex items-center justify-between mb-2\">\n <span className=\"text-sm font-medium\">物料属性</span>\n <Tag>{status.material.name}</Tag>\n </div>\n <MaterialPropertyEditor\n material={status.material}\n onSave={(updates) => {\n const newMaterial = { ...status.material, ...updates } as Material;\n handleUpdateChildStatus(child.id, status.id, { material: newMaterial });\n }}\n />\n </div>\n </Form>\n </Panel>\n ))}\n </Collapse>\n )}\n </div>\n </Panel>\n ))}\n </Collapse>\n </div>\n );\n};\n","import React, { useEffect, useState } from \"react\";\nimport {\n Form,\n Input,\n InputNumber,\n Select,\n Switch,\n Collapse,\n Button,\n Empty,\n Tabs,\n Space,\n Tag,\n Modal,\n Divider,\n} from \"antd\";\nimport {\n PlusOutlined,\n DeleteOutlined,\n ArrowUpOutlined,\n ArrowDownOutlined,\n CopyOutlined,\n EditOutlined,\n} from \"@ant-design/icons\";\nimport { useEditorStore } from \"../../store/editorStore\";\nimport type { Material, NodeStatus, Node } from \"../../types\";\nimport { nanoid } from \"nanoid\";\nimport { MaterialPropertyEditor, GroupNodeStatusEditor } from \"./editors\";\nimport type { DataOption } from \"./types\";\n\nconst { Panel } = Collapse;\nconst { TabPane } = Tabs;\nconst { TextArea } = Input;\n\ninterface PropertyPanelProps {\n defaultTestData?: DataOption[];\n}\n\nexport const PropertyPanel: React.FC<PropertyPanelProps> = ({\n defaultTestData,\n}) => {\n const {\n nodes,\n selectedNodeId,\n updateNode,\n updateNodeStyle,\n updateNodeControl,\n updateNodeContent,\n materials,\n selectedStatusId,\n selectStatus,\n } = useEditorStore();\n\n const [form] = Form.useForm();\n const [activeTab, setActiveTab] = useState(\"basic\");\n const [materialModalVisible, setMaterialModalVisible] = useState(false);\n const [editingStatusId, setEditingStatusId] = useState<string | null>(null);\n const [editingExpressions, setEditingExpressions] = useState<\n Record<string, string>\n >({});\n\n const selectedNode = React.useMemo(() => {\n return nodes.find((n) => n.id === selectedNodeId);\n }, [nodes, selectedNodeId]);\n\n const currentStatusList = selectedNode?.contentInfo.statusList || [];\n\n const handleValuesChange = (changedValues: Record<string, unknown>) => {\n if (!selectedNodeId) return;\n\n if (changedValues.normalStyle) {\n updateNodeStyle(selectedNodeId, changedValues.normalStyle as Record<string, unknown>);\n }\n\n if (changedValues.name !== undefined) {\n updateNode(selectedNodeId, { name: changedValues.name as string });\n }\n\n if (changedValues.controlInfo) {\n updateNodeControl(selectedNodeId, changedValues.controlInfo as Record<string, unknown>);\n }\n };\n\n useEffect(() => {\n if (selectedNode) {\n form.setFieldsValue({\n name: selectedNode.name,\n normalStyle: {\n width: 100,\n height: 100,\n x: 0,\n y: 0,\n padding: 8,\n background: \"transparent\",\n borderRadius: 0,\n opacity: 1,\n ...selectedNode.normalStyle,\n },\n controlInfo: {\n isDraggable: true,\n isClickable: true,\n isResizable: true,\n isSelectable: true,\n ...selectedNode.controlInfo,\n },\n });\n selectStatus(null);\n }\n }, [selectedNode?.id, form, selectStatus]);\n\n const handleAddStatus = () => {\n if (!selectedNodeId || !selectedNode) return;\n setEditingStatusId(\"new\");\n setMaterialModalVisible(true);\n };\n\n const handleSelectMaterialForStatus = (material: Material) => {\n if (!selectedNodeId || !selectedNode) return;\n\n const newStatus: NodeStatus = {\n id: nanoid(),\n name: `${material.name}_状态${currentStatusList.length + 1}`,\n expression: currentStatusList.length === 0 ? \"return true;\" : \"return false;\",\n material: { ...material, id: nanoid() },\n bindCodes: [],\n };\n\n if (editingStatusId === \"new\") {\n const newStatusList = [...currentStatusList, newStatus];\n updateNodeContent(selectedNodeId, { statusList: newStatusList });\n } else if (editingStatusId) {\n const newStatusList = currentStatusList.map((s) => {\n if (s.id === editingStatusId) {\n return { ...s, material: { ...material, id: nanoid() } };\n }\n return s;\n });\n updateNodeContent(selectedNodeId, { statusList: newStatusList });\n }\n\n setMaterialModalVisible(false);\n setEditingStatusId(null);\n };\n\n const handleDeleteStatus = (statusId: string) => {\n if (!selectedNodeId || !selectedNode) return;\n\n const newStatusList =\n selectedNode.contentInfo.statusList?.filter((s) => s.id !== statusId) || [];\n updateNodeContent(selectedNodeId, { statusList: newStatusList });\n\n if (selectedStatusId === statusId) {\n selectStatus(null);\n }\n };\n\n const handleUpdateStatus = (statusId: string, updates: Partial<NodeStatus>) => {\n if (!selectedNodeId || !selectedNode) return;\n\n const newStatusList =\n selectedNode.contentInfo.statusList?.map((s) => {\n if (s.id === statusId) {\n return { ...s, ...updates };\n }\n return s;\n }) || [];\n\n updateNodeContent(selectedNodeId, { statusList: newStatusList });\n };\n\n const handleCopyStatus = (status: NodeStatus) => {\n if (!selectedNodeId || !selectedNode) return;\n\n const newStatus: NodeStatus = {\n ...status,\n id: nanoid(),\n name: `${status.name}_复制`,\n expression: \"return false;\",\n };\n\n const newStatusList = [...currentStatusList, newStatus];\n updateNodeContent(selectedNodeId, { statusList: newStatusList });\n };\n\n const handleMoveStatus = (statusId: string, direction: \"up\" | \"down\") => {\n if (!selectedNodeId || !selectedNode) return;\n\n const index = currentStatusList.findIndex((s) => s.id === statusId);\n if (index === -1) return;\n\n const newStatusList = [...currentStatusList];\n if (direction === \"up\" && index > 0) {\n [newStatusList[index], newStatusList[index - 1]] = [\n newStatusList[index - 1],\n newStatusList[index],\n ];\n } else if (direction === \"down\" && index < newStatusList.length - 1) {\n [newStatusList[index], newStatusList[index + 1]] = [\n newStatusList[index + 1],\n newStatusList[index],\n ];\n }\n\n updateNodeContent(selectedNodeId, { statusList: newStatusList });\n };\n\n const handleChangeStatusMaterial = (statusId: string) => {\n setEditingStatusId(statusId);\n setMaterialModalVisible(true);\n };\n\n const handleUpdateStatusMaterial = (statusId: string, updates: Partial<Material>) => {\n if (!selectedNodeId || !selectedNode) return;\n\n const newStatusList = currentStatusList.map((s) => {\n if (s.id === statusId) {\n return {\n ...s,\n material: { ...s.material, ...updates } as Material,\n };\n }\n return s;\n });\n\n updateNodeContent(selectedNodeId, { statusList: newStatusList });\n };\n\n if (!selectedNode) {\n return (\n <div className=\"h-full flex items-center justify-center bg-white border-l border-gray-200\">\n <Empty description=\"请选择一个节点\" />\n </div>\n );\n }\n\n return (\n <div className=\"h-full flex flex-col bg-white border-l border-gray-200\">\n <div className=\"p-4 border-b border-gray-200\">\n <h3 className=\"text-lg font-semibold text-gray-800\">属性面板</h3>\n <p className=\"text-sm text-gray-500\">编辑选中节点的属性</p>\n </div>\n\n <div className=\"flex-1 overflow-y-auto p-4\">\n <Tabs activeKey={activeTab} onChange={setActiveTab}>\n <TabPane tab=\"基础\" key=\"basic\">\n <Form\n form={form}\n layout=\"vertical\"\n onValuesChange={handleValuesChange}\n initialValues={{ name: selectedNode.name }}\n >\n <Form.Item label=\"节点名称\" name=\"name\">\n <Input placeholder=\"输入节点名称\" />\n </Form.Item>\n\n <Collapse ghost defaultActiveKey={[\"position\", \"size\", \"style\"]}>\n <Panel header=\"位置\" key=\"position\">\n <Space>\n <Form.Item label=\"X\" name={[\"normalStyle\", \"x\"]}>\n <InputNumber />\n </Form.Item>\n <Form.Item label=\"Y\" name={[\"normalStyle\", \"y\"]}>\n <InputNumber />\n </Form.Item>\n </Space>\n </Panel>\n\n <Panel header=\"尺寸\" key=\"size\">\n <Space>\n <Form.Item label=\"宽度\" name={[\"normalStyle\", \"width\"]}>\n <InputNumber min={10} />\n </Form.Item>\n <Form.Item label=\"高度\" name={[\"normalStyle\", \"height\"]}>\n <InputNumber min={10} />\n </Form.Item>\n </Space>\n </Panel>\n\n <Panel header=\"样式\" key=\"style\">\n <Form.Item label=\"背景色\" name={[\"normalStyle\", \"background\"]}>\n <Input placeholder=\"transparent, #fff, url(...)\" />\n </Form.Item>\n\n <Form.Item label=\"内边距\" name={[\"normalStyle\", \"padding\"]}>\n <InputNumber min={0} />\n </Form.Item>\n\n <Form.Item label=\"圆角\" name={[\"normalStyle\", \"borderRadius\"]}>\n <InputNumber min={0} />\n </Form.Item>\n\n <Form.Item\n label=\"缩放比例\"\n name={[\"normalStyle\", \"scale\"]}\n help=\"等比缩放节点的宽高\"\n >\n <InputNumber min={0.1} max={5} step={0.1} />\n </Form.Item>\n\n <Form.Item\n label=\"旋转角度\"\n name={[\"normalStyle\", \"rotate\"]}\n help=\"顺时针旋转角度(度)\"\n >\n <InputNumber min={0} max={360} step={1} />\n </Form.Item>\n\n <Form.Item label=\"透明度\" name={[\"normalStyle\", \"opacity\"]}>\n <InputNumber min={0} max={1} step={0.1} />\n </Form.Item>\n\n <Form.Item label=\"层级\" name={[\"normalStyle\", \"zIndex\"]}>\n <InputNumber />\n </Form.Item>\n </Panel>\n </Collapse>\n </Form>\n </TabPane>\n\n <TabPane tab=\"状态\" key=\"status\">\n {selectedNode.type === \"group\" && selectedNode.children ? (\n <GroupNodeStatusEditor\n node={selectedNode}\n updateNode={updateNode}\n materials={materials}\n />\n ) : (\n <div className=\"mb-4\">\n <div className=\"flex items-center justify-between mb-2\">\n <span className=\"font-medium\">\n 状态列表\n <Tag color=\"blue\" className=\"ml-2\">\n {currentStatusList.length}\n </Tag>\n </span>\n <Button\n type=\"primary\"\n size=\"small\"\n icon={<PlusOutlined />}\n onClick={handleAddStatus}\n >\n 添加状态\n </Button>\n </div>\n\n <p className=\"text-xs text-gray-500 mb-3\">\n 节点根据状态表达式计算结果显示对应物料,第一个返回 true 的状态为当前状态\n </p>\n\n {currentStatusList.length > 0 && (\n <div className=\"mb-4 p-3 bg-blue-50 border border-blue-200 rounded-lg\">\n <div className=\"flex items-center justify-between\">\n <div>\n <span className=\"text-sm text-gray-600\">当前状态:</span>\n <span className=\"ml-2 text-sm font-medium text-blue-600\">\n 由表达式自动计算\n </span>\n </div>\n </div>\n </div>\n )}\n\n {currentStatusList.length === 0 ? (\n <div className=\"text-center text-gray-400 py-4 bg-gray-50 rounded-lg\">\n 暂无状态,点击上方按钮添加\n </div>\n ) : (\n <Collapse ghost defaultActiveKey={currentStatusList[0]?.id}>\n {currentStatusList.map((status, index) => (\n <Panel\n key={status.id}\n header={\n <div className=\"flex items-center gap-2\">\n <span className=\"text-xs text-gray-400 w-5\">{index + 1}</span>\n <span className=\"font-medium\">{status.name}</span>\n <Tag color=\"default\" className=\"text-xs\">\n {status.material.type}\n </Tag>\n </div>\n }\n extra={\n <Space size=\"small\" onClick={(e) => e.stopPropagation()}>\n <Button\n type=\"text\"\n size=\"small\"\n icon={<ArrowUpOutlined />}\n disabled={index === 0}\n onClick={(e) => {\n e.stopPropagation();\n handleMoveStatus(status.id, \"up\");\n }}\n />\n <Button\n type=\"text\"\n size=\"small\"\n icon={<ArrowDownOutlined />}\n disabled={index === currentStatusList.length - 1}\n onClick={(e) => {\n e.stopPropagation();\n handleMoveStatus(status.id, \"down\");\n }}\n />\n <Button\n type=\"text\"\n size=\"small\"\n icon={<CopyOutlined />}\n onClick={(e) => {\n e.stopPropagation();\n handleCopyStatus(status);\n }}\n />\n <Button\n type=\"text\"\n size=\"small\"\n danger\n icon={<DeleteOutlined />}\n onClick={(e) => {\n e.stopPropagation();\n handleDeleteStatus(status.id);\n }}\n />\n </Space>\n }\n >\n <Form layout=\"vertical\">\n <Form.Item label=\"状态名称\">\n <Input\n value={status.name}\n onChange={(e) =>\n handleUpdateStatus(status.id, { name: e.target.value })\n }\n placeholder=\"输入状态名称\"\n />\n </Form.Item>\n\n <Form.Item\n label=\"执行表达式\"\n help=\"返回 true 时激活此状态,可使用 data 变量访问绑定数据\"\n >\n <TextArea\n value={editingExpressions[status.id] ?? status.expression}\n onChange={(e) =>\n setEditingExpressions((prev) => ({\n ...prev,\n [status.id]: e.target.value,\n }))\n }\n onBlur={(e) => {\n handleUpdateStatus(status.id, { expression: e.target.value });\n setEditingExpressions((prev) => {\n const newState = { ...prev };\n delete newState[status.id];\n return newState;\n });\n }}\n rows={3}\n placeholder=\"return true;\"\n />\n </Form.Item>\n\n <Form.Item label=\"绑定数据源 (bindCodes)\">\n <Select\n mode=\"tags\"\n value={status.bindCodes || []}\n onChange={(value) =>\n handleUpdateStatus(status.id, { bindCodes: value })\n }\n placeholder=\"输入数据源 code\"\n tokenSeparators={[\",\", \" \"]}\n />\n </Form.Item>\n\n <Form.Item label=\"绑定物料\">\n <div className=\"flex items-center gap-2\">\n <Tag color=\"blue\">{status.material.name}</Tag>\n <Tag color=\"default\">{status.material.type}</Tag>\n <Button\n type=\"link\"\n size=\"small\"\n icon={<EditOutlined />}\n onClick={() => handleChangeStatusMaterial(status.id)}\n >\n 更换物料\n </Button>\n </div>\n </Form.Item>\n\n {/* 状态物料属性编辑 */}\n <Divider style={{ margin: \"12px 0\" }} />\n <div className=\"bg-gray-50 rounded-lg p-3 border border-gray-200\">\n <div className=\"flex items-center justify-between mb-2\">\n <span className=\"text-sm font-medium\">物料属性</span>\n <Tag>{status.material.name}</Tag>\n </div>\n <MaterialPropertyEditor\n material={status.material}\n onSave={(updates) =>\n handleUpdateStatusMaterial(status.id, updates)\n }\n bindCodes={status.bindCodes || []}\n dataOptions={defaultTestData || []}\n />\n </div>\n </Form>\n </Panel>\n ))}\n </Collapse>\n )}\n </div>\n )}\n </TabPane>\n\n <TabPane tab=\"控制\" key=\"control\">\n <Form\n form={form}\n layout=\"vertical\"\n onValuesChange={handleValuesChange}\n >\n <Form.Item\n label=\"可拖拽\"\n name={[\"controlInfo\", \"isDraggable\"]}\n valuePropName=\"checked\"\n >\n <Switch />\n </Form.Item>\n\n <Form.Item\n label=\"可点击\"\n name={[\"controlInfo\", \"isClickable\"]}\n valuePropName=\"checked\"\n >\n <Switch />\n </Form.Item>\n\n <Form.Item\n label=\"可调整大小\"\n name={[\"controlInfo\", \"isResizable\"]}\n valuePropName=\"checked\"\n >\n <Switch />\n </Form.Item>\n\n <Form.Item\n label=\"可选中\"\n name={[\"controlInfo\", \"isSelectable\"]}\n valuePropName=\"checked\"\n >\n <Switch />\n </Form.Item>\n </Form>\n </TabPane>\n\n </Tabs>\n </div>\n\n <div className=\"p-3 border-t border-gray-200 bg-gray-50\">\n <div className=\"text-xs text-gray-500\">\n <div>节点 ID: {selectedNode.id.slice(0, 8)}...</div>\n <div>状态数: {currentStatusList.length}</div>\n </div>\n </div>\n\n <Modal\n title=\"选择物料\"\n open={materialModalVisible}\n onCancel={() => {\n setMaterialModalVisible(false);\n setEditingStatusId(null);\n }}\n footer={null}\n width={600}\n >\n <div className=\"max-h-[400px] overflow-y-auto\">\n <Collapse ghost defaultActiveKey={[\"basic\", \"device\", \"text\", \"line\"]}>\n <Panel header=\"基础形状\" key=\"basic\">\n <div className=\"grid grid-cols-4 gap-2\">\n {materials\n .filter((m) => [\"矩形\", \"圆形\", \"圆角矩形\"].includes(m.name))\n .map((material) => (\n <MaterialCard\n key={material.id}\n material={material}\n onClick={() => handleSelectMaterialForStatus(material)}\n />\n ))}\n </div>\n </Panel>\n\n <Panel header=\"设备图标\" key=\"device\">\n <div className=\"grid grid-cols-4 gap-2\">\n {materials\n .filter(\n (m) =>\n [\"阀门\", \"泵\", \"罐体\"].includes(m.name) ||\n (m.type === \"IMAGE\" &&\n ![\"矩形\", \"圆形\", \"圆角矩形\"].includes(m.name))\n )\n .map((material) => (\n <MaterialCard\n key={material.id}\n material={material}\n onClick={() => handleSelectMaterialForStatus(material)}\n />\n ))}\n </div>\n </Panel>\n\n <Panel header=\"文本\" key=\"text\">\n <div className=\"grid grid-cols-4 gap-2\">\n {materials\n .filter((m) => m.type === \"TEXT\")\n .map((material) => (\n <div\n key={material.id}\n className=\"border rounded-lg p-2 cursor-pointer hover:border-blue-500 hover:bg-blue-50 transition-all text-center\"\n onClick={() => handleSelectMaterialForStatus(material)}\n >\n <div className=\"w-12 h-12 mx-auto mb-1 flex items-center justify-center bg-gray-100 rounded\">\n <span className=\"text-lg font-bold text-gray-500\">T</span>\n </div>\n <span className=\"text-xs\">{material.name}</span>\n </div>\n ))}\n </div>\n </Panel>\n\n <Panel header=\"线条\" key=\"line\">\n <div className=\"grid grid-cols-4 gap-2\">\n {materials\n .filter((m) => m.type === \"LINE\")\n .map((material) => (\n <div\n key={material.id}\n className=\"border rounded-lg p-2 cursor-pointer hover:border-blue-500 hover:bg-blue-50 transition-all text-center\"\n onClick={() => handleSelectMaterialForStatus(material)}\n >\n <div className=\"w-12 h-12 mx-auto mb-1 flex items-center justify-center bg-gray-100 rounded\">\n <div className=\"w-8 h-0.5 bg-gray-400\" />\n </div>\n <span className=\"text-xs\">{material.name}</span>\n </div>\n ))}\n </div>\n </Panel>\n </Collapse>\n </div>\n </Modal>\n </div>\n );\n};\n\n// 物料卡片组件\ninterface MaterialCardProps {\n material: Material;\n onClick: () => void;\n}\n\nconst MaterialCard: React.FC<MaterialCardProps> = ({ material, onClick }) => {\n // 安全地获取图片 URL,只处理 IMAGE 类型\n const src = material.type === 'IMAGE' ? (material as Extract<Material, { type: 'IMAGE' }>).src : undefined;\n \n return (\n <div\n className=\"border rounded-lg p-2 cursor-pointer hover:border-blue-500 hover:bg-blue-50 transition-all text-center\"\n onClick={onClick}\n >\n <div className=\"w-12 h-12 mx-auto mb-1 flex items-center justify-center\">\n {src ? (\n <img src={src} alt={material.name} className=\"w-10 h-10 object-contain\" />\n ) : (\n <span className=\"text-xs\">{material.name[0]}</span>\n )}\n </div>\n <span className=\"text-xs\">{material.name}</span>\n </div>\n );\n};\n\nexport default PropertyPanel;\n","import React, { useEffect, useCallback } from \"react\";\nimport type { CSSProperties } from \"react\";\nimport {\n Layout,\n Button,\n Space,\n Tooltip,\n Modal,\n message,\n ConfigProvider,\n} from \"antd\";\nimport { DownloadOutlined, UploadOutlined } from \"@ant-design/icons\";\nimport zhCN from \"antd/locale/zh_CN\";\nimport { MaterialPanel } from \"../MaterialPanel\";\nimport { Canvas } from \"../Canvas\";\nimport { PropertyPanel } from \"../PropertyPanel\";\nimport { useEditorStore } from \"../../store/editorStore\";\nimport { initMaterials } from \"../../utils/initData\";\nimport type { SchemeJSON } from \"../../types\";\nimport styles from \"../../styles/ConfigEditor.module.css\";\n\nconst { Header, Sider, Content } = Layout;\n\nexport interface ConfigEditorProps {\n /** 初始 scheme 数据 */\n initialScheme?: SchemeJSON;\n /** scheme 变化回调 */\n onChange?: (scheme: SchemeJSON) => void;\n /** 是否只读模式 */\n readonly?: boolean;\n /** 自定义头部内容 */\n headerExtra?: React.ReactNode;\n /** 样式类名 */\n className?: string;\n /** 内联样式 */\n style?: CSSProperties;\n /** 画布默认宽度 */\n defaultCanvasWidth?: number;\n /** 画布默认高度 */\n defaultCanvasHeight?: number;\n /** 是否显示头部 */\n showHeader?: boolean;\n /** 是否显示物料面板 */\n showMaterialPanel?: boolean;\n /** 是否显示属性面板 */\n showPropertyPanel?: boolean;\n /** 自定义物料列表 */\n customMaterials?: any[];\n /** 实时数据 */\n defaultTestData?: any[];\n}\n\nexport const ConfigEditor: React.FC<ConfigEditorProps> = ({\n initialScheme,\n onChange,\n readonly = false,\n headerExtra,\n className = \"\",\n style,\n showHeader = true,\n showMaterialPanel = true,\n showPropertyPanel = true,\n customMaterials,\n}) => {\n const [importModalVisible, setImportModalVisible] = React.useState(false);\n const [jsonInput, setJsonInput] = React.useState(\"\");\n const [defaultTestData, setDefaultTestData] = React.useState([\n {\n paramsCode: \"001\",\n paramsName: \"通频速度有效值\",\n value: 25,\n paramsUnit: \"mm/s\",\n },\n {\n paramsCode: \"002\",\n paramsName: \"通频加速度有效值\",\n value: 1.5,\n paramsUnit: \"m/s²\",\n },\n ]);\n const { exportScheme, importScheme, nodes, materials, addMaterial } =\n useEditorStore();\n const internalRef = React.useRef<any>(null);\n const initializedRef = React.useRef(false);\n // useEffect(() => {\n // if (internalRef.current) {\n // clearInterval(internalRef.current);\n // }\n // internalRef.current = setInterval(() => {\n // setDefaultTestData([\n // {\n // paramsCode: \"001\",\n // paramsName: \"通频速度有效值\",\n // value: 25 + Math.random() * 5 * (Math.random() > 0.5 ? 1 : -1),\n // paramsUnit: \"mm/s\",\n // },\n // {\n // paramsCode: \"002\",\n // paramsName: \"通频加速度有效值\",\n // value: 1.5 + Math.random() * 0.5 * (Math.random() > 0.5 ? 1 : -1),\n // paramsUnit: \"m/s²\",\n // },\n // ]);\n // }, 1000);\n // return () => {\n // if (internalRef.current) {\n // clearInterval(internalRef.current);\n // }\n // };\n // }, []);\n // 初始化\n useEffect(() => {\n // 防止 React 18 严格模式下重复执行\n if (initializedRef.current) return;\n initializedRef.current = true;\n\n // 加载默认物料\n if (materials.length === 0) {\n initMaterials.forEach((m) => addMaterial(m));\n }\n\n // 加载自定义物料\n if (customMaterials && customMaterials.length > 0) {\n customMaterials.forEach((m) => addMaterial(m));\n }\n\n // 加载初始 scheme\n if (initialScheme) {\n importScheme(initialScheme);\n }\n }, []);\n\n // 监听变化并回调\n useEffect(() => {\n if (onChange) {\n const scheme = exportScheme();\n onChange(scheme);\n }\n }, [nodes, onChange]);\n\n // 导出 JSON\n const handleExport = useCallback(() => {\n const scheme = exportScheme();\n const dataStr = JSON.stringify(scheme, null, 2);\n const dataUri =\n \"data:application/json;charset=utf-8,\" + encodeURIComponent(dataStr);\n\n const exportFileDefaultName = `scheme_${Date.now()}.json`;\n\n const linkElement = document.createElement(\"a\");\n linkElement.setAttribute(\"href\", dataUri);\n linkElement.setAttribute(\"download\", exportFileDefaultName);\n linkElement.click();\n\n message.success(\"导出成功!\");\n }, [exportScheme]);\n\n // 导入 JSON\n const handleImport = useCallback(() => {\n try {\n const scheme: SchemeJSON = JSON.parse(jsonInput);\n importScheme(scheme);\n setImportModalVisible(false);\n setJsonInput(\"\");\n message.success(\"导入成功!\");\n } catch (error) {\n message.error(\"JSON 格式错误,请检查输入\");\n }\n }, [jsonInput, importScheme]);\n\n // 处理文件导入\n const handleFileImport = useCallback(\n (file: File) => {\n const reader = new FileReader();\n reader.onload = (e) => {\n try {\n const content = e.target?.result as string;\n const scheme: SchemeJSON = JSON.parse(content);\n importScheme(scheme);\n message.success(\"导入成功!\");\n } catch (error) {\n message.error(\"文件格式错误\");\n }\n };\n reader.readAsText(file);\n return false;\n },\n [importScheme],\n );\n\n // 导出 scheme 方法(供外部 ref 调用)\n const getScheme = useCallback(() => {\n return exportScheme();\n }, [exportScheme]);\n\n // 暴露给父组件\n React.useImperativeHandle(\n (React as any).useRef?.(),\n () => ({\n getScheme,\n exportScheme,\n importScheme,\n }),\n [getScheme, exportScheme, importScheme],\n );\n\n // console.log(\"defaultTestData\", defaultTestData);\n\n return (\n <ConfigProvider locale={zhCN}>\n <div className={styles.configEditor} style={style}>\n <Layout\n className={`h-full w-full overflow-hidden ${className}`}>\n {/* 顶部导航 */}\n {showHeader && (\n <Header className=\"bg-white border-b border-gray-200 px-4 flex items-center justify-between flex-shrink-0\">\n <div className=\"flex items-center gap-4\">\n <div className=\"text-xl font-bold text-blue-600\">组态编辑器</div>\n <div className=\"text-sm text-gray-500\">{nodes.length} 个节点</div>\n </div>\n\n <Space>\n {headerExtra}\n {!readonly && (\n <>\n <Tooltip title=\"导出 JSON\">\n <Button icon={<DownloadOutlined />} onClick={handleExport}>\n 导出\n </Button>\n </Tooltip>\n\n <Tooltip title=\"导入 JSON\">\n <Button\n icon={<UploadOutlined />}\n onClick={() => setImportModalVisible(true)}>\n 导入\n </Button>\n </Tooltip>\n </>\n )}\n </Space>\n </Header>\n )}\n\n {/* 主体内容 */}\n <Layout>\n {/* 左侧物料面板 */}\n {showMaterialPanel && !readonly && (\n <Sider width={280} className=\"bg-white\" theme=\"light\">\n <MaterialPanel />\n </Sider>\n )}\n\n {/* 中间画布 */}\n <Content className=\"bg-gray-100 relative\">\n <Canvas defaultTestData={defaultTestData} />\n </Content>\n\n {/* 右侧属性面板 */}\n {showPropertyPanel && !readonly && (\n <Sider width={360} className=\"bg-white\" theme=\"light\">\n <PropertyPanel defaultTestData={defaultTestData} />\n </Sider>\n )}\n </Layout>\n\n {/* 导入弹窗 */}\n <Modal\n title=\"导入组态方案\"\n open={importModalVisible}\n onOk={handleImport}\n onCancel={() => {\n setImportModalVisible(false);\n setJsonInput(\"\");\n }}\n width={600}>\n <div className=\"space-y-4\">\n <div>\n <p className=\"mb-2\">选择 JSON 文件导入:</p>\n <input\n type=\"file\"\n accept=\".json\"\n onChange={(e) => {\n const file = e.target.files?.[0];\n if (file) handleFileImport(file);\n }}\n className=\"block w-full text-sm text-gray-500\n file:mr-4 file:py-2 file:px-4\n file:rounded-full file:border-0\n file:text-sm file:font-semibold\n file:bg-blue-50 file:text-blue-700\n hover:file:bg-blue-100\"\n />\n </div>\n\n <div className=\"text-center text-gray-400\">或</div>\n\n <div>\n <p className=\"mb-2\">粘贴 JSON 内容:</p>\n <textarea\n value={jsonInput}\n onChange={(e) => setJsonInput(e.target.value)}\n placeholder=\"粘贴 JSON 内容...\"\n className=\"w-full h-48 p-3 border border-gray-300 rounded-lg font-mono text-sm resize-none focus:outline-none focus:ring-2 focus:ring-blue-500\"\n />\n </div>\n </div>\n </Modal>\n </Layout>\n </div>\n </ConfigProvider>\n );\n};\n\nexport default ConfigEditor;\n"],"names":["_interopRequireDefault","e","module","zh_CN","locale","common","_common","require$$0","_typeof","o","ownKeys","r","t","_objectSpread","_defineProperty","obj","key","value","_toPropertyKey","i","_toPrimitive","_zh_CN","require$$1","_zh_CN2","_zh_CN3","_zh_CN4","typeTemplate","localeValues","immer","initializer","set","get","store","updater","replace","args","nextState","produce","initialState","createEvent","type","targetId","payload","nanoid","useEditorStore","create","node","autoSelect","state","newNode","id","updates","n","style","content","control","index","nodeId","status","newStatus","statusId","s","data","error","material","newMaterial","m","viewport","config","mode","endPoint","lastEvent","nextEvent","event","scheme","initMaterials","createDefaultStatus","createDefaultNode","x","y","children","childNode","minX","minY","maxX","maxY","child","cx","cy","cw","ch","relativeChildren","Panel","Collapse","Text","Typography","MaterialPanel","materials","addMaterial","removeMaterial","selectedStatusId","selectStatus","lineDrawing","startLineDrawing","cancelLineDrawing","activeKeys","setActiveKeys","useState","handleUpload","file","reader","src","groupedMaterials","handleDragStart","dragImage","handleLineMaterialClick","renderMaterialItem","isLineMode","isLineMaterial","isDrawingLine","jsx","List","Button","EditOutlined","DeleteOutlined","Image","jsxs","Tag","Upload","UploadOutlined","keys","item","Empty","Fragment","evaluateStatusExpression","params","d","result","findActiveStatus","statusList","bindData","getDataValue","valueSourceCode","dataItem","formatValue","decimals","num","renderMaterial","isSelected","imageMaterial","bgColor","fillColor","textMaterial","label","configValue","configUnit","labelStyle","valueStyle","customStyle","dataValue","dataUnit","displayValue","displayUnit","lineMaterial","thickness","color","dashed","lineType","lineWeight","startX","startY","endX","endY","dashArray","baseWeight","strokeColor","customMaterial","NodeRendererComponent","onClick","onMouseDown","onUpdateNode","canvasScale","normalStyle","contentInfo","controlInfo","isClickable","isDraggable","isResizable","onClickRef","useRef","draggingPoint","setDraggingPoint","dragOriginRef","dragResultRef","resizeResultRef","nodeRef","resizing","setResizing","rotating","setRotating","rotatingAngleRef","currentStatus","useMemo","activeStatus","currentMaterial","isLine","lineConfig","nodeScale","scaledWidth","scaledHeight","getEffectiveCanvasScale","useCallback","canvasEl","canvasRect","logicalWidth","handlePointMouseDown","point","useEffect","handleMouseMove","origin","effectiveScale","totalDx","totalDy","newStartX","newStartY","newEndX","newEndY","newNodeX","newNodeY","minNodeSize","newWidth","newHeight","el","line","startHandle","endHandle","handleMouseUp","dx","dy","newX","newY","handleResizeStart","corner","handleRotateStart","rect","newAngle","extra","finalAngle","isGroup","containerStyle","startPointPos","endPointPos","latestOnClick","NodeRenderer","React","prevProps","nextProps","nodeA","nodeB","nodeStyleEqual","contentEqual","otherPropsEqual","presetColors","ColorPicker","onChange","onChangeComplete","visible","setVisible","innerValue","setInnerValue","popoverRef","handleClickOutside","handleColorChange","TextArea","Input","Canvas","defaultTestData","transformRef","canvasRef","wrapperRef","nodes","selectedNodeId","canvas","setViewport","setCanvasConfig","addNode","selectNode","updateNode","removeNode","undo","redo","setMode","endLineDrawing","isDragOver","setIsDragOver","forceUpdate","modeRef","isDraggingRef","dragStartRef","dragOffsetRef","draggingNodeRef","linePreview","setLinePreview","selectionBox","setSelectionBox","selectedNodeIds","setSelectedNodeIds","dataModalVisible","setDataModalVisible","dataInput","setDataInput","canvasConfigVisible","setCanvasConfigVisible","isSpacePressed","setIsSpacePressed","getCanvasPosition","clientX","clientY","mouseXInCanvas","mouseYInCanvas","effectiveScaleX","effectiveScaleY","getBoxSelectionPosition","createLineNode","start","end","continueDrawing","relativeStartX","relativeStartY","relativeEndX","relativeEndY","nodeWidth","nodeHeight","nextStart","handleTransform","handleCanvasClick","handleCanvasMouseDown","pos","handleCanvasDoubleClick","handleDragOver","handleDragLeave","handleDrop","handleNodeMouseDown","screenDx","screenDy","canvasDx","canvasDy","nodeEl","prev","selectedIds","nodeX","nodeY","nodeW","nodeH","centerX","centerY","handleKeyDown","handleKeyUp","handleCopyNodes","nodesToCopy","newNodeIds","handleGroupNodes","selectedNodes","w","h","groupNode","handleUngroupNodes","groupNodesToUngroup","absoluteChildren","handleDistributeNodes","direction","sortedNodes","a","b","count","step","handleAlignNodes","alignValue","toolbarButtons","SelectOutlined","GroupOutlined","DragOutlined","EyeOutlined","actionButtons","UndoOutlined","RedoOutlined","CopyOutlined","UngroupOutlined","AlignLeftOutlined","AlignRightOutlined","VerticalAlignTopOutlined","VerticalAlignBottomOutlined","ColumnWidthOutlined","ColumnHeightOutlined","SettingOutlined","ExperimentOutlined","Space","btn","Tooltip","TransformWrapper","zoomIn","zoomOut","resetTransform","ZoomInOutlined","ZoomOutOutlined","TransformComponent","Modal","Form","InputNumber","v","Switch","checked","Option","Select","TextMaterialEditor","onSave","bindCodes","dataOptions","formData","setFormData","handleChange","field","handleValueSourceChange","code","selectedOption","opt","autoUnit","handleSave","boundDataOptions","Divider","ImageMaterialEditor","newColor","LineMaterialEditor","handleSaveWithValues","newValues","newFormData","lineTypeOptions","currentStartY","currentStartX","currentEndX","currentEndY","MaterialPropertyEditor","GroupNodeStatusEditor","availableMaterials","handleUpdateChildStatusList","childId","newStatusList","newChildren","handleAddChildStatus","c","handleDeleteChildStatus","handleUpdateChildStatus","handleMoveChildStatus","handleChangeChildStatusMaterial","materialId","selectedMaterial","childIndex","PlusOutlined","statusIndex","ArrowUpOutlined","ArrowDownOutlined","TabPane","Tabs","PropertyPanel","updateNodeStyle","updateNodeControl","updateNodeContent","form","activeTab","setActiveTab","materialModalVisible","setMaterialModalVisible","editingStatusId","setEditingStatusId","editingExpressions","setEditingExpressions","selectedNode","currentStatusList","handleValuesChange","changedValues","handleAddStatus","handleSelectMaterialForStatus","handleDeleteStatus","handleUpdateStatus","handleCopyStatus","handleMoveStatus","handleChangeStatusMaterial","handleUpdateStatusMaterial","newState","MaterialCard","Header","Sider","Content","Layout","ConfigEditor","initialScheme","readonly","headerExtra","className","showHeader","showMaterialPanel","showPropertyPanel","customMaterials","importModalVisible","setImportModalVisible","jsonInput","setJsonInput","setDefaultTestData","exportScheme","importScheme","initializedRef","handleExport","dataStr","dataUri","exportFileDefaultName","linkElement","message","handleImport","handleFileImport","getScheme","ConfigProvider","zhCN","styles","DownloadOutlined"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9]}
1
+ {"version":3,"file":"config-editor.umd.js","sources":["../node_modules/.pnpm/@babel+runtime@7.28.6/node_modules/@babel/runtime/helpers/interopRequireDefault.js","../node_modules/.pnpm/@rc-component+pagination@1.2.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/@rc-component/pagination/lib/locale/zh_CN.js","../node_modules/.pnpm/@rc-component+picker@1.9.0_dayjs@1.11.19_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/@rc-component/picker/lib/locale/common.js","../node_modules/.pnpm/@rc-component+picker@1.9.0_dayjs@1.11.19_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/@rc-component/picker/lib/locale/zh_CN.js","../node_modules/.pnpm/antd@6.3.2_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/antd/lib/time-picker/locale/zh_CN.js","../node_modules/.pnpm/antd@6.3.2_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/antd/lib/date-picker/locale/zh_CN.js","../node_modules/.pnpm/antd@6.3.2_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/antd/lib/calendar/locale/zh_CN.js","../node_modules/.pnpm/antd@6.3.2_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/antd/lib/locale/zh_CN.js","../node_modules/.pnpm/antd@6.3.2_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/antd/locale/zh_CN.js","../node_modules/.pnpm/zustand@5.0.11_@types+react@19.2.14_immer@11.1.4_react@19.2.4/node_modules/zustand/esm/middleware/immer.mjs","../src/store/editorStore.ts","../src/utils/initData.ts","../src/components/MaterialPanel/index.tsx","../src/components/NodeRenderer/index.tsx","../src/components/ColorPicker/index.tsx","../src/components/Canvas/index.tsx","../src/components/PropertyPanel/editors/TextMaterialEditor.tsx","../src/components/PropertyPanel/editors/ImageMaterialEditor.tsx","../src/components/PropertyPanel/editors/LineMaterialEditor.tsx","../src/components/PropertyPanel/editors/MaterialPropertyEditor.tsx","../src/components/PropertyPanel/editors/GroupNodeStatusEditor.tsx","../src/components/PropertyPanel/index.tsx","../src/components/ConfigEditor/index.tsx"],"sourcesContent":["function _interopRequireDefault(e) {\n return e && e.__esModule ? e : {\n \"default\": e\n };\n}\nmodule.exports = _interopRequireDefault, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\nconst locale = {\n // Options\n items_per_page: '条/页',\n jump_to: '跳至',\n jump_to_confirm: '确定',\n page: '页',\n // Pagination\n prev_page: '上一页',\n next_page: '下一页',\n prev_5: '向前 5 页',\n next_5: '向后 5 页',\n prev_3: '向前 3 页',\n next_3: '向后 3 页',\n page_size: '页码'\n};\nvar _default = exports.default = locale;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.commonLocale = void 0;\nvar commonLocale = exports.commonLocale = {\n yearFormat: 'YYYY',\n dayFormat: 'D',\n cellMeridiemFormat: 'A',\n monthBeforeYear: true\n};","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\nvar _common = require(\"./common\");\nfunction _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\nfunction ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\nfunction _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == _typeof(i) ? i : String(i); }\nfunction _toPrimitive(t, r) { if (\"object\" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != _typeof(i)) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\nvar locale = _objectSpread(_objectSpread({}, _common.commonLocale), {}, {\n locale: 'zh_CN',\n today: '今天',\n now: '此刻',\n backToToday: '返回今天',\n ok: '确定',\n timeSelect: '选择时间',\n dateSelect: '选择日期',\n weekSelect: '选择周',\n clear: '清除',\n week: '周',\n month: '月',\n year: '年',\n previousMonth: '上个月 (翻页上键)',\n nextMonth: '下个月 (翻页下键)',\n monthSelect: '选择月份',\n yearSelect: '选择年份',\n decadeSelect: '选择年代',\n previousYear: '上一年 (Control键加左方向键)',\n nextYear: '下一年 (Control键加右方向键)',\n previousDecade: '上一年代',\n nextDecade: '下一年代',\n previousCentury: '上一世纪',\n nextCentury: '下一世纪',\n yearFormat: 'YYYY年',\n cellDateFormat: 'D',\n monthBeforeYear: false\n});\nvar _default = exports.default = locale;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\nconst locale = {\n placeholder: '请选择时间',\n rangePlaceholder: ['开始时间', '结束时间']\n};\nvar _default = exports.default = locale;","\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\").default;\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\nvar _zh_CN = _interopRequireDefault(require(\"@rc-component/picker/locale/zh_CN\"));\nvar _zh_CN2 = _interopRequireDefault(require(\"../../time-picker/locale/zh_CN\"));\n// 统一合并为完整的 Locale\nconst locale = {\n lang: {\n placeholder: '请选择日期',\n yearPlaceholder: '请选择年份',\n quarterPlaceholder: '请选择季度',\n monthPlaceholder: '请选择月份',\n weekPlaceholder: '请选择周',\n rangePlaceholder: ['开始日期', '结束日期'],\n rangeYearPlaceholder: ['开始年份', '结束年份'],\n rangeMonthPlaceholder: ['开始月份', '结束月份'],\n rangeQuarterPlaceholder: ['开始季度', '结束季度'],\n rangeWeekPlaceholder: ['开始周', '结束周'],\n ..._zh_CN.default\n },\n timePickerLocale: {\n ..._zh_CN2.default\n }\n};\n// should add whitespace between char in Button\nlocale.lang.ok = '确定';\n// All settings at:\n// https://github.com/ant-design/ant-design/blob/master/components/date-picker/locale/example.json\nvar _default = exports.default = locale;","\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\").default;\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\nvar _zh_CN = _interopRequireDefault(require(\"../../date-picker/locale/zh_CN\"));\nvar _default = exports.default = _zh_CN.default;","\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\").default;\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\nvar _zh_CN = _interopRequireDefault(require(\"@rc-component/pagination/lib/locale/zh_CN\"));\nvar _zh_CN2 = _interopRequireDefault(require(\"../calendar/locale/zh_CN\"));\nvar _zh_CN3 = _interopRequireDefault(require(\"../date-picker/locale/zh_CN\"));\nvar _zh_CN4 = _interopRequireDefault(require(\"../time-picker/locale/zh_CN\"));\nconst typeTemplate = '${label}不是一个有效的${type}';\nconst localeValues = {\n locale: 'zh-cn',\n Pagination: _zh_CN.default,\n DatePicker: _zh_CN3.default,\n TimePicker: _zh_CN4.default,\n Calendar: _zh_CN2.default,\n // locales for all components\n global: {\n placeholder: '请选择',\n close: '关闭',\n sortable: '可排序'\n },\n Table: {\n filterTitle: '筛选',\n filterConfirm: '确定',\n filterReset: '重置',\n filterEmptyText: '无筛选项',\n filterCheckAll: '全选',\n filterSearchPlaceholder: '在筛选项中搜索',\n emptyText: '暂无数据',\n selectAll: '全选当页',\n selectInvert: '反选当页',\n selectNone: '清空所有',\n selectionAll: '全选所有',\n sortTitle: '排序',\n expand: '展开行',\n collapse: '关闭行',\n triggerDesc: '点击降序',\n triggerAsc: '点击升序',\n cancelSort: '取消排序'\n },\n Modal: {\n okText: '确定',\n cancelText: '取消',\n justOkText: '知道了'\n },\n Tour: {\n Next: '下一步',\n Previous: '上一步',\n Finish: '结束导览'\n },\n Popconfirm: {\n cancelText: '取消',\n okText: '确定'\n },\n Transfer: {\n titles: ['', ''],\n searchPlaceholder: '请输入搜索内容',\n itemUnit: '项',\n itemsUnit: '项',\n remove: '删除',\n selectCurrent: '全选当页',\n removeCurrent: '删除当页',\n selectAll: '全选所有',\n deselectAll: '取消全选',\n removeAll: '删除全部',\n selectInvert: '反选当页'\n },\n Upload: {\n uploading: '文件上传中',\n removeFile: '删除文件',\n uploadError: '上传错误',\n previewFile: '预览文件',\n downloadFile: '下载文件'\n },\n Empty: {\n description: '暂无数据'\n },\n Icon: {\n icon: '图标'\n },\n Text: {\n edit: '编辑',\n copy: '复制',\n copied: '复制成功',\n expand: '展开',\n collapse: '收起'\n },\n Form: {\n optional: '(可选)',\n defaultValidateMessages: {\n default: '字段验证错误${label}',\n required: '请输入${label}',\n enum: '${label}必须是其中一个[${enum}]',\n whitespace: '${label}不能为空字符',\n date: {\n format: '${label}日期格式无效',\n parse: '${label}不能转换为日期',\n invalid: '${label}是一个无效日期'\n },\n types: {\n string: typeTemplate,\n method: typeTemplate,\n array: typeTemplate,\n object: typeTemplate,\n number: typeTemplate,\n date: typeTemplate,\n boolean: typeTemplate,\n integer: typeTemplate,\n float: typeTemplate,\n regexp: typeTemplate,\n email: typeTemplate,\n url: typeTemplate,\n hex: typeTemplate\n },\n string: {\n len: '${label}须为${len}个字符',\n min: '${label}最少${min}个字符',\n max: '${label}最多${max}个字符',\n range: '${label}须在${min}-${max}字符之间'\n },\n number: {\n len: '${label}必须等于${len}',\n min: '${label}最小值为${min}',\n max: '${label}最大值为${max}',\n range: '${label}须在${min}-${max}之间'\n },\n array: {\n len: '须为${len}个${label}',\n min: '最少${min}个${label}',\n max: '最多${max}个${label}',\n range: '${label}数量须在${min}-${max}之间'\n },\n pattern: {\n mismatch: '${label}与模式不匹配${pattern}'\n }\n }\n },\n QRCode: {\n expired: '二维码过期',\n refresh: '点击刷新',\n scanned: '已扫描'\n },\n ColorPicker: {\n presetEmpty: '暂无',\n transparent: '无色',\n singleColor: '单色',\n gradientColor: '渐变色'\n }\n};\nvar _default = exports.default = localeValues;","module.exports = require('../lib/locale/zh_CN');","import { produce } from 'immer';\n\nconst immerImpl = (initializer) => (set, get, store) => {\n store.setState = (updater, replace, ...args) => {\n const nextState = typeof updater === \"function\" ? produce(updater) : updater;\n return set(nextState, replace, ...args);\n };\n return initializer(store.setState, get, store);\n};\nconst immer = immerImpl;\n\nexport { immer };\n","import { create } from 'zustand';\nimport { immer } from 'zustand/middleware/immer';\nimport { nanoid } from 'nanoid';\n// @ts-ignore - 导入 csstype 用于类型推断\nimport type {} from 'csstype';\nimport type { \n EditorState, \n Node, \n Material,\n NodeStatus,\n EditorEvent, \n EventType,\n SchemeJSON,\n NodeStyle,\n ContentInfo,\n ControlInfo,\n CanvasConfig\n} from '../types';\n\n// 初始状态\nconst initialState: EditorState = {\n nodes: [],\n materials: [],\n selectedNodeId: null,\n selectedStatusId: null,\n canvas: {\n width: 1920,\n height: 1080,\n background: '#ffffff',\n showGrid: true,\n },\n viewport: {\n scale: 1,\n positionX: 0,\n positionY: 0,\n },\n history: {\n past: [],\n future: [],\n },\n mode: 'select',\n lineDrawing: {\n isDrawing: false,\n material: null,\n startPoint: null,\n endPoint: null,\n },\n};\n\n// 创建事件\nconst createEvent = (type: EventType, targetId?: string, payload?: any): EditorEvent => ({\n id: nanoid(),\n type,\n targetId,\n payload,\n timestamp: Date.now(),\n});\n\n// Store 接口\ninterface EditorStore extends EditorState {\n // 节点操作\n addNode: (node: Omit<Node, 'id'> & { id?: string }, autoSelect?: boolean) => void;\n updateNode: (id: string, updates: Partial<Node>) => void;\n updateNodeStyle: (id: string, style: Partial<NodeStyle>) => void;\n updateNodeContent: (id: string, content: Partial<ContentInfo>) => void;\n updateNodeControl: (id: string, control: Partial<ControlInfo>) => void;\n removeNode: (id: string) => void;\n selectNode: (id: string | null) => void;\n \n // 状态操作(新架构)\n addStatus: (nodeId: string, status: Omit<NodeStatus, 'id'>) => void;\n removeStatus: (nodeId: string, statusId: string) => void;\n updateStatus: (nodeId: string, statusId: string, updates: Partial<NodeStatus>) => void;\n selectStatus: (statusId: string | null) => void;\n evaluateCurrentStatus: (nodeId: string, data: any) => string | undefined;\n \n // 物料库操作\n addMaterial: (material: Omit<Material, 'id'>) => void;\n updateMaterial: (id: string, updates: Partial<Material>) => void;\n removeMaterial: (id: string) => void;\n \n // 视口操作\n setViewport: (viewport: Partial<EditorState['viewport']>) => void;\n \n // 画布配置操作\n setCanvasConfig: (config: Partial<CanvasConfig>) => void;\n \n // 模式切换\n setMode: (mode: EditorState['mode']) => void;\n \n // 线条绘制操作\n startLineDrawing: (material: Material) => void;\n updateLineDrawing: (endPoint: { x: number; y: number }) => void;\n endLineDrawing: () => void;\n cancelLineDrawing: () => void;\n \n // 历史操作\n undo: () => void;\n redo: () => void;\n \n // 导入导出\n exportScheme: () => SchemeJSON;\n importScheme: (scheme: SchemeJSON) => void;\n \n // 事件记录\n recordEvent: (event: EditorEvent) => void;\n}\n\nexport const useEditorStore = create<EditorStore>()(\n immer((set, get) => ({\n ...initialState,\n // ========== 节点操作 ==========\n addNode: (node, autoSelect = true) => {\n set((state) => {\n // 如果传入的节点已有 id,则保留;否则生成新 id\n const newNode = {\n ...node,\n id: node.id || nanoid(),\n } as Node;\n state.nodes.push(newNode);\n if (autoSelect) {\n state.selectedNodeId = newNode.id;\n state.history.past.push(createEvent('NODE_SELECT', newNode.id));\n }\n });\n },\n\n updateNode: (id, updates) => {\n set((state) => {\n const node = state.nodes.find((n) => n.id === id);\n if (node) {\n Object.assign(node, updates);\n state.history.past.push(createEvent('PROPERTY_CHANGE', id, updates));\n }\n });\n },\n\n updateNodeStyle: (id, style) => {\n set((state) => {\n const node = state.nodes.find((n) => n.id === id);\n if (node) {\n Object.assign(node.normalStyle, style);\n state.history.past.push(createEvent('PROPERTY_CHANGE', id, { normalStyle: style }));\n }\n });\n },\n\n updateNodeContent: (id, content) => {\n set((state) => {\n const node = state.nodes.find((n) => n.id === id);\n if (node) {\n // 创建新的 contentInfo 对象以确保引用变化\n node.contentInfo = { ...node.contentInfo, ...content };\n state.history.past.push(createEvent('PROPERTY_CHANGE', id, { contentInfo: content }));\n }\n });\n },\n\n updateNodeControl: (id, control) => {\n set((state) => {\n const node = state.nodes.find((n) => n.id === id);\n if (node) {\n Object.assign(node.controlInfo, control);\n state.history.past.push(createEvent('PROPERTY_CHANGE', id, { controlInfo: control }));\n }\n });\n },\n\n removeNode: (id) => {\n set((state) => {\n const index = state.nodes.findIndex((n) => n.id === id);\n if (index !== -1) {\n state.nodes.splice(index, 1);\n if (state.selectedNodeId === id) {\n state.selectedNodeId = null;\n state.selectedStatusId = null;\n }\n state.history.past.push(createEvent('NODE_DELETE', id));\n }\n });\n },\n\n selectNode: (id) => {\n set((state) => {\n state.selectedNodeId = id;\n state.selectedStatusId = null;\n if (id) {\n state.history.past.push(createEvent('NODE_SELECT', id));\n }\n });\n },\n\n // ========== 状态操作 ==========\n addStatus: (nodeId, status) => {\n set((state) => {\n const node = state.nodes.find((n) => n.id === nodeId);\n if (!node) return;\n\n const newStatus: NodeStatus = {\n ...status,\n id: nanoid(),\n };\n\n node.contentInfo.statusList.push(newStatus);\n state.history.past.push(createEvent('MATERIAL_STATUS_CHANGE', nodeId, { statusId: newStatus.id }));\n });\n },\n\n removeStatus: (nodeId, statusId) => {\n set((state) => {\n const node = state.nodes.find((n) => n.id === nodeId);\n if (!node) return;\n\n const index = node.contentInfo.statusList.findIndex((s) => s.id === statusId);\n if (index !== -1) {\n node.contentInfo.statusList.splice(index, 1);\n if (node.contentInfo.currentStatusId === statusId) {\n node.contentInfo.currentStatusId = undefined;\n }\n if (state.selectedStatusId === statusId) {\n state.selectedStatusId = null;\n }\n }\n });\n },\n\n updateStatus: (nodeId, statusId, updates) => {\n set((state) => {\n const node = state.nodes.find((n) => n.id === nodeId);\n if (!node) return;\n\n const status = node.contentInfo.statusList.find((s) => s.id === statusId);\n if (status) {\n Object.assign(status, updates);\n }\n });\n },\n\n selectStatus: (statusId) => {\n set((state) => {\n state.selectedStatusId = statusId;\n });\n },\n\n evaluateCurrentStatus: (nodeId, data) => {\n const state = get();\n const node = state.nodes.find((n) => n.id === nodeId);\n if (!node) return undefined;\n\n for (const status of node.contentInfo.statusList) {\n try {\n const fn = new Function('data', 'bindCodes', 'status', status.expression);\n const result = fn(data, status.bindCodes, status);\n if (result === true) {\n return status.id;\n }\n } catch (error) {\n console.warn('状态表达式执行失败:', status.name, error);\n }\n }\n\n return undefined;\n },\n\n // ========== 物料库操作 ==========\n addMaterial: (material) => {\n set((state) => {\n const newMaterial = {\n ...material,\n id: nanoid(),\n };\n state.materials.push(newMaterial as Material);\n state.history.past.push(createEvent('MATERIAL_ADD', newMaterial.id));\n });\n },\n\n updateMaterial: (id, updates) => {\n set((state) => {\n const material = state.materials.find((m) => m.id === id);\n if (material) {\n Object.assign(material, updates);\n }\n });\n },\n\n removeMaterial: (id) => {\n set((state) => {\n const index = state.materials.findIndex((m) => m.id === id);\n if (index !== -1) {\n state.materials.splice(index, 1);\n }\n });\n },\n\n // ========== 视口操作 ==========\n setViewport: (viewport) => {\n set((state) => {\n Object.assign(state.viewport, viewport);\n });\n },\n\n // ========== 画布配置操作 ==========\n setCanvasConfig: (config) => {\n set((state) => {\n state.canvas = { ...state.canvas, ...config };\n });\n },\n\n // ========== 模式切换 ==========\n setMode: (mode) => {\n set((state) => {\n state.mode = mode;\n });\n },\n\n // ========== 线条绘制操作 ==========\n startLineDrawing: (material) => {\n set((state) => {\n state.mode = 'line-draw';\n state.lineDrawing = {\n isDrawing: true,\n material,\n startPoint: null,\n endPoint: null,\n };\n });\n },\n\n updateLineDrawing: (endPoint) => {\n set((state) => {\n if (state.lineDrawing.isDrawing) {\n state.lineDrawing.endPoint = endPoint;\n }\n });\n },\n\n endLineDrawing: () => {\n set((state) => {\n state.mode = 'select';\n state.lineDrawing = {\n isDrawing: false,\n material: null,\n startPoint: null,\n endPoint: null,\n };\n });\n },\n\n cancelLineDrawing: () => {\n set((state) => {\n state.mode = 'select';\n state.lineDrawing = {\n isDrawing: false,\n material: null,\n startPoint: null,\n endPoint: null,\n };\n });\n },\n\n // ========== 历史操作 ==========\n undo: () => {\n set((state) => {\n const lastEvent = state.history.past.pop();\n if (lastEvent) {\n state.history.future.push(lastEvent);\n }\n });\n },\n\n redo: () => {\n set((state) => {\n const nextEvent = state.history.future.pop();\n if (nextEvent) {\n state.history.past.push(nextEvent);\n }\n });\n },\n\n recordEvent: (event) => {\n set((state) => {\n state.history.past.push(event);\n state.history.future = [];\n });\n },\n\n // ========== 导入导出 ==========\n exportScheme: () => {\n const state = get();\n return {\n version: '1.1.0',\n nodes: state.nodes,\n materials: state.materials,\n viewport: state.viewport,\n metadata: {\n name: '未命名组态',\n description: '',\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n },\n };\n },\n\n importScheme: (scheme) => {\n set((state) => {\n state.nodes = scheme.nodes || [];\n state.materials = scheme.materials || [];\n state.viewport = scheme.viewport || initialState.viewport;\n state.selectedNodeId = null;\n state.selectedStatusId = null;\n state.history = { past: [], future: [] };\n });\n },\n }))\n);\n","import type { Material, Node, NodeStatus } from '../types';\nimport { nanoid } from 'nanoid';\n\n// 初始化物料库数据\nexport const initMaterials: Material[] = [\n // 基础形状\n {\n id: nanoid(),\n name: '矩形',\n type: 'IMAGE',\n src: `data:image/svg+xml,${encodeURIComponent(`<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"100\" height=\"60\"><rect width=\"100\" height=\"60\" fill=\"#1890ff\" rx=\"4\"/></svg>`)}`,\n },\n {\n id: nanoid(),\n name: '圆形',\n type: 'IMAGE',\n src: `data:image/svg+xml,${encodeURIComponent(`<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"80\" height=\"80\"><circle cx=\"40\" cy=\"40\" r=\"38\" fill=\"#52c41a\"/></svg>`)}`,\n },\n {\n id: nanoid(),\n name: '圆角矩形',\n type: 'IMAGE',\n src: `data:image/svg+xml,${encodeURIComponent(`<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"100\" height=\"60\"><rect width=\"100\" height=\"60\" fill=\"#faad14\" rx=\"20\"/></svg>`)}`,\n },\n \n // 设备图标\n {\n id: nanoid(),\n name: '阀门',\n type: 'IMAGE',\n src: `data:image/svg+xml,${encodeURIComponent(`<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"60\" height=\"60\"><path d=\"M10 20 L30 10 L50 20 L50 40 L30 50 L10 40 Z\" fill=\"#bfbfbf\" stroke=\"#595959\" stroke-width=\"2\"/><circle cx=\"30\" cy=\"30\" r=\"8\" fill=\"#1890ff\"/></svg>`)}`,\n },\n {\n id: nanoid(),\n name: '泵',\n type: 'IMAGE',\n src: `data:image/svg+xml,${encodeURIComponent(`<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"60\" height=\"60\"><circle cx=\"30\" cy=\"35\" r=\"20\" fill=\"#bfbfbf\" stroke=\"#595959\" stroke-width=\"2\"/><rect x=\"25\" y=\"5\" width=\"10\" height=\"15\" fill=\"#595959\"/><path d=\"M30 20 L30 35 M20 30 Q30 45 40 30\" stroke=\"#595959\" stroke-width=\"2\" fill=\"none\"/></svg>`)}`,\n },\n {\n id: nanoid(),\n name: '罐体',\n type: 'IMAGE',\n src: `data:image/svg+xml,${encodeURIComponent(`<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"60\" height=\"80\"><ellipse cx=\"30\" cy=\"10\" rx=\"25\" ry=\"10\" fill=\"#d9d9d9\" stroke=\"#595959\" stroke-width=\"2\"/><rect x=\"5\" y=\"10\" width=\"50\" height=\"60\" fill=\"#f0f0f0\" stroke=\"#595959\" stroke-width=\"2\"/><ellipse cx=\"30\" cy=\"70\" rx=\"25\" ry=\"10\" fill=\"#d9d9d9\" stroke=\"#595959\" stroke-width=\"2\"/></svg>`)}`,\n },\n \n // 文本\n {\n id: nanoid(),\n name: '文本标签',\n type: 'TEXT',\n content: {\n label: '标签',\n value: '值',\n labelStyle: {\n fontSize: 14,\n fontWeight: 'bold',\n color: '#262626',\n textAlign: 'left',\n },\n valueStyle: {\n fontSize: 14,\n fontWeight: 'normal',\n color: '#1890ff',\n textAlign: 'left',\n },\n },\n },\n \n // 线条 - 通用线条物料,通过属性配置实现不同线型\n {\n id: nanoid(),\n name: '线条',\n type: 'LINE',\n config: {\n thickness: 2,\n lineWeight: 2,\n color: '#262626',\n lineType: 'solid',\n },\n },\n];\n\n// 创建默认状态\nexport const createDefaultStatus = (material: Material): NodeStatus => ({\n id: nanoid(),\n name: '默认状态',\n expression: 'return true;',\n material: { ...material, id: nanoid() },\n bindCodes: [],\n});\n\n// 创建默认节点\nexport const createDefaultNode = (\n x: number,\n y: number,\n material?: Material\n): Node => {\n // 如果是群组物料,创建群组节点\n if (material?.type === 'CUSTOM' && material.config?.nodes) {\n const children = material.config.nodes.map((childNode: Node) => ({\n ...childNode,\n id: nanoid(), // 重新生成子节点ID\n }));\n \n // 计算群组边界\n let minX = Infinity, minY = Infinity;\n let maxX = -Infinity, maxY = -Infinity;\n \n children.forEach((child: Node) => {\n const cx = child.normalStyle.x || 0;\n const cy = child.normalStyle.y || 0;\n const cw = child.normalStyle.width || 0;\n const ch = child.normalStyle.height || 0;\n minX = Math.min(minX, cx);\n minY = Math.min(minY, cy);\n maxX = Math.max(maxX, cx + cw);\n maxY = Math.max(maxY, cy + ch);\n });\n \n // 调整子节点位置为相对坐标,并移除 scale 避免双重缩放\n const relativeChildren = children.map((child: Node) => ({\n ...child,\n normalStyle: {\n ...child.normalStyle,\n x: (child.normalStyle.x || 0) - minX,\n y: (child.normalStyle.y || 0) - minY,\n scale: undefined, // 移除 scale,由父级容器统一控制\n },\n }));\n \n return {\n id: nanoid(),\n name: material.name || '群组节点',\n type: 'group',\n normalStyle: {\n width: maxX - minX,\n height: maxY - minY,\n x,\n y,\n // 不设置背景和边框,由 NodeRenderer 控制\n },\n contentInfo: {\n statusList: [],\n currentStatusId: undefined,\n },\n controlInfo: {\n isDraggable: true,\n isClickable: true,\n isResizable: true,\n isSelectable: true,\n },\n children: relativeChildren,\n } as Node;\n }\n\n // 普通节点\n return {\n id: nanoid(),\n name: '新节点',\n type: 'normal',\n normalStyle: {\n width: 120,\n height: 100,\n x,\n y,\n background: 'transparent',\n padding: 8,\n },\n contentInfo: {\n statusList: material ? [createDefaultStatus(material)] : [],\n currentStatusId: undefined,\n },\n controlInfo: {\n isDraggable: true,\n isClickable: true,\n isResizable: true,\n isSelectable: true,\n },\n };\n};\n","import React, { useEffect, useState } from \"react\";\nimport { Collapse, Upload, Button, List, Empty, Typography, Image, Tag } from \"antd\";\nimport { UploadOutlined, DeleteOutlined, EditOutlined } from \"@ant-design/icons\";\nimport { useEditorStore } from \"../../store/editorStore\";\nimport { initMaterials } from \"../../utils/initData\";\nimport type { Material } from \"../../types\";\n\nconst { Panel } = Collapse;\nconst { Text } = Typography;\n\nexport const MaterialPanel: React.FC = () => {\n const {\n materials,\n addMaterial,\n removeMaterial,\n selectedStatusId,\n selectStatus,\n mode,\n lineDrawing,\n startLineDrawing,\n cancelLineDrawing,\n } = useEditorStore();\n const [activeKeys, setActiveKeys] = useState<string[]>([\n \"basic\",\n \"device\",\n \"text\",\n \"line\",\n ]);\n\n // 初始化默认物料\n // useEffect(() => {\n // if (materials.length === 0) {\n // initMaterials.forEach((m) => addMaterial(m));\n // }\n // }, []);\n\n // 处理 SVG 上传\n const handleUpload = (file: File) => {\n const reader = new FileReader();\n reader.onload = (e) => {\n const src = e.target?.result as string;\n addMaterial({\n name: file.name.replace(\".svg\", \"\"),\n type: \"IMAGE\",\n src,\n } as Material);\n };\n reader.readAsDataURL(file);\n return false;\n };\n\n // 按类型分组物料\n const groupedMaterials = {\n basic: materials.filter((m) =>\n [\"矩形\", \"圆形\", \"圆角矩形\"].includes(m.name),\n ),\n device: materials.filter(\n (m) =>\n [\"阀门\", \"泵\", \"罐体\"].includes(m.name) ||\n (m.type === \"IMAGE\" &&\n ![\"矩形\", \"圆形\", \"圆角矩形\"].includes(m.name) &&\n m.name !== \"自定义\"),\n ),\n text: materials.filter((m) => m.type === \"TEXT\"),\n line: materials.filter((m) => m.type === \"LINE\"),\n group: materials.filter((m) => m.type === \"CUSTOM\" && m.config?.nodes),\n custom: materials.filter(\n (m) =>\n (m.type === \"CUSTOM\" && !m.config?.nodes) ||\n (m.type === \"IMAGE\" &&\n ![\"矩形\", \"圆形\", \"圆角矩形\", \"阀门\", \"泵\", \"罐体\"].includes(m.name)),\n ),\n };\n\n // 处理拖拽开始\n const handleDragStart = (e: React.DragEvent, material: Material) => {\n e.dataTransfer.effectAllowed = \"copy\";\n e.dataTransfer.setData(\"application/json\", JSON.stringify(material));\n const dragImage = e.currentTarget.querySelector(\n \".material-preview\",\n ) as HTMLElement;\n if (dragImage) {\n e.dataTransfer.setDragImage(dragImage, 20, 20);\n }\n };\n\n // 处理线条物料点击(进入绘制模式)\n const handleLineMaterialClick = (material: Material) => {\n if (material.type === \"LINE\") {\n startLineDrawing(material);\n }\n };\n\n // 渲染物料项\n const renderMaterialItem = (material: Material, isLineMode: boolean = false) => {\n // 物料库中的物料不再被\"选中\",而是用于拖拽创建节点或在属性面板中选择绑定到状态\n const isSelected = false;\n // 确保 isLineMode 是布尔值\n const isLineMaterial = isLineMode === true;\n // 只有当前物料是正在绘制的那条线时才显示\"绘制中\"\n const isDrawingLine = mode === \"line-draw\" && isLineMaterial && lineDrawing.material?.id === material.id;\n\n return (\n <List.Item\n key={material.id}\n draggable={!isLineMaterial}\n onDragStart={(e) => handleDragStart(e, material)}\n onClick={() => isLineMaterial && handleLineMaterialClick(material)}\n className={`\n rounded-lg transition-all duration-200 select-none\n ${isLineMaterial ? \"cursor-pointer\" : \"cursor-move\"}\n ${isSelected ? \"bg-blue-100 ring-2 ring-blue-400\" : \"hover:bg-gray-100\"}\n ${isDrawingLine ? \"bg-blue-50 ring-2 ring-blue-400\" : \"\"}\n `}\n actions={[\n isLineMaterial ? (\n <Button\n key=\"draw\"\n type=\"text\"\n size=\"small\"\n icon={<EditOutlined />}\n onClick={(e) => {\n e.stopPropagation();\n handleLineMaterialClick(material);\n }}\n >\n 绘制\n </Button>\n ) : null,\n <Button\n key=\"delete\"\n type=\"text\"\n size=\"small\"\n danger\n icon={<DeleteOutlined />}\n onClick={(e) => {\n e.stopPropagation();\n removeMaterial(material.id);\n }}\n />,\n ].filter(Boolean)}>\n <div className={`flex items-center gap-3 w-full py-2 ${isLineMaterial ? \"\" : \"pointer-events-none\"}`}>\n <div className=\"material-preview w-12 h-12 flex items-center justify-center bg-white rounded border border-gray-200\">\n {material.type === \"IMAGE\" && (material as any).src ? (\n <Image\n src={(material as any).src}\n alt={material.name}\n width={40}\n height={40}\n preview={false}\n />\n ) : material.type === \"TEXT\" ? (\n <span className=\"text-xs text-gray-500\">T</span>\n ) : material.type === \"LINE\" ? (\n <div className=\"w-8 h-0.5 bg-gray-400\" />\n ) : material.type === \"CUSTOM\" && material.config?.nodes ? (\n <span className=\"text-xs text-blue-500 font-bold\">G</span>\n ) : (\n <span className=\"text-xs text-gray-500\">?</span>\n )}\n </div>\n\n <div className=\"flex-1 min-w-0\">\n <Text strong className=\"block truncate\">\n {material.name}\n </Text>\n <div className=\"flex items-center gap-1\">\n <Text type=\"secondary\" className=\"text-xs\">\n {material.type}\n </Text>\n {isDrawingLine && (\n <Tag color=\"blue\" className=\"text-xs\">\n 绘制中\n </Tag>\n )}\n </div>\n </div>\n </div>\n </List.Item>\n );\n };\n\n return (\n <div className=\"h-full flex flex-col bg-white border-r border-gray-200\">\n <div className=\"p-4 border-b border-gray-200\">\n <h3 className=\"text-lg font-semibold text-gray-800\">物料库</h3>\n <Text type=\"secondary\" className=\"text-sm\">\n 拖拽物料到画布创建节点\n </Text>\n </div>\n\n <div className=\"p-3 border-b border-gray-200\">\n <Upload\n accept=\".svg\"\n beforeUpload={handleUpload}\n showUploadList={false}>\n <Button icon={<UploadOutlined />} block type=\"dashed\">\n 上传 SVG\n </Button>\n </Upload>\n </div>\n\n <div className=\"flex-1 overflow-y-auto p-2\">\n <Collapse\n activeKey={activeKeys}\n onChange={(keys) => setActiveKeys(keys as string[])}\n ghost\n expandIconPosition=\"end\">\n <Panel header=\"基础形状\" key=\"basic\">\n <List\n dataSource={groupedMaterials.basic}\n renderItem={(item) => renderMaterialItem(item, false)}\n locale={{\n emptyText: (\n <Empty\n description=\"暂无物料\"\n image={Empty.PRESENTED_IMAGE_SIMPLE}\n />\n ),\n }}\n />\n </Panel>\n\n <Panel header=\"设备图标\" key=\"device\">\n <List\n dataSource={groupedMaterials.device}\n renderItem={(item) => renderMaterialItem(item, false)}\n locale={{\n emptyText: (\n <Empty\n description=\"暂无物料\"\n image={Empty.PRESENTED_IMAGE_SIMPLE}\n />\n ),\n }}\n />\n </Panel>\n\n <Panel header=\"文本\" key=\"text\">\n <List\n dataSource={groupedMaterials.text}\n renderItem={(item) => renderMaterialItem(item, false)}\n locale={{\n emptyText: (\n <Empty\n description=\"暂无物料\"\n image={Empty.PRESENTED_IMAGE_SIMPLE}\n />\n ),\n }}\n />\n </Panel>\n\n <Panel \n header={\n <div className=\"flex items-center justify-between\">\n <span>线条</span>\n {mode === \"line-draw\" && (\n <Tag color=\"blue\" className=\"text-xs\">\n 绘制模式\n </Tag>\n )}\n </div>\n } \n key=\"line\">\n <List\n dataSource={groupedMaterials.line}\n renderItem={(item) => renderMaterialItem(item, true)}\n locale={{\n emptyText: (\n <Empty\n description=\"暂无物料\"\n image={Empty.PRESENTED_IMAGE_SIMPLE}\n />\n ),\n }}\n />\n {mode === \"line-draw\" && (\n <div className=\"mt-2 p-2 bg-blue-50 rounded text-xs text-blue-600\">\n <div>点击线条物料开始绘制</div>\n <div>点击画布确定起点和终点</div>\n </div>\n )}\n </Panel>\n\n {groupedMaterials.group.length > 0 && (\n <Panel header=\"群组\" key=\"group\">\n <List\n dataSource={groupedMaterials.group}\n renderItem={(item) => renderMaterialItem(item, false)}\n locale={{\n emptyText: (\n <Empty\n description=\"暂无物料\"\n image={Empty.PRESENTED_IMAGE_SIMPLE}\n />\n ),\n }}\n />\n </Panel>\n )}\n\n {groupedMaterials.custom.length > 0 && (\n <Panel header=\"自定义\" key=\"custom\">\n <List\n dataSource={groupedMaterials.custom}\n renderItem={(item) => renderMaterialItem(item, false)}\n locale={{\n emptyText: (\n <Empty\n description=\"暂无物料\"\n image={Empty.PRESENTED_IMAGE_SIMPLE}\n />\n ),\n }}\n />\n </Panel>\n )}\n </Collapse>\n </div>\n\n <div className=\"p-3 border-t border-gray-200 bg-gray-50\">\n <Text type=\"secondary\" className=\"text-xs\">\n {mode === \"line-draw\" ? (\n <>\n 💡 提示:点击绘制线段,可连续绘制多段线,双击结束绘制,ESC 取消\n </>\n ) : (\n <>\n 💡 提示:拖拽物料到画布创建节点,点击线条物料进入绘制模式\n </>\n )}\n </Text>\n </div>\n </div>\n );\n};\n","import React, { useMemo, useState, useCallback, useRef, useEffect } from \"react\";\nimport type { CSSProperties } from \"react\";\nimport type { Node, Material, NodeStatus, LineMaterial } from \"../../types\";\nimport { Image, Typography } from \"antd\";\n\nconst { Text } = Typography;\n\ninterface NodeRendererProps {\n node: Node;\n isSelected?: boolean;\n onClick?: (e: React.MouseEvent) => void;\n onMouseDown?: (e: React.MouseEvent) => void;\n // 外部数据,用于状态表达式计算\n data?: any;\n // 更新节点回调\n onUpdateNode?: (nodeId: string, updates: Partial<Node>) => void;\n // 当前缩放比例\n scale?: number;\n}\n\n// 执行状态表达式\nconst evaluateStatusExpression = (status: NodeStatus, data?: any): boolean => {\n try {\n //生成函数所需要的参数列表\n const params =\n data && Array.isArray(data)\n ? data.map((d: any, index: number) => d.paramsName)\n : [\"A\"]; //大写英文字符\n const fn = new Function(...params, status.expression);\n const result = fn(...data.map((d: any) => d.value));\n console.log(\n `Evaluating status [${status.name}] with data:`,\n data,\n \"Result:\",\n result,\n );\n return result === true;\n } catch (error) {\n console.warn(`状态表达式执行失败 [${status.name}]:`, error);\n return false;\n }\n};\n\n// 找到第一个满足条件的状态\nconst findActiveStatus = (\n statusList: NodeStatus[],\n data?: any,\n): NodeStatus | undefined => {\n for (const status of statusList) {\n console.log(status, \"status\");\n let bindData: Record<string, any>[] = [];\n if (Array.isArray(data)) {\n console.log(status.bindCodes, \"bindCodes\");\n bindData = data.filter((d: any) =>\n status.bindCodes?.includes(d.paramsCode),\n );\n } else {\n bindData = data;\n }\n if (evaluateStatusExpression(status, bindData)) {\n return status;\n }\n }\n return undefined;\n};\n\n// 从数据中获取字段值\nconst getDataValue = (\n data: any,\n valueSourceCode?: string,\n): { value: any; unit?: string } => {\n if (!valueSourceCode || !data) {\n return { value: undefined };\n }\n\n // 数据是数组格式:查找 paramsCode 匹配的项\n if (Array.isArray(data)) {\n const dataItem = data.find((d) => d.paramsCode === valueSourceCode);\n if (dataItem) {\n return {\n value: dataItem.value,\n unit: dataItem.unit,\n };\n }\n }\n // 数据是对象格式:直接取字段\n else if (typeof data === \"object\" && valueSourceCode in data) {\n return {\n value: data[valueSourceCode],\n unit: data.unit,\n };\n }\n\n return { value: undefined };\n};\n\n// 格式化数值,根据小数位配置\nconst formatValue = (value: any, decimals?: number): string => {\n if (value === undefined || value === null || value === \"\") return \"\";\n\n // -1 表示不格式化\n if (decimals === -1) return String(value);\n\n // 检查是否为有效数值\n const num = Number(value);\n if (isNaN(num)) return String(value);\n\n // 格式化小数位\n return num.toFixed(decimals ?? 2);\n};\n\n// 渲染物料\nconst renderMaterial = (material: Material, data?: any, isSelected?: boolean, node?: Node) => {\n switch (material.type) {\n case \"IMAGE\":\n const imageMaterial = material as any;\n const bgColor = imageMaterial.backgroundColor;\n const fillColor = imageMaterial.fillColor;\n\n // 如果是基本形状且有填充颜色,动态生成 SVG\n let src = imageMaterial.src;\n if (fillColor && src && src.includes('data:image/svg+xml')) {\n if (material.name === '矩形') {\n src = `data:image/svg+xml,${encodeURIComponent(`<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"100\" height=\"60\"><rect width=\"100\" height=\"60\" fill=\"${fillColor}\" rx=\"4\"/></svg>`)}`;\n } else if (material.name === '圆形') {\n src = `data:image/svg+xml,${encodeURIComponent(`<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"80\" height=\"80\"><circle cx=\"40\" cy=\"40\" r=\"38\" fill=\"${fillColor}\"/></svg>`)}`;\n } else if (material.name === '圆角矩形') {\n src = `data:image/svg+xml,${encodeURIComponent(`<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"100\" height=\"60\"><rect width=\"100\" height=\"60\" fill=\"${fillColor}\" rx=\"20\"/></svg>`)}`;\n }\n }\n\n return (\n <div\n className=\"w-full h-full flex items-center justify-center overflow-hidden\"\n style={{ backgroundColor: bgColor }}\n >\n {src ? (\n <img\n src={src}\n alt={material.name}\n style={{\n width: \"100%\",\n height: \"100%\",\n objectFit: \"contain\",\n }}\n />\n ) : (\n <div className=\"w-full h-full flex items-center justify-center\">\n <span className=\"text-gray-400 text-xs\">无图片</span>\n </div>\n )}\n </div>\n );\n\n case \"TEXT\":\n const textMaterial = material as any;\n const {\n label,\n value: configValue,\n valueSourceCode,\n unit: configUnit,\n decimals,\n labelStyle,\n valueStyle,\n customStyle,\n } = textMaterial.content || {};\n\n // 如果有 valueSourceCode,从数据中获取值\n const { value: dataValue, unit: dataUnit } = valueSourceCode\n ? getDataValue(data, valueSourceCode)\n : { value: undefined, unit: undefined };\n\n // 优先使用数据中的值,否则使用配置的默认值\n const rawValue = dataValue !== undefined ? dataValue : configValue;\n // 格式化数值\n const displayValue = formatValue(rawValue, decimals);\n // 优先使用配置的单位,否则使用数据中的单位\n const displayUnit = configUnit || dataUnit || \"\";\n\n return (\n <div\n className=\"w-full h-full flex flex-col justify-center gap-1\"\n style={{ ...customStyle }}>\n {label && (\n <Text\n style={{\n fontSize: 14,\n fontWeight: \"bold\",\n color: \"#262626\",\n textAlign: \"left\",\n ...labelStyle,\n }}>\n {label}\n </Text>\n )}\n {displayValue && (\n <Text\n style={{\n fontSize: 14,\n color: \"#1890ff\",\n textAlign: \"left\",\n ...valueStyle,\n }}>\n {displayValue}\n {displayUnit ? ` ${displayUnit}` : \"\"}\n </Text>\n )}\n </div>\n );\n\n case \"LINE\":\n const lineMaterial = material as any;\n const {\n thickness = 2,\n color = \"#d9d9d9\",\n dashed = false,\n lineType = dashed ? \"dashed\" : \"solid\",\n lineWeight = thickness,\n // 起点和终点的相对坐标\n startX = 0,\n startY = 0,\n endX = 100,\n endY = 0,\n } = lineMaterial.config || {};\n\n // 根据线型计算 dash array\n const getDashArray = (type: string): string => {\n const baseWeight = Math.max(lineWeight, 1);\n switch (type) {\n case \"solid\":\n return \"\";\n case \"dashed\":\n return `${baseWeight * 8},${baseWeight * 4}`;\n case \"center\":\n return `${baseWeight * 12},${baseWeight * 3},${baseWeight * 2},${baseWeight * 3}`;\n case \"phantom\":\n return `${baseWeight * 12},${baseWeight * 3},${baseWeight * 2},${baseWeight * 3},${baseWeight * 2},${baseWeight * 3}`;\n case \"dot\":\n return `${baseWeight},${baseWeight * 3}`;\n case \"dash-dot\":\n return `${baseWeight * 8},${baseWeight * 3},${baseWeight},${baseWeight * 3}`;\n default:\n return \"\";\n }\n };\n\n const dashArray = getDashArray(lineType);\n\n // 选中时高亮颜色\n const strokeColor = isSelected ? \"#1890ff\" : color;\n\n // 直接使用保存的相对坐标画线\n // 这和预览线的逻辑一模一样:从起点画到终点\n return (\n <div className=\"w-full h-full relative\" style={{ overflow: \"visible\" }}>\n <svg\n className=\"absolute top-0 left-0\"\n width=\"100%\"\n height=\"100%\"\n style={{ overflow: \"visible\", pointerEvents: \"none\" }}>\n {/* 看不见的宽线用于捕获点击事件 */}\n <line\n x1={startX}\n y1={startY}\n x2={endX}\n y2={endY}\n stroke=\"transparent\"\n strokeWidth={Math.max(lineWeight, 10)}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n style={{ pointerEvents: \"stroke\", cursor: \"pointer\" }}\n />\n {/* 实际显示的线 */}\n <line\n x1={startX}\n y1={startY}\n x2={endX}\n y2={endY}\n stroke={strokeColor}\n strokeWidth={lineWeight}\n strokeDasharray={dashArray}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n style={{ pointerEvents: \"none\" }}\n />\n </svg>\n </div>\n );\n\n case \"CUSTOM\":\n const customMaterial = material as any;\n if (customMaterial.render) {\n return customMaterial.render({});\n }\n return (\n <div className=\"w-full h-full flex items-center justify-center bg-gray-100\">\n <span className=\"text-gray-400 text-xs\">自定义组件</span>\n </div>\n );\n\n default:\n return (\n <div className=\"w-full h-full flex items-center justify-center bg-gray-100\">\n <span className=\"text-gray-400 text-xs\">未知类型</span>\n </div>\n );\n }\n};\n\nconst NodeRendererComponent: React.FC<NodeRendererProps> = ({\n node,\n isSelected = false,\n onClick,\n onMouseDown,\n data,\n onUpdateNode,\n scale: canvasScale = 1,\n}) => {\n const { normalStyle, contentInfo, controlInfo } = node;\n const { statusList } = contentInfo;\n const { isClickable, isDraggable, isResizable } = controlInfo;\n\n // 使用 ref 存储 onClick,避免 memo 导致的旧闭包问题\n const onClickRef = useRef(onClick);\n useEffect(() => {\n onClickRef.current = onClick;\n }, [onClick]);\n\n // 线条端点拖拽状态\n const [draggingPoint, setDraggingPoint] = useState<'start' | 'end' | null>(null);\n const dragOriginRef = useRef<{\n mouseX: number;\n mouseY: number;\n startX: number;\n startY: number;\n endX: number;\n endY: number;\n nodeX: number;\n nodeY: number;\n } | null>(null);\n // 端点拖拽过程中的最终计算结果,仅在 mouseup 时同步到 store\n const dragResultRef = useRef<{\n nodeX: number; nodeY: number;\n width: number; height: number;\n startX: number; startY: number;\n endX: number; endY: number;\n } | null>(null);\n // 缩放拖拽过程中的最终计算结果\n const resizeResultRef = useRef<{\n x: number; y: number;\n width: number; height: number;\n } | null>(null);\n const nodeRef = useRef<HTMLDivElement>(null);\n\n // 缩放拖拽状态\n const [resizing, setResizing] = useState<{\n corner: 'nw' | 'ne' | 'sw' | 'se';\n startX: number;\n startY: number;\n startWidth: number;\n startHeight: number;\n startNodeX: number;\n startNodeY: number;\n } | null>(null);\n\n // 旋转拖拽状态\n const [rotating, setRotating] = useState<{\n startX: number;\n startY: number;\n startAngle: number;\n centerX: number;\n centerY: number;\n } | null>(null);\n // 旋转过程中的实时角度(ref),防止 React 重渲染覆盖 DOM 操作的角度\n const rotatingAngleRef = useRef<number | null>(null);\n\n // 计算当前应该显示的状态(完全由表达式决定)\n const currentStatus = useMemo(() => {\n if (statusList.length === 0) return undefined;\n\n // 执行状态表达式,找到第一个返回 true 的状态\n const activeStatus = findActiveStatus(statusList, data);\n if (activeStatus) return activeStatus;\n\n // 如果没有状态满足条件,返回第一个状态作为默认\n return statusList[0];\n }, [statusList, data]);\n\n // 获取当前状态绑定的物料\n const currentMaterial = currentStatus?.material;\n\n // 判断当前物料是否是线条\n const isLine = currentMaterial?.type === 'LINE';\n\n // 获取线条配置\n const lineConfig = isLine ? (currentMaterial as LineMaterial).config : null;\n\n // 计算缩放比例\n const nodeScale = normalStyle.scale ?? 1;\n const scaledWidth = (normalStyle.width || 100) * nodeScale;\n const scaledHeight = (normalStyle.height || 100) * nodeScale;\n\n // 通过 DOM 测量推算画布实际缩放比,避免依赖可能不同步的 prop\n const getEffectiveCanvasScale = useCallback(() => {\n const canvasEl = nodeRef.current?.closest('[data-canvas=\"true\"]') as HTMLElement;\n if (!canvasEl) return canvasScale;\n const canvasRect = canvasEl.getBoundingClientRect();\n const logicalWidth = parseFloat(canvasEl.style.width);\n if (!logicalWidth) return canvasScale;\n return canvasRect.width / logicalWidth;\n }, [canvasScale]);\n\n // 处理端点拖拽开始:记录初始鼠标位置和线条配置快照\n const handlePointMouseDown = useCallback((e: React.MouseEvent, point: 'start' | 'end') => {\n e.stopPropagation();\n e.preventDefault();\n dragOriginRef.current = {\n mouseX: e.clientX,\n mouseY: e.clientY,\n startX: lineConfig?.startX || 0,\n startY: lineConfig?.startY || 0,\n endX: lineConfig?.endX || 0,\n endY: lineConfig?.endY || 0,\n nodeX: normalStyle.x || 0,\n nodeY: normalStyle.y || 0,\n };\n setDraggingPoint(point);\n }, [lineConfig, normalStyle.x, normalStyle.y]);\n\n // 处理端点拖拽:拖拽中仅操作 DOM,mouseup 时一次性同步到 store\n useEffect(() => {\n if (!draggingPoint || !isLine || !lineConfig || !onUpdateNode) return;\n\n const handleMouseMove = (e: MouseEvent) => {\n const origin = dragOriginRef.current;\n if (!origin || !nodeRef.current) return;\n\n const effectiveScale = getEffectiveCanvasScale();\n const totalDx = (e.clientX - origin.mouseX) / effectiveScale;\n const totalDy = (e.clientY - origin.mouseY) / effectiveScale;\n\n let newStartX = origin.startX;\n let newStartY = origin.startY;\n let newEndX = origin.endX;\n let newEndY = origin.endY;\n let newNodeX = origin.nodeX;\n let newNodeY = origin.nodeY;\n\n if (draggingPoint === 'start') {\n newStartX = origin.startX + totalDx;\n newStartY = origin.startY + totalDy;\n if (newStartX < 0) {\n newNodeX = origin.nodeX + newStartX;\n newEndX = origin.endX - newStartX;\n newStartX = 0;\n }\n if (newStartY < 0) {\n newNodeY = origin.nodeY + newStartY;\n newEndY = origin.endY - newStartY;\n newStartY = 0;\n }\n } else {\n newEndX = origin.endX + totalDx;\n newEndY = origin.endY + totalDy;\n if (newEndX < 0) {\n newNodeX = origin.nodeX + newEndX;\n newStartX = origin.startX - newEndX;\n newEndX = 0;\n }\n if (newEndY < 0) {\n newNodeY = origin.nodeY + newEndY;\n newStartY = origin.startY - newEndY;\n newEndY = 0;\n }\n }\n\n const minNodeSize = Math.max((lineConfig.lineWeight || 2) * 2, 4);\n const maxX = Math.max(newStartX, newEndX);\n const maxY = Math.max(newStartY, newEndY);\n const newWidth = Math.max(maxX, minNodeSize);\n const newHeight = Math.max(maxY, minNodeSize);\n\n // 存储计算结果供 mouseup 同步\n dragResultRef.current = {\n nodeX: newNodeX, nodeY: newNodeY,\n width: newWidth, height: newHeight,\n startX: newStartX, startY: newStartY,\n endX: newEndX, endY: newEndY,\n };\n\n // 直接操作 DOM —— 不触发 React 渲染\n const el = nodeRef.current;\n el.style.left = `${newNodeX}px`;\n el.style.top = `${newNodeY}px`;\n el.style.width = `${newWidth}px`;\n el.style.height = `${newHeight}px`;\n\n // 更新 SVG 线条坐标\n const lines = el.querySelectorAll('svg line');\n lines.forEach(line => {\n line.setAttribute('x1', String(newStartX));\n line.setAttribute('y1', String(newStartY));\n line.setAttribute('x2', String(newEndX));\n line.setAttribute('y2', String(newEndY));\n });\n\n // 更新端点手柄位置\n const startHandle = el.querySelector('[data-handle=\"start\"]') as HTMLElement;\n const endHandle = el.querySelector('[data-handle=\"end\"]') as HTMLElement;\n if (startHandle) {\n startHandle.style.left = `${newStartX - 6}px`;\n startHandle.style.top = `${newStartY - 6}px`;\n }\n if (endHandle) {\n endHandle.style.left = `${newEndX - 6}px`;\n endHandle.style.top = `${newEndY - 6}px`;\n }\n };\n\n const handleMouseUp = () => {\n const result = dragResultRef.current;\n if (result) {\n onUpdateNode(node.id, {\n normalStyle: {\n ...normalStyle,\n x: result.nodeX,\n y: result.nodeY,\n width: result.width,\n height: result.height,\n },\n contentInfo: {\n ...contentInfo,\n statusList: statusList.map(s => ({\n ...s,\n material: s.material.type === 'LINE' ? {\n ...s.material,\n config: {\n ...lineConfig,\n startX: result.startX,\n startY: result.startY,\n endX: result.endX,\n endY: result.endY,\n },\n } : s.material,\n })),\n },\n });\n }\n setDraggingPoint(null);\n dragOriginRef.current = null;\n dragResultRef.current = null;\n };\n\n window.addEventListener('mousemove', handleMouseMove);\n window.addEventListener('mouseup', handleMouseUp);\n\n return () => {\n window.removeEventListener('mousemove', handleMouseMove);\n window.removeEventListener('mouseup', handleMouseUp);\n };\n }, [draggingPoint, isLine, lineConfig, node.id, normalStyle, contentInfo, statusList, onUpdateNode, getEffectiveCanvasScale]);\n\n // 处理缩放拖拽:拖拽中仅操作 DOM,mouseup 时一次性同步到 store\n useEffect(() => {\n if (!resizing || !onUpdateNode) return;\n\n const handleMouseMove = (e: MouseEvent) => {\n if (!nodeRef.current) return;\n const effectiveScale = getEffectiveCanvasScale();\n const dx = (e.clientX - resizing.startX) / effectiveScale;\n const dy = (e.clientY - resizing.startY) / effectiveScale;\n\n let newWidth = resizing.startWidth;\n let newHeight = resizing.startHeight;\n let newX = resizing.startNodeX;\n let newY = resizing.startNodeY;\n\n switch (resizing.corner) {\n case 'se':\n newWidth = Math.max(20, resizing.startWidth + dx);\n newHeight = Math.max(20, resizing.startHeight + dy);\n break;\n case 'sw':\n newWidth = Math.max(20, resizing.startWidth - dx);\n newHeight = Math.max(20, resizing.startHeight + dy);\n newX = resizing.startNodeX + (resizing.startWidth - newWidth);\n break;\n case 'ne':\n newWidth = Math.max(20, resizing.startWidth + dx);\n newHeight = Math.max(20, resizing.startHeight - dy);\n newY = resizing.startNodeY + (resizing.startHeight - newHeight);\n break;\n case 'nw':\n newWidth = Math.max(20, resizing.startWidth - dx);\n newHeight = Math.max(20, resizing.startHeight - dy);\n newX = resizing.startNodeX + (resizing.startWidth - newWidth);\n newY = resizing.startNodeY + (resizing.startHeight - newHeight);\n break;\n }\n\n resizeResultRef.current = { x: newX, y: newY, width: newWidth, height: newHeight };\n\n const el = nodeRef.current;\n el.style.left = `${newX}px`;\n el.style.top = `${newY}px`;\n el.style.width = `${newWidth}px`;\n el.style.height = `${newHeight}px`;\n };\n\n const handleMouseUp = () => {\n const result = resizeResultRef.current;\n if (result) {\n onUpdateNode(node.id, {\n normalStyle: {\n ...normalStyle,\n x: result.x,\n y: result.y,\n width: result.width,\n height: result.height,\n },\n });\n }\n setResizing(null);\n resizeResultRef.current = null;\n };\n\n window.addEventListener('mousemove', handleMouseMove);\n window.addEventListener('mouseup', handleMouseUp);\n\n return () => {\n window.removeEventListener('mousemove', handleMouseMove);\n window.removeEventListener('mouseup', handleMouseUp);\n };\n }, [resizing, onUpdateNode, node.id, normalStyle, getEffectiveCanvasScale]);\n\n // 处理缩放开始\n const handleResizeStart = useCallback((e: React.MouseEvent, corner: 'nw' | 'ne' | 'sw' | 'se') => {\n e.stopPropagation();\n e.preventDefault();\n setResizing({\n corner,\n startX: e.clientX,\n startY: e.clientY,\n startWidth: normalStyle.width || 100,\n startHeight: normalStyle.height || 100,\n startNodeX: normalStyle.x || 0,\n startNodeY: normalStyle.y || 0,\n });\n }, [normalStyle.width, normalStyle.height, normalStyle.x, normalStyle.y]);\n\n // 处理旋转开始\n const handleRotateStart = useCallback((e: React.MouseEvent) => {\n e.stopPropagation();\n e.preventDefault();\n\n // 计算节点中心点(屏幕坐标)\n const rect = nodeRef.current?.getBoundingClientRect();\n if (!rect) return;\n\n setRotating({\n startX: e.clientX,\n startY: e.clientY,\n startAngle: normalStyle.rotate || 0,\n centerX: rect.left + rect.width / 2,\n centerY: rect.top + rect.height / 2,\n });\n }, [normalStyle.rotate]);\n\n // 处理旋转拖拽:仅通过直接 DOM 操作 + ref 更新角度,不触发 React 渲染\n useEffect(() => {\n if (!rotating) return;\n\n const handleMouseMove = (e: MouseEvent) => {\n const dx = e.clientX - rotating.centerX;\n const dy = e.clientY - rotating.centerY;\n const angle = Math.atan2(dy, dx) * (180 / Math.PI);\n\n let newAngle = (angle + 90) % 360;\n if (newAngle < 0) newAngle += 360;\n\n // 同步更新 ref 和 DOM,确保 React 重渲染时 containerStyle 与 DOM 一致\n rotatingAngleRef.current = newAngle;\n if (nodeRef.current) {\n const extra = normalStyle.transform || '';\n nodeRef.current.style.transform = `rotate(${newAngle}deg) ${extra}`.trim();\n }\n };\n\n const handleMouseUp = () => {\n const finalAngle = rotatingAngleRef.current ?? rotating.startAngle;\n rotatingAngleRef.current = null;\n\n if (onUpdateNode) {\n onUpdateNode(node.id, {\n normalStyle: {\n ...normalStyle,\n rotate: Math.round(finalAngle),\n },\n });\n }\n setRotating(null);\n };\n\n window.addEventListener('mousemove', handleMouseMove);\n window.addEventListener('mouseup', handleMouseUp);\n\n return () => {\n window.removeEventListener('mousemove', handleMouseMove);\n window.removeEventListener('mouseup', handleMouseUp);\n };\n }, [rotating, onUpdateNode, node.id, normalStyle]);\n\n // 判断是否为群组节点\n const isGroup = node.type === 'group';\n\n // 样式计算\n const containerStyle: CSSProperties = {\n position: \"absolute\",\n left: normalStyle.x || 0,\n top: normalStyle.y || 0,\n width: scaledWidth,\n height: scaledHeight,\n // 群组节点不显示背景和边框,只作为容器\n background: isGroup ? 'transparent' : (normalStyle.background || \"transparent\"),\n backgroundImage: isGroup ? undefined : (normalStyle.backgroundImage\n ? `url(${normalStyle.backgroundImage})`\n : undefined),\n backgroundSize: \"cover\",\n backgroundPosition: \"center\",\n padding: Array.isArray(normalStyle.padding)\n ? normalStyle.padding.join(\"px \") + \"px\"\n : normalStyle.padding,\n margin: Array.isArray(normalStyle.margin)\n ? normalStyle.margin.join(\"px \") + \"px\"\n : normalStyle.margin,\n borderRadius: isGroup ? undefined : normalStyle.borderRadius,\n // 线条物料选中时不显示边框,而是通过高亮线条颜色来表示\n // 群组节点选中时显示边框,平时不显示\n border: isSelected && !isLine\n ? \"2px solid #1890ff\"\n : isLine\n ? \"none\"\n : isGroup\n ? \"none\"\n : normalStyle.border || \"1px dashed transparent\",\n // 线条节点需要捕获点击事件,但由内部 SVG 的透明线处理具体点击区域\n pointerEvents: \"auto\",\n opacity: normalStyle.opacity ?? 1,\n transform: `rotate(${rotatingAngleRef.current ?? (normalStyle.rotate || 0)}deg) ${normalStyle.transform || ''}`.trim(),\n transformOrigin: 'center center',\n zIndex: isSelected ? 1000 : (normalStyle.zIndex ?? 1),\n cursor: isDraggable && !draggingPoint ? \"move\" : isClickable ? \"pointer\" : \"default\",\n boxSizing: \"border-box\",\n // 选中、线条和群组节点使用 visible overflow,避免裁剪手柄\n overflow: isSelected || isLine || isGroup ? \"visible\" : \"hidden\",\n };\n\n // 获取线条端点位置用于显示拖拽手柄\n const startPointPos = lineConfig ? { x: lineConfig.startX || 0, y: lineConfig.startY || 0 } : { x: 0, y: 0 };\n const endPointPos = lineConfig ? { x: lineConfig.endX || 0, y: lineConfig.endY || 0 } : { x: 0, y: 0 };\n\n return (\n <div\n ref={nodeRef}\n data-node-id={node.id}\n style={containerStyle}\n onClick={(e) => {\n console.log('NodeRenderer onClick', node.id, 'isClickable:', isClickable);\n // 使用 ref 获取最新函数\n const latestOnClick = onClickRef.current;\n if (isClickable && latestOnClick && !draggingPoint && !resizing && !rotating) {\n e.stopPropagation();\n latestOnClick(e);\n }\n // 如果没有 onClick 处理器,不阻止传播,让父节点(如 group)处理\n }}\n onMouseDown={(e) => {\n if (isDraggable && onMouseDown && !draggingPoint) {\n onMouseDown(e);\n }\n }}>\n {/* 选中时的调整手柄 */}\n {isSelected && !isLine && !isGroup && (\n <>\n {/* 四角手柄 - 支持拖拽缩放 */}\n <div\n className=\"absolute top-0 left-0 w-3 h-3 bg-blue-500 border-2 border-white rounded-full\"\n style={{ zIndex: 9999, pointerEvents: 'auto', cursor: 'nw-resize', marginTop: '-6px', marginLeft: '-6px' }}\n onMouseDown={(e) => handleResizeStart(e, 'nw')}\n title=\"拖拽调整大小\"\n />\n <div\n className=\"absolute top-0 right-0 w-3 h-3 bg-blue-500 border-2 border-white rounded-full\"\n style={{ zIndex: 9999, pointerEvents: 'auto', cursor: 'ne-resize', marginTop: '-6px', marginRight: '-6px' }}\n onMouseDown={(e) => handleResizeStart(e, 'ne')}\n title=\"拖拽调整大小\"\n />\n <div\n className=\"absolute bottom-0 left-0 w-3 h-3 bg-blue-500 border-2 border-white rounded-full\"\n style={{ zIndex: 9999, pointerEvents: 'auto', cursor: 'sw-resize', marginBottom: '-6px', marginLeft: '-6px' }}\n onMouseDown={(e) => handleResizeStart(e, 'sw')}\n title=\"拖拽调整大小\"\n />\n <div\n className=\"absolute bottom-0 right-0 w-3 h-3 bg-blue-500 border-2 border-white rounded-full\"\n style={{ zIndex: 9999, pointerEvents: 'auto', cursor: 'se-resize', marginBottom: '-6px', marginRight: '-6px' }}\n onMouseDown={(e) => handleResizeStart(e, 'se')}\n title=\"拖拽调整大小\"\n />\n\n {/* 旋转手柄 */}\n <div\n className=\"absolute top-0 left-1/2 w-4 h-4 bg-green-500 border-2 border-white rounded-full\"\n style={{ zIndex: 9999, pointerEvents: 'auto', cursor: 'grab', marginTop: '-20px', transform: 'translateX(-50%)', boxShadow: '0 0 4px rgba(0,0,0,0.3)' }}\n onMouseDown={(e) => handleRotateStart(e)}\n title=\"拖拽旋转\"\n />\n {/* 旋转连接线 */}\n <div\n className=\"absolute top-0 left-1/2 w-0.5 h-3 bg-green-500\"\n style={{ zIndex: 9998, pointerEvents: 'none', marginTop: '-14px', transform: 'translateX(-50%)' }}\n />\n\n {/* 节点名称和当前状态标签 */}\n <div className=\"absolute -top-6 left-0 bg-blue-500 text-white text-xs px-2 py-0.5 rounded whitespace-nowrap\">\n {node.name} {currentStatus ? `(${currentStatus.name})` : \"\"}\n </div>\n </>\n )}\n\n {/* 线条端点拖拽手柄 */}\n {isSelected && isLine && lineConfig && onUpdateNode && (\n <>\n {/* 起点拖拽手柄 */}\n <div\n data-handle=\"start\"\n className=\"absolute w-3 h-3 bg-blue-500 border-2 border-white rounded-full cursor-move z-50\"\n style={{\n left: startPointPos.x - 6,\n top: startPointPos.y - 6,\n boxShadow: '0 0 4px rgba(0,0,0,0.3)',\n }}\n onMouseDown={(e) => handlePointMouseDown(e, 'start')}\n title=\"拖拽调整起点\"\n />\n {/* 终点拖拽手柄 */}\n <div\n data-handle=\"end\"\n className=\"absolute w-3 h-3 bg-blue-500 border-2 border-white rounded-full cursor-move z-50\"\n style={{\n left: endPointPos.x - 6,\n top: endPointPos.y - 6,\n boxShadow: '0 0 4px rgba(0,0,0,0.3)',\n }}\n onMouseDown={(e) => handlePointMouseDown(e, 'end')}\n title=\"拖拽调整终点\"\n />\n\n {/* 节点名称 */}\n <div className=\"absolute -top-6 left-0 bg-blue-500 text-white text-xs px-2 py-0.5 rounded whitespace-nowrap\">\n {node.name}\n </div>\n </>\n )}\n\n {/* 渲染当前状态绑定的物料 */}\n <div className=\"w-full h-full relative\">\n {currentMaterial ? (\n <div className=\"w-full h-full\">\n {renderMaterial(currentMaterial, data, isSelected, node)}\n </div>\n ) : !isGroup ? (\n // 只有非群组节点才显示\"无状态\"\n <div className=\"w-full h-full flex items-center justify-center text-gray-300 text-xs\">\n 无状态\n </div>\n ) : null}\n </div>\n\n {/* 渲染群组节点的子节点 */}\n {node.type === 'group' && node.children && (\n <div className=\"absolute inset-0 pointer-events-none\">\n {node.children.map(childNode => (\n <div key={childNode.id} className=\"pointer-events-auto\">\n <NodeRenderer\n node={childNode}\n isSelected={false}\n data={data}\n onUpdateNode={onUpdateNode}\n scale={canvasScale}\n />\n </div>\n ))}\n </div>\n )}\n </div>\n )\n};\n\n// 使用 React.memo 避免不必要的重渲染,提高拖拽性能\n// 注意:只在节点位置、选中状态、缩放比例、状态内容变化时才重渲染\n// 忽略 data、onClick、onMouseDown、onUpdateNode 等频繁变化的 props\nexport const NodeRenderer = React.memo(NodeRendererComponent, (prevProps, nextProps) => {\n const nodeA = prevProps.node;\n const nodeB = nextProps.node;\n\n // 比较节点位置和尺寸\n const nodeStyleEqual =\n nodeA.id === nodeB.id &&\n nodeA.normalStyle.x === nodeB.normalStyle.x &&\n nodeA.normalStyle.y === nodeB.normalStyle.y &&\n nodeA.normalStyle.width === nodeB.normalStyle.width &&\n nodeA.normalStyle.height === nodeB.normalStyle.height;\n\n // 比较节点内容引用(contentInfo 对象在更新时会创建新引用)\n const contentEqual = nodeA.contentInfo === nodeB.contentInfo;\n\n // 比较其他关键 props\n const otherPropsEqual =\n prevProps.isSelected === nextProps.isSelected &&\n prevProps.scale === nextProps.scale;\n\n return nodeStyleEqual && contentEqual && otherPropsEqual;\n});\n","import React, { useState, useRef, useEffect } from 'react';\n\ninterface ColorPickerProps {\n value?: string;\n onChange?: (color: { toHexString: () => string }) => void;\n onChangeComplete?: (color: { toHexString: () => string }) => void;\n}\n\nconst presetColors = [\n '#1890ff', '#52c41a', '#faad14', '#f5222d',\n '#722ed1', '#eb2f96', '#13c2c2', '#fa8c16',\n '#595959', '#262626', '#8c8c8c', '#d9d9d9',\n '#ffffff', '#000000', '#ff4d4f', '#73d13d',\n];\n\nexport const ColorPicker: React.FC<ColorPickerProps> = ({ \n value = '#1890ff', \n onChange,\n onChangeComplete \n}) => {\n const [visible, setVisible] = useState(false);\n const [innerValue, setInnerValue] = useState(value);\n const popoverRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n setInnerValue(value);\n }, [value]);\n\n useEffect(() => {\n const handleClickOutside = (e: MouseEvent) => {\n if (popoverRef.current && !popoverRef.current.contains(e.target as Node)) {\n setVisible(false);\n onChangeComplete?.({ toHexString: () => innerValue });\n }\n };\n if (visible) {\n document.addEventListener('mousedown', handleClickOutside);\n }\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, [visible, onChangeComplete, innerValue]);\n\n const handleColorChange = (color: string) => {\n setInnerValue(color);\n onChange?.({ toHexString: () => color });\n };\n\n return (\n <div ref={popoverRef} style={{ position: 'relative', display: 'inline-block' }}>\n <div\n onClick={() => setVisible(!visible)}\n style={{\n width: 28,\n height: 28,\n backgroundColor: innerValue,\n border: '1px solid #d9d9d9',\n borderRadius: 4,\n cursor: 'pointer',\n }}\n />\n {visible && (\n <div\n style={{\n position: 'absolute',\n top: 32,\n left: 0,\n zIndex: 1000,\n background: '#fff',\n padding: 8,\n borderRadius: 4,\n boxShadow: '0 2px 8px rgba(0,0,0,0.15)',\n border: '1px solid #f0f0f0',\n }}\n >\n <div style={{ display: 'grid', gridTemplateColumns: 'repeat(8, 1fr)', gap: 4 }}>\n {presetColors.map((color) => (\n <div\n key={color}\n onClick={() => {\n handleColorChange(color);\n setVisible(false);\n onChangeComplete?.({ toHexString: () => color });\n }}\n style={{\n width: 20,\n height: 20,\n backgroundColor: color,\n border: innerValue === color ? '2px solid #1890ff' : '1px solid #d9d9d9',\n borderRadius: 2,\n cursor: 'pointer',\n }}\n />\n ))}\n </div>\n <input\n type=\"color\"\n value={innerValue}\n onChange={(e) => handleColorChange(e.target.value)}\n onBlur={() => onChangeComplete?.({ toHexString: () => innerValue })}\n style={{ \n width: '100%', \n marginTop: 8,\n height: 28,\n border: '1px solid #d9d9d9',\n borderRadius: 4,\n }}\n />\n </div>\n )}\n </div>\n );\n};\n","import React, { useRef, useCallback, useState, useEffect, useMemo } from \"react\";\nimport {\n TransformWrapper,\n TransformComponent,\n type ReactZoomPanPinchRef,\n} from \"react-zoom-pan-pinch\";\nimport { Button, Space, Tooltip, Modal, Form, Input, InputNumber, Switch, Upload, message } from \"antd\";\nimport {\n ZoomInOutlined,\n ZoomOutOutlined,\n UndoOutlined,\n RedoOutlined,\n SelectOutlined,\n DragOutlined,\n EyeOutlined,\n DeleteOutlined,\n ExperimentOutlined,\n GroupOutlined,\n VerticalAlignTopOutlined,\n VerticalAlignBottomOutlined,\n AlignLeftOutlined,\n AlignRightOutlined,\n EditOutlined,\n SettingOutlined,\n CopyOutlined,\n UngroupOutlined,\n ColumnWidthOutlined,\n ColumnHeightOutlined,\n UploadOutlined,\n CloseOutlined,\n} from \"@ant-design/icons\";\nimport { useEditorStore } from \"../../store/editorStore\";\nimport { NodeRenderer } from \"../NodeRenderer\";\nimport { ColorPicker } from '../ColorPicker';\nimport { createDefaultNode, createDefaultStatus } from \"../../utils/initData\";\nimport type { Node, NormalNode, Material, LineMaterial, GroupNode } from \"../../types\";\nimport { nanoid } from \"nanoid\";\n\nconst { TextArea } = Input;\n\ninterface CanvasProps {\n defaultTestData?: any;\n}\n\nexport const Canvas: React.FC<CanvasProps> = ({ defaultTestData }) => {\n const transformRef = useRef<ReactZoomPanPinchRef>(null);\n const canvasRef = useRef<HTMLDivElement>(null);\n const wrapperRef = useRef<HTMLDivElement>(null);\n\n const {\n nodes,\n selectedNodeId,\n mode,\n lineDrawing,\n viewport,\n canvas,\n setViewport,\n setCanvasConfig,\n addNode,\n selectNode,\n updateNode,\n removeNode,\n undo,\n redo,\n setMode,\n startLineDrawing,\n endLineDrawing,\n cancelLineDrawing,\n } = useEditorStore();\n console.log('selectedNodeId', selectedNodeId);\n const [isDragOver, setIsDragOver] = useState(false);\n const [, forceUpdate] = useState({});\n const modeRef = useRef(mode);\n useEffect(() => {\n modeRef.current = mode;\n }, [mode]);\n // 拖拽状态\n const isDraggingRef = useRef(false);\n const dragStartRef = useRef({ x: 0, y: 0 });\n const dragOffsetRef = useRef({ x: 0, y: 0, newX: 0, newY: 0 });\n const draggingNodeRef = useRef<Node | null>(null);\n\n // 线条绘制状态\n const [linePreview, setLinePreview] = useState<{\n start: { x: number; y: number } | null;\n end: { x: number; y: number } | null;\n isDrawing: boolean;\n }>({ start: null, end: null, isDrawing: false });\n\n // 框选状态\n const [selectionBox, setSelectionBox] = useState<{\n start: { x: number; y: number } | null;\n end: { x: number; y: number } | null;\n }>({ start: null, end: null });\n const [selectedNodeIds, setSelectedNodeIds] = useState<string[]>([]);\n\n // 框选模式辅助:用于判断是否在框选过程中\n const isBoxSelectingRef = useRef(false);\n\n // 数据模拟\n const [dataModalVisible, setDataModalVisible] = useState(false);\n const [dataInput, setDataInput] = useState(\n JSON.stringify(defaultTestData, null, 2)\n );\n\n // 画布配置弹窗\n const [canvasConfigVisible, setCanvasConfigVisible] = useState(false);\n\n // 空格键临时拖拽模式\n const [isSpacePressed, setIsSpacePressed] = useState(false);\n\n // 坐标转换:屏幕坐标 → 画布逻辑坐标\n // 通过 DOM 实际尺寸推算有效缩放比,避免依赖可能不同步的 ref state\n const getCanvasPosition = useCallback((clientX: number, clientY: number) => {\n if (!canvasRef.current) return { x: 0, y: 0 };\n\n const canvasRect = canvasRef.current.getBoundingClientRect();\n\n const mouseXInCanvas = clientX - canvasRect.left;\n const mouseYInCanvas = clientY - canvasRect.top;\n\n const effectiveScaleX = canvasRect.width / canvas.width;\n const effectiveScaleY = canvasRect.height / canvas.height;\n\n const x = mouseXInCanvas / effectiveScaleX;\n const y = mouseYInCanvas / effectiveScaleY;\n return { x: Math.round(x), y: Math.round(y) };\n }, [canvas.width, canvas.height]);\n\n // 坐标转换(仅用于框选)- 复用同样的 DOM 推算逻辑\n const getBoxSelectionPosition = useCallback((clientX: number, clientY: number) => {\n return getCanvasPosition(clientX, clientY);\n }, [getCanvasPosition]);\n\n // 创建线条节点\n const createLineNode = useCallback(\n (start: { x: number; y: number }, end: { x: number; y: number }, continueDrawing: boolean = true) => {\n if (!lineDrawing.material) return;\n\n const material = lineDrawing.material as LineMaterial;\n const config = material.config || {};\n const lineWeight = config.lineWeight || config.thickness || 2;\n\n const x = Math.min(start.x, end.x);\n const y = Math.min(start.y, end.y);\n\n const relativeStartX = Math.round(start.x - x);\n const relativeStartY = Math.round(start.y - y);\n const relativeEndX = Math.round(end.x - x);\n const relativeEndY = Math.round(end.y - y);\n\n const minNodeSize = Math.max(lineWeight * 2, 4);\n const nodeWidth = Math.max(Math.abs(start.x - end.x), minNodeSize);\n const nodeHeight = Math.max(Math.abs(start.y - end.y), minNodeSize);\n\n const lineMaterial: LineMaterial = {\n ...material,\n id: nanoid(),\n config: {\n color: config.color,\n lineWeight,\n thickness: lineWeight,\n lineType: config.lineType,\n startX: relativeStartX,\n startY: relativeStartY,\n endX: relativeEndX,\n endY: relativeEndY,\n },\n };\n\n const newNode: Node = {\n id: nanoid(),\n name: `${material.name}_${Date.now()}`,\n type: 'normal',\n normalStyle: {\n width: nodeWidth,\n height: nodeHeight,\n x,\n y,\n background: 'transparent',\n },\n contentInfo: {\n statusList: [createDefaultStatus(lineMaterial)],\n currentStatusId: undefined,\n },\n controlInfo: {\n isDraggable: true,\n isClickable: true,\n isResizable: true,\n isSelectable: true,\n },\n };\n\n addNode(newNode, false);\n\n if (continueDrawing) {\n const nextStart = { x: end.x, y: end.y };\n setLinePreview({\n start: nextStart,\n end: { ...nextStart },\n isDrawing: true,\n });\n } else {\n setLinePreview({ start: null, end: null, isDrawing: false });\n endLineDrawing();\n }\n },\n [lineDrawing.material, addNode, endLineDrawing]\n );\n\n // 视口变换\n const handleTransform = useCallback(() => {\n const state = transformRef.current?.state;\n if (state) {\n setViewport({\n scale: state.scale,\n positionX: state.positionX,\n positionY: state.positionY,\n });\n }\n }, [setViewport]);\n\n // 画布点击\n const handleCanvasClick = useCallback(\n (e: React.MouseEvent) => {\n if (isDraggingRef.current) return;\n // 框选模式下点击画布不清空选择\n if (mode === 'box-select') return;\n if (\n e.target === canvasRef.current ||\n (e.target as HTMLElement).dataset?.canvas === \"true\"\n ) {\n selectNode(null);\n setSelectedNodeIds([]);\n }\n },\n [selectNode, mode]\n );\n\n // 画布鼠标按下(线条绘制/框选)\n const handleCanvasMouseDown = useCallback(\n (e: React.MouseEvent) => {\n if (e.button !== 0) return;\n\n // 线条绘制模式\n if (mode === \"line-draw\" && lineDrawing.material) {\n e.stopPropagation();\n const pos = getCanvasPosition(e.clientX, e.clientY);\n if (!linePreview.isDrawing) {\n setLinePreview({ start: pos, end: pos, isDrawing: true });\n } else if (linePreview.start) {\n createLineNode(linePreview.start, pos, true);\n }\n return;\n }\n\n // 框选模式(空格键按下时进入拖拽模式,不执行框选)\n if (mode === 'box-select' && !isSpacePressed) {\n const pos = getBoxSelectionPosition(e.clientX, e.clientY);\n setSelectionBox({ start: pos, end: pos });\n setSelectedNodeIds([]);\n e.preventDefault();\n e.stopPropagation();\n }\n },\n [mode, lineDrawing.material, linePreview.isDrawing, linePreview.start, isSpacePressed, createLineNode, getCanvasPosition, getBoxSelectionPosition]\n );\n\n // 画布双击(结束线条绘制)\n const handleCanvasDoubleClick = useCallback(\n (e: React.MouseEvent) => {\n if (mode !== \"line-draw\" || !lineDrawing.material) return;\n if (linePreview.isDrawing && linePreview.start) {\n const pos = getCanvasPosition(e.clientX, e.clientY);\n createLineNode(linePreview.start, pos, false);\n }\n },\n [mode, lineDrawing.material, linePreview.isDrawing, linePreview.start, createLineNode, getCanvasPosition]\n );\n\n // 拖拽悬停\n const handleDragOver = useCallback((e: React.DragEvent) => {\n e.preventDefault();\n e.dataTransfer.dropEffect = \"copy\";\n setIsDragOver(true);\n }, []);\n\n const handleDragLeave = useCallback((e: React.DragEvent) => {\n e.preventDefault();\n setIsDragOver(false);\n }, []);\n\n // 放置物料\n const handleDrop = useCallback(\n (e: React.DragEvent) => {\n e.preventDefault();\n setIsDragOver(false);\n if (!canvasRef.current || mode !== \"select\") return;\n\n try {\n const data = e.dataTransfer.getData(\"application/json\");\n if (!data) return;\n const material = JSON.parse(data);\n const pos = getCanvasPosition(e.clientX, e.clientY);\n const x = pos.x - 50;\n const y = pos.y - 50;\n const newNode = createDefaultNode(x, y, material);\n addNode(newNode);\n setSelectedNodeIds([newNode.id]);\n } catch (error) {\n console.error(\"Failed to parse dropped material:\", error);\n }\n },\n [mode, addNode, getCanvasPosition]\n );\n\n // 节点拖拽开始\n const handleNodeMouseDown = useCallback(\n (e: React.MouseEvent, node: Node) => {\n // 选择模式或框选模式下都可以拖拽\n if ((mode !== \"select\" && mode !== \"box-select\") || !node.controlInfo.isDraggable) return;\n e.stopPropagation();\n selectNode(node.id);\n isDraggingRef.current = true;\n dragStartRef.current = { x: e.clientX, y: e.clientY };\n dragOffsetRef.current = {\n x: node.normalStyle.x || 0,\n y: node.normalStyle.y || 0,\n newX: node.normalStyle.x || 0,\n newY: node.normalStyle.y || 0,\n };\n draggingNodeRef.current = node;\n e.preventDefault();\n },\n [mode, selectNode]\n );\n\n // 鼠标事件\n useEffect(() => {\n const handleMouseMove = (e: MouseEvent) => {\n // 拖拽\n if (isDraggingRef.current && selectedNodeId && draggingNodeRef.current) {\n if (!canvasRef.current) return;\n const canvasRect = canvasRef.current.getBoundingClientRect();\n const effectiveScaleX = canvasRect.width / canvas.width;\n const effectiveScaleY = canvasRect.height / canvas.height;\n const screenDx = e.clientX - dragStartRef.current.x;\n const screenDy = e.clientY - dragStartRef.current.y;\n const canvasDx = screenDx / effectiveScaleX;\n const canvasDy = screenDy / effectiveScaleY;\n const newX = dragOffsetRef.current.x + canvasDx;\n const newY = dragOffsetRef.current.y + canvasDy;\n const nodeEl = document.querySelector(\n `[data-node-id=\"${selectedNodeId}\"]`\n ) as HTMLElement;\n if (nodeEl) {\n nodeEl.style.left = `${newX}px`;\n nodeEl.style.top = `${newY}px`;\n }\n dragOffsetRef.current.newX = newX;\n dragOffsetRef.current.newY = newY;\n }\n // 框选\n if (mode === 'box-select' && selectionBox.start) {\n const pos = getBoxSelectionPosition(e.clientX, e.clientY);\n setSelectionBox((prev) => ({ ...prev, end: pos }));\n }\n // 线条预览\n if (mode === \"line-draw\" && linePreview.isDrawing) {\n const pos = getCanvasPosition(e.clientX, e.clientY);\n setLinePreview((prev) => ({ ...prev, end: pos }));\n }\n };\n\n const handleMouseUp = () => {\n if (isDraggingRef.current && selectedNodeId && draggingNodeRef.current) {\n const store = useEditorStore.getState();\n const newX = dragOffsetRef.current.newX ?? dragOffsetRef.current.x;\n const newY = dragOffsetRef.current.newY ?? dragOffsetRef.current.y;\n store.updateNode(selectedNodeId, {\n normalStyle: {\n ...draggingNodeRef.current.normalStyle,\n x: newX,\n y: newY,\n },\n });\n }\n isDraggingRef.current = false;\n draggingNodeRef.current = null;\n forceUpdate({});\n // 框选结束,计算选中的节点\n if (mode === 'box-select' && selectionBox.start && selectionBox.end) {\n const minX = Math.min(selectionBox.start.x, selectionBox.end.x);\n const maxX = Math.max(selectionBox.start.x, selectionBox.end.x);\n const minY = Math.min(selectionBox.start.y, selectionBox.end.y);\n const maxY = Math.max(selectionBox.start.y, selectionBox.end.y);\n\n const selectedIds = nodes\n .filter((node) => {\n const nodeX = node.normalStyle.x || 0;\n const nodeY = node.normalStyle.y || 0;\n const nodeW = node.normalStyle.width || 0;\n const nodeH = node.normalStyle.height || 0;\n const centerX = nodeX + nodeW / 2;\n const centerY = nodeY + nodeH / 2;\n return centerX >= minX && centerX <= maxX && centerY >= minY && centerY <= maxY;\n })\n .map((node) => node.id);\n\n setSelectedNodeIds(selectedIds);\n setSelectionBox({ start: null, end: null });\n }\n };\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === \"Escape\" && mode === \"line-draw\") {\n setLinePreview({ start: null, end: null, isDrawing: false });\n cancelLineDrawing();\n }\n if (e.key === \"Delete\") {\n if (selectedNodeId) removeNode(selectedNodeId);\n else if (selectedNodeIds.length > 0) {\n selectedNodeIds.forEach((id) => removeNode(id));\n setSelectedNodeIds([]);\n }\n }\n if (e.ctrlKey && e.key === \"z\") {\n e.preventDefault();\n undo();\n }\n if (e.ctrlKey && e.key === \"y\") {\n e.preventDefault();\n redo();\n }\n // 空格键按下:进入临时拖拽模式(所有模式都支持)\n if (e.key === \" \" && !isSpacePressed) {\n e.preventDefault();\n setIsSpacePressed(true);\n }\n };\n\n const handleKeyUp = (e: KeyboardEvent) => {\n // 空格键松开:退出临时拖拽模式\n if (e.key === \" \" && isSpacePressed) {\n setIsSpacePressed(false);\n }\n };\n\n window.addEventListener(\"mousemove\", handleMouseMove);\n window.addEventListener(\"mouseup\", handleMouseUp);\n window.addEventListener(\"keydown\", handleKeyDown);\n window.addEventListener(\"keyup\", handleKeyUp);\n return () => {\n window.removeEventListener(\"mousemove\", handleMouseMove);\n window.removeEventListener(\"mouseup\", handleMouseUp);\n window.removeEventListener(\"keydown\", handleKeyDown);\n window.removeEventListener(\"keyup\", handleKeyUp);\n };\n }, [\n selectedNodeId,\n\n selectionBox,\n mode,\n linePreview.isDrawing,\n selectedNodeIds,\n nodes,\n canvas.width,\n canvas.height,\n removeNode,\n undo,\n isSpacePressed,\n redo,\n cancelLineDrawing,\n getCanvasPosition,\n getBoxSelectionPosition,\n setSelectedNodeIds,\n ]);\n\n // 复制节点\n const handleCopyNodes = useCallback(() => {\n // 确定要复制的节点列表\n const nodesToCopy = selectedNodeIds.length > 0\n ? selectedNodeIds.map((id) => nodes.find((n) => n.id === id)).filter(Boolean) as Node[]\n : selectedNodeId\n ? [nodes.find((n) => n.id === selectedNodeId)].filter(Boolean) as Node[]\n : [];\n\n if (nodesToCopy.length === 0) return;\n\n // 复制每个节点,并向右下方偏移20px\n const newNodeIds: string[] = [];\n nodesToCopy.forEach((node) => {\n const newNode = {\n ...node,\n id: nanoid(),\n name: `${node.name}_副本`,\n normalStyle: {\n ...node.normalStyle,\n x: (node.normalStyle.x || 0) + 20,\n y: (node.normalStyle.y || 0) + 20,\n },\n };\n addNode(newNode);\n newNodeIds.push(newNode.id);\n });\n\n // 选中新复制的节点\n if (newNodeIds.length === 1) {\n selectNode(newNodeIds[0]);\n } else {\n setSelectedNodeIds(newNodeIds);\n }\n }, [selectedNodeId, selectedNodeIds, nodes, addNode, selectNode, setSelectedNodeIds]);\n\n // 组合选中的节点\n const handleGroupNodes = useCallback(() => {\n if (selectedNodeIds.length < 2) return;\n const selectedNodes: Node[] = [];\n for (let i = 0; i < selectedNodeIds.length; i++) {\n const id = selectedNodeIds[i];\n const node = nodes.find((n) => n.id === id);\n if (!node) continue;\n if (node?.type === \"group\") {\n //拆分放入\n const children = node.children;\n // 将子节点从相对坐标转换为绝对坐标\n children.forEach((child) => selectedNodes.push({\n ...child,\n normalStyle: {\n ...child.normalStyle,\n x: (node.normalStyle.x || 0) + (child.normalStyle.x || 0),\n y: (node.normalStyle.y || 0) + (child.normalStyle.y || 0),\n },\n }));\n // 删除群组节点\n removeNode(id);\n continue;\n }\n selectedNodes.push(node);\n }\n if (selectedNodes.length < 2) return;\n\n // 计算边界框\n let minX = Infinity, minY = Infinity;\n let maxX = -Infinity, maxY = -Infinity;\n\n selectedNodes.forEach((node) => {\n const x = node.normalStyle.x || 0;\n const y = node.normalStyle.y || 0;\n const w = node.normalStyle.width || 0;\n const h = node.normalStyle.height || 0;\n minX = Math.min(minX, x);\n minY = Math.min(minY, y);\n maxX = Math.max(maxX, x + w);\n maxY = Math.max(maxY, y + h);\n });\n\n // 调整子节点位置为相对坐标\n const children = selectedNodes.map((node) => ({\n ...node,\n normalStyle: {\n ...node.normalStyle,\n x: (node.normalStyle.x || 0) - minX,\n y: (node.normalStyle.y || 0) - minY,\n },\n }));\n\n // 创建群组节点\n const groupNode: GroupNode = {\n id: nanoid(),\n name: `群组_${Date.now()}`,\n type: \"group\",\n normalStyle: {\n x: minX,\n y: minY,\n width: maxX - minX,\n height: maxY - minY,\n background: \"transparent\",\n },\n contentInfo: {\n statusList: [],\n currentStatusId: undefined,\n },\n controlInfo: {\n isDraggable: true,\n isClickable: true,\n isResizable: true,\n isSelectable: true,\n },\n children,\n };\n\n // 删除原子节点并添加群组节点\n selectedNodeIds.forEach((id) => removeNode(id));\n addNode(groupNode);\n setSelectedNodeIds([]);\n selectNode(groupNode.id);\n }, [selectedNodeIds, nodes, removeNode, addNode, selectNode]);\n\n // 解除组合\n const handleUngroupNodes = useCallback(() => {\n // 获取选中的群组节点\n const groupNodesToUngroup = selectedNodeIds.length > 0\n ? selectedNodeIds\n .map((id) => nodes.find((n) => n.id === id))\n .filter((n): n is GroupNode => !!n && n.type === \"group\")\n : selectedNodeId\n ? [nodes.find((n) => n.id === selectedNodeId)].filter((n): n is GroupNode => !!n && n.type === \"group\")\n : [];\n\n if (groupNodesToUngroup.length === 0) return;\n\n // 解除每个群组节点\n groupNodesToUngroup.forEach((groupNode) => {\n if (!groupNode.children || groupNode.children.length === 0) return;\n\n // 将子节点从相对坐标转换为绝对坐标\n const absoluteChildren = groupNode.children.map((child) => ({\n ...child,\n normalStyle: {\n ...child.normalStyle,\n x: (groupNode.normalStyle.x || 0) + (child.normalStyle.x || 0),\n y: (groupNode.normalStyle.y || 0) + (child.normalStyle.y || 0),\n },\n }));\n\n // 删除群组节点并添加子节点\n removeNode(groupNode.id);\n absoluteChildren.forEach((child) => addNode(child));\n });\n\n // 清空选中状态\n setSelectedNodeIds([]);\n selectNode(null);\n }, [selectedNodeId, selectedNodeIds, nodes, removeNode, addNode, selectNode, setSelectedNodeIds]);\n\n // 分布节点\n const handleDistributeNodes = useCallback(\n (direction: \"horizontal\" | \"vertical\") => {\n if (selectedNodeIds.length < 2) return;\n\n const selectedNodes = selectedNodeIds\n .map((id) => nodes.find((n) => n.id === id))\n .filter((n): n is Node => !!n && n.type !== \"group\");\n\n if (selectedNodes.length < 2) return;\n\n // 计算边界\n let minX = Infinity, maxX = -Infinity;\n let minY = Infinity, maxY = -Infinity;\n\n selectedNodes.forEach((node) => {\n const x = node.normalStyle.x || 0;\n const y = node.normalStyle.y || 0;\n minX = Math.min(minX, x);\n maxX = Math.max(maxX, x);\n minY = Math.min(minY, y);\n maxY = Math.max(maxY, y);\n });\n\n // 按坐标排序,便于均匀分布\n const sortedNodes = [...selectedNodes].sort((a, b) => {\n if (direction === \"horizontal\") {\n return (a.normalStyle.x || 0) - (b.normalStyle.x || 0);\n } else {\n return (a.normalStyle.y || 0) - (b.normalStyle.y || 0);\n }\n });\n\n // 计算间隔\n const count = sortedNodes.length;\n if (direction === \"horizontal\") {\n const totalWidth = maxX - minX;\n const step = totalWidth / (count - 1);\n sortedNodes.forEach((node, index) => {\n const newX = minX + step * index;\n updateNode(node.id, {\n normalStyle: { ...node.normalStyle, x: newX },\n });\n });\n } else {\n const totalHeight = maxY - minY;\n const step = totalHeight / (count - 1);\n sortedNodes.forEach((node, index) => {\n const newY = minY + step * index;\n updateNode(node.id, {\n normalStyle: { ...node.normalStyle, y: newY },\n });\n });\n }\n },\n [selectedNodeIds, nodes, updateNode]\n );\n\n // 对齐节点\n const handleAlignNodes = useCallback(\n (direction: \"left\" | \"right\" | \"top\" | \"bottom\") => {\n if (selectedNodeIds.length < 2) return;\n const store = useEditorStore.getState();\n const selectedNodes = selectedNodeIds\n .map((id) => nodes.find((n) => n.id === id))\n .filter((n): n is Node => !!n) as Node[];\n if (selectedNodes.length < 2) return;\n\n let alignValue = 0;\n switch (direction) {\n case \"left\":\n alignValue = Math.min(...selectedNodes.map((n) => n.normalStyle.x || 0));\n break;\n case \"right\":\n alignValue = Math.max(\n ...selectedNodes.map((n) => (n.normalStyle.x || 0) + (n.normalStyle.width || 0))\n );\n break;\n case \"top\":\n alignValue = Math.min(...selectedNodes.map((n) => n.normalStyle.y || 0));\n break;\n case \"bottom\":\n alignValue = Math.max(\n ...selectedNodes.map((n) => (n.normalStyle.y || 0) + (n.normalStyle.height || 0))\n );\n break;\n }\n\n selectedNodes.forEach((node) => {\n let newX = node.normalStyle.x || 0;\n let newY = node.normalStyle.y || 0;\n switch (direction) {\n case \"left\":\n newX = alignValue;\n break;\n case \"right\":\n newX = alignValue - (node.normalStyle.width || 0);\n break;\n case \"top\":\n newY = alignValue;\n break;\n case \"bottom\":\n newY = alignValue - (node.normalStyle.height || 0);\n break;\n }\n store.updateNode(node.id, {\n normalStyle: { ...node.normalStyle, x: newX, y: newY },\n });\n });\n },\n [selectedNodeIds, nodes]\n );\n\n // 工具栏按钮\n const toolbarButtons = [\n {\n icon: <SelectOutlined />,\n title: \"选择模式\",\n active: mode === \"select\",\n onClick: () => {\n setMode(\"select\");\n },\n },\n {\n icon: <GroupOutlined />,\n title: \"框选模式\",\n active: mode === \"box-select\",\n onClick: () => {\n setMode(\"box-select\");\n setSelectedNodeIds([]);\n },\n },\n {\n icon: <DragOutlined />,\n title: \"拖拽模式\",\n active: mode === \"drag\",\n onClick: () => {\n setMode(\"drag\");\n },\n },\n {\n icon: <EditOutlined />,\n title: \"线条绘制\",\n active: mode === \"line-draw\",\n onClick: () => {\n setMode(\"line-draw\");\n },\n },\n {\n icon: <EyeOutlined />,\n title: \"预览模式\",\n active: mode === \"preview\",\n onClick: () => {\n setMode(\"preview\");\n },\n },\n ];\n\n const actionButtons = useMemo(\n () => [\n { icon: <UndoOutlined />, title: \"撤销 (Ctrl+Z)\", onClick: undo },\n { icon: <RedoOutlined />, title: \"重做 (Ctrl+Y)\", onClick: redo },\n {\n icon: <CopyOutlined />,\n title: \"复制节点\",\n disabled: !selectedNodeId && selectedNodeIds.length === 0,\n onClick: handleCopyNodes,\n },\n {\n icon: <GroupOutlined />,\n title: \"组合选中节点\",\n disabled: selectedNodeIds.length < 2,\n onClick: handleGroupNodes,\n },\n {\n icon: <UngroupOutlined />,\n title: \"解除组合\",\n disabled: !selectedNodeId && selectedNodeIds.length === 0,\n onClick: handleUngroupNodes,\n },\n {\n icon: <AlignLeftOutlined />,\n title: \"左对齐\",\n disabled: selectedNodeIds.length < 2,\n onClick: () => handleAlignNodes(\"left\"),\n },\n {\n icon: <AlignRightOutlined />,\n title: \"右对齐\",\n disabled: selectedNodeIds.length < 2,\n onClick: () => handleAlignNodes(\"right\"),\n },\n {\n icon: <VerticalAlignTopOutlined />,\n title: \"上对齐\",\n disabled: selectedNodeIds.length < 2,\n onClick: () => handleAlignNodes(\"top\"),\n },\n {\n icon: <VerticalAlignBottomOutlined />,\n title: \"下对齐\",\n disabled: selectedNodeIds.length < 2,\n onClick: () => handleAlignNodes(\"bottom\"),\n },\n {\n icon: <ColumnWidthOutlined />,\n title: \"水平分布\",\n disabled: selectedNodeIds.length < 2,\n onClick: () => handleDistributeNodes(\"horizontal\"),\n },\n {\n icon: <ColumnHeightOutlined />,\n title: \"垂直分布\",\n disabled: selectedNodeIds.length < 2,\n onClick: () => handleDistributeNodes(\"vertical\"),\n },\n {\n icon: <SettingOutlined />,\n title: \"画布配置\",\n onClick: () => setCanvasConfigVisible(true),\n },\n {\n icon: <ExperimentOutlined />,\n title: \"数据模拟\",\n type: \"primary\" as const,\n onClick: () => setDataModalVisible(true),\n },\n {\n icon: <DeleteOutlined />,\n title: \"删除选中 (Delete)\",\n disabled: !selectedNodeId && selectedNodeIds.length === 0,\n onClick: () => {\n if (selectedNodeId) removeNode(selectedNodeId);\n else if (selectedNodeIds.length > 0) {\n selectedNodeIds.forEach((id) => removeNode(id));\n setSelectedNodeIds([]);\n }\n },\n },\n ],\n [\n undo,\n redo,\n mode,\n setMode,\n setSelectedNodeIds,\n selectedNodeIds,\n handleGroupNodes,\n handleUngroupNodes,\n handleCopyNodes,\n handleAlignNodes,\n handleDistributeNodes,\n setCanvasConfigVisible,\n setDataModalVisible,\n selectedNodeId,\n removeNode,\n ]\n );\n\n //框选模式下增加键盘监听平移\n const handleKeyDown = useCallback((e: KeyboardEvent) => {\n e.preventDefault();\n if (e.key === \"ArrowLeft\" || e.key === \"ArrowRight\" || e.key === \"ArrowUp\" || e.key === \"ArrowDown\") {\n const selectedNodes = selectedNodeIds.map((id) => nodes.find((n) => n.id === id));\n selectedNodes.forEach((node) => {\n if (node) {\n updateNode(node.id, {\n normalStyle: {\n ...node.normalStyle,\n x: (node.normalStyle.x || 0) - 2 * (e.key === \"ArrowLeft\" ? 1 : e.key === \"ArrowRight\" ? -1 : 0),\n y: (node.normalStyle.y || 0) - 2 * (e.key === \"ArrowUp\" ? 1 : e.key === \"ArrowDown\" ? -1 : 0),\n },\n });\n }\n });\n }\n },\n [selectedNodeIds, nodes, updateNode]\n );\n useEffect(() => {\n document.addEventListener(\"keydown\", handleKeyDown);\n return () => {\n document.removeEventListener(\"keydown\", handleKeyDown);\n };\n }, [handleKeyDown]);\n\n return (\n <div className=\"flex-1 flex flex-col h-full bg-gray-100\">\n {/* 工具栏 */}\n <div className=\"h-12 bg-white border-b border-gray-200 flex items-center justify-between px-4\">\n <Space>\n {toolbarButtons.map((btn) => (\n <Tooltip key={btn.title} title={btn.title}>\n <Button\n type={btn.active ? \"primary\" : \"default\"}\n icon={btn.icon}\n onClick={btn.onClick}\n />\n </Tooltip>\n ))}\n </Space>\n <Space>\n {actionButtons.map((btn) => (\n <Tooltip key={btn.title} title={btn.title}>\n <Button\n type={(btn as any).active ? \"primary\" : btn.type || \"default\"}\n icon={btn.icon}\n onClick={btn.onClick}\n disabled={btn.disabled}\n />\n </Tooltip>\n ))}\n </Space>\n </div>\n\n {/* 画布 */}\n <div ref={wrapperRef} className=\"flex-1 relative\">\n <TransformWrapper\n ref={transformRef}\n initialScale={1}\n initialPositionX={0}\n initialPositionY={0}\n minScale={0.5}\n maxScale={5}\n onTransformed={handleTransform}\n limitToBounds={false}\n centerZoomedOut={false}\n panning={{ disabled: !isSpacePressed && (mode === 'select' || mode === 'line-draw' || mode === 'box-select'), velocityDisabled: true }}\n wheel={{ disabled: false, step: 0.1 }}\n pinch={{ disabled: false }}\n doubleClick={{ disabled: true }}\n >\n {({ zoomIn, zoomOut, resetTransform }) => (\n <>\n {/* 缩放控制 */}\n <div className=\"absolute bottom-4 right-4 z-10 bg-white rounded-lg shadow-lg p-2\">\n <Space direction=\"vertical\">\n <Tooltip title=\"放大\">\n <Button icon={<ZoomInOutlined />} onClick={() => zoomIn()} />\n </Tooltip>\n <Tooltip title=\"缩小\">\n <Button icon={<ZoomOutOutlined />} onClick={() => zoomOut()} />\n </Tooltip>\n <Tooltip title=\"重置视图\">\n <Button onClick={() => resetTransform()}>100%</Button>\n </Tooltip>\n <div className=\"text-center text-xs text-gray-500\">\n {Math.round(viewport.scale * 100)}%\n </div>\n </Space>\n </div>\n\n <TransformComponent\n wrapperStyle={{ width: \"100%\", height: \"100%\", position: \"relative\" }}\n contentStyle={{\n width: \"100%\",\n height: \"100%\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n }}\n >\n <div\n ref={canvasRef}\n data-canvas=\"true\"\n className={`relative ${isDragOver ? \"ring-4 ring-blue-400 ring-opacity-50\" : \"\"\n } ${mode === \"line-draw\" ? \"cursor-crosshair\" : \"\"} ${isSpacePressed ? \"cursor-grab\" : \"\"}`}\n style={{\n width: canvas.width,\n height: canvas.height,\n flexShrink: 0,\n backgroundColor: canvas.background,\n backgroundImage: canvas.backgroundImage ? `url(${canvas.backgroundImage})` : undefined,\n backgroundSize: 'cover',\n backgroundPosition: 'center',\n }}\n onClick={handleCanvasClick}\n onMouseDown={handleCanvasMouseDown}\n onDoubleClick={handleCanvasDoubleClick}\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n onDrop={handleDrop}\n >\n {/* 网格背景 */}\n {canvas.showGrid !== false && (\n <svg className=\"absolute top-0 left-0 pointer-events-none\" width={canvas.width} height={canvas.height}>\n <defs>\n <pattern id=\"grid\" width=\"20\" height=\"20\" patternUnits=\"userSpaceOnUse\">\n <path d=\"M 20 0 L 0 0 0 20\" fill=\"none\" stroke=\"#f0f0f0\" strokeWidth=\"1\" />\n </pattern>\n </defs>\n <rect width=\"100%\" height=\"100%\" fill=\"url(#grid)\" />\n </svg>\n )}\n\n {/* 节点 */}\n {nodes.map((node) => (\n <NodeRenderer\n key={`${node.id}`}\n node={node}\n isSelected={\n selectedNodeId === node.id || selectedNodeIds.includes(node.id)\n }\n data={defaultTestData}\n onClick={(e: React.MouseEvent) => {\n console.log('Node onClick:', node.id, 'mode:', modeRef.current);\n // 绘制模式下不触发节点选中\n if (modeRef.current === \"line-draw\") return;\n //假如点击时按着shift键\n if (e.shiftKey) {\n selectNode(node.id);\n setSelectedNodeIds([...selectedNodeIds, node.id]);\n } else {\n selectNode(node.id);\n setSelectedNodeIds([node.id]);\n }\n }}\n onMouseDown={(e) => handleNodeMouseDown(e, node)}\n onUpdateNode={(nodeId, updates) => updateNode(nodeId, updates)}\n scale={viewport.scale}\n />\n ))}\n\n {/* 线条预览 */}\n {mode === \"line-draw\" && linePreview.isDrawing && linePreview.start && linePreview.end && (\n <svg className=\"absolute top-0 left-0 pointer-events-none\" width={canvas.width} height={canvas.height}>\n <line\n x1={linePreview.start.x}\n y1={linePreview.start.y}\n x2={linePreview.end.x}\n y2={linePreview.end.y}\n stroke=\"#1890ff\"\n strokeWidth=\"2\"\n strokeDasharray=\"5,5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )}\n\n {/* 框选框 */}\n {mode === 'box-select' && selectionBox.start && selectionBox.end && (\n <div\n className=\"absolute border-2 border-blue-500 bg-blue-500/10 pointer-events-none\"\n style={{\n left: Math.min(selectionBox.start.x, selectionBox.end.x),\n top: Math.min(selectionBox.start.y, selectionBox.end.y),\n width: Math.abs(selectionBox.end.x - selectionBox.start.x),\n height: Math.abs(selectionBox.end.y - selectionBox.start.y),\n zIndex: 9999,\n }}\n />\n )}\n </div>\n </TransformComponent>\n </>\n )}\n </TransformWrapper>\n </div>\n\n {/* 数据模拟弹窗 */}\n <Modal\n title=\"数据模拟\"\n open={dataModalVisible}\n onCancel={() => setDataModalVisible(false)}\n footer={null}\n >\n <Form layout=\"vertical\">\n <Form.Item label=\"测试数据 (JSON)\">\n <TextArea\n value={dataInput}\n onChange={(e) => setDataInput(e.target.value)}\n rows={10}\n placeholder=\"输入 JSON 格式的测试数据\"\n />\n </Form.Item>\n </Form>\n </Modal>\n\n {/* 画布配置弹窗 */}\n <Modal\n title=\"画布配置\"\n open={canvasConfigVisible}\n onCancel={() => setCanvasConfigVisible(false)}\n footer={null}\n >\n <Form layout=\"vertical\">\n <Form.Item label=\"宽度\">\n <InputNumber\n value={canvas.width}\n onChange={(v) => setCanvasConfig({ width: v || 1920 })}\n min={100}\n max={5000}\n style={{ width: '100%' }}\n />\n </Form.Item>\n <Form.Item label=\"高度\">\n <InputNumber\n value={canvas.height}\n onChange={(v) => setCanvasConfig({ height: v || 1080 })}\n min={100}\n max={5000}\n style={{ width: '100%' }}\n />\n </Form.Item>\n <Form.Item label=\"显示网格\">\n <Switch\n checked={canvas.showGrid !== false}\n onChange={(checked) => setCanvasConfig({ showGrid: checked })}\n />\n </Form.Item>\n <Form.Item label=\"背景色\">\n <div className=\"flex items-center gap-2\">\n <ColorPicker\n value={canvas.background || '#ffffff'}\n onChange={(color) => setCanvasConfig({ background: color.toHexString() })}\n />\n <Input\n value={canvas.background}\n onChange={(e) => setCanvasConfig({ background: e.target.value })}\n placeholder=\"#ffffff\"\n />\n </div>\n </Form.Item>\n <Form.Item label=\"背景图片\">\n <div className=\"flex items-center gap-2\">\n <Upload\n accept=\"image/*\"\n showUploadList={false}\n beforeUpload={(file) => {\n const isImage = file.type.startsWith('image/');\n if (!isImage) {\n message.error('只能上传图片文件!');\n return false;\n }\n const reader = new FileReader();\n reader.onload = (e) => {\n const base64 = e.target?.result as string;\n setCanvasConfig({ backgroundImage: base64 });\n message.success('背景图片上传成功');\n };\n reader.readAsDataURL(file);\n return false; // 阻止自动上传\n }}\n >\n <Button icon={<UploadOutlined />}>上传图片</Button>\n </Upload>\n <Input\n value={canvas.backgroundImage}\n onChange={(e) => setCanvasConfig({ backgroundImage: e.target.value })}\n placeholder=\"输入图片 URL 或上传图片\"\n style={{ flex: 1 }}\n />\n {canvas.backgroundImage && (\n <Button\n icon={<CloseOutlined />}\n onClick={() => setCanvasConfig({ backgroundImage: undefined })}\n danger\n size=\"small\"\n />\n )}\n </div>\n {canvas.backgroundImage && (\n <div className=\"mt-2 p-2 border rounded\" style={{ maxWidth: '100%' }}>\n <img\n src={canvas.backgroundImage}\n alt=\"背景预览\"\n style={{ maxWidth: '100%', maxHeight: 120, objectFit: 'contain' }}\n />\n </div>\n )}\n </Form.Item>\n </Form>\n </Modal>\n </div>\n );\n};\n\nexport default Canvas;\n","import React, { useEffect, useState } from \"react\";\nimport { Form, Input, InputNumber, Select, Divider, Space, Tag } from \"antd\";\nimport { ColorPicker } from '../../ColorPicker';\nimport type { Material, TextMaterial } from \"../../../types\";\nimport type { DataOption } from \"../types\";\n\nconst { Option } = Select;\n\ninterface TextMaterialEditorProps {\n material: Material;\n onSave: (updates: Partial<Material>) => void;\n bindCodes?: string[];\n dataOptions?: DataOption[];\n}\n\nexport const TextMaterialEditor: React.FC<TextMaterialEditorProps> = ({\n material,\n onSave,\n bindCodes = [],\n dataOptions = [],\n}) => {\n const textMaterial = material as TextMaterial;\n const content = textMaterial.content || {};\n\n const [formData, setFormData] = useState({\n label: content.label || \"\",\n value: content.value || \"\",\n valueSourceCode: content.valueSourceCode || \"\",\n unit: content.unit || \"\",\n decimals: content.decimals ?? 2,\n labelFontSize: content.labelStyle?.fontSize || 14,\n labelFontWeight: content.labelStyle?.fontWeight || \"bold\",\n labelColor: content.labelStyle?.color || \"#262626\",\n valueFontSize: content.valueStyle?.fontSize || 14,\n valueFontWeight: content.valueStyle?.fontWeight || \"normal\",\n valueColor: content.valueStyle?.color || \"#1890ff\",\n });\n\n useEffect(() => {\n setFormData({\n label: content.label || \"\",\n value: content.value || \"\",\n valueSourceCode: content.valueSourceCode || \"\",\n unit: content.unit || \"\",\n decimals: content.decimals ?? 2,\n labelFontSize: content.labelStyle?.fontSize || 14,\n labelFontWeight: content.labelStyle?.fontWeight || \"bold\",\n labelColor: content.labelStyle?.color || \"#262626\",\n valueFontSize: content.valueStyle?.fontSize || 14,\n valueFontWeight: content.valueStyle?.fontWeight || \"normal\",\n valueColor: content.valueStyle?.color || \"#1890ff\",\n });\n }, [material.id]);\n\n const handleChange = (field: string, value: unknown) => {\n setFormData((prev) => ({ ...prev, [field]: value }));\n };\n\n const handleValueSourceChange = (code: string) => {\n const selectedOption = dataOptions.find((opt) => opt.paramsCode === code);\n const autoUnit = selectedOption?.unit || \"\";\n\n setFormData((prev) => ({\n ...prev,\n valueSourceCode: code,\n unit: autoUnit,\n value: String(selectedOption?.value || \"\"),\n }));\n\n setTimeout(() => {\n onSave({\n content: {\n ...content,\n valueSourceCode: code,\n value: String(selectedOption?.value || \"\"),\n unit: autoUnit,\n },\n } as Partial<Material>);\n }, 0);\n };\n\n const handleSave = () => {\n onSave({\n content: {\n ...content,\n label: formData.label,\n value: formData.value,\n valueSourceCode: formData.valueSourceCode,\n unit: formData.unit,\n decimals: formData.decimals,\n labelStyle: {\n fontSize: formData.labelFontSize,\n fontWeight: formData.labelFontWeight,\n color: formData.labelColor,\n },\n valueStyle: {\n fontSize: formData.valueFontSize,\n fontWeight: formData.valueFontWeight,\n color: formData.valueColor,\n },\n },\n } as Partial<Material>);\n };\n\n const boundDataOptions = dataOptions.filter((opt) =>\n bindCodes.includes(opt.paramsCode),\n );\n\n return (\n <div className=\"space-y-4\">\n <Divider style={{ marginTop: 0 }}>文本内容</Divider>\n\n <Form layout=\"vertical\">\n <Form.Item label=\"标签文本 (label)\">\n <Input\n value={formData.label}\n onChange={(e) => handleChange(\"label\", e.target.value)}\n onBlur={handleSave}\n placeholder=\"输入标签文本\"\n />\n </Form.Item>\n\n <Form.Item\n label=\"值来源\"\n help=\"从绑定的数据中选择字段,优先级高于手动输入的值\">\n <Select\n value={formData.valueSourceCode || undefined}\n onChange={handleValueSourceChange}\n placeholder=\"选择数据字段(可选)\"\n allowClear\n style={{ width: \"100%\" }}\n fieldNames={{\n value: \"paramsCode\",\n label: \"paramsName\",\n }}\n options={boundDataOptions}\n />\n </Form.Item>\n\n <Form.Item\n label={formData.valueSourceCode ? \"默认值(备用)\" : \"值文本\"}\n help={\n formData.valueSourceCode\n ? \"已绑定数据源,实际值将来自数据字段,此处仅设置无数据时的备用显示\"\n : \"手动输入显示的值\"\n }>\n <Input\n value={formData.value}\n onChange={(e) => handleChange(\"value\", e.target.value)}\n onBlur={handleSave}\n placeholder={\n formData.valueSourceCode\n ? \"数据字段无值时显示此备用值\"\n : \"输入值文本\"\n }\n disabled={!!formData.valueSourceCode}\n variant={formData.valueSourceCode ? \"filled\" : undefined}\n />\n </Form.Item>\n\n <Form.Item label=\"单位\" help=\"优先从绑定数据自动获取,也可手动输入\">\n <Input\n value={formData.unit}\n onChange={(e) => handleChange(\"unit\", e.target.value)}\n onBlur={handleSave}\n placeholder=\"单位(如°C、%、MPa等)\"\n suffix={\n formData.valueSourceCode && boundDataOptions.length > 0 ? (\n <Tag color=\"blue\" style={{ marginRight: -8 }}>\n 自动\n </Tag>\n ) : null\n }\n />\n </Form.Item>\n\n <Form.Item\n label=\"保留小数位\"\n help=\"数值格式化时保留的小数位数,-1表示不格式化\">\n <InputNumber\n value={formData.decimals}\n onChange={(v) => handleChange(\"decimals\", v ?? 2)}\n onBlur={handleSave}\n min={-1}\n max={10}\n style={{ width: \"100%\" }}\n />\n </Form.Item>\n </Form>\n\n <Divider>标签样式</Divider>\n\n <Form layout=\"vertical\">\n <Space>\n <Form.Item label=\"字体大小\">\n <InputNumber\n value={formData.labelFontSize}\n onChange={(v) => handleChange(\"labelFontSize\", v || 14)}\n onBlur={handleSave}\n min={8}\n max={72}\n />\n </Form.Item>\n\n <Form.Item label=\"字体粗细\">\n <Select\n value={formData.labelFontWeight}\n onChange={(v) => {\n handleChange(\"labelFontWeight\", v);\n setTimeout(handleSave, 0);\n }}\n style={{ width: 100 }}>\n <Option value=\"normal\">正常</Option>\n <Option value=\"bold\">粗体</Option>\n </Select>\n </Form.Item>\n </Space>\n\n <Form.Item label=\"文字颜色\">\n <div className=\"flex items-center gap-2\">\n <ColorPicker\n value={formData.labelColor || '#262626'}\n onChange={(color) => {\n handleChange(\"labelColor\", color.toHexString());\n }}\n onChangeComplete={(color) => {\n onSave({\n content: {\n ...content,\n label: formData.label,\n value: formData.value,\n valueSourceCode: formData.valueSourceCode,\n unit: formData.unit,\n decimals: formData.decimals,\n labelStyle: {\n fontSize: formData.labelFontSize,\n fontWeight: formData.labelFontWeight,\n color: color.toHexString(),\n },\n valueStyle: {\n fontSize: formData.valueFontSize,\n fontWeight: formData.valueFontWeight,\n color: formData.valueColor,\n },\n },\n } as Partial<Material>);\n }}\n />\n <Input\n value={formData.labelColor}\n onChange={(e) => handleChange(\"labelColor\", e.target.value)}\n onBlur={handleSave}\n placeholder=\"#262626\"\n style={{ width: 100 }}\n />\n </div>\n </Form.Item>\n </Form>\n\n <Divider>值样式</Divider>\n\n <Form layout=\"vertical\">\n <Space>\n <Form.Item label=\"字体大小\">\n <InputNumber\n value={formData.valueFontSize}\n onChange={(v) => handleChange(\"valueFontSize\", v || 14)}\n onBlur={handleSave}\n min={8}\n max={72}\n />\n </Form.Item>\n\n <Form.Item label=\"字体粗细\">\n <Select\n value={formData.valueFontWeight}\n onChange={(v) => {\n handleChange(\"valueFontWeight\", v);\n setTimeout(handleSave, 0);\n }}\n style={{ width: 100 }}>\n <Option value=\"normal\">正常</Option>\n <Option value=\"bold\">粗体</Option>\n </Select>\n </Form.Item>\n </Space>\n\n <Form.Item label=\"文字颜色\">\n <div className=\"flex items-center gap-2\">\n <ColorPicker\n value={formData.valueColor || '#1890ff'}\n onChange={(color) => {\n handleChange(\"valueColor\", color.toHexString());\n }}\n onChangeComplete={(color) => {\n onSave({\n content: {\n ...content,\n label: formData.label,\n value: formData.value,\n valueSourceCode: formData.valueSourceCode,\n unit: formData.unit,\n decimals: formData.decimals,\n labelStyle: {\n fontSize: formData.labelFontSize,\n fontWeight: formData.labelFontWeight,\n color: formData.labelColor,\n },\n valueStyle: {\n fontSize: formData.valueFontSize,\n fontWeight: formData.valueFontWeight,\n color: color.toHexString(),\n },\n },\n } as Partial<Material>);\n }}\n />\n <Input\n value={formData.valueColor}\n onChange={(e) => handleChange(\"valueColor\", e.target.value)}\n onBlur={handleSave}\n placeholder=\"#1890ff\"\n style={{ width: 100 }}\n />\n </div>\n </Form.Item>\n </Form>\n </div>\n );\n};\n\nexport default TextMaterialEditor;\n","import React, { useEffect, useState } from \"react\";\nimport { Form, Input, Divider } from \"antd\";\nimport { ColorPicker } from '../../ColorPicker';\nimport type { Material, ImageMaterial } from \"../../../types\";\n\ninterface ImageMaterialEditorProps {\n material: Material;\n onSave: (updates: Partial<Material>) => void;\n}\n\nexport const ImageMaterialEditor: React.FC<ImageMaterialEditorProps> = ({\n material,\n onSave,\n}) => {\n const imageMaterial = material as ImageMaterial;\n\n const [formData, setFormData] = useState({\n name: material.name,\n src: imageMaterial.src || \"\",\n backgroundColor: imageMaterial.backgroundColor || \"\",\n fillColor: imageMaterial.fillColor || \"\",\n });\n\n useEffect(() => {\n setFormData({\n name: material.name,\n src: imageMaterial.src || \"\",\n backgroundColor: imageMaterial.backgroundColor || \"\",\n fillColor: imageMaterial.fillColor || \"\",\n });\n }, [material.id]);\n\n const handleChange = (field: string, value: string) => {\n setFormData((prev) => ({ ...prev, [field]: value }));\n };\n\n const handleSave = () => {\n onSave({\n name: formData.name,\n src: formData.src,\n backgroundColor: formData.backgroundColor,\n } as Partial<Material>);\n };\n\n return (\n <div className=\"space-y-4\">\n <Divider style={{ marginTop: 0 }}>图片属性</Divider>\n\n <Form layout=\"vertical\">\n <Form.Item label=\"图片名称\">\n <Input\n value={formData.name}\n onChange={(e) => handleChange(\"name\", e.target.value)}\n onBlur={handleSave}\n />\n </Form.Item>\n\n <Form.Item label=\"图片地址 (src)\">\n <Input.TextArea\n value={formData.src}\n onChange={(e) => handleChange(\"src\", e.target.value)}\n onBlur={handleSave}\n rows={4}\n placeholder=\"输入图片 URL 或 Data URI\"\n />\n </Form.Item>\n\n <Form.Item label=\"填充颜色(基本形状)\">\n <div className=\"flex items-center gap-2\">\n <ColorPicker\n value={formData.fillColor || '#1890ff'}\n onChange={(color) => {\n const newColor = color.toHexString();\n handleChange(\"fillColor\", newColor);\n // 立即保存到 store\n onSave({\n name: formData.name,\n src: formData.src,\n backgroundColor: formData.backgroundColor,\n fillColor: newColor,\n } as Partial<Material>);\n }}\n />\n <Input\n value={formData.fillColor}\n onChange={(e) => handleChange(\"fillColor\", e.target.value)}\n onBlur={handleSave}\n placeholder=\"#1890ff\"\n />\n </div>\n </Form.Item>\n\n <Form.Item label=\"背景颜色\">\n <div className=\"flex items-center gap-2\">\n <ColorPicker\n value={formData.backgroundColor || '#1890ff'}\n onChange={(color) => {\n const newColor = color.toHexString();\n handleChange(\"backgroundColor\", newColor);\n // 立即保存到 store\n onSave({\n name: formData.name,\n src: formData.src,\n backgroundColor: newColor,\n fillColor: formData.fillColor,\n } as Partial<Material>);\n }}\n />\n <Input\n value={formData.backgroundColor}\n onChange={(e) => handleChange(\"backgroundColor\", e.target.value)}\n onBlur={handleSave}\n placeholder=\"#1890ff\"\n />\n </div>\n </Form.Item>\n </Form>\n </div>\n );\n};\n\nexport default ImageMaterialEditor;\n","import React, { useEffect, useState } from \"react\";\nimport { Form, InputNumber, Select, Divider, Button, Space, Input } from \"antd\";\nimport { ColorPicker } from '../../ColorPicker';\nimport type { Material, LineMaterial } from \"../../../types\";\n\nconst { Option } = Select;\n\ninterface LineMaterialEditorProps {\n material: Material;\n onSave: (updates: Partial<Material>) => void;\n}\n\nexport const LineMaterialEditor: React.FC<LineMaterialEditorProps> = ({\n material,\n onSave,\n}) => {\n const lineConfig = (material as LineMaterial).config || {};\n\n const [formData, setFormData] = useState({\n lineWeight: lineConfig.lineWeight || lineConfig.thickness || 2,\n color: lineConfig.color || \"#262626\",\n lineType: lineConfig.lineType || \"solid\",\n startX: lineConfig.startX ?? 0,\n startY: lineConfig.startY ?? 0,\n endX: lineConfig.endX ?? 100,\n endY: lineConfig.endY ?? 0,\n });\n\n useEffect(() => {\n setFormData({\n lineWeight: lineConfig.lineWeight || lineConfig.thickness || 2,\n color: lineConfig.color || \"#262626\",\n lineType: lineConfig.lineType || \"solid\",\n startX: lineConfig.startX ?? 0,\n startY: lineConfig.startY ?? 0,\n endX: lineConfig.endX ?? 100,\n endY: lineConfig.endY ?? 0,\n });\n }, [material.id]);\n\n const handleSaveWithValues = (newValues: Partial<typeof formData>) => {\n const newFormData = { ...formData, ...newValues };\n setFormData(newFormData);\n \n onSave({\n config: {\n ...lineConfig,\n thickness: newFormData.lineWeight,\n lineWeight: newFormData.lineWeight,\n color: newFormData.color,\n lineType: newFormData.lineType,\n startX: newFormData.startX,\n startY: newFormData.startY,\n endX: newFormData.endX,\n endY: newFormData.endY,\n },\n } as Partial<Material>);\n };\n\n const lineTypeOptions = [\n { value: \"solid\", label: \"实线\", desc: \"连续实线\" },\n { value: \"dashed\", label: \"虚线\", desc: \"长划间隔\" },\n { value: \"center\", label: \"点画线(中心线)\", desc: \"长点-短点交替\" },\n { value: \"phantom\", label: \"假想线\", desc: \"长划-双点交替\" },\n { value: \"dot\", label: \"点线\", desc: \"密集点状\" },\n { value: \"dash-dot\", label: \"画点线\", desc: \"长划-点交替\" },\n ];\n\n return (\n <div className=\"space-y-4\">\n <Divider style={{ marginTop: 0 }}>起止位置(相对节点)</Divider>\n \n <Form layout=\"vertical\">\n <div className=\"grid grid-cols-2 gap-2\">\n <Form.Item label=\"起点 X\" className=\"mb-2\">\n <InputNumber\n value={formData.startX}\n onChange={(v) => handleSaveWithValues({ startX: v ?? 0 })}\n style={{ width: '100%' }}\n />\n </Form.Item>\n <Form.Item label=\"起点 Y\" className=\"mb-2\">\n <InputNumber\n value={formData.startY}\n onChange={(v) => handleSaveWithValues({ startY: v ?? 0 })}\n style={{ width: '100%' }}\n />\n </Form.Item>\n <Form.Item label=\"终点 X\" className=\"mb-2\">\n <InputNumber\n value={formData.endX}\n onChange={(v) => handleSaveWithValues({ endX: v ?? 100 })}\n style={{ width: '100%' }}\n />\n </Form.Item>\n <Form.Item label=\"终点 Y\" className=\"mb-2\">\n <InputNumber\n value={formData.endY}\n onChange={(v) => handleSaveWithValues({ endY: v ?? 0 })}\n style={{ width: '100%' }}\n />\n </Form.Item>\n </div>\n \n <Form.Item label=\"快速对齐\" className=\"mt-4\">\n <Space>\n <Button \n size=\"small\" \n onClick={() => {\n // 使用 lineConfig 中的最新值,确保同步\n const currentStartY = lineConfig.startY ?? formData.startY;\n handleSaveWithValues({ endY: currentStartY });\n }}\n title=\"将线条变为水平线\">\n 水平\n </Button>\n <Button \n size=\"small\" \n onClick={() => {\n // 使用 lineConfig 中的最新值,确保同步\n const currentStartX = lineConfig.startX ?? formData.startX;\n handleSaveWithValues({ endX: currentStartX });\n }}\n title=\"将线条变为垂直线\">\n 垂直\n </Button>\n <Button \n size=\"small\"\n onClick={() => {\n // 使用 lineConfig 中的最新值,确保同步\n const currentStartX = lineConfig.startX ?? formData.startX;\n const currentStartY = lineConfig.startY ?? formData.startY;\n const currentEndX = lineConfig.endX ?? formData.endX;\n const currentEndY = lineConfig.endY ?? formData.endY;\n handleSaveWithValues({ \n startX: currentEndX,\n startY: currentEndY,\n endX: currentStartX,\n endY: currentStartY,\n });\n }}\n title=\"交换起点和终点\">\n 反向\n </Button>\n </Space>\n </Form.Item>\n </Form>\n\n <Divider>线条属性</Divider>\n\n <Form layout=\"vertical\">\n <Form.Item label=\"线型\" help=\"选择线条样式\">\n <Select\n value={formData.lineType}\n onChange={(v) => handleSaveWithValues({ lineType: v })}>\n {lineTypeOptions.map((opt) => (\n <Option key={opt.value} value={opt.value}>\n <div className=\"flex flex-col\">\n <span>{opt.label}</span>\n <span className=\"text-xs text-gray-400\">{opt.desc}</span>\n </div>\n </Option>\n ))}\n </Select>\n </Form.Item>\n\n <Form.Item label=\"线宽(像素)\">\n <InputNumber\n value={formData.lineWeight}\n onChange={(v) => handleSaveWithValues({ lineWeight: v || 2 })}\n min={1}\n max={20}\n style={{ width: 120 }}\n />\n </Form.Item>\n\n <Form.Item label=\"颜色\">\n <div className=\"flex items-center gap-2\">\n <ColorPicker\n value={formData.color || '#d9d9d9'}\n onChange={(color) => handleSaveWithValues({ color: color.toHexString() })}\n />\n <Input\n value={formData.color}\n onChange={(e) => handleSaveWithValues({ color: e.target.value })}\n placeholder=\"#d9d9d9\"\n style={{ width: 100 }}\n />\n </div>\n </Form.Item>\n </Form>\n </div>\n );\n};\n\nexport default LineMaterialEditor;\n","import React from \"react\";\nimport { TextMaterialEditor } from \"./TextMaterialEditor\";\nimport { ImageMaterialEditor } from \"./ImageMaterialEditor\";\nimport { LineMaterialEditor } from \"./LineMaterialEditor\";\nimport type { Material } from \"../../../types\";\nimport type { DataOption } from \"../types\";\n\ninterface MaterialPropertyEditorProps {\n material: Material;\n onSave: (updates: Partial<Material>) => void;\n bindCodes?: string[];\n dataOptions?: DataOption[];\n}\n\nexport const MaterialPropertyEditor: React.FC<MaterialPropertyEditorProps> = ({\n material,\n onSave,\n bindCodes,\n dataOptions,\n}) => {\n switch (material.type) {\n case \"TEXT\":\n return (\n <TextMaterialEditor\n material={material}\n onSave={onSave}\n bindCodes={bindCodes}\n dataOptions={dataOptions}\n />\n );\n case \"IMAGE\":\n return <ImageMaterialEditor material={material} onSave={onSave} />;\n case \"LINE\":\n return <LineMaterialEditor material={material} onSave={onSave} />;\n default:\n return (\n <div className=\"text-center text-gray-400 py-8\">\n 暂不支持编辑此类型的物料\n </div>\n );\n }\n};\n\nexport default MaterialPropertyEditor;\n","import React from \"react\";\nimport { Collapse, Button, Form, Input, Select, Tag, Space, Divider } from \"antd\";\nimport { PlusOutlined, DeleteOutlined, ArrowUpOutlined, ArrowDownOutlined } from \"@ant-design/icons\";\nimport { nanoid } from \"nanoid\";\nimport type { Material, NodeStatus, Node, GroupNode } from \"../../../types\";\nimport type { DataOption } from \"../types\";\nimport { MaterialPropertyEditor } from \"./MaterialPropertyEditor\";\n\nconst { Panel } = Collapse;\nconst { TextArea } = Input;\n\ninterface GroupNodeStatusEditorProps {\n node: GroupNode;\n updateNode: (nodeId: string, updates: Partial<Node>) => void;\n materials: Material[];\n bindCodes?: string[];\n dataOptions?: DataOption[];\n}\n\nexport const GroupNodeStatusEditor: React.FC<GroupNodeStatusEditorProps> = ({\n node,\n updateNode,\n materials,\n}) => {\n // 获取可用的物料列表(排除群组类型)\n const availableMaterials = materials.filter(m => m.type !== 'CUSTOM' || !m.config?.nodes);\n\n // 更新子节点的状态列表\n const handleUpdateChildStatusList = (childId: string, newStatusList: NodeStatus[]) => {\n const newChildren = node.children?.map(child => {\n if (child.id === childId) {\n return {\n ...child,\n contentInfo: {\n ...child.contentInfo,\n statusList: newStatusList,\n },\n };\n }\n return child;\n });\n\n updateNode(node.id, {\n children: newChildren,\n } as Partial<Node>);\n };\n\n // 添加状态到子节点\n const handleAddChildStatus = (childId: string) => {\n const child = node.children?.find(c => c.id === childId);\n if (!child) return;\n\n const newStatus: NodeStatus = {\n id: nanoid(),\n name: `状态${child.contentInfo.statusList.length + 1}`,\n expression: child.contentInfo.statusList.length === 0 ? 'return true;' : 'return false;',\n material: { ...availableMaterials[0], id: nanoid() } as Material,\n bindCodes: [],\n };\n\n handleUpdateChildStatusList(childId, [...child.contentInfo.statusList, newStatus]);\n };\n\n // 删除子节点的状态\n const handleDeleteChildStatus = (childId: string, statusId: string) => {\n const child = node.children?.find(c => c.id === childId);\n if (!child) return;\n\n const newStatusList = child.contentInfo.statusList.filter(s => s.id !== statusId);\n handleUpdateChildStatusList(childId, newStatusList);\n };\n\n // 更新子节点的某个状态\n const handleUpdateChildStatus = (childId: string, statusId: string, updates: Partial<NodeStatus>) => {\n const child = node.children?.find(c => c.id === childId);\n if (!child) return;\n\n const newStatusList = child.contentInfo.statusList.map(s => {\n if (s.id === statusId) {\n return { ...s, ...updates } as NodeStatus;\n }\n return s;\n });\n\n handleUpdateChildStatusList(childId, newStatusList);\n };\n\n // 移动子节点状态\n const handleMoveChildStatus = (childId: string, statusId: string, direction: 'up' | 'down') => {\n const child = node.children?.find(c => c.id === childId);\n if (!child) return;\n\n const index = child.contentInfo.statusList.findIndex(s => s.id === statusId);\n if (index === -1) return;\n\n const newStatusList = [...child.contentInfo.statusList];\n if (direction === 'up' && index > 0) {\n [newStatusList[index], newStatusList[index - 1]] = [newStatusList[index - 1], newStatusList[index]];\n } else if (direction === 'down' && index < newStatusList.length - 1) {\n [newStatusList[index], newStatusList[index + 1]] = [newStatusList[index + 1], newStatusList[index]];\n }\n\n handleUpdateChildStatusList(childId, newStatusList);\n };\n\n // 更换子节点状态的物料\n const handleChangeChildStatusMaterial = (childId: string, statusId: string, materialId: string) => {\n const selectedMaterial = materials.find(m => m.id === materialId);\n if (!selectedMaterial) return;\n\n handleUpdateChildStatus(childId, statusId, {\n material: { ...selectedMaterial, id: nanoid() },\n });\n };\n\n return (\n <div className=\"space-y-4\">\n <div className=\"p-3 bg-blue-50 border border-blue-200 rounded-lg mb-4\">\n <div className=\"text-sm text-blue-700\">\n <strong>群组节点</strong>:为每个子节点配置多个状态和绑定\n </div>\n </div>\n\n <Collapse ghost>\n {node.children?.map((child, childIndex) => (\n <Panel\n key={child.id}\n header={\n <div className=\"flex items-center justify-between w-full pr-4\">\n <span className=\"font-medium text-sm\">子节点 {childIndex + 1}</span>\n <Tag color=\"blue\" style={{ fontSize: '12px', padding: '0 4px' }}>\n {child.contentInfo.statusList.length} 个状态\n </Tag>\n </div>\n }>\n <div className=\"space-y-3\">\n {/* 添加状态按钮 */}\n <div className=\"flex justify-between items-center mb-3\">\n <span className=\"text-sm text-gray-600\">状态列表</span>\n <Button\n type=\"primary\"\n size=\"small\"\n icon={<PlusOutlined />}\n onClick={() => handleAddChildStatus(child.id)}\n >\n 添加状态\n </Button>\n </div>\n\n {child.contentInfo.statusList.length === 0 ? (\n <div className=\"text-center text-gray-400 py-4 bg-gray-50 rounded-lg\">\n 暂无状态,点击上方按钮添加\n </div>\n ) : (\n <Collapse ghost>\n {child.contentInfo.statusList.map((status, statusIndex) => (\n <Panel\n key={status.id}\n header={\n <div className=\"flex items-center gap-2\">\n <span className=\"text-xs text-gray-400 w-5\">{statusIndex + 1}</span>\n <span className=\"font-medium\">{status.name}</span>\n <Tag color=\"default\" className=\"text-xs\">{status.material.type}</Tag>\n </div>\n }\n extra={\n <Space size=\"small\" onClick={(e) => e.stopPropagation()}>\n <Button\n type=\"text\"\n size=\"small\"\n icon={<ArrowUpOutlined />}\n disabled={statusIndex === 0}\n onClick={(e) => {\n e.stopPropagation();\n handleMoveChildStatus(child.id, status.id, 'up');\n }}\n />\n <Button\n type=\"text\"\n size=\"small\"\n icon={<ArrowDownOutlined />}\n disabled={statusIndex === child.contentInfo.statusList.length - 1}\n onClick={(e) => {\n e.stopPropagation();\n handleMoveChildStatus(child.id, status.id, 'down');\n }}\n />\n <Button\n type=\"text\"\n size=\"small\"\n danger\n icon={<DeleteOutlined />}\n onClick={(e) => {\n e.stopPropagation();\n handleDeleteChildStatus(child.id, status.id);\n }}\n />\n </Space>\n }\n >\n <Form layout=\"vertical\">\n {/* 状态名称 */}\n <Form.Item label=\"状态名称\">\n <Input\n value={status.name}\n onChange={(e) => handleUpdateChildStatus(child.id, status.id, { name: e.target.value })}\n placeholder=\"输入状态名称\"\n />\n </Form.Item>\n\n {/* 执行表达式 */}\n <Form.Item\n label=\"执行表达式\"\n help=\"返回 true 时激活此状态,可使用 data 变量访问绑定数据\"\n >\n <TextArea\n value={status.expression}\n onChange={(e) => handleUpdateChildStatus(child.id, status.id, { expression: e.target.value })}\n rows={3}\n placeholder=\"return true;\"\n />\n </Form.Item>\n\n {/* 绑定数据源 */}\n <Form.Item label=\"绑定数据源 (bindCodes)\">\n <Select\n mode=\"tags\"\n value={status.bindCodes || []}\n onChange={(value) => handleUpdateChildStatus(child.id, status.id, { bindCodes: value })}\n placeholder=\"输入数据源 code\"\n tokenSeparators={[\",\", \" \"]}\n />\n </Form.Item>\n\n {/* 更换物料 */}\n <Form.Item label=\"更换物料\">\n <div className=\"flex items-center gap-2\">\n <Tag color=\"blue\">{status.material.name}</Tag>\n <Tag color=\"default\">{status.material.type}</Tag>\n <Select\n placeholder=\"选择新物料\"\n style={{ width: 150 }}\n value={undefined}\n onChange={(value) => value && handleChangeChildStatusMaterial(child.id, status.id, value)}\n options={availableMaterials.map(m => ({\n value: m.id,\n label: `${m.name} (${m.type})`,\n }))}\n />\n </div>\n </Form.Item>\n\n {/* 物料属性编辑 */}\n <Divider style={{ margin: '12px 0' }} />\n <div className=\"bg-gray-50 rounded-lg p-3 border border-gray-200\">\n <div className=\"flex items-center justify-between mb-2\">\n <span className=\"text-sm font-medium\">物料属性</span>\n <Tag>{status.material.name}</Tag>\n </div>\n <MaterialPropertyEditor\n material={status.material}\n onSave={(updates) => {\n const newMaterial = { ...status.material, ...updates } as Material;\n handleUpdateChildStatus(child.id, status.id, { material: newMaterial });\n }}\n />\n </div>\n </Form>\n </Panel>\n ))}\n </Collapse>\n )}\n </div>\n </Panel>\n ))}\n </Collapse>\n </div>\n );\n};\n","import React, { useEffect, useState } from \"react\";\nimport {\n Form,\n Input,\n InputNumber,\n Select,\n Switch,\n Collapse,\n Button,\n Empty,\n Tabs,\n Space,\n Tag,\n Modal,\n Divider,\n} from \"antd\";\nimport {\n PlusOutlined,\n DeleteOutlined,\n ArrowUpOutlined,\n ArrowDownOutlined,\n CopyOutlined,\n EditOutlined,\n} from \"@ant-design/icons\";\nimport { useEditorStore } from \"../../store/editorStore\";\nimport type { Material, NodeStatus, Node } from \"../../types\";\nimport { nanoid } from \"nanoid\";\nimport { MaterialPropertyEditor, GroupNodeStatusEditor } from \"./editors\";\nimport type { DataOption } from \"./types\";\n\nconst { Panel } = Collapse;\nconst { TabPane } = Tabs;\nconst { TextArea } = Input;\n\ninterface PropertyPanelProps {\n defaultTestData?: DataOption[];\n}\n\nexport const PropertyPanel: React.FC<PropertyPanelProps> = ({\n defaultTestData,\n}) => {\n const {\n nodes,\n selectedNodeId,\n updateNode,\n updateNodeStyle,\n updateNodeControl,\n updateNodeContent,\n materials,\n selectedStatusId,\n selectStatus,\n } = useEditorStore();\n\n const [form] = Form.useForm();\n const [activeTab, setActiveTab] = useState(\"basic\");\n const [materialModalVisible, setMaterialModalVisible] = useState(false);\n const [editingStatusId, setEditingStatusId] = useState<string | null>(null);\n const [editingExpressions, setEditingExpressions] = useState<\n Record<string, string>\n >({});\n\n const selectedNode = React.useMemo(() => {\n return nodes.find((n) => n.id === selectedNodeId);\n }, [nodes, selectedNodeId]);\n\n const currentStatusList = selectedNode?.contentInfo.statusList || [];\n\n const handleValuesChange = (changedValues: Record<string, unknown>) => {\n if (!selectedNodeId) return;\n\n if (changedValues.normalStyle) {\n updateNodeStyle(selectedNodeId, changedValues.normalStyle as Record<string, unknown>);\n }\n\n if (changedValues.name !== undefined) {\n updateNode(selectedNodeId, { name: changedValues.name as string });\n }\n\n if (changedValues.controlInfo) {\n updateNodeControl(selectedNodeId, changedValues.controlInfo as Record<string, unknown>);\n }\n };\n console.log(selectedNodeId, 'selectedNodeId', selectedNode);\n\n useEffect(() => {\n if (!selectedNode) return;\n\n if (selectedNode) {\n form.setFieldsValue({\n name: selectedNode.name,\n normalStyle: {\n width: 100,\n height: 100,\n x: 0,\n y: 0,\n padding: 8,\n background: \"transparent\",\n borderRadius: 0,\n opacity: 1,\n ...selectedNode.normalStyle,\n },\n controlInfo: {\n isDraggable: true,\n isClickable: true,\n isResizable: true,\n isSelectable: true,\n ...selectedNode.controlInfo,\n },\n });\n selectStatus(null);\n }\n }, [selectedNode, selectStatus, form]);\n\n const handleAddStatus = () => {\n if (!selectedNodeId || !selectedNode) return;\n setEditingStatusId(\"new\");\n setMaterialModalVisible(true);\n };\n\n const handleSelectMaterialForStatus = (material: Material) => {\n if (!selectedNodeId || !selectedNode) return;\n\n const newStatus: NodeStatus = {\n id: nanoid(),\n name: `${material.name}_状态${currentStatusList.length + 1}`,\n expression: currentStatusList.length === 0 ? \"return true;\" : \"return false;\",\n material: { ...material, id: nanoid() },\n bindCodes: [],\n };\n\n if (editingStatusId === \"new\") {\n const newStatusList = [...currentStatusList, newStatus];\n updateNodeContent(selectedNodeId, { statusList: newStatusList });\n } else if (editingStatusId) {\n const newStatusList = currentStatusList.map((s) => {\n if (s.id === editingStatusId) {\n return { ...s, material: { ...material, id: nanoid() } };\n }\n return s;\n });\n updateNodeContent(selectedNodeId, { statusList: newStatusList });\n }\n\n setMaterialModalVisible(false);\n setEditingStatusId(null);\n };\n\n const handleDeleteStatus = (statusId: string) => {\n if (!selectedNodeId || !selectedNode) return;\n\n const newStatusList =\n selectedNode.contentInfo.statusList?.filter((s) => s.id !== statusId) || [];\n updateNodeContent(selectedNodeId, { statusList: newStatusList });\n\n if (selectedStatusId === statusId) {\n selectStatus(null);\n }\n };\n\n const handleUpdateStatus = (statusId: string, updates: Partial<NodeStatus>) => {\n if (!selectedNodeId || !selectedNode) return;\n\n const newStatusList =\n selectedNode.contentInfo.statusList?.map((s) => {\n if (s.id === statusId) {\n return { ...s, ...updates };\n }\n return s;\n }) || [];\n\n updateNodeContent(selectedNodeId, { statusList: newStatusList });\n };\n\n const handleCopyStatus = (status: NodeStatus) => {\n if (!selectedNodeId || !selectedNode) return;\n\n const newStatus: NodeStatus = {\n ...status,\n id: nanoid(),\n name: `${status.name}_复制`,\n expression: \"return false;\",\n };\n\n const newStatusList = [...currentStatusList, newStatus];\n updateNodeContent(selectedNodeId, { statusList: newStatusList });\n };\n\n const handleMoveStatus = (statusId: string, direction: \"up\" | \"down\") => {\n if (!selectedNodeId || !selectedNode) return;\n\n const index = currentStatusList.findIndex((s) => s.id === statusId);\n if (index === -1) return;\n\n const newStatusList = [...currentStatusList];\n if (direction === \"up\" && index > 0) {\n [newStatusList[index], newStatusList[index - 1]] = [\n newStatusList[index - 1],\n newStatusList[index],\n ];\n } else if (direction === \"down\" && index < newStatusList.length - 1) {\n [newStatusList[index], newStatusList[index + 1]] = [\n newStatusList[index + 1],\n newStatusList[index],\n ];\n }\n\n updateNodeContent(selectedNodeId, { statusList: newStatusList });\n };\n\n const handleChangeStatusMaterial = (statusId: string) => {\n setEditingStatusId(statusId);\n setMaterialModalVisible(true);\n };\n\n const handleUpdateStatusMaterial = (statusId: string, updates: Partial<Material>) => {\n if (!selectedNodeId || !selectedNode) return;\n\n const newStatusList = currentStatusList.map((s) => {\n if (s.id === statusId) {\n return {\n ...s,\n material: { ...s.material, ...updates } as Material,\n };\n }\n return s;\n });\n\n updateNodeContent(selectedNodeId, { statusList: newStatusList });\n };\n\n if (!selectedNode) {\n return (\n <div className=\"h-full flex items-center justify-center bg-white border-l border-gray-200\">\n <Empty description=\"请选择一个节点\" />\n </div>\n );\n }\n\n return (\n <div className=\"h-full flex flex-col bg-white border-l border-gray-200\">\n <div className=\"p-4 border-b border-gray-200\">\n <h3 className=\"text-lg font-semibold text-gray-800\">属性面板</h3>\n <p className=\"text-sm text-gray-500\">编辑选中节点的属性</p>\n </div>\n\n <div className=\"flex-1 overflow-y-auto p-4\">\n <Tabs activeKey={activeTab} onChange={setActiveTab}>\n <TabPane tab=\"基础\" key=\"basic\">\n <Form\n form={form}\n layout=\"vertical\"\n onValuesChange={handleValuesChange}\n initialValues={{ name: selectedNode.name }}\n >\n <Form.Item label=\"节点名称\" name=\"name\">\n <Input placeholder=\"输入节点名称\" />\n </Form.Item>\n\n <Collapse ghost defaultActiveKey={[\"position\", \"size\", \"style\"]}>\n <Panel header=\"位置\" key=\"position\">\n <Space>\n <Form.Item label=\"X\" name={[\"normalStyle\", \"x\"]}>\n <InputNumber />\n </Form.Item>\n <Form.Item label=\"Y\" name={[\"normalStyle\", \"y\"]}>\n <InputNumber />\n </Form.Item>\n </Space>\n </Panel>\n\n <Panel header=\"尺寸\" key=\"size\">\n <Space>\n <Form.Item label=\"宽度\" name={[\"normalStyle\", \"width\"]}>\n <InputNumber min={10} />\n </Form.Item>\n <Form.Item label=\"高度\" name={[\"normalStyle\", \"height\"]}>\n <InputNumber min={10} />\n </Form.Item>\n </Space>\n </Panel>\n\n <Panel header=\"样式\" key=\"style\">\n <Form.Item label=\"背景色\" name={[\"normalStyle\", \"background\"]}>\n <Input placeholder=\"transparent, #fff, url(...)\" />\n </Form.Item>\n\n <Form.Item label=\"内边距\" name={[\"normalStyle\", \"padding\"]}>\n <InputNumber min={0} />\n </Form.Item>\n\n <Form.Item label=\"圆角\" name={[\"normalStyle\", \"borderRadius\"]}>\n <InputNumber min={0} />\n </Form.Item>\n\n <Form.Item\n label=\"缩放比例\"\n name={[\"normalStyle\", \"scale\"]}\n help=\"等比缩放节点的宽高\"\n >\n <InputNumber min={0.1} max={5} step={0.1} />\n </Form.Item>\n\n <Form.Item\n label=\"旋转角度\"\n name={[\"normalStyle\", \"rotate\"]}\n help=\"顺时针旋转角度(度)\"\n >\n <InputNumber min={0} max={360} step={1} />\n </Form.Item>\n\n <Form.Item label=\"透明度\" name={[\"normalStyle\", \"opacity\"]}>\n <InputNumber min={0} max={1} step={0.1} />\n </Form.Item>\n\n <Form.Item label=\"层级\" name={[\"normalStyle\", \"zIndex\"]}>\n <InputNumber />\n </Form.Item>\n </Panel>\n </Collapse>\n </Form>\n </TabPane>\n\n <TabPane tab=\"状态\" key=\"status\">\n {selectedNode.type === \"group\" && selectedNode.children ? (\n <GroupNodeStatusEditor\n node={selectedNode}\n updateNode={updateNode}\n materials={materials}\n />\n ) : (\n <div className=\"mb-4\">\n <div className=\"flex items-center justify-between mb-2\">\n <span className=\"font-medium\">\n 状态列表\n <Tag color=\"blue\" className=\"ml-2\">\n {currentStatusList.length}\n </Tag>\n </span>\n <Button\n type=\"primary\"\n size=\"small\"\n icon={<PlusOutlined />}\n onClick={handleAddStatus}\n >\n 添加状态\n </Button>\n </div>\n\n <p className=\"text-xs text-gray-500 mb-3\">\n 节点根据状态表达式计算结果显示对应物料,第一个返回 true 的状态为当前状态\n </p>\n\n {currentStatusList.length > 0 && (\n <div className=\"mb-4 p-3 bg-blue-50 border border-blue-200 rounded-lg\">\n <div className=\"flex items-center justify-between\">\n <div>\n <span className=\"text-sm text-gray-600\">当前状态:</span>\n <span className=\"ml-2 text-sm font-medium text-blue-600\">\n 由表达式自动计算\n </span>\n </div>\n </div>\n </div>\n )}\n\n {currentStatusList.length === 0 ? (\n <div className=\"text-center text-gray-400 py-4 bg-gray-50 rounded-lg\">\n 暂无状态,点击上方按钮添加\n </div>\n ) : (\n <Collapse ghost defaultActiveKey={currentStatusList[0]?.id + selectedNodeId}>\n {currentStatusList.map((status, index) => (\n <Panel\n key={status.id + selectedNodeId}\n header={\n <div className=\"flex items-center gap-2\">\n <span className=\"text-xs text-gray-400 w-5\">{index + 1}</span>\n <span className=\"font-medium\">{status.name}</span>\n <Tag color=\"default\" className=\"text-xs\">\n {status.material.type}\n </Tag>\n </div>\n }\n extra={\n <Space size=\"small\" onClick={(e) => e.stopPropagation()}>\n <Button\n type=\"text\"\n size=\"small\"\n icon={<ArrowUpOutlined />}\n disabled={index === 0}\n onClick={(e) => {\n e.stopPropagation();\n handleMoveStatus(status.id, \"up\");\n }}\n />\n <Button\n type=\"text\"\n size=\"small\"\n icon={<ArrowDownOutlined />}\n disabled={index === currentStatusList.length - 1}\n onClick={(e) => {\n e.stopPropagation();\n handleMoveStatus(status.id, \"down\");\n }}\n />\n <Button\n type=\"text\"\n size=\"small\"\n icon={<CopyOutlined />}\n onClick={(e) => {\n e.stopPropagation();\n handleCopyStatus(status);\n }}\n />\n <Button\n type=\"text\"\n size=\"small\"\n danger\n icon={<DeleteOutlined />}\n onClick={(e) => {\n e.stopPropagation();\n handleDeleteStatus(status.id);\n }}\n />\n </Space>\n }\n >\n <Form layout=\"vertical\">\n <Form.Item label=\"状态名称\">\n <Input\n value={status.name}\n onChange={(e) =>\n handleUpdateStatus(status.id, { name: e.target.value })\n }\n placeholder=\"输入状态名称\"\n />\n </Form.Item>\n\n <Form.Item\n label=\"执行表达式\"\n help=\"返回 true 时激活此状态,可使用 data 变量访问绑定数据\"\n >\n <TextArea\n value={editingExpressions[status.id] ?? status.expression}\n onChange={(e) =>\n setEditingExpressions((prev) => ({\n ...prev,\n [status.id]: e.target.value,\n }))\n }\n onBlur={(e) => {\n handleUpdateStatus(status.id, { expression: e.target.value });\n setEditingExpressions((prev) => {\n const newState = { ...prev };\n delete newState[status.id];\n return newState;\n });\n }}\n rows={3}\n placeholder=\"return true;\"\n />\n </Form.Item>\n\n <Form.Item label=\"绑定数据源 (bindCodes)\">\n <Select\n mode=\"tags\"\n value={status.bindCodes || []}\n onChange={(value) =>\n handleUpdateStatus(status.id, { bindCodes: value })\n }\n placeholder=\"输入数据源 code\"\n tokenSeparators={[\",\", \" \"]}\n />\n </Form.Item>\n\n <Form.Item label=\"绑定物料\">\n <div className=\"flex items-center gap-2\">\n <Tag color=\"blue\">{status.material.name}</Tag>\n <Tag color=\"default\">{status.material.type}</Tag>\n <Button\n type=\"link\"\n size=\"small\"\n icon={<EditOutlined />}\n onClick={() => handleChangeStatusMaterial(status.id)}\n >\n 更换物料\n </Button>\n </div>\n </Form.Item>\n\n {/* 状态物料属性编辑 */}\n <Divider style={{ margin: \"12px 0\" }} />\n <div className=\"bg-gray-50 rounded-lg p-3 border border-gray-200\">\n <div className=\"flex items-center justify-between mb-2\">\n <span className=\"text-sm font-medium\">物料属性</span>\n <Tag>{status.material.name}</Tag>\n </div>\n <MaterialPropertyEditor\n material={status.material}\n onSave={(updates) =>\n handleUpdateStatusMaterial(status.id, updates)\n }\n bindCodes={status.bindCodes || []}\n dataOptions={defaultTestData || []}\n />\n </div>\n </Form>\n </Panel>\n ))}\n </Collapse>\n )}\n </div>\n )}\n </TabPane>\n\n <TabPane tab=\"控制\" key=\"control\">\n <Form\n form={form}\n layout=\"vertical\"\n onValuesChange={handleValuesChange}\n >\n <Form.Item\n label=\"可拖拽\"\n name={[\"controlInfo\", \"isDraggable\"]}\n valuePropName=\"checked\"\n >\n <Switch />\n </Form.Item>\n\n <Form.Item\n label=\"可点击\"\n name={[\"controlInfo\", \"isClickable\"]}\n valuePropName=\"checked\"\n >\n <Switch />\n </Form.Item>\n\n <Form.Item\n label=\"可调整大小\"\n name={[\"controlInfo\", \"isResizable\"]}\n valuePropName=\"checked\"\n >\n <Switch />\n </Form.Item>\n\n <Form.Item\n label=\"可选中\"\n name={[\"controlInfo\", \"isSelectable\"]}\n valuePropName=\"checked\"\n >\n <Switch />\n </Form.Item>\n </Form>\n </TabPane>\n\n </Tabs>\n </div>\n\n <div className=\"p-3 border-t border-gray-200 bg-gray-50\">\n <div className=\"text-xs text-gray-500\">\n <div>节点 ID: {selectedNode.id.slice(0, 8)}...</div>\n <div>状态数: {currentStatusList.length}</div>\n </div>\n </div>\n\n <Modal\n title=\"选择物料\"\n open={materialModalVisible}\n onCancel={() => {\n setMaterialModalVisible(false);\n setEditingStatusId(null);\n }}\n footer={null}\n width={600}\n >\n <div className=\"max-h-[400px] overflow-y-auto\">\n <Collapse ghost defaultActiveKey={[\"basic\", \"device\", \"text\", \"line\"]}>\n <Panel header=\"基础形状\" key=\"basic\">\n <div className=\"grid grid-cols-4 gap-2\">\n {materials\n .filter((m) => [\"矩形\", \"圆形\", \"圆角矩形\"].includes(m.name))\n .map((material) => (\n <MaterialCard\n key={material.id}\n material={material}\n onClick={() => handleSelectMaterialForStatus(material)}\n />\n ))}\n </div>\n </Panel>\n\n <Panel header=\"设备图标\" key=\"device\">\n <div className=\"grid grid-cols-4 gap-2\">\n {materials\n .filter(\n (m) =>\n [\"阀门\", \"泵\", \"罐体\"].includes(m.name) ||\n (m.type === \"IMAGE\" &&\n ![\"矩形\", \"圆形\", \"圆角矩形\"].includes(m.name))\n )\n .map((material) => (\n <MaterialCard\n key={material.id}\n material={material}\n onClick={() => handleSelectMaterialForStatus(material)}\n />\n ))}\n </div>\n </Panel>\n\n <Panel header=\"文本\" key=\"text\">\n <div className=\"grid grid-cols-4 gap-2\">\n {materials\n .filter((m) => m.type === \"TEXT\")\n .map((material) => (\n <div\n key={material.id}\n className=\"border rounded-lg p-2 cursor-pointer hover:border-blue-500 hover:bg-blue-50 transition-all text-center\"\n onClick={() => handleSelectMaterialForStatus(material)}\n >\n <div className=\"w-12 h-12 mx-auto mb-1 flex items-center justify-center bg-gray-100 rounded\">\n <span className=\"text-lg font-bold text-gray-500\">T</span>\n </div>\n <span className=\"text-xs\">{material.name}</span>\n </div>\n ))}\n </div>\n </Panel>\n\n <Panel header=\"线条\" key=\"line\">\n <div className=\"grid grid-cols-4 gap-2\">\n {materials\n .filter((m) => m.type === \"LINE\")\n .map((material) => (\n <div\n key={material.id}\n className=\"border rounded-lg p-2 cursor-pointer hover:border-blue-500 hover:bg-blue-50 transition-all text-center\"\n onClick={() => handleSelectMaterialForStatus(material)}\n >\n <div className=\"w-12 h-12 mx-auto mb-1 flex items-center justify-center bg-gray-100 rounded\">\n <div className=\"w-8 h-0.5 bg-gray-400\" />\n </div>\n <span className=\"text-xs\">{material.name}</span>\n </div>\n ))}\n </div>\n </Panel>\n </Collapse>\n </div>\n </Modal>\n </div>\n );\n};\n\n// 物料卡片组件\ninterface MaterialCardProps {\n material: Material;\n onClick: () => void;\n}\n\nconst MaterialCard: React.FC<MaterialCardProps> = ({ material, onClick }) => {\n // 安全地获取图片 URL,只处理 IMAGE 类型\n const src = material.type === 'IMAGE' ? (material as Extract<Material, { type: 'IMAGE' }>).src : undefined;\n\n return (\n <div\n className=\"border rounded-lg p-2 cursor-pointer hover:border-blue-500 hover:bg-blue-50 transition-all text-center\"\n onClick={onClick}\n >\n <div className=\"w-12 h-12 mx-auto mb-1 flex items-center justify-center\">\n {src ? (\n <img src={src} alt={material.name} className=\"w-10 h-10 object-contain\" />\n ) : (\n <span className=\"text-xs\">{material.name[0]}</span>\n )}\n </div>\n <span className=\"text-xs\">{material.name}</span>\n </div>\n );\n};\n\nexport default PropertyPanel;\n","import React, { useEffect, useCallback } from \"react\";\nimport type { CSSProperties } from \"react\";\nimport {\n Layout,\n Button,\n Space,\n Tooltip,\n Modal,\n message,\n ConfigProvider,\n} from \"antd\";\nimport { DownloadOutlined, UploadOutlined } from \"@ant-design/icons\";\nimport zhCN from \"antd/locale/zh_CN\";\nimport { MaterialPanel } from \"../MaterialPanel\";\nimport { Canvas } from \"../Canvas\";\nimport { PropertyPanel } from \"../PropertyPanel\";\nimport { useEditorStore } from \"../../store/editorStore\";\nimport { initMaterials } from \"../../utils/initData\";\nimport type { SchemeJSON } from \"../../types\";\nimport styles from \"../../styles/ConfigEditor.module.css\";\n\nconst { Header, Sider, Content } = Layout;\n\nexport interface ConfigEditorProps {\n /** 初始 scheme 数据 */\n initialScheme?: SchemeJSON;\n /** scheme 变化回调 */\n onChange?: (scheme: SchemeJSON) => void;\n /** 是否只读模式 */\n readonly?: boolean;\n /** 自定义头部内容 */\n headerExtra?: React.ReactNode;\n /** 样式类名 */\n className?: string;\n /** 内联样式 */\n style?: CSSProperties;\n /** 画布默认宽度 */\n defaultCanvasWidth?: number;\n /** 画布默认高度 */\n defaultCanvasHeight?: number;\n /** 是否显示头部 */\n showHeader?: boolean;\n /** 是否显示物料面板 */\n showMaterialPanel?: boolean;\n /** 是否显示属性面板 */\n showPropertyPanel?: boolean;\n /** 自定义物料列表 */\n customMaterials?: any[];\n /** 实时数据 */\n defaultTestData?: any[];\n}\n\nexport const ConfigEditor: React.FC<ConfigEditorProps> = ({\n initialScheme,\n onChange,\n readonly = false,\n headerExtra,\n className = \"\",\n style,\n showHeader = true,\n showMaterialPanel = true,\n showPropertyPanel = true,\n customMaterials,\n}) => {\n const [importModalVisible, setImportModalVisible] = React.useState(false);\n const [jsonInput, setJsonInput] = React.useState(\"\");\n const [defaultTestData, setDefaultTestData] = React.useState([\n {\n paramsCode: \"001\",\n paramsName: \"通频速度有效值\",\n value: 25,\n paramsUnit: \"mm/s\",\n },\n {\n paramsCode: \"002\",\n paramsName: \"通频加速度有效值\",\n value: 1.5,\n paramsUnit: \"m/s²\",\n },\n ]);\n const { exportScheme, importScheme, nodes, materials, addMaterial } =\n useEditorStore();\n const internalRef = React.useRef<any>(null);\n const initializedRef = React.useRef(false);\n // useEffect(() => {\n // if (internalRef.current) {\n // clearInterval(internalRef.current);\n // }\n // internalRef.current = setInterval(() => {\n // setDefaultTestData([\n // {\n // paramsCode: \"001\",\n // paramsName: \"通频速度有效值\",\n // value: 25 + Math.random() * 5 * (Math.random() > 0.5 ? 1 : -1),\n // paramsUnit: \"mm/s\",\n // },\n // {\n // paramsCode: \"002\",\n // paramsName: \"通频加速度有效值\",\n // value: 1.5 + Math.random() * 0.5 * (Math.random() > 0.5 ? 1 : -1),\n // paramsUnit: \"m/s²\",\n // },\n // ]);\n // }, 1000);\n // return () => {\n // if (internalRef.current) {\n // clearInterval(internalRef.current);\n // }\n // };\n // }, []);\n // 初始化\n useEffect(() => {\n // 防止 React 18 严格模式下重复执行\n if (initializedRef.current) return;\n initializedRef.current = true;\n\n // 加载默认物料\n if (materials.length === 0) {\n initMaterials.forEach((m) => addMaterial(m));\n }\n\n // 加载自定义物料\n if (customMaterials && customMaterials.length > 0) {\n customMaterials.forEach((m) => addMaterial(m));\n }\n\n // 加载初始 scheme\n if (initialScheme) {\n importScheme(initialScheme);\n }\n }, []);\n\n // 监听变化并回调\n useEffect(() => {\n if (onChange) {\n const scheme = exportScheme();\n onChange(scheme);\n }\n }, [nodes, onChange]);\n\n // 导出 JSON\n const handleExport = useCallback(() => {\n const scheme = exportScheme();\n const dataStr = JSON.stringify(scheme, null, 2);\n const dataUri =\n \"data:application/json;charset=utf-8,\" + encodeURIComponent(dataStr);\n\n const exportFileDefaultName = `scheme_${Date.now()}.json`;\n\n const linkElement = document.createElement(\"a\");\n linkElement.setAttribute(\"href\", dataUri);\n linkElement.setAttribute(\"download\", exportFileDefaultName);\n linkElement.click();\n\n message.success(\"导出成功!\");\n }, [exportScheme]);\n\n // 导入 JSON\n const handleImport = useCallback(() => {\n try {\n const scheme: SchemeJSON = JSON.parse(jsonInput);\n importScheme(scheme);\n setImportModalVisible(false);\n setJsonInput(\"\");\n message.success(\"导入成功!\");\n } catch (error) {\n message.error(\"JSON 格式错误,请检查输入\");\n }\n }, [jsonInput, importScheme]);\n\n // 处理文件导入\n const handleFileImport = useCallback(\n (file: File) => {\n const reader = new FileReader();\n reader.onload = (e) => {\n try {\n const content = e.target?.result as string;\n const scheme: SchemeJSON = JSON.parse(content);\n importScheme(scheme);\n message.success(\"导入成功!\");\n setImportModalVisible(false);\n } catch (error) {\n message.error(\"文件格式错误\");\n }\n };\n reader.readAsText(file);\n return false;\n },\n [importScheme],\n );\n\n // 导出 scheme 方法(供外部 ref 调用)\n const getScheme = useCallback(() => {\n return exportScheme();\n }, [exportScheme]);\n\n // 暴露给父组件\n React.useImperativeHandle(\n (React as any).useRef?.(),\n () => ({\n getScheme,\n exportScheme,\n importScheme,\n }),\n [getScheme, exportScheme, importScheme],\n );\n\n // console.log(\"defaultTestData\", defaultTestData);\n\n return (\n <ConfigProvider locale={zhCN}>\n <div className={styles.configEditor} style={style}>\n <Layout\n className={`h-full w-full overflow-hidden ${className}`}>\n {/* 顶部导航 */}\n {showHeader && (\n <Header className=\"bg-white border-b border-gray-200 px-4 flex items-center justify-between flex-shrink-0\">\n <div className=\"flex items-center gap-4\">\n <div className=\"text-xl font-bold text-blue-600\">组态编辑器</div>\n <div className=\"text-sm text-gray-500\">{nodes.length} 个节点</div>\n </div>\n\n <Space>\n {headerExtra}\n {!readonly && (\n <>\n <Tooltip title=\"导出 JSON\">\n <Button icon={<DownloadOutlined />} onClick={handleExport}>\n 导出\n </Button>\n </Tooltip>\n\n <Tooltip title=\"导入 JSON\">\n <Button\n icon={<UploadOutlined />}\n onClick={() => setImportModalVisible(true)}>\n 导入\n </Button>\n </Tooltip>\n </>\n )}\n </Space>\n </Header>\n )}\n\n {/* 主体内容 */}\n <Layout>\n {/* 左侧物料面板 */}\n {showMaterialPanel && !readonly && (\n <Sider width={280} className=\"bg-white\" theme=\"light\">\n <MaterialPanel />\n </Sider>\n )}\n\n {/* 中间画布 */}\n <Content className=\"bg-gray-100 relative\">\n <Canvas defaultTestData={defaultTestData} />\n </Content>\n\n {/* 右侧属性面板 */}\n {showPropertyPanel && !readonly && (\n <Sider width={360} className=\"bg-white\" theme=\"light\">\n <PropertyPanel defaultTestData={defaultTestData} />\n </Sider>\n )}\n </Layout>\n\n {/* 导入弹窗 */}\n <Modal\n title=\"导入组态方案\"\n open={importModalVisible}\n onOk={handleImport}\n onCancel={() => {\n setImportModalVisible(false);\n setJsonInput(\"\");\n }}\n width={600}>\n <div className=\"space-y-4\">\n <div>\n <p className=\"mb-2\">选择 JSON 文件导入:</p>\n <input\n type=\"file\"\n accept=\".json\"\n onChange={(e) => {\n const file = e.target.files?.[0];\n if (file) handleFileImport(file);\n }}\n className=\"block w-full text-sm text-gray-500\n file:mr-4 file:py-2 file:px-4\n file:rounded-full file:border-0\n file:text-sm file:font-semibold\n file:bg-blue-50 file:text-blue-700\n hover:file:bg-blue-100\"\n />\n </div>\n\n <div className=\"text-center text-gray-400\">或</div>\n\n <div>\n <p className=\"mb-2\">粘贴 JSON 内容:</p>\n <textarea\n value={jsonInput}\n onChange={(e) => setJsonInput(e.target.value)}\n placeholder=\"粘贴 JSON 内容...\"\n className=\"w-full h-48 p-3 border border-gray-300 rounded-lg font-mono text-sm resize-none focus:outline-none focus:ring-2 focus:ring-blue-500\"\n />\n </div>\n </div>\n </Modal>\n </Layout>\n </div>\n </ConfigProvider>\n );\n};\n\nexport default ConfigEditor;\n"],"names":["_interopRequireDefault","e","module","zh_CN","locale","common","_common","require$$0","_typeof","o","ownKeys","r","t","_objectSpread","_defineProperty","obj","key","value","_toPropertyKey","i","_toPrimitive","_zh_CN","require$$1","_zh_CN2","_zh_CN3","_zh_CN4","typeTemplate","localeValues","immer","initializer","set","get","store","updater","replace","args","nextState","produce","initialState","createEvent","type","targetId","payload","nanoid","useEditorStore","create","node","autoSelect","state","newNode","id","updates","n","style","content","control","index","nodeId","status","newStatus","statusId","s","data","error","material","newMaterial","m","viewport","config","mode","endPoint","lastEvent","nextEvent","event","scheme","initMaterials","createDefaultStatus","createDefaultNode","x","y","children","childNode","minX","minY","maxX","maxY","child","cx","cy","cw","ch","relativeChildren","Panel","Collapse","Text","Typography","MaterialPanel","materials","addMaterial","removeMaterial","selectedStatusId","selectStatus","lineDrawing","startLineDrawing","cancelLineDrawing","activeKeys","setActiveKeys","useState","handleUpload","file","reader","src","groupedMaterials","handleDragStart","dragImage","handleLineMaterialClick","renderMaterialItem","isLineMode","isLineMaterial","isDrawingLine","jsx","List","Button","EditOutlined","DeleteOutlined","Image","jsxs","Tag","Upload","UploadOutlined","keys","item","Empty","Fragment","evaluateStatusExpression","params","d","result","findActiveStatus","statusList","bindData","getDataValue","valueSourceCode","dataItem","formatValue","decimals","num","renderMaterial","isSelected","imageMaterial","bgColor","fillColor","textMaterial","label","configValue","configUnit","labelStyle","valueStyle","customStyle","dataValue","dataUnit","displayValue","displayUnit","lineMaterial","thickness","color","dashed","lineType","lineWeight","startX","startY","endX","endY","dashArray","baseWeight","strokeColor","customMaterial","NodeRendererComponent","onClick","onMouseDown","onUpdateNode","canvasScale","normalStyle","contentInfo","controlInfo","isClickable","isDraggable","isResizable","onClickRef","useRef","useEffect","draggingPoint","setDraggingPoint","dragOriginRef","dragResultRef","resizeResultRef","nodeRef","resizing","setResizing","rotating","setRotating","rotatingAngleRef","currentStatus","useMemo","activeStatus","currentMaterial","isLine","lineConfig","nodeScale","scaledWidth","scaledHeight","getEffectiveCanvasScale","useCallback","canvasEl","canvasRect","logicalWidth","handlePointMouseDown","point","handleMouseMove","origin","effectiveScale","totalDx","totalDy","newStartX","newStartY","newEndX","newEndY","newNodeX","newNodeY","minNodeSize","newWidth","newHeight","el","line","startHandle","endHandle","handleMouseUp","dx","dy","newX","newY","handleResizeStart","corner","handleRotateStart","rect","newAngle","extra","finalAngle","isGroup","containerStyle","startPointPos","endPointPos","latestOnClick","NodeRenderer","React","prevProps","nextProps","nodeA","nodeB","nodeStyleEqual","contentEqual","otherPropsEqual","presetColors","ColorPicker","onChange","onChangeComplete","visible","setVisible","innerValue","setInnerValue","popoverRef","handleClickOutside","handleColorChange","TextArea","Input","Canvas","defaultTestData","transformRef","canvasRef","wrapperRef","nodes","selectedNodeId","canvas","setViewport","setCanvasConfig","addNode","selectNode","updateNode","removeNode","undo","redo","setMode","endLineDrawing","isDragOver","setIsDragOver","forceUpdate","modeRef","isDraggingRef","dragStartRef","dragOffsetRef","draggingNodeRef","linePreview","setLinePreview","selectionBox","setSelectionBox","selectedNodeIds","setSelectedNodeIds","dataModalVisible","setDataModalVisible","dataInput","setDataInput","canvasConfigVisible","setCanvasConfigVisible","isSpacePressed","setIsSpacePressed","getCanvasPosition","clientX","clientY","mouseXInCanvas","mouseYInCanvas","effectiveScaleX","effectiveScaleY","getBoxSelectionPosition","createLineNode","start","end","continueDrawing","relativeStartX","relativeStartY","relativeEndX","relativeEndY","nodeWidth","nodeHeight","nextStart","handleTransform","handleCanvasClick","handleCanvasMouseDown","pos","handleCanvasDoubleClick","handleDragOver","handleDragLeave","handleDrop","handleNodeMouseDown","screenDx","screenDy","canvasDx","canvasDy","nodeEl","prev","selectedIds","nodeX","nodeY","nodeW","nodeH","centerX","centerY","handleKeyDown","handleKeyUp","handleCopyNodes","nodesToCopy","newNodeIds","handleGroupNodes","selectedNodes","w","h","groupNode","handleUngroupNodes","groupNodesToUngroup","absoluteChildren","handleDistributeNodes","direction","sortedNodes","a","b","count","step","handleAlignNodes","alignValue","toolbarButtons","SelectOutlined","GroupOutlined","DragOutlined","EyeOutlined","actionButtons","UndoOutlined","RedoOutlined","CopyOutlined","UngroupOutlined","AlignLeftOutlined","AlignRightOutlined","VerticalAlignTopOutlined","VerticalAlignBottomOutlined","ColumnWidthOutlined","ColumnHeightOutlined","SettingOutlined","ExperimentOutlined","Space","btn","Tooltip","TransformWrapper","zoomIn","zoomOut","resetTransform","ZoomInOutlined","ZoomOutOutlined","TransformComponent","Modal","Form","InputNumber","v","Switch","checked","message","base64","CloseOutlined","Option","Select","TextMaterialEditor","onSave","bindCodes","dataOptions","formData","setFormData","handleChange","field","handleValueSourceChange","code","selectedOption","opt","autoUnit","handleSave","boundDataOptions","Divider","ImageMaterialEditor","newColor","LineMaterialEditor","handleSaveWithValues","newValues","newFormData","lineTypeOptions","currentStartY","currentStartX","currentEndX","currentEndY","MaterialPropertyEditor","GroupNodeStatusEditor","availableMaterials","handleUpdateChildStatusList","childId","newStatusList","newChildren","handleAddChildStatus","c","handleDeleteChildStatus","handleUpdateChildStatus","handleMoveChildStatus","handleChangeChildStatusMaterial","materialId","selectedMaterial","childIndex","PlusOutlined","statusIndex","ArrowUpOutlined","ArrowDownOutlined","TabPane","Tabs","PropertyPanel","updateNodeStyle","updateNodeControl","updateNodeContent","form","activeTab","setActiveTab","materialModalVisible","setMaterialModalVisible","editingStatusId","setEditingStatusId","editingExpressions","setEditingExpressions","selectedNode","currentStatusList","handleValuesChange","changedValues","handleAddStatus","handleSelectMaterialForStatus","handleDeleteStatus","handleUpdateStatus","handleCopyStatus","handleMoveStatus","handleChangeStatusMaterial","handleUpdateStatusMaterial","newState","MaterialCard","Header","Sider","Content","Layout","ConfigEditor","initialScheme","readonly","headerExtra","className","showHeader","showMaterialPanel","showPropertyPanel","customMaterials","importModalVisible","setImportModalVisible","jsonInput","setJsonInput","setDefaultTestData","exportScheme","importScheme","initializedRef","handleExport","dataStr","dataUri","exportFileDefaultName","linkElement","handleImport","handleFileImport","getScheme","ConfigProvider","zhCN","styles","DownloadOutlined"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9]}