--- name: FmsTable 内置单元格编辑 overview: "将当前散落在 ModulePowersPanel.vue 的“单行/单元格编辑”逻辑(row._editing 协议 + handleAreaSelectionChange + col._onEditEnd)下沉到 FmsTable 内,通过 editable: boolean prop 控制启用,组件自闭环;现有唯一调用方 ModulePowersPanel 同步改写为新 API。" todos: - id: refactor-utils content: 重构 createEditableCellRenderer.js 与 createCellRenderer.js,使 createInputCell 通过闭包读取 editingState,resolveCustomCell 根据 ctx.editable 决定是否注入 input customCell status: completed - id: enhance-fmstable content: 在 FmsTable.vue 新增 editable prop、editingState 内部 shallowRef、internalData + watch、handleAreaSelectionChange 处理器与 change 事件 emit,将 StkTable 的 dataSource 指向 internalData status: completed dependencies: - refactor-utils - id: refactor-powers-panel content: 改写 ModulePowersPanel.vue:移除 handleEditEnd / handleAreaSelectionChange 函数,列定义移除 _onEditEnd 与 onChange,模板改为 :editable="true" + @change="onCellChange",清理无效的 :area-selection 与 @area-selection-change status: completed dependencies: - enhance-fmstable --- ## Product Overview 将当前散落在 `ModulePowersPanel.vue` 的"单元格编辑"逻辑(row._editing 协议 + handleAreaSelectionChange + col._onEditEnd)下沉到 `FmsTable` 内部。组件自闭环,通过 `editable: boolean` prop 控制是否启用单元格编辑。 ## Core Features - 新增 `FmsTable.editable: boolean` prop(默认 `false`),`type:"input"` 列在该 prop 为 `true` 时才进入可编辑态 - `FmsTable` 内部维护 `editingState: { rowKey, col } | null`(shallowRef),**不挂在 row 上**,零数据污染,父组件保存前无需清理 - `FmsTable` 内部监听 `@area-selection-change`(鼠标点击 / 键盘方向键统一入口),自动把命中单元格设为编辑格 - 内部 watch `editingState` → 浅拷贝内部 `dataSource` → 触发 `stk-table` 重渲染让 `customCell` 重新求值 - 退出编辑(Enter / Esc / Blur)时 `emit("change", row, col, newValue)` 给父组件 - 沿用现有 `createInputCell` 的"非编辑零 VNode / 原生 input / 自动 focus.select()" 行为 - `ModulePowersPanel.vue` 同步改写为新 API:删除 `handleEditEnd` / `handleAreaSelectionChange` / 列定义中的 `_onEditEnd` / `onChange`,模板改为 `:editable="true"` + `@change="onCellChange"` - 其他 7 个 `FmsTable` 调用方(dashboard / TableDemo / i18n-type / I18nPanel / Fields / ListConfig / EditConfig / QueryConfig)**完全不受影响**——`editable` 默认 `false`,与现状一致 ## Tech Stack - Vue 3 `