Skip to content

fix(forwards): 端口映射添加表单无会话时的静默死按钮 - #127

Merged
gggaiitx merged 1 commit into
jinpy666:mainfrom
gggaiitx:codex/ssh/forward-add-dead-button-fix
Sep 29, 2026
Merged

gggaiitx merged 1 commit into
jinpy666:mainfrom
gggaiitx:codex/ssh/forward-add-dead-button-fix

Conversation

@gggaiitx

Copy link
Copy Markdown
Collaborator

问题

端口映射弹窗「添加」按钮在无 SSH 会话(sessionId 为 null)时表现为静默死按钮:输入框仍可编辑、按钮变灰,点击后既不报错也不添加。典型触发场景:会话在弹窗打开期间断开(:session-id 响应式变为 null)。

根因(三点叠加)

  1. <form :disabled="!sessionId"> 是无效 HTML 属性(disabled 非 <form> 合法属性)→ 控件未被禁用,仅提交按钮变灰,形成「填了内容却点不动」的错觉。
  2. submitForward() 中 if (!props.sessionId) return; 静默返回,零反馈。
  3. 提交按钮无 pending 态:远程转发等待服务端响应时外观与「无响应」一致;且 catch 分支清空错误文案后仅向父级冒泡,弹窗内失败不可见。

后端 ssh/forward/start 路径已核实正常(main.rs:413 block_on 注册、ForwardEntry::payload() 含 id、spawn_local_listener 无阻塞),问题纯属前端反馈缺失。

修改

  • frontend/src/components/PortForwardDialog.vue
    • <form disabled> → <fieldset :disabled>(合法禁用语义,内联重置边距避免视觉回归)
    • 无会话时显示可见提示而非静默返回;提交加 submitting 忙碌锁(防重复提交 + 加载态);失败错误文案在弹窗内显示并同时向父级冒泡
  • frontend/src/lib/i18n.ts:新增 forwards.error.noSession,七语齐全(zh-CN/zh-TW/en/es/it/ja/pt-BR)

本地校验

  • python scripts/validate_repo.py → PASS(io.dbx.ssh 0.7.1-beta.9)
  • pnpm --dir frontend typecheck(vue-tsc)→ PASS
  • pnpm --dir frontend test → 128 files / 1284 tests 全部通过
  • pnpm --dir frontend build → PASS

元信息

  • Base SHA: 0da8be8(upstream/main HEAD)
  • Changed files: 2(frontend 组件 + i18n,无 backend / ui / dist 改动)
  • 风险:低。仅前端反馈层,不改 RPC 协议与后端行为;fieldset 视觉以内联样式复位。

后续(另行处理)

  • docs/FEATURE_PARITY.zh-CN.md、docs/REVIEW_FORM_VS_TABBY.zh-CN.md 仍写「端口转发 ❌ 不做」,与已实现代码矛盾(文档漂移)。

- <form disabled> 是无效属性:sessionId 为空时输入框仍可编辑、仅按钮变灰,
  用户填完内容点击无任何反馈;改用合法的 <fieldset :disabled> 真正禁用控件。
- submitForward 的 if (!sessionId) return 静默返回改为可见提示
  (新增 i18n forwards.error.noSession,七语齐全)。
- 提交增加 submitting 忙碌锁:防重复提交、慢 RPC(远程转发等待服务端)
  时按钮显示加载态,不再与「无响应」混淆。
- 提交失败时错误文案在弹窗内显示(原先清空后仅向父级冒泡,失败不可见)。
@gggaiitx
gggaiitx merged commit 35f6cdd into jinpy666:main Sep 29, 2026
12 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant