diff --git a/extensions/sql-database-projects/src/common/constants.ts b/extensions/sql-database-projects/src/common/constants.ts index d6a1a51f5d..4bc4e45bd3 100644 --- a/extensions/sql-database-projects/src/common/constants.ts +++ b/extensions/sql-database-projects/src/common/constants.ts @@ -142,7 +142,7 @@ export const profileReadError = (err: any) => localize('profileReadError', "Erro export const sqlCmdVariables = localize('sqlCmdTableLabel', "SQLCMD Variables"); export const sqlCmdVariableColumn = localize('sqlCmdVariableColumn', "Name"); export const sqlCmdValueColumn = localize('sqlCmdValueColumn', "Value"); -export const loadSqlCmdVarsButtonTitle = localize('reloadValuesFromProjectButtonTitle', "Reload values from project"); +export const revertSqlCmdVarsButtonTitle = localize('revertSqlCmdVarsButtonTitle', "Revert values to project defaults"); export const profile = localize('profile', "Profile"); export const selectConnection = localize('selectConnection', "Select connection"); export const server = localize('server', "Server"); diff --git a/extensions/sql-database-projects/src/dialogs/publishDatabaseDialog.ts b/extensions/sql-database-projects/src/dialogs/publishDatabaseDialog.ts index 14f2c86efa..0f85f94925 100644 --- a/extensions/sql-database-projects/src/dialogs/publishDatabaseDialog.ts +++ b/extensions/sql-database-projects/src/dialogs/publishDatabaseDialog.ts @@ -41,7 +41,7 @@ export class PublishDatabaseDialog { private dataSourcesRadioButton: azdataType.RadioButtonComponent | undefined; private sqlCmdVariablesTable: azdataType.DeclarativeTableComponent | undefined; private sqlCmdVariablesFormComponentGroup: azdataType.FormComponentGroup | undefined; - private loadSqlCmdVarsButton: azdataType.ButtonComponent | undefined; + private revertSqlCmdVarsButton: azdataType.ButtonComponent | undefined; private loadProfileTextBox: azdataType.InputBoxComponent | undefined; private formBuilder: azdataType.FormBuilder | undefined; private connectionRow: azdataType.FlexContainer | undefined; @@ -124,13 +124,13 @@ export class PublishDatabaseDialog { this.dataSourcesFormComponent = this.createDataSourcesFormComponent(view); this.sqlCmdVariablesTable = this.createSqlCmdTable(view); - this.loadSqlCmdVarsButton = this.createLoadSqlCmdVarsButton(view); + this.revertSqlCmdVarsButton = this.createRevertSqlCmdVarsButton(view); this.sqlCmdVariablesFormComponentGroup = { components: [ { title: '', - component: this.loadSqlCmdVarsButton + component: this.revertSqlCmdVarsButton }, { title: '', @@ -430,7 +430,7 @@ export class PublishDatabaseDialog { private onPublishTypeChange(existingServer: boolean, view: azdataType.ModelView) { this.existingServerSelected = existingServer; this.createDatabaseRow(view); - this.tryEnableGenerateScriptAndOkButtons(); + this.tryEnableGenerateScriptAndPublishButtons(); if (existingServer) { if (this.connectionRow) { this.formBuilder!.insertFormItem({ @@ -470,7 +470,7 @@ export class PublishDatabaseDialog { }).component(); this.targetConnectionTextBox.onTextChanged(() => { - this.tryEnableGenerateScriptAndOkButtons(); + this.tryEnableGenerateScriptAndPublishButtons(); }); return this.targetConnectionTextBox; @@ -509,7 +509,7 @@ export class PublishDatabaseDialog { this.dataSourcesDropDown.onValueChanged(() => { this.setDatabaseToSelectedDataSourceDatabase(); - this.tryEnableGenerateScriptAndOkButtons(); + this.tryEnableGenerateScriptAndPublishButtons(); }); return { @@ -574,7 +574,7 @@ export class PublishDatabaseDialog { }).withValidation(component => utils.validateSqlServerPortNumber(component.value)).component(); this.serverPortTextBox.onTextChanged(() => { - this.tryEnableGenerateScriptAndOkButtons(); + this.tryEnableGenerateScriptAndPublishButtons(); }); const serverPortRow = this.createFormRow(view, constants.serverPortNumber(name), this.serverPortTextBox); this.serverAdminPasswordTextBox = view.modelBuilder.inputBox().withProps({ @@ -600,13 +600,13 @@ export class PublishDatabaseDialog { required: true }).withValidation(component => component.value === this.serverAdminPasswordTextBox?.value).component(); this.serverAdminPasswordTextBox.onTextChanged(() => { - this.tryEnableGenerateScriptAndOkButtons(); + this.tryEnableGenerateScriptAndPublishButtons(); if (this.serverConfigAdminPasswordTextBox) { this.serverConfigAdminPasswordTextBox.value = ''; } }); this.serverConfigAdminPasswordTextBox.onTextChanged(() => { - this.tryEnableGenerateScriptAndOkButtons(); + this.tryEnableGenerateScriptAndPublishButtons(); }); const serverConfirmPasswordRow = this.createFormRow(view, constants.confirmServerPassword(name), this.serverConfigAdminPasswordTextBox); @@ -636,7 +636,7 @@ export class PublishDatabaseDialog { }).component(); this.imageTagDropDown.onValueChanged(() => { - this.tryEnableGenerateScriptAndOkButtons(); + this.tryEnableGenerateScriptAndPublishButtons(); }); const agreementInfo = baseImages[0].agreementInfo; @@ -648,7 +648,7 @@ export class PublishDatabaseDialog { required: true }).component(); this.eulaCheckBox.onChanged(() => { - this.tryEnableGenerateScriptAndOkButtons(); + this.tryEnableGenerateScriptAndPublishButtons(); }); const eulaRow = view.modelBuilder.flexContainer().withLayout({ flexFlow: 'row', alignItems: 'center' }).component(); @@ -719,7 +719,7 @@ export class PublishDatabaseDialog { }).component(); this.targetDatabaseDropDown.onValueChanged(() => { - this.tryEnableGenerateScriptAndOkButtons(); + this.tryEnableGenerateScriptAndPublishButtons(); }); } @@ -773,37 +773,52 @@ export class PublishDatabaseDialog { (>this.sqlCmdVars)[row[0].value] = row[1].value; }); - this.tryEnableGenerateScriptAndOkButtons(); + this.updateRevertSqlCmdVarsButtonState(); + this.tryEnableGenerateScriptAndPublishButtons(); }); return table; } - private createLoadSqlCmdVarsButton(view: azdataType.ModelView): azdataType.ButtonComponent { + private createRevertSqlCmdVarsButton(view: azdataType.ModelView): azdataType.ButtonComponent { let loadSqlCmdVarsButton: azdataType.ButtonComponent = view.modelBuilder.button().withProps({ - label: constants.loadSqlCmdVarsButtonTitle, - title: constants.loadSqlCmdVarsButtonTitle, - ariaLabel: constants.loadSqlCmdVarsButtonTitle, + label: constants.revertSqlCmdVarsButtonTitle, + title: constants.revertSqlCmdVarsButtonTitle, + ariaLabel: constants.revertSqlCmdVarsButtonTitle, width: '210px', iconPath: IconPathHelper.refresh, height: '18px', - CSSStyles: { 'font-size': '13px' } + CSSStyles: { 'font-size': '13px' }, + enabled: false // start disabled because no SQLCMD variable values have been edited yet }).component(); loadSqlCmdVarsButton.onDidClick(async () => { - this.sqlCmdVars = { ...this.project.sqlCmdVariables }; + for (const varName in this.sqlCmdVars) { + + this.sqlCmdVars[varName] = this.getDefaultSqlCmdValue(varName); + } const data = this.convertSqlCmdVarsToTableFormat(this.sqlCmdVars!); await (this.sqlCmdVariablesTable)!.updateProperties({ dataValues: data }); - this.tryEnableGenerateScriptAndOkButtons(); + this.updateRevertSqlCmdVarsButtonState(); + this.tryEnableGenerateScriptAndPublishButtons(); }); return loadSqlCmdVarsButton; } + /** + * Gets the default value of a SQLCMD variable for a project + * @param varName + * @returns value defined in the sqlproj file, or blank string if not defined + */ + private getDefaultSqlCmdValue(varName: string): string { + return Object.keys(this.project.sqlCmdVariables).includes(varName) ? this.project.sqlCmdVariables[varName] : ''; + } + private createSelectConnectionButton(view: azdataType.ModelView): azdataType.Component { this.selectConnectionButton = view.modelBuilder.button().withProps({ ariaLabel: constants.selectConnection, @@ -889,6 +904,7 @@ export class PublishDatabaseDialog { (>this.sqlCmdVars)[key] = result.sqlCmdVariables[key]; } + this.updateRevertSqlCmdVarsButtonState(); this.deploymentOptions = result.options; const data = this.convertSqlCmdVarsToTableFormat(this.getSqlCmdVariablesForPublish()); @@ -916,8 +932,29 @@ export class PublishDatabaseDialog { return data; } - // only enable Generate Script and Ok buttons if all fields are filled - private tryEnableGenerateScriptAndOkButtons(): void { + /** + * Enables or disables "Revert SQLCMD variable values" button depending on whether there are changes + * */ + private updateRevertSqlCmdVarsButtonState(): void { + // no SQLCMD vars -> no button to update state for + if (!this.revertSqlCmdVarsButton) { + return; + } + + let revertButtonEnabled = false; + + for (const varName in this.sqlCmdVars) { + if (this.sqlCmdVars![varName] !== this.getDefaultSqlCmdValue(varName)) { + revertButtonEnabled = true; + break; + } + } + + this.revertSqlCmdVarsButton.enabled = revertButtonEnabled; + } + + // only enable "Generate Script" and "Publish" buttons if all fields are filled + private tryEnableGenerateScriptAndPublishButtons(): void { let publishEnabled: boolean = false; let generateScriptEnabled: boolean = false;