From a05edc619c9498a43f62ac84c36ee587086e34dc Mon Sep 17 00:00:00 2001 From: Alan Ren Date: Mon, 21 Oct 2019 09:53:12 -0700 Subject: [PATCH] use required attribute (#7850) * use required attribute * readable sql port --- .../resource-deployment/src/interfaces.ts | 1 - .../pages/clusterSettingsPage.ts | 65 ++++++------------- .../pages/serviceSettingsPage.ts | 59 ++++++----------- .../src/ui/modelViewUtils.ts | 10 +-- 4 files changed, 43 insertions(+), 92 deletions(-) diff --git a/extensions/resource-deployment/src/interfaces.ts b/extensions/resource-deployment/src/interfaces.ts index 5f50aea6db..d2e48cb189 100644 --- a/extensions/resource-deployment/src/interfaces.ts +++ b/extensions/resource-deployment/src/interfaces.ts @@ -160,7 +160,6 @@ export interface FieldInfo { labelWidth?: string; inputWidth?: string; description?: string; - useCustomValidator?: boolean; labelPosition?: LabelPosition; // overwrite the labelPosition of SectionInfo. fontStyle?: FontStyle; labelFontWeight?: FontWeight; diff --git a/extensions/resource-deployment/src/ui/deployClusterWizard/pages/clusterSettingsPage.ts b/extensions/resource-deployment/src/ui/deployClusterWizard/pages/clusterSettingsPage.ts index 7b1a736ef4..6196f1aa39 100644 --- a/extensions/resource-deployment/src/ui/deployClusterWizard/pages/clusterSettingsPage.ts +++ b/extensions/resource-deployment/src/ui/deployClusterWizard/pages/clusterSettingsPage.ts @@ -8,7 +8,7 @@ import * as vscode from 'vscode'; import * as nls from 'vscode-nls'; import { DeployClusterWizard } from '../deployClusterWizard'; import { SectionInfo, FieldType, LabelPosition } from '../../../interfaces'; -import { createSection, InputComponents, setModelValues, Validator, isInputBoxEmpty, getInputBoxComponent, isValidSQLPassword, getInvalidSQLPasswordMessage, getPasswordMismatchMessage, MissingRequiredInformationErrorMessage } from '../../modelViewUtils'; +import { createSection, InputComponents, setModelValues, Validator, getInputBoxComponent, isValidSQLPassword, getInvalidSQLPasswordMessage, getPasswordMismatchMessage } from '../../modelViewUtils'; import { WizardPageBase } from '../../wizardPageBase'; import * as VariableNames from '../constants'; import { EOL } from 'os'; @@ -37,15 +37,13 @@ export class ClusterSettingsPage extends WizardPageBase { label: localize('deployCluster.ClusterName', "Cluster name"), required: true, variableName: VariableNames.ClusterName_VariableName, - defaultValue: 'mssql-cluster', - useCustomValidator: true + defaultValue: 'mssql-cluster' }, { type: FieldType.Text, label: localize('deployCluster.AdminUsername', "Admin username"), required: true, variableName: VariableNames.AdminUserName_VariableName, defaultValue: 'admin', - useCustomValidator: true, description: localize('deployCluster.AdminUsernameDescription', "This username will be used for controller and SQL Server. Username for the gateway will be root.") }, { type: FieldType.Password, @@ -53,19 +51,16 @@ export class ClusterSettingsPage extends WizardPageBase { required: true, variableName: VariableNames.AdminPassword_VariableName, defaultValue: '', - useCustomValidator: true, description: localize('deployCluster.AdminPasswordDescription', "This password can be used to access the controller, SQL Server and gateway.") }, { type: FieldType.Password, label: localize('deployCluster.ConfirmPassword', "Confirm password"), required: true, variableName: ConfirmPasswordName, - defaultValue: '', - useCustomValidator: true, + defaultValue: '' }, { type: FieldType.Options, label: localize('deployCluster.AuthenticationMode', "Authentication mode"), - required: true, variableName: VariableNames.AuthenticationMode_VariableName, defaultValue: AuthenticationMode.Basic, options: [ @@ -127,14 +122,12 @@ export class ClusterSettingsPage extends WizardPageBase { label: localize('deployCluster.OuDistinguishedName', "Organizational unit"), required: true, variableName: VariableNames.OrganizationalUnitDistinguishedName_VariableName, - useCustomValidator: true, description: localize('deployCluster.OuDistinguishedNameDescription', "Distinguished name for the organizational unit. For example: OU=bdc,DC=contoso,DC=com.") }, { type: FieldType.Text, label: localize('deployCluster.DomainControllerFQDNs', "Domain controller FQDNs"), required: true, variableName: VariableNames.DomainControllerFQDNs_VariableName, - useCustomValidator: true, placeHolder: localize('deployCluster.DomainControllerFQDNsPlaceHolder', "Use comma to separate the values."), description: localize('deployCluster.DomainControllerFQDNDescription', "Fully qualified domain names for the domain controller. For example: DC1.CONTOSO.COM. Use comma to separate multiple FQDNs.") }, { @@ -142,28 +135,24 @@ export class ClusterSettingsPage extends WizardPageBase { label: localize('deployCluster.DomainDNSIPAddresses', "Domain DNS IP addresses"), required: true, variableName: VariableNames.DomainDNSIPAddresses_VariableName, - useCustomValidator: true, placeHolder: localize('deployCluster.DomainDNSIPAddressesPlaceHolder', "Use comma to separate the values."), description: localize('deployCluster.DomainDNSIPAddressesDescription', "Domain DNS servers' IP Addresses. Use comma to separate multiple IP addresses.") }, { type: FieldType.Text, label: localize('deployCluster.DomainDNSName', "Domain DNS name"), required: true, - variableName: VariableNames.DomainDNSName_VariableName, - useCustomValidator: true + variableName: VariableNames.DomainDNSName_VariableName }, { type: FieldType.Text, label: localize('deployCluster.ClusterAdmins', "Cluster admin group"), required: true, variableName: VariableNames.ClusterAdmins_VariableName, - useCustomValidator: true, description: localize('deployCluster.ClusterAdminsDescription', "The Active Directory group for cluster admin.") }, { type: FieldType.Text, label: localize('deployCluster.ClusterUsers', "Cluster users"), required: true, variableName: VariableNames.ClusterUsers_VariableName, - useCustomValidator: true, placeHolder: localize('deployCluster.ClusterUsersPlaceHolder', "Use comma to separate the values."), description: localize('deployCluster.ClusterUsersDescription', "The Active Directory users/groups with cluster users role. Use comma to separate multiple users/groups.") }, { @@ -171,20 +160,17 @@ export class ClusterSettingsPage extends WizardPageBase { label: localize('deployCluster.DomainServiceAccountUserName', "Service account username"), required: true, variableName: VariableNames.DomainServiceAccountUserName_VariableName, - useCustomValidator: true, description: localize('deployCluster.DomainServiceAccountUserNameDescription', "Domain service account for Big Data Cluster") }, { type: FieldType.Password, label: localize('deployCluster.DomainServiceAccountPassword', "Service account password"), required: true, - variableName: VariableNames.DomainServiceAccountPassword_VariableName, - useCustomValidator: true + variableName: VariableNames.DomainServiceAccountPassword_VariableName }, { type: FieldType.Text, label: localize('deployCluster.AppOwers', "App owners"), required: false, variableName: VariableNames.AppOwners_VariableName, - useCustomValidator: true, placeHolder: localize('deployCluster.AppOwnersPlaceHolder', "Use comma to separate the values."), description: localize('deployCluster.AppOwnersDescription', "The Active Directory users or groups with app owners role. Use comma to separate multiple users/groups.") }, { @@ -192,7 +178,6 @@ export class ClusterSettingsPage extends WizardPageBase { label: localize('deployCluster.AppReaders', "App readers"), required: false, variableName: VariableNames.AppReaders_VariableName, - useCustomValidator: true, placeHolder: localize('deployCluster.AppReadersPlaceHolder', "Use comma to separate the values."), description: localize('deployCluster.AppReadersDescription', "The Active Directory users or groups of app readers. Use comma as separator them if there are multiple users/groups.") } @@ -254,6 +239,14 @@ export class ClusterSettingsPage extends WizardPageBase { ); this.wizard.registerDisposable(authModeDropdown.onValueChanged(() => { const isBasicAuthMode = (authModeDropdown.value).name === 'basic'; + getInputBoxComponent(VariableNames.OrganizationalUnitDistinguishedName_VariableName, this.inputComponents).required = !isBasicAuthMode; + getInputBoxComponent(VariableNames.DomainControllerFQDNs_VariableName, this.inputComponents).required = !isBasicAuthMode; + getInputBoxComponent(VariableNames.DomainDNSIPAddresses_VariableName, this.inputComponents).required = !isBasicAuthMode; + getInputBoxComponent(VariableNames.DomainDNSName_VariableName, this.inputComponents).required = !isBasicAuthMode; + getInputBoxComponent(VariableNames.ClusterAdmins_VariableName, this.inputComponents).required = !isBasicAuthMode; + getInputBoxComponent(VariableNames.ClusterUsers_VariableName, this.inputComponents).required = !isBasicAuthMode; + getInputBoxComponent(VariableNames.DomainServiceAccountUserName_VariableName, this.inputComponents).required = !isBasicAuthMode; + getInputBoxComponent(VariableNames.DomainServiceAccountPassword_VariableName, this.inputComponents).required = !isBasicAuthMode; if (isBasicAuthMode) { this.formBuilder.removeFormItem(this.activeDirectorySection); } else { @@ -307,33 +300,13 @@ export class ClusterSettingsPage extends WizardPageBase { this.wizard.wizardObject.message = { text: '' }; if (pcInfo.newPage > pcInfo.lastPage) { const messages: string[] = []; - const authMode = typeof authModeDropdown.value === 'string' ? authModeDropdown.value : authModeDropdown.value!.name; - const requiredFieldsFilled: boolean = !isInputBoxEmpty(getInputBoxComponent(VariableNames.ClusterName_VariableName, this.inputComponents)) - && !isInputBoxEmpty(getInputBoxComponent(VariableNames.AdminUserName_VariableName, this.inputComponents)) - && !isInputBoxEmpty(getInputBoxComponent(VariableNames.AdminPassword_VariableName, this.inputComponents)) - && !isInputBoxEmpty(getInputBoxComponent(ConfirmPasswordName, this.inputComponents)) - && (!(authMode === AuthenticationMode.ActiveDirectory) || ( - !isInputBoxEmpty(getInputBoxComponent(VariableNames.OrganizationalUnitDistinguishedName_VariableName, this.inputComponents)) - && !isInputBoxEmpty(getInputBoxComponent(VariableNames.DomainControllerFQDNs_VariableName, this.inputComponents)) - && !isInputBoxEmpty(getInputBoxComponent(VariableNames.ClusterAdmins_VariableName, this.inputComponents)) - && !isInputBoxEmpty(getInputBoxComponent(VariableNames.ClusterUsers_VariableName, this.inputComponents)) - && !isInputBoxEmpty(getInputBoxComponent(VariableNames.DomainDNSIPAddresses_VariableName, this.inputComponents)) - && !isInputBoxEmpty(getInputBoxComponent(VariableNames.DomainDNSName_VariableName, this.inputComponents)))); - if (!requiredFieldsFilled) { - messages.push(MissingRequiredInformationErrorMessage); + const password = getInputBoxComponent(VariableNames.AdminPassword_VariableName, this.inputComponents).value!; + const confirmPassword = getInputBoxComponent(ConfirmPasswordName, this.inputComponents).value!; + if (password !== confirmPassword) { + messages.push(getPasswordMismatchMessage(localize('deployCluster.AdminPasswordField', "Password"))); } - - if (!isInputBoxEmpty(getInputBoxComponent(VariableNames.AdminUserName_VariableName, this.inputComponents)) - && !isInputBoxEmpty(getInputBoxComponent(VariableNames.AdminPassword_VariableName, this.inputComponents)) - && !isInputBoxEmpty(getInputBoxComponent(ConfirmPasswordName, this.inputComponents))) { - const password = getInputBoxComponent(VariableNames.AdminPassword_VariableName, this.inputComponents).value!; - const confirmPassword = getInputBoxComponent(ConfirmPasswordName, this.inputComponents).value!; - if (password !== confirmPassword) { - messages.push(getPasswordMismatchMessage(localize('deployCluster.AdminPasswordField', "Password"))); - } - if (!isValidSQLPassword(password, getInputBoxComponent(VariableNames.AdminUserName_VariableName, this.inputComponents).value!)) { - messages.push(getInvalidSQLPasswordMessage(localize('deployCluster.AdminPasswordField', "Password"))); - } + if (!isValidSQLPassword(password, getInputBoxComponent(VariableNames.AdminUserName_VariableName, this.inputComponents).value!)) { + messages.push(getInvalidSQLPasswordMessage(localize('deployCluster.AdminPasswordField', "Password"))); } if (messages.length > 0) { diff --git a/extensions/resource-deployment/src/ui/deployClusterWizard/pages/serviceSettingsPage.ts b/extensions/resource-deployment/src/ui/deployClusterWizard/pages/serviceSettingsPage.ts index 458b5969c8..295128c608 100644 --- a/extensions/resource-deployment/src/ui/deployClusterWizard/pages/serviceSettingsPage.ts +++ b/extensions/resource-deployment/src/ui/deployClusterWizard/pages/serviceSettingsPage.ts @@ -7,7 +7,7 @@ import * as vscode from 'vscode'; import * as nls from 'vscode-nls'; import { DeployClusterWizard } from '../deployClusterWizard'; import { SectionInfo, FieldType } from '../../../interfaces'; -import { Validator, InputComponents, createSection, createGroupContainer, createLabel, createFlexContainer, createTextInput, createNumberInput, setModelValues, getInputBoxComponent, getCheckboxComponent, isInputBoxEmpty, getDropdownComponent, MissingRequiredInformationErrorMessage } from '../../modelViewUtils'; +import { Validator, InputComponents, createSection, createGroupContainer, createLabel, createFlexContainer, createTextInput, createNumberInput, setModelValues, getInputBoxComponent, getCheckboxComponent, getDropdownComponent } from '../../modelViewUtils'; import { WizardPageBase } from '../../wizardPageBase'; import * as VariableNames from '../constants'; import { AuthenticationMode } from '../deployClusterWizardModel'; @@ -65,7 +65,6 @@ export class ServiceSettingsPage extends WizardPageBase { label: localize('deployCluster.MasterSqlServerInstances', "SQL Server master instances"), options: ['1', '3', '4', '5', '6', '7', '8', '9'], defaultValue: '1', - required: true, variableName: VariableNames.SQLServerScale_VariableName, }, { type: FieldType.Number, @@ -73,7 +72,6 @@ export class ServiceSettingsPage extends WizardPageBase { min: 1, max: 100, defaultValue: '1', - useCustomValidator: true, required: true, variableName: VariableNames.ComputePoolScale_VariableName, }] @@ -84,7 +82,6 @@ export class ServiceSettingsPage extends WizardPageBase { min: 1, max: 100, defaultValue: '1', - useCustomValidator: true, required: true, variableName: VariableNames.DataPoolScale_VariableName, }, { @@ -93,7 +90,6 @@ export class ServiceSettingsPage extends WizardPageBase { min: 0, max: 100, defaultValue: '0', - useCustomValidator: true, required: true, variableName: VariableNames.SparkPoolScale_VariableName }] @@ -105,7 +101,6 @@ export class ServiceSettingsPage extends WizardPageBase { min: 1, max: 100, defaultValue: '1', - useCustomValidator: true, required: true, variableName: VariableNames.HDFSPoolScale_VariableName }, { @@ -161,7 +156,6 @@ export class ServiceSettingsPage extends WizardPageBase { { type: FieldType.Text, label: localize('deployCluster.ControllerText', "Controller"), - useCustomValidator: true, variableName: VariableNames.ControllerDataStorageClassName_VariableName, required: true, description: localize('deployCluster.AdvancedStorageDescription', "By default Controller storage settings will be applied to other services as well, you can expand the advanced storage settings to configure storage for other services."), @@ -169,19 +163,19 @@ export class ServiceSettingsPage extends WizardPageBase { }, { type: FieldType.Number, label: '', - useCustomValidator: true, + required: true, min: 1, variableName: VariableNames.ControllerDataStorageSize_VariableName, }, { type: FieldType.Text, label: '', - useCustomValidator: true, + required: true, min: 1, variableName: VariableNames.ControllerLogsStorageClassName_VariableName, }, { type: FieldType.Number, label: '', - useCustomValidator: true, + required: true, min: 1, variableName: VariableNames.ControllerLogsStorageSize_VariableName, } @@ -421,17 +415,27 @@ export class ServiceSettingsPage extends WizardPageBase { this.setInputBoxValue(VariableNames.ControllerLogsStorageClassName_VariableName); this.setInputBoxValue(VariableNames.ControllerLogsStorageSize_VariableName); this.endpointHeaderRow.clearItems(); - this.endpointSection.collapsed = this.wizard.model.authenticationMode !== AuthenticationMode.ActiveDirectory; - if (this.wizard.model.authenticationMode === AuthenticationMode.ActiveDirectory) { + const adAuth = this.wizard.model.authenticationMode === AuthenticationMode.ActiveDirectory; + const sqlServerScale = this.wizard.model.getIntegerValue(VariableNames.SQLServerScale_VariableName); + + this.endpointSection.collapsed = !adAuth; + if (adAuth) { this.endpointHeaderRow.addItems([this.endpointNameColumnHeader, this.dnsColumnHeader, this.portColumnHeader]); } + + getInputBoxComponent(VariableNames.ControllerDNSName_VariableName, this.inputComponents).required = adAuth; + getInputBoxComponent(VariableNames.GatewayDNSName_VariableName, this.inputComponents).required = adAuth; + getInputBoxComponent(VariableNames.AppServiceProxyDNSName_VariableName, this.inputComponents).required = adAuth; + getInputBoxComponent(VariableNames.ServiceProxyDNSName_VariableName, this.inputComponents).required = adAuth; + getInputBoxComponent(VariableNames.SQLServerDNSName_VariableName, this.inputComponents).required = adAuth; + getInputBoxComponent(VariableNames.ReadableSecondaryDNSName_VariableName, this.inputComponents).required = adAuth && sqlServerScale > 1; + getInputBoxComponent(VariableNames.ReadableSecondaryPort_VariableName, this.inputComponents).required = sqlServerScale > 1; this.loadEndpointRow(this.controllerEndpointRow, this.controllerNameLabel, this.controllerDNSInput, this.controllerPortInput); this.loadEndpointRow(this.gatewayEndpointRow, this.gatewayNameLabel, this.gatewayDNSInput, this.gatewayPortInput); this.loadEndpointRow(this.sqlServerEndpointRow, this.SqlServerNameLabel, this.sqlServerDNSInput, this.sqlServerPortInput); this.loadEndpointRow(this.appServiceProxyEndpointRow, this.appServiceProxyNameLabel, this.appServiceProxyDNSInput, this.appServiceProxyPortInput); this.loadEndpointRow(this.serviceProxyEndpointRow, this.serviceProxyNameLabel, this.serviceProxyDNSInput, this.serviceProxyPortInput); const sqlServerScaleDropdown = getDropdownComponent(VariableNames.SQLServerScale_VariableName, this.inputComponents); - const sqlServerScale = this.wizard.model.getIntegerValue(VariableNames.SQLServerScale_VariableName); if (sqlServerScale > 1) { sqlServerScaleDropdown.values = ['3', '4', '5', '6', '7', '8', '9']; this.loadEndpointRow(this.readableSecondaryEndpointRow, this.readableSecondaryNameLabel, this.readableSecondaryDNSInput, this.readableSecondaryPortInput); @@ -444,36 +448,11 @@ export class ServiceSettingsPage extends WizardPageBase { this.wizard.wizardObject.registerNavigationValidator((pcInfo) => { this.wizard.wizardObject.message = { text: '' }; if (pcInfo.newPage > pcInfo.lastPage) { - const allInputFilled: boolean = !isInputBoxEmpty(getInputBoxComponent(VariableNames.ComputePoolScale_VariableName, this.inputComponents)) - && !isInputBoxEmpty(getInputBoxComponent(VariableNames.DataPoolScale_VariableName, this.inputComponents)) - && !isInputBoxEmpty(getInputBoxComponent(VariableNames.HDFSPoolScale_VariableName, this.inputComponents)) - && !isInputBoxEmpty(getInputBoxComponent(VariableNames.SparkPoolScale_VariableName, this.inputComponents)) - && !isInputBoxEmpty(getInputBoxComponent(VariableNames.ControllerDataStorageClassName_VariableName, this.inputComponents)) - && !isInputBoxEmpty(getInputBoxComponent(VariableNames.ControllerDataStorageSize_VariableName, this.inputComponents)) - && !isInputBoxEmpty(getInputBoxComponent(VariableNames.ControllerLogsStorageClassName_VariableName, this.inputComponents)) - && !isInputBoxEmpty(getInputBoxComponent(VariableNames.ControllerLogsStorageSize_VariableName, this.inputComponents)) - && !isInputBoxEmpty(getInputBoxComponent(VariableNames.ControllerPort_VariableName, this.inputComponents)) - && !isInputBoxEmpty(getInputBoxComponent(VariableNames.SQLServerPort_VariableName, this.inputComponents)) - && !isInputBoxEmpty(getInputBoxComponent(VariableNames.GateWayPort_VariableName, this.inputComponents)) - && !isInputBoxEmpty(getInputBoxComponent(VariableNames.AppServiceProxyPort_VariableName, this.inputComponents)) - && !isInputBoxEmpty(getInputBoxComponent(VariableNames.ServiceProxyPort_VariableName, this.inputComponents)) - && (getDropdownComponent(VariableNames.SQLServerScale_VariableName, this.inputComponents).value === '1' - || (!isInputBoxEmpty(this.readableSecondaryPortInput) - && (this.wizard.model.authenticationMode !== AuthenticationMode.ActiveDirectory || !isInputBoxEmpty(this.readableSecondaryDNSInput)))) - && (this.wizard.model.authenticationMode !== AuthenticationMode.ActiveDirectory - || (!isInputBoxEmpty(this.gatewayDNSInput) - && !isInputBoxEmpty(this.controllerDNSInput) - && !isInputBoxEmpty(this.sqlServerDNSInput) - && !isInputBoxEmpty(this.appServiceProxyDNSInput) - && !isInputBoxEmpty(this.serviceProxyDNSInput) - )); const sparkEnabled = Number.parseInt(getInputBoxComponent(VariableNames.SparkPoolScale_VariableName, this.inputComponents).value!) !== 0 || getCheckboxComponent(VariableNames.IncludeSpark_VariableName, this.inputComponents).checked!; let errorMessage: string | undefined; - if (!allInputFilled) { - errorMessage = MissingRequiredInformationErrorMessage; - } else if (!sparkEnabled) { + if (!sparkEnabled) { errorMessage = localize('deployCluster.SparkMustBeIncluded', "Invalid Spark configuration, you must check the 'Include Spark' checkbox or set the 'Spark pool instances' to at least 1."); } if (errorMessage) { @@ -482,7 +461,7 @@ export class ServiceSettingsPage extends WizardPageBase { level: azdata.window.MessageLevel.Error }; } - return allInputFilled && sparkEnabled; + return sparkEnabled; } return true; }); diff --git a/extensions/resource-deployment/src/ui/modelViewUtils.ts b/extensions/resource-deployment/src/ui/modelViewUtils.ts index 8aaaa0f451..780312f93a 100644 --- a/extensions/resource-deployment/src/ui/modelViewUtils.ts +++ b/extensions/resource-deployment/src/ui/modelViewUtils.ts @@ -284,7 +284,7 @@ function processDateTimeTextField(context: FieldContext): void { value: defaultValue, ariaLabel: context.fieldInfo.label, inputType: 'text', - required: !context.fieldInfo.useCustomValidator && context.fieldInfo.required, + required: context.fieldInfo.required, placeHolder: context.fieldInfo.placeHolder }).component(); input.width = context.fieldInfo.inputWidth; @@ -299,7 +299,7 @@ function processNumberField(context: FieldContext): void { ariaLabel: context.fieldInfo.label, min: context.fieldInfo.min, max: context.fieldInfo.max, - required: !context.fieldInfo.useCustomValidator && context.fieldInfo.required, + required: context.fieldInfo.required, width: context.fieldInfo.inputWidth, placeHolder: context.fieldInfo.placeHolder }); @@ -312,7 +312,7 @@ function processTextField(context: FieldContext): void { const input = createTextInput(context.view, { defaultValue: context.fieldInfo.defaultValue, ariaLabel: context.fieldInfo.label, - required: !context.fieldInfo.useCustomValidator && context.fieldInfo.required, + required: context.fieldInfo.required, placeHolder: context.fieldInfo.placeHolder, width: context.fieldInfo.inputWidth }); @@ -325,7 +325,7 @@ function processPasswordField(context: FieldContext): void { const passwordInput = context.view.modelBuilder.inputBox().withProperties({ ariaLabel: context.fieldInfo.label, inputType: 'password', - required: !context.fieldInfo.useCustomValidator && context.fieldInfo.required, + required: context.fieldInfo.required, placeHolder: context.fieldInfo.placeHolder, width: context.fieldInfo.inputWidth }).component(); @@ -351,7 +351,7 @@ function processPasswordField(context: FieldContext): void { const confirmPasswordInput = context.view.modelBuilder.inputBox().withProperties({ ariaLabel: context.fieldInfo.confirmationLabel, inputType: 'password', - required: !context.fieldInfo.useCustomValidator, + required: true, width: context.fieldInfo.inputWidth }).component();