aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--app/assets/javascripts/es6_browserified/vehicle_journeys/actions/index.js14
-rw-r--r--app/assets/javascripts/es6_browserified/vehicle_journeys/components/tools/CreateModal.js17
-rw-r--r--app/assets/javascripts/es6_browserified/vehicle_journeys/components/tools/MissionSelect2.js62
-rw-r--r--app/assets/javascripts/es6_browserified/vehicle_journeys/containers/tools/AddVehicleJourney.js7
-rw-r--r--app/assets/javascripts/es6_browserified/vehicle_journeys/reducers/modal.js3
-rw-r--r--app/assets/javascripts/es6_browserified/vehicle_journeys/reducers/vehicleJourneys.js5
-rw-r--r--app/controllers/journey_patterns_collections_controller.rb2
-rw-r--r--app/views/api/v1/journey_patterns/show.rabl2
-rw-r--r--spec/javascripts/vehicle_journeys/actions_spec.js26
-rw-r--r--spec/javascripts/vehicle_journeys/reducers/modal_spec.js10
-rw-r--r--spec/javascripts/vehicle_journeys/reducers/vehicle_journeys_spec.js7
11 files changed, 130 insertions, 25 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 d7fc52719..861671e35 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,15 @@ const actions = {
openCreateModal : () => ({
type : 'CREATE_VEHICLEJOURNEY_MODAL'
}),
+ selectJPCreateModal : (selectedJP) => ({
+ type : 'SELECT_JP_CREATE_MODAL',
+ selectedItem: {
+ id: selectedJP.id,
+ objectid: selectedJP.object_id,
+ name: selectedJP.name,
+ published_name: selectedJP.published_name
+ }
+ }),
openEditModal : (vehicleJourney) => ({
type : 'EDIT_VEHICLEJOURNEY_MODAL',
vehicleJourney
@@ -74,9 +83,10 @@ const actions = {
cancelSelection : () => ({
type: 'CANCEL_SELECTION'
}),
- addVehicleJourney : (data) => ({
+ addVehicleJourney : (data, selectedJourneyPattern) => ({
type: 'ADD_VEHICLEJOURNEY',
- data
+ data,
+ selectedJourneyPattern
}),
editVehicleJourney : (data) => ({
type: 'EDIT_VEHICLEJOURNEY',
diff --git a/app/assets/javascripts/es6_browserified/vehicle_journeys/components/tools/CreateModal.js b/app/assets/javascripts/es6_browserified/vehicle_journeys/components/tools/CreateModal.js
index 7ae3d4a8a..dbac7c392 100644
--- a/app/assets/javascripts/es6_browserified/vehicle_journeys/components/tools/CreateModal.js
+++ b/app/assets/javascripts/es6_browserified/vehicle_journeys/components/tools/CreateModal.js
@@ -2,6 +2,7 @@ var React = require('react')
var Component = require('react').Component
var PropTypes = require('react').PropTypes
var actions = require('../../actions')
+var MissionSelect2 = require('./MissionSelect2')
class CreateModal extends Component {
constructor(props) {
@@ -9,8 +10,9 @@ class CreateModal extends Component {
}
handleSubmit() {
- if(actions.validateFields(this.refs) == true) {
- this.props.onAddVehicleJourney(this.refs)
+ if(actions.validateFields(this.refs) == true && this.props.modal.modalProps.selectedJPModal) {
+ this.props.onAddVehicleJourney(this.refs, this.props.modal.modalProps.selectedJPModal)
+ this.props.onModalClose()
$('#NewVehicleJourneyModal').modal('hide')
}
}
@@ -57,13 +59,7 @@ class CreateModal extends Component {
<div className='col-lg-6 col-md-6 col-sm-6 col-xs-6'>
<div className='form-group'>
<label className='control-label is-required'>ID de la mission</label>
- <input
- type='text'
- ref='journey_pattern_objectid'
- className='form-control'
- onKeyDown={(e) => actions.resetValidation(e.currentTarget)}
- required
- />
+ <MissionSelect2 onSelectJPModal={this.props.onSelectJPModal} />
</div>
</div>
</div>
@@ -104,7 +100,8 @@ CreateModal.propTypes = {
status: PropTypes.object.isRequired,
onOpenCreateModal: PropTypes.func.isRequired,
onModalClose: PropTypes.func.isRequired,
- onAddVehicleJourney: PropTypes.func.isRequired
+ onAddVehicleJourney: PropTypes.func.isRequired,
+ onSelectJPModal: PropTypes.func.isRequired
}
module.exports = CreateModal
diff --git a/app/assets/javascripts/es6_browserified/vehicle_journeys/components/tools/MissionSelect2.js b/app/assets/javascripts/es6_browserified/vehicle_journeys/components/tools/MissionSelect2.js
new file mode 100644
index 000000000..0ab4475ac
--- /dev/null
+++ b/app/assets/javascripts/es6_browserified/vehicle_journeys/components/tools/MissionSelect2.js
@@ -0,0 +1,62 @@
+var React = require('react')
+var PropTypes = require('react').PropTypes
+var Select2 = require('react-select2')
+
+// get JSON full path
+var origin = window.location.origin
+var path = window.location.pathname.split('/', 7).join('/')
+
+
+class BSelect4 extends React.Component{
+ constructor(props) {
+ super(props)
+ }
+
+ render() {
+ return (
+ <Select2
+ defaultValue=''
+ onSelect={(e) => this.props.onSelectJPModal(e) }
+ ref='journey_pattern_id'
+ options={{
+ placeholder: 'Nom d\'une mission existante',
+ allowClear: true,
+ language: 'fr', /* Doesn't seem to work... :( */
+ theme: 'bootstrap',
+ width: '100%',
+ ajax: {
+ url: origin + path + '/journey_patterns_collection.json',
+ dataType: 'json',
+ delay: '500',
+ data: function(params) {
+ return {
+ q: {published_name_cont: params.term},
+ };
+ },
+ processResults: function(data, params) {
+
+ return {
+ results: data.map(
+ item => Object.assign(
+ {},
+ item,
+ {text: item.published_name, complete_jp: item}
+ )
+ )
+ };
+ },
+ cache: true
+ },
+ minimumInputLength: 3,
+ templateResult: formatRepo
+ }}
+ />
+ )
+ }
+}
+
+const formatRepo = (props) => {
+ if(props.text) return props.text
+}
+
+module.exports = BSelect4
diff --git a/app/assets/javascripts/es6_browserified/vehicle_journeys/containers/tools/AddVehicleJourney.js b/app/assets/javascripts/es6_browserified/vehicle_journeys/containers/tools/AddVehicleJourney.js
index 68490338a..c4c746b81 100644
--- a/app/assets/javascripts/es6_browserified/vehicle_journeys/containers/tools/AddVehicleJourney.js
+++ b/app/assets/javascripts/es6_browserified/vehicle_journeys/containers/tools/AddVehicleJourney.js
@@ -16,11 +16,14 @@ const mapDispatchToProps = (dispatch) => {
onModalClose: () =>{
dispatch(actions.closeModal())
},
- onAddVehicleJourney: (data) =>{
- dispatch(actions.addVehicleJourney(data))
+ onAddVehicleJourney: (data, selectedJourneyPattern) =>{
+ dispatch(actions.addVehicleJourney(data, selectedJourneyPattern))
},
onOpenCreateModal: () =>{
dispatch(actions.openCreateModal())
+ },
+ onSelectJPModal: (e) =>{
+ dispatch(actions.selectJPCreateModal(e.params.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 26a03471b..34c8e2dad 100644
--- a/app/assets/javascripts/es6_browserified/vehicle_journeys/reducers/modal.js
+++ b/app/assets/javascripts/es6_browserified/vehicle_journeys/reducers/modal.js
@@ -78,6 +78,9 @@ const modal = (state = {}, action) => {
modalProps: {},
confirmModal: {}
}
+ case 'SELECT_JP_CREATE_MODAL':
+ newModalProps = {selectedJPModal : action.selectedItem}
+ return Object.assign({}, state, {modalProps: newModalProps})
case 'SHIFT_VEHICLEJOURNEY_MODAL':
return {
type: 'shift',
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 c83647bd7..70b8d5479 100644
--- a/app/assets/javascripts/es6_browserified/vehicle_journeys/reducers/vehicleJourneys.js
+++ b/app/assets/javascripts/es6_browserified/vehicle_journeys/reducers/vehicleJourneys.js
@@ -16,11 +16,8 @@ const vehicleJourney= (state = {}, action) => {
vj.delta = 0
delete vj['stop_area_object_id']
})
- let journeyPattern = {
- objectid: action.data.journey_pattern_objectid.value
- }
return {
- journey_pattern: journeyPattern,
+ journey_pattern: action.selectedJourneyPattern,
published_journey_name: action.data.published_journey_name.value,
objectid: '',
footnotes: [],
diff --git a/app/controllers/journey_patterns_collections_controller.rb b/app/controllers/journey_patterns_collections_controller.rb
index 23f6c3b70..215a1736c 100644
--- a/app/controllers/journey_patterns_collections_controller.rb
+++ b/app/controllers/journey_patterns_collections_controller.rb
@@ -10,7 +10,7 @@ class JourneyPatternsCollectionsController < ChouetteController
alias_method :route, :parent
def show
- @q = route.journey_patterns.includes(:stop_points)
+ @q = route.journey_patterns.search(params[:q]).result(distinct: true).includes(:stop_points)
@journey_patterns ||= @q.paginate(:page => params[:page]).order(:name)
end
diff --git a/app/views/api/v1/journey_patterns/show.rabl b/app/views/api/v1/journey_patterns/show.rabl
index 808808462..21f25e480 100644
--- a/app/views/api/v1/journey_patterns/show.rabl
+++ b/app/views/api/v1/journey_patterns/show.rabl
@@ -1,7 +1,7 @@
object @journey_pattern
extends "api/v1/trident_objects/show"
-[:name, :published_name, :registration_number, :comment].each do |attr|
+[:id, :name, :published_name, :registration_number, :comment].each do |attr|
attributes attr, :unless => lambda { |m| m.send( attr).nil?}
end
diff --git a/spec/javascripts/vehicle_journeys/actions_spec.js b/spec/javascripts/vehicle_journeys/actions_spec.js
index 593e1b092..3824893e4 100644
--- a/spec/javascripts/vehicle_journeys/actions_spec.js
+++ b/spec/javascripts/vehicle_journeys/actions_spec.js
@@ -37,14 +37,36 @@ describe('when clicking on add button', () => {
expect(actions.openCreateModal()).toEqual(expectedAction)
})
})
+describe('when using select2 to pick a journey pattern', () => {
+ it('should create an action to select a journey pattern inside modal', () => {
+ let selectedJP = {
+ id: 1,
+ object_id: 2,
+ name: 'test',
+ published_name: 'test'
+ }
+ const expectedAction = {
+ type: 'SELECT_JP_CREATE_MODAL',
+ selectedItem:{
+ id: selectedJP.id,
+ objectid: selectedJP.object_id,
+ name: selectedJP.name,
+ published_name: selectedJP.published_name
+ }
+ }
+ expect(actions.selectJPCreateModal(selectedJP)).toEqual(expectedAction)
+ })
+})
describe('when clicking on validate button inside create modal', () => {
it('should create an action to create a new vehicle journey', () => {
const data = {}
+ const selectedJourneyPattern = {}
const expectedAction = {
type: 'ADD_VEHICLEJOURNEY',
- data
+ data,
+ selectedJourneyPattern
}
- expect(actions.addVehicleJourney(data)).toEqual(expectedAction)
+ expect(actions.addVehicleJourney(data, selectedJourneyPattern)).toEqual(expectedAction)
})
})
describe('when previous navigation button is clicked', () => {
diff --git a/spec/javascripts/vehicle_journeys/reducers/modal_spec.js b/spec/javascripts/vehicle_journeys/reducers/modal_spec.js
index 576656c88..edf55ca65 100644
--- a/spec/javascripts/vehicle_journeys/reducers/modal_spec.js
+++ b/spec/javascripts/vehicle_journeys/reducers/modal_spec.js
@@ -42,6 +42,16 @@ describe('modal reducer', () => {
).toEqual(Object.assign({}, state, { type: 'create' }))
})
+ it('should handle SELECT_JP_CREATE_MODAL', () => {
+ let newModalProps = {selectedJPModal : {id: 1}}
+ expect(
+ modalReducer(state, {
+ type: 'SELECT_JP_CREATE_MODAL',
+ selectedItem: {id: 1}
+ })
+ ).toEqual(Object.assign({}, state, {modalProps: newModalProps}))
+ })
+
it('should handle CLOSE_MODAL', () => {
expect(
modalReducer(state, {
diff --git a/spec/javascripts/vehicle_journeys/reducers/vehicle_journeys_spec.js b/spec/javascripts/vehicle_journeys/reducers/vehicle_journeys_spec.js
index 02e9deffc..60e78047e 100644
--- a/spec/javascripts/vehicle_journeys/reducers/vehicle_journeys_spec.js
+++ b/spec/javascripts/vehicle_journeys/reducers/vehicle_journeys_spec.js
@@ -85,16 +85,17 @@ describe('vehicleJourneys reducer', () => {
}
}]
let fakeData = {
- journey_pattern_objectid: {value : '1'},
published_journey_name: {value: 'test'}
}
+ let fakeSelectedJourneyPattern = { id: "1"}
expect(
vjReducer(state, {
type: 'ADD_VEHICLEJOURNEY',
- data: fakeData
+ data: fakeData,
+ selectedJourneyPattern: fakeSelectedJourneyPattern
})
).toEqual([{
- journey_pattern: {objectid: '1'},
+ journey_pattern: fakeSelectedJourneyPattern,
published_journey_name: 'test',
objectid: '',
footnotes: [],