diff options
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: [],  | 
