diff options
| author | Luc Donnet | 2018-01-12 16:05:47 +0100 | 
|---|---|---|
| committer | GitHub | 2018-01-12 16:05:47 +0100 | 
| commit | 080312234fc784268eb6e9313d358099c783366b (patch) | |
| tree | aa3e4bd0c30b925498b9ca4f6137a2a14d7b6717 | |
| parent | 18078e529cb406fe94817a43fc32f280ecbf30df (diff) | |
| parent | 84f3edcfc7213d5a02f10ba002e091e1563f2e27 (diff) | |
| download | chouette-core-080312234fc784268eb6e9313d358099c783366b.tar.bz2 | |
Merge pull request #224 from af83/5529-prevent-double-submitting-of-react-forms
5529 Prevent double submitting of react forms
3 files changed, 68 insertions, 55 deletions
| diff --git a/app/javascript/helpers/save_button.js b/app/javascript/helpers/save_button.js new file mode 100644 index 000000000..7e0bd5bbe --- /dev/null +++ b/app/javascript/helpers/save_button.js @@ -0,0 +1,47 @@ +import React, { PropTypes, Component } from 'react' + +export default class SaveButton extends Component{ +  constructor(props){ +    super(props) +  } + +  btnDisabled(){ +    return !this.props.status.fetchSuccess || this.props.status.isFetching +  } + +  btnClass(){ +    let className = ['btn btn-default'] +    if(this.btnDisabled()){ +      className.push('disabled') +    } +    return className.join(' ') +  } + +  render() { +    if (!this.hasPolicy()) { +      return false +    }else{ +      return ( +        <div className='row mt-md'> +          <div className='col-lg-12 text-right'> +            <form className={this.formClassName() + ' formSubmitr ml-xs'} onSubmit={e => {e.preventDefault()}}> +              <div className="btn-group sticky-actions"> +                <button +                  className={this.btnClass()} +                  type='button' +                  disabled={this.btnDisabled()} +                  onClick={e => { +                    e.preventDefault() +                    this.props.editMode ? this.submitForm() : this.props.onEnterEditMode() +                  }} +                > +                  {this.props.editMode ? "Valider" : "Editer"} +                </button> +              </div> +            </form> +          </div> +        </div> +      ) +    } +  } +} diff --git a/app/javascript/journey_patterns/components/SaveJourneyPattern.js b/app/javascript/journey_patterns/components/SaveJourneyPattern.js index 7e4492e0e..4bb6a73a0 100644 --- a/app/javascript/journey_patterns/components/SaveJourneyPattern.js +++ b/app/javascript/journey_patterns/components/SaveJourneyPattern.js @@ -1,35 +1,19 @@  import React, { Component } from 'react'  import PropTypes from 'prop-types' +import SaveButton from '../../helpers/save_button'  import actions from '../actions' -export default class SaveJourneyPattern extends Component { -  constructor(props){ -    super(props) +export default class SaveJourneyPattern extends SaveButton { +  hasPolicy(){ +    return this.props.status.policy['journey_patterns.update'] == true    } -  render() { -    if(this.props.status.policy['journey_patterns.update'] == false) { -      return false -    }else{ -      return ( -        <div className='row mt-md'> -          <div className='col-lg-12 text-right'> -            <form className='jp_collection formSubmitr ml-xs' onSubmit={e => {e.preventDefault()}}> -              <button -                className='btn btn-default' -                type='button' -                onClick={e => { -                  e.preventDefault() -                  this.props.editMode ? this.props.onSubmitJourneyPattern(this.props.dispatch, this.props.journeyPatterns) : this.props.onEnterEditMode() -                }} -                > -                {this.props.editMode ? "Valider" : "Editer"} -              </button> -            </form> -          </div> -        </div> -      ) -    } +  formClassName(){ +    return 'jp_collection' +  } + +  submitForm(){ +    this.props.onSubmitJourneyPattern(this.props.dispatch, this.props.journeyPatterns)    }  } @@ -37,4 +21,4 @@ SaveJourneyPattern.propTypes = {    journeyPatterns: PropTypes.array.isRequired,    status: PropTypes.object.isRequired,    page: PropTypes.number.isRequired -}
\ No newline at end of file +} diff --git a/app/javascript/vehicle_journeys/components/SaveVehicleJourneys.js b/app/javascript/vehicle_journeys/components/SaveVehicleJourneys.js index c5161b917..6e94b04a3 100644 --- a/app/javascript/vehicle_journeys/components/SaveVehicleJourneys.js +++ b/app/javascript/vehicle_journeys/components/SaveVehicleJourneys.js @@ -1,37 +1,19 @@  import React, { Component } from 'react'  import PropTypes from 'prop-types' +import SaveButton from '../../helpers/save_button'  import actions from '../actions' -export default class SaveVehicleJourneys extends Component{ -  constructor(props){ -    super(props) +export default class SaveVehicleJourneys extends SaveButton{ +  hasPolicy(){ +    return this.props.filters.policy['vehicle_journeys.update'] == true    } -  render() { -    if (this.props.filters.policy['vehicle_journeys.update'] == false) { -      return false -    }else{ -      return ( -        <div className='row mt-md'> -          <div className='col-lg-12 text-right'> -            <form className='vehicle_journeys formSubmitr ml-xs' onSubmit={e => {e.preventDefault()}}> -              <div className="btn-group sticky-actions"> -                <button -                  className={'btn btn-default' + (this.props.status.fetchSuccess ? '' : ' disabled')} -                  type='button' -                  onClick={e => { -                    e.preventDefault() -                    this.props.editMode ? this.props.onSubmitVehicleJourneys(this.props.dispatch, this.props.vehicleJourneys) : this.props.onEnterEditMode() -                  }} -                > -                  {this.props.editMode ? "Valider" : "Editer"} -                </button> -              </div> -            </form> -          </div> -        </div> -      ) -    } +  formClassName(){ +    return 'vehicle_journeys' +  } + +  submitForm(){ +    this.props.onSubmitVehicleJourneys(this.props.dispatch, this.props.vehicleJourneys)    }  } | 
