diff options
7 files changed, 93 insertions, 23 deletions
diff --git a/app/assets/javascripts/es6_browserified/vehicle_journeys/actions/index.js b/app/assets/javascripts/es6_browserified/vehicle_journeys/actions/index.js index a2a363d6e..a80a96925 100644 --- a/app/assets/javascripts/es6_browserified/vehicle_journeys/actions/index.js +++ b/app/assets/javascripts/es6_browserified/vehicle_journeys/actions/index.js @@ -39,6 +39,9 @@ const actions = {    openShiftModal : () => ({      type : 'SHIFT_VEHICLEJOURNEY_MODAL'    }), +  openDuplicateModal : () => ({ +    type : 'DUPLICATE_VEHICLEJOURNEY_MODAL' +  }),    selectVehicleJourney : (index) => ({      type : 'SELECT_VEHICLEJOURNEY',      index @@ -51,8 +54,9 @@ const actions = {      type: 'SHIFT_VEHICLEJOURNEY',      data    }), -  duplicateVehicleJourneys : (data) => ({ -    type: 'DUPLICATE_VEHICLEJOURNEY' +  duplicateVehicleJourney : (data) => ({ +    type: 'DUPLICATE_VEHICLEJOURNEY', +    data    }),    deleteVehicleJourneys : () => ({      type: 'DELETE_VEHICLEJOURNEYS' diff --git a/app/assets/javascripts/es6_browserified/vehicle_journeys/components/tools/DuplicateVehicleJourney.js b/app/assets/javascripts/es6_browserified/vehicle_journeys/components/tools/DuplicateVehicleJourney.js index adad22aa1..3e0ff627e 100644 --- a/app/assets/javascripts/es6_browserified/vehicle_journeys/components/tools/DuplicateVehicleJourney.js +++ b/app/assets/javascripts/es6_browserified/vehicle_journeys/components/tools/DuplicateVehicleJourney.js @@ -24,7 +24,7 @@ class DuplicateVehicleJourney extends Component {        return (          <div  className='pull-left'>            <button -            disabled= {(actions.getSelected(this.props.vehicleJourneys).length > 0) ? false : true} +            disabled= {(actions.getSelected(this.props.vehicleJourneys).length == 1) ? false : true}              type='button'              className='btn btn-primary btn-sm'              data-toggle='modal' @@ -34,32 +34,34 @@ class DuplicateVehicleJourney extends Component {              <span className='fa fa-files-o'></span>              </button> -            <div className={ 'modal fade ' + ((this.props.modal.type == 'shift') ? 'in' : '') } id='DuplicateVehicleJourneyModal'> +            <div className={ 'modal fade ' + ((this.props.modal.type == 'duplicate') ? 'in' : '') } id='DuplicateVehicleJourneyModal'>                <div className='modal-dialog'>                  <div className='modal-content'>                    <div className='modal-header clearfix'>                      <h4>Mettre à jour une course</h4>                    </div> -                  {(this.props.modal.type == 'shift') && ( +                  {(this.props.modal.type == 'duplicate') && (                      <form>                        <div className='modal-body'>                          <div className='form-group'> -                          <label className='control-label is-required'>Mettre à jour les horaires de la course</label> -                          <select -                            ref='objectid' -                            className='form-control' -                            onKeyDown={(e) => actions.resetValidation(e.currentTarget)} -                            required -                            > -                            {this.props.vehicleJourneys.map((vj, i) => -                              <option -                                key = {i} -                                value = {vj.objectid}> -                                {vj.objectid} -                              </option> -                            )} -                          </select> +                          <span>Dupliquer les horaires de la course suivante : {actions.getSelected(this.props.vehicleJourneys)[0].objectid}</span> +                        </div> +                        <div className='row'> +                          <div className='col-lg-6 col-md-6 col-sm-6 col-xs-6'> +                            <div className='form-group'> +                              <label className='control-label is-required'>Nombre de courses à créer et dupliquer</label> +                              <input +                                type='number' +                                ref='duplicate_number' +                                min='1' +                                max='20' +                                className='form-control' +                                onKeyDown={(e) => actions.resetValidation(e.currentTarget)} +                                required +                                /> +                            </div> +                          </div>                          </div>                          <div className='row'>                            <div className='col-lg-6 col-md-6 col-sm-6 col-xs-6'> diff --git a/app/assets/javascripts/es6_browserified/vehicle_journeys/containers/tools/DuplicateVehicleJourney.js b/app/assets/javascripts/es6_browserified/vehicle_journeys/containers/tools/DuplicateVehicleJourney.js index 942415200..417906f6f 100644 --- a/app/assets/javascripts/es6_browserified/vehicle_journeys/containers/tools/DuplicateVehicleJourney.js +++ b/app/assets/javascripts/es6_browserified/vehicle_journeys/containers/tools/DuplicateVehicleJourney.js @@ -18,8 +18,8 @@ const mapDispatchToProps = (dispatch) => {      onOpenDuplicateModal: () =>{        dispatch(actions.openDuplicateModal())      }, -    onDuplicateVehicleJourneys: (data) =>{ -      dispatch(actions.duplicateVehicleJourneys(data)) +    onDuplicateVehicleJourney: (data) =>{ +      dispatch(actions.duplicateVehicleJourney(data))      }    }  } diff --git a/app/assets/javascripts/es6_browserified/vehicle_journeys/reducers/modal.js b/app/assets/javascripts/es6_browserified/vehicle_journeys/reducers/modal.js index 2f24b29c2..62870e27d 100644 --- a/app/assets/javascripts/es6_browserified/vehicle_journeys/reducers/modal.js +++ b/app/assets/javascripts/es6_browserified/vehicle_journeys/reducers/modal.js @@ -20,6 +20,12 @@ const modal = (state = {}, action) => {          modalProps: {},          confirmModal: {}        } +    case 'DUPLICATE_VEHICLEJOURNEY_MODAL': +      return { +        type: 'duplicate', +        modalProps: {}, +        confirmModal: {} +      }      case 'CLOSE_MODAL':        return {          type: '', diff --git a/app/assets/javascripts/es6_browserified/vehicle_journeys/reducers/vehicleJourneys.js b/app/assets/javascripts/es6_browserified/vehicle_journeys/reducers/vehicleJourneys.js index ee8dacc98..346975216 100644 --- a/app/assets/javascripts/es6_browserified/vehicle_journeys/reducers/vehicleJourneys.js +++ b/app/assets/javascripts/es6_browserified/vehicle_journeys/reducers/vehicleJourneys.js @@ -24,6 +24,7 @@ const vehicleJourney= (state = {}, action) => {          selected: false,          deletable: false        } +    case 'DUPLICATE_VEHICLEJOURNEY':      case 'SHIFT_VEHICLEJOURNEY':        let shiftedArray, shiftedSchedule, shiftedVjas        shiftedArray = state.vehicle_journey_at_stops.map((vjas, i) => { @@ -94,12 +95,31 @@ const vehicleJourneys = (state = [], action) => {        ]      case 'SHIFT_VEHICLEJOURNEY':        return state.map((vj, i) => { -        if (vj.selected && (actions.getSelected(state).length == 1)){ +        if (vj.selected){            return vehicleJourney(vj, action)          }else{            return vj          }        }) +    case 'DUPLICATE_VEHICLEJOURNEY': +      let dupeVj +      let dupes = [] +      let selectedIndex +      state.map((vj, i) => { +        if(vj.selected){ +          selectedIndex = i +          for (i = 0; i< action.data.duplicate_number.value; i++){ +            dupeVj = vehicleJourney(vj, action) +            dupeVj.comment = dupeVj.comment + '-' + i +            dupeVj.selected = false +            delete dupeVj['objectid'] +            dupes.push(dupeVj) +          } +        } +      }) +      let concatArray = state.slice(0, selectedIndex + 1).concat(dupes) +      concatArray = concatArray.concat(state.slice(selectedIndex + 1)) +      return concatArray      case 'DELETE_VEHICLEJOURNEYS':        return state.map((vj, i) =>{          if (vj.selected){ diff --git a/spec/javascripts/vehicle_journeys/actions_spec.js b/spec/javascripts/vehicle_journeys/actions_spec.js index b3a0fe810..952c80312 100644 --- a/spec/javascripts/vehicle_journeys/actions_spec.js +++ b/spec/javascripts/vehicle_journeys/actions_spec.js @@ -132,3 +132,13 @@ describe('when clicking on validate button inside shifting modal', () => {      expect(actions.shiftVehicleJourney(data)).toEqual(expectedAction)    })  }) +describe('when clicking on validate button inside duplicating modal', () => { +  it('should create an action to duplicate a vehiclejourney schedule', () => { +    const data = {} +    const expectedAction = { +      type: 'DUPLICATE_VEHICLEJOURNEY', +      data +    } +    expect(actions.duplicateVehicleJourney(data)).toEqual(expectedAction) +  }) +}) diff --git a/spec/javascripts/vehicle_journeys/reducers/vehicle_journeys_spec.js b/spec/javascripts/vehicle_journeys/reducers/vehicle_journeys_spec.js index 01a66bc01..dc04d5bf7 100644 --- a/spec/javascripts/vehicle_journeys/reducers/vehicle_journeys_spec.js +++ b/spec/javascripts/vehicle_journeys/reducers/vehicle_journeys_spec.js @@ -173,4 +173,32 @@ describe('vehicleJourneys reducer', () => {        })      ).toEqual([newVJ, state[1]])    }) + +  it('should handle DUPLICATE_VEHICLEJOURNEY', () => { +    let newVJAS = [{ +      delta: 627, +      arrival_time : { +        hour: '12', +        minute: '00' +      }, +      departure_time : { +        hour: '22', +        minute: '27' +      }, +      stop_area_object_id : "FR:92024:ZDE:420553:STIF" +    }] +    let fakeData = { +      duplicate_number: {value : 1}, +      additional_time: {value: '5'} +    } +    let newVJ = Object.assign({}, state[0], {vehicle_journey_at_stops: newVJAS, selected: false}) +    newVJ.comment = state[0].comment + '-0' +    delete newVJ['objectid'] +    expect( +      vjReducer(state, { +        type: 'DUPLICATE_VEHICLEJOURNEY', +        data: fakeData +      }) +    ).toEqual([state[0], newVJ, state[1]]) +  })  })  | 
