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:
parent
5e6d94afff
commit
310cc22b37
|
|
@ -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">
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -967,6 +967,7 @@ export default {
|
|||
editComment: "编辑注释",
|
||||
commentPlaceholder: "输入字段注释...",
|
||||
tableCommentPlaceholder: "输入表注释...",
|
||||
tableCommentUnsupported: "当前数据库不支持表注释",
|
||||
actions: "操作",
|
||||
indexName: "索引名",
|
||||
indexColumns: "字段列表",
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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/);
|
||||
});
|
||||
|
|
|
|||
Loading…
Reference in New Issue