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: '', |
