diff options
8 files changed, 101 insertions, 15 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 74d2903e0..c97728f4e 100644 --- a/app/assets/javascripts/es6_browserified/vehicle_journeys/actions/index.js +++ b/app/assets/javascripts/es6_browserified/vehicle_journeys/actions/index.js @@ -63,12 +63,16 @@ const actions = {      vehicleJourneys    }),    selectTTCalendarsModal: (selectedTT) =>({ -    type: 'SEELCT_TT_CALENDAR_MODAL', +    type: 'SELECT_TT_CALENDAR_MODAL',      selectedItem:{ -      id: selectedTT.id -      // TODO add relevant attributes +      id: selectedTT.id, +      comment: selectedTT.comment, +      objectid: selectedTT.objectid      }    }), +  addSelectedTimetable: () => ({ +    type: 'ADD_SELECTED_TIMETABLE' +  }),    deleteCalendarModal : (timetable) => ({      type : 'DELETE_CALENDAR_MODAL',      timetable @@ -202,7 +206,8 @@ const actions = {              for (tt of val.time_tables){                timeTables.push({                  objectid: tt.objectid, -                comment: tt.comment +                comment: tt.comment, +                id: tt.id                })              }              let vjasWithDelta = val.vehicle_journey_at_stops.map((vjas, i) => { diff --git a/app/assets/javascripts/es6_browserified/vehicle_journeys/components/tools/CalendarsEditVehicleJourney.js b/app/assets/javascripts/es6_browserified/vehicle_journeys/components/tools/CalendarsEditVehicleJourney.js index fca2934cd..3359ca44d 100644 --- a/app/assets/javascripts/es6_browserified/vehicle_journeys/components/tools/CalendarsEditVehicleJourney.js +++ b/app/assets/javascripts/es6_browserified/vehicle_journeys/components/tools/CalendarsEditVehicleJourney.js @@ -64,6 +64,7 @@ class CalendarsEditVehicleJourney extends Component {                                <label className='control-label is-required'>Ajouter un calendrier</label>                                <TimetableSelect2 onSelect2Timetable={this.props.onSelect2Timetable} />                                <button +                                onClick={this.props.onAddSelectedTimetable}                                  type='button'                                ><span className='fa fa-times'>Ajouter</span>                                </button> @@ -109,6 +110,7 @@ CalendarsEditVehicleJourney.propTypes = {    onCalendarsEditVehicleJourney: PropTypes.func.isRequired,    onDeleteCalendarModal: PropTypes.func.isRequired,    onSelect2Timetable: PropTypes.func.isRequired, +  onAddSelectedTimetable: PropTypes.func.isRequired,    filters: PropTypes.object.isRequired  } diff --git a/app/assets/javascripts/es6_browserified/vehicle_journeys/components/tools/select2s/TimetableSelect2.js b/app/assets/javascripts/es6_browserified/vehicle_journeys/components/tools/select2s/TimetableSelect2.js index 170150a36..93ed4e0c1 100644 --- a/app/assets/javascripts/es6_browserified/vehicle_journeys/components/tools/select2s/TimetableSelect2.js +++ b/app/assets/javascripts/es6_browserified/vehicle_journeys/components/tools/select2s/TimetableSelect2.js @@ -40,7 +40,7 @@ class BSelect4 extends React.Component{                    item => Object.assign(                      {},                      item, -                    {text: item.published_name, complete_jp: item} +                    {text: item.comment}                    )                  )                }; diff --git a/app/assets/javascripts/es6_browserified/vehicle_journeys/containers/tools/CalendarsEditVehicleJourney.js b/app/assets/javascripts/es6_browserified/vehicle_journeys/containers/tools/CalendarsEditVehicleJourney.js index 1e58ed5fd..130acb017 100644 --- a/app/assets/javascripts/es6_browserified/vehicle_journeys/containers/tools/CalendarsEditVehicleJourney.js +++ b/app/assets/javascripts/es6_browserified/vehicle_journeys/containers/tools/CalendarsEditVehicleJourney.js @@ -26,8 +26,10 @@ const mapDispatchToProps = (dispatch) => {        dispatch(actions.editVehicleJourneyCalendars(calendars))      },      onSelect2Timetable: (e) =>{ -      console.log(e.params.data)        dispatch(actions.selectTTCalendarsModal(e.params.data)) +    }, +    onAddSelectedTimetable: () => { +      dispatch(actions.addSelectedTimetable())      }    }  } 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 34c8e2dad..de424c25e 100644 --- a/app/assets/javascripts/es6_browserified/vehicle_journeys/reducers/modal.js +++ b/app/assets/javascripts/es6_browserified/vehicle_journeys/reducers/modal.js @@ -1,3 +1,4 @@ +var _ = require('lodash')  let vehicleJourneysModal, newModalProps  const modal = (state = {}, action) => {    switch (action.type) { @@ -40,7 +41,7 @@ const modal = (state = {}, action) => {        let timetable = {}        vehicleJourneysModal.map((vj, i) => {          vj.time_tables.map((tt, j) =>{ -          if(!isInArray(tt, uniqTimetables)){ +          if(!(_.find(uniqTimetables, tt))){              uniqTimetables.push(tt)            }          }) @@ -53,6 +54,28 @@ const modal = (state = {}, action) => {          },          confirmModal: {}        } +    case 'SELECT_TT_CALENDAR_MODAL': +      newModalProps = Object.assign({}, state.modalProps, {selectedTimetable : action.selectedItem}) +      return Object.assign({}, state, {modalProps: newModalProps}) +    case 'ADD_SELECTED_TIMETABLE': +      if(state.modalProps.selectedTimetable){ +        newModalProps = JSON.parse(JSON.stringify(state.modalProps)) +        newModalProps.vehicleJourneys.map((vj) => { +          let isPresent = false +          vj.time_tables.forEach((tt) =>{ +            if (_.isEqual(newModalProps.selectedTimetable.objectid, tt.objectid)){ +              isPresent = true +            } +          }) +          if (!isPresent){ +            vj.time_tables.push(newModalProps.selectedTimetable) +          } +        }) +        if (!_.find(newModalProps.timetables, newModalProps.selectedTimetable)){ +          newModalProps.timetables.push(newModalProps.selectedTimetable) +        } +        return Object.assign({}, state, {modalProps: newModalProps}) +      }      case 'DELETE_CALENDAR_MODAL':        newModalProps = JSON.parse(JSON.stringify(state.modalProps))        let timetablesModal = state.modalProps.timetables.slice(0) @@ -64,7 +87,7 @@ const modal = (state = {}, action) => {        vehicleJourneysModal = state.modalProps.vehicleJourneys.slice(0)        vehicleJourneysModal.map((vj) =>{          vj.time_tables.map((tt, i) =>{ -          if (tt == action.timetable){ +          if (_.isEqual(tt, action.timetable)){              vj.time_tables.splice(i, 1)            }          }) @@ -104,8 +127,4 @@ const modal = (state = {}, action) => {    }  } -function isInArray(value, array) { -  return array.indexOf(value) > -1; -} -  module.exports = modal diff --git a/package.json b/package.json index 786578453..019e63063 100644 --- a/package.json +++ b/package.json @@ -7,6 +7,7 @@      "babelify": "7.3.0",      "browserify": "13.1.1",      "browserify-incremental": "3.1.1", +    "lodash": "^4.17.4",      "react": "15.3.2",      "react-dom": "15.3.2",      "react-redux": "4.4.5", diff --git a/spec/javascripts/vehicle_journeys/actions_spec.js b/spec/javascripts/vehicle_journeys/actions_spec.js index 3824893e4..56a2e8511 100644 --- a/spec/javascripts/vehicle_journeys/actions_spec.js +++ b/spec/javascripts/vehicle_journeys/actions_spec.js @@ -244,3 +244,29 @@ describe('when clicking on validate button inside calendars modal', () => {      expect(actions.editVehicleJourneyCalendars(vehicleJourneys)).toEqual(expectedAction)    })  }) +describe('when clicking on add button inside calendars modal', () => { +  it('should create an action to add the selected timetable to preselected vjs', () => { +    const expectedAction = { +      type: 'ADD_SELECTED_TIMETABLE', +    } +    expect(actions.addSelectedTimetable()).toEqual(expectedAction) +  }) +}) +describe('when using select2 to pick a timetable', () => { +  it('should create an action to select a timetable inside modal', () => { +    let selectedTT = { +      id: 1, +      objectid: 2, +      comment: 'test', +    } +    const expectedAction = { +      type: 'SELECT_TT_CALENDAR_MODAL', +      selectedItem:{ +        id: selectedTT.id, +        objectid: selectedTT.objectid, +        comment: selectedTT.comment, +      } +    } +    expect(actions.selectTTCalendarsModal(selectedTT)).toEqual(expectedAction) +  }) +}) diff --git a/spec/javascripts/vehicle_journeys/reducers/modal_spec.js b/spec/javascripts/vehicle_journeys/reducers/modal_spec.js index edf55ca65..7c81d729b 100644 --- a/spec/javascripts/vehicle_journeys/reducers/modal_spec.js +++ b/spec/javascripts/vehicle_journeys/reducers/modal_spec.js @@ -105,14 +105,45 @@ describe('modal reducer', () => {      ).toEqual(Object.assign({}, state, {type: 'calendars_edit', modalProps: modalPropsResult}))    }) +  it('should handle SELECT_TT_CALENDAR_MODAL', () => { +    let newModalProps = {selectedTimetable : {id: 1}} +    expect( +      modalReducer(state, { +        type: 'SELECT_TT_CALENDAR_MODAL', +        selectedItem: {id: 1} +      }) +    ).toEqual(Object.assign({}, state, {modalProps: newModalProps})) +  }) + +  it('should handle ADD_SELECTED_TIMETABLE', () => { +    let fakeTimetables = [{'test': 'test'}, {'test 2': 'test 2'}, {'add': 'add'}] +    let newTimeTables = [{'test': 'test'}, {'test 2': 'test 2'}, {'add': 'add'}] +    let fakeVehicleJourneys= [{time_tables: fakeTimetables}, {time_tables: newTimeTables}] +    state.modalProps.vehicleJourneys = fakeVehicleJourneys +    state.modalProps.timetables = fakeTimetables +    state.modalProps.selectedTimetable = {'add': 'add'} +    let newState = { +      type: '', +      modalProps:{ +        vehicleJourneys: [{time_tables: newTimeTables},{time_tables: newTimeTables}], +        timetables: [{'test': 'test'},{'test 2': 'test 2'},{'add': 'add'}], +        selectedTimetable: {'add': 'add'} +      }, +      confirmModal: {} +    } +    expect( +      modalReducer(state, { +        type: 'ADD_SELECTED_TIMETABLE', +      }) +    ).toEqual(newState) +  }) +    it('should handle DELETE_CALENDAR_MODAL', () => { -    // TODO spec more for vehiclejourneys      let deletableTimetable = {'delete': 'delete'}      let fakeTimetables = [{'test': 'test'}, {'test 2': 'test 2'}, deletableTimetable]      let newTimeTables = [{'test': 'test'}, {'test 2': 'test 2'}]      let fakeVehicleJourneys= [{time_tables: fakeTimetables}, {time_tables: fakeTimetables}] -    state.modalProps = {vehicleJourneys : fakeVehicleJourneys, timetables: fakeTimetables } -    let footnote = {} +    state.modalProps = Object.assign({}, state.modalProps,{vehicleJourneys : fakeVehicleJourneys, timetables: fakeTimetables })      let newState = {        // for the sake of the test, no need to specify the type        type: '', | 
