Add help text when a field is not required

Most of our fields are required, so it makes more sense to display help when they are optional than to asterisk every required field
This commit is contained in:
Ray Schamp 2016-06-13 12:48:58 -04:00
parent 667ff08a36
commit f74a078afb
11 changed files with 64 additions and 10 deletions

View file

@ -2,6 +2,9 @@ var classNames = require('classnames');
var FRCCheckboxGroup = require('formsy-react-components').CheckboxGroup; var FRCCheckboxGroup = require('formsy-react-components').CheckboxGroup;
var React = require('react'); var React = require('react');
var defaultValidationHOC = require('./validations.jsx').defaultValidationHOC; var defaultValidationHOC = require('./validations.jsx').defaultValidationHOC;
var inputHOC = require('./input-hoc.jsx');
require('./row.scss');
var CheckboxGroup = React.createClass({ var CheckboxGroup = React.createClass({
type: 'CheckboxGroup', type: 'CheckboxGroup',
@ -16,4 +19,4 @@ var CheckboxGroup = React.createClass({
} }
}); });
module.exports = defaultValidationHOC(CheckboxGroup); module.exports = inputHOC(defaultValidationHOC(CheckboxGroup));

View file

@ -2,6 +2,9 @@ var classNames = require('classnames');
var FRCCheckbox = require('formsy-react-components').Checkbox; var FRCCheckbox = require('formsy-react-components').Checkbox;
var React = require('react'); var React = require('react');
var defaultValidationHOC = require('./validations.jsx').defaultValidationHOC; var defaultValidationHOC = require('./validations.jsx').defaultValidationHOC;
var inputHOC = require('./input-hoc.jsx');
require('./row.scss');
var Checkbox = React.createClass({ var Checkbox = React.createClass({
type: 'Checkbox', type: 'Checkbox',
@ -16,4 +19,4 @@ var Checkbox = React.createClass({
} }
}); });
module.exports = defaultValidationHOC(Checkbox); module.exports = inputHOC(defaultValidationHOC(Checkbox));

View file

@ -0,0 +1,20 @@
var React = require('react');
module.exports = function InputComponentMixin (Component) {
var InputComponent = React.createClass({
getDefaultProps: function () {
return {
messages: {
'general.notRequired': 'Not Required'
}
};
},
render: function () {
return (
<Component help={this.props.required ? null : this.props.messages['general.notRequired']}
{...this.props} />
);
}
});
return InputComponent;
};

View file

@ -2,8 +2,10 @@ var classNames = require('classnames');
var FRCInput = require('formsy-react-components').Input; var FRCInput = require('formsy-react-components').Input;
var React = require('react'); var React = require('react');
var defaultValidationHOC = require('./validations.jsx').defaultValidationHOC; var defaultValidationHOC = require('./validations.jsx').defaultValidationHOC;
var inputHOC = require('./input-hoc.jsx');
require('./input.scss'); require('./input.scss');
require('./row.scss');
var Input = React.createClass({ var Input = React.createClass({
type: 'Input', type: 'Input',
@ -22,4 +24,4 @@ var Input = React.createClass({
} }
}); });
module.exports = defaultValidationHOC(Input); module.exports = inputHOC(defaultValidationHOC(Input));

View file

@ -7,9 +7,12 @@ var defaultValidationHOC = require('./validations.jsx').defaultValidationHOC;
var validationHOCFactory = require('./validations.jsx').validationHOCFactory; var validationHOCFactory = require('./validations.jsx').validationHOCFactory;
var Row = require('formsy-react-components').Row; var Row = require('formsy-react-components').Row;
var ComponentMixin = require('formsy-react-components').ComponentMixin; var ComponentMixin = require('formsy-react-components').ComponentMixin;
var inputHOC = require('./input-hoc.jsx');
var allIso2 = allCountries.map(function (country) {return country.iso2;}); var allIso2 = allCountries.map(function (country) {return country.iso2;});
require('./row.scss');
var PhoneInput = React.createClass({ var PhoneInput = React.createClass({
displayName: 'PhoneInput', displayName: 'PhoneInput',
mixins: [ mixins: [
@ -61,4 +64,4 @@ var phoneValidationHOC = validationHOCFactory({
isPhone: 'Please enter a valid phone number' isPhone: 'Please enter a valid phone number'
}); });
module.exports = defaultValidationHOC(phoneValidationHOC(PhoneInput)); module.exports = inputHOC(defaultValidationHOC(phoneValidationHOC(PhoneInput)));

View file

@ -2,6 +2,9 @@ var classNames = require('classnames');
var FRCRadioGroup = require('formsy-react-components').RadioGroup; var FRCRadioGroup = require('formsy-react-components').RadioGroup;
var React = require('react'); var React = require('react');
var defaultValidationHOC = require('./validations.jsx').defaultValidationHOC; var defaultValidationHOC = require('./validations.jsx').defaultValidationHOC;
var inputHOC = require('./input-hoc.jsx');
require('./row.scss');
var RadioGroup = React.createClass({ var RadioGroup = React.createClass({
type: 'RadioGroup', type: 'RadioGroup',
@ -16,4 +19,4 @@ var RadioGroup = React.createClass({
} }
}); });
module.exports = defaultValidationHOC(RadioGroup); module.exports = inputHOC(defaultValidationHOC(RadioGroup));

View file

@ -0,0 +1,11 @@
/*
* Styles for the Row component used by formsy-react-components
* Should be imported for each component that extends one of
* the formsy-react-components
*/
.form-group {
.required-symbol {
display: none;
}
}

View file

@ -3,7 +3,9 @@ var defaults = require('lodash.defaultsdeep');
var FRCSelect = require('formsy-react-components').Select; var FRCSelect = require('formsy-react-components').Select;
var React = require('react'); var React = require('react');
var defaultValidationHOC = require('./validations.jsx').defaultValidationHOC; var defaultValidationHOC = require('./validations.jsx').defaultValidationHOC;
var inputHOC = require('./input-hoc.jsx');
require('./row.scss');
require('./select.scss'); require('./select.scss');
var Select = React.createClass({ var Select = React.createClass({
@ -26,4 +28,4 @@ var Select = React.createClass({
} }
}); });
module.exports = defaultValidationHOC(Select); module.exports = inputHOC(defaultValidationHOC(Select));

View file

@ -2,7 +2,9 @@ var classNames = require('classnames');
var FRCTextarea = require('formsy-react-components').Textarea; var FRCTextarea = require('formsy-react-components').Textarea;
var React = require('react'); var React = require('react');
var defaultValidationHOC = require('./validations.jsx').defaultValidationHOC; var defaultValidationHOC = require('./validations.jsx').defaultValidationHOC;
var inputHOC = require('./input-hoc.jsx');
require('./row.scss');
require('./textarea.scss'); require('./textarea.scss');
var TextArea = React.createClass({ var TextArea = React.createClass({
@ -18,4 +20,4 @@ var TextArea = React.createClass({
} }
}); });
module.exports = defaultValidationHOC(TextArea); module.exports = inputHOC(defaultValidationHOC(TextArea));

View file

@ -41,13 +41,13 @@ var Login = React.createClass({
id='general.username' id='general.username'
defaultMessage={'Username'} /> defaultMessage={'Username'} />
</label> </label>
<Input type="text" ref="username" name="username" maxLength="30" key="usernameInput" /> <Input type="text" ref="username" name="username" maxLength="30" key="usernameInput" required />
<label htmlFor="password" key="passwordLabel"> <label htmlFor="password" key="passwordLabel">
<FormattedMessage <FormattedMessage
id='general.password' id='general.password'
defaultMessage={'Password'} /> defaultMessage={'Password'} />
</label> </label>
<Input type="password" ref="password" name="password" key="passwordInput" /> <Input type="password" ref="password" name="password" key="passwordInput" required />
{this.state.waiting ? [ {this.state.waiting ? [
<Button className="submit-button white" type="submit" disabled="disabled" key="submitButton"> <Button className="submit-button white" type="submit" disabled="disabled" key="submitButton">
<Spinner /> <Spinner />

View file

@ -73,6 +73,7 @@ module.exports = {
<Checkbox label={formatMessage({id: 'teacherRegistration.showPassword'})} <Checkbox label={formatMessage({id: 'teacherRegistration.showPassword'})}
value={this.state.showPassword} value={this.state.showPassword}
onChange={this.onChangeShowPassword} onChange={this.onChangeShowPassword}
help={null}
name="showPassword" /> name="showPassword" />
<Button type="submit">Next Step</Button> <Button type="submit">Next Step</Button>
</Form> </Form>
@ -126,7 +127,11 @@ module.exports = {
{value: 'other', label: formatMessage({id: 'general.other'})} {value: 'other', label: formatMessage({id: 'general.other'})}
]} ]}
required /> required />
<Input disabled={this.state.otherDisabled} name="user.genderOther" type="text" /> <Input name="user.genderOther"
type="text"
disabled={this.state.otherDisabled}
required={!this.state.otherDisabled}
help={null} />
<Select label={formatMessage({id: 'general.country'})} <Select label={formatMessage({id: 'general.country'})}
name="user.country" name="user.country"
options={countryData.countryOptions} options={countryData.countryOptions}