fleet/frontend/components/forms/InviteUserForm/InviteUserForm.jsx
John Murphy 12d2df1f9a Add SSO support to new user activation (#1504)
Closes #1502. This PR adds support for SSO to the new user creation process. An admin now has the option to select SSO when creating a new user.  When the confirmation form is submitted, the user is automatically authenticated with the IDP, and if successful, is redirected to the Kolide home page. Password authentication, password change and password reset are not allowed for an SSO user.
2017-05-10 11:26:05 -05:00

199 lines
4.6 KiB
JavaScript

import React, { Component, PropTypes } from 'react';
import Button from 'components/buttons/Button';
import InputFieldWithIcon from 'components/forms/fields/InputFieldWithIcon';
import Checkbox from 'components/forms/fields/Checkbox';
import userInterface from 'interfaces/user';
import validatePresence from 'components/forms/validators/validate_presence';
import validEmail from 'components/forms/validators/valid_email';
const baseClass = 'invite-user-form';
class InviteUserForm extends Component {
static propTypes = {
serverErrors: PropTypes.shape({
email: PropTypes.string,
base: PropTypes.string,
}),
invitedBy: userInterface,
onCancel: PropTypes.func,
onSubmit: PropTypes.func,
canUseSSO: PropTypes.bool,
};
constructor (props) {
super(props);
this.state = {
errors: {
admin: null,
email: null,
name: null,
sso_enabled: null,
},
formData: {
admin: false,
email: '',
name: '',
sso_enabled: false,
},
};
}
componentWillReceiveProps ({ serverErrors }) {
const { errors } = this.state;
if (this.props.serverErrors !== serverErrors) {
this.setState({
errors: {
...errors,
...serverErrors,
},
});
}
}
onInputChange = (formField) => {
return (value) => {
const { errors, formData } = this.state;
this.setState({
errors: {
...errors,
[formField]: null,
},
formData: {
...formData,
[formField]: value,
},
});
return false;
};
}
onCheckboxChange = (formField) => {
return (evt) => {
return this.onInputChange(formField)(evt);
};
};
onFormSubmit = (evt) => {
evt.preventDefault();
const valid = this.validate();
if (valid) {
const { formData: { admin, email, name, sso_enabled } } = this.state;
const { invitedBy, onSubmit } = this.props;
return onSubmit({
admin,
email,
invited_by: invitedBy.id,
name,
sso_enabled,
});
}
return false;
}
validate = () => {
const {
errors,
formData: { email },
} = this.state;
if (!validatePresence(email)) {
this.setState({
errors: {
...errors,
email: 'Email field must be completed',
},
});
return false;
}
if (!validEmail(email)) {
this.setState({
errors: {
...errors,
email: `${email} is not a valid email`,
},
});
return false;
}
return true;
}
render () {
const { errors, formData: { admin, email, name, ssoEnabled } } = this.state;
const { onCancel, serverErrors } = this.props;
const { onFormSubmit, onInputChange, onCheckboxChange } = this;
const baseError = serverErrors.base;
return (
<form onSubmit={onFormSubmit}>
{baseError && <div className="form__base-error">{baseError}</div>}
<InputFieldWithIcon
autofocus
error={errors.name}
name="name"
iconName="username"
onChange={onInputChange('name')}
placeholder="Name"
value={name}
/>
<InputFieldWithIcon
error={errors.email}
name="email"
iconName="email"
onChange={onInputChange('email')}
placeholder="Email"
value={email}
/>
<div className={`${baseClass}__radio`}>
<p className={`${baseClass}__role`}>admin</p>
<Checkbox
name="admin"
onChange={onCheckboxChange('admin')}
value={admin}
wrapperClassName={`${baseClass}__invite-admin`}
>
Enable Admin
</Checkbox>
</div>
<div className={`${baseClass}__radio`}>
<p className={`${baseClass}__role`}>single sign on</p>
<Checkbox
name="sso_enabled"
onChange={onCheckboxChange('sso_enabled')}
value={ssoEnabled}
disabled={!this.props.canUseSSO}
wrapperClassName={`${baseClass}__invite-admin`}
>
Enable Single Sign On
</Checkbox>
</div>
<div className={`${baseClass}__btn-wrap`}>
<Button className={`${baseClass}__btn`} type="submit" variant="brand">
Invite
</Button>
<Button
className={`${baseClass}__btn`}
onClick={onCancel}
type="input"
variant="inverse"
>
Cancel
</Button>
</div>
</form>
);
}
}
export default InviteUserForm;