From 51dedaa5b7ba9ee8f14305ba8a6f2282052868c3 Mon Sep 17 00:00:00 2001 From: zipg Date: Wed, 5 Aug 2026 23:57:30 +0800 Subject: [PATCH] =?UTF-8?q?fix(structure):=20=E5=85=81=E8=AE=B8=E6=B8=85?= =?UTF-8?q?=E9=99=A4=E5=B7=B2=E5=88=A0=E9=99=A4=E5=AD=97=E6=AE=B5=E7=9A=84?= =?UTF-8?q?=E7=B4=A2=E5=BC=95=E5=BC=95=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: zipg <4047349+zipg@users.noreply.github.com> --- .../components/structure/TableStructureEditor.vue | 14 +++++++------- .../src/lib/table/tableStructureEditorState.ts | 9 +++++++++ .../app-tests/tableStructureEditorState.test.ts | 7 +++++++ 3 files changed, 23 insertions(+), 7 deletions(-) diff --git a/apps/desktop/src/components/structure/TableStructureEditor.vue b/apps/desktop/src/components/structure/TableStructureEditor.vue index 682267259..a03dfbc14 100644 --- a/apps/desktop/src/components/structure/TableStructureEditor.vue +++ b/apps/desktop/src/components/structure/TableStructureEditor.vue @@ -55,6 +55,7 @@ import { dataTypeLengthInputValue, dataTypeLengthUnitValue, defaultNewColumnDataType, + filterStructureIndexColumnOptions, generateIndexName, generateUniqueIndexName, getColumnEditorControls, @@ -2108,11 +2109,10 @@ const availableColumnNames = computed(() => ); const colSearch = ref(""); -const filteredColumnNames = computed(() => { - const q = colSearch.value.toLowerCase().trim(); - if (!q) return availableColumnNames.value; - return availableColumnNames.value.filter((c) => c.toLowerCase().includes(q)); -}); + +function filteredIndexColumnNames(selectedColumns: readonly string[]): string[] { + return filterStructureIndexColumnOptions(availableColumnNames.value, selectedColumns, colSearch.value); +} function toggleIndexColumn(index: EditableStructureIndex, col: string) { const previousColumns = [...index.columns]; @@ -3163,7 +3163,7 @@ watch([activeTab, ddlLoading], ([tab, loading]) => {
- + {{ col }} @@ -3199,7 +3199,7 @@ watch([activeTab, ddlLoading], ([tab, loading]) => {
- + {{ col }} diff --git a/apps/desktop/src/lib/table/tableStructureEditorState.ts b/apps/desktop/src/lib/table/tableStructureEditorState.ts index 4df6cea0d..36b348f43 100644 --- a/apps/desktop/src/lib/table/tableStructureEditorState.ts +++ b/apps/desktop/src/lib/table/tableStructureEditorState.ts @@ -777,6 +777,15 @@ export function sameStructureIndexType(left: string | null | undefined, right: s return normalizeStructureIndexType(left) === normalizeStructureIndexType(right); } +/** Keep selected fields removable even after they are no longer available on the table. */ +export function filterStructureIndexColumnOptions(availableColumns: readonly string[], selectedColumns: readonly string[], search = ""): string[] { + const availableSet = new Set(availableColumns); + const unavailableSelected = selectedColumns.filter((column) => column.trim() && !availableSet.has(column)); + const options = [...new Set([...unavailableSelected, ...availableColumns])]; + const query = search.trim().toLowerCase(); + return query ? options.filter((column) => column.toLowerCase().includes(query)) : options; +} + export function createIndexDrafts(indexes: IndexInfo[]): EditableStructureIndex[] { return indexes.map((index) => ({ id: `existing:${index.name}`, diff --git a/packages/app-tests/tableStructureEditorState.test.ts b/packages/app-tests/tableStructureEditorState.test.ts index c6e2817e3..8e7983d65 100644 --- a/packages/app-tests/tableStructureEditorState.test.ts +++ b/packages/app-tests/tableStructureEditorState.test.ts @@ -9,6 +9,7 @@ import { createColumnDrafts, createIndexDrafts, dataTypeLengthInputValue, + filterStructureIndexColumnOptions, generateIndexName, generateUniqueIndexName, getColumnEditorControls, @@ -404,6 +405,12 @@ test("creates editable index drafts and splits pasted column lists", () => { assert.equal(toColumnNames(["id", "name"]), "id, name"); }); +test("keeps unavailable selected index fields removable", () => { + assert.deepEqual(filterStructureIndexColumnOptions(["id", "customer_id", "name"], ["platform_code"]), ["platform_code", "id", "customer_id", "name"]); + assert.deepEqual(filterStructureIndexColumnOptions(["id", "customer_id", "name"], ["customer_id", "platform_code"]), ["platform_code", "id", "customer_id", "name"]); + assert.deepEqual(filterStructureIndexColumnOptions(["id", "customer_id", "name"], ["platform_code"], "PLAT"), ["platform_code"]); +}); + test("normalizes Postgres lowercase index types when creating structure drafts", () => { const postgresIndexes: IndexInfo[] = [ {