diff options
| -rw-r--r-- | app/javascript/vehicle_journeys/actions/index.js | 14 | ||||
| -rw-r--r-- | app/javascript/vehicle_journeys/components/VehicleJourney.js | 6 | ||||
| -rw-r--r-- | app/javascript/vehicle_journeys/reducers/vehicleJourneys.js | 14 | ||||
| -rw-r--r-- | spec/javascript/vehicle_journeys/actions_spec.js | 81 | ||||
| -rw-r--r-- | spec/javascript/vehicle_journeys/reducers/vehicleJourneys_spec.js (renamed from spec/javascript/vehicle_journeys/reducers/vehicle_journeys_spec.js) | 0 | 
5 files changed, 104 insertions, 11 deletions
| diff --git a/app/javascript/vehicle_journeys/actions/index.js b/app/javascript/vehicle_journeys/actions/index.js index ce4b9209d..c82f759d6 100644 --- a/app/javascript/vehicle_journeys/actions/index.js +++ b/app/javascript/vehicle_journeys/actions/index.js @@ -439,6 +439,20 @@ const actions = {      vjas.delta = delta      return vjas    }, +  adjustSchedule: (action, schedule) => { +    // we enforce that the departure time remains after the arrival time +    actions.getDelta(schedule) +    if(schedule.delta < 0){ +      if(action.isDeparture){ +        schedule.arrival_time = schedule.departure_time +      } +      else{ +        schedule.departure_time = schedule.arrival_time +      } +      actions.getDelta(schedule) +    } +    return schedule +  },    getShiftedSchedule: ({departure_time, arrival_time}, additional_time) => {      // We create dummy dates objects to manipulate time more easily      let departureDT = new Date (Date.UTC(2017, 2, 1, parseInt(departure_time.hour), parseInt(departure_time.minute))) diff --git a/app/javascript/vehicle_journeys/components/VehicleJourney.js b/app/javascript/vehicle_journeys/components/VehicleJourney.js index 929cbc5c4..bde673345 100644 --- a/app/javascript/vehicle_journeys/components/VehicleJourney.js +++ b/app/javascript/vehicle_journeys/components/VehicleJourney.js @@ -83,6 +83,7 @@ export default class VehicleJourney extends Component {                        className='form-control'                        disabled={this.isDisabled(this.props.value.deletable, vj.dummy) || this.props.filters.policy['vehicle_journeys.update'] == false}                        readOnly={!this.props.editMode && !vj.dummy} +                      disabled={!this.props.editMode && !vj.dummy}                        onChange={(e) => {this.props.onUpdateTime(e, i, this.props.index, 'hour', false, false)}}                        value={vj.arrival_time['hour']}                        /> @@ -94,6 +95,7 @@ export default class VehicleJourney extends Component {                        className='form-control'                        disabled={this.isDisabled(this.props.value.deletable, vj.dummy) || this.props.filters.policy['vehicle_journeys.update'] == false}                        readOnly={!this.props.editMode && !vj.dummy} +                      disabled={!this.props.editMode && !vj.dummy}                        onChange={(e) => {this.props.onUpdateTime(e, i, this.props.index, 'minute', false, false)}}                        value={vj.arrival_time['minute']}                        /> @@ -114,6 +116,7 @@ export default class VehicleJourney extends Component {                        className='form-control'                        disabled={this.isDisabled(this.props.value.deletable, vj.dummy) || this.props.filters.policy['vehicle_journeys.update'] == false}                        readOnly={!this.props.editMode && !vj.dummy} +                      disabled={!this.props.editMode && !vj.dummy}                        onChange={(e) => {this.props.onUpdateTime(e, i, this.props.index, 'hour', true, this.props.filters.toggleArrivals)}}                        value={vj.departure_time['hour']}                        /> @@ -125,6 +128,7 @@ export default class VehicleJourney extends Component {                        className='form-control'                        disabled={this.isDisabled(this.props.value.deletable, vj.dummy) || this.props.filters.policy['vehicle_journeys.update'] == false}                        readOnly={!this.props.editMode && !vj.dummy} +                      disabled={!this.props.editMode && !vj.dummy}                        onChange={(e) => {this.props.onUpdateTime(e, i, this.props.index, "minute", true,  this.props.filters.toggleArrivals)}}                        value={vj.departure_time['minute']}                        /> @@ -144,4 +148,4 @@ VehicleJourney.propTypes = {    index: PropTypes.number.isRequired,    onUpdateTime: PropTypes.func.isRequired,    onSelectVehicleJourney: PropTypes.func.isRequired -}
\ No newline at end of file +} diff --git a/app/javascript/vehicle_journeys/reducers/vehicleJourneys.js b/app/javascript/vehicle_journeys/reducers/vehicleJourneys.js index 136e1b41a..7fed867fa 100644 --- a/app/javascript/vehicle_journeys/reducers/vehicleJourneys.js +++ b/app/javascript/vehicle_journeys/reducers/vehicleJourneys.js @@ -79,18 +79,12 @@ const vehicleJourney= (state = {}, action, keep) => {            if (action.isDeparture){              newSchedule.departure_time[action.timeUnit] = actions.pad(action.val, action.timeUnit)              if(!action.isArrivalsToggled) -              newSchedule.arrival_time[action.timeUnit] = actions.pad(action.val, action.timeUnit) -            newSchedule = actions.getDelta(newSchedule) -            if(newSchedule.delta < 0){ -              return vjas -            } +              newSchedule.arrival_time[action.timeUnit] = newSchedule.departure_time[action.timeUnit] +            newSchedule = actions.adjustSchedule(action, newSchedule)              return _.assign({}, state.vehicle_journey_at_stops[action.subIndex], {arrival_time: newSchedule.arrival_time, departure_time: newSchedule.departure_time, delta: newSchedule.delta})            }else{              newSchedule.arrival_time[action.timeUnit] = actions.pad(action.val, action.timeUnit) -            newSchedule = actions.getDelta(newSchedule) -            if(newSchedule.delta < 0){ -              return vjas -            } +            newSchedule = actions.adjustSchedule(action, newSchedule)              return _.assign({}, state.vehicle_journey_at_stops[action.subIndex],  {arrival_time: newSchedule.arrival_time, departure_time: newSchedule.departure_time, delta: newSchedule.delta})            }          }else{ @@ -225,4 +219,4 @@ export default function vehicleJourneys(state = [], action) {      default:        return state    } -}
\ No newline at end of file +} diff --git a/spec/javascript/vehicle_journeys/actions_spec.js b/spec/javascript/vehicle_journeys/actions_spec.js index 74765a7ef..789507482 100644 --- a/spec/javascript/vehicle_journeys/actions_spec.js +++ b/spec/javascript/vehicle_journeys/actions_spec.js @@ -447,3 +447,84 @@ describe('when using select2 to unselect a company', () => {      expect(actions.unselect2Company()).toEqual(expectedAction)    })  }) + +describe('actions.adjustSchedule', () => { +  set('time', () => { +    return { +      hour: 9, +      minute: 30 +    } +  }) +  context('when editing the departure time', () => { +    set('action', () => { return { isDeparture: true } }) +    context('with a positive delta', () => { +      set('schedule', () => { +        return { +          departure_time: time, +          arrival_time: time +        } +      }) +      it('should do nothing', () => { +        expect(actions.adjustSchedule(action, schedule)).toEqual(schedule) +      }) +    }), +    context('with a delta < 0', () => { +      set('departure_time', () => { +        return { +          hour: time.hour, +          minute: time.minute - 1 +        } +      }) +      set('schedule', () => { +        return { +          departure_time: departure_time, +          arrival_time: time +        } +      }) +      it('should adjust arrival time', () => { +        let expected = { +          departure_time: departure_time, +          arrival_time: departure_time, +          delta: 0 +        } +        expect(actions.adjustSchedule(action, schedule)).toEqual(expected) +      }) +    }) +  }), +  context('when editing the arrival time', () => { +    set('action', () => { return { isDeparture: false } }) +    context('with a positive delta', () => { +      set('schedule', () => { +        return { +          departure_time: time, +          arrival_time: time +        } +      }) +      it('should do nothing', () => { +        expect(actions.adjustSchedule(action, schedule)).toEqual(schedule) +      }) +    }), +    context('with a delta < 0', () => { +      set('arrival_time', () => { +        return { +          hour: time.hour, +          minute: time.minute + 1 +        } +      }) +      set('schedule', () => { +        return { +          departure_time: time, +          arrival_time: arrival_time +        } +      }) +      it('should adjust departure time', () => { +        let expected = { +          departure_time: arrival_time, +          arrival_time: arrival_time, +          delta: 0 +        } +        expect(actions.adjustSchedule(action, schedule)).toEqual(expected) +      }) +    }) +  }) +}) diff --git a/spec/javascript/vehicle_journeys/reducers/vehicle_journeys_spec.js b/spec/javascript/vehicle_journeys/reducers/vehicleJourneys_spec.js index 1c2cc1577..1c2cc1577 100644 --- a/spec/javascript/vehicle_journeys/reducers/vehicle_journeys_spec.js +++ b/spec/javascript/vehicle_journeys/reducers/vehicleJourneys_spec.js | 
