aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThomas Haddad2017-02-21 16:56:41 +0100
committerThomas Haddad2017-02-21 16:59:24 +0100
commitdd8487d6771ac76ebc60eff7e50730b2314a0ec2 (patch)
treeb6a82d8921f10bd23ae92c82cb63e5cb3f1e47aa
parent9985fe272fe0edd09ebe896ab12f4bec40a86264 (diff)
downloadchouette-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>
-rw-r--r--app/assets/javascripts/es6_browserified/vehicle_journeys/actions/index.js44
-rw-r--r--app/assets/javascripts/es6_browserified/vehicle_journeys/components/App.js6
-rw-r--r--app/assets/javascripts/es6_browserified/vehicle_journeys/components/tools/CreateModal.js (renamed from app/assets/javascripts/es6_browserified/vehicle_journeys/components/CreateModal.js)2
-rw-r--r--app/assets/javascripts/es6_browserified/vehicle_journeys/components/tools/DeleteVehicleJourneys.js (renamed from app/assets/javascripts/es6_browserified/vehicle_journeys/components/DeleteVehicleJourneys.js)0
-rw-r--r--app/assets/javascripts/es6_browserified/vehicle_journeys/components/tools/ShiftVehicleJourney.js114
-rw-r--r--app/assets/javascripts/es6_browserified/vehicle_journeys/containers/tools/AddVehicleJourney.js (renamed from app/assets/javascripts/es6_browserified/vehicle_journeys/containers/AddVehicleJourney.js)4
-rw-r--r--app/assets/javascripts/es6_browserified/vehicle_journeys/containers/tools/DeleteVehicleJourneys.js (renamed from app/assets/javascripts/es6_browserified/vehicle_journeys/containers/DeleteVehicleJourneys.js)4
-rw-r--r--app/assets/javascripts/es6_browserified/vehicle_journeys/containers/tools/ShiftVehicleJourney.js29
-rw-r--r--app/assets/javascripts/es6_browserified/vehicle_journeys/reducers/modal.js6
-rw-r--r--app/assets/javascripts/es6_browserified/vehicle_journeys/reducers/vehicleJourneys.js26
-rw-r--r--spec/javascripts/vehicle_journeys/actions_spec.js12
-rw-r--r--spec/javascripts/vehicle_journeys/reducers/vehicle_journeys_spec.js38
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]])
+ })
})