From 31ac8d6acc791622a98fe2771492e449f8923047 Mon Sep 17 00:00:00 2001 From: Anthony Dresser Date: Wed, 2 May 2018 10:16:05 -0700 Subject: [PATCH] Trim server name (#1308) * add warning for trimming of the servername and trim the servername before connection * move the location of the trim * move it back to simplify tests --- .../connectionDialogService.ts | 6 +++- .../connectionDialog/connectionWidget.ts | 31 ++++++++++++------- src/vs/base/browser/ui/inputbox/inputBox.ts | 3 +- 3 files changed, 27 insertions(+), 13 deletions(-) diff --git a/src/sql/parts/connection/connectionDialog/connectionDialogService.ts b/src/sql/parts/connection/connectionDialog/connectionDialogService.ts index 728107292a..81fb1e2697 100644 --- a/src/sql/parts/connection/connectionDialog/connectionDialogService.ts +++ b/src/sql/parts/connection/connectionDialog/connectionDialogService.ts @@ -17,6 +17,7 @@ import { IConnectionProfile } from 'sql/parts/connection/common/interfaces'; import { ICapabilitiesService } from 'sql/services/capabilities/capabilitiesService'; import { ConnectionProfile } from 'sql/parts/connection/common/connectionProfile'; import { localize } from 'vs/nls'; +import { entries } from 'sql/base/common/objects'; import * as sqlops from 'sqlops'; @@ -32,7 +33,7 @@ import { IWindowsService } from 'vs/platform/windows/common/windows'; import { IClipboardService } from 'vs/platform/clipboard/common/clipboardService'; import { ICommandService } from 'vs/platform/commands/common/commands'; import * as types from 'vs/base/common/types'; -import { entries } from 'sql/base/common/objects'; +import { trim } from 'vs/base/common/strings'; export interface IConnectionValidateResult { isValid: boolean; @@ -108,6 +109,8 @@ export class ConnectionDialogService implements IConnectionDialogService { } profile = result.connection; + profile.serverName = trim(profile.serverName); + // append the port to the server name for SQL Server connections if (this.getCurrentProviderName() === Constants.mssqlProviderName) { let portPropertyName: string = 'port'; @@ -125,6 +128,7 @@ export class ConnectionDialogService implements IConnectionDialogService { this.handleDefaultOnConnect(params, profile); } else { + profile.serverName = trim(profile.serverName); this._connectionManagementService.addSavedPassword(profile).then(connectionWithPassword => { this.handleDefaultOnConnect(params, connectionWithPassword); }); diff --git a/src/sql/parts/connection/connectionDialog/connectionWidget.ts b/src/sql/parts/connection/connectionDialog/connectionWidget.ts index 6b05f13f69..4eb600b193 100644 --- a/src/sql/parts/connection/connectionDialog/connectionWidget.ts +++ b/src/sql/parts/connection/connectionDialog/connectionWidget.ts @@ -6,28 +6,32 @@ 'use strict'; import 'vs/css!./media/sqlConnection'; -import { Builder, $ } from 'vs/base/browser/builder'; + import { Button } from 'sql/base/browser/ui/button/button'; -import { MessageType } from 'vs/base/browser/ui/inputbox/inputBox'; 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/base/browser/ui/modal/dialogHelper'; import { IConnectionComponentCallbacks } from 'sql/parts/connection/connectionDialog/connectionDialogService'; -import * as lifecycle from 'vs/base/common/lifecycle'; import { IConnectionProfile } from 'sql/parts/connection/common/interfaces'; import { ConnectionOptionSpecialType } from 'sql/workbench/api/common/sqlExtHostTypes'; import * as Constants from 'sql/parts/connection/common/constants'; import { ConnectionProfileGroup, IConnectionProfileGroup } from 'sql/parts/connection/common/connectionProfileGroup'; -import { IThemeService } from 'vs/platform/theme/common/themeService'; -import * as styler from 'vs/platform/theme/common/styler'; import { attachInputBoxStyler, attachButtonStyler, attachEditableDropdownStyler } from 'sql/common/theme/styler'; -import * as DOM from 'vs/base/browser/dom'; +import { Dropdown } from 'sql/base/browser/ui/editableDropdown/dropdown'; + import * as sqlops from 'sqlops'; + +import * as lifecycle from 'vs/base/common/lifecycle'; 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 * as styler from 'vs/platform/theme/common/styler'; import { OS, OperatingSystem } from 'vs/base/common/platform'; -import { Dropdown } from 'sql/base/browser/ui/editableDropdown/dropdown'; +import { Builder, $ } from 'vs/base/browser/builder'; +import { MessageType } from 'vs/base/browser/ui/inputbox/inputBox'; +import { endsWith, startsWith } from 'vs/base/common/strings'; export class ConnectionWidget { private _builder: Builder; @@ -120,13 +124,18 @@ export class ConnectionWidget { } private fillInConnectionForm(): void { - let errorMessage = localize('connectionWidget.missingRequireField', ' is required.'); - let serverNameOption = this._optionsMaps[ConnectionOptionSpecialType.serverName]; let serverNameBuilder = DialogHelper.appendRow(this._tableContainer, serverNameOption.displayName, 'connection-label', 'connection-input'); this._serverNameInputBox = new InputBox(serverNameBuilder.getHTMLElement(), this._contextViewService, { validationOptions: { - validation: (value: string) => !value ? ({ type: MessageType.ERROR, content: serverNameOption.displayName + errorMessage }) : null + validation: (value: string) => { + if (!value) { + return ({ type: MessageType.ERROR, content: localize('connectionWidget.missingRequireField', '{0} is required.', serverNameOption.displayName)}); + } else if (startsWith(value, ' ') || endsWith(value, ' ')) { + return ({ type: MessageType.WARNING, content: localize('connectionWidget.fieldWillBeTrimmed', '{0} will be trimmed.', serverNameOption.displayName) }); + } + return undefined; + } }, ariaLabel: serverNameOption.displayName }); @@ -141,7 +150,7 @@ export class ConnectionWidget { let userNameBuilder = DialogHelper.appendRow(this._tableContainer, userNameOption.displayName, 'connection-label', 'connection-input'); this._userNameInputBox = new InputBox(userNameBuilder.getHTMLElement(), this._contextViewService, { validationOptions: { - validation: (value: string) => self.validateUsername(value, userNameOption.isRequired) ? ({ type: MessageType.ERROR, content: userNameOption.displayName + errorMessage }) : null + validation: (value: string) => self.validateUsername(value, userNameOption.isRequired) ? ({ type: MessageType.ERROR, content: localize('connectionWidget.missingRequireField', '{0} is required.', userNameOption.displayName) }) : null }, ariaLabel: userNameOption.displayName }); diff --git a/src/vs/base/browser/ui/inputbox/inputBox.ts b/src/vs/base/browser/ui/inputbox/inputBox.ts index a4da7a0db5..20ee03ea99 100644 --- a/src/vs/base/browser/ui/inputbox/inputBox.ts +++ b/src/vs/base/browser/ui/inputbox/inputBox.ts @@ -364,7 +364,8 @@ export class InputBox extends Widget { } } - return !result; + // {{SQL CARBON EDIT}} Canidate for addition to vscode + return result ? result.type !== MessageType.ERROR : true; } private stylesForType(type: MessageType): { border: Color; background: Color } {