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
}>
-
@@ -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 ?
}>
-
@@ -118,9 +125,6 @@ var DemographicsStep = React.createClass({
}
});
var NameStep = React.createClass({
- onSubmit: function () {
- this.props.onNextStep();
- },
render: function () {
return (
?
}>
-
@@ -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 (
?
}>
-
@@ -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 (
?
}>
-
@@ -237,9 +240,6 @@ var AddressStep = React.createClass({
}
});
var UseScratchStep = React.createClass({
- onSubmit: function () {
- this.props.onNextStep();
- },
render: function () {
return (
Tell us a little how you plan to use Scratch.
Why do we ask for this information ?
- }>
-
@@ -258,9 +258,6 @@ var UseScratchStep = React.createClass({
}
});
var EmailStep = React.createClass({
- onSubmit: function () {
- this.props.onNextStep();
- },
render: function () {
return (
confirmation email that will
allow you to access your Scratch Teacher Account.
}>
-
@@ -293,7 +300,7 @@ var LastStep = React.createClass({
Click the link in the confirmation email that we
sent to the following address:
- {this.state.email}
+ {this.props.formData.email}
Wrong email?
@@ -340,15 +347,15 @@ var TeacherRegistration = React.createClass({
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
);