@teikei/map
Version:
Teikei map SPA component. Teikei is the software that powers ernte-teilen.org, a website that maps out Community-supported Agriculture in Germany.
268 lines (243 loc) • 6.94 kB
JavaScript
import React from 'react'
import PropTypes from 'prop-types'
import { Field, Fields, reduxForm } from 'redux-form'
import _ from 'lodash'
import Geocoder from '../../Search/GeocoderSearchContainer'
import InputField from '../../../components/InputField/index'
import TextAreaField from '../../../components/TextAreaField/index'
import CheckboxGroup from '../../../components/CheckboxGroup/index'
import UserInfo from './UserInfo'
import { validator } from '../../../common/formUtils'
import i18n from '../../../i18n'
const FarmForm = ({ handleSubmit, user, error, products }) => (
<form className="form-inputs">
<strong>{error}</strong>
<fieldset>
<legend>Name und Beschreibung des Betriebs</legend>
<Field
name="name"
label="Name des Betriebs"
component={InputField}
type="text"
maxLength="100"
required
/>
<Field
name="url"
label="Website"
component={InputField}
placeholder="http://beispiel.de"
type="url"
maxLength="100"
/>
<Field
name="description"
label="Beschreibung des Betriebs"
component={TextAreaField}
maxLength="1000"
placeholder="z.B. Informationen zum Hintergrund, zu den BetreiberInnen oder zur Geschichte des Betriebs."
rows="8"
/>
<Fields
names={['city', 'address', 'latitude', 'longitude']}
name="geocoder"
label="Adresse und Ort"
markerIcon="Farm"
component={Geocoder}
required
/>
</fieldset>
<fieldset>
<legend>Lebensmittelangebot</legend>
{/* TODO load products from API */}
{products &&
_.uniq(products.map(allProducts => allProducts.category)).map(
category => (
<div key={category}>
<Field
name="products"
groupLabel={i18n.t(`productcategories.${category}`)}
component={CheckboxGroup}
options={products
.filter(p => p.category === category)
.map(p => ({
name: p.id,
label: i18n.t(`products.${p.name}`)
}))}
/>
</div>
)
)}
<Field
name="additionalProductInformation"
label="Zusätzliche Informationen zum Lebensmittelangebot"
component={TextAreaField}
maxLength="1000"
placeholder="z.B. Informationen zu besonderen Sorten, Sonderkulturen, verarbeiteten Lebensmitteln o.ä."
rows="6"
/>
</fieldset>
<fieldset>
<legend>Wirtschaftsweise</legend>
<Field
name="actsEcological"
label="Wir wirtschaften biologisch"
component={InputField}
type="checkbox"
/>
<label htmlFor="economical_behavior">
Erläuterungen zur Wirtschaftsweise
</label>
<Field
name="economicalBehavior"
component="textarea"
type="text"
maxLength="1000"
placeholder="z.B. Mitgliedschaft in Anbauverbänden o.ä."
rows="6"
/>
<label htmlFor="foundedAtYear">Solawi seit (Jahr)</label>
<Field
name="foundedAtYear"
component="select"
type="text"
normalize={v => Number(v)}
>
{[<option key={0} />].concat(
new Array(100)
.fill(undefined)
.reverse()
.map((val, i) => {
const year = new Date().getFullYear() - i
return <option key={year}>{year}</option>
})
)}
</Field>
<label htmlFor="foundedAtMonth">Solawi seit (Monat)</label>
<Field
name="foundedAtMonth"
component="select"
type="number"
normalize={v => Number(v)}
>
<option key={0} value="" />
<option key={1} value={1}>
Januar
</option>
<option key={2} value={2}>
Februar
</option>
<option key={3} value={3}>
März
</option>
<option key={4} value={4}>
April
</option>
<option key={5} value={5}>
Mai
</option>
<option key={6} value={6}>
Juni
</option>
<option key={7} value={7}>
Juli
</option>
<option key={8} value={8}>
August
</option>
<option key={9} value={9}>
September
</option>
<option key={10} value={10}>
Oktober
</option>
<option key={11} value={11}>
November
</option>
<option key={12} value={12}>
Dezember
</option>
</Field>
</fieldset>
<fieldset>
<legend>Mitgliedschaft</legend>
<label htmlFor="acceptsNewMembers">Habt ihr derzeit freie Plätze?</label>
<ul
className="form-checkbox-group"
id="acceptsNewMembers"
name="acceptsNewMembers"
>
<li>
<Field
name="acceptsNewMembers"
value="yes"
label="Wir haben freie Plätze"
component={InputField}
type="radio"
/>
</li>
<li>
<Field
name="acceptsNewMembers"
value="no"
label="Wir haben keine freien Plätze"
component={InputField}
type="radio"
/>
</li>
<li>
<Field
name="acceptsNewMembers"
value="waitlist"
label="Wir haben keine freien Plätze, aber eine Warteliste"
component={InputField}
type="radio"
/>
</li>
</ul>
<label htmlFor="maximumMembers">Maximale Mitgliederzahl</label>
<Field
name="maximumMembers"
component="input"
type="number"
normalize={v => Number(v)}
/>
<div className="entries-editor-explanation">
Wieviele Esser kann der Betrieb versorgen?
</div>
<label htmlFor="participation">
Wie können sich die Mitglieder einbringen?
</label>
<Field
name="participation"
component="textarea"
type="text"
maxLength="1000"
rows="8"
/>
</fieldset>
<UserInfo user={user} />
<div className="entries-editor-explanation">
<p>Mit einem * gekennzeichneten Felder müssen ausgefüllt werden.</p>
<input
type="button"
className="button submit"
value="Speichern"
onClick={handleSubmit}
/>
</div>
</form>
)
FarmForm.propTypes = {
handleSubmit: PropTypes.func.isRequired,
user: PropTypes.shape().isRequired,
error: PropTypes.string,
products: PropTypes.array.isRequired
}
FarmForm.defaultProps = {
error: ''
}
export default reduxForm({
form: 'farm',
validate: validator('farm')
})(FarmForm)