diff options
| author | Xinhui | 2017-06-16 17:58:08 +0200 |
|---|---|---|
| committer | Xinhui | 2017-06-16 17:58:08 +0200 |
| commit | 641b1458236d2718a76ffaf0c04a5998623276bf (patch) | |
| tree | db738af25bcdd7b3b400a0f8db5e6350ef373c51 /app/assets/javascripts | |
| parent | 6886441ce86bcd720b27cdd089567def5b9d771a (diff) | |
| parent | 9ef3d205aa091d509455b3607d5ecc74431c6196 (diff) | |
| download | chouette-core-641b1458236d2718a76ffaf0c04a5998623276bf.tar.bz2 | |
Merge branch 'master' into staging
Diffstat (limited to 'app/assets/javascripts')
34 files changed, 402 insertions, 206 deletions
diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js index b90f7539d..0024b62b5 100644 --- a/app/assets/javascripts/application.js +++ b/app/assets/javascripts/application.js @@ -4,7 +4,6 @@ // It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the // the compiled file. // -//= require turbolinks //= require jquery //= require jquery_ujs //= require modernizr diff --git a/app/assets/javascripts/cleanup.coffee b/app/assets/javascripts/cleanup.coffee new file mode 100644 index 000000000..169a006a9 --- /dev/null +++ b/app/assets/javascripts/cleanup.coffee @@ -0,0 +1,9 @@ +$(document).on("change", 'input[name="clean_up[date_type]"]', (e) -> + type = $(this).val() + end_date = $('.cleanup_end_date_wrapper') + + if type == 'between' + end_date.removeClass('hidden').show() + else + end_date.hide() +) diff --git a/app/assets/javascripts/es6_browserified/itineraries/index.js b/app/assets/javascripts/es6_browserified/itineraries/index.js index 53f7bc7f9..2f1e9d180 100644 --- a/app/assets/javascripts/es6_browserified/itineraries/index.js +++ b/app/assets/javascripts/es6_browserified/itineraries/index.js @@ -38,7 +38,7 @@ const getInitialState = () => { for_alighting: v.for_alighting || "normal", longitude: v.longitude || 0, latitude: v.latitude || 0, - comment: v.comment, + comment: v.comment ? v.comment.replace("'", "\'") : '', olMap: { isOpened: false, json: {} @@ -66,11 +66,31 @@ render( document.querySelector('input[name=commit]').addEventListener('click', (event)=>{ let state = store.getState() - state.stopPoints.map((stopPoint, i) => { - addInput('id', (datas[i]) ? datas[i].stoppoint_id : '', i) - addInput('stop_area_id',stopPoint.stoparea_id, i) - addInput('position',i, i) - addInput('for_boarding',stopPoint.for_boarding, i) - addInput('for_alighting',stopPoint.for_alighting, i) - }) + + if(state.stopPoints.length >= 2) { + state.stopPoints.map((stopPoint, i) => { + addInput('id', (datas[i]) ? datas[i].stoppoint_id : '', i) + addInput('stop_area_id',stopPoint.stoparea_id, i) + addInput('position',i, i) + addInput('for_boarding',stopPoint.for_boarding, i) + addInput('for_alighting',stopPoint.for_alighting, i) + }) + if(state.stopPoints.length < datas.length){ + for(var j= state.stopPoints.length; j < datas.length; j++){ + updateFormForDeletion(datas[j]) + } + } + } else { + event.preventDefault() + let msg = "L'itinéraire doit comporter au moins deux arrêts" + $('#stop_points').find('.subform').after("<div class='alert alert-danger'><span class='fa fa-lg fa-exclamation-circle'></span><span>" + msg + "</span></div>") + } }) + +const updateFormForDeletion = (stop) =>{ + if (stop.stoppoint_id !== undefined){ + let now = Date.now() + addInput('id', stop.stoppoint_id, now) + addInput('_destroy', 'true', now) + } +} diff --git a/app/assets/javascripts/es6_browserified/itineraries/reducers/stopPoints.js b/app/assets/javascripts/es6_browserified/itineraries/reducers/stopPoints.js index 18fee8bd1..24c3e5d87 100644 --- a/app/assets/javascripts/es6_browserified/itineraries/reducers/stopPoints.js +++ b/app/assets/javascripts/es6_browserified/itineraries/reducers/stopPoints.js @@ -19,13 +19,6 @@ const stopPoint = (state = {}, action, length) => { return state } } -const updateFormForDeletion = (stop) =>{ - if (stop.stoppoint_id !== undefined){ - let now = Date.now() - addInput('id', stop.stoppoint_id, now) - addInput('_destroy', 'true', now) - } -} const stopPoints = (state = [], action) => { switch (action.type) { @@ -49,7 +42,6 @@ const stopPoints = (state = [], action) => { ...state.slice(action.index + 2) ] case 'DELETE_STOP': - updateFormForDeletion(state[action.index]) return [ ...state.slice(0, action.index), ...state.slice(action.index + 1).map((stopPoint)=>{ diff --git a/app/assets/javascripts/es6_browserified/journey_patterns/components/CreateModal.js b/app/assets/javascripts/es6_browserified/journey_patterns/components/CreateModal.js index aa2d208df..5aade3348 100644 --- a/app/assets/javascripts/es6_browserified/journey_patterns/components/CreateModal.js +++ b/app/assets/javascripts/es6_browserified/journey_patterns/components/CreateModal.js @@ -22,90 +22,90 @@ class CreateModal extends Component { } if(this.props.status.fetchSuccess == true) { return ( - <div className='row mt-md'> - <div className='col-lg-12 text-right'> - <button - type='button' - className='btn btn-outline-primary' - data-toggle='modal' - data-target='#NewJourneyPatternModal' - onClick={this.props.onOpenCreateModal} - > - Ajouter une mission - </button> + <div className="select_toolbox"> + <ul> + <li className='st_action'> + <button + type='button' + data-toggle='modal' + data-target='#NewJourneyPatternModal' + onClick={this.props.onOpenCreateModal} + > + <span className="fa fa-plus"></span> + </button> - <div className={ 'modal fade ' + ((this.props.modal.type == 'create') ? 'in' : '') } id='NewJourneyPatternModal'> - <div className='modal-container'> - <div className='modal-dialog'> - <div className='modal-content'> - <div className='modal-header'> - <h4 className='modal-title'>Ajouter une mission</h4> - </div> + <div className={ 'modal fade ' + ((this.props.modal.type == 'create') ? 'in' : '') } id='NewJourneyPatternModal'> + <div className='modal-container'> + <div className='modal-dialog'> + <div className='modal-content'> + <div className='modal-header'> + <h4 className='modal-title'>Ajouter une mission</h4> + </div> - {(this.props.modal.type == 'create') && ( - <form> - <div className='modal-body'> - <div className='form-group'> - <label className='control-label is-required'>Nom</label> - <input - type='text' - ref='name' - className='form-control' - onKeyDown={(e) => actions.resetValidation(e.currentTarget)} - required - /> - </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'>Nom public</label> - <input - type='text' - ref='published_name' - className='form-control' - onKeyDown={(e) => actions.resetValidation(e.currentTarget)} - required - /> - </div> + {(this.props.modal.type == 'create') && ( + <form> + <div className='modal-body'> + <div className='form-group'> + <label className='control-label is-required'>Nom</label> + <input + type='text' + ref='name' + className='form-control' + onKeyDown={(e) => actions.resetValidation(e.currentTarget)} + required + /> </div> - <div className='col-lg-6 col-md-6 col-sm-6 col-xs-6'> - <div className='form-group'> - <label className='control-label is-required'>Code mission</label> - <input - type='text' - ref='registration_number' - className='form-control' - onKeyDown={(e) => actions.resetValidation(e.currentTarget)} - required - /> + <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'>Nom public</label> + <input + type='text' + ref='published_name' + className='form-control' + onKeyDown={(e) => actions.resetValidation(e.currentTarget)} + required + /> + </div> + </div> + <div className='col-lg-6 col-md-6 col-sm-6 col-xs-6'> + <div className='form-group'> + <label className='control-label'>Code mission</label> + <input + type='text' + ref='registration_number' + className='form-control' + onKeyDown={(e) => actions.resetValidation(e.currentTarget)} + /> + </div> </div> </div> </div> - </div> - <div className='modal-footer'> - <button - className='btn btn-link' - data-dismiss='modal' - type='button' - onClick={this.props.onModalClose} - > - Annuler - </button> - <button - className='btn btn-primary' - type='button' - onClick={this.handleSubmit.bind(this)} - > - Valider - </button> - </div> - </form> - )} + <div className='modal-footer'> + <button + className='btn btn-link' + data-dismiss='modal' + type='button' + onClick={this.props.onModalClose} + > + Annuler + </button> + <button + className='btn btn-primary' + type='button' + onClick={this.handleSubmit.bind(this)} + > + Valider + </button> + </div> + </form> + )} + </div> </div> </div> </div> - </div> - </div> + </li> + </ul> </div> ) } else { diff --git a/app/assets/javascripts/es6_browserified/journey_patterns/components/EditModal.js b/app/assets/javascripts/es6_browserified/journey_patterns/components/EditModal.js index 81c59b2ce..1fc935932 100644 --- a/app/assets/javascripts/es6_browserified/journey_patterns/components/EditModal.js +++ b/app/assets/javascripts/es6_browserified/journey_patterns/components/EditModal.js @@ -63,7 +63,7 @@ class EditModal extends Component { </div> <div className='col-lg-6 col-md-6 col-sm-6 col-xs-6'> <div className='form-group'> - <label className='control-label is-required'>Code mission</label> + <label className='control-label'>Code mission</label> <input type='text' ref='registration_number' @@ -71,7 +71,6 @@ class EditModal extends Component { id={this.props.modal.modalProps.index} defaultValue={this.props.modal.modalProps.journeyPattern.registration_number} onKeyDown={(e) => actions.resetValidation(e.currentTarget)} - required /> </div> </div> diff --git a/app/assets/javascripts/es6_browserified/journey_patterns/components/JourneyPattern.js b/app/assets/javascripts/es6_browserified/journey_patterns/components/JourneyPattern.js index 14ddf2b99..43c40a4d5 100644 --- a/app/assets/javascripts/es6_browserified/journey_patterns/components/JourneyPattern.js +++ b/app/assets/javascripts/es6_browserified/journey_patterns/components/JourneyPattern.js @@ -14,7 +14,7 @@ class JourneyPattern extends Component{ let vjURL = routeURL + '/vehicle_journeys?jp=' + jpOid return ( - <a data-turbolinks="false" href={vjURL}>Horaires des courses</a> + <a href={vjURL}>Horaires des courses</a> ) } diff --git a/app/assets/javascripts/es6_browserified/time_tables/actions/index.js b/app/assets/javascripts/es6_browserified/time_tables/actions/index.js index 41d247b21..951664129 100644 --- a/app/assets/javascripts/es6_browserified/time_tables/actions/index.js +++ b/app/assets/javascripts/es6_browserified/time_tables/actions/index.js @@ -122,6 +122,9 @@ const actions = { type : 'OPEN_CONFIRM_MODAL', callback }), + showErrorModal: () => ({ + type: 'OPEN_ERROR_MODAL' + }), closeModal : () => ({ type : 'CLOSE_MODAL' }), @@ -185,9 +188,13 @@ const actions = { return improvedCM }, - checkConfirmModal: (event, callback, stateChanged,dispatch) => { + checkConfirmModal: (event, callback, stateChanged, dispatch, metas, timetable) => { if(stateChanged === true){ - return actions.openConfirmModal(callback) + if(timetable.time_table_periods.length == 0 && _.some(metas.day_types)){ + return actions.showErrorModal() + }else{ + return actions.openConfirmModal(callback) + } }else{ dispatch(actions.fetchingApi()) return callback @@ -201,8 +208,8 @@ const actions = { start = new Date(start) end = new Date(end) _.each(periods, (period, i) => { - if(index != i && !period.deleted){ - if((new Date(period.period_start) <= start && new Date(period.period_end) >= start) || (new Date(period.period_start) <= end && new Date(period.period_end) >= end)) + if(index !== i && !period.deleted){ + if((new Date(period.period_start) <= start && new Date(period.period_end) >= start) || (new Date(period.period_start) <= end && new Date(period.period_end) >= end) || (start >= new Date(period.period_start) && end <= new Date(period.period_end)) || (start <= new Date(period.period_start) && end >= new Date(period.period_end))) error = 'Les périodes ne peuvent pas se chevaucher' } }) diff --git a/app/assets/javascripts/es6_browserified/time_tables/components/ConfirmModal.js b/app/assets/javascripts/es6_browserified/time_tables/components/ConfirmModal.js index c2229d991..40ae0eccf 100644 --- a/app/assets/javascripts/es6_browserified/time_tables/components/ConfirmModal.js +++ b/app/assets/javascripts/es6_browserified/time_tables/components/ConfirmModal.js @@ -2,7 +2,7 @@ var React = require('react') var Component = require('react').Component var PropTypes = require('react').PropTypes -const ConfirmModal = ({dispatch, modal, onModalAccept, onModalCancel, journeyPatterns}) => ( +const ConfirmModal = ({dispatch, modal, onModalAccept, onModalCancel, timetable, metas}) => ( <div className={ 'modal fade ' + ((modal.type == 'confirm') ? 'in' : '') } id='ConfirmModal'> <div className='modal-container'> <div className='modal-dialog'> @@ -28,7 +28,7 @@ const ConfirmModal = ({dispatch, modal, onModalAccept, onModalCancel, journeyPat className='btn btn-primary' data-dismiss='modal' type='button' - onClick = {() => {onModalAccept(modal.confirmModal.callback, journeyPatterns)}} + onClick = {() => {onModalAccept(modal.confirmModal.callback, timetable, metas)}} > Valider </button> diff --git a/app/assets/javascripts/es6_browserified/time_tables/components/ErrorModal.js b/app/assets/javascripts/es6_browserified/time_tables/components/ErrorModal.js new file mode 100644 index 000000000..31ed256ea --- /dev/null +++ b/app/assets/javascripts/es6_browserified/time_tables/components/ErrorModal.js @@ -0,0 +1,39 @@ +var React = require('react') +var Component = require('react').Component +var PropTypes = require('react').PropTypes + +const ErrorModal = ({dispatch, modal, onModalClose}) => ( + <div className={ 'modal fade ' + ((modal.type == 'error') ? 'in' : '') } id='ErrorModal'> + <div className='modal-container'> + <div className='modal-dialog'> + <div className='modal-content'> + <div className='modal-header'> + <h4 className='modal-title'>Erreur</h4> + </div> + <div className='modal-body'> + <div className='mt-md mb-md'> + <p>Un calendrier d'application ne peut pas avoir de journée(s) d'application sans période(s).</p> + </div> + </div> + <div className='modal-footer'> + <button + className='btn btn-link' + data-dismiss='modal' + type='button' + onClick= {() => {onModalClose()}} + > + Retour + </button> + </div> + </div> + </div> + </div> + </div> +) + +ErrorModal.propTypes = { + modal: PropTypes.object.isRequired, + onModalClose: PropTypes.func.isRequired +} + +module.exports = ErrorModal diff --git a/app/assets/javascripts/es6_browserified/time_tables/components/Navigate.js b/app/assets/javascripts/es6_browserified/time_tables/components/Navigate.js index 74ca36ea6..6a3690cb0 100644 --- a/app/assets/javascripts/es6_browserified/time_tables/components/Navigate.js +++ b/app/assets/javascripts/es6_browserified/time_tables/components/Navigate.js @@ -39,7 +39,7 @@ let Navigate = ({ dispatch, metas, timetable, pagination, status, filters}) => { value={month} onClick={e => { e.preventDefault() - dispatch(actions.checkConfirmModal(e, actions.changePage(dispatch, e.currentTarget.value), pagination.stateChanged, dispatch)) + dispatch(actions.checkConfirmModal(e, actions.changePage(dispatch, e.currentTarget.value), pagination.stateChanged, dispatch, metas, timetable)) }} > {actions.monthName(month) + ' ' + new Date(month).getFullYear()} @@ -56,7 +56,7 @@ let Navigate = ({ dispatch, metas, timetable, pagination, status, filters}) => { <button onClick={e => { e.preventDefault() - dispatch(actions.checkConfirmModal(e, actions.goToPreviousPage(dispatch, pagination), pagination.stateChanged, dispatch)) + dispatch(actions.checkConfirmModal(e, actions.goToPreviousPage(dispatch, pagination), pagination.stateChanged, dispatch, metas, timetable)) }} type='button' data-target='#ConfirmModal' @@ -66,7 +66,7 @@ let Navigate = ({ dispatch, metas, timetable, pagination, status, filters}) => { <button onClick={e => { e.preventDefault() - dispatch(actions.checkConfirmModal(e, actions.goToNextPage(dispatch, pagination), pagination.stateChanged, dispatch)) + dispatch(actions.checkConfirmModal(e, actions.goToNextPage(dispatch, pagination), pagination.stateChanged, dispatch, metas, timetable)) }} type='button' data-target='#ConfirmModal' diff --git a/app/assets/javascripts/es6_browserified/time_tables/components/SaveTimetable.js b/app/assets/javascripts/es6_browserified/time_tables/components/SaveTimetable.js index 24c91f282..e8c0aa3ba 100644 --- a/app/assets/javascripts/es6_browserified/time_tables/components/SaveTimetable.js +++ b/app/assets/javascripts/es6_browserified/time_tables/components/SaveTimetable.js @@ -2,6 +2,7 @@ var React = require('react') var Component = require('react').Component var PropTypes = require('react').PropTypes var actions = require('../actions') +var _ = require('lodash') class SaveTimetable extends Component{ constructor(props){ @@ -18,7 +19,11 @@ class SaveTimetable extends Component{ type='button' onClick={e => { e.preventDefault() - actions.submitTimetable(this.props.dispatch, this.props.timetable, this.props.metas) + if(this.props.timetable.time_table_periods.length == 0 && _.some(this.props.metas.day_types)){ + this.props.onShowErrorModal() + }else{ + actions.submitTimetable(this.props.getDispatch(), this.props.timetable, this.props.metas) + } }} > Valider diff --git a/app/assets/javascripts/es6_browserified/time_tables/containers/App.js b/app/assets/javascripts/es6_browserified/time_tables/containers/App.js index 7c75377ea..02f0ddbd8 100644 --- a/app/assets/javascripts/es6_browserified/time_tables/containers/App.js +++ b/app/assets/javascripts/es6_browserified/time_tables/containers/App.js @@ -8,6 +8,7 @@ var Navigate = require('./Navigate') var PeriodForm = require('./PeriodForm') var SaveTimetable = require('./SaveTimetable') var ConfirmModal = require('./ConfirmModal') +var ErrorModal = require('./ErrorModal') class App extends Component { componentDidMount(){ @@ -24,6 +25,7 @@ class App extends Component { <PeriodForm /> <SaveTimetable /> <ConfirmModal /> + <ErrorModal /> </div> </div> ) diff --git a/app/assets/javascripts/es6_browserified/time_tables/containers/ConfirmModal.js b/app/assets/javascripts/es6_browserified/time_tables/containers/ConfirmModal.js index 8095e1e7c..6282c1d1d 100644 --- a/app/assets/javascripts/es6_browserified/time_tables/containers/ConfirmModal.js +++ b/app/assets/javascripts/es6_browserified/time_tables/containers/ConfirmModal.js @@ -5,13 +5,14 @@ var ConfirmModal = require('../components/ConfirmModal') const mapStateToProps = (state) => { return { modal: state.modal, - journeyPatterns: state.journeyPatterns + timetable: state.timetable, + metas: state.metas } } const mapDispatchToProps = (dispatch) => { return { - onModalAccept: (next, timetable, metas, state) =>{ + onModalAccept: (next, timetable, metas) =>{ dispatch(actions.fetchingApi()) actions.submitTimetable(dispatch, timetable, metas, next) }, diff --git a/app/assets/javascripts/es6_browserified/time_tables/containers/ErrorModal.js b/app/assets/javascripts/es6_browserified/time_tables/containers/ErrorModal.js new file mode 100644 index 000000000..16a7d45dd --- /dev/null +++ b/app/assets/javascripts/es6_browserified/time_tables/containers/ErrorModal.js @@ -0,0 +1,21 @@ +var actions = require('../actions') +var connect = require('react-redux').connect +var ErrorModal = require('../components/ErrorModal') + +const mapStateToProps = (state) => { + return { + modal: state.modal + } +} + +const mapDispatchToProps = (dispatch) => { + return { + onModalClose: () =>{ + dispatch(actions.closeModal()) + } + } +} + +const ErrorModalContainer = connect(mapStateToProps, mapDispatchToProps)(ErrorModal) + +module.exports = ErrorModalContainer diff --git a/app/assets/javascripts/es6_browserified/time_tables/containers/SaveTimetable.js b/app/assets/javascripts/es6_browserified/time_tables/containers/SaveTimetable.js index 7d2684dde..b5539e7d8 100644 --- a/app/assets/javascripts/es6_browserified/time_tables/containers/SaveTimetable.js +++ b/app/assets/javascripts/es6_browserified/time_tables/containers/SaveTimetable.js @@ -11,6 +11,16 @@ const mapStateToProps = (state) => { } } -const SaveTimetable = connect(mapStateToProps)(SaveTimetableComponent) +const mapDispatchToProps = (dispatch) => { + return { + onShowErrorModal: () => { + dispatch(actions.showErrorModal()) + }, + getDispatch: () => { + return dispatch + } + } +} +const SaveTimetable = connect(mapStateToProps, mapDispatchToProps)(SaveTimetableComponent) module.exports = SaveTimetable diff --git a/app/assets/javascripts/es6_browserified/time_tables/reducers/metas.js b/app/assets/javascripts/es6_browserified/time_tables/reducers/metas.js index 4f1e7a528..2ce084efd 100644 --- a/app/assets/javascripts/es6_browserified/time_tables/reducers/metas.js +++ b/app/assets/javascripts/es6_browserified/time_tables/reducers/metas.js @@ -12,6 +12,9 @@ const metas = (state = {}, action) => { color: action.json.color, calendar: action.json.calendar ? action.json.calendar : null }) + case 'RECEIVE_MONTH': + let dt = (typeof state.day_types === 'string') ? actions.strToArrayDayTypes(state.day_types) : state.day_types + return _.assign({}, state, {day_types: dt}) case 'INCLUDE_DATE_IN_PERIOD': case 'EXCLUDE_DATE_FROM_PERIOD': case 'DELETE_PERIOD': diff --git a/app/assets/javascripts/es6_browserified/time_tables/reducers/modal.js b/app/assets/javascripts/es6_browserified/time_tables/reducers/modal.js index 56486a105..69f7b206e 100644 --- a/app/assets/javascripts/es6_browserified/time_tables/reducers/modal.js +++ b/app/assets/javascripts/es6_browserified/time_tables/reducers/modal.js @@ -19,6 +19,9 @@ const modal = (state = {}, action) => { callback: action.callback, } }) + case 'OPEN_ERROR_MODAL': + $('#ErrorModal').modal('show') + return _.assign({}, state, {type: 'error'}) case 'CLOSE_PERIOD_FORM': newModalProps = _.assign({}, state.modalProps, {active: false}) return _.assign({}, state, {modalProps: newModalProps}) diff --git a/app/assets/javascripts/es6_browserified/time_tables/reducers/pagination.js b/app/assets/javascripts/es6_browserified/time_tables/reducers/pagination.js index 660484c58..3d96fb7b7 100644 --- a/app/assets/javascripts/es6_browserified/time_tables/reducers/pagination.js +++ b/app/assets/javascripts/es6_browserified/time_tables/reducers/pagination.js @@ -5,8 +5,12 @@ const pagination = (state = {}, action) => { case 'RECEIVE_TIME_TABLES': return _.assign({}, state, { currentPage: action.json.current_periode_range, - periode_range: action.json.periode_range + periode_range: action.json.periode_range, + stateChanged: false }) + case 'RECEIVE_MONTH': + case 'RECEIVE_ERRORS': + return _.assign({}, state, {stateChanged: false}) case 'GO_TO_PREVIOUS_PAGE': case 'GO_TO_NEXT_PAGE': let nextPage = action.nextPage ? 1 : -1 @@ -22,7 +26,6 @@ const pagination = (state = {}, action) => { case 'VALIDATE_PERIOD_FORM': case 'UPDATE_COMMENT': case 'UPDATE_COLOR': - case 'UPDATE_DAY_TYPES': toggleOnConfirmModal('modal') return _.assign({}, state, {stateChanged: true}) default: diff --git a/app/assets/javascripts/es6_browserified/vehicle_journeys/components/Filters.js b/app/assets/javascripts/es6_browserified/vehicle_journeys/components/Filters.js index e2d03e195..f74bfa71d 100644 --- a/app/assets/javascripts/es6_browserified/vehicle_journeys/components/Filters.js +++ b/app/assets/javascripts/es6_browserified/vehicle_journeys/components/Filters.js @@ -107,7 +107,9 @@ const Filters = ({filters, pagination, onFilter, onResetFilters, onUpdateStartTi onChange={onToggleWithoutSchedule} checked={filters.query.withoutSchedule} ></input> - <span className='switch-label' data-checkedvalue='Non' data-uncheckedvalue='Oui'></span> + <span className='switch-label' data-checkedvalue='Non' data-uncheckedvalue='Oui'> + {filters.query.withoutSchedule ? 'Oui' : 'Non'} + </span> </label> </div> </div> @@ -117,7 +119,7 @@ const Filters = ({filters, pagination, onFilter, onResetFilters, onUpdateStartTi <div className="ffg-row"> {/* Switch avec/sans calendrier */} <div className='form-group has_switch'> - <label className='control-label pull-left'>Afficher les courses sans calendrier</label> + <label className='control-label pull-left'>Afficher les courses avec calendrier</label> <div className='form-group pull-left' style={{padding: 0}}> <div className='checkbox'> <label> @@ -126,7 +128,9 @@ const Filters = ({filters, pagination, onFilter, onResetFilters, onUpdateStartTi onChange={onToggleWithoutTimeTable} checked={filters.query.withoutTimeTable} ></input> - <span className='switch-label' data-checkedvalue='Oui' data-uncheckedvalue='Non'></span> + <span className='switch-label' data-checkedvalue='Non' data-uncheckedvalue='Oui'> + {filters.query.withoutTimeTable ? 'Oui' : 'Non'} + </span> </label> </div> </div> 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 f5e01de7c..0cf102693 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 @@ -53,72 +53,75 @@ class DuplicateVehicleJourney extends Component { <div className='modal-header'> <h4 className='modal-title'>Dupliquer une course</h4> {(this.props.modal.type == 'duplicate') && ( - <em>Dupliquer les horaires de la course {actions.getSelected(this.props.vehicleJourneys)[0].objectid}</em> + <em>Dupliquer les horaires de la course {actions.humanOID(actions.getSelected(this.props.vehicleJourneys)[0].objectid)}</em> )} </div> {(this.props.modal.type == 'duplicate') && ( - <form> + <form className='form-horizontal'> <div className='modal-body'> - <div className='row'> - <div className='col-lg-3 col-md-3 col-sm-3 col-xs-3'> - <div className='form-group'> - <label className='control-label is-required'>Horaire de départ</label> - <span className={'input-group time' + (actions.getSelected(this.props.vehicleJourneys).length > 1 ? ' disabled' : '')}> - <input - type='number' - ref='duplicate_time_hh' - min='00' - max='23' - className='form-control' - defaultValue={this.getDefaultValue('hour')} - disabled={(actions.getSelected(this.props.vehicleJourneys).length > 1 ? 'disabled' : '')} - /> - <span>:</span> - <input - type='number' - ref='duplicate_time_mm' - min='00' - max='59' - className='form-control' - defaultValue={this.getDefaultValue('minute')} - disabled={(actions.getSelected(this.props.vehicleJourneys).length > 1 ? 'disabled' : '')} - /> - </span> - </div> - </div> - - <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> + <div className={'form-group ' + (actions.getSelected(this.props.vehicleJourneys).length > 1 ? 'hidden' : '' )}> + <label className='control-label is-required col-sm-8'>Horaire de départ indicatif</label> + <span className="col-sm-4"> + <span className={'input-group time' + (actions.getSelected(this.props.vehicleJourneys).length > 1 ? ' disabled' : '')}> <input type='number' - ref='duplicate_number' - min='1' - max='20' + ref='duplicate_time_hh' + min='00' + max='23' className='form-control' - onKeyDown={(e) => actions.resetValidation(e.currentTarget)} - required + defaultValue={this.getDefaultValue('hour')} + disabled={(actions.getSelected(this.props.vehicleJourneys).length > 1 ? 'disabled' : '')} /> - </div> - </div> - - <div className='col-lg-3 col-md-3 col-sm-3 col-xs-3'> - <div className='form-group'> - <label className='control-label is-required'>Avec un décalage de</label> + <span>:</span> <input type='number' - ref='additional_time' - min='-59' + ref='duplicate_time_mm' + min='00' max='59' className='form-control' - onKeyDown={(e) => actions.resetValidation(e.currentTarget)} - required + defaultValue={this.getDefaultValue('minute')} + disabled={(actions.getSelected(this.props.vehicleJourneys).length > 1 ? 'disabled' : '')} /> - </div> + </span> + </span> + </div> + + <div className='form-group'> + <label className='control-label is-required col-sm-8'>Nombre de courses à créer et dupliquer</label> + <div className="col-sm-4"> + <input + type='number' + style={{'width': 104}} + ref='duplicate_number' + min='1' + max='20' + defaultValue='1' + className='form-control' + onKeyDown={(e) => actions.resetValidation(e.currentTarget)} + required + /> + </div> + </div> + + <div className='form-group'> + <label className='control-label is-required col-sm-8'>Décalage à partir duquel on créé les courses</label> + <div className="col-sm-4"> + <input + type='number' + style={{'width': 104}} + ref='additional_time' + min='-59' + max='59' + defaultValue='0' + className='form-control' + onKeyDown={(e) => actions.resetValidation(e.currentTarget)} + required + /> </div> </div> </div> + <div className='modal-footer'> <button className='btn btn-link' diff --git a/app/assets/javascripts/es6_browserified/vehicle_journeys/components/tools/NotesEditVehicleJourney.js b/app/assets/javascripts/es6_browserified/vehicle_journeys/components/tools/NotesEditVehicleJourney.js index d4c3f4231..4c18ef96f 100644 --- a/app/assets/javascripts/es6_browserified/vehicle_journeys/components/tools/NotesEditVehicleJourney.js +++ b/app/assets/javascripts/es6_browserified/vehicle_journeys/components/tools/NotesEditVehicleJourney.js @@ -2,6 +2,7 @@ var React = require('react') var Component = require('react').Component var PropTypes = require('react').PropTypes var actions = require('../../actions') +var _ = require('lodash') class NotesEditVehicleJourney extends Component { constructor(props) { @@ -27,16 +28,28 @@ class NotesEditVehicleJourney extends Component { type='button' className='btn btn-outline-danger btn-xs' onClick={() => this.props.onToggleFootnoteModal(lf, false)} - ><span className="fa fa-trash"></span></button> + ><span className="fa fa-trash"></span> Retirer</button> }else{ return <button type='button' className='btn btn-outline-primary btn-xs' onClick={() => this.props.onToggleFootnoteModal(lf, true)} - ><span className="fa fa-plus"></span></button> + ><span className="fa fa-plus"></span> Ajouter</button> } } + filterFN() { + return _.filter(window.line_footnotes, (lf, i) => { + let bool = true + _.map(this.props.modal.modalProps.vehicleJourney.footnotes, (f, j) => { + if(lf.id === f.id) { + bool = false + } + }) + return bool + }) + } + render() { if(this.props.status.isFetching == true) { return false @@ -65,7 +78,24 @@ class NotesEditVehicleJourney extends Component { {(this.props.modal.type == 'notes_edit') && ( <form> <div className='modal-body'> - {window.line_footnotes.map((lf, i) => + <h3>Notes associées</h3> + {(this.props.modal.modalProps.vehicleJourney.footnotes).map((lf, i) => + <div + key={i} + className='panel panel-default' + > + <div className='panel-heading'> + <h4 className='panel-title clearfix'> + <div className='pull-left' style={{paddingTop: '3px'}}>{lf.code}</div> + <div className='pull-right'>{this.renderFootnoteButton(lf, this.props.modal.modalProps.vehicleJourney.footnotes)}</div> + </h4> + </div> + <div className='panel-body'><p>{lf.label}</p></div> + </div> + )} + + <h3 className='mt-lg'>Sélectionnez les notes à associer à cette course :</h3> + {this.filterFN().map((lf, i) => <div key={i} className='panel panel-default' diff --git a/app/assets/javascripts/es6_browserified/vehicle_journeys/components/tools/select2s/MissionSelect2.js b/app/assets/javascripts/es6_browserified/vehicle_journeys/components/tools/select2s/MissionSelect2.js index 36aaa5cfd..b3df767ab 100644 --- a/app/assets/javascripts/es6_browserified/vehicle_journeys/components/tools/select2s/MissionSelect2.js +++ b/app/assets/javascripts/es6_browserified/vehicle_journeys/components/tools/select2s/MissionSelect2.js @@ -50,7 +50,7 @@ class BSelect4 extends React.Component{ }, cache: true }, - minimumInputLength: 2, + minimumInputLength: 0, escapeMarkup: function (markup) { return markup; }, templateResult: formatRepo }} diff --git a/app/assets/javascripts/es6_browserified/vehicle_journeys/index.js b/app/assets/javascripts/es6_browserified/vehicle_journeys/index.js index 2a76ae43a..97aa60526 100644 --- a/app/assets/javascripts/es6_browserified/vehicle_journeys/index.js +++ b/app/assets/javascripts/es6_browserified/vehicle_journeys/index.js @@ -48,7 +48,7 @@ var initialState = { comment: '' }, withoutSchedule: true, - withoutTimeTable: false + withoutTimeTable: true } }, 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 9f071069d..229fd2058 100644 --- a/app/assets/javascripts/es6_browserified/vehicle_journeys/reducers/modal.js +++ b/app/assets/javascripts/es6_browserified/vehicle_journeys/reducers/modal.js @@ -90,11 +90,15 @@ const modal = (state = {}, action) => { case 'CREATE_VEHICLEJOURNEY_MODAL': let selectedJP = {} if (window.jpOrigin){ + let stopAreas = _.map(window.jpOriginStopPoints, (sa, i) =>{ + return _.assign({}, {stop_area_short_description : {id : sa.stop_area_id}}) + }) selectedJP = { id: window.jpOrigin.id, name: window.jpOrigin.name, published_name: window.jpOrigin.published_name, - objectid: window.jpOrigin.objectid + objectid: window.jpOrigin.objectid, + stop_areas: stopAreas } } return { diff --git a/app/assets/javascripts/es6_browserified/vehicle_journeys/reducers/pagination.js b/app/assets/javascripts/es6_browserified/vehicle_journeys/reducers/pagination.js index ee59fca6d..a8189fc97 100644 --- a/app/assets/javascripts/es6_browserified/vehicle_journeys/reducers/pagination.js +++ b/app/assets/javascripts/es6_browserified/vehicle_journeys/reducers/pagination.js @@ -2,6 +2,7 @@ var _ = require('lodash') const pagination = (state = {}, action) => { switch (action.type) { case 'RECEIVE_JOURNEY_PATTERNS': + case 'RECEIVE_VEHICLE_JOURNEYS': return _.assign({}, state, {stateChanged: false}) case 'GO_TO_PREVIOUS_PAGE': if (action.pagination.page > 1){ 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 9dea63e07..c7e8d58e7 100644 --- a/app/assets/javascripts/es6_browserified/vehicle_journeys/reducers/vehicleJourneys.js +++ b/app/assets/javascripts/es6_browserified/vehicle_journeys/reducers/vehicleJourneys.js @@ -42,7 +42,9 @@ const vehicleJourney= (state = {}, action, keep) => { time_tables: [], vehicle_journey_at_stops: pristineVjasList, selected: false, - deletable: false + deletable: false, + transport_mode: window.transportMode ? window.transportMode : 'undefined', + transport_submode: window.transportSubmode ? window.transportSubmode : 'undefined' } case 'DUPLICATE_VEHICLEJOURNEY': case 'SHIFT_VEHICLEJOURNEY': diff --git a/app/assets/javascripts/forms.coffee b/app/assets/javascripts/forms.coffee index 6b00e9c26..12d82fef1 100644 --- a/app/assets/javascripts/forms.coffee +++ b/app/assets/javascripts/forms.coffee @@ -41,10 +41,11 @@ isEdge = !isIE && !!window.StyleMedia else $(selectedStatus).css('color', selectedValue) -$(document).on 'turbolinks:load', togglableFilter -$(document).on 'turbolinks:load', submitMover -$(document).on 'turbolinks:load', switchInput -$(document).on 'turbolinks:load', colorSelector +$ -> + togglableFilter() + submitMover() + switchInput() + colorSelector() if isIE || isEdge $(document).on 'click', '.formSubmitr', (e)-> diff --git a/app/assets/javascripts/main_menu.coffee b/app/assets/javascripts/main_menu.coffee index f6266f06b..a12c47576 100644 --- a/app/assets/javascripts/main_menu.coffee +++ b/app/assets/javascripts/main_menu.coffee @@ -1,4 +1,4 @@ -$(document).on 'turbolinks:load', -> +$ -> link = [] ptitleCont = "" diff --git a/app/assets/javascripts/nav_panels.coffee b/app/assets/javascripts/nav_panels.coffee index 829db5ad0..25f15f063 100644 --- a/app/assets/javascripts/nav_panels.coffee +++ b/app/assets/javascripts/nav_panels.coffee @@ -1,4 +1,4 @@ -$(document).on 'turbolinks:load', -> +$ -> $('#menu_top [data-panel="toggle"]').on 'click', (e) -> e.preventDefault() $(this).siblings().removeClass 'active' diff --git a/app/assets/javascripts/routing_constraint_zones.coffee b/app/assets/javascripts/routing_constraint_zones.coffee index fc032f074..ceb9fb218 100644 --- a/app/assets/javascripts/routing_constraint_zones.coffee +++ b/app/assets/javascripts/routing_constraint_zones.coffee @@ -1,28 +1,62 @@ -fill_stop_points_options = -> - stop_point_select = $('#routing_constraint_zone_stop_point_ids') - stop_point_select.empty() - referential_id = document.location.pathname.match(/\d+/g)[0] - line_id = document.location.pathname.match(/\d+/g)[1] - route_id = $('#routing_constraint_zone_route_id').val() - - if errors_on_form() - stop_point_ids = eval($('#stop_point_ids').val()) - - $.ajax - url: "/referentials/#{referential_id}/lines/#{line_id}/routes/#{route_id}/stop_points" - dataType: 'json' - success: (data, textStatus, jqXHR) -> - for stop_point in data - selected = $.inArray(stop_point.id, stop_point_ids) != -1 - stop_point_select.append "<option value='#{stop_point.id}'" + "#{if selected then ' selected' else ''}" + ">#{stop_point.name}</option>" - error: (jqXHR, textStatus, errorThrown) -> - console.log textStatus - console.log errorThrown - -errors_on_form = -> - document.location.pathname.endsWith('routing_constraint_zones') && $('#new_routing_constraint_zone').length - -$(document).on 'turbolinks:load', -> - if document.location.pathname.endsWith('routing_constraint_zones/new') || errors_on_form() - fill_stop_points_options() - $('#routing_constraint_zone_route_id').change(fill_stop_points_options) +@ITL_stoppoints = -> + routeID = $('#routing_constraint_zone_route_id').val() + + if (routeID) + origin = window.location.origin + path = window.location.pathname.split('/', 5).join('/') + reqURL = origin + path + '/routes/' + routeID + '/stop_points.json' + + $.ajax + url: reqURL + dataType: 'json' + error: (jqXHR, textStatus, errorThrown) -> + console.log(errorThrown) + success: (collection, textStatus, jqXHR) -> + html = '' + stopAreaBaseURL = origin + window.location.pathname.split('/', 3).join('/') + '/stop_areas/' + + collection.forEach (item, index) -> + html += "<div class='nested-fields'><div class='wrapper'> + <div><a href='" + stopAreaBaseURL + item.stop_area_id + "' class='navlink' title='Voir l'arrêt'><span>" + item.name + "</span></a></div> + <div><span>" + item.city_name + " (" + item.zip_code + ")</span></div> + <div> + <span class='has_radio'> + <input type='checkbox' name='routing_constraint_zone[stop_point_ids][" + index + "]' value='" + item.id + "'> + <span class='radio-label'></span> + </span> + </div> + </div></div>" + + $('#ITL_stoppoints').find('.nested-fields').remove() + $('#ITL_stoppoints').find('.nested-head').after(html) + + # VALIDATION + selection = [] + $('#ITL_stoppoints').on 'click', "input[type='checkbox']", (e) -> + v = $(e.target).val() + + if ( $.inArray(v, selection) != -1 ) + selection.splice(selection.indexOf(v), 1) + else + selection.push(v) + + alertMsg = "<div class='alert alert-danger' style='margin-bottom:15px;'> + <p class='small'>Un ITL doit comporter au moins deux arrêts</p> + </div>" + + $(document).on 'click', "input[type='submit']", (e)-> + inputName = $('#routing_constraint_zone_name').val() + + $('.alert-danger').remove() + + if ( selection.length < 2 && inputName != "") + e.preventDefault() + $('#routing_constraint_zone_name').closest('.form-group').removeClass('has-error').find('.help-block').remove() + $('#ITL_stoppoints').prepend(alertMsg) + +$ -> + ITL_stoppoints() + + $('#routing_constraint_zone_route_id').on 'change', -> + $('.alert-danger').remove() + ITL_stoppoints() diff --git a/app/assets/javascripts/select2.coffee b/app/assets/javascripts/select2.coffee index af3dc6d75..d54ddb811 100644 --- a/app/assets/javascripts/select2.coffee +++ b/app/assets/javascripts/select2.coffee @@ -20,6 +20,7 @@ bind_select2_ajax = (el, cfg = {}) -> delay: 125, processResults: (data, params) -> results: data minimumInputLength: 3 + placeholder: target.data('select2ed-placeholder') templateResult: (item) -> item.text templateSelection: (item) -> @@ -39,4 +40,5 @@ bind_select2_ajax = (el, cfg = {}) -> -$(document).on 'turbolinks:load', select_2 +$ -> + select_2() diff --git a/app/assets/javascripts/selectable_table.coffee b/app/assets/javascripts/selectable_table.coffee index 4086bf6c2..681c8f9e6 100644 --- a/app/assets/javascripts/selectable_table.coffee +++ b/app/assets/javascripts/selectable_table.coffee @@ -53,4 +53,5 @@ .addClass 'noselect' .children('.info-msg').children('span').text(selection.length) -$(document).on 'turbolinks:load', selectTable +$ -> + selectTable() diff --git a/app/assets/javascripts/time_table_combinations.coffee b/app/assets/javascripts/time_table_combinations.coffee index 8923af958..6104da7ff 100644 --- a/app/assets/javascripts/time_table_combinations.coffee +++ b/app/assets/javascripts/time_table_combinations.coffee @@ -3,4 +3,5 @@ $(this).closest('.has_switch').siblings('.form-group').each -> $(this).toggleClass('hidden') -$(document).on 'turbolinks:load', combinedTypeToggle +$ -> + combinedTypeToggle() |
