diff options
| author | Thomas Haddad | 2017-02-14 18:23:09 +0100 |
|---|---|---|
| committer | Thomas Haddad | 2017-02-14 18:23:09 +0100 |
| commit | 3c3bf04763105c5e4de8bdbf611fbb6a8dbeb03a (patch) | |
| tree | efec844ad91f185243aa4c6a236c7e63dad1c9c4 | |
| parent | 59207bccbc809d3574e01903b5336b5af82e8128 (diff) | |
| download | chouette-core-3c3bf04763105c5e4de8bdbf611fbb6a8dbeb03a.tar.bz2 | |
Refs #2521: Add vjas time modification for vehicle journeys
Signed-off-by: Thomas Shawarma Haddad <thomas.haddad@af83.com>
9 files changed, 121 insertions, 7 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 b89f52258..fff0399f6 100644 --- a/app/assets/javascripts/es6_browserified/vehicle_journeys/actions/index.js +++ b/app/assets/javascripts/es6_browserified/vehicle_journeys/actions/index.js @@ -32,6 +32,14 @@ const actions = { toggleArrivals : () => ({ type: 'TOGGLE_ARRIVALS', }), + updateTime : (val, subIndex, index, timeUnit, isDeparture) => ({ + type: 'UPDATE_TIME', + val, + subIndex, + index, + timeUnit, + isDeparture + }), fetchVehicleJourneys : (dispatch, currentPage, nextPage) => { if(currentPage == undefined){ currentPage = 1 diff --git a/app/assets/javascripts/es6_browserified/vehicle_journeys/components/VehicleJourney.js b/app/assets/javascripts/es6_browserified/vehicle_journeys/components/VehicleJourney.js index ab3375a32..46f1f777f 100644 --- a/app/assets/javascripts/es6_browserified/vehicle_journeys/components/VehicleJourney.js +++ b/app/assets/javascripts/es6_browserified/vehicle_journeys/components/VehicleJourney.js @@ -47,15 +47,39 @@ class VehicleJourney extends Component { key={i} > <span> - <input type='number' min='00' max='23' onInput={(e) => {this.format(e)}} defaultValue={moment(vj.arrival_time).format('hh')}/> + <input + type='number' + min='00' + max='23' + onBlur={(e) => {this.props.onUpdateTime(e, i, this.props.index, 'hour', true)}} + onInput={(e) => {this.format(e)}} defaultValue={moment(vj.arrival_time).utc().format('HH')} + /> <span>:</span> - <input type='number' min='00' max='59' onInput={(e) => {this.format(e)}} defaultValue={moment(vj.arrival_time).format('mm')}/> + <input + type='number' + min='00' + max='59' + onBlur={(e) => {this.props.onUpdateTime(e, i, this.props.index, "minute", true)}} + onInput={(e) => {this.format(e)}} defaultValue={moment(vj.arrival_time).utc().format('mm')} + /> </span> {this.props.filters.toggleArrivals && <span> - <input type='number' min='00' max='23' onInput={(e) => {this.format(e)}} defaultValue={moment(vj.departure_time).format('hh')}/> + <input + type='number' + min='00' + max='23' + onBlur={(e) => {this.props.onUpdateTime(e, i, this.props.index, 'hour', false)}} + onInput={(e) => {this.format(e)}} defaultValue={moment(vj.departure_time).utc().format('HH')} + /> <span>:</span> - <input type='number' min='00' max='59' onInput={(e) => {this.format(e)}} defaultValue={moment(vj.departure_time).format('mm')}/> + <input + type='number' + min='00' + max='59' + onBlur={(e) => {this.props.onUpdateTime(e, i, this.props.index, 'minute', false)}} + onInput={(e) => {this.format(e)}} defaultValue={moment(vj.departure_time).utc().format('mm')} + /> </span> } </li> @@ -70,7 +94,9 @@ class VehicleJourney extends Component { VehicleJourney.propTypes = { value: PropTypes.object.isRequired, - filters: PropTypes.object.isRequired + filters: PropTypes.object.isRequired, + index: PropTypes.number.isRequired, + onUpdateTime: PropTypes.func.isRequired, } module.exports = VehicleJourney diff --git a/app/assets/javascripts/es6_browserified/vehicle_journeys/components/VehicleJourneys.js b/app/assets/javascripts/es6_browserified/vehicle_journeys/components/VehicleJourneys.js index 0fbb5feaa..0c2a11bac 100644 --- a/app/assets/javascripts/es6_browserified/vehicle_journeys/components/VehicleJourneys.js +++ b/app/assets/javascripts/es6_browserified/vehicle_journeys/components/VehicleJourneys.js @@ -31,7 +31,9 @@ class VehicleJourneys extends Component{ <VehicleJourney value = {vj} key = {index} + index = {index} filters = {this.props.filters} + onUpdateTime = {this.props.onUpdateTime} /> )} </div> @@ -43,6 +45,7 @@ class VehicleJourneys extends Component{ VehicleJourneys.propTypes = { status: PropTypes.object.isRequired, onLoadFirstPage: PropTypes.func.isRequired, + onUpdateTime: PropTypes.func.isRequired, filters: PropTypes.object.isRequired } diff --git a/app/assets/javascripts/es6_browserified/vehicle_journeys/containers/VehicleJourneysList.js b/app/assets/javascripts/es6_browserified/vehicle_journeys/containers/VehicleJourneysList.js index b9aba78af..0819fed6a 100644 --- a/app/assets/javascripts/es6_browserified/vehicle_journeys/containers/VehicleJourneysList.js +++ b/app/assets/javascripts/es6_browserified/vehicle_journeys/containers/VehicleJourneysList.js @@ -15,6 +15,9 @@ const mapDispatchToProps = (dispatch) => { onLoadFirstPage: () =>{ dispatch(actions.fetchingApi()) actions.fetchVehicleJourneys(dispatch) + }, + onUpdateTime: (e, subIndex, index, timeUnit, isDeparture) => { + dispatch(actions.updateTime(e.target.value, subIndex, index, timeUnit, isDeparture)) } } } 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 7d7db9930..dde247521 100644 --- a/app/assets/javascripts/es6_browserified/vehicle_journeys/reducers/vehicleJourneys.js +++ b/app/assets/javascripts/es6_browserified/vehicle_journeys/reducers/vehicleJourneys.js @@ -1,5 +1,26 @@ var actions = require("../actions") +const vehicleJourney= (state = {}, action) => { + switch (action.type) { + case 'UPDATE_TIME': + let vj, vjas, vjasArray + vjasArray = state.vehicle_journey_at_stops.map((vjas, i) =>{ + if(i == action.subIndex){ + if (action.isDeparture){ + return Object.assign({}, state.vehicle_journey_at_stops[action.subIndex], {departure_time: moment(state.vehicle_journey_at_stops[action.subIndex].departure_time).set(action.timeUnit, action.val).format()}) + }else{ + return Object.assign({}, state.vehicle_journey_at_stops[action.subIndex], {arrival_time: moment(state.vehicle_journey_at_stops[action.subIndex].arrival_time).set(action.timeUnit, action.val).format()}) + } + }else{ + return vjas + } + }) + return Object.assign({}, state, {vehicle_journey_at_stops: vjasArray}) + default: + return state + } +} + const vehicleJourneys = (state = [], action) => { switch (action.type) { case 'RECEIVE_VEHICLE_JOURNEYS': @@ -14,6 +35,14 @@ const vehicleJourneys = (state = [], action) => { actions.fetchVehicleJourneys(action.dispatch, action.pagination.page, action.nextPage) } return state + case 'UPDATE_TIME': + return state.map((vj, i) =>{ + if (i == action.index){ + return vehicleJourney(vj, action) + } else { + return vj + } + }) default: return state } diff --git a/app/views/vehicle_journeys/show.rabl b/app/views/vehicle_journeys/show.rabl index 0f8903a83..d6df84204 100644 --- a/app/views/vehicle_journeys/show.rabl +++ b/app/views/vehicle_journeys/show.rabl @@ -36,7 +36,11 @@ child :vehicle_journey_at_stops, :object_root => false do |vehicle_stops| node(:stop_area_object_id) { vehicle_stop.stop_point.stop_area.objectid } [ :connecting_service_id, :arrival_time, :departure_time, :boarding_alighting_possibility].each do |attr| node( attr) do - vehicle_stop.send(attr) + if vehicle_stop.send(attr).is_a? Time + vehicle_stop.send(attr).iso8601() + else + vehicle_stop.send(attr) + end end unless vehicle_stop.send(attr).nil? end end diff --git a/spec/javascripts/spec_helper.js b/spec/javascripts/spec_helper.js index a0285cccf..321ba3525 100644 --- a/spec/javascripts/spec_helper.js +++ b/spec/javascripts/spec_helper.js @@ -6,6 +6,7 @@ // require support/your-support-file //= require jquery //= require bootstrap-sass-official +//= require moment require('es6-object-assign').polyfill(); // // PhantomJS (Teaspoons default driver) doesn't have support for Function.prototype.bind, which has caused confusion. diff --git a/spec/javascripts/vehicle_journeys/actions_spec.js b/spec/javascripts/vehicle_journeys/actions_spec.js index d09531564..219fea96b 100644 --- a/spec/javascripts/vehicle_journeys/actions_spec.js +++ b/spec/javascripts/vehicle_journeys/actions_spec.js @@ -37,3 +37,17 @@ describe('when toggling arrivals', () => { expect(actions.toggleArrivals()).toEqual(expectedAction) }) }) +describe('when updating vjas time', () => { + it('should create an action to update time', () => { + const val = 33, subIndex = 0, index = 0, timeUnit = 'minute', isDeparture = true + const expectedAction = { + type: 'UPDATE_TIME', + val, + subIndex, + index, + timeUnit, + isDeparture + } + expect(actions.updateTime(val, subIndex, index, timeUnit, isDeparture)).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 15baa75a5..d6ad1c8bd 100644 --- a/spec/javascripts/vehicle_journeys/reducers/vehicle_journeys_spec.js +++ b/spec/javascripts/vehicle_journeys/reducers/vehicle_journeys_spec.js @@ -1,4 +1,5 @@ var vjReducer = require('es6_browserified/vehicle_journeys/reducers/vehicleJourneys') + let state = [] let fakeFootnotes = [{ id: 1, @@ -11,7 +12,11 @@ let fakeFootnotes = [{ }] let fakeTimeTables = [] -let fakeVJAS = [] +let fakeVJAS = [{ + arrival_time : "2000-01-01T00:00:00+01:00", + departure_time : "2000-01-01T00:00:00+01:00", + stop_area_object_id : "FR:92024:ZDE:420553:STIF" +}] describe('vehicleJourneys reducer', () => { beforeEach(()=>{ @@ -52,4 +57,25 @@ describe('vehicleJourneys reducer', () => { }) ).toEqual(state) }) + + it('should handle UPDATE_TIME', () => { + const val = 33, subIndex = 0, index = 0, timeUnit = 'minute', isDeparture = true + let newVJAS = [{ + arrival_time : "2000-01-01T00:00:00+01:00", + departure_time : "2000-01-01T00:33:00+01:00", + stop_area_object_id : "FR:92024:ZDE:420553:STIF" + }] + let newVJ = Object.assign({}, state[0], {vehicle_journey_at_stops: newVJAS}) + expect( + vjReducer(state, { + type: 'UPDATE_TIME', + val, + subIndex, + index, + timeUnit, + isDeparture + }) + ).toEqual([newVJ, state[1]]) + }) + }) |
