aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThomas Haddad2017-02-22 18:44:04 +0100
committerThomas Haddad2017-02-22 18:44:04 +0100
commit3b30c4a02db84c9c605b93da25d36e5f57fca9ca (patch)
tree8f58c40a9af2911706ad993b57c2e61f7edfaa86
parent2b02e23c3da71abbf2a48974d23c6b56998d214b (diff)
downloadchouette-core-3b30c4a02db84c9c605b93da25d36e5f57fca9ca.tar.bz2
Refs #2524: Add Duplicate Vehicle journey feature
Signed-off-by: Thomas Shawarma Haddad <thomas.haddad@af83.com>
-rw-r--r--app/assets/javascripts/es6_browserified/vehicle_journeys/actions/index.js8
-rw-r--r--app/assets/javascripts/es6_browserified/vehicle_journeys/components/tools/DuplicateVehicleJourney.js38
-rw-r--r--app/assets/javascripts/es6_browserified/vehicle_journeys/containers/tools/DuplicateVehicleJourney.js4
-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.js22
-rw-r--r--spec/javascripts/vehicle_journeys/actions_spec.js10
-rw-r--r--spec/javascripts/vehicle_journeys/reducers/vehicle_journeys_spec.js28
7 files changed, 93 insertions, 23 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 a2a363d6e..a80a96925 100644
--- a/app/assets/javascripts/es6_browserified/vehicle_journeys/actions/index.js
+++ b/app/assets/javascripts/es6_browserified/vehicle_journeys/actions/index.js
@@ -39,6 +39,9 @@ const actions = {
openShiftModal : () => ({
type : 'SHIFT_VEHICLEJOURNEY_MODAL'
}),
+ openDuplicateModal : () => ({
+ type : 'DUPLICATE_VEHICLEJOURNEY_MODAL'
+ }),
selectVehicleJourney : (index) => ({
type : 'SELECT_VEHICLEJOURNEY',
index
@@ -51,8 +54,9 @@ const actions = {
type: 'SHIFT_VEHICLEJOURNEY',
data
}),
- duplicateVehicleJourneys : (data) => ({
- type: 'DUPLICATE_VEHICLEJOURNEY'
+ duplicateVehicleJourney : (data) => ({
+ type: 'DUPLICATE_VEHICLEJOURNEY',
+ data
}),
deleteVehicleJourneys : () => ({
type: 'DELETE_VEHICLEJOURNEYS'
diff --git a/app/assets/javascripts/es6_browserified/vehicle_journeys/components/tools/DuplicateVehicleJourney.js b/app/assets/javascripts/es6_browserified/vehicle_journeys/components/tools/DuplicateVehicleJourney.js
index adad22aa1..3e0ff627e 100644
--- a/app/assets/javascripts/es6_browserified/vehicle_journeys/components/tools/DuplicateVehicleJourney.js
+++ b/app/assets/javascripts/es6_browserified/vehicle_journeys/components/tools/DuplicateVehicleJourney.js
@@ -24,7 +24,7 @@ class DuplicateVehicleJourney extends Component {
return (
<div className='pull-left'>
<button
- disabled= {(actions.getSelected(this.props.vehicleJourneys).length > 0) ? false : true}
+ disabled= {(actions.getSelected(this.props.vehicleJourneys).length == 1) ? false : true}
type='button'
className='btn btn-primary btn-sm'
data-toggle='modal'
@@ -34,32 +34,34 @@ class DuplicateVehicleJourney extends Component {
<span className='fa fa-files-o'></span>
</button>
- <div className={ 'modal fade ' + ((this.props.modal.type == 'shift') ? 'in' : '') } id='DuplicateVehicleJourneyModal'>
+ <div className={ 'modal fade ' + ((this.props.modal.type == 'duplicate') ? 'in' : '') } id='DuplicateVehicleJourneyModal'>
<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') && (
+ {(this.props.modal.type == 'duplicate') && (
<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>
+ <span>Dupliquer les horaires de la course suivante : {actions.getSelected(this.props.vehicleJourneys)[0].objectid}</span>
+ </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'>Nombre de courses à créer et dupliquer</label>
+ <input
+ type='number'
+ ref='duplicate_number'
+ min='1'
+ max='20'
+ className='form-control'
+ onKeyDown={(e) => actions.resetValidation(e.currentTarget)}
+ required
+ />
+ </div>
+ </div>
</div>
<div className='row'>
<div className='col-lg-6 col-md-6 col-sm-6 col-xs-6'>
diff --git a/app/assets/javascripts/es6_browserified/vehicle_journeys/containers/tools/DuplicateVehicleJourney.js b/app/assets/javascripts/es6_browserified/vehicle_journeys/containers/tools/DuplicateVehicleJourney.js
index 942415200..417906f6f 100644
--- a/app/assets/javascripts/es6_browserified/vehicle_journeys/containers/tools/DuplicateVehicleJourney.js
+++ b/app/assets/javascripts/es6_browserified/vehicle_journeys/containers/tools/DuplicateVehicleJourney.js
@@ -18,8 +18,8 @@ const mapDispatchToProps = (dispatch) => {
onOpenDuplicateModal: () =>{
dispatch(actions.openDuplicateModal())
},
- onDuplicateVehicleJourneys: (data) =>{
- dispatch(actions.duplicateVehicleJourneys(data))
+ onDuplicateVehicleJourney: (data) =>{
+ dispatch(actions.duplicateVehicleJourney(data))
}
}
}
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 2f24b29c2..62870e27d 100644
--- a/app/assets/javascripts/es6_browserified/vehicle_journeys/reducers/modal.js
+++ b/app/assets/javascripts/es6_browserified/vehicle_journeys/reducers/modal.js
@@ -20,6 +20,12 @@ const modal = (state = {}, action) => {
modalProps: {},
confirmModal: {}
}
+ case 'DUPLICATE_VEHICLEJOURNEY_MODAL':
+ return {
+ type: 'duplicate',
+ 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 ee8dacc98..346975216 100644
--- a/app/assets/javascripts/es6_browserified/vehicle_journeys/reducers/vehicleJourneys.js
+++ b/app/assets/javascripts/es6_browserified/vehicle_journeys/reducers/vehicleJourneys.js
@@ -24,6 +24,7 @@ const vehicleJourney= (state = {}, action) => {
selected: false,
deletable: false
}
+ case 'DUPLICATE_VEHICLEJOURNEY':
case 'SHIFT_VEHICLEJOURNEY':
let shiftedArray, shiftedSchedule, shiftedVjas
shiftedArray = state.vehicle_journey_at_stops.map((vjas, i) => {
@@ -94,12 +95,31 @@ const vehicleJourneys = (state = [], action) => {
]
case 'SHIFT_VEHICLEJOURNEY':
return state.map((vj, i) => {
- if (vj.selected && (actions.getSelected(state).length == 1)){
+ if (vj.selected){
return vehicleJourney(vj, action)
}else{
return vj
}
})
+ case 'DUPLICATE_VEHICLEJOURNEY':
+ let dupeVj
+ let dupes = []
+ let selectedIndex
+ state.map((vj, i) => {
+ if(vj.selected){
+ selectedIndex = i
+ for (i = 0; i< action.data.duplicate_number.value; i++){
+ dupeVj = vehicleJourney(vj, action)
+ dupeVj.comment = dupeVj.comment + '-' + i
+ dupeVj.selected = false
+ delete dupeVj['objectid']
+ dupes.push(dupeVj)
+ }
+ }
+ })
+ let concatArray = state.slice(0, selectedIndex + 1).concat(dupes)
+ concatArray = concatArray.concat(state.slice(selectedIndex + 1))
+ return concatArray
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 b3a0fe810..952c80312 100644
--- a/spec/javascripts/vehicle_journeys/actions_spec.js
+++ b/spec/javascripts/vehicle_journeys/actions_spec.js
@@ -132,3 +132,13 @@ describe('when clicking on validate button inside shifting modal', () => {
expect(actions.shiftVehicleJourney(data)).toEqual(expectedAction)
})
})
+describe('when clicking on validate button inside duplicating modal', () => {
+ it('should create an action to duplicate a vehiclejourney schedule', () => {
+ const data = {}
+ const expectedAction = {
+ type: 'DUPLICATE_VEHICLEJOURNEY',
+ data
+ }
+ expect(actions.duplicateVehicleJourney(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 01a66bc01..dc04d5bf7 100644
--- a/spec/javascripts/vehicle_journeys/reducers/vehicle_journeys_spec.js
+++ b/spec/javascripts/vehicle_journeys/reducers/vehicle_journeys_spec.js
@@ -173,4 +173,32 @@ describe('vehicleJourneys reducer', () => {
})
).toEqual([newVJ, state[1]])
})
+
+ it('should handle DUPLICATE_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 = {
+ duplicate_number: {value : 1},
+ additional_time: {value: '5'}
+ }
+ let newVJ = Object.assign({}, state[0], {vehicle_journey_at_stops: newVJAS, selected: false})
+ newVJ.comment = state[0].comment + '-0'
+ delete newVJ['objectid']
+ expect(
+ vjReducer(state, {
+ type: 'DUPLICATE_VEHICLEJOURNEY',
+ data: fakeData
+ })
+ ).toEqual([state[0], newVJ, state[1]])
+ })
})