From bcda08201451156f9ea28ad4c8f6d1e0a2fc6097 Mon Sep 17 00:00:00 2001 From: Ray Schamp Date: Fri, 13 May 2016 18:48:21 -0400 Subject: [PATCH] Add validation to the rest of the form --- src/components/forms/checkbox-group.jsx | 3 +- src/components/forms/checkbox.jsx | 3 +- src/components/forms/form.jsx | 5 + src/components/forms/radio-group.jsx | 3 +- src/components/forms/select.jsx | 10 +- src/components/forms/textarea.jsx | 3 +- src/components/navigation/www/navigation.jsx | 1 - .../teacherregistration.jsx | 175 +++++++++--------- 8 files changed, 112 insertions(+), 91 deletions(-) diff --git a/src/components/forms/checkbox-group.jsx b/src/components/forms/checkbox-group.jsx index 0845831a3..87b08d41e 100644 --- a/src/components/forms/checkbox-group.jsx +++ b/src/components/forms/checkbox-group.jsx @@ -1,6 +1,7 @@ var classNames = require('classnames'); var FRCCheckboxGroup = require('formsy-react-components').CheckboxGroup; var React = require('react'); +var validateMixin = require('./validateMixin.jsx'); var CheckboxGroup = React.createClass({ type: 'CheckboxGroup', @@ -15,4 +16,4 @@ var CheckboxGroup = React.createClass({ } }); -module.exports = CheckboxGroup; +module.exports = validateMixin(CheckboxGroup); diff --git a/src/components/forms/checkbox.jsx b/src/components/forms/checkbox.jsx index 5de3c0102..38abfdd45 100644 --- a/src/components/forms/checkbox.jsx +++ b/src/components/forms/checkbox.jsx @@ -1,6 +1,7 @@ var classNames = require('classnames'); var FRCCheckbox = require('formsy-react-components').Checkbox; var React = require('react'); +var validateMixin = require('./validateMixin.jsx'); var Checkbox = React.createClass({ type: 'Checkbox', @@ -15,4 +16,4 @@ var Checkbox = React.createClass({ } }); -module.exports = Checkbox; +module.exports = validateMixin(Checkbox); diff --git a/src/components/forms/form.jsx b/src/components/forms/form.jsx index 948def2a5..319c559f4 100644 --- a/src/components/forms/form.jsx +++ b/src/components/forms/form.jsx @@ -8,6 +8,11 @@ for (var validation in validations) { } var Form = React.createClass({ + getDefaultProps: function () { + return { + noValidate: true + }; + }, render: function () { var classes = classNames( 'form', diff --git a/src/components/forms/radio-group.jsx b/src/components/forms/radio-group.jsx index 1918f5422..430b27e59 100644 --- a/src/components/forms/radio-group.jsx +++ b/src/components/forms/radio-group.jsx @@ -1,6 +1,7 @@ var classNames = require('classnames'); var FRCRadioGroup = require('formsy-react-components').RadioGroup; var React = require('react'); +var validateMixin = require('./validateMixin.jsx'); var RadioGroup = React.createClass({ type: 'RadioGroup', @@ -15,4 +16,4 @@ var RadioGroup = React.createClass({ } }); -module.exports = RadioGroup; +module.exports = validateMixin(RadioGroup); diff --git a/src/components/forms/select.jsx b/src/components/forms/select.jsx index 1a2d43833..d87e76c14 100644 --- a/src/components/forms/select.jsx +++ b/src/components/forms/select.jsx @@ -1,6 +1,8 @@ var classNames = require('classnames'); +var defaults = require('lodash.defaultsdeep'); var FRCSelect = require('formsy-react-components').Select; var React = require('react'); +var validateMixin = require('./validateMixin.jsx'); require('./select.scss'); @@ -14,10 +16,14 @@ var Select = React.createClass({ 'select', this.props.className ); + var props = this.props; + if (this.props.required && !this.props.value) { + props = defaults({}, this.props, {value: this.props.options[0].value}); + } return ( - + ); } }); -module.exports = Select; +module.exports = validateMixin(Select); diff --git a/src/components/forms/textarea.jsx b/src/components/forms/textarea.jsx index 8919ee2ef..56c1a8c25 100644 --- a/src/components/forms/textarea.jsx +++ b/src/components/forms/textarea.jsx @@ -1,6 +1,7 @@ var classNames = require('classnames'); var FRCTextarea = require('formsy-react-components').Textarea; var React = require('react'); +var validateMixin = require('./validateMixin.jsx'); require('./textarea.scss'); @@ -17,4 +18,4 @@ var TextArea = React.createClass({ } }); -module.exports = TextArea; +module.exports = validateMixin(TextArea); diff --git a/src/components/navigation/www/navigation.jsx b/src/components/navigation/www/navigation.jsx index 25fb403eb..f7319d2d6 100644 --- a/src/components/navigation/www/navigation.jsx +++ b/src/components/navigation/www/navigation.jsx @@ -11,7 +11,6 @@ var Api = require('../../../mixins/api.jsx'); var Avatar = require('../../avatar/avatar.jsx'); var Button = require('../../forms/button.jsx'); var Dropdown = require('../../dropdown/dropdown.jsx'); -var Form = require('../../forms/form.jsx'); var Input = require('../../forms/input.jsx'); var log = require('../../../lib/log.js'); var Login = require('../../login/login.jsx'); diff --git a/src/views/teacherregistration/teacherregistration.jsx b/src/views/teacherregistration/teacherregistration.jsx index 2ddccecf9..75091356e 100644 --- a/src/views/teacherregistration/teacherregistration.jsx +++ b/src/views/teacherregistration/teacherregistration.jsx @@ -12,7 +12,6 @@ var formset = require('../../components/forms/formset.jsx'); var FormSet = formset.FormSet; var FormStep = formset.FormStep; var Input = require('../../components/forms/input.jsx'); -var Label = require('../../components/forms/label.jsx'); var Page = require('../../components/page/www/page.jsx'); var RadioGroup = require('../../components/forms/radio-group.jsx'); var Select = require('../../components/forms/select.jsx'); @@ -32,7 +31,7 @@ var UsernameStep = React.createClass({ for review. The approval process can take up to 24 hours

}> -
+ + required />
@@ -74,8 +73,11 @@ var UsernameStep = React.createClass({ } }); var DemographicsStep = React.createClass({ - onSubmit: function () { - this.props.onNextStep(); + getInitialState: function () { + return {otherDisabled: true}; + }, + onChooseGender: function (name, gender) { + this.setState({otherDisabled: gender !== 'other'}); }, render: function () { var countryOptions = Object.keys(COUNTRIES).map(function (code) { @@ -98,19 +100,24 @@ var DemographicsStep = React.createClass({ Your responses to these questions will be kept private. Why do we ask for this information ?

}> -
- + + - - + - - + + + @@ -141,9 +143,6 @@ var NameStep = React.createClass({ } }); var PhoneNumberStep = React.createClass({ - onSubmit: function () { - this.props.onNextStep(); - }, render: function () { return ( ?

}> -
- - - - + + +
@@ -167,13 +169,18 @@ var PhoneNumberStep = React.createClass({ } }); var OrganizationStep = React.createClass({ - onSubmit: function () { - this.props.onNextStep(); + getInitialState: function () { + return { + otherDisabled: true + }; + }, + onChooseOrganization: function (name, values) { + this.setState({otherDisabled: values.indexOf('Other') === -1}); }, render: function () { var organizationOptions = [ 'Elementary School', 'Middle School', 'High School', 'University / College', - 'Museum', 'Library', 'Camp' + 'Museum', 'Library', 'Camp', 'Other' ].map(function (type) { return {value: type, label: type}; }); return ( ?

}> -
- - - - + + + - - - - + name="organizationType" + value={[]} + options={organizationOptions} + onChange={this.onChooseOrganization} + required /> + +
@@ -200,9 +210,6 @@ var OrganizationStep = React.createClass({ } }); var AddressStep = React.createClass({ - onSubmit: function () { - this.props.onNextStep(); - }, render: function () { var countryOptions = Object.keys(COUNTRIES).map(function (code) { return {value: code, label: COUNTRIES[code]}; @@ -210,6 +217,8 @@ var AddressStep = React.createClass({ var stateOptions = ['every','state','in','the','world'].map(function (name) { return {value: name, label: name}; }); + var stateDefault = 'Please select one of...'; + stateOptions = [{label: stateDefault}].concat(stateOptions); return ( ?

}> -
- - - - - - - - - - + + + + +