mirror of
https://github.com/grafana/grafana.git
synced 2025-02-12 00:25:46 -06:00
* Password: added show password functionality added autcomplete props created password component Fixes #28721 * addressed review changes and added unit tests * wrapped passwordField component in forwardRef * fix validation and tests
84 lines
3.0 KiB
TypeScript
84 lines
3.0 KiB
TypeScript
import React, { FC } from 'react';
|
|
import { css } from '@emotion/css';
|
|
import { Button, Field, Form, HorizontalGroup, LinkButton } from '@grafana/ui';
|
|
|
|
import config from 'app/core/config';
|
|
import { UserDTO } from 'app/types';
|
|
import { ChangePasswordFields } from './types';
|
|
import { PasswordField } from '../../core/components/PasswordField/PasswordField';
|
|
|
|
export interface Props {
|
|
user: UserDTO;
|
|
isSaving: boolean;
|
|
onChangePassword: (payload: ChangePasswordFields) => void;
|
|
}
|
|
|
|
export const ChangePasswordForm: FC<Props> = ({ user, onChangePassword, isSaving }) => {
|
|
const { ldapEnabled, authProxyEnabled, disableLoginForm } = config;
|
|
const authSource = user.authLabels?.length && user.authLabels[0];
|
|
|
|
if (ldapEnabled || authProxyEnabled) {
|
|
return <p>You cannot change password when LDAP or auth proxy authentication is enabled.</p>;
|
|
}
|
|
if (authSource && disableLoginForm) {
|
|
return <p>Password cannot be changed here.</p>;
|
|
}
|
|
|
|
return (
|
|
<div
|
|
className={css`
|
|
max-width: 400px;
|
|
`}
|
|
>
|
|
<Form onSubmit={onChangePassword}>
|
|
{({ register, errors, getValues }) => {
|
|
return (
|
|
<>
|
|
<Field label="Old password" invalid={!!errors.oldPassword} error={errors?.oldPassword?.message}>
|
|
<PasswordField
|
|
id="current-password"
|
|
autoComplete="current-password"
|
|
{...register('oldPassword', { required: 'Old password is required' })}
|
|
/>
|
|
</Field>
|
|
|
|
<Field label="New password" invalid={!!errors.newPassword} error={errors?.newPassword?.message}>
|
|
<PasswordField
|
|
id="new-password"
|
|
autoComplete="new-password"
|
|
{...register('newPassword', {
|
|
required: 'New password is required',
|
|
validate: {
|
|
confirm: (v) => v === getValues().confirmNew || 'Passwords must match',
|
|
old: (v) => v !== getValues().oldPassword || `New password can't be the same as the old one.`,
|
|
},
|
|
})}
|
|
/>
|
|
</Field>
|
|
|
|
<Field label="Confirm password" invalid={!!errors.confirmNew} error={errors?.confirmNew?.message}>
|
|
<PasswordField
|
|
id="confirm-new-password"
|
|
autoComplete="new-password"
|
|
{...register('confirmNew', {
|
|
required: 'New password confirmation is required',
|
|
validate: (v) => v === getValues().newPassword || 'Passwords must match',
|
|
})}
|
|
/>
|
|
</Field>
|
|
<HorizontalGroup>
|
|
<Button variant="primary" disabled={isSaving}>
|
|
Change Password
|
|
</Button>
|
|
<LinkButton variant="secondary" href={`${config.appSubUrl}/profile`} fill="outline">
|
|
Cancel
|
|
</LinkButton>
|
|
</HorizontalGroup>
|
|
</>
|
|
);
|
|
}}
|
|
</Form>
|
|
</div>
|
|
);
|
|
};
|