Fix/disable table comment for unsupported db (#518)

* 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
This commit is contained in:
Abeautifulsnow 2026-05-29 12:29:50 +08:00 committed by GitHub
parent 5e6d94afff
commit 310cc22b37
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 29 additions and 0 deletions

View File

@ -12,6 +12,7 @@ import {
ChevronDown,
ChevronUp,
Database,
Info,
KeyRound,
Loader2,
Maximize2,
@ -28,6 +29,7 @@ import {
DropdownMenuTrigger,
} from "@/components/ui/dropdown-menu";
import { Popover, PopoverContent, PopoverTrigger } from "@/components/ui/popover";
import { Tooltip, TooltipContent, TooltipTrigger } from "@/components/ui/tooltip";
import { SearchableSelect } from "@/components/ui/searchable-select";
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select";
import { useConnectionStore } from "@/stores/connectionStore";
@ -134,6 +136,7 @@ function onIndexColResize(e: MouseEvent, col: number) {
const connection = computed(() => (props.connectionId ? store.getConfig(props.connectionId) : undefined));
const databaseType = computed(() => connection.value?.db_type);
const structureCapabilities = computed(() => getTableStructureCapabilities(databaseType.value));
const isTableCommentDisabled = computed(() => !structureCapabilities.value.comment);
const dataTypeOptions = computed(() => DATA_TYPE_OPTIONS[databaseType.value ?? ""] ?? []);
const indexTypesByDb: Record<string, string[]> = {
@ -509,7 +512,14 @@ watch(
v-model="tableComment"
:placeholder="t('structureEditor.tableCommentPlaceholder')"
class="h-6 max-w-[320px] text-[11px]"
:disabled="isTableCommentDisabled"
/>
<Tooltip v-if="isTableCommentDisabled">
<TooltipTrigger as-child>
<Info class="h-4 w-4 shrink-0 text-muted-foreground" />
</TooltipTrigger>
<TooltipContent>{{ t("structureEditor.tableCommentUnsupported") }}</TooltipContent>
</Tooltip>
</div>
<div v-if="loading" class="flex min-h-0 flex-1 items-center justify-center gap-2 text-sm text-muted-foreground">

View File

@ -989,6 +989,7 @@ export default {
editComment: "Edit comment",
commentPlaceholder: "Enter column comment...",
tableCommentPlaceholder: "Enter table comment...",
tableCommentUnsupported: "Table comments are not supported by this database",
actions: "Actions",
indexName: "Index",
indexColumns: "Columns",

View File

@ -883,6 +883,7 @@ export default {
editComment: "Editar comentario",
commentPlaceholder: "Ingresar comentario de columna...",
tableCommentPlaceholder: "Ingresar comentario de tabla...",
tableCommentUnsupported: "La base de datos no admite comentarios de tabla",
actions: "Acciones",
indexName: "Índice",
indexColumns: "Columnas",

View File

@ -967,6 +967,7 @@ export default {
editComment: "编辑注释",
commentPlaceholder: "输入字段注释...",
tableCommentPlaceholder: "输入表注释...",
tableCommentUnsupported: "当前数据库不支持表注释",
actions: "操作",
indexName: "索引名",
indexColumns: "字段列表",

View File

@ -5,6 +5,14 @@ import {
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);

View File

@ -80,3 +80,11 @@ test("new column input is focused after adding a field", () => {
assert.match(source, /data-column-name-input/);
assert.match(source, /input\?\.focus\(\)/);
});
test("table comment input is disabled and shows tooltip when database does not support comments", () => {
assert.match(source, /isTableCommentDisabled/);
assert.match(source, /:disabled="isTableCommentDisabled"/);
assert.match(source, /v-if="isTableCommentDisabled"/);
assert.match(source, /Tooltip/);
assert.match(source, /tableCommentUnsupported/);
});