CMS Extension - 2 (#4908)

* first set of changes to experiment the registration of cms related apis

* Adding cms service entry to workbench

* Adding basic functionality for add remove reg servers and group

* Returning relative path as part of RegServerResult as string

* initial extension

* cleaned building with connecting to server

* get list of registered servers

* progress with registered servers tree

* cms base node with server selection

* removed unused services

* replaced azure stuff with cms

* removed cmsResourceService

* list servers progress

* Removing the cms apis from core. Having mssql extension expose them for cms extension

* create server working fine

* initial expansion and nodes

* Propogating the backend name changes to apis

* initial cms extension working

* cached connection needs change in api

* connect without dashboard in proposed

* Fixing some missing sqlops references

* add registered server bug found

* added refresh context menu option

* added payload

* server description not disabled after reject connection

* added more context actions and action icons

* added empty resource and error when same name server is added

* fixed connection issues with cms and normal connections

* added initial tests

* added cms icons

* removed azure readme

* test script revert

* fix build tests

* added more cms tests

* fixed test script

* fixed silent error when expanding servers

* added more cms tests

* removed cmsdialog from api

* cms dialog without object

* fixed theming issues

* initial connection dialog done

* can make connections

* PM asks for strings and icons

* removed search

* removed unused code and fixed 1 test

* fix connection management tests

* changed icons

* format file

* fixed hygiene

* initial cr comments

* refactored cms connection dialog

* fixed bug when switching dialogs

* localized connection provider options

* fixed cms provider name

* code review comments

* localized options in cms and mssql

* localized more options
This commit is contained in:
Aditya Bist
2019-04-29 15:16:59 -07:00
committed by GitHub
parent cbf3ca726f
commit 39772c2dbe
60 changed files with 4595 additions and 156 deletions

View File

@@ -0,0 +1,164 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the Source EULA. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import 'vs/css!./media/sqlConnection';
import { Button } from 'sql/base/browser/ui/button/button';
import { SelectBox } from 'sql/base/browser/ui/selectBox/selectBox';
import { Checkbox } from 'sql/base/browser/ui/checkbox/checkbox';
import { InputBox } from 'sql/base/browser/ui/inputBox/inputBox';
import * as DialogHelper from 'sql/workbench/browser/modal/dialogHelper';
import { IConnectionComponentCallbacks } from 'sql/workbench/services/connection/browser/connectionDialogService';
import { IConnectionProfile } from 'sql/platform/connection/common/interfaces';
import { ConnectionOptionSpecialType } from 'sql/workbench/api/common/sqlExtHostTypes';
import * as Constants from 'sql/platform/connection/common/constants';
import { ConnectionProfileGroup, IConnectionProfileGroup } from 'sql/platform/connection/common/connectionProfileGroup';
import { Dropdown } from 'sql/base/browser/ui/editableDropdown/dropdown';
import { IConnectionManagementService } from 'sql/platform/connection/common/connectionManagement';
import { ICapabilitiesService } from 'sql/platform/capabilities/common/capabilitiesService';
import { ConnectionProfile } from 'sql/platform/connection/common/connectionProfile';
import * as styler from 'sql/platform/theme/common/styler';
import { IAccountManagementService } from 'sql/platform/accounts/common/interfaces';
import * as azdata from 'azdata';
import { IContextViewService } from 'vs/platform/contextview/browser/contextView';
import { localize } from 'vs/nls';
import * as DOM from 'vs/base/browser/dom';
import { IThemeService } from 'vs/platform/theme/common/themeService';
import { OS, OperatingSystem } from 'vs/base/common/platform';
import { IClipboardService } from 'vs/platform/clipboard/common/clipboardService';
import { IConfigurationService } from 'vs/platform/configuration/common/configuration';
import { ILayoutService } from 'vs/platform/layout/browser/layoutService';
import { ConnectionWidget, AuthenticationType } from 'sql/workbench/services/connection/browser/connectionWidget';
/**
* Connection Widget clas for CMS Connections
*/
export class CmsConnectionWidget extends ConnectionWidget {
private _serverDescriptionInputBox: InputBox;
protected _authTypeMap: { [providerName: string]: AuthenticationType[] } = {
[Constants.cmsProviderName]: [AuthenticationType.SqlLogin, AuthenticationType.Integrated, AuthenticationType.AzureMFA]
};
constructor(options: azdata.ConnectionOption[],
callbacks: IConnectionComponentCallbacks,
providerName: string,
authTypeChanged: boolean = false,
@IThemeService _themeService: IThemeService,
@IContextViewService _contextViewService: IContextViewService,
@ILayoutService _layoutService: ILayoutService,
@IConnectionManagementService _connectionManagementService: IConnectionManagementService,
@ICapabilitiesService _capabilitiesService: ICapabilitiesService,
@IClipboardService _clipboardService: IClipboardService,
@IConfigurationService _configurationService: IConfigurationService,
@IAccountManagementService _accountManagementService: IAccountManagementService
) {
super(options, callbacks, providerName, _themeService, _contextViewService, _layoutService, _connectionManagementService, _capabilitiesService,
_clipboardService, _configurationService, _accountManagementService);
let authTypeOption = this._optionsMaps[ConnectionOptionSpecialType.authType];
if (authTypeOption) {
if (OS === OperatingSystem.Windows || authTypeChanged) {
authTypeOption.defaultValue = this.getAuthTypeDisplayName(AuthenticationType.Integrated);
} else {
authTypeOption.defaultValue = this.getAuthTypeDisplayName(AuthenticationType.SqlLogin);
}
this._authTypeSelectBox = new SelectBox(authTypeOption.categoryValues.map(c => c.displayName), authTypeOption.defaultValue, this._contextViewService, undefined, { ariaLabel: authTypeOption.displayName });
}
}
protected registerListeners(): void {
super.registerListeners();
if (this._serverDescriptionInputBox) {
this._toDispose.push(styler.attachInputBoxStyler(this._serverDescriptionInputBox, this._themeService));
}
}
protected fillInConnectionForm(authTypeChanged: boolean = false): void {
// Server Name
this.addServerNameOption();
// Authentication type
this.addAuthenticationTypeOption(authTypeChanged);
// Login Options
this.addLoginOptions();
// Connection Name
this.addConnectionNameOptions();
// Server Description
this.addServerDescriptionOption();
// Advanced Options
this.addAdvancedOptions();
}
protected addAuthenticationTypeOption(authTypeChanged: boolean = false): void {
super.addAuthenticationTypeOption();
let authTypeOption = this._optionsMaps[ConnectionOptionSpecialType.authType];
let newAuthTypes = authTypeOption.categoryValues;
if (authTypeChanged) {
newAuthTypes = authTypeOption.categoryValues.filter((option) => option.name !== AuthenticationType.SqlLogin);
}
if (this._authTypeSelectBox) {
this._authTypeSelectBox.setOptions(newAuthTypes.map(c => c.displayName));
} else {
this._authTypeSelectBox = new SelectBox(newAuthTypes.map(c => c.displayName), authTypeOption.defaultValue, this._contextViewService, undefined, { ariaLabel: authTypeOption.displayName });
}
}
private addServerDescriptionOption(): void {
// Registered Server Description
let serverDescriptionOption = this._optionsMaps['serverDescription'];
if (serverDescriptionOption) {
serverDescriptionOption.displayName = localize('serverDescription', 'Server Description (optional)');
let serverDescriptionBuilder = DialogHelper.appendRow(this._tableContainer, serverDescriptionOption.displayName, 'connection-label', 'connection-input', 'server-description-input');
this._serverDescriptionInputBox = new InputBox(serverDescriptionBuilder, this._contextViewService, { type: 'textarea', flexibleHeight: true });
this._serverDescriptionInputBox.setHeight('75px');
}
}
public createConnectionWidget(container: HTMLElement, authTypeChanged: boolean = false): void {
this._container = DOM.append(container, DOM.$('div.connection-table'));
this._tableContainer = DOM.append(this._container, DOM.$('table.connection-table-content'));
this.fillInConnectionForm(authTypeChanged);
this.registerListeners();
if (this._authTypeSelectBox) {
this.onAuthTypeSelected(this._authTypeSelectBox.value);
}
DOM.addDisposableListener(container, 'paste', e => {
this._handleClipboard();
});
}
public handleOnConnecting(): void {
super.handleOnConnecting();
if (this._serverDescriptionInputBox) {
this._serverDescriptionInputBox.disable();
}
}
public handleResetConnection(): void {
super.handleResetConnection();
if (this._serverDescriptionInputBox) {
this._serverDescriptionInputBox.enable();
}
}
public get registeredServerDescription(): string {
return this._serverDescriptionInputBox.value;
}
public connect(model: IConnectionProfile): boolean {
let validInputs = super.connect(model);
if (this._serverDescriptionInputBox) {
model.options.registeredServerDescription = this._serverDescriptionInputBox.value;
model.options.registeredServerName = this._connectionNameInputBox.value;
}
return validInputs;
}
}