Skip to content

fix(desktop): 修复置顶项目无法拖动排序 - #6249

Merged
MagicLizi merged 2 commits into
mainfrom
cindy/merry-thompson
Oct 16, 2026
Merged

MagicLizi merged 2 commits into
mainfrom
cindy/merry-thompson

Conversation

@DavidShenXD

Copy link
Copy Markdown
Collaborator

这次改了什么

摘要

置顶项目标题和图标无法起拖:全局 -webkit-user-drag: none 阻止 Chromium 原生拖拽,即使 SortableJS 已把外层标记为可拖动。本次为原生排序容器中被激活的行及其子树恢复原生拖拽,增加真实 Chromium 回归脚本。生产改动仅 8 行 CSS。

变更类型

  • fix 缺陷修复
  • feat 新功能
  • refactor / perf 重构或性能优化
  • docs / test / chore 文档、测试或工程维护
  • 其他:

范围

  • 关联 Issue / 需求:桌面端置顶对话无法手动调整顺序 #6227;相关修复方向见 fix(desktop): 优化置顶项目拖动排序 #5712,本 PR 补充 Windows 实际复现与回归验证。
  • 本 PR 包含:置顶项目原生拖拽 CSS 修复;复用生产 SortableList / CardMasonry 的浏览器回归脚本与夹具。
  • 明确不包含:排序持久化协议、数据库、手机端及新的排序规则。
  • 用户可见变化:置顶项目可从标题或图标起拖,与置顶任务调整相对顺序。
  • 是否存在 breaking change:无。

UI 变化

  • 平台:Windows / Electron 41.10.3;深浅主题均在隔离 Dev 客户端实测。
  • 保留现有文字、列表、1–3 列卡片布局和主题样式,只恢复原生排序的起拖能力;按钮、输入框和项目内子任务仍受既有拖拽边界约束。
  • 引用的设计规范:docs/design-rules/DESIGN.md §14.1(侧边栏作为控件保持不可选中文字)、§10(Light / Dark 双模式);在这两种主题下分别验证拖拽、取消与响应式列数切换。
  • 实机截图保存在本地自包含验收报告 %TEMP%/cindy-6227-mH1WJS/acceptance.html,用户已验收通过。截图按 design-governance.md §6 不进入 Git 历史;GitHub API / CLI 不支持 PR 图片附件上传,截图尚未上传到 PR。

怎么验证的

自动验证

node apps/desktop/scripts/check-pinned-native-drag.mjs "C:/Program Files (x86)/Microsoft/Edge/Application/msedge.exe"
结果:深浅主题 × 文字、列表、卡片 1/2/3 列,共 10 个配置通过。
覆盖排序、按钮、输入框、子任务边界、Esc、区域外落点。
取消 / 外部落点先断言发生临时 DOM 移动,再断言恢复原 DOM 且不保存顺序。

node apps/desktop/scripts/check-pinned-native-drag.mjs "C:/Program Files (x86)/Microsoft/Edge/Application/msedge.exe" --stylesheet-ref=3744122eb3
反证:旧 CSS 在首个项目排序场景无法提交顺序,按预期超时失败。
原执行时使用 --stylesheet-ref=HEAD,当时 HEAD 为 3744122eb3。

pnpm --filter desktop exec vitest run src/renderer/components/sidebar/__tests__/SortableList.test.tsx src/renderer/features/cc-agent/sidebar/__tests__/DraggableCardColumns.test.ts src/renderer/features/cc-agent/sidebar/__tests__/DraggableCardColumns.nativeDnd.test.tsx src/renderer/features/cc-agent/hooks/__tests__/useSidebarPinnedPersistence.test.tsx --maxWorkers=2
结果:4 个测试文件、27 项测试通过。

pnpm --filter desktop run --if-present typecheck
结果:通过。

pnpm exec prettier --check apps/desktop/scripts/check-pinned-native-drag.mjs apps/desktop/scripts/fixtures/pinned-native-drag.tsx
git diff --check
pnpm check:dco
结果:通过。

手工验证

通过 CDP 发送真实鼠标与键盘输入,在 --region=global --isolated=issue6227-merry --passive 的真实 Electron 中操作;未通过内部业务 API 或数据库注入测试数据。

  • 从 UI 新建并置顶 Pin A / B / C 与 ProjectX。旧样式下项目拖拽无 dragstart、顺序不变;修复后观察到可信原生 dragstart 和顺序变化。
  • 深浅主题下,文字、列表、卡片 1/2/3 列共 10 个配置均可对项目排序。
  • 普通置顶任务仍能排序;拖入输入框生成任务引用且侧边栏顺序不变,原生任务 MIME 载荷保留。
  • 项目发生临时位移后按 Esc,顺序恢复;刷新页面后顺序保留。
  • 完整重启同一隔离沙盒,DESKTOP_DEV_VERDICT=ready,顺序和显示设置仍保留。
  • 用户已确认“验收通过”。

未执行的验证

  • macOS 实机未验证:当前环境为 Windows。
  • 未运行整仓测试和完整 CI;本地已完成定向单测、类型检查、浏览器回归与隔离客户端黑盒验收,完整门禁交由 PR CI。
  • 本次稳定复现的是置顶项目;普通置顶任务在基线中可排序,因此不能断言已覆盖原始报告的所有触发条件。

风险

风险分类

  • 无已知风险
  • SQLite / migration
  • system prompt
  • 协议兼容
  • 权限 / 安全 / 用户数据
  • 存量插件兼容(批准状态 / 指纹 / manifest 校验 / 安装布局 / 包格式)
  • 原生层 / fingerprint / OTA
  • 跨平台差异
  • 其他:

影响与回滚

  • 影响范围:仅 data-sortable-native-dnd=true 容器中被 SortableJS 设为 draggable=true 的直接子行及其子树;Windows 已验收,macOS 待实机复核。
  • 回滚 / 降级方式:撤回新增的 CSS 例外即可,不涉及持久数据迁移。

提交前检查

  • 已 review 完整 diff
  • 每个 commit 都带 DCO 签名(git commit -s)
  • UI 改动已在「UI 变化」注明引用的设计规范章节
  • 未提交凭证、令牌或授权文件
  • 已核对受影响的文档:恢复既有排序交互,无需修订产品规则
  • 已确认测试结果或说明未执行原因

@DavidShenXD
DavidShenXD requested a review from a team as a code owner October 16, 2026 13:40
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Oct 16, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-10-16T15:04:31.901548Z 683fe9b New commits
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@greptile-apps

greptile-apps Bot commented Oct 16, 2026 •

Copy link
Copy Markdown

RetriggerView in GreptileConfidence Score: 4/5

[Medium impact] Adds drag-and-drop test infrastructure for pinned items.

这次改动看起来可以合并,建议补足列表模式的独立回归覆盖。

Findings

  1. P2 列表模式检查重复了 ▶
Fix with agent prompt
### Issue 1
apps/desktop/scripts/fixtures/pinned-native-drag.tsx:68-71
夹具中的 `text` 和 `list` 使用相同宽度、相同的 `renderItem` 和相同的 `SortableList`,两轮检查实际重复同一个页面。生产代码却分别使用 `SessionItem` 和 `SessionCard`,因此列表模式独有的拖拽问题可能仍得到通过结果。建议让夹具按模式渲染对应的行结构。

Note: If this suggestion doesn't match your team's coding style, reply to this and let me know. I'll remember it for next time!

---

For each issue above, determine whether it is valid and should be fixed. If so, fix it directly.

Summary

本次为原生排序容器中已激活的行及其子树恢复拖拽,并加入 Chromium 回归脚本。

  • Pinned project titles and icons can start sorting again.

Reviews (1) · Last reviewed commit: "fix(desktop): 修复置顶项目无法拖动排序" · Reviewed by Greptile

Comment thread apps/desktop/scripts/fixtures/pinned-native-drag.tsx Outdated
@DavidShenXD

Copy link
Copy Markdown
Collaborator Author

反馈已处理

已处理:

变更:

  • 提交 93d0c0609b:文字模式使用无预览的紧凑行;列表 / 卡片使用独立标题和预览节点,并按 PinnedSection 的模式分支调整项目外层结构。
  • 增加断言:文字模式不存在预览、列表模式存在独立预览且高度大于文字行,防止两轮再次退化成同一页面。
  • 增加任务排序检查:文字模式从标题起拖,列表 / 卡片从预览区域起拖;仍覆盖项目排序、交互控件、子任务边界、Esc 和区域外落点。

验证:

  • node apps/desktop/scripts/check-pinned-native-drag.mjs "C:/Program Files (x86)/Microsoft/Edge/Application/msedge.exe":深浅主题 × 文字、列表、卡片 1/2/3 列,共 10 个配置通过。
  • 同一脚本加 --stylesheet-ref=3744122eb3:旧 CSS 在首个项目排序场景按预期超时失败,确认增强后的夹具仍能捕获原缺陷。
  • pnpm --filter desktop run --if-present typecheck:通过。
  • pnpm exec prettier --check apps/desktop/scripts/fixtures/pinned-native-drag.tsx apps/desktop/scripts/check-pinned-native-drag.mjs、git diff --check、pnpm check:dco:通过。

备注:

  • 本轮仅增强浏览器夹具与回归脚本,生产 CSS 和排序行为未改。夹具保留与拖拽有关的模式结构,未挂载完整 SessionItem / SessionCard 的账号运行时依赖;真实组件的深浅主题、多种布局与持久化此前已在隔离 Desktop 中黑盒验收。
  • 未重复运行整仓测试或隔离客户端黑盒验收;本轮变更由浏览器回归覆盖。macOS 实机仍未验证。
  • 已推送本轮提交,不等待 GitHub CI / 自动审核,也不合并 PR。

@MagicLizi

Copy link
Copy Markdown
Contributor

@DavidShenXD 👋 这个 PR 已经有 6 天没有 rebase 了。

为了避免合入后出现 CI 未曾验证过的新问题,请在本地 rebase 最新的 origin/main 后重新推送。rebase 后 CI 会自动重跑,全部通过后 auto-review 会在下一轮继续处理。

@DavidShenXD

Copy link
Copy Markdown
Collaborator Author

反馈已处理

已处理:

  • MagicLizi 的 rebase 提醒:已将 PR 分支 rebase 到本次获取的最新 origin/main(2082425d9586c843d4fac28ac7ad2dc6983ce1bf)。

变更:

  • 无冲突重放两个提交,新 HEAD 为 683fe9b。git range-diff 确认两个提交的补丁与 rebase 前完全一致,仍仅包含置顶项目拖拽修复及其验收夹具。
  • 已使用绑定原远程 HEAD 的 git push --force-with-lease 推送,避免覆盖并发更新。

验证:

  • pnpm install --frozen-lockfile --prefer-offline:通过,同步最新主干依赖。
  • node apps/desktop/scripts/check-pinned-native-drag.mjs "C:/Program Files (x86)/Microsoft/Edge/Application/msedge.exe":10 组配置全部通过(Light / Dark,各含文字、列表、卡片 1 / 2 / 3 列);覆盖排序、控件、子项拖拽边界、Escape 和列表外放下。
  • pnpm --filter desktop exec vitest run src/renderer/components/sidebar/tests/SortableList.test.tsx src/renderer/features/cc-agent/sidebar/tests/DraggableCardColumns.test.ts src/renderer/features/cc-agent/sidebar/tests/DraggableCardColumns.nativeDnd.test.tsx src/renderer/features/cc-agent/hooks/tests/useSidebarPinnedPersistence.test.tsx --maxWorkers=2:4 个文件、27 个测试全部通过。
  • pnpm --filter desktop run --if-present typecheck:通过。
  • pnpm exec prettier --check apps/desktop/scripts/check-pinned-native-drag.mjs apps/desktop/scripts/fixtures/pinned-native-drag.tsx:通过。
  • pnpm check:dco:两个提交均通过;git diff origin/main...HEAD --check:通过。

备注:

  • 本轮为无冲突 rebase,未重复此前已通过的 Electron 实机黑盒验收;macOS 尚未实机验证。
  • 推送后由 GitHub 重新运行 CI,本轮不等待自动检查完成;未合并 PR。

@MagicLizi MagicLizi added the touches:product-ui 改动碰到产品 / UI 面(review-pr 自动维护,仅展示) label Oct 16, 2026

@MagicLizi MagicLizi left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review #6249 fix(desktop): 修复置顶项目无法拖动排序

审查 head 683fe9b282f735566ee1eda1375f38939427691f,base 6e50085770d4bdf37d517d03cde92845fa6d9412(main),diffHash 58aca5ac…。独立自动审查(heavy 档)。

Findings

无 P0/P1。

Rule coverage

  • docs/dev-rules/development-workflow.md §3 严重度口径:改动为缺陷修复 + 回归夹具,无红线、崩溃、数据丢失面。
  • docs/design-rules/DESIGN.md §14.1 / §10:不触碰 user-select(侧边栏行仍 select-none);新增 CSS 为行为修复、无颜色/视觉 token 变更,Light/Dark 均在真实 Chromium 中验证(见 Verification)。无硬编码颜色、无自造组件。
  • docs/dev-rules/engineering-conventions.md Review 清单:无生产 console.log(仅 dev 脚本输出);无 IPC/main/i18n 改动;新脚本用 mkdtempSync 独立临时目录且 finally 清理,不依赖外网(所有请求 route.abort,仅放行本地 fixture HTML)、无固定端口;路径/子进程写法跨平台成立(macOS 本地已实测,见下)。
  • docs/dev-rules/electron-security-and-process-boundaries.md §8:仅 renderer 全局样式 + dev 测试脚本,无特权数据、CSP、preload、导航变更。
  • docs/dev-rules/credentials-and-local-storage.md:无凭证、无用户数据落盘,临时文件仅 os.tmpdir() 一次性夹具产物。

代码事实核对:data-sortable-native-dnd 仅由 forceFallback=false 的容器输出,全仓只有 PinnedSection.tsx 三处使用(TextSortableList / SortableList / CardMasonry),即新增 CSS 的作用域精确等于置顶区;其余 SortableList(TabBar、ProvidersSection 等)默认 forceFallback=true,不受影响。新规则与既有 [data-split-group-drag-source='true'] 的恢复模式完全同构(-webkit-user-drag: element !important 整棵子树),行内按钮/输入框仍由 Sortable 默认 filter(button, input, textarea, select, a, [data-no-drag])与 SessionItem/SessionCard 的 startSessionDrag 交互区守卫拦住,子任务行继续由 data-no-drag 隔离。fallback 列表无 data-sortable-native-dnd,保持原状。

Verification

均在本机(macOS,Google Chrome 作为 Chromium 运行时)完整落盘并记录命令自身退出码:

  • pnpm --filter desktop exec vitest run …SortableList.test.tsx …DraggableCardColumns.test.ts …DraggableCardColumns.nativeDnd.test.tsx --maxWorkers=2:EXIT=0,3 文件 10 测试通过。
  • pnpm --filter desktop exec vitest run …hooks/__tests__/useSidebarPinnedPersistence.test.tsx --maxWorkers=2:EXIT=0,17 测试通过(合计 27,与 PR 声明一致)。
  • pnpm --filter desktop run --if-present typecheck:EXIT=0。
  • pnpm exec prettier --check(两个新文件):EXIT=0;git diff --check:EXIT=0。
  • node apps/desktop/scripts/check-pinned-native-drag.mjs "<Google Chrome>":EXIT=0,Light/Dark × 文字/列表/卡片 1/2/3 列共 10 个配置全部 PASS(行结构、项目与任务起拖、控件、子任务边界、Esc、区域外落点)。此结果补上了 PR 中「macOS 未验证」的缺口(同一 Chromium 内核行为验证,仍非 Electron.app 实机)。
  • 反证:同一脚本 --stylesheet-ref=6e50085770d4bdf37d517d03cde92845fa6d9412(修复前 CSS):EXIT=1,首个项目排序场景 page.waitForFunction 超时(顺序从未提交),确认夹具能捕获原缺陷。
  • security-scan.mjs --base 6e500857…:verificationLine = 依赖漏洞扫描:本 PR 未新增依赖,无需扫描;静态扫描(semgrep,仅新增):0 条。注意:semgrep errors 非空(BaselineHandler 初始化异常),即部分基线比对未完整跑成,不把该部分当作「已证明没问题」;结合阶段一安全门 0 hard/0 soft 命中与逐行人工复核(脚本与夹具均不进生产包、无网络/凭证/用户数据流向),不构成阻断。
  • 未执行:Electron.app macOS 实机拖拽(本环境无图形实机操作条件),PR 作者已在 Windows Electron 41.10.3 实测并经用户验收。

Intent alignment

  • 描述来源:PR body(2026-10-16 读取)+ 关联 issue #6227(置顶对话无法手动拖动排序)、修复方向 #5712。
  • 初始实现:d57350f89b65ba8bcaea8f4ae7af08f0be78ddf6(修复 CSS 8 行 + 初版回归脚本/夹具,父提交 2082425d…);第二提交 683fe9b2 仅改测试脚本与夹具(区分文字/列表/卡片行结构),系对已 Resolve 的 greptile P2 的响应。rebase 到最新 main 未改补丁内容(git range-diff 由作者核验,两提交文件内容与本次 diff 一致)。
  • 最终行为:原目标(置顶区可手动拖拽排序)→ 最终为置顶区原生排序行恢复起拖能力,项目可从标题/图标起拖并与置顶任务排序;Codex 复核 completed、无 findings。
  • 结论:一致。第二提交只增强回归夹具的判别力,未扩范围、未加依赖、未改生产行为。已 Resolve 的 bot 意见落实在 683fe9b2。如实保留的边界(PR 已自述):issue 报告的是置顶「对话」,本次稳定复现的是置顶「项目」,普通置顶任务在基线中本就可排序,不能断言覆盖原报告全部触发条件——该修复在 CSS 层对置顶区所有原生排序行生效,属服务原目标的收敛修复,不判偏离。

Overall

pass —— 没有 P0/P1。附注(非阻断):① UI 实机证据(截图/录屏)未上传 PR(GitHub API 不支持图片附件),仅本地 acceptance.html 描述,建议作者补充;② 机器人静默期按 20 分钟上限超时放行,copilot-pull-request-reviewer 与 chatgpt-codex-connector 未对当前 head 表态,其意见可能在合并后到达。

@MagicLizi
MagicLizi merged commit 53c975d into main Oct 16, 2026
18 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

touches:product-ui 改动碰到产品 / UI 面(review-pr 自动维护,仅展示)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants