feat(grid): copy column names using comments

This commit is contained in:
大峰 2026-07-31 16:23:56 +08:00 committed by GitHub
parent 24691ccb1e
commit c208fcdf60
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 15 additions and 5 deletions

View File

@ -9658,7 +9658,7 @@ const gridContextMenuItems = computed<ContextMenuItem[]>(() => {
<DataGridBulkEditDialog v-if="bulkEditDialogMounted" v-model:open="bulkEditDialogOpen" v-model:value="bulkEditValue" :selected-cell-count="selectedCellCount" @apply="applyBulkEditValue" />
<DataGridExtractorDialog v-model:open="extractorConfigOpen" :extractor="selectedCopyExtractor" :options="settingsStore.editorSettings.dataGridExtractorOptions" :items="extractorMenuItems" :preview="previewWithExtractor" @save="saveExtractorConfiguration" />
<DataGridCopyColumnNamesDialog v-if="copyColumnNamesDialogMounted" v-model:open="copyColumnNamesDialogOpen" :column-names="copyColumnNamesDialogColumns" :database-type="resolvedDatabaseType" @copy="copyText" />
<DataGridCopyColumnNamesDialog v-if="copyColumnNamesDialogMounted" v-model:open="copyColumnNamesDialogOpen" :column-names="copyColumnNamesDialogColumns" :database-type="resolvedDatabaseType" :column-comments="columnCommentMap" @copy="copyText" />
<Dialog v-model:open="generateIncrementDialogOpen">
<DialogContent class="sm:max-w-[380px]">

View File

@ -11,22 +11,25 @@ import type { DatabaseType } from "@/types/database";
const { t } = useI18n();
const open = defineModel<boolean>("open", { default: false });
const props = defineProps<{ columnNames: string[]; databaseType?: DatabaseType }>();
const props = defineProps<{ columnNames: string[]; databaseType?: DatabaseType; columnComments?: Map<string, string> }>();
const emit = defineEmits<{ copy: [text: string] }>();
const separator = ref<ColumnNameCopySeparator>(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() {
<Label class="shrink-0 text-sm" for="copy-column-names-quote">{{ t("grid.copyColumnNamesQuote") }}</Label>
<Switch id="copy-column-names-quote" v-model="quote" />
</div>
<div v-if="showCommentOption" class="flex items-center justify-between gap-3">
<Label class="shrink-0 text-sm" for="copy-column-names-comment">{{ t("grid.copyColumnNamesShowComment") }}</Label>
<Switch id="copy-column-names-comment" v-model="showByComment" />
</div>
<div class="space-y-1.5">
<Label class="text-sm">{{ t("grid.copyColumnNamesPreview") }}</Label>
<pre class="dbx-data-grid-value-font max-h-40 min-h-16 w-full overflow-auto whitespace-pre-wrap break-all rounded-[6px] border border-input bg-muted/30 px-2.5 py-1.5 text-xs" data-copy-column-names-preview>{{ previewText }}</pre>

View File

@ -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}",

View File

@ -1092,6 +1092,7 @@ export default withEnglishFallback({
copyColumnNamesTitle: "复制列名({count} 列)",
copyColumnNamesSeparator: "列分隔符",
copyColumnNamesQuote: "转义列名",
copyColumnNamesShowComment: "按注释显示",
copyColumnNamesPreview: "预览",
copyAll: "复制全部 (TSV)",
selectionSum: "SUM: {value}",

View File

@ -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, string> }): 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]);
}