4853 Commits
Author SHA1 Message Date
Loc NguyenandLoc Nguyen 9c5bc49902 fix(document): keep the grid scroll position after saving edits (#12810)
Co-authored-by: Loc Nguyen <locnguyen@astraler.com>
2026-10-20 15:10:59 +08:00
Hand Sonic e7a10baccd fix(kingbase): reconfigure editor language and completion by mode (#12834) 2026-10-20 15:07:37 +08:00
Hand Sonic f1cac02678 fix(kingbase): apply live mode to query parameters and batches (#12833) 2026-10-20 15:04:50 +08:00
Hand Sonic b8de0cab90 fix(sql): preserve Kingbase mode boundaries and hash operators (#12828) 2026-10-20 15:02:04 +08:00
Hand Sonic 302dbf6094 fix(kingbase): refresh mode before frontend connection readiness (#12827) 2026-10-20 14:58:31 +08:00
lxk955andzipg 9f2ac21760 fix(editor): sync renamed query tab title to saved SQL library (#12831)
* fix(editor): sync renamed query tab title to saved sql library (#12816)

* test: await async renameTab and sync stale saved-sql rename assertions (#12816)

* fix(editor): preserve persisted SQL names during normal save

---------

Co-authored-by: zipg <4047349+zipg@users.noreply.github.com>
2026-10-20 14:54:41 +08:00
6ff53b3078 fix(grid): keep the busy overlay elapsed time across result view switches (#12821) (#12842)
* fix(grid): keep the busy overlay elapsed time across result view switches (issue #12821)

The elapsed pill of the grid busy overlay re-based itself on the mount time
whenever the surface became busy, so switching the result view mid-query
(which unmounts and remounts the grid) restarted the counter at zero.

Read the execution start from the tab when the busy surface is driven by a
query execution, and keep the per-mount baseline for busy surfaces that no
execution drives.

* fix(grid): rebase elapsed timer on a new execution

* test(grid): cover elapsed timer rebasing

---------

Co-authored-by: dev <dev@local>
Co-authored-by: zipg <4047349+zipg@users.noreply.github.com>
2026-10-20 14:53:03 +08:00
lxk955 e6c08bdb99 feat(sidebar): support opening all connections in a connection group (#12844)
* feat(sidebar): support opening all connections in a group (#12814)

* fix(sidebar): export findConnectionNode from connectionStore and call directly (#12814)
2026-10-20 14:48:44 +08:00
lxk955 f9957f1f8a feat(sql-file): add search filtering and name sorting to SQL file panel (#12795) (#12840) 2026-10-20 14:48:29 +08:00
lxk955 a6275be47f fix(sql): keep query after inline explain separate (#12811) (#12824) 2026-10-20 14:44:47 +08:00
Hand Sonic fdc6e847d6 fix(kingbase): preserve optional mode metadata across protocol layers (#12823) 2026-10-20 14:43:28 +08:00
lxk955 e8bee1ca76 fix(mqtt): adjust default console polling interval to 1s and support interval selection (#12829) (#12851) 2026-10-20 14:27:55 +08:00
Thanadon Kongkanun b20151829a fix(settings): hide the reveal toggle for a saved snippet passphrase (#12847)
When the snippet sync passphrase is saved in the system keychain, the
passphrase field is empty and only shows a '••••••••' placeholder. The
eye toggle was still rendered, so clicking it switched an empty input
to text and the placeholder dots stayed: the button looked broken.

Hide the toggle while the field only holds the saved-passphrase
placeholder and show it again once a new passphrase is typed. This is
the same rule the WebDAV secrets passphrase field already uses
(`!webdavHasSavedSecretsPassphrase || !!webdavSecretsPassphrase`). The
saved passphrase is not read back from the keychain into the UI.

Fixes #12839
2026-10-20 14:27:13 +08:00
ericbyz 87f1432fc4 fix(import): preserve workbook selection when an Excel sheet is empty (#12738)
* fix(import): keep data sheets selectable when an Excel sheet is empty

* fix(import): scan past the preview window before judging an Excel sheet empty

Anchor the preview window at the first content row instead of stopping at
data_start_row + preview_limit, so a sheet whose only data sits beyond the
preview limit is no longer reported as an empty preview. The grid-size guard
now counts only the anchored window so a far first data row cannot falsely
trip MAX_FAST_PREVIEW_CELLS.

* fix(clippy): drop test-only transfer column name wrapper

resolve_transfer_target_column_names lost its last non-test caller in
7fdf16283, so the lib build fails the CI clippy job with dead_code. Fold
its four test call sites into resolve_transfer_target_column_names_or
with the source names as fallback.
2026-10-20 10:28:30 +08:00
Guoyu Su 81b601bbdb fix(tdengine): preserve child tables and optimize tree loading (#12759) 2026-10-20 10:25:30 +08:00
efeire 12443d769c feat(objects): copy table column metadata (#12771)
* feat(objects): copy table info columns

* fix(objects): reset copied column selection on filter

* fix(objects): scope column shortcuts to selection

* fix(objects): support shortcuts from columns area

* fix(objects): copy selected columns through native copy

* docs: document copying table column info

* feat(objects): copy table info columns

* fix(objects): reset copied column selection on filter

* fix(objects): scope column shortcuts to selection

* fix(objects): support shortcuts from columns area

* fix(objects): copy selected columns through native copy

* docs: document copying table column info

* fix(objects): guard formulas in copied column metadata

* fix(objects): remove obsolete TSV escape helper
2026-10-20 10:23:01 +08:00
ericbyz 72a584568f fix(grid): 无主键表行定位器被引擎拒绝时自动降级,修复 Hologres 单击表报错 (#12647) (#12687)
* fix(grid): degrade keyless-table row locator when the engine rejects tableoid

PostgreSQL-compatible engines without system-column support (Hologres'
query translation layer rejects tableoid, #12647) failed every keyless
table open with a db error because the ctid row locator introduced by
0264cfb projects tableoid/ctid/xmin unconditionally for postgres-type
connections. Hologres reports a plain PG-11-style server_version, so the
gate cannot be driven off the version string.

On the first failed keyless-table load, retry once without the locator;
a successful retry remembers the connection so later opens skip the
locator entirely (keyless tables stay read-only there), and a failed
retry restores the flag so the real server error stays visible. Loads
without the locator keep the original execution path.

Pin the emitted statement in the dialect suite and cover the fallback
behavior (retry once, remember per connection, restore on double
failure) with compositional vitest cases.

* test(grid): drop unused QueryResult import to stay under the lint warning budget
2026-10-20 10:22:44 +08:00
lxk955 ba9ea06bbd feat(ai): add option to include query result previews in AI context (#12776)
* checkpoint: #12757 add includeQueryResult/excludeQueryResult option gating query-result previews in AI context (frontend setting + UI + i18n, Rust serde fields; tests pending)

* style: oxfmt reformat AiAssistant.vue + EditorSettingsDialog.vue (#12757)

* chore(i18n): fill ai query-result translations for 7 locales (#12757)

The i18n-autofill workflow failed on a truncated DeepSeek response before
pushing these; adding them manually so the autofill check passes.
2026-10-20 10:20:16 +08:00
PanyangY 3bf7532df9 feat(editor): add SQL statement navigation shortcuts (#12754)
Add previous/next statement and statement-start navigation to the SQL editor.
The commands reuse the executable statement ranges behind "execute current
statement" and "select current statement", so navigation boundaries always
match what execution would run.

Defaults: Ctrl+Shift+ArrowUp (previous), Ctrl+Shift+ArrowDown (next),
Alt+Home (statement start). All three are configurable under Settings >
Shortcuts and translated in every shipped locale.

Covered by unit tests for the range math and a mounted QueryEditor integration
test that drives the keybindings.

Refs #12678
2026-10-20 10:20:04 +08:00
弈秋andyiqiui 44754e7cc0 fix(grid): keep pasted empty strings as empty strings instead of NULL (issue #12727) (#12748)
Pasting a copied row into a new row coerced every empty field to SQL NULL,
because coerceDataGridCellValue treats an empty input over a NULL cell as
"clear this cell". That rule is right for the editor, but a paste carries
literal text: '' has to stay ''.

- paste paths now pass preserveEmptyString, and the coercion honours it only
  for columns the grid classifies as text (resolveDataGridTypeVisualKind ===
  "string"). Numeric, boolean, temporal, uuid, JSON, binary, array and
  unclassified columns keep their NULL, since none of them has an '' value to
  preserve and the save layer would format '' as a literal that the server
  rejects or stores as a different value.
- the clipboard parser turns the configured copy/extract "NULL text" back
  into NULL, so a NULL cell survives a copy/paste round trip through text
  while an empty string stays empty. With the default (empty) NULL text every
  empty field stays an empty string.

Co-authored-by: yiqiui <yiqiui@users.noreply.github.com>
2026-10-20 10:18:10 +08:00
lxk955 bd43e344c0 feat(sidebar): support F5 shortcut to refresh sidebar connection and databases (#12780)
* feat(sidebar): support F5 shortcut to refresh sidebar connection and databases (#12246)

* fix(sidebar): declare refreshNode on SidebarTreeRuntimeHost and preserve tooltip text (#12246)
2026-10-20 10:15:31 +08:00
lxk955 2986269544 feat(sidebar): support creating table group from container context menu (#11193) (#12781) 2026-10-20 10:15:20 +08:00
lxk955 607bfd20b7 fix(redis): preserve pinned databases across alias updates and reconnects (#12752) (#12765) 2026-10-20 10:14:37 +08:00
lxk955 e33c19b3b3 fix(query): display execution duration when re-executing after error (#12749) (#12767) 2026-10-20 10:14:27 +08:00
zhukj 8398a462fb fix(sidebar): keep search results when re-expanding projection (#12766) 2026-10-20 10:14:16 +08:00
lxk955andzipg b5eb36e578 improve(tabs): mark active grouped tab with a primary edge accent (#12540)
In grouped horizontal layouts, the active tab was only signaled by a
neutral rail segment, which is not enough to spot it among several
colorful groups (issue #12485). Paint a primary-colored top-edge accent
on the active grouped tab — the same vocabulary as the vertical tab's
inset --ring edge — so the chosen tab stays findable at a glance. The
var fallback keeps legacy WebViews painted.

Fixes #12485

Co-authored-by: zipg <4047349+zipg@users.noreply.github.com>
2026-10-20 10:13:21 +08:00
c02cdbfe6a feat(grid): support count-based filtering in local distinct value filter (#11980) (#12628)
* feat(grid): support count-based filtering in local distinct value filter (#11980)

* chore(i18n): autofill new translations

* style(i18n): reformat locale files with pinned oxfmt 0.73.0 (post-rebase autofill block)

---------

Co-authored-by: dbx-i18n-bot <github-actions[bot]@users.noreply.github.com>
Co-authored-by: zipg <4047349+zipg@users.noreply.github.com>
2026-10-20 10:13:11 +08:00
弈秋anddev b168508b9f fix(connection): keep the Oracle TNS_ADMIN directory in plaintext exports (#12723)
An Oracle TNS connection stores its alias in `database` and the
`jdbc:oracle:thin:@<alias>?TNS_ADMIN=<dir>` string that resolves it in
`connection_string`. `scrubConnectionForPlaintextExport()` blanked
`connection_string` unconditionally, so a plaintext export/import silently
dropped the directory that resolves the alias — the re-imported connection
could not connect and had to be reconfigured from scratch (issue #12672).

The string is now rebuilt from the alias and TNS_ADMIN only, so every other
query parameter is dropped instead of forwarded. Validating the stored string
is not enough: the JDBC layer decodes each parameter name with URLDecoder and
trims it before comparing, so `?%70assword=`, `?+password=` and
`?password%20=` all read as `password` there. Rebuilding makes that
impossible by construction, and every non-TNS connection string (JDBC URLs,
DSNs, service-name strings) is still dropped along with the stored password.

Co-authored-by: dev <dev@local>
2026-10-20 10:10:25 +08:00
CSXFanMeng 20c5136a40 feat(query): 查询结果显示来源连接颜色 (#10823)
* feat(query): show source connection colors in results

* fix(query): omit absent result source connection metadata

* ci: retrigger checks after runner timeout

* fix(ci): increase heap budget for frontend type checking

* fix(ci): retry transient Windows installer bundling failures

* test(query): await lazy component imports before teardown

* test: adapt result color and CI coverage to latest main
2026-10-20 00:19:22 +08:00
lxk955 7ae993898b feat(completion): search tables and columns by comment in SQL editor (#12629)
* feat(completion): search tables and columns by comment in SQL editor (#12033)

* fix(test): extract itemHasHanText helper for standalone shouldBypassCompletionFilter eval
2026-10-20 00:05:10 +08:00
二丫讲梵 b1bdf20af4 feat(objects): customize compact browser card width (#12721) 2026-10-19 23:54:37 +08:00
CSXFanMeng 5c43ccaac5 test(settings): cover result tab click pinning behavior (#10824) 2026-10-19 23:47:04 +08:00
CristianandClaude Sonnet 5.5 41a5a9f59e fix(layout): sharper inner panel corners (#12600)
Workbench panels used a translucent 1px border on a small radius, which nearly
vanished against the same-coloured shell in dark themes and read as stray pixels
on the anti-aliased arc (most visible on Linux). Introduce .dbx-panel with the
radius one step above rounded-md (so the Corner style setting still applies) and
an opaque border in dark themes, and let the sidebar's inner overflow container
inherit the radius so its header no longer paints over the rounded corner.

Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-19 23:39:56 +08:00
lxk955 127cf84e1b fix(editor): highlight quoted SQL identifiers as identifiers instead of strings (#12122) (#12630) 2026-10-19 23:37:33 +08:00
HARRISON 5b6fbebe90 fix(grid): list go-to-column targets in the local column order (#11862)
The go-to-column lookup list was built from the database column order, so
after dragging column headers into a custom order the list disagreed with
the grid (and with the column filter panel, which already follows the
local order). Build it from orderedDisplayableColumnIndexes instead; the
item index carried by each entry is still the real column index, so the
jump target is unchanged.

Related #11845
2026-10-19 23:35:44 +08:00
ezreal 0b57de1de5 fix(settings): render locale flags consistently on Windows
使用本地 SVG 让 Windows 语言选择器稳定显示国旗。
2026-10-19 23:22:52 +08:00
Loc Nguyen 4586dcd44d fix(editor): keep table hover open while typing in its search box
保持表格悬浮搜索框在输入法组合期间可用。
2026-10-19 23:21:02 +08:00
zipg a438fdf21f fix(connection): 为各类连接表单补齐保存密码开关
补齐各类连接表单的保存密码开关。
2026-10-19 23:13:15 +08:00
zipg 5e52b722cd fix(sql): 补全 PostgreSQL MERGE 子句,修复格式化逐词换行
补全 PostgreSQL MERGE 格式化的子句识别。
2026-10-19 23:11:30 +08:00
zipg 04ba5f01e5 fix(editor): 快速开始页打开查询时带入默认 schema
修复快速开始页查询未带入连接默认 schema 的问题。
2026-10-19 23:09:44 +08:00
Zhaokang Jiang eb553eb2e5 fix(grid): start auto-refresh when selecting an interval
Start or restart data-grid auto-refresh when an interval is selected, with regression coverage for timer and menu state.
2026-10-19 22:11:25 +08:00
t8y2 65a3e24aed style(transfer): apply cargo fmt and oxfmt to column case changes 2026-10-19 21:15:36 +08:00
t8y2 7fdf162838 feat(transfer): add uppercase column names option
Closes #12741
2026-10-19 20:51:41 +08:00
zipgandzipg b81f18e4f5 fix(tabs): 未分组横版标签保留用户配置的连接底色 (#12756)
Co-authored-by: zipg <4047349+zipg@users.noreply.github.com>
2026-10-19 20:01:39 +08:00
lxk955andzipg e327f5f6de fix(sql): use inclusive end columns
Co-authored-by: zipg <zipg@users.noreply.github.com>
2026-10-19 19:32:32 +08:00
b3e9c5c20c fix(connection): 支持 Redis TLS CA 与客户端证书 (#12598)
* fix(connection): 支持 Redis TLS CA 与客户端证书

* chore(i18n): autofill new translations

* chore: re-run CI after i18n autofill

* refactor(redis): 装箱集群 TLS 证书配置以通过 clippy

---------

Co-authored-by: zipg <4047349+zipg@users.noreply.github.com>
Co-authored-by: dbx-i18n-bot <github-actions[bot]@users.noreply.github.com>
2026-10-19 18:58:42 +08:00
HARRISON 70f1834655 fix(ui): 斜滑经过相邻项时不再抢走已展开的二级菜单 (#12739)
上一版的「安全三角」只保护了关闭:指针离开触发项后仍在三角内就不会
关闭子菜单。但指针斜向滑向子菜单时必然经过相邻的一级项,而
onItemMouseEnter 一旦命中相邻项就立即切换子菜单,三角并未参与这个决
策——于是上下两项都有二级菜单时,指针先滑到下一栏,子菜单瞬间换成下
一栏的。经过无二级菜单的项时同样会立即关闭。

改动:
- CustomContextMenu.vue 增加 syncSubmenu(),作为「哪一行拥有二级菜单」
  的唯一决策点,由行 hover、行 leave、document pointermove 统一驱动,
  指针在行进途中就被持续重新评估,而不是只在穿过行边界的那一刻决定。
- 指针在「已展开子菜单」的安全三角内(或已在子菜单里)时,经过的行不
  得接管子菜单;离开三角后若停在另一行上,需停留 300ms 才交接,慢速滑
  过不会误切。
- 三角仍然只在离开某一级项时构建,行为与上一版一致。

验证:
- 新增 3 个回归用例(斜滑经过带子菜单的相邻行 / 经过无子菜单的行 /
  停在相邻行后交接)。回退 CustomContextMenu.vue 到 origin/main 后 3 个
  用例全部 FAIL,说明用例命中真实缺陷。
- 全量 vitest:1871 files / 24493 tests 通过;vue-tsc、oxlint、oxfmt 通过。
- 未做真机手感验证(happy-dom 无布局,指针轨迹为按真实事件顺序派发)。
2026-10-19 18:49:59 +08:00
e42f3d7307 fix(plugins): keep the sidebar shortcut list visible beside the endpoint row (#12604)
Generated with [Devin](https://devin.ai)

Co-authored-by: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Co-authored-by: zipg <4047349+zipg@users.noreply.github.com>
2026-10-19 18:15:50 +08:00
Xsyl.way a18bae6672 fix(import): preserve current timestamp expressions in sql imports 2026-10-19 18:04:44 +08:00
Lan-zk c7c266c309 perf(search): batch column fetch and multi-table probe 2026-10-19 15:17:58 +08:00