grafana/public/app/features/profile/ChangePasswordForm.tsx

86 lines
3.0 KiB
TypeScript
Raw Normal View History

import { css } from '@emotion/css';
import React from 'react';
import { Button, Field, Form, HorizontalGroup, LinkButton } from '@grafana/ui';
import config from 'app/core/config';
import { UserDTO } from 'app/types';
import { PasswordField } from '../../core/components/PasswordField/PasswordField';
import { ChangePasswordFields } from './types';
export interface Props {
user: UserDTO;
isSaving: boolean;
onChangePassword: (payload: ChangePasswordFields) => void;
}
export const ChangePasswordForm = ({ user, onChangePassword, isSaving }: Props) => {
const { disableLoginForm } = config;
const authSource = user.authLabels?.length && user.authLabels[0];
if (authSource === 'LDAP' || authSource === 'Auth Proxy') {
return <p>You cannot change password when signed in with LDAP or auth proxy.</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"
Grafana-UI: Update React Hook Form to v7 (#33328) * Update hook form * Update Form component * Update ChangePassword.tsx * Update custom types * Update SaveDashboardForm * Update form story * Update FieldArray.story.tsx * Bump hook form version * Update typescript to v4.2.4 * Update ForgottenPassword.tsx * Update LoginForm.tsx * Update SignupPage.tsx * Update VerifyEmail.tsx * Update AdminEditOrgPage.tsx * Update UserCreatePage.tsx * Update BasicSettings.tsx * Update NotificationChannelForm.tsx * Update NotificationChannelOptions.tsx * Update NotificationSettings.tsx * Update OptionElement.tsx * Update AlertRuleForm.tsx * Update AlertTypeStep.tsx * Update AnnotationsField.tsx * Update ConditionField.tsx * Update ConditionsStep.tsx * Update GroupAndNamespaceFields.tsx * Update LabelsField.tsx * Update QueryStep.tsx * Update RowOptionsForm.tsx * Update SaveDashboardAsForm.tsx * Update NewDashboardsFolder.tsx * Update ImportDashboardForm.tsx * Update DashboardImportPage.tsx * Update NewOrgPage.tsx * Update OrgProfile.tsx * Update UserInviteForm.tsx * Update PlaylistForm.tsx * Update ChangePasswordForm.tsx * Update UserProfileEditForm.tsx * Update TeamSettings.tsx * Update SignupInvited.tsx * Expose setValue from the Form * Update typescript to v4.2.4 * Remove ref from field props * Fix tests * Revert TS update * Use exact version * Update latest batch of changes * Reduce the number of strict TS errors * Fix defaults * more type error fixes * Update CreateTeam * fix folder picker in rule form * fixes for hook form 7 * Update docs Co-authored-by: Domas <domasx2@gmail.com>
2021-04-29 08:54:38 -05:00
{...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"
Grafana-UI: Update React Hook Form to v7 (#33328) * Update hook form * Update Form component * Update ChangePassword.tsx * Update custom types * Update SaveDashboardForm * Update form story * Update FieldArray.story.tsx * Bump hook form version * Update typescript to v4.2.4 * Update ForgottenPassword.tsx * Update LoginForm.tsx * Update SignupPage.tsx * Update VerifyEmail.tsx * Update AdminEditOrgPage.tsx * Update UserCreatePage.tsx * Update BasicSettings.tsx * Update NotificationChannelForm.tsx * Update NotificationChannelOptions.tsx * Update NotificationSettings.tsx * Update OptionElement.tsx * Update AlertRuleForm.tsx * Update AlertTypeStep.tsx * Update AnnotationsField.tsx * Update ConditionField.tsx * Update ConditionsStep.tsx * Update GroupAndNamespaceFields.tsx * Update LabelsField.tsx * Update QueryStep.tsx * Update RowOptionsForm.tsx * Update SaveDashboardAsForm.tsx * Update NewDashboardsFolder.tsx * Update ImportDashboardForm.tsx * Update DashboardImportPage.tsx * Update NewOrgPage.tsx * Update OrgProfile.tsx * Update UserInviteForm.tsx * Update PlaylistForm.tsx * Update ChangePasswordForm.tsx * Update UserProfileEditForm.tsx * Update TeamSettings.tsx * Update SignupInvited.tsx * Expose setValue from the Form * Update typescript to v4.2.4 * Remove ref from field props * Fix tests * Revert TS update * Use exact version * Update latest batch of changes * Reduce the number of strict TS errors * Fix defaults * more type error fixes * Update CreateTeam * fix folder picker in rule form * fixes for hook form 7 * Update docs Co-authored-by: Domas <domasx2@gmail.com>
2021-04-29 08:54:38 -05:00
{...register('confirmNew', {
required: 'New password confirmation is required',
validate: (v) => v === getValues().newPassword || 'Passwords must match',
})}
/>
</Field>
<HorizontalGroup>
<Button variant="primary" disabled={isSaving} type="submit">
Change Password
</Button>
<LinkButton variant="secondary" href={`${config.appSubUrl}/profile`} fill="outline">
Cancel
</LinkButton>
</HorizontalGroup>
</>
);
}}
</Form>
</div>
);
};