From d6a56eb17f18820194d0964e7a6a4ee21bdb5d4d Mon Sep 17 00:00:00 2001 From: oneao Date: Sun, 30 Aug 2026 21:50:03 +0800 Subject: [PATCH] 20260830215003 --- .../popover-zero-wrapper-refactor_f54580ca.md | 173 ++++++++++++++++++ code/fms/_debug_subtable_designer.png | Bin 0 -> 62753 bytes code/fms/_debug_subtable_final.png | Bin 0 -> 62725 bytes code/fms/_debug_subtable_fixed.png | Bin 0 -> 62601 bytes .../fmsapi/database/OrgDataSourceFactory.java | 58 +++++- .../fmsapi/service/DataSaveService.java | 2 +- .../java/cn/g3soft/fmsapi/utils/DbUtils.java | 19 +- .../src/main/resources/application.yaml | 14 +- .../fmsapi/service/DataSaveServiceTests.java | 37 ++++ .../fms-api/target/classes/application.yaml | 14 +- .../database/OrgDataSourceFactory.class | Bin 3544 -> 5023 bytes .../fmsapi/service/DataSaveService.class | Bin 20743 -> 20830 bytes .../fmsapi/utils/DbUtils$ColumnMetadata.class | Bin 2268 -> 2268 bytes .../fmsapi/utils/DbUtils$PageResult.class | Bin 2267 -> 2267 bytes .../fmsapi/utils/DbUtils$TableMetadata.class | Bin 2434 -> 2434 bytes .../cn/g3soft/fmsapi/utils/DbUtils.class | Bin 27424 -> 27884 bytes .../2026-08-30T01-07-25_655.dumpstream | 5 + .../2026-08-30T01-07-40_396.dumpstream | 5 + .../2026-08-30T01-08-17_483.dumpstream | 5 + .../2026-08-30T01-08-37_556.dumpstream | 5 + .../2026-08-30T01-08-59_565.dumpstream | 5 + ...n.g3soft.fmsapi.FmsApiApplicationTests.xml | 69 +++---- ...api.database.OrgDataSourceFactoryTests.xml | 52 +++--- ...api.database.OrgDataSourceManagerTests.xml | 95 +++++----- ....database.OrgDatabaseConfigLoaderTests.xml | 45 ++--- ...database.OrgDatabaseConfigWatcherTests.xml | 71 ++++--- ....exception.GlobalExceptionHandlerTests.xml | 51 +++--- ...api.service.ActiveSessionRegistryTests.xml | 49 ++--- ...g3soft.fmsapi.service.AuthServiceTests.xml | 47 ++--- ...ft.fmsapi.service.DataSaveServiceTests.xml | 57 +++--- ...T-cn.g3soft.fmsapi.utils.JwtUtilsTests.xml | 47 ++--- ...tils.snowflake.DefaultIdGeneratorTests.xml | 57 +++--- ...n.g3soft.fmsapi.FmsApiApplicationTests.txt | 2 +- ...api.database.OrgDataSourceFactoryTests.txt | 2 +- ...api.database.OrgDataSourceManagerTests.txt | 2 +- ....database.OrgDatabaseConfigLoaderTests.txt | 2 +- ...database.OrgDatabaseConfigWatcherTests.txt | 2 +- ....exception.GlobalExceptionHandlerTests.txt | 2 +- ...api.service.ActiveSessionRegistryTests.txt | 2 +- ...g3soft.fmsapi.service.AuthServiceTests.txt | 2 +- ...ft.fmsapi.service.DataSaveServiceTests.txt | 2 +- .../cn.g3soft.fmsapi.utils.JwtUtilsTests.txt | 2 +- ...tils.snowflake.DefaultIdGeneratorTests.txt | 2 +- .../DataSaveServiceTests$JdbcFixture.class | Bin 3894 -> 3894 bytes .../fmsapi/service/DataSaveServiceTests.class | Bin 7840 -> 8884 bytes .../page-2026-08-28T15-49-52-094Z.yml | 28 +++ .../results.json | 1 + 47 files changed, 682 insertions(+), 351 deletions(-) create mode 100644 code/fms/.codebuddy/plans/popover-zero-wrapper-refactor_f54580ca.md create mode 100644 code/fms/_debug_subtable_designer.png create mode 100644 code/fms/_debug_subtable_final.png create mode 100644 code/fms/_debug_subtable_fixed.png create mode 100644 code/fms/fms-api/target/surefire-reports/2026-08-30T01-07-25_655.dumpstream create mode 100644 code/fms/fms-api/target/surefire-reports/2026-08-30T01-07-40_396.dumpstream create mode 100644 code/fms/fms-api/target/surefire-reports/2026-08-30T01-08-17_483.dumpstream create mode 100644 code/fms/fms-api/target/surefire-reports/2026-08-30T01-08-37_556.dumpstream create mode 100644 code/fms/fms-api/target/surefire-reports/2026-08-30T01-08-59_565.dumpstream create mode 100644 code/fms/fms-vue/.playwright-cli/page-2026-08-28T15-49-52-094Z.yml create mode 100644 code/fms/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json diff --git a/code/fms/.codebuddy/plans/popover-zero-wrapper-refactor_f54580ca.md b/code/fms/.codebuddy/plans/popover-zero-wrapper-refactor_f54580ca.md new file mode 100644 index 00000000..026d86ad --- /dev/null +++ b/code/fms/.codebuddy/plans/popover-zero-wrapper-refactor_f54580ca.md @@ -0,0 +1,173 @@ +--- +name: popover-zero-wrapper-refactor +overview: 为 Popover 组件增加显式 unwrapped 开关的"零包裹"模式(事件注入到用户触发器 vnode),并将 Tooltip/Dropdown/Select/DatePicker/RangePicker 及 AppSidebar、AppTabs、结构树等全部调用方迁移到零包裹,删除所有 .popover-trigger 相关补丁样式与 stretch-trigger 业务用法,全程保持现有行为不回归。 +todos: + - id: core-popover-unwrapped + content: 改造 popover.vue:加 unwrapped prop、cloneVNode 注入事件与锚点指令、双分支模板 + status: completed + - id: migrate-derived + content: 迁移 Tooltip/Dropdown/menu/Select/DatePicker/RangePicker 开启 unwrapped,删除各 index.scss 的 .popover-trigger 补丁 + status: completed + dependencies: + - core-popover-unwrapped + - id: migrate-usages + content: 迁移外部使用点:AppSidebar/AppTabs 删 :deep 规则、结构树去 stretch-trigger、help-icon 开 unwrapped,用 [subagent:code-explorer] 核对全量清单 + status: completed + dependencies: + - migrate-derived + - id: demo-tests + content: demo/popover.vue 补 fallback/组件触发器/事件合并三用例,新增 popover vitest 单测 + status: completed + dependencies: + - core-popover-unwrapped + - id: verify-all + content: 跑 pnpm lint、fmt:check、build、test 全量验证,并人工回归四类触发场景 + status: completed + dependencies: + - migrate-derived + - migrate-usages + - demo-tests +--- + +## 用户需求 + +为 fms-vue 的 Popover 组件实现"零包裹"(antdv 式事件注入)模式,并全量迁移派生组件与外部调用点,同时保证不引入性能开销。 + +> 执行策略:**直接迁移(非渐进)**。项目处于初期阶段,迁移成本低,不做"迁移一个验证一个",派生组件与外部使用点一次性全部开启 `unwrapped`,最后统一跑验证。`unwrapped` prop 保留默认 `false` 作为 API 兜底,但本次全量调用点均显式开启。 + +## 核心功能 + +- Popover 新增显式 `unwrapped` prop(默认 `false`,保持现有行为):触发器插槽为单根元素/组件 vnode 时,通过 `cloneVNode` 把 6 个内部事件 handler(click/contextmenu/mouseenter/mouseleave/focusin/focusout)合并进用户 vnode,并用注入指令获取根 DOM 作为定位锚点;多根 fragment / 文本节点自动回退到现有 `span.popover-trigger` 包裹层。 +- 派生组件全量迁移:Tooltip、Dropdown(含子菜单)、Select、DatePicker、RangePicker 内部显式开启 `unwrapped`,删除各自样式里的 `.popover-trigger` 布局补丁。 +- 外部使用点迁移:AppSidebar / AppTabs 删除 `:deep(.popover-trigger)` 规则,结构树移除 `stretch-trigger`,FormEditPanel / TableEditPanel 的帮助图标 Popover 一并开启 `unwrapped`。 +- demo 补充零包裹/fallback/事件合并用例;新增 Popover 组件单测(vitest + @vue/test-utils + jsdom)。 +- 性能约束:归一化走 computed 缓存、不新增任何 watcher/observer/全局监听、`unwrapped=false` 时零额外开销。 + +## 边界 + +- fallback 路径保留 `stretch-trigger` 与 `.popover-trigger` 样式,不做破坏性删除。 +- 事件合并采用 Vue `mergeProps` 原生语义:用户 handler 先执行、内部 handler 后执行,两者都触发,不覆盖。 +- 零包裹模式下 `stretch-trigger` 无意义,静默忽略。 + +## 技术栈 + +- 现有栈:Vue 3.5.41(`