mirror of
https://github.com/t8y2/dbx.git
synced 2026-10-24 01:01:37 +00:00
* fix(structure-editor): disable table comment input for databases that don't support comments (e.g. SQLite) ## 背景说明 SQLite 不支持表注释(COMMENT),但表注释输入框始终可编辑。用户修改注释后,SQL 预览显示暂无变更且应用变更按钮不可用,造成困惑的 UX。 ## 修改内容 - 新增 isTableCommentDisabled 计算属性,基于 structureCapabilities.comment 控制禁用状态 - 表注释 Input 添加 :disabled 绑定,禁用时输入框变灰不可编辑 - 禁用时在输入框右侧显示 Info 图标,hover 显示 Tooltip 说明 - 三语言(zh-CN / en / es)新增 tableCommentUnsupported 翻译 ## 影响范围 - SQLite、DuckDB 及未知数据库类型:输入框被禁用 + Tooltip 提示 - MySQL、PostgreSQL、ClickHouse 等支持注释的数据库:完全不受影响 - 后端 generate_comment_ddl 已有对等过滤(仅 Postgres/Oracle/ClickHouse 生成 COMMENT SQL) ## 测试 - 建议补充:dbType 为 sqlite 时 isTableCommentDisabled 为 true 的单元测试 * test(structure-editor): add tests for table comment disabled state and unsupported DB capabilities
105 lines
4.8 KiB
TypeScript
105 lines
4.8 KiB
TypeScript
import assert from "node:assert/strict";
|
|
import test from "node:test";
|
|
import {
|
|
canEditTableStructure,
|
|
getTableStructureCapabilities,
|
|
} from "../../apps/desktop/src/lib/tableStructureCapabilities.ts";
|
|
|
|
test("sqlite and duckdb do not support table comments", () => {
|
|
for (const dbType of ["sqlite", "duckdb"] as const) {
|
|
const caps = getTableStructureCapabilities(dbType);
|
|
assert.equal(caps.comment, false, `${dbType} should not support comments`);
|
|
assert.equal(caps.createTable, true, `${dbType} should still support creating tables`);
|
|
}
|
|
});
|
|
|
|
test("postgres-like databases expose safe structure editing capabilities", () => {
|
|
for (const dbType of ["postgres", "gaussdb", "opengauss", "highgo", "vastbase", "kingbase"] as const) {
|
|
const caps = getTableStructureCapabilities(dbType);
|
|
assert.equal(caps.dialect, "postgres", `${dbType} should reuse postgres DDL`);
|
|
assert.equal(caps.createTable, true, `${dbType} should create tables`);
|
|
assert.equal(caps.addColumn, true, `${dbType} should add columns`);
|
|
assert.equal(caps.dropColumn, true, `${dbType} should drop columns`);
|
|
assert.equal(caps.renameColumn, true, `${dbType} should rename columns`);
|
|
assert.equal(caps.alterExistingColumn, true, `${dbType} should edit existing columns`);
|
|
assert.equal(caps.comment, true, `${dbType} should support comments`);
|
|
assert.equal(caps.createIndex, true, `${dbType} should create indexes`);
|
|
assert.equal(caps.dropIndex, true, `${dbType} should drop indexes`);
|
|
assert.equal(caps.rebuildIndex, true, `${dbType} should rebuild indexes`);
|
|
assert.equal(caps.indexFilter, true, `${dbType} should support filtered indexes`);
|
|
assert.equal(canEditTableStructure(dbType), true);
|
|
}
|
|
});
|
|
|
|
test("mysql-like databases expose index rebuild and type capabilities", () => {
|
|
for (const dbType of ["mysql", "doris", "starrocks", "goldendb", "sundb"] as const) {
|
|
const caps = getTableStructureCapabilities(dbType);
|
|
assert.equal(caps.dialect, "mysql", `${dbType} should reuse mysql DDL`);
|
|
assert.equal(caps.createIndex, true);
|
|
assert.equal(caps.dropIndex, true);
|
|
assert.equal(caps.rebuildIndex, true);
|
|
assert.equal(caps.indexType, true);
|
|
assert.equal(caps.reorderColumn, true);
|
|
assert.equal(canEditTableStructure(dbType), true);
|
|
}
|
|
});
|
|
|
|
test("redshift reuses postgres column DDL but keeps indexes disabled", () => {
|
|
const caps = getTableStructureCapabilities("redshift");
|
|
assert.equal(caps.dialect, "postgres");
|
|
assert.equal(caps.createTable, true);
|
|
assert.equal(caps.addColumn, true);
|
|
assert.equal(caps.dropColumn, true);
|
|
assert.equal(caps.renameColumn, true);
|
|
assert.equal(caps.alterExistingColumn, true);
|
|
assert.equal(caps.comment, true);
|
|
assert.equal(caps.createIndex, false);
|
|
assert.equal(caps.dropIndex, false);
|
|
assert.equal(caps.rebuildIndex, false);
|
|
assert.equal(caps.indexFilter, false);
|
|
assert.equal(canEditTableStructure("redshift"), true);
|
|
});
|
|
|
|
test("oracle-like databases expose oracle-compatible structure editing capabilities", () => {
|
|
for (const dbType of ["oracle", "dameng", "oceanbase-oracle"] as const) {
|
|
const caps = getTableStructureCapabilities(dbType);
|
|
assert.equal(caps.dialect, "oracle", `${dbType} should reuse oracle DDL`);
|
|
assert.equal(caps.createTable, true);
|
|
assert.equal(caps.addColumn, true);
|
|
assert.equal(caps.dropColumn, true);
|
|
assert.equal(caps.renameColumn, true);
|
|
assert.equal(caps.alterExistingColumn, true);
|
|
assert.equal(caps.comment, true);
|
|
assert.equal(caps.createIndex, true);
|
|
assert.equal(caps.dropIndex, true);
|
|
assert.equal(caps.rebuildIndex, true);
|
|
assert.equal(canEditTableStructure(dbType), true);
|
|
}
|
|
});
|
|
|
|
test("limited analytic engines can open the editor for supported operations only", () => {
|
|
const clickhouse = getTableStructureCapabilities("clickhouse");
|
|
assert.equal(clickhouse.dialect, "clickhouse");
|
|
assert.equal(clickhouse.createTable, true);
|
|
assert.equal(clickhouse.addColumn, true);
|
|
assert.equal(clickhouse.dropColumn, true);
|
|
assert.equal(clickhouse.renameColumn, true);
|
|
assert.equal(clickhouse.alterExistingColumn, true);
|
|
assert.equal(clickhouse.alterType, true);
|
|
assert.equal(clickhouse.alterNullability, true);
|
|
assert.equal(clickhouse.alterDefault, true);
|
|
assert.equal(clickhouse.reorderColumn, true);
|
|
assert.equal(clickhouse.comment, true);
|
|
assert.equal(clickhouse.createIndex, false);
|
|
assert.equal(clickhouse.rebuildIndex, false);
|
|
assert.equal(canEditTableStructure("clickhouse"), true);
|
|
});
|
|
|
|
test("unsupported non-relational databases do not open the structure editor", () => {
|
|
for (const dbType of ["redis", "mongodb", "elasticsearch", "neo4j", undefined] as const) {
|
|
const caps = getTableStructureCapabilities(dbType);
|
|
assert.equal(caps.dialect, "unsupported");
|
|
assert.equal(canEditTableStructure(dbType), false);
|
|
}
|
|
});
|