From a017e04d4cc0ee401ebe1f8991066c6629620513 Mon Sep 17 00:00:00 2001 From: t8y2 <1156263951@qq.com> Date: Thu, 11 Jun 2026 22:40:10 +0800 Subject: [PATCH] feat(structure): auto name new indexes --- .../structure/TableStructureEditor.vue | 39 ++++++++++++++++- .../src/lib/tableStructureEditorSql.ts | 1 + .../src/lib/tableStructureEditorState.ts | 43 +++++++++++++++++++ .../tableStructureEditorState.test.ts | 13 +++++- 4 files changed, 93 insertions(+), 3 deletions(-) diff --git a/apps/desktop/src/components/structure/TableStructureEditor.vue b/apps/desktop/src/components/structure/TableStructureEditor.vue index 34d0092fee..f2e399ecf0 100644 --- a/apps/desktop/src/components/structure/TableStructureEditor.vue +++ b/apps/desktop/src/components/structure/TableStructureEditor.vue @@ -25,7 +25,7 @@ import { type EditableStructureColumn, type EditableStructureIndex } from "@/lib import { getTableMetadataCapabilities } from "@/lib/tableMetadataCapabilities"; import { getTableStructureCapabilities } from "@/lib/tableStructureCapabilities"; import { connectionObjectTreeQuerySchema, effectiveDatabaseTypeForConnection } from "@/lib/jdbcDialect"; -import { buildStructureTargetLabel, combineDataTypeForDatabase, createColumnDrafts, createIndexDrafts, getDataTypeOptions, getDefaultLengthForType, splitDataType, toColumnNames } from "@/lib/tableStructureEditorState"; +import { buildStructureTargetLabel, combineDataTypeForDatabase, createColumnDrafts, createIndexDrafts, generateIndexName, generateUniqueIndexName, getDataTypeOptions, getDefaultLengthForType, splitDataType, toColumnNames } from "@/lib/tableStructureEditorState"; import type { ForeignKeyInfo, TriggerInfo } from "@/types/database"; import * as api from "@/lib/api"; @@ -482,6 +482,7 @@ function addIndex() { id: `new:${uuid()}`, name: "", columns: [], + nameEdited: false, isUnique: false, isPrimary: false, filter: "", @@ -500,6 +501,32 @@ function addIndex() { }); } +function structureIndexTableName(): string { + return (isCreateMode.value ? newTableName.value : props.tableName).trim(); +} + +function existingIndexNamesForDraft(index: EditableStructureIndex): string[] { + return indexes.value.filter((item) => item.id !== index.id && !item.markedForDrop).map((item) => item.name); +} + +function generatedIndexNameForDraft(index: EditableStructureIndex, columnsForName = index.columns): string { + return generateUniqueIndexName(structureIndexTableName(), columnsForName, existingIndexNamesForDraft(index)); +} + +function refreshAutoIndexName(index: EditableStructureIndex, previousColumns = index.columns) { + if (index.original || index.nameEdited) return; + const previousName = generateIndexName(structureIndexTableName(), previousColumns); + const previousUniqueName = generateUniqueIndexName(structureIndexTableName(), previousColumns, existingIndexNamesForDraft(index)); + const currentName = index.name.trim(); + if (currentName && currentName !== previousName && currentName !== previousUniqueName) return; + index.name = generatedIndexNameForDraft(index); +} + +function onIndexNameInput(index: EditableStructureIndex, value: string | number) { + index.name = String(value ?? ""); + index.nameEdited = true; +} + const availableColumnNames = computed(() => columns.value .filter((c) => !c.markedForDrop) @@ -515,9 +542,11 @@ const filteredColumnNames = computed(() => { }); function toggleIndexColumn(index: EditableStructureIndex, col: string) { + const previousColumns = [...index.columns]; const i = index.columns.indexOf(col); if (i >= 0) index.columns.splice(i, 1); else index.columns.push(col); + refreshAutoIndexName(index, previousColumns); } function toggleIncludedColumn(index: EditableStructureIndex, col: string) { @@ -699,6 +728,12 @@ watch( { deep: true, immediate: true }, ); +watch([() => props.tableName, newTableName], () => { + for (const index of indexes.value) { + refreshAutoIndexName(index); + } +}); + watch(refreshVersion, (version, previous) => { if (version === previous || !version || isCreateMode.value) return; void loadStructure(true); @@ -1019,7 +1054,7 @@ watch(activeTab, (tab) => {