Skip to content
This repository has been archived by the owner on May 28, 2018. It is now read-only.

Commit

Permalink
Refactor PEPITE selection components to query API instead of static file
Browse files Browse the repository at this point in the history
  • Loading branch information
nbrohee committed Feb 27, 2017
1 parent 70d5ba9 commit 3aa3e1b
Show file tree
Hide file tree
Showing 8 changed files with 278 additions and 263 deletions.
22 changes: 22 additions & 0 deletions client/src/actions/pepiteActions.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import * as types from './actionTypes'
import pepiteApi from '../api/pepiteApi'

export function loadPepiteSuccess(pepite) {
return { type: types.LOAD_PEPITE_SUCCESS, pepite }
Expand All @@ -8,3 +9,24 @@ export function updatePepite(pepite) {
return { type: types.UPDATE_PEPITE, pepite }
}

export function getRegions() {
return (dispatch, getState) => {
return pepiteApi.getRegions()
}
}

export function getEstablishments(regionId) {
return (dispatch, getState) => {
return pepiteApi.getEstablishments(regionId)
}
}

export function getPepites(regionId, pepiteId) {
return (dispatch, getState) => {
if (pepiteId) {
return [pepiteApi.getPepite(pepiteId)]
} else {
return pepiteApi.getPepites(regionId)
}
}
}
33 changes: 33 additions & 0 deletions client/src/api/pepiteApi.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
import axios from 'axios'

class pepiteApi {
static getRegions() {
return axios.get('/region/')
.then((res) => {
return res.data
})
}

static getEstablishments(regionId) {
return axios.get(`/region/${regionId}/establishment`)
.then((res) => {
return res.data
})
}

static getPepites(regionId) {
return axios.get(`/region/${regionId}/pepite`)
.then((res) => {
return res.data
})
}

static getPepite(pepiteId) {
return axios.get(`/pepite/${pepiteId}`)
.then((res) => {
return res.data
})
}
}

export default pepiteApi
63 changes: 63 additions & 0 deletions client/src/components/application/Pepite/EstablishmentSelect.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
import React, { PropTypes } from 'react'
import { FormGroup, ControlLabel } from 'react-bootstrap'
import ValidatedFormControl from '../../common/ValidatedFormControl'
import { getCurrentYear } from '../../common/yearHelper'
import pepiteApi from '../../../api/pepiteApi'

class EstablishmentSelect extends React.Component {
constructor(props, context) {
super(props, context)
this.state = {
establishments: []
}
this.onEstablishementSelect = this.onEstablishementSelect.bind(this)
if (this.props.selectedRegion) {
this.loadEstablishements(this.props.selectedRegion)
}
}

componentWillReceiveProps(nextProps) {
if (this.props.selectedRegion != nextProps.selectedRegion) {
this.loadEstablishements(nextProps.selectedRegion)
}
}

loadEstablishements(regionId) {
pepiteApi.getEstablishments(regionId).then(establishments => {
this.setState({ establishments })
})
}

onEstablishementSelect(event) {
const establishment = this.state.establishments.find((e) => (e._id == event.target.value))
this.props.onEstablishementChange(establishment)
}

render() {
if (this.props.isStudent && this.props.selectedRegion) {
return (
<FormGroup>
<ControlLabel>Mon établissement pour l'année {getCurrentYear()}</ControlLabel>
<ValidatedFormControl name="establishment" componentClass="select" onChange={this.onEstablishementSelect} value={this.props.selectedEstablishment}>
<option value={0} disabled>Sélectionner</option>
{this.state.establishments.map((establishment) => {
return (<option key={establishment._id} value={establishment._id}>{establishment.name}</option>)
})}
</ValidatedFormControl>
</FormGroup>
)
} else {
return null
}
}
}

EstablishmentSelect.propTypes = {
selectedRegion: PropTypes.string.isRequired,
selectedEstablishment: PropTypes.string.isRequired,
isStudent: PropTypes.bool.isRequired,
onEstablishementChange: PropTypes.func.isRequired,
errors: PropTypes.object,
}

export default EstablishmentSelect
96 changes: 29 additions & 67 deletions client/src/components/application/Pepite/PepiteForm.js
Original file line number Diff line number Diff line change
@@ -1,77 +1,37 @@
import React, {PropTypes} from 'react'
import React, { PropTypes } from 'react'
import { FormGroup, ControlLabel, FormControl, Radio, HelpBlock, Panel } from 'react-bootstrap'
import RadioGroup from '../../common/RadioGroup'
import ValidatedFormControl from '../../common/ValidatedFormControl'
import {regions, pepites, establishments} from './pepiteEstablishmentMap'
import { regions, pepites, establishments } from './pepiteEstablishmentMap'
import RegionSelect from './RegionSelect'
import EstablishmentSelect from './EstablishmentSelect'
import PepiteSelect from './PepiteSelect'

function getPepiteFromEstablishment(establishmentId) {
return ({
'id': establishments[establishmentId].pepite ,
'name': pepites[establishments[establishmentId].pepite]
})
}

function getAllValidPepites(regionId, establishmentId) {
if (establishmentId >= 0) {
return ([getPepiteFromEstablishment(establishmentId)])
}
if (regionId >= 0) {
return deleteDuplicate((regions[regionId].establishments.map(getPepiteFromEstablishment)))
}
return []
}

function deleteDuplicate(array) {
return array.filter(function(item, pos) {
return array.findIndex(i => i.id == item.id) == pos
})
}

function isOverduePepite(idPepite) {
return (false)
}

const PepiteForm = ({pepite, contact, errors, onChange}) => {
const PepiteForm = ({pepite, contact, errors, onChange, onEstablishmentChange, regions}) => {
return (
<form>
<RegionSelect
selectedRegion={pepite.region}
onChange={onChange}
errors={errors} />
<EstablishmentSelect
selectedRegion={pepite.region}
selectedEstablishment={pepite.establishment}
isStudent={contact.situation == 'student'}
onEstablishementChange={onEstablishmentChange}
errors={errors} />
<PepiteSelect
selectedRegion={pepite.region}
selectedPepite={pepite.pepite}
onChange={onChange}
errors={errors} />
<FormGroup className="required">
<ControlLabel>Ma région</ControlLabel>
<ValidatedFormControl name="region" componentClass="select" onChange={onChange} value={pepite.region} error={errors.region}>
<option value="0" disabled>Sélectionner</option>
{regions.map((region, index) => { return (<option key={index + 1} value={index + 1}>{region.name}</option>) }) }
</ValidatedFormControl>
<ControlLabel>Je demande un accès à l'espace de coworking PEPITE (selon disponibilité)</ControlLabel>
<RadioGroup name="askCoworking" onChange={onChange} selectedValue={pepite.askCoworking} error={errors.askCoworking}>
<Radio value="true">oui</Radio>
<Radio value="false">non</Radio>
</RadioGroup>
</FormGroup>
{(() => {
if (pepite.region != 0) {
return(
<FormGroup className={(contact.situation == 'graduate') ? 'hidden' : ''}>
<ControlLabel>Mon établissement pour l'année 2016</ControlLabel>
<ValidatedFormControl name="establishment" componentClass="select" onChange={onChange} value={pepite.establishment}>
<option value="0" disabled>Sélectionner</option>
{regions[pepite.region - 1].establishments.map((eid) => { return (<option key={eid + 1} value={eid + 1}>{establishments[eid].name}</option>) }) }
</ValidatedFormControl>
</FormGroup>
)
}})()}
{(() => {
if (pepite.region != 0) {
return(
<FormGroup className="required">
<ControlLabel>Mon PEPITE</ControlLabel>
<ValidatedFormControl name="pepite" componentClass="select" onChange={onChange} value={pepite.pepite} error={errors.pepite}>
<option value="0" disabled>Sélectionner</option>
{getAllValidPepites(pepite.region - 1, pepite.establishment - 1).map((pepite, index) => { return (<option key={index + 1} value={pepite.id + 1}>PEPITE {pepite.name}</option>) }) }
</ValidatedFormControl>
</FormGroup>
)
}})()}
<FormGroup className="required">
<ControlLabel>Je demande un accès à l'espace de coworking PEPITE (selon disponibilité)</ControlLabel>
<RadioGroup name="askCoworking" onChange={onChange} selectedValue={pepite.askCoworking} error={errors.askCoworking}>
<Radio value="true">oui</Radio>
<Radio value="false">non</Radio>
</RadioGroup>
</FormGroup>
</form>
)
}
Expand All @@ -80,7 +40,9 @@ PepiteForm.propTypes = {
pepite: PropTypes.object.isRequired,
contact: PropTypes.object.isRequired,
onChange: PropTypes.func.isRequired,
errors: PropTypes.object
onEstablishmentChange: PropTypes.func.isRequired,
errors: PropTypes.object,
regions: PropTypes.array.isRequired
}

export default PepiteForm
33 changes: 26 additions & 7 deletions client/src/components/application/Pepite/PepitePage.js
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
import React, {PropTypes} from 'react'
import React, { PropTypes } from 'react'
import PepiteForm from './PepiteForm'
import {connect} from 'react-redux'
import {bindActionCreators} from 'redux'
import { connect } from 'react-redux'
import { bindActionCreators } from 'redux'
import * as pepiteActions from '../../../actions/pepiteActions'
import * as errorsActions from '../../../actions/errorsActions'
import Validation from '../../common/Validation'
import {pepiteValidationConstraints} from './PepiteValidationConstraints'
import { pepiteValidationConstraints } from './PepiteValidationConstraints'

class PepitePage extends React.Component {
constructor(props, context) {
Expand All @@ -14,8 +14,12 @@ class PepitePage extends React.Component {
pepite: Object.assign({}, props.pepite),
contact: Object.assign({}, props.contact),
errors: Object.assign({}, props.errors),
regions: [],
establishments: [],
pepites: []
}
this.updatePepiteState = this.updatePepiteState.bind(this)
this.updateEstablishment = this.updateEstablishment.bind(this)
this.pepiteValidation = new Validation(pepiteValidationConstraints)
}

Expand All @@ -27,16 +31,26 @@ class PepitePage extends React.Component {

updatePepiteState(event) {
const field = event.target.name
let pepite = this.state.pepite
const pepite = this.state.pepite
pepite[field] = event.target.value
if (field == 'region') {
pepite.establishment = 0
pepite.establishment = '0'
pepite.pepite = '0'
}
this.validatePepiteField(field, event.target.value)
this.props.actions.updatePepite(pepite)
return this.setState({ pepite })
}

updateEstablishment(establishment) {
const pepite = this.state.pepite
pepite.establishment = establishment._id.toString()
pepite.pepite = establishment.pepite.toString()
this.validatePepiteField('pepite', pepite.pepite)
this.props.actions.updatePepite(pepite)
return this.setState({ pepite })
}

validatePepiteField(field, value) {
const errors = Object.assign({}, this.state.errors)
errors[field] = this.pepiteValidation.validateField(field, value)
Expand All @@ -53,7 +67,12 @@ class PepitePage extends React.Component {
pepite={this.state.pepite}
contact={this.state.contact}
onChange={this.updatePepiteState}
errors={this.state.errors}/>
onEstablishmentChange={this.updateEstablishment}
errors={this.state.errors}
regions={this.state.regions}
establishments={this.state.establishments}
pepites={this.state.pepites}
/>
)
}
}
Expand Down
65 changes: 65 additions & 0 deletions client/src/components/application/Pepite/PepiteSelect.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
import React, { PropTypes } from 'react'
import { FormGroup, ControlLabel } from 'react-bootstrap'
import ValidatedFormControl from '../../common/ValidatedFormControl'
import { getCurrentYear } from '../../common/yearHelper'
import pepiteApi from '../../../api/pepiteApi'

class PepiteSelect extends React.Component {
constructor(props, context) {
super(props, context)
this.state = {
pepites: []
}
if (this.props.selectedRegion) {
this.loadPepites(this.props.selectedRegion, this.props.selectedPepite)
}
}

componentWillReceiveProps(nextProps) {
if ((this.props.selectedRegion != nextProps.selectedRegion) ||
(this.props.selectedPepite != nextProps.selectedPepite)) {
this.loadPepites(nextProps.selectedRegion, nextProps.selectedPepite)
}
}

loadPepites(regionId, pepiteId) {
if (pepiteId && pepiteId != '0') {
pepiteApi.getPepite(pepiteId).then(pepite => {
this.setState({ pepites: [pepite] })
})
} else {
pepiteApi.getPepites(regionId).then(pepites => {
this.setState({ pepites })
})
}
}

isComponentVisible() {
return (this.props.selectedRegion)
}

render() {
if (this.isComponentVisible()) {
return (
<FormGroup className="required">
<ControlLabel>Mon PEPITE</ControlLabel>
<ValidatedFormControl name="pepite" componentClass="select" onChange={this.props.onChange} value={this.props.selectedPepite} error={this.props.errors.pepite}>
<option value={0} disabled>Sélectionner</option>
{this.state.pepites.map((pepite) => { return (<option key={pepite._id} value={pepite._id}>PEPITE {pepite.name}</option>) })}
</ValidatedFormControl>
</FormGroup>
)
} else {
return null
}
}
}

PepiteSelect.propTypes = {
selectedRegion: PropTypes.string.isRequired,
selectedPepite: PropTypes.string.isRequired,
onChange: PropTypes.func.isRequired,
errors: PropTypes.object,
}

export default PepiteSelect
Loading

0 comments on commit 3aa3e1b

Please sign in to comment.