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 |
