From 16740ba61ff27d25b545e58b588d581eec6503cb Mon Sep 17 00:00:00 2001 From: Lewis Sanchez <87730006+lewis-sanchez@users.noreply.github.com> Date: Wed, 11 Jan 2023 09:17:05 -0800 Subject: [PATCH] Adds functionality to copy table column headers (#21564) * Adds functionality to copy table column headers * Minor clean up * Code review changes * Removes unneeded comma --- .../contrib/query/browser/actions.ts | 21 +++++++++++++++++++ .../contrib/query/browser/gridPanel.ts | 5 +++-- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/src/sql/workbench/contrib/query/browser/actions.ts b/src/sql/workbench/contrib/query/browser/actions.ts index c4609d8d44..1323620865 100644 --- a/src/sql/workbench/contrib/query/browser/actions.ts +++ b/src/sql/workbench/contrib/query/browser/actions.ts @@ -23,6 +23,7 @@ import { IConfigurationService } from 'vs/platform/configuration/common/configur import { IStorageService } from 'vs/platform/storage/common/storage'; import { getChartMaxRowCount, notifyMaxRowCountExceeded } from 'sql/workbench/contrib/charts/browser/utils'; import { IEncodingSupport } from 'vs/workbench/services/textfile/common/textfiles'; +import { IClipboardService } from 'vs/platform/clipboard/common/clipboardService'; export interface IGridActionContext { gridDataProvider: IGridDataProvider; @@ -122,6 +123,26 @@ export class CopyResultAction extends Action { } } +export class CopyHeadersAction extends Action { + private static ID = 'grid.copyHeaders'; + private static LABEL = localize('copyHeaders', 'Copy Headers'); + + constructor( + @IClipboardService private clipboardService: IClipboardService + ) { + super(CopyHeadersAction.ID, CopyHeadersAction.LABEL); + } + + public override async run(context: IGridActionContext): Promise { + // Starting at index 1 to ignore the first column of row numbers + const columnHeaders = context.table.columns.slice(1, context.table.columns.length) + .map(c => c.name ? c.name : '') + .join(','); + + await this.clipboardService.writeText(columnHeaders); + } +} + export class SelectAllGridAction extends Action { public static ID = 'grid.selectAll'; public static LABEL = localize('selectAll', "Select All"); diff --git a/src/sql/workbench/contrib/query/browser/gridPanel.ts b/src/sql/workbench/contrib/query/browser/gridPanel.ts index 44d6c1ca24..98365543a5 100644 --- a/src/sql/workbench/contrib/query/browser/gridPanel.ts +++ b/src/sql/workbench/contrib/query/browser/gridPanel.ts @@ -13,7 +13,7 @@ import { VirtualizedCollection } from 'sql/base/browser/ui/table/asyncDataView'; import { Table } from 'sql/base/browser/ui/table/table'; import { MouseWheelSupport } from 'sql/base/browser/ui/table/plugins/mousewheelTableScroll.plugin'; import { AutoColumnSize } from 'sql/base/browser/ui/table/plugins/autoSizeColumns.plugin'; -import { IGridActionContext, SaveResultAction, CopyResultAction, SelectAllGridAction, MaximizeTableAction, RestoreTableAction, ChartDataAction, VisualizerDataAction } from 'sql/workbench/contrib/query/browser/actions'; +import { IGridActionContext, SaveResultAction, CopyResultAction, SelectAllGridAction, MaximizeTableAction, RestoreTableAction, ChartDataAction, VisualizerDataAction, CopyHeadersAction } from 'sql/workbench/contrib/query/browser/actions'; import { CellSelectionModel } from 'sql/base/browser/ui/table/plugins/cellSelectionModel.plugin'; import { RowNumberColumn } from 'sql/base/browser/ui/table/plugins/rowNumberColumn.plugin'; import { escape } from 'sql/base/common/strings'; @@ -854,7 +854,8 @@ export abstract class GridTableBase extends Disposable implements IView { } actions.push( this.instantiationService.createInstance(CopyResultAction, CopyResultAction.COPY_ID, CopyResultAction.COPY_LABEL, false), - this.instantiationService.createInstance(CopyResultAction, CopyResultAction.COPYWITHHEADERS_ID, CopyResultAction.COPYWITHHEADERS_LABEL, true) + this.instantiationService.createInstance(CopyResultAction, CopyResultAction.COPYWITHHEADERS_ID, CopyResultAction.COPYWITHHEADERS_LABEL, true), + this.instantiationService.createInstance(CopyHeadersAction) ); if (this.state.canBeMaximized) {