diff --git a/extensions/azurecore/src/azureDataGridProvider.ts b/extensions/azurecore/src/azureDataGridProvider.ts index b0be08633a..f8d8548996 100644 --- a/extensions/azurecore/src/azureDataGridProvider.ts +++ b/extensions/azurecore/src/azureDataGridProvider.ts @@ -28,6 +28,8 @@ export class AzureDataGridProvider implements azdata.DataGridProvider { constructor(private _appContext: AppContext) { } public providerId = constants.dataGridProviderId; + public title = loc.azureResourcesGridTitle; + public async getDataGridItems() { const accounts = await azdata.accounts.getAllAccounts(); const items: any[] = []; diff --git a/extensions/azurecore/src/localizedConstants.ts b/extensions/azurecore/src/localizedConstants.ts index 62a7b26567..a78791dda2 100644 --- a/extensions/azurecore/src/localizedConstants.ts +++ b/extensions/azurecore/src/localizedConstants.ts @@ -73,3 +73,4 @@ export const sqlServerArc = localize('azurecore.sqlServerArc', "SQL Server - Azu export const azureArcPostgresServer = localize('azurecore.azureArcPostgres', "Azure Arc enabled PostgreSQL Hyperscale"); export const unableToOpenAzureLink = localize('azure.unableToOpenAzureLink', "Unable to open link, missing required values"); +export const azureResourcesGridTitle = localize('azure.azureResourcesGridTitle', "Azure Resources"); diff --git a/src/sql/azdata.proposed.d.ts b/src/sql/azdata.proposed.d.ts index ece1401817..1f11aa65dd 100644 --- a/src/sql/azdata.proposed.d.ts +++ b/src/sql/azdata.proposed.d.ts @@ -257,6 +257,11 @@ declare module 'azdata' { * Gets the list of data grid columns for this provider */ getDataGridColumns(): Thenable; + + /** + * The user visible string to use for the title of the grid + */ + title: string; } export interface HyperlinkComponent { diff --git a/src/sql/workbench/api/browser/mainThreadDataProtocol.ts b/src/sql/workbench/api/browser/mainThreadDataProtocol.ts index 5b66692142..fa35b43b91 100644 --- a/src/sql/workbench/api/browser/mainThreadDataProtocol.ts +++ b/src/sql/workbench/api/browser/mainThreadDataProtocol.ts @@ -29,6 +29,8 @@ import { assign } from 'vs/base/common/objects'; import { serializableToMap } from 'sql/base/common/map'; import { IAssessmentService } from 'sql/workbench/services/assessment/common/interfaces'; import { IDataGridProviderService } from 'sql/workbench/services/dataGridProvider/common/dataGridProviderService'; +import { IAdsTelemetryService } from 'sql/platform/telemetry/common/telemetry'; +import * as TelemetryKeys from 'sql/platform/telemetry/common/telemetryKeys'; /** * Main thread class for handling data protocol management registration. @@ -57,7 +59,8 @@ export class MainThreadDataProtocol extends Disposable implements MainThreadData @ISerializationService private _serializationService: ISerializationService, @IFileBrowserService private _fileBrowserService: IFileBrowserService, @IAssessmentService private _assessmentService: IAssessmentService, - @IDataGridProviderService private _dataGridProviderService: IDataGridProviderService + @IDataGridProviderService private _dataGridProviderService: IDataGridProviderService, + @IAdsTelemetryService private _telemetryService: IAdsTelemetryService ) { super(); if (extHostContext) { @@ -469,14 +472,23 @@ export class MainThreadDataProtocol extends Disposable implements MainThreadData return undefined; } - public $registerDataGridProvider(providerId: string, handle: number): void { + public $registerDataGridProvider(providerId: string, title: string, handle: number): void { const self = this; this._dataGridProviderService.registerProvider(providerId, { providerId: providerId, + title: title, getDataGridItems(): Thenable { + self._telemetryService.createActionEvent(TelemetryKeys.TelemetryView.Shell, TelemetryKeys.GetDataGridItems) + .withAdditionalProperties({ + provider: providerId + }).send(); return self._proxy.$getDataGridItems(handle); }, getDataGridColumns(): Thenable { + self._telemetryService.createActionEvent(TelemetryKeys.TelemetryView.Shell, TelemetryKeys.GetDataGridColumns) + .withAdditionalProperties({ + provider: providerId + }).send(); return self._proxy.$getDataGridColumns(handle); } }); diff --git a/src/sql/workbench/api/common/extHostDataProtocol.ts b/src/sql/workbench/api/common/extHostDataProtocol.ts index f787c1d461..c74d2e6821 100644 --- a/src/sql/workbench/api/common/extHostDataProtocol.ts +++ b/src/sql/workbench/api/common/extHostDataProtocol.ts @@ -174,7 +174,7 @@ export class ExtHostDataProtocol extends ExtHostDataProtocolShape { } $registerDataGridProvider(provider: azdata.DataGridProvider): vscode.Disposable { let rt = this.registerProvider(provider, DataProviderType.DataGridProvider); - this._proxy.$registerDataGridProvider(provider.providerId, provider.handle); + this._proxy.$registerDataGridProvider(provider.providerId, provider.title, provider.handle); return rt; } $registerCapabilitiesServiceProvider(provider: azdata.CapabilitiesProvider): vscode.Disposable { diff --git a/src/sql/workbench/api/common/sqlExtHost.protocol.ts b/src/sql/workbench/api/common/sqlExtHost.protocol.ts index 1f277e7442..359223c584 100644 --- a/src/sql/workbench/api/common/sqlExtHost.protocol.ts +++ b/src/sql/workbench/api/common/sqlExtHost.protocol.ts @@ -583,7 +583,7 @@ export interface MainThreadDataProtocolShape extends IDisposable { $registerAgentServicesProvider(providerId: string, handle: number): Promise; $registerSerializationProvider(providerId: string, handle: number): Promise; $registerSqlAssessmentServicesProvider(providerId: string, handle: number): Promise; - $registerDataGridProvider(providerId: string, handle: number): void; + $registerDataGridProvider(providerId: string, title: string, handle: number): void; $unregisterProvider(handle: number): Promise; $onConnectionComplete(handle: number, connectionInfoSummary: azdata.ConnectionInfoSummary): void; $onIntelliSenseCacheComplete(handle: number, connectionUri: string): void; diff --git a/src/sql/workbench/browser/editor/resourceViewer/resourceViewerInput.ts b/src/sql/workbench/browser/editor/resourceViewer/resourceViewerInput.ts index f5704ad5d8..17de50de9d 100644 --- a/src/sql/workbench/browser/editor/resourceViewer/resourceViewerInput.ts +++ b/src/sql/workbench/browser/editor/resourceViewer/resourceViewerInput.ts @@ -8,7 +8,7 @@ import * as nls from 'vs/nls'; import { EditorInput } from 'vs/workbench/common/editor'; import { Event, Emitter } from 'vs/base/common/event'; import { URI } from 'vs/base/common/uri'; -import { IDataGridProviderService } from 'sql/workbench/services/dataGridProvider/common/dataGridProviderService'; +import { DataGridProvider, IDataGridProviderService } from 'sql/workbench/services/dataGridProvider/common/dataGridProviderService'; import { onUnexpectedError } from 'vs/base/common/errors'; import { ButtonColumn } from 'sql/base/browser/ui/table/plugins/buttonColumn.plugin'; import { getDataGridFormatter } from 'sql/workbench/services/dataGridProvider/browser/dataGridProviderUtils'; @@ -23,6 +23,8 @@ export interface ColumnDefinition extends Slick.Column { export class ResourceViewerInput extends EditorInput { public static ID: string = 'workbench.editorInput.resourceViewerInput'; + + private _dataGridProvider: DataGridProvider; private _data: azdata.DataGridItem[] = []; private _columns: ColumnDefinition[] = []; private _loading: boolean = true; @@ -36,8 +38,9 @@ export class ResourceViewerInput extends EditorInput { public onDataChanged: Event = this._onDataChanged.event; constructor(private _providerId: string, - @IDataGridProviderService private _dataGridProviderService: IDataGridProviderService) { + @IDataGridProviderService dataGridProviderService: IDataGridProviderService) { super(); + this._dataGridProvider = dataGridProviderService.getDataGridProvider(this._providerId); this.actionsColumn = new ButtonColumn({ id: 'actions', iconCssClass: 'toggle-more', @@ -52,7 +55,7 @@ export class ResourceViewerInput extends EditorInput { } public getName(): string { - return nls.localize('resourceViewerInput.resourceViewer', "Resource Viewer"); + return this._dataGridProvider.title || nls.localize('resourceViewerInput.resourceViewer', "Resource Viewer"); } public get data(): azdata.DataGridItem[] { @@ -95,8 +98,12 @@ export class ResourceViewerInput extends EditorInput { return this._loading; } + public get title(): string { + return this._dataGridProvider.title; + } + private async fetchColumns(): Promise { - const columns = await this._dataGridProviderService.getDataGridColumns(this._providerId); + const columns = await this._dataGridProvider.getDataGridColumns(); const columnDefinitions: ColumnDefinition[] = columns.map(col => { return { name: col.name, @@ -119,7 +126,7 @@ export class ResourceViewerInput extends EditorInput { } private async fetchItems(): Promise { - const items = await this._dataGridProviderService.getDataGridItems(this._providerId); + const items = await this._dataGridProvider.getDataGridItems(); this._data = items; this._onDataChanged.fire(); } diff --git a/src/sql/workbench/contrib/resourceViewer/browser/resourceViewerEditor.ts b/src/sql/workbench/contrib/resourceViewer/browser/resourceViewerEditor.ts index b4ace95680..1ab53b0686 100644 --- a/src/sql/workbench/contrib/resourceViewer/browser/resourceViewerEditor.ts +++ b/src/sql/workbench/contrib/resourceViewer/browser/resourceViewerEditor.ts @@ -94,6 +94,8 @@ export class ResourceViewerEditor extends EditorPane { async setInput(input: ResourceViewerInput, options: EditorOptions | undefined, context: IEditorOpenContext, token: CancellationToken): Promise { await super.setInput(input, options, context, token); + this._resourceViewerTable.title = input.title; + this._inputDisposables.clear(); input.plugins.forEach(plugin => { diff --git a/src/sql/workbench/contrib/resourceViewer/browser/resourceViewerTable.ts b/src/sql/workbench/contrib/resourceViewer/browser/resourceViewerTable.ts index 830d259a77..8a19738525 100644 --- a/src/sql/workbench/contrib/resourceViewer/browser/resourceViewerTable.ts +++ b/src/sql/workbench/contrib/resourceViewer/browser/resourceViewerTable.ts @@ -52,6 +52,7 @@ export class ResourceViewerTable extends Disposable { dataItemColumnValueExtractor: dataGridColumnValueExtractor, forceFitColumns: true })); + this._resourceViewerTable.setSelectionModel(new RowSelectionModel()); let filterPlugin = new HeaderFilter(); this._register(attachButtonStyler(filterPlugin, this._themeService)); @@ -100,6 +101,10 @@ export class ResourceViewerTable extends Disposable { this._loadingSpinnerPlugin.loading = isLoading; } + public set title(title: string) { + this._resourceViewerTable.setTableTitle(title); + } + public registerPlugin(plugin: Slick.Plugin): void { this._resourceViewerTable.registerPlugin(plugin); } diff --git a/src/sql/workbench/services/dataGridProvider/browser/dataGridProviderService.ts b/src/sql/workbench/services/dataGridProvider/browser/dataGridProviderService.ts index 2bce918735..a2a78984da 100644 --- a/src/sql/workbench/services/dataGridProvider/browser/dataGridProviderService.ts +++ b/src/sql/workbench/services/dataGridProvider/browser/dataGridProviderService.ts @@ -4,20 +4,14 @@ *--------------------------------------------------------------------------------------------*/ import * as azdata from 'azdata'; -import { IAdsTelemetryService } from 'sql/platform/telemetry/common/telemetry'; -import { IDataGridProviderService } from 'sql/workbench/services/dataGridProvider/common/dataGridProviderService'; +import { DataGridProvider, IDataGridProviderService } from 'sql/workbench/services/dataGridProvider/common/dataGridProviderService'; import { invalidProvider } from 'sql/base/common/errors'; -import * as TelemetryKeys from 'sql/platform/telemetry/common/telemetryKeys'; export class DataGridProviderService implements IDataGridProviderService { public _serviceBrand: undefined; private _providers = new Map(); - constructor( - @IAdsTelemetryService private _telemetryService: IAdsTelemetryService - ) { } - /** * Register a data grid provider */ @@ -32,26 +26,10 @@ export class DataGridProviderService implements IDataGridProviderService { this._providers.delete(providerId); } - public async getDataGridItems(providerId: string): Promise { + public getDataGridProvider(providerId: string): DataGridProvider { const provider = this._providers.get(providerId); if (provider) { - this._telemetryService.createActionEvent(TelemetryKeys.TelemetryView.Shell, TelemetryKeys.GetDataGridItems) - .withAdditionalProperties({ - provider: providerId - }).send(); - return provider.getDataGridItems(); - } - throw invalidProvider(providerId); - } - - public async getDataGridColumns(providerId: string): Promise { - const provider = this._providers.get(providerId); - if (provider) { - this._telemetryService.createActionEvent(TelemetryKeys.TelemetryView.Shell, TelemetryKeys.GetDataGridColumns) - .withAdditionalProperties({ - provider: providerId - }).send(); - return provider.getDataGridColumns(); + return provider; } throw invalidProvider(providerId); } diff --git a/src/sql/workbench/services/dataGridProvider/common/dataGridProviderService.ts b/src/sql/workbench/services/dataGridProvider/common/dataGridProviderService.ts index f129b02260..2694f3a77b 100644 --- a/src/sql/workbench/services/dataGridProvider/common/dataGridProviderService.ts +++ b/src/sql/workbench/services/dataGridProvider/common/dataGridProviderService.ts @@ -9,6 +9,8 @@ import { createDecorator } from 'vs/platform/instantiation/common/instantiation' export const SERVICE_ID = 'dataGridProviderService'; export const IDataGridProviderService = createDecorator(SERVICE_ID); +export interface DataGridProvider extends azdata.DataGridProvider { } + export interface IDataGridProviderService { _serviceBrand: undefined; @@ -23,12 +25,9 @@ export interface IDataGridProviderService { unregisterProvider(providerId: string): void; /** - * Gets a list of data grid items from the specified provider + * Gets a registered data grid provider, throwing if none are registered with the specified ID + * @param providerId The id of the registered provider */ - getDataGridItems(providerId: string): Promise; + getDataGridProvider(providerId: string): DataGridProvider; - /** - * Gets a list of data grid columns from the specified provider - */ - getDataGridColumns(providerId: string): Promise; }