From 06ff047a212c8c1dd6eb1de10ce92f0059151d2a Mon Sep 17 00:00:00 2001
From: Zog
Date: Tue, 27 Feb 2018 14:38:51 +0100
Subject: Refs #6063; Fix the journeys time editor
---
 app/javascript/vehicle_journeys/actions/index.js            |  9 +++++----
 .../vehicle_journeys/components/VehicleJourney.js           |  4 ++++
 .../vehicle_journeys/containers/VehicleJourneysList.js      |  4 ++--
 app/javascript/vehicle_journeys/reducers/vehicleJourneys.js |  4 ++--
 spec/javascript/vehicle_journeys/actions_spec.js            | 13 +++++++------
 5 files changed, 20 insertions(+), 14 deletions(-)
diff --git a/app/javascript/vehicle_journeys/actions/index.js b/app/javascript/vehicle_journeys/actions/index.js
index e67753e4b..6d9119cdc 100644
--- a/app/javascript/vehicle_journeys/actions/index.js
+++ b/app/javascript/vehicle_journeys/actions/index.js
@@ -213,14 +213,15 @@ const actions = {
   toggleArrivals : () => ({
     type: 'TOGGLE_ARRIVALS',
   }),
-  updateTime : (val, subIndex, index, timeUnit, isDeparture, isArrivalsToggled) => ({
+  updateTime : (val, subIndex, index, timeUnit, isDeparture, isArrivalsToggled, enforceConsistency=false) => ({
     type: 'UPDATE_TIME',
     val,
     subIndex,
     index,
     timeUnit,
     isDeparture,
-    isArrivalsToggled
+    isArrivalsToggled,
+    enforceConsistency
   }),
   resetStateFilters: () => ({
     type: 'RESET_FILTERS'
@@ -487,10 +488,10 @@ const actions = {
     vjas.delta = delta
     return vjas
   },
-  adjustSchedule: (action, schedule) => {
+  adjustSchedule: (action, schedule, enforceConsistency=false) => {
     // we enforce that the departure time remains after the arrival time
     actions.getDelta(schedule)
-    if(schedule.delta < 0){
+    if(enforceConsistency && schedule.delta < 0){
       if(action.isDeparture){
         schedule.arrival_time = schedule.departure_time
       }
diff --git a/app/javascript/vehicle_journeys/components/VehicleJourney.js b/app/javascript/vehicle_journeys/components/VehicleJourney.js
index 7db0cee1c..d0a9343ed 100644
--- a/app/javascript/vehicle_journeys/components/VehicleJourney.js
+++ b/app/javascript/vehicle_journeys/components/VehicleJourney.js
@@ -132,6 +132,7 @@ export default class VehicleJourney extends Component {
                       disabled={!this.props.editMode || this.isDisabled(this.props.value.deletable, vj.dummy) || this.props.filters.policy['vehicle_journeys.update'] == false}
                       readOnly={!this.props.editMode && !vj.dummy}
                       onChange={(e) => {this.props.onUpdateTime(e, i, this.props.index, 'hour', false, false)}}
+                      onChange={(e) => {this.props.onUpdateTime(e, i, this.props.index, 'hour', false, false, true)}}
                       value={vj.arrival_time['hour']}
                       />
                     :
@@ -143,6 +144,7 @@ export default class VehicleJourney extends Component {
                       disabled={!this.props.editMode || this.isDisabled(this.props.value.deletable, vj.dummy) || this.props.filters.policy['vehicle_journeys.update'] == false}
                       readOnly={!this.props.editMode && !vj.dummy}
                       onChange={(e) => {this.props.onUpdateTime(e, i, this.props.index, 'minute', false, false)}}
+                      onBlur={(e) => {this.props.onUpdateTime(e, i, this.props.index, 'minute', false, false, true)}}
                       value={vj.arrival_time['minute']}
                       />
                   
@@ -163,6 +165,7 @@ export default class VehicleJourney extends Component {
                       disabled={!this.props.editMode || this.isDisabled(this.props.value.deletable, vj.dummy) || this.props.filters.policy['vehicle_journeys.update'] == false}
                       readOnly={!this.props.editMode && !vj.dummy}
                       onChange={(e) => {this.props.onUpdateTime(e, i, this.props.index, 'hour', true, this.props.filters.toggleArrivals)}}
+                      onBlur={(e) => {this.props.onUpdateTime(e, i, this.props.index, 'hour', true, this.props.filters.toggleArrivals, true)}}
                       value={vj.departure_time['hour']}
                       />
                     :
@@ -174,6 +177,7 @@ export default class VehicleJourney extends Component {
                       disabled={!this.props.editMode || this.isDisabled(this.props.value.deletable, vj.dummy) || this.props.filters.policy['vehicle_journeys.update'] == false}
                       readOnly={!this.props.editMode && !vj.dummy}
                       onChange={(e) => {this.props.onUpdateTime(e, i, this.props.index, "minute", true,  this.props.filters.toggleArrivals)}}
+                      onBlur={(e) => {this.props.onUpdateTime(e, i, this.props.index, "minute", true,  this.props.filters.toggleArrivals, true)}}
                       value={vj.departure_time['minute']}
                       />
                   
diff --git a/app/javascript/vehicle_journeys/containers/VehicleJourneysList.js b/app/javascript/vehicle_journeys/containers/VehicleJourneysList.js
index 76d1c3a78..81d603fd4 100644
--- a/app/javascript/vehicle_journeys/containers/VehicleJourneysList.js
+++ b/app/javascript/vehicle_journeys/containers/VehicleJourneysList.js
@@ -20,8 +20,8 @@ const mapDispatchToProps = (dispatch) => {
       dispatch(actions.fetchingApi())
       actions.fetchVehicleJourneys(dispatch, undefined, undefined, filters.queryString, routeUrl)
     },
-    onUpdateTime: (e, subIndex, index, timeUnit, isDeparture, isArrivalsToggled) => {
-      dispatch(actions.updateTime(e.target.value, subIndex, index, timeUnit, isDeparture, isArrivalsToggled))
+    onUpdateTime: (e, subIndex, index, timeUnit, isDeparture, isArrivalsToggled, enforceConsistency=false) => {
+      dispatch(actions.updateTime(e.target.value, subIndex, index, timeUnit, isDeparture, isArrivalsToggled, enforceConsistency))
     },
     onSelectVehicleJourney: (index) => {
       dispatch(actions.selectVehicleJourney(index))
diff --git a/app/javascript/vehicle_journeys/reducers/vehicleJourneys.js b/app/javascript/vehicle_journeys/reducers/vehicleJourneys.js
index 8705b3cf2..9f78a4163 100644
--- a/app/javascript/vehicle_journeys/reducers/vehicleJourneys.js
+++ b/app/javascript/vehicle_journeys/reducers/vehicleJourneys.js
@@ -148,11 +148,11 @@ const vehicleJourney= (state = {}, action, keep) => {
             newSchedule.departure_time[action.timeUnit] = actions.pad(action.val, action.timeUnit)
             if(!action.isArrivalsToggled)
               newSchedule.arrival_time[action.timeUnit] = newSchedule.departure_time[action.timeUnit]
-            newSchedule = actions.adjustSchedule(action, newSchedule)
+            newSchedule = actions.adjustSchedule(action, newSchedule, action.enforceConsistency)
             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.adjustSchedule(action, newSchedule)
+            newSchedule = actions.adjustSchedule(action, newSchedule, action.enforceConsistency)
             return _.assign({}, state.vehicle_journey_at_stops[action.subIndex],  {arrival_time: newSchedule.arrival_time, departure_time: newSchedule.departure_time, delta: newSchedule.delta})
           }
         }else{
diff --git a/spec/javascript/vehicle_journeys/actions_spec.js b/spec/javascript/vehicle_journeys/actions_spec.js
index 9710d833c..bfbb4fb36 100644
--- a/spec/javascript/vehicle_journeys/actions_spec.js
+++ b/spec/javascript/vehicle_journeys/actions_spec.js
@@ -194,7 +194,7 @@ describe('when toggling arrivals', () => {
 })
 describe('when updating vjas time', () => {
   it('should create an action to update time', () => {
-    const val = 33, subIndex = 0, index = 0, timeUnit = 'minute', isDeparture = true, isArrivalsToggled = true
+    const val = 33, subIndex = 0, index = 0, timeUnit = 'minute', isDeparture = true, isArrivalsToggled = true, enforceConsistency = false
     const expectedAction = {
       type: 'UPDATE_TIME',
       val,
@@ -202,7 +202,8 @@ describe('when updating vjas time', () => {
       index,
       timeUnit,
       isDeparture,
-      isArrivalsToggled
+      isArrivalsToggled,
+      enforceConsistency
     }
     expect(actions.updateTime(val, subIndex, index, timeUnit, isDeparture, isArrivalsToggled)).toEqual(expectedAction)
   })
@@ -640,7 +641,7 @@ describe('actions.adjustSchedule', () => {
         }
       })
       it('should do nothing', () => {
-        expect(actions.adjustSchedule(action, schedule)).toEqual(schedule)
+        expect(actions.adjustSchedule(action, schedule, true)).toEqual(schedule)
       })
     }),
     context('with a delta < 0', () => {
@@ -662,7 +663,7 @@ describe('actions.adjustSchedule', () => {
           arrival_time: departure_time,
           delta: 0
         }
-        expect(actions.adjustSchedule(action, schedule)).toEqual(expected)
+        expect(actions.adjustSchedule(action, schedule, true)).toEqual(expected)
       })
     })
   }),
@@ -676,7 +677,7 @@ describe('actions.adjustSchedule', () => {
         }
       })
       it('should do nothing', () => {
-        expect(actions.adjustSchedule(action, schedule)).toEqual(schedule)
+        expect(actions.adjustSchedule(action, schedule, true)).toEqual(schedule)
       })
     }),
     context('with a delta < 0', () => {
@@ -698,7 +699,7 @@ describe('actions.adjustSchedule', () => {
           arrival_time: arrival_time,
           delta: 0
         }
-        expect(actions.adjustSchedule(action, schedule)).toEqual(expected)
+        expect(actions.adjustSchedule(action, schedule, true)).toEqual(expected)
       })
     })
   })
-- 
cgit v1.2.3