Syngnat
|
b2df94a3ba
|
🐛 fix(window): 修复 mac 窗口恢复越界 (#643)
## 问题描述
macOS 多屏环境下,普通窗口恢复/修正位置时可能被定位到当前屏幕外,尤其是在外接屏位于主屏左侧或上方、浏览器
`screen.availLeft/availTop` 出现全局偏移时更容易触发。
## 复现条件说明
该问题不是所有 macOS 用户都能稳定复现,更依赖特定显示器布局和窗口状态。高概率触发条件包括:
- 使用 macOS 多屏。
- 外接屏位于主屏左侧或上方,导致 `screen.availLeft` / `screen.availTop` 为负数或非零。
- GoNavi 处于普通窗口态,而不是最大化或全屏。
- 应用保存过窗口位置,并在重启、切屏、拔插显示器、focus/resize 后触发窗口 bounds 恢复或修正。
单屏 mac、外接屏仅位于主屏右侧、始终最大化/全屏打开,或未保存过异常窗口位置的用户通常不容易触发。
## 根本原因
Wails 的 `WindowSetPosition(x, y)` 在 macOS 上接收的是当前 monitor
可见区域内的局部坐标,而不是全局桌面坐标。原逻辑把 `window.screen.availLeft/availTop`
作为可见区起点传入恢复算法,导致保存的局部坐标和恢复时的全局偏移混用。
## 修复方案
- 新增 `resolveWailsWindowVisibleViewport`,集中处理 Wails 主窗口恢复使用的可见区域。
- macOS 下将可见区原点固定为当前 monitor 局部 `(0, 0)`,避免把浏览器 screen 全局偏移继续传给 Wails。
- 补充单元测试覆盖负 `availLeft` 的外接屏场景。
- 更新 App 窗口恢复源码断言测试。
## 变更文件
| 文件 | 修改说明 | 变更行数 |
|---|---|---|
| `frontend/src/App.tsx` | macOS 下使用 Wails 局部坐标解析窗口可见区 | +7 -7 |
| `frontend/src/utils/wailsWindowViewport.ts` | 新增 Wails 窗口可见区解析工具 | +52
|
| `frontend/src/utils/wailsWindowViewport.test.ts` | 覆盖 macOS 局部原点和
fallback 场景 | +43 |
| `frontend/src/App.tool-center.test.ts` | 同步窗口恢复源码断言 | +2 -1 |
## 合并注意事项
- **影响功能点**:桌面端普通窗口启动恢复、focus/resize 后窗口 bounds 修正。
- **验证方式**:
- `npm test -- --run src/utils/wailsWindowViewport.test.ts
src/utils/windowRestoreBounds.test.ts
src/utils/windowStartupLayout.test.ts src/App.tool-center.test.ts`
- `npm run build`
- **回归风险**:低。变更集中在窗口可见区解析;非 macOS 平台保留原 `screen.availLeft/availTop` 处理。
- **回滚方式**:revert 此 PR 即可。
|
2026-07-09 16:31:44 +08:00 |
|
Syngnat
|
19572a3cc9
|
feature(query-result): 支持SQL执行结果差异比对
|
2026-07-09 16:28:59 +08:00 |
|
Syngnat
|
8d7e7a6ddf
|
✨ feat(query-editor): 结果页列元数据跨库加载并实心化保存按钮
- 结果集携带 metadataDbName/TableName,列类型注释从真实库表加载
- 只读查询也解析 tableRef,避免结果页丢元数据
- 选择列底色与固定列对齐;保存按钮改为蓝色实心主按钮样式
- 独立结果窗/还原路径同步元数据字段
|
2026-07-09 15:37:27 +08:00 |
|
Syngnat
|
af9f490172
|
✨ feat(datagrid): 完善左固定列体验并统一选中主题色
- 虚拟表横滚:表头 sticky + 表体 translateX 补偿,勾选/行号/钉住列同步固定
- 支持列头钉住左侧、钉住列显示图标;序号列可拖宽且不参与排序
- 行选中与单元格选区统一 V2 绿色,固定列底色对齐 --gn-bg-panel
- 查询结果页启用列头筛选,并在客户端按条件过滤当前结果集
|
2026-07-09 15:37:20 +08:00 |
|
DurianPankek
|
099443fddc
|
🐛 fix(window): 修复 mac 窗口恢复越界
|
2026-07-09 15:25:48 +08:00 |
|
Syngnat
|
947277bdec
|
🐛 fix(query-editor): 修复限定名超链接并支持跨库/schema 解析
- 两段名兼容 MySQL 库.表与 PG/SQL Server 的 schema.表
- 三段名支持 database.schema.object,常见 schema 不当成库拉取
- SQL 变更时按引用库防抖补拉元数据并刷新装饰
- 修复元数据 key 提前占死导致取消后不再拉取、超链接全灭
- 补充限定名解析与收集逻辑单测
|
2026-07-09 14:23:09 +08:00 |
|
Syngnat
|
b1bd4bb5ec
|
✨ feat(datagrid): 数据预览与 SQL 结果支持行号显示及设置开关
- 新增 appearance.showDataTableRowNumber,默认开启,主题设置可切换
- 数据预览与查询结果表统一跟随该偏好显示行号列
- 行号列收窄为固定窄宽,少列时多余宽度只加到数据列避免撑宽
- 补充 i18n 与相关单测
|
2026-07-09 14:23:09 +08:00 |
|
Syngnat
|
d210b3f39c
|
🐛 fix(window): 加固 Windows 冷启动半窗,原生最大化并兜底铺满工作区
- Windows 启动 WindowStartState 改为 Maximised,默认尺寸提升到 1440×900
- 无记忆/历史 1024×768/覆盖率过低的普通窗记忆改为启动最大化
- Maximise 多次失败时铺满工作区兜底,避免残留浮动半窗
- 用户刻意拉大的普通窗仍先 Unmaximise 再恢复尺寸位置
|
2026-07-09 14:02:53 +08:00 |
|
Syngnat
|
901b436107
|
🐛 fix(connection-package): 导出/导入连接包携带 Redis DB 别名
- 连接包 payload 与导出选项支持 redisDbAliases(连接 ID → db 序号 → 别名)
- 导入返回 ConnectionPackageImportResult,一并恢复别名映射
- 前端导出时注入 appearance.redisDbAliases,导入后 merge 回 appearance
- 补充别名往返测试与 mergeRedisDbAliases 单元测试
|
2026-07-09 13:57:32 +08:00 |
|
Syngnat
|
cdfbdd5dd5
|
✨ feat(update): 下载进度到 100% 后由用户点击「重启应用更新」
- 取消 macOS 下载完成后自动安装/退出,Win/Mac 统一交互
- 进度弹窗在 100% 显示就绪提示,主按钮改为「重启应用更新」
- 关于页安装入口同步文案;点击后才执行安装脚本并重启
- 补充多语言与前端回归测试
|
2026-07-09 13:38:07 +08:00 |
|
Syngnat
|
566339f09f
|
🐛 fix(window): 加固 Windows 启动最大化与窗口尺寸记忆落盘
- windowState/windowBounds 与启动偏好一致,立即写入本地持久化
- 启动最大化首次立即执行并加重试,成功后固化 maximized 状态
- 仅在 hydration 完成后恢复,避免默认 1024×768 半窗被误记
- 补充 store 与启动恢复相关测试断言
|
2026-07-09 12:35:12 +08:00 |
|
Syngnat
|
dec9b8317c
|
♻️ refactor(settings/ai): 聊天入口打开 AI 设置改走设置中心
- 从 AI 聊天面板打开设置时进入设置中心服务-AI 页
- 移除独立 AISettingsModal 挂载,复用 AISettingsContent
- 安全更新修复跳转同步走设置中心,关闭后可回到修复流程
- 更新设置中心与工具中心相关源码级测试断言
|
2026-07-09 12:19:22 +08:00 |
|
Syngnat
|
c77d338ab1
|
✨ feat(ai-chat): 支持侧栏/独立窗默认打开、双向切换与尺寸记忆
- 新增 AI 独立浮动窗,标题栏可拖拽缩放并与侧栏双向切换
- 设置中可配置默认打开方式(侧栏/独立窗),偏好持久化
- 记忆独立窗上次位置与尺寸,再次打开自动恢复
- 优化输入区默认高度与底部模型/思考/用量工具条布局
- 去掉独立窗外层重复标题栏,由面板 header 统一承载操作
|
2026-07-09 12:18:51 +08:00 |
|
Syngnat
|
bc3f76dd73
|
✨ feat(ai-chat): 思考强度移入聊天面板并按次请求下发
- 面板底部新增思考强度选择,按服务商 profile 动态选项
- ChatSendOptions 支持 thinkingIntensity,仅本次发送生效
- 从供应商表单移除思考强度配置,避免与面板控制重复
- 补齐多语言文案与相关前后端测试
|
2026-07-09 12:17:40 +08:00 |
|
Syngnat
|
4fcd7ff61f
|
✨ feat(ai): 支持 MCP 少量查数与分服务商思考强度,修复 DeepSeek Anthropic
- MCP HTTP 默认可注册 execute_sql,行数默认 50/上限 200,设置页可切换仅结构模式
- 思考强度按 OpenAI/Anthropic/DeepSeek/Gemini 体系映射档位与请求参数
- 自定义端点 DeepSeek Anthropic 自动纠正 base 路径并回传 thinking 块
- 补充前后端回归测试与多语言文案
|
2026-07-09 11:34:38 +08:00 |
|
Syngnat
|
26c22379ae
|
🐛 fix(window/theme/updater/query-editor): 修复 Windows 冷启动半窗与主题/更新/补全体验
- 窗口:最大化恢复加重试与启动宽限,无记忆尺寸时 Windows 居中大窗,冷启动主动 WebView2 settle
- 主题:v2 设置中心主题外观改扁平自定义控件,legacy 保持侧栏卡片布局
- 更新:启动发现更新改开设置中心关于页,下载失败支持 assets API 回退并硬化检查链路
- 补全:suggest 列表字段名优先完整显示,元数据空间不足时再省略
- 测试:补充 window/theme/updater/补全相关回归断言
|
2026-07-09 11:13:42 +08:00 |
|
Syngnat
|
6fb6674803
|
✨ feat(tab/window): 完善Tab拖出独立窗口跟手预览与入场动效
- 结果Tab支持拖出拆分,拖拽过程抑制文本选中
- 抽取 DetachDragPreview:进度条/跟手预览/阈值高亮
- 工作区主Tab拖出复用同一套预览动效,松手位置跟手
- 浮动窗增加 scale 入场动画,增强拆出反馈
|
2026-07-09 09:44:53 +08:00 |
|
Syngnat
|
c1cf19ef67
|
🐛 fix(sidebar/kingbase): 修复函数列表重复叠加导致越刷越多
- 元数据 fallback:完整目录查询首次成功后停止,避免多条 SQL 结果叠加
- 函数去重:按 schema+name+type 大小写不敏感去重,折叠同名 overload
- 树节点 key 区分 func/proc,避免同名函数/过程 key 冲突引发虚拟列表刷屏
- 补充 Kingbase/MySQL 函数元数据加载单测锁定回归
|
2026-07-09 09:20:33 +08:00 |
|
Syngnat
|
de868a2763
|
✨ feat(tab/window): 支持主工作区与结果Tab拆出为应用内浮动窗口并还原
- 新增 detached 会话态:主工作区窗口与查询结果窗口独立管理
- 主Tab支持右键拆出与垂直拖出,浮动窗可拖拽缩放并还原/关闭
- 结果Tab右键拆出为浮动结果窗,支持还原回源查询结果区
- 抽离 WorkbenchTabContent,QueryEditor 结果会话缓存避免拆出丢失
- 补充六语言文案与 detach/store 相关单元测试
|
2026-07-09 09:08:50 +08:00 |
|
Syngnat
|
5fc33102a9
|
🐛 fix(updater): 修复关于页正式版信息兜底
- 为关于页补充固定项目元数据兜底
- 过滤 Unknown/未知 等无效版本与作者信息
- 增加正式版 AppInfo 缺失时的回归测试
|
2026-07-08 21:37:10 +08:00 |
|
Syngnat
|
f74ad02b9d
|
🐛 fix(query-editor): 限制 macOS 搜索仅响应 Cmd+F
- 拦截 Monaco 内置 Cmd+E find-with-selection 行为
- 保留默认 Cmd+E 当前语句选择逻辑,禁用或改键时不触发搜索
- 增加 SQL 编辑器快捷键回归测试并加固 Monaco 测试包装
|
2026-07-08 20:30:31 +08:00 |
|
Syngnat
|
dca1e8a251
|
✨ feat(updater): 优化关于页更新信息展示
- 关于页直接进入 GoNavi 内容详情,减少二次点击
- 将更新通道改为分段选择器并优化描述布局
- 保留后端发布发布时间元数据并在版本信息中展示
|
2026-07-08 20:30:05 +08:00 |
|
Syngnat
|
22fab86010
|
🐛 fix(ui): 修复数据表按钮与侧栏滚动条显示
- 修复 v2 分页“统计总数”按钮被压缩为图标宽度的问题
- 首次打开时隐藏树主体横向溢出,保留独立横向滚动条占位
- 将自定义字段显示里的全局隐藏列文案改为多语言翻译
- 增加数据表按钮和侧栏横向滚动条布局回归断言
|
2026-07-08 17:37:21 +08:00 |
|
Syngnat
|
da895ea502
|
✨ feat(settings): 统一设置中心内页与代理交互
- 将主题设置、AI 设置和关于页纳入设置中心详情页,补齐返回和取消交互
- 重构全局代理设置为草稿应用模式,新增常用预设、URL 测试入口和测试结果展示
- 按参考样式重做关于页版本与项目入口布局,并收紧顶部品牌卡尺寸
- 提取 AISettingsContent 供设置中心内嵌复用,控制详情页内部滚动边界
- 补齐多语言文案和设置中心静态回归断言
|
2026-07-08 17:37:05 +08:00 |
|
Syngnat
|
b94168957e
|
🐛 fix(update/proxy): 稳定更新检查与代理运行时
- 更新检查前恢复持久化全局代理,避免重启后代理状态未进入运行时
- 将 DNS、EOF 和临时网络异常转为本地化错误,并对可重试网络错误做短重试
- 优先读取 GitHub asset digest,缺失时再回退 SHA256SUMS 校验文件
- 新增全局代理连接测试后端接口,支持草稿代理、已保存密码复用和清除密码意图
- 更新 Wails 绑定、浏览器 mock 与代理草稿序列化测试
|
2026-07-08 17:36:42 +08:00 |
|
Syngnat
|
c792a30932
|
🐛 fix(query-result): 修复SQL执行后结果面板崩溃
- 提前解析当前激活结果页 key
- 避免构造结果 tab 时读取未初始化变量
- 修复 MySQL SELECT 成功返回后编辑器闪退问题
|
2026-07-08 14:16:36 +08:00 |
|
Syngnat
|
23c895e839
|
test(update): auto install macOS package after download
|
2026-07-08 13:43:13 +08:00 |
|
Syngnat
|
7a5960e737
|
fix(update): auto install macOS package after download
|
2026-07-08 13:41:45 +08:00 |
|
Syngnat
|
dee5620fc9
|
test(data-grid): cover global hidden column helpers
|
2026-07-08 12:24:27 +08:00 |
|
Syngnat
|
b1174861d4
|
feat(query-result): apply global hidden columns
|
2026-07-08 12:24:12 +08:00 |
|
Syngnat
|
a1f296ee08
|
feat(data-grid): expose global hidden column configuration
|
2026-07-08 12:20:54 +08:00 |
|
Syngnat
|
3e34795ef5
|
feat(data-grid): add global hidden column storage helpers
|
2026-07-08 12:19:47 +08:00 |
|
Syngnat
|
82ad393a05
|
perf(oceanbase): use FETCH FIRST for Oracle auto limit
|
2026-07-08 12:18:32 +08:00 |
|
Syngnat
|
5712b39cf9
|
test(oceanbase): expect Oracle auto limit FETCH FIRST
|
2026-07-08 11:52:06 +08:00 |
|
Syngnat
|
07dc1436af
|
perf(oceanbase): use FETCH FIRST for Oracle auto limit
|
2026-07-08 11:51:05 +08:00 |
|
Syngnat
|
9e52397732
|
fix(editor): recover dropped printable Monaco input
|
2026-07-08 11:35:00 +08:00 |
|
Syngnat
|
20ff4f3687
|
fix(query-result): show capped result counts as exact totals
|
2026-07-08 11:32:01 +08:00 |
|
Syngnat
|
c27a038fc5
|
test(query-result): auto limit cap has exact page total
|
2026-07-08 11:08:03 +08:00 |
|
Syngnat
|
c3c4efc6ec
|
fix(query-result): avoid not-counted summary for auto limit cap
|
2026-07-08 11:07:31 +08:00 |
|
Syngnat
|
0e348fcca4
|
test(query-editor): allow literal 100-row limit label
|
2026-07-08 10:43:46 +08:00 |
|
Syngnat
|
7d79fae84d
|
fix(query-editor): use literal label for 100-row option
|
2026-07-08 10:43:02 +08:00 |
|
Syngnat
|
f642e0325d
|
chore: remove temporary max rows i18n note
|
2026-07-08 10:40:20 +08:00 |
|
Syngnat
|
43a408f1c9
|
docs(query-editor): note 100-row option i18n key
|
2026-07-08 10:40:05 +08:00 |
|
Syngnat
|
6c269a99cf
|
fix(oceanbase): support multi-part Oracle table links
|
2026-07-08 10:39:32 +08:00 |
|
Syngnat
|
24841f2dd9
|
test(query-editor): require 100-row limit label key
|
2026-07-08 10:37:10 +08:00 |
|
Syngnat
|
c2e60c1e52
|
feat(query-editor): add 100-row limit option
|
2026-07-08 10:36:38 +08:00 |
|
Syngnat
|
93a3240862
|
fix(query-editor): fallback ctrl-click for OB Oracle schema tables
|
2026-07-07 17:47:45 +08:00 |
|
Syngnat
|
1116a3736b
|
fix(data-grid): bridge pagination count action to toolbar
|
2026-07-07 17:45:37 +08:00 |
|
Syngnat
|
8c968c1a87
|
feat(data-grid): expose total count action in pagination
|
2026-07-07 17:31:53 +08:00 |
|
Syngnat
|
7ee8698165
|
test(query-editor): cover bad connection timeout semantics
|
2026-07-07 16:50:57 +08:00 |
|