Issue 118 - ShaoClean/Alune GitHub Wiki
- 类型:优化
- 状态:已实现,待 PR 合并
- Issue:https://github.com/ShaoClean/Alune/issues/118
- PR:https://github.com/ShaoClean/Alune/pull/123
- 最近更新:2026-09-30
- 代码基线:
development/7c5b9ee;实现:25f90446a952610e5dea8ef5777b5e64cf4b1694 - 工作分支:
codex/issue-118-feedback,独立 worktree - 弹窗设计稿:2026-09-30 新增,待确认,尚未接入产品;见UI 规范 · 弹窗系统
原 Git 取消横幅插在工作区正文前。在同为 1440×960 的窗口中,正文由 1204×840 缩为 1204×742.86,高度减少约 97px。迁移后,弹窗打开与关闭期间正文均保持 1204×840;提交草稿、历史和文件内容保留。
| 范围 | 已迁移反馈 | 展示与处理入口 |
|---|---|---|
| Git 同步 | 获取、拉取、推送失败或取消;同步上下文读取失败 | 排队弹窗,完整原因、刷新状态、复制、关闭;取消说明保留“已完成的步骤不会回滚” |
| 仓库配置及状态 | 配置读取失败、状态失败、分支/储藏/远程读取失败 | 后台读取使用通知入口,面板失败使用弹窗;保留重试和首载失败状态 |
| 历史 | 历史首载/分页/刷新失败、历史变化、提交文件失败 | 弹窗;重试原分页或刷新历史;提交文件错误仅由局部来源负责 |
| 文件目录 | 已有目录内容上的刷新失败 | 弹窗与重试,目录内容保留;首次加载失败继续就地说明 |
| PR/MR 与令牌 | 原令牌被删除、目标变化、令牌读取/应用失败、PR/MR 失败、远端列表失败 | 通知入口或弹窗;保留令牌管理、重新加载、重新应用及重试,详情标明远端 |
| 设置 | AI 设置读取、外观/工作区持久化、令牌加载、服务商保存/测试、提交生成保存、主题导入/恢复 | 错误弹窗或持久通知;成功使用轻量 message;保留重新加载配置入口 |
| 网络代理 | 保存/操作结果、其他窗口更新配置、服务器状态刷新失败 | 冲突/后台错误经通知入口查看;明确“重新加载会丢弃草稿”;关闭提示保留草稿 |
| 版本更新 | 桥接错误、检查/下载/安装异常 | 设置页弹窗或后台通知,保留重连/检查/下载/安装入口;已有更新弹窗内仍使用内部错误 |
| 持续状态 | 尚无提交、无远程、缺作者、浅克隆、未知 PR/MR 平台、远端不可用 | 紧凑“提示”入口按需查看;保留添加远程、设置作者、获取完整历史 |
字段校验、内容空状态、不支持预览、现有表单/确认弹窗内部错误继续就地显示。Git 操作进度、计时与取消入口保留。
FeedbackProvider 统一队列,FeedbackScope 限定仓库或设置页,FeedbackNotice 注册当前事件。事件按上下文、来源和请求/结果版本去重;关闭只确认显示,不执行写操作。重复点击处理入口被 busy 锁拦截。源组件卸载或上下文失效后移除回调;React StrictMode 的旧清理不会删除新注册。当前来源最新结果保留到成功或退出页面,已确认事件版本缓存最多 200 个,不持久化到磁盘。
普通成功结果复用 Ant Design message。持续说明和后台错误通过不会抢焦点的入口打开;用户主动重试的新失败可以重新提示。多个需阅读结果顺序展示。
全屏时将提示入口挂载到 Diff 对话框内部,避免浏览器原生 inert 规则让入口无法点击。从持续说明进入设置作者等配置操作时退出 Diff 全屏,使表单可以正常输入。详情使用原生 <dialog> 顶层与 Ant Design 按钮:支持焦点约束、Escape、焦点返回,以及覆盖同为原生顶层的 Diff 全屏。已有 Ant Design 表单/确认弹窗打开时,统一详情等待其关闭,避免叠加。长文本独立滚动,可选择并复制。深浅主题使用现有 CSS 变量。
Electron 中只允许应用自身可信 renderer/origin 的 clipboard-sanitized-write;剪贴板读取、外部来源和其他权限继续拒绝。桌面复制验收需显示并聚焦窗口,后台隐藏窗口会被 Chromium 拒绝复制。
环境:macOS arm64,Node.js v25.5.0;Web 使用 Ego Lite Chromium;桌面使用项目锁定 Electron 44.2.0 的暂存应用。截图采用合成仓库/接口故障数据,不包含真实令牌或服务器资料。
| 检查 | 结果 |
|---|---|
npm test -w web |
167/167 通过,含队列/去重/重试/过期回调/重复提交、提交文件错误归属,以及原 history、files、PR/MR、status、layout 回归 |
npm run desktop:build |
5 个任务通过;保留既有大 bundle 警告 |
npm run test:unit -w desktop |
44/44 通过,含可信来源剪贴板写入与读取拒绝 |
node apps/desktop/scripts/smoke.mjs(从 apps/desktop 运行 node scripts/smoke.mjs) |
完整冒烟通过,含真实本地 Git 反馈、全屏提示与作者配置、历史 / Diff、侧栏、外观、令牌、更新和重启恢复 |
| Git 取消的前后尺寸 | 旧横幅使正文高度减少 97.14px;新弹窗前/中/后均为 1204×840 |
| 关闭、刷新与主动再次失败 | 旧错误关闭后刷新不重弹;新的失败再显示;刷新状态没有再次发送 Git 写请求 |
| 历史、提交文件、目录、PR/MR | 通过接口故障触发与重试;提交文件单次错误只出现一个详情弹窗 |
| 设置保存、令牌读取、主题导入 | 失败详情可查看;设置草稿关闭后保留;成功保存显示 message 浮层 |
| 代理并发修改 | 后台检查保留输入焦点;关闭提示端口草稿保持 7899;明确重载后才恢复配置端口 7890 |
| 持续状态 | 加载时不自动弹窗,用户通过提示入口查看;打开作者编辑框时没有叠加反馈弹窗 |
| 仓库切换 | 历史请求延迟 1.8 秒时切换至另一仓库,旧请求返回后无弹窗、无旧回调入口 |
| 长错误、深浅色、390px 窗口 | 通过;80 行错误在详情内滚动,按钮可用 |
| Diff 全屏 | 错误详情位于最上层;Escape 仅关闭反馈;提示入口可以点击并查看持续说明;设置作者操作退出全屏后表单可输入 |
| 版本更新失败 | 注入隔离桌面桥接状态验收检查失败详情与重试入口;不访问真实发布源、不安装更新 |
历史回归最初仍查找已移除的 .history-notice--error,已改为验证新详情和重试后的历史保留。桌面复制测试最初在隐藏窗口触发,修正为聚焦窗口后验证真实剪贴板,并恢复原文本。反馈重复操作测试等待上一次 Git 刷新完成后执行,避免在按钮禁用时模拟点击。复制验收后的窗口保持可见直到冒烟结束,确保后续侧栏拖动的动画帧继续运行。
最终补查发现,原生全屏的 inert 规则会屏蔽外部提示入口和作者表单;改为全屏内挂载入口、配置操作释放全屏层,浏览器真实点击与输入验证通过,并补充桌面断言。
迁移前 Git 取消:

迁移后浅色弹窗:

历史、文件、PR/MR:

设置与代理:

持续说明与边界:

合成 API:node apps/web/tests/fixtures/feedback-api.mjs 3198,将开发 Vite 的 /api 代理指向 http://127.0.0.1:3198。POST /__faults 接受例如 {"log":true}、{"tree":true}、{"outdated":true};空对象恢复正常响应。页面由真实组件渲染,未修改截图中的 DOM。
Windows/Linux 原生桌面、真实私有 GitHub/GitLab、真实发布源与真实 SSH 断网取消场景未在本机逐项执行;本次不改变后端 Git 取消、回滚、鉴权与配置持久化语义。回退代码 PR 后需单独核对 Wiki 修订。
本设计稿已独立收录至 UI 规范 → 弹窗系统,完整设计说明、交互 HTML、深浅主题预览和附件校验信息统一在该页维护。
- 状态:设计提案,待确认,尚未接入产品;不改变本页的实现方案与验收结论。
- 下载独立交互设计稿(HTML)
- 浏览 UI 规范索引
- Issue #118
- 实现 PR
-
弹窗系统 UI 规范与设计稿;附件:
assets/issue-118/dialog-design/ - 功能与优化设计索引