diff options
| author | Thomas Haddad | 2017-02-21 16:56:41 +0100 |
|---|---|---|
| committer | Thomas Haddad | 2017-02-21 16:59:24 +0100 |
| commit | dd8487d6771ac76ebc60eff7e50730b2314a0ec2 (patch) | |
| tree | b6a82d8921f10bd23ae92c82cb63e5cb3f1e47aa | |
| parent | 9985fe272fe0edd09ebe896ab12f4bec40a86264 (diff) | |
| download | chouette-core-dd8487d6771ac76ebc60eff7e50730b2314a0ec2.tar.bz2 | |
Refs #2521: Add shift vj schedules, no implementation of day offset yet
Signed-off-by: Thomas Shawarma Haddad <thomas.haddad@af83.com>
12 files changed, 263 insertions, 22 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 2b505824d..e5e3c6512 100644 --- a/app/assets/javascripts/es6_browserified/vehicle_journeys/actions/index.js +++ b/app/assets/javascripts/es6_browserified/vehicle_journeys/actions/index.js @@ -36,6 +36,9 @@ const actions = { openCreateModal : () => ({ type : 'CREATE_VEHICLEJOURNEY_MODAL' }), + openShiftModal : () => ({ + type : 'SHIFT_VEHICLEJOURNEY_MODAL' + }), selectVehicleJourney : (index) => ({ type : 'SELECT_VEHICLEJOURNEY', index @@ -44,6 +47,10 @@ const actions = { type: 'ADD_VEHICLEJOURNEY', data, }), + shiftVehicleJourney : (data) => ({ + type: 'SHIFT_VEHICLEJOURNEY', + data, + }), deleteVehicleJourneys : () => ({ type: 'DELETE_VEHICLEJOURNEYS' }), @@ -159,14 +166,6 @@ const actions = { } }) }, - getDelta: (vjas) => { - let delta = 0 - if (vjas.departure_time.hour != '' && vjas.departure_time.minute != '' && vjas.arrival_time.hour != '' && vjas.departure_time.minute != ''){ - delta = (vjas.departure_time.hour - vjas.arrival_time.hour) * 60 + (vjas.departure_time.minute - vjas.arrival_time.minute) - } - vjas.delta = delta - return vjas - }, submitVehicleJourneys : (dispatch, state, next) => { dispatch(actions.fetchingApi()) let urlJSON = window.location.pathname + "_collection.json" @@ -199,6 +198,35 @@ const actions = { } }) }, + + // VJAS HELPERS + pad: (d) => { + return (d < 10) ? '0' + d.toString() : d.toString(); + }, + getDelta: (vjas) => { + let delta = 0 + if (vjas.departure_time.hour != '' && vjas.departure_time.minute != '' && vjas.arrival_time.hour != '' && vjas.departure_time.minute != ''){ + delta = (vjas.departure_time.hour - vjas.arrival_time.hour) * 60 + (vjas.departure_time.minute - vjas.arrival_time.minute) + } + vjas.delta = delta + return vjas + }, + checkSchedules: (schedule) => { + if (parseInt(schedule.departure_time.minute) > 59){ + schedule.departure_time.minute = actions.pad(parseInt(schedule.departure_time.minute) - 60) + schedule.departure_time.hour = actions.pad(parseInt(schedule.departure_time.hour) + 1) + } + if (parseInt(schedule.arrival_time.minute) > 59){ + schedule.arrival_time.minute = actions.pad(parseInt(schedule.arrival_time.minute) - 60) + schedule.arrival_time.hour = actions.pad(parseInt(schedule.arrival_time.hour) + 1) + } + if (parseInt(schedule.departure_time.hour) > 23){ + schedule.departure_time.hour = actions.pad(parseInt(schedule.departure_time.hour) - 24) + } + if (parseInt(schedule.arrival_time.hour) > 23){ + schedule.arrival_time.hour = actions.pad(parseInt(schedule.arrival_time.hour) - 24) + } + } } module.exports = actions diff --git a/app/assets/javascripts/es6_browserified/vehicle_journeys/components/App.js b/app/assets/javascripts/es6_browserified/vehicle_journeys/components/App.js index bf7f604ae..62b1f8019 100644 --- a/app/assets/javascripts/es6_browserified/vehicle_journeys/components/App.js +++ b/app/assets/javascripts/es6_browserified/vehicle_journeys/components/App.js @@ -4,8 +4,9 @@ var Navigate = require('../containers/Navigate') var FiltersList = require('../containers/FiltersList') var SaveVehicleJourneys = require('../containers/SaveVehicleJourneys') var ConfirmModal = require('../containers/ConfirmModal') -var AddVehicleJourney = require('../containers/AddVehicleJourney') -var DeleteVehicleJourneys = require('../containers/DeleteVehicleJourneys') +var AddVehicleJourney = require('../containers/tools/AddVehicleJourney') +var DeleteVehicleJourneys = require('../containers/tools/DeleteVehicleJourneys') +var ShiftVehicleJourney = require('../containers/tools/ShiftVehicleJourney') const App = () => ( <div> @@ -14,6 +15,7 @@ const App = () => ( <Navigate /> <AddVehicleJourney /> <DeleteVehicleJourneys /> + <ShiftVehicleJourney /> </div> <VehicleJourneysList /> <SaveVehicleJourneys /> diff --git a/app/assets/javascripts/es6_browserified/vehicle_journeys/components/CreateModal.js b/app/assets/javascripts/es6_browserified/vehicle_journeys/components/tools/CreateModal.js index 34b1a3afc..50660a2f3 100644 --- a/app/assets/javascripts/es6_browserified/vehicle_journeys/components/CreateModal.js +++ b/app/assets/javascripts/es6_browserified/vehicle_journeys/components/tools/CreateModal.js @@ -1,7 +1,7 @@ var React = require('react') var Component = require('react').Component var PropTypes = require('react').PropTypes -var actions = require('../actions') +var actions = require('../../actions') class CreateModal extends Component { constructor(props) { diff --git a/app/assets/javascripts/es6_browserified/vehicle_journeys/components/DeleteVehicleJourneys.js b/app/assets/javascripts/es6_browserified/vehicle_journeys/components/tools/DeleteVehicleJourneys.js index 8bf2a719d..8bf2a719d 100644 --- a/app/assets/javascripts/es6_browserified/vehicle_journeys/components/DeleteVehicleJourneys.js +++ b/app/assets/javascripts/es6_browserified/vehicle_journeys/components/tools/DeleteVehicleJourneys.js diff --git a/app/assets/javascripts/es6_browserified/vehicle_journeys/components/tools/ShiftVehicleJourney.js b/app/assets/javascripts/es6_browserified/vehicle_journeys/components/tools/ShiftVehicleJourney.js new file mode 100644 index 000000000..08c9a7e12 --- /dev/null +++ b/app/assets/javascripts/es6_browserified/vehicle_journeys/components/tools/ShiftVehicleJourney.js @@ -0,0 +1,114 @@ +var React = require('react') +var Component = require('react').Component +var PropTypes = require('react').PropTypes +var actions = require('../../actions') + +class ShiftVehicleJourney extends Component { + constructor(props) { + super(props) + } + + handleSubmit() { + if(actions.validateFields(this.refs) == true) { + this.props.onShiftVehicleJourney(this.refs) + $('#ShiftVehicleJourneyModal').modal('hide') + } + } + + render() { + if(this.props.status.isFetching == true) { + return false + } + if(this.props.status.fetchSuccess == true) { + return ( + <div className='pull-right'> + <button + type='button' + className='btn btn-primary btn-sm' + data-toggle='modal' + data-target='#ShiftVehicleJourneyModal' + onClick={this.props.onOpenShiftModal} + > + <span className='fa fa-refresh'></span> + </button> + + <div className={ 'modal fade ' + ((this.props.modal.type == 'shift') ? 'in' : '') } id='ShiftVehicleJourneyModal'> + <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') && ( + <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> + </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'>Avec un décalage de</label> + <input + type='number' + ref='additional_time' + min='0' + max='59' + className='form-control' + onKeyDown={(e) => actions.resetValidation(e.currentTarget)} + required + /> + </div> + </div> + </div> + </div> + <div className='modal-footer'> + <button + className='btn btn-default' + data-dismiss='modal' + type='button' + onClick={this.props.onModalClose} + > + Annuler + </button> + <button + className='btn btn-danger' + type='button' + onClick={this.handleSubmit.bind(this)} + > + Valider + </button> + </div> + </form> + )} + </div> + </div> + </div> + </div> + ) + } else { + return false + } + } +} + +ShiftVehicleJourney.propTypes = { + onOpenShiftModal: PropTypes.func.isRequired, + onModalClose: PropTypes.func.isRequired, +} + +module.exports = ShiftVehicleJourney diff --git a/app/assets/javascripts/es6_browserified/vehicle_journeys/containers/AddVehicleJourney.js b/app/assets/javascripts/es6_browserified/vehicle_journeys/containers/tools/AddVehicleJourney.js index a0ff923bf..01b8f8d3e 100644 --- a/app/assets/javascripts/es6_browserified/vehicle_journeys/containers/AddVehicleJourney.js +++ b/app/assets/javascripts/es6_browserified/vehicle_journeys/containers/tools/AddVehicleJourney.js @@ -1,6 +1,6 @@ -var actions = require('../actions') +var actions = require('../../actions') var connect = require('react-redux').connect -var CreateModal = require('../components/CreateModal') +var CreateModal = require('../../components/tools/CreateModal') const mapStateToProps = (state) => { return { diff --git a/app/assets/javascripts/es6_browserified/vehicle_journeys/containers/DeleteVehicleJourneys.js b/app/assets/javascripts/es6_browserified/vehicle_journeys/containers/tools/DeleteVehicleJourneys.js index eb07dec0e..6bde7fd3c 100644 --- a/app/assets/javascripts/es6_browserified/vehicle_journeys/containers/DeleteVehicleJourneys.js +++ b/app/assets/javascripts/es6_browserified/vehicle_journeys/containers/tools/DeleteVehicleJourneys.js @@ -1,6 +1,6 @@ -var actions = require('../actions') +var actions = require('../../actions') var connect = require('react-redux').connect -var DeleteVJComponent = require('../components/DeleteVehicleJourneys') +var DeleteVJComponent = require('../../components/tools/DeleteVehicleJourneys') const mapStateToProps = (state) => { return { diff --git a/app/assets/javascripts/es6_browserified/vehicle_journeys/containers/tools/ShiftVehicleJourney.js b/app/assets/javascripts/es6_browserified/vehicle_journeys/containers/tools/ShiftVehicleJourney.js new file mode 100644 index 000000000..9fd6e12e8 --- /dev/null +++ b/app/assets/javascripts/es6_browserified/vehicle_journeys/containers/tools/ShiftVehicleJourney.js @@ -0,0 +1,29 @@ +var actions = require('../../actions') +var connect = require('react-redux').connect +var ShiftVJComponent = require('../../components/tools/ShiftVehicleJourney') + +const mapStateToProps = (state) => { + return { + modal: state.modal, + vehicleJourneys: state.vehicleJourneys, + status: state.status + } +} + +const mapDispatchToProps = (dispatch) => { + return { + onModalClose: () =>{ + dispatch(actions.closeModal()) + }, + onOpenShiftModal: () =>{ + dispatch(actions.openShiftModal()) + }, + onShiftVehicleJourney: (data) =>{ + dispatch(actions.shiftVehicleJourney(data)) + } + } +} + +const ShiftVehicleJourney = connect(mapStateToProps, mapDispatchToProps)(ShiftVJComponent) + +module.exports = ShiftVehicleJourney 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 127b69686..2f24b29c2 100644 --- a/app/assets/javascripts/es6_browserified/vehicle_journeys/reducers/modal.js +++ b/app/assets/javascripts/es6_browserified/vehicle_journeys/reducers/modal.js @@ -14,6 +14,12 @@ const modal = (state = {}, action) => { modalProps: {}, confirmModal: {} } + case 'SHIFT_VEHICLEJOURNEY_MODAL': + return { + type: 'shift', + 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 eac2138ce..241ebb378 100644 --- a/app/assets/javascripts/es6_browserified/vehicle_journeys/reducers/vehicleJourneys.js +++ b/app/assets/javascripts/es6_browserified/vehicle_journeys/reducers/vehicleJourneys.js @@ -14,6 +14,24 @@ const vehicleJourney= (state = {}, action) => { vehicle_journey_at_stops: [], deletable: false } + case 'SHIFT_VEHICLEJOURNEY': + let shiftedArray, shiftedSchedule, shiftedVjas + shiftedArray = state.vehicle_journey_at_stops.map((vjas, i) => { + shiftedSchedule = { + departure_time: { + hour: vjas.departure_time.hour, + minute: String(parseInt(vjas.departure_time.minute) + parseInt(action.data.additional_time.value)) + }, + arrival_time: { + hour: vjas.arrival_time.hour, + minute: String(parseInt(vjas.arrival_time.minute) + parseInt(action.data.additional_time.value)) + } + } + actions.checkSchedules(shiftedSchedule) + shiftedVjas = Object.assign({}, state.vehicle_journey_at_stops[i], shiftedSchedule) + return Object.assign({}, state.vehicle_journey_at_stops[i], shiftedVjas) + }) + return Object.assign({}, state, {vehicle_journey_at_stops: shiftedArray}) case 'UPDATE_TIME': let vj, vjas, vjasArray, newSchedule vjasArray = state.vehicle_journey_at_stops.map((vjas, i) =>{ @@ -64,6 +82,14 @@ const vehicleJourneys = (state = [], action) => { vehicleJourney(state, action), ...state ] + case 'SHIFT_VEHICLEJOURNEY': + return state.map((vj, i) => { + if (vj.objectid == action.data.objectid.value){ + return vehicleJourney(vj, action) + }else{ + return vj + } + }) 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 d7e64b100..b3a0fe810 100644 --- a/spec/javascripts/vehicle_journeys/actions_spec.js +++ b/spec/javascripts/vehicle_journeys/actions_spec.js @@ -38,7 +38,7 @@ describe('when clicking on add button', () => { }) }) describe('when clicking on validate button inside create modal', () => { - it('should create an action to create a new journey pattern', () => { + it('should create an action to create a new vehicle journey', () => { const data = {} const expectedAction = { type: 'ADD_VEHICLEJOURNEY', @@ -122,3 +122,13 @@ describe('when updating vjas time', () => { expect(actions.updateTime(val, subIndex, index, timeUnit, isDeparture, isArrivalsToggled)).toEqual(expectedAction) }) }) +describe('when clicking on validate button inside shifting modal', () => { + it('should create an action to shift a vehiclejourney schedule', () => { + const data = {} + const expectedAction = { + type: 'SHIFT_VEHICLEJOURNEY', + data + } + expect(actions.shiftVehicleJourney(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 27c2f2282..1e1c16796 100644 --- a/spec/javascripts/vehicle_journeys/reducers/vehicle_journeys_spec.js +++ b/spec/javascripts/vehicle_journeys/reducers/vehicle_journeys_spec.js @@ -13,10 +13,10 @@ let fakeFootnotes = [{ let fakeTimeTables = [] let fakeVJAS = [{ - delta : '671', + delta : 627, arrival_time : { hour: '11', - minute: '11' + minute: '55' }, departure_time : { hour: '22', @@ -31,7 +31,7 @@ describe('vehicleJourneys reducer', () => { { journey_pattern_id: 1, published_journey_name: "vj1", - objectid: 11, + objectid: '11', deletable: false, selected: false, footnotes: fakeFootnotes, @@ -41,7 +41,7 @@ describe('vehicleJourneys reducer', () => { { journey_pattern_id: 2, published_journey_name: "vj2", - objectid: 22, + objectid: '22', selected: true, deletable: false, footnotes: fakeFootnotes, @@ -91,10 +91,10 @@ describe('vehicleJourneys reducer', () => { it('should handle UPDATE_TIME', () => { const val = '33', subIndex = 0, index = 0, timeUnit = 'minute', isDeparture = true, isArrivalsToggled = true let newVJAS = [{ - delta: 682, + delta: 638, arrival_time : { hour: '11', - minute: '11' + minute: '55' }, departure_time : { hour: '22', @@ -135,4 +135,30 @@ describe('vehicleJourneys reducer', () => { }) ).toEqual([state[0], newVJ]) }) + + it('should handle SHIFT_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 = { + objectid: {value : '11'}, + additional_time: {value: '5'} + } + let newVJ = Object.assign({}, state[0], {vehicle_journey_at_stops: newVJAS}) + expect( + vjReducer(state, { + type: 'SHIFT_VEHICLEJOURNEY', + data: fakeData + }) + ).toEqual([newVJ, state[1]]) + }) }) |
