From c208fcdf600d88887359956d7debee4e219464a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A4=A7=E5=B3=B0?= <67090734+tianyifeng-druid@users.noreply.github.com> Date: Fri, 31 Jul 2026 16:23:56 +0800 Subject: [PATCH] feat(grid): copy column names using comments --- apps/desktop/src/components/grid/DataGrid.vue | 2 +- .../components/grid/DataGridCopyColumnNamesDialog.vue | 11 +++++++++-- apps/desktop/src/i18n/locales/en.ts | 1 + apps/desktop/src/i18n/locales/zh-CN.ts | 1 + .../src/lib/dataGrid/dataGridColumnNameCopy.ts | 5 +++-- 5 files changed, 15 insertions(+), 5 deletions(-) diff --git a/apps/desktop/src/components/grid/DataGrid.vue b/apps/desktop/src/components/grid/DataGrid.vue index e7fe6e682..8b26fbb30 100644 --- a/apps/desktop/src/components/grid/DataGrid.vue +++ b/apps/desktop/src/components/grid/DataGrid.vue @@ -9658,7 +9658,7 @@ const gridContextMenuItems = computed(() => { - + diff --git a/apps/desktop/src/components/grid/DataGridCopyColumnNamesDialog.vue b/apps/desktop/src/components/grid/DataGridCopyColumnNamesDialog.vue index 901116edc..72fb427d2 100644 --- a/apps/desktop/src/components/grid/DataGridCopyColumnNamesDialog.vue +++ b/apps/desktop/src/components/grid/DataGridCopyColumnNamesDialog.vue @@ -11,22 +11,25 @@ import type { DatabaseType } from "@/types/database"; const { t } = useI18n(); const open = defineModel("open", { default: false }); -const props = defineProps<{ columnNames: string[]; databaseType?: DatabaseType }>(); +const props = defineProps<{ columnNames: string[]; databaseType?: DatabaseType; columnComments?: Map }>(); const emit = defineEmits<{ copy: [text: string] }>(); const separator = ref(loadColumnNameCopySeparator()); const quote = ref(false); +const showByComment = ref(false); // 每次打开时重新读取上次分隔符选择;转义选项每次默认关闭 watch(open, (value) => { if (!value) return; separator.value = loadColumnNameCopySeparator(); quote.value = false; + showByComment.value = false; }); const showQuoteOption = computed(() => supportsColumnNameQuoting(props.databaseType)); +const showCommentOption = computed(() => !!(props.columnComments && props.columnComments.size > 0)); -const previewText = computed(() => formatColumnNamesForCopy(props.columnNames, { separator: separator.value, quote: quote.value, databaseType: props.databaseType })); +const previewText = computed(() => formatColumnNamesForCopy(props.columnNames, { separator: separator.value, quote: quote.value, databaseType: props.databaseType, showByComment: showByComment.value, commentByColumn: props.columnComments })); function onSeparatorChange(value: unknown) { if (isColumnNameCopySeparator(value)) separator.value = value; @@ -61,6 +64,10 @@ function confirmCopy() { +
+ + +
{{ previewText }}
diff --git a/apps/desktop/src/i18n/locales/en.ts b/apps/desktop/src/i18n/locales/en.ts index 1e26c1f3e..bf161a93b 100644 --- a/apps/desktop/src/i18n/locales/en.ts +++ b/apps/desktop/src/i18n/locales/en.ts @@ -1091,6 +1091,7 @@ export default { copyColumnNamesTitle: "Copy Column Names ({count})", copyColumnNamesSeparator: "Column Separator", copyColumnNamesQuote: "Quote Column Names", + copyColumnNamesShowComment: "Show by Comment", copyColumnNamesPreview: "Preview", copyAll: "Copy All (TSV)", selectionSum: "SUM: {value}", diff --git a/apps/desktop/src/i18n/locales/zh-CN.ts b/apps/desktop/src/i18n/locales/zh-CN.ts index ca6651510..893ee2fa9 100644 --- a/apps/desktop/src/i18n/locales/zh-CN.ts +++ b/apps/desktop/src/i18n/locales/zh-CN.ts @@ -1092,6 +1092,7 @@ export default withEnglishFallback({ copyColumnNamesTitle: "复制列名({count} 列)", copyColumnNamesSeparator: "列分隔符", copyColumnNamesQuote: "转义列名", + copyColumnNamesShowComment: "按注释显示", copyColumnNamesPreview: "预览", copyAll: "复制全部 (TSV)", selectionSum: "SUM: {value}", diff --git a/apps/desktop/src/lib/dataGrid/dataGridColumnNameCopy.ts b/apps/desktop/src/lib/dataGrid/dataGridColumnNameCopy.ts index e211f0491..9717219e6 100644 --- a/apps/desktop/src/lib/dataGrid/dataGridColumnNameCopy.ts +++ b/apps/desktop/src/lib/dataGrid/dataGridColumnNameCopy.ts @@ -37,9 +37,10 @@ export function columnNamesForCopy(allColumnNames: readonly string[], visibleCol return [...(scope === "all" ? allColumnNames : visibleColumnNames)]; } -export function formatColumnNamesForCopy(names: readonly string[], options: { separator: ColumnNameCopySeparator; quote?: boolean; databaseType?: DatabaseType }): string { +export function formatColumnNamesForCopy(names: readonly string[], options: { separator: ColumnNameCopySeparator; quote?: boolean; databaseType?: DatabaseType; showByComment?: boolean; commentByColumn?: Map }): string { const quote = !!options.quote && supportsColumnNameQuoting(options.databaseType); - const parts = quote ? names.map((name) => quoteTableIdentifier(options.databaseType, name)) : [...names]; + const displayNames = options.showByComment && options.commentByColumn ? names.map((name) => options.commentByColumn!.get(name) || name) : [...names]; + const parts = quote ? displayNames.map((name) => quoteTableIdentifier(options.databaseType, name)) : displayNames; return parts.join(COLUMN_NAME_COPY_SEPARATOR_VALUES[options.separator]); }