properly validates credential password fields

This commit is contained in:
Alex Corey 2021-06-23 08:46:11 -04:00 committed by Shane McDonald
parent d3c5397721
commit 28a62ea774
No known key found for this signature in database
GPG Key ID: 6F374AF6E9EB9374
3 changed files with 41 additions and 16 deletions

View File

@ -12,7 +12,15 @@ import {
import { EyeIcon, EyeSlashIcon } from '@patternfly/react-icons';
function PasswordInput(props) {
const { autocomplete, id, name, validate, isRequired, isDisabled } = props;
const {
autocomplete,
id,
name,
validate,
isFieldGroupValid,
isRequired,
isDisabled,
} = props;
const [inputType, setInputType] = useState('password');
const [field, meta] = useField({ name, validate });
@ -44,7 +52,7 @@ function PasswordInput(props) {
value={field.value === '$encrypted$' ? '' : field.value}
isDisabled={isDisabled}
isRequired={isRequired}
validated={isValid ? 'default' : 'error'}
validated={isValid || isFieldGroupValid ? 'default' : 'error'}
type={inputType}
onChange={(_, event) => {
field.onChange(event);

View File

@ -26,7 +26,12 @@ const FileUpload = styled(PFFileUpload)`
flex-grow: 1;
`;
function CredentialInput({ fieldOptions, credentialKind, ...rest }) {
function CredentialInput({
fieldOptions,
isFieldGroupValid,
credentialKind,
...rest
}) {
const [fileName, setFileName] = useState('');
const [fileIsUploading, setFileIsUploading] = useState(false);
const [subFormField, meta, helpers] = useField(`inputs.${fieldOptions.id}`);
@ -116,6 +121,7 @@ function CredentialInput({ fieldOptions, credentialKind, ...rest }) {
<>
{RevertReplaceButton}
<PasswordInput
isFieldGroupValid={isFieldGroupValid}
{...subFormField}
id={`credential-${fieldOptions.id}`}
{...rest}
@ -169,7 +175,9 @@ function CredentialField({ credentialType, fieldOptions }) {
name: `inputs.${fieldOptions.id}`,
validate: validateField(),
});
const isValid = !(meta.touched && meta.error);
const isValid =
!(meta.touched && meta.error) ||
formikValues.passwordPrompts[fieldOptions.id];
if (fieldOptions.choices) {
const selectOptions = fieldOptions.choices.map(choice => {
@ -235,7 +243,10 @@ function CredentialField({ credentialType, fieldOptions }) {
isRequired={isRequired}
validated={isValid ? 'default' : 'error'}
>
<CredentialInput fieldOptions={fieldOptions} />
<CredentialInput
isFieldGroupValid={isValid}
fieldOptions={fieldOptions}
/>
</CredentialPluginField>
);
}

View File

@ -98,15 +98,23 @@ function CredentialPluginField(props) {
const [, meta, helpers] = useField(`inputs.${fieldOptions.id}`);
const [passwordPromptField] = useField(`passwordPrompts.${fieldOptions.id}`);
const invalidHelperTextToDisplay = meta.error && meta.touched && (
<div
className={css(styles.formHelperText, styles.modifiers.error)}
id={`${fieldOptions.id}-helper`}
aria-live="polite"
>
{meta.error}
</div>
);
let invalidHelperTextToDisplay;
if (meta.error && meta.touched) {
invalidHelperTextToDisplay = (
<div
className={css(styles.formHelperText, styles.modifiers.error)}
id={`${fieldOptions.id}-helper`}
aria-live="polite"
>
{meta.error}
</div>
);
}
if (fieldOptions.id === 'vault_password' && passwordPromptField.value) {
invalidHelperTextToDisplay = null;
}
useEffect(() => {
if (passwordPromptField.value) {
@ -119,8 +127,6 @@ function CredentialPluginField(props) {
<>
{fieldOptions.ask_at_runtime ? (
<FieldWithPrompt
fieldId={`credential-${fieldOptions.id}`}
helperTextInvalid={meta.error}
isRequired={isRequired}
label={fieldOptions.label}
promptId={`credential-prompt-${fieldOptions.id}`}