content logo

React Forms:

Dynamic React Signup Form with Summary List

The form we have prepared in this code for speeding up website design can speed up. This form is for collecting student information of a course. The information received from the user is entered in the table at the bottom of the page. In this table there is a button to remove columns from the table. This form also includes a checkbox and a drop-down list.

#

Signup List Form

#

Simple Form Code

#

HTML Form with React

#

Registration Form Code

#

Form Summary Code

<!-- This script got from frontendfreecode.com -->
<div id="root"></div><a style="font-size: 8pt; text-decoration: none" target="_blank" href="http://frontendfreecode.com">Free Frontend</a>
                                                                            
#root {
    max-width: 950px;
    width: 100%;
    margin: 0 auto;
    padding: 0 2rem;
}
form > *, label {
    display: block;
}
label {
    font-weight: bold;
}
.needs label {
    font-weight: normal;
}
form input  {
    display: block;
    outline: none;
    border: 1px solid #ddd;
    border-radius: 2px;
    margin-bottom: 1rem;
    height: 30px;
    width: 350px;
    padding: calc(.375em - 1px) calc(.625em - 1px);
}
input[type="checkbox"] {
    display: inline-block;
    height: 15px;
    width: 20px;
    margin-bottom: 0;
}
div {
    padding: 0 0 1rem;
}
h1 {
    font-size: 3rem;
    font-weight: 200;
    border-bottom: 4px double #ededed;
    padding: 3rem 0 0.5rem;
    margin-bottom: 2rem;
}
h3 {
    font-size: 1.5rem;
    text-align: center;
    font-weight: 200;
    padding: 1rem;
}
h4, .select label {
    margin: 0;
    font-weight: bold;
}
.select {
    margin-bottom: 2.75rem;
}
select {
    display: block;
    height: 2.5rem;
    width: 350px;
    outline: 0;
    border: 1px solid #ddd;
    border-radius: 0;
    box-shadow: none;
    background-color: transparent;
    cursor: pointer;
    color: rgba(0,0,0,.87);
    padding: 0 1.5rem 0 0;
}
.button {
    width: 200px;
    margin-top: 1rem;
}
.registered {
    margin: 3rem 0;
    border-top: 10px dotted #eee;
    border-bottom: 5px solid #eee;
    padding: 1rem 0;
    text-align: center;
}
.select:not(.is-multiple):not(.is-loading)::after {
    bottom: -10px;
    top: auto;
}
.headers.columns {
    border-bottom: 1px solid #eee;
    border-top: 1px solid #eee;
    padding-bottom: 0;
}
.registered-list .columns {
    margin-bottom: 0;
    padding-bottom: 0;
}
class ControlledInput extends React.Component {
    constructor(props) {
        super(props);
        this.handleChange = this.handleChange.bind(this);
    }
    handleChange(e) {
        this.props.onChange(e);
    }
    render() {
        let styleName = this.props.label.toLowerCase().replace(' ', '-'),
            isrequired = this.props.isRequired ? 'required' : '';
        return /*#__PURE__*/(
            React.createElement("label", { className: styleName }, this.props.label, /*#__PURE__*/
                React.createElement("input", { name: this.props.name, type: "text", onChange: this.handleChange, required: isrequired })));
    }
}
class SelectOptions extends React.Component {
    constructor(props) {
        super(props);
        this.handleChange = this.handleChange.bind(this);
    }
    handleChange(e) {
        this.props.onChange(e);
    }
    render() {
        let options = this.props.options.map((option, index) => {
            return /*#__PURE__*/React.createElement("option", { key: "option-" + option, value: option }, option);
        });
        return /*#__PURE__*/React.createElement("div", { className: "select" }, /*#__PURE__*/
            React.createElement("label", null, "Select Activity:"), /*#__PURE__*/
            React.createElement("select", { name: "activity", multiple: false, value: this.props.value, onChange: this.handleChange },
                options));
    }
}
class CheckBoxes extends React.Component {
    constructor(props) {
        super(props);
        this.handleChange = this.handleChange.bind(this);
    }
    handleChange(e) {
        this.props.onChange(e);
    }
    render() {
        let checkboxes = this.props.checkBoxes.map(cbox => {
            let checkbox = cbox.split(")");
            return /*#__PURE__*/React.createElement("label", { key: checkbox[0] }, /*#__PURE__*/
                React.createElement("input", {
                    name: checkbox[0], type: "checkbox", value: checkbox[0],
                    onChange: this.handleChange
                }),
                cbox);
        });
        return /*#__PURE__*/React.createElement("div", { className: "needs" }, /*#__PURE__*/
            React.createElement("h4", null, "Check all the apply:"),
            checkboxes);
    }
}
class ListRegistered extends React.Component {
    constructor(props) {
        super(props);
        this.handleChange = this.handleChange.bind(this);
    }
    handleChange(listPos) {
        this.props.onChange(listPos);
    }
    render() {
        let list = this.props.isRegistered.map(reg => {
            if (reg) {
                return /*#__PURE__*/React.createElement("li", { className: "columns", key: reg.listPos }, /*#__PURE__*/
                    React.createElement("div", { className: "column" }, /*#__PURE__*/
                        React.createElement("a", { className: "delete", onClick: () => this.handleChange(reg.listPos) })), /*#__PURE__*/
                    React.createElement("div", { className: "column" },
                        reg.fname), /*#__PURE__*/
                    React.createElement("div", { className: "column" },
                        reg.lname), /*#__PURE__*/
                    React.createElement("div", { className: "column" },
                        reg.activity), /*#__PURE__*/
                    React.createElement("div", { className: "column" },
                        reg.restrictions.sort().join('/')));
            }
        });
        return /*#__PURE__*/(
            React.createElement("ul", { className: "registered-list" },
                list));
    }
}
function Headers(props) {
    return /*#__PURE__*/(
        React.createElement("div", { className: "headers columns" },
            props.headers.map(header => {
                return /*#__PURE__*/(
                    React.createElement("div", { key: header.replace(' ', '-').toLowerCase(), className: "column" }, /*#__PURE__*/
                        React.createElement("h4", null, header)));
            })));
}
class App extends React.Component {
    constructor(props) {
        super(props);
        this.state = {
            checked: false,
            selectOptions: ["Science Lab", "Swimming", "Cooking", "Painting"],
            checkBoxValues: ["a) Dietary Restrictions", "b) Physical Disabilities", "c) Medical Needs"],
            headers: ["Remove", "First Name", "Last Name", "Activity", "Restrictions"],
            fname: '',
            lname: '',
            activity: 'Science Lab',
            restrictions: [],
            isRegistered: [{ // Some sample data we can append to
                listPos: 0,
                fname: 'John',
                lname: 'Smith',
                activity: 'Cooking',
                restrictions: ['-']
            },
            {
                listPos: 1,
                fname: 'Jane',
                lname: 'Doe',
                activity: 'Swimming',
                restrictions: ['a', 'b']
            }]
        };
        this.handleInputChange = this.handleInputChange.bind(this);
        this.handleFormSubmit = this.handleFormSubmit.bind(this);
        this.handleClearForm = this.handleClearForm.bind(this);
        this.handleRemoveItem = this.handleRemoveItem.bind(this);
    }
    handleInputChange(e) {
        const target = e.target;
        if (target.type === 'checkbox') {
            const newSelection = e.target.value;
            let newSelectionArray;
            if (this.state.restrictions.indexOf(newSelection) > -1) {
                newSelectionArray = this.state.restrictions.filter(s => s !== newSelection);
            } else {
                newSelectionArray = [...this.state.restrictions, newSelection];
            }
            this.setState({ restrictions: newSelectionArray });
        } else {
            const name = target.name;
            const value = target.value;
            this.setState({ [name]: value });
        }
    }
    handleFormSubmit(e) {
        e.preventDefault();
        let newlyRegistered, reg = this.state.isRegistered;
        // the following is react best practice of using destructuring vs. push() method
        newlyRegistered = [...reg, {
            listPos: reg.length,
            fname: this.state.fname,
            lname: this.state.lname,
            activity: this.state.activity,
            restrictions: this.state.restrictions ? this.state.restrictions : '-'
        }];
        this.setState({ isRegistered: newlyRegistered });
        this.handleClearForm(e);
    }
    handleClearForm(e) {
        e.preventDefault();
        // reset form fields
        e.currentTarget.reset();
        // reset State
        this.setState({
            fname: '',
            lname: '',
            activity: 'Science Lab',
            restrictions: []
        });
    }
    handleRemoveItem(listPos) {
        let updatedRegList = this.state.isRegistered;
        // remove registered user
        updatedRegList.splice(listPos, 1);
        // update id's
        updatedRegList.map((reg, index) => {
            return reg.listPos = index;
        });
        this.setState({ isRegistered: updatedRegList });
    }
    render() {
        return /*#__PURE__*/(
            React.createElement("div", null, /*#__PURE__*/
                React.createElement("h1", null, "Course Registration"), /*#__PURE__*/
                React.createElement("form", { onSubmit: this.handleFormSubmit }, /*#__PURE__*/
                    React.createElement(ControlledInput, { label: "First Name", name: "fname", inputValue: this.state.fname, onChange: this.handleInputChange, isRequired: true }), /*#__PURE__*/
                    React.createElement(ControlledInput, { label: "Last Name", name: "lname", inputValue: this.state.lname, onChange: this.handleInputChange, isRequired: true }), /*#__PURE__*/
                    React.createElement(SelectOptions, { name: "activity", options: this.state.selectOptions, onChange: this.handleInputChange, isRequired: false }), /*#__PURE__*/
                    React.createElement(CheckBoxes, { checked: this.state.checked, checkBoxes: this.state.checkBoxValues, onChange: this.handleInputChange, isRequired: false }), /*#__PURE__*/
                    React.createElement("button", { className: "button is-info" }, "Submit")), /*#__PURE__*/
                React.createElement("div", { className: "registered" }, /*#__PURE__*/
                    React.createElement("h3", null, "Class Roster"), /*#__PURE__*/
                    React.createElement(Headers, { headers: this.state.headers }), /*#__PURE__*/
                    React.createElement(ListRegistered, { isRegistered: this.state.isRegistered, onChange: this.handleRemoveItem }))));
    }
}
ReactDOM.render( /*#__PURE__*/
    React.createElement(App, null),
    document.getElementById("root"));
<link rel='stylesheet' href='https://cdnjs.cloudflare.com/ajax/libs/bulma/0.6.2/css/bulma.min.css'>
<script src='https://cdnjs.cloudflare.com/ajax/libs/react/16.2.0/umd/react.development.js'></script>
<script src='https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.2.0/umd/react-dom.development.js'></script>
<script src='https://use.fontawesome.com/releases/v5.0.7/js/all.js'></script>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<!-- This script got from frontendfreecode.com -->

<link rel='stylesheet' href='https://cdnjs.cloudflare.com/ajax/libs/bulma/0.6.2/css/bulma.min.css'>
<script src='https://cdnjs.cloudflare.com/ajax/libs/react/16.2.0/umd/react.development.js'></script>
<script src='https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.2.0/umd/react-dom.development.js'></script>
<script src='https://use.fontawesome.com/releases/v5.0.7/js/all.js'></script>
<style>
#root {
    max-width: 950px;
    width: 100%;
    margin: 0 auto;
    padding: 0 2rem;
}
form > *, label {
    display: block;
}
label {
    font-weight: bold;
}
.needs label {
    font-weight: normal;
}
form input  {
    display: block;
    outline: none;
    border: 1px solid #ddd;
    border-radius: 2px;
    margin-bottom: 1rem;
    height: 30px;
    width: 350px;
    padding: calc(.375em - 1px) calc(.625em - 1px);
}
input[type="checkbox"] {
    display: inline-block;
    height: 15px;
    width: 20px;
    margin-bottom: 0;
}
div {
    padding: 0 0 1rem;
}
h1 {
    font-size: 3rem;
    font-weight: 200;
    border-bottom: 4px double #ededed;
    padding: 3rem 0 0.5rem;
    margin-bottom: 2rem;
}
h3 {
    font-size: 1.5rem;
    text-align: center;
    font-weight: 200;
    padding: 1rem;
}
h4, .select label {
    margin: 0;
    font-weight: bold;
}
.select {
    margin-bottom: 2.75rem;
}
select {
    display: block;
    height: 2.5rem;
    width: 350px;
    outline: 0;
    border: 1px solid #ddd;
    border-radius: 0;
    box-shadow: none;
    background-color: transparent;
    cursor: pointer;
    color: rgba(0,0,0,.87);
    padding: 0 1.5rem 0 0;
}
.button {
    width: 200px;
    margin-top: 1rem;
}
.registered {
    margin: 3rem 0;
    border-top: 10px dotted #eee;
    border-bottom: 5px solid #eee;
    padding: 1rem 0;
    text-align: center;
}
.select:not(.is-multiple):not(.is-loading)::after {
    bottom: -10px;
    top: auto;
}
.headers.columns {
    border-bottom: 1px solid #eee;
    border-top: 1px solid #eee;
    padding-bottom: 0;
}
.registered-list .columns {
    margin-bottom: 0;
    padding-bottom: 0;
}
</style>

</head>
<body>
<div id="root"></div><div id="bcl"><a style="font-size:8pt;text-decoration:none;" href="http://www.devanswer.com">Free Frontend</a></div>
<script>
class ControlledInput extends React.Component {
    constructor(props) {
        super(props);
        this.handleChange = this.handleChange.bind(this);
    }
    handleChange(e) {
        this.props.onChange(e);
    }
    render() {
        let styleName = this.props.label.toLowerCase().replace(' ', '-'),
            isrequired = this.props.isRequired ? 'required' : '';
        return /*#__PURE__*/(
            React.createElement("label", { className: styleName }, this.props.label, /*#__PURE__*/
                React.createElement("input", { name: this.props.name, type: "text", onChange: this.handleChange, required: isrequired })));
    }
}
class SelectOptions extends React.Component {
    constructor(props) {
        super(props);
        this.handleChange = this.handleChange.bind(this);
    }
    handleChange(e) {
        this.props.onChange(e);
    }
    render() {
        let options = this.props.options.map((option, index) => {
            return /*#__PURE__*/React.createElement("option", { key: "option-" + option, value: option }, option);
        });
        return /*#__PURE__*/React.createElement("div", { className: "select" }, /*#__PURE__*/
            React.createElement("label", null, "Select Activity:"), /*#__PURE__*/
            React.createElement("select", { name: "activity", multiple: false, value: this.props.value, onChange: this.handleChange },
                options));
    }
}
class CheckBoxes extends React.Component {
    constructor(props) {
        super(props);
        this.handleChange = this.handleChange.bind(this);
    }
    handleChange(e) {
        this.props.onChange(e);
    }
    render() {
        let checkboxes = this.props.checkBoxes.map(cbox => {
            let checkbox = cbox.split(")");
            return /*#__PURE__*/React.createElement("label", { key: checkbox[0] }, /*#__PURE__*/
                React.createElement("input", {
                    name: checkbox[0], type: "checkbox", value: checkbox[0],
                    onChange: this.handleChange
                }),
                cbox);
        });
        return /*#__PURE__*/React.createElement("div", { className: "needs" }, /*#__PURE__*/
            React.createElement("h4", null, "Check all the apply:"),
            checkboxes);
    }
}
class ListRegistered extends React.Component {
    constructor(props) {
        super(props);
        this.handleChange = this.handleChange.bind(this);
    }
    handleChange(listPos) {
        this.props.onChange(listPos);
    }
    render() {
        let list = this.props.isRegistered.map(reg => {
            if (reg) {
                return /*#__PURE__*/React.createElement("li", { className: "columns", key: reg.listPos }, /*#__PURE__*/
                    React.createElement("div", { className: "column" }, /*#__PURE__*/
                        React.createElement("a", { className: "delete", onClick: () => this.handleChange(reg.listPos) })), /*#__PURE__*/
                    React.createElement("div", { className: "column" },
                        reg.fname), /*#__PURE__*/
                    React.createElement("div", { className: "column" },
                        reg.lname), /*#__PURE__*/
                    React.createElement("div", { className: "column" },
                        reg.activity), /*#__PURE__*/
                    React.createElement("div", { className: "column" },
                        reg.restrictions.sort().join('/')));
            }
        });
        return /*#__PURE__*/(
            React.createElement("ul", { className: "registered-list" },
                list));
    }
}
function Headers(props) {
    return /*#__PURE__*/(
        React.createElement("div", { className: "headers columns" },
            props.headers.map(header => {
                return /*#__PURE__*/(
                    React.createElement("div", { key: header.replace(' ', '-').toLowerCase(), className: "column" }, /*#__PURE__*/
                        React.createElement("h4", null, header)));
            })));
}
class App extends React.Component {
    constructor(props) {
        super(props);
        this.state = {
            checked: false,
            selectOptions: ["Science Lab", "Swimming", "Cooking", "Painting"],
            checkBoxValues: ["a) Dietary Restrictions", "b) Physical Disabilities", "c) Medical Needs"],
            headers: ["Remove", "First Name", "Last Name", "Activity", "Restrictions"],
            fname: '',
            lname: '',
            activity: 'Science Lab',
            restrictions: [],
            isRegistered: [{ // Some sample data we can append to
                listPos: 0,
                fname: 'John',
                lname: 'Smith',
                activity: 'Cooking',
                restrictions: ['-']
            },
            {
                listPos: 1,
                fname: 'Jane',
                lname: 'Doe',
                activity: 'Swimming',
                restrictions: ['a', 'b']
            }]
        };
        this.handleInputChange = this.handleInputChange.bind(this);
        this.handleFormSubmit = this.handleFormSubmit.bind(this);
        this.handleClearForm = this.handleClearForm.bind(this);
        this.handleRemoveItem = this.handleRemoveItem.bind(this);
    }
    handleInputChange(e) {
        const target = e.target;
        if (target.type === 'checkbox') {
            const newSelection = e.target.value;
            let newSelectionArray;
            if (this.state.restrictions.indexOf(newSelection) > -1) {
                newSelectionArray = this.state.restrictions.filter(s => s !== newSelection);
            } else {
                newSelectionArray = [...this.state.restrictions, newSelection];
            }
            this.setState({ restrictions: newSelectionArray });
        } else {
            const name = target.name;
            const value = target.value;
            this.setState({ [name]: value });
        }
    }
    handleFormSubmit(e) {
        e.preventDefault();
        let newlyRegistered, reg = this.state.isRegistered;
        // the following is react best practice of using destructuring vs. push() method
        newlyRegistered = [...reg, {
            listPos: reg.length,
            fname: this.state.fname,
            lname: this.state.lname,
            activity: this.state.activity,
            restrictions: this.state.restrictions ? this.state.restrictions : '-'
        }];
        this.setState({ isRegistered: newlyRegistered });
        this.handleClearForm(e);
    }
    handleClearForm(e) {
        e.preventDefault();
        // reset form fields
        e.currentTarget.reset();
        // reset State
        this.setState({
            fname: '',
            lname: '',
            activity: 'Science Lab',
            restrictions: []
        });
    }
    handleRemoveItem(listPos) {
        let updatedRegList = this.state.isRegistered;
        // remove registered user
        updatedRegList.splice(listPos, 1);
        // update id's
        updatedRegList.map((reg, index) => {
            return reg.listPos = index;
        });
        this.setState({ isRegistered: updatedRegList });
    }
    render() {
        return /*#__PURE__*/(
            React.createElement("div", null, /*#__PURE__*/
                React.createElement("h1", null, "Course Registration"), /*#__PURE__*/
                React.createElement("form", { onSubmit: this.handleFormSubmit }, /*#__PURE__*/
                    React.createElement(ControlledInput, { label: "First Name", name: "fname", inputValue: this.state.fname, onChange: this.handleInputChange, isRequired: true }), /*#__PURE__*/
                    React.createElement(ControlledInput, { label: "Last Name", name: "lname", inputValue: this.state.lname, onChange: this.handleInputChange, isRequired: true }), /*#__PURE__*/
                    React.createElement(SelectOptions, { name: "activity", options: this.state.selectOptions, onChange: this.handleInputChange, isRequired: false }), /*#__PURE__*/
                    React.createElement(CheckBoxes, { checked: this.state.checked, checkBoxes: this.state.checkBoxValues, onChange: this.handleInputChange, isRequired: false }), /*#__PURE__*/
                    React.createElement("button", { className: "button is-info" }, "Submit")), /*#__PURE__*/
                React.createElement("div", { className: "registered" }, /*#__PURE__*/
                    React.createElement("h3", null, "Class Roster"), /*#__PURE__*/
                    React.createElement(Headers, { headers: this.state.headers }), /*#__PURE__*/
                    React.createElement(ListRegistered, { isRegistered: this.state.isRegistered, onChange: this.handleRemoveItem }))));
    }
}
ReactDOM.render( /*#__PURE__*/
    React.createElement(App, null),
    document.getElementById("root"));
</script>

</body>
</html>
Preview