import React, { PropTypes } from 'react'; import { contain } from 'thundercats-react'; import debugFactory from 'debug'; import { getDefaults } from '../utils'; import { inHTMLData, uriInSingleQuotedAttr } from 'xss-filters'; import { Button, Col, Input, Row, Well } from 'react-bootstrap'; import { isAscii, isEmail, isMobilePhone, isURL } from 'validator'; const debug = debugFactory('freecc:jobs:newForm'); const checkValidity = [ 'position', 'locale', 'description', 'email', 'phone', 'url', 'logo', 'name', 'highlight' ]; export default contain({ actions: 'jobActions', store: 'jobsStore', map({ form = {} }) { const { position = getDefaults('string'), locale = getDefaults('string'), description = getDefaults('string'), email = getDefaults('string'), phone = getDefaults('string'), url = getDefaults('string'), logo = getDefaults('string'), name = getDefaults('string'), highlight = getDefaults('bool') } = form; return { position, locale, description, email, phone, url, logo, name, highlight }; }, subscribeOnWillMount() { return typeof window !== 'undefined'; } }, React.createClass({ displayName: 'NewJob', propTypes: { jobActions: PropTypes.object, position: PropTypes.object, locale: PropTypes.object, description: PropTypes.object, email: PropTypes.object, phone: PropTypes.object, url: PropTypes.object, logo: PropTypes.object, name: PropTypes.object, highlight: PropTypes.object }, handleSubmit(e) { e.preventDefault(); let valid = true; checkValidity.forEach((prop) => { // if value exist, check if it is valid if (this.props[prop].value) { valid = valid && !!this.props[prop].valid; } }); if (!valid) { debug('form not valid'); return; } const { position, locale, description, email, phone, url, logo, name, highlight, jobActions } = this.props; // sanitize user output const jobValues = { position: inHTMLData(position.value), location: inHTMLData(locale.value), description: inHTMLData(description.value), email: inHTMLData(email.value), phone: inHTMLData(phone.value), url: uriInSingleQuotedAttr(url.value), logo: uriInSingleQuotedAttr(logo.value), name: inHTMLData(name.value), highlight: !!highlight.value }; const job = Object.keys(jobValues).reduce((accu, prop) => { if (jobValues[prop]) { accu[prop] = jobValues[prop]; } return accu; }, {}); debug('job sanitized', job); jobActions.saveForm(job); }, componentDidMount() { const { jobActions } = this.props; jobActions.getSavedForm(); }, handleChange(name, validator, { target: { value } }) { const { jobActions: { handleForm } } = this.props; handleForm({ name, value, validator }); }, render() { const { position, locale, description, email, phone, url, logo, name, highlight } = this.props; const labelClass = 'col-sm-offset-1 col-sm-2'; const inputClass = 'col-sm-6'; return (