diff options
| author | Robert | 2017-09-11 18:03:06 +0200 |
|---|---|---|
| committer | Robert | 2017-09-11 18:03:06 +0200 |
| commit | 37865fad65adacae41bff0677651ca0a4d9db974 (patch) | |
| tree | 0889ea9d7883bb27b493c16b9b08426fa22545a0 /app/assets/javascripts | |
| parent | f7bc874de79ff9a68aa03523cf653407663e7c55 (diff) | |
| parent | 8fe9a39516f6fb71545d6329c448680d6f8c75d1 (diff) | |
| download | chouette-core-37865fad65adacae41bff0677651ca0a4d9db974.tar.bz2 | |
merged with master
Diffstat (limited to 'app/assets/javascripts')
53 files changed, 460 insertions, 258 deletions
diff --git a/app/assets/javascripts/es6_browserified/journey_patterns/actions/index.js b/app/assets/javascripts/es6_browserified/journey_patterns/actions/index.js index 0ed961f44..34689070d 100644 --- a/app/assets/javascripts/es6_browserified/journey_patterns/actions/index.js +++ b/app/assets/javascripts/es6_browserified/journey_patterns/actions/index.js @@ -6,6 +6,12 @@ if (!window.Promise) { } const actions = { + enterEditMode: () => ({ + type: "ENTER_EDIT_MODE" + }), + exitEditMode: () => ({ + type: "EXIT_EDIT_MODE" + }), receiveJourneyPatterns : (json) => ({ type: "RECEIVE_JOURNEY_PATTERNS", json @@ -84,10 +90,7 @@ const actions = { resetValidation: (target) => { $(target).parent().removeClass('has-error').children('.help-block').remove() }, - humanOID : (oid) => { - var a = oid.split(':') - return a[a.length - 1] - }, + humanOID : (oid) => oid.split(':')[2], validateFields : (fields) => { const test = [] @@ -138,6 +141,7 @@ const actions = { dispatch(actions.updateTotalCount(window.currentItemsLength - json.length)) } window.currentItemsLength = json.length + dispatch(actions.exitEditMode()) dispatch(actions.receiveJourneyPatterns(json)) } } 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 b446e2b37..12871431a 100644 --- a/app/assets/javascripts/es6_browserified/journey_patterns/components/CreateModal.js +++ b/app/assets/javascripts/es6_browserified/journey_patterns/components/CreateModal.js @@ -17,7 +17,7 @@ class CreateModal extends Component { } render() { - if(this.props.status.isFetching == true || this.props.status.policy['journey_patterns.update'] == false) { + if(this.props.status.isFetching == true || this.props.status.policy['journey_patterns.create'] == false || this.props.editMode == false) { return false } if(this.props.status.fetchSuccess == true) { 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 286cfc454..377fd0612 100644 --- a/app/assets/javascripts/es6_browserified/journey_patterns/components/JourneyPattern.js +++ b/app/assets/javascripts/es6_browserified/journey_patterns/components/JourneyPattern.js @@ -34,7 +34,7 @@ class JourneyPattern extends Component{ type='checkbox' id={sp.id} checked={sp.checked} - disabled={(this.props.value.deletable || this.props.status.policy['journey_patterns.update'] == false) ? 'disabled' : ''} + disabled={(this.props.value.deletable || this.props.status.policy['journey_patterns.update'] == false || this.props.editMode == false) ? 'disabled' : ''} > </input> <span className='radio-label'></span> @@ -78,7 +78,7 @@ class JourneyPattern extends Component{ <span className='fa fa-cog'></span> </div> <ul className='dropdown-menu'> - <li className={(this.props.value.deletable || this.props.status.policy['journey_patterns.update'] == false) ? 'disabled' : ''}> + <li className={(this.props.status.policy['journey_patterns.update'] == false || this.props.editMode == false) ? 'disabled' : ''}> <button type='button' onClick={this.props.onOpenEditModal} @@ -91,10 +91,10 @@ class JourneyPattern extends Component{ <li className={this.props.value.object_id ? '' : 'disabled'}> {this.vehicleJourneyURL(this.props.value.object_id)} </li> - <li className={'delete-action' + ((this.props.status.policy['journey_patterns.update'] == false)? ' disabled' : '')}> + <li className={'delete-action' + ((this.props.status.policy['journey_patterns.destroy'] == false || this.props.editMode == false) ? ' disabled' : '')}> <button type='button' - disabled={(this.props.status.policy['journey_patterns.update'] == false)? 'disabled' : ''} + disabled={(this.props.status.policy['journey_patterns.destroy'] == false || this.props.editMode == false)? 'disabled' : ''} onClick={(e) => { e.preventDefault() this.props.onDeleteJourneyPattern(this.props.index)} diff --git a/app/assets/javascripts/es6_browserified/journey_patterns/components/JourneyPatterns.js b/app/assets/javascripts/es6_browserified/journey_patterns/components/JourneyPatterns.js index 23473ae52..6506b706c 100644 --- a/app/assets/javascripts/es6_browserified/journey_patterns/components/JourneyPatterns.js +++ b/app/assets/javascripts/es6_browserified/journey_patterns/components/JourneyPatterns.js @@ -96,7 +96,7 @@ class JourneyPatterns extends Component{ <div className="alert alert-danger mt-sm"> <strong>Erreur : </strong> {this.props.journeyPatterns.map((jp, index) => - jp.errors.map((err, i) => { + jp.errors && jp.errors.map((err, i) => { return ( <ul key={i}> <li>{err}</li> @@ -133,6 +133,7 @@ class JourneyPatterns extends Component{ onOpenEditModal= {() => this.props.onOpenEditModal(index, journeyPattern)} onDeleteJourneyPattern={() => this.props.onDeleteJourneyPattern(index)} status= {this.props.status} + editMode= {this.props.editMode} /> )} </div> diff --git a/app/assets/javascripts/es6_browserified/journey_patterns/components/SaveJourneyPattern.js b/app/assets/javascripts/es6_browserified/journey_patterns/components/SaveJourneyPattern.js index 871ba00e1..767dab088 100644 --- a/app/assets/javascripts/es6_browserified/journey_patterns/components/SaveJourneyPattern.js +++ b/app/assets/javascripts/es6_browserified/journey_patterns/components/SaveJourneyPattern.js @@ -21,10 +21,10 @@ class SaveJourneyPattern extends Component{ type='button' onClick={e => { e.preventDefault() - actions.submitJourneyPattern(this.props.dispatch, this.props.journeyPatterns) + this.props.editMode ? this.props.onSubmitJourneyPattern(this.props.dispatch, this.props.journeyPatterns) : this.props.onEnterEditMode() }} > - Valider + {this.props.editMode ? "Valider" : "Editer"} </button> </form> </div> diff --git a/app/assets/javascripts/es6_browserified/journey_patterns/containers/AddJourneyPattern.js b/app/assets/javascripts/es6_browserified/journey_patterns/containers/AddJourneyPattern.js index ee13819fd..7aa27754e 100644 --- a/app/assets/javascripts/es6_browserified/journey_patterns/containers/AddJourneyPattern.js +++ b/app/assets/javascripts/es6_browserified/journey_patterns/containers/AddJourneyPattern.js @@ -6,6 +6,7 @@ const mapStateToProps = (state) => { return { modal: state.modal, journeyPatterns: state.journeyPatterns, + editMode: state.editMode, status: state.status } } diff --git a/app/assets/javascripts/es6_browserified/journey_patterns/containers/JourneyPatternList.js b/app/assets/javascripts/es6_browserified/journey_patterns/containers/JourneyPatternList.js index bc2aaf95b..228df3ede 100644 --- a/app/assets/javascripts/es6_browserified/journey_patterns/containers/JourneyPatternList.js +++ b/app/assets/javascripts/es6_browserified/journey_patterns/containers/JourneyPatternList.js @@ -6,6 +6,7 @@ const mapStateToProps = (state) => { return { journeyPatterns: state.journeyPatterns, status: state.status, + editMode: state.editMode, stopPointsList: state.stopPointsList } } diff --git a/app/assets/javascripts/es6_browserified/journey_patterns/containers/SaveJourneyPattern.js b/app/assets/javascripts/es6_browserified/journey_patterns/containers/SaveJourneyPattern.js index 33442c5a0..434264fea 100644 --- a/app/assets/javascripts/es6_browserified/journey_patterns/containers/SaveJourneyPattern.js +++ b/app/assets/javascripts/es6_browserified/journey_patterns/containers/SaveJourneyPattern.js @@ -6,11 +6,23 @@ var SaveJourneyPatternComponent = require('../components/SaveJourneyPattern') const mapStateToProps = (state) => { return { journeyPatterns: state.journeyPatterns, + editMode: state.editMode, page: state.pagination.page, status: state.status } } -const SaveJourneyPattern = connect(mapStateToProps)(SaveJourneyPatternComponent) +const mapDispatchToProps = (dispatch) => { + return { + onEnterEditMode: () => { + dispatch(actions.enterEditMode()) + }, + onSubmitJourneyPattern: (next, state) => { + actions.submitJourneyPattern(dispatch, state, next) + } + } +} + +const SaveJourneyPattern = connect(mapStateToProps, mapDispatchToProps)(SaveJourneyPatternComponent) module.exports = SaveJourneyPattern diff --git a/app/assets/javascripts/es6_browserified/journey_patterns/index.js b/app/assets/javascripts/es6_browserified/journey_patterns/index.js index b06957e0f..ca9efd2d0 100644 --- a/app/assets/javascripts/es6_browserified/journey_patterns/index.js +++ b/app/assets/javascripts/es6_browserified/journey_patterns/index.js @@ -12,6 +12,7 @@ var App = require('./components/App') // var promise = require('redux-promise') var initialState = { + editMode: false, status: { policy: window.perms, fetchSuccess: true, @@ -35,7 +36,7 @@ var initialState = { let store = createStore( journeyPatternsApp, - initialState + initialState, // applyMiddleware(thunkMiddleware, promise, loggerMiddleware) ) diff --git a/app/assets/javascripts/es6_browserified/journey_patterns/reducers/editMode.js b/app/assets/javascripts/es6_browserified/journey_patterns/reducers/editMode.js new file mode 100644 index 000000000..2e8af1aa8 --- /dev/null +++ b/app/assets/javascripts/es6_browserified/journey_patterns/reducers/editMode.js @@ -0,0 +1,12 @@ +const editMode = (state = {}, action ) => { + switch (action.type) { + case "ENTER_EDIT_MODE": + return true + case "EXIT_EDIT_MODE": + return false + default: + return state + } +} + +module.exports = editMode diff --git a/app/assets/javascripts/es6_browserified/journey_patterns/reducers/index.js b/app/assets/javascripts/es6_browserified/journey_patterns/reducers/index.js index aa35adf0e..a9c28b83e 100644 --- a/app/assets/javascripts/es6_browserified/journey_patterns/reducers/index.js +++ b/app/assets/javascripts/es6_browserified/journey_patterns/reducers/index.js @@ -1,4 +1,5 @@ var combineReducers = require('redux').combineReducers +var editMode = require('./editMode') var status = require('./status') var journeyPatterns = require('./journeyPatterns') var pagination = require('./pagination') @@ -6,6 +7,7 @@ var modal = require('./modal') var stopPointsList = require('./stopPointsList') const journeyPatternsApp = combineReducers({ + editMode, status, journeyPatterns, pagination, diff --git a/app/assets/javascripts/es6_browserified/journey_patterns/reducers/status.js b/app/assets/javascripts/es6_browserified/journey_patterns/reducers/status.js index d7ef12d0b..07bbdc249 100644 --- a/app/assets/javascripts/es6_browserified/journey_patterns/reducers/status.js +++ b/app/assets/javascripts/es6_browserified/journey_patterns/reducers/status.js @@ -11,6 +11,10 @@ const status = (state = {}, action) => { return _.assign({}, state, {fetchSuccess: true, isFetching: false}) case 'RECEIVE_ERRORS': return _.assign({}, state, {isFetching: false}) + case 'ENTER_EDIT_MODE': + return _.assign({}, state, {editMode: true}) + case 'EXIT_EDIT_MODE': + return _.assign({}, state, {editMode: false}) default: return state } 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 951664129..02ece1654 100644 --- a/app/assets/javascripts/es6_browserified/time_tables/actions/index.js +++ b/app/assets/javascripts/es6_browserified/time_tables/actions/index.js @@ -96,34 +96,42 @@ const actions = { closePeriodForm: () => ({ type: 'CLOSE_PERIOD_FORM' }), + resetModalErrors: () => ({ + type: 'RESET_MODAL_ERRORS' + }), updatePeriodForm: (val, group, selectType) => ({ type: 'UPDATE_PERIOD_FORM', val, group, selectType }), - validatePeriodForm: (modalProps, timeTablePeriods, metas) => ({ + validatePeriodForm: (modalProps, timeTablePeriods, metas, timetableInDates, error) => ({ type: 'VALIDATE_PERIOD_FORM', modalProps, timeTablePeriods, - metas + metas, + timetableInDates, + error }), - includeDateInPeriod: (index, dayTypes) => ({ + includeDateInPeriod: (index, dayTypes, date) => ({ type: 'INCLUDE_DATE_IN_PERIOD', index, - dayTypes + dayTypes, + date }), - excludeDateFromPeriod: (index, dayTypes) => ({ + excludeDateFromPeriod: (index, dayTypes, date) => ({ type: 'EXCLUDE_DATE_FROM_PERIOD', index, - dayTypes + dayTypes, + date }), openConfirmModal : (callback) => ({ type : 'OPEN_CONFIRM_MODAL', callback }), - showErrorModal: () => ({ - type: 'OPEN_ERROR_MODAL' + showErrorModal: (error) => ({ + type: 'OPEN_ERROR_MODAL', + error }), closeModal : () => ({ type : 'CLOSE_MODAL' @@ -161,16 +169,15 @@ const actions = { // We compare periods & currentDate, to determine if it is included or not let testDate = false periods.map((p, i) => { - if(p.deleted){ - return false - } + if (p.deleted) return false + let begin = new Date(p.period_start) let end = new Date(p.period_end) if(testDate === false){ if(currentDate >= begin && currentDate <= end) { testDate = true - p.include_date = false + // p.include_date = false } } }) @@ -187,11 +194,11 @@ const actions = { }) return improvedCM }, - checkConfirmModal: (event, callback, stateChanged, dispatch, metas, timetable) => { - if(stateChanged === true){ - if(timetable.time_table_periods.length == 0 && _.some(metas.day_types)){ - return actions.showErrorModal() + if(stateChanged){ + const error = actions.errorModalKey(timetable.time_table_periods, metas.day_types) + if(error){ + return actions.showErrorModal(error) }else{ return actions.openConfirmModal(callback) } @@ -207,12 +214,29 @@ const actions = { let error = '' 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) || (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' + + for (let i = 0; i < periods.length; i++) { + let period = periods[i] + if (index !== i && !period.deleted) { + if (new Date(period.period_start) <= end && new Date(period.period_end) >= start) { + error = 'Les périodes ne peuvent pas se chevaucher' + break + } } - }) + } + return error + }, + checkErrorsInDates: (start, end, in_days) => { + let error = '' + start = new Date(start) + end = new Date(end) + + for (let day of in_days) { + if (start <= new Date(day.date) && end >= new Date(day.date)) { + error = 'Une période ne peut chevaucher une date dans un calendrier' + break + } + } return error }, fetchTimeTables: (dispatch, nextPage) => { @@ -275,6 +299,31 @@ const actions = { } } }) + }, + errorModalKey: (periods, dayTypes) => { + const withoutPeriodsWithDaysTypes = _.reject(periods, 'deleted').length == 0 && _.some(dayTypes) && "withoutPeriodsWithDaysTypes" + const withPeriodsWithoutDayTypes = _.reject(periods, 'deleted').length > 0 && _.every(dayTypes, dt => dt == false) && "withPeriodsWithoutDayTypes" + + return (withoutPeriodsWithDaysTypes || withPeriodsWithoutDayTypes) && (withoutPeriodsWithDaysTypes ? "withoutPeriodsWithDaysTypes" : "withPeriodsWithoutDayTypes") + + }, + errorModalMessage: (errorKey) => { + switch (errorKey) { + case "withoutPeriodsWithDaysTypes": + return window.I18n.fr.time_tables.edit.error_modal.withoutPeriodsWithDaysTypes + case "withPeriodsWithoutDayTypes": + return window.I18n.fr.time_tables.edit.error_modal.withPeriodsWithoutDayTypes + default: + return errorKey + + } + }, + checkIfTTHasDate: (dates, date) => { + if (_.some(dates, date)) { + return _.reject(dates, ['date', date.date]) + } else { + return dates.concat(date) + } } } diff --git a/app/assets/javascripts/es6_browserified/time_tables/components/ErrorModal.js b/app/assets/javascripts/es6_browserified/time_tables/components/ErrorModal.js index 31ed256ea..4e8f7e363 100644 --- a/app/assets/javascripts/es6_browserified/time_tables/components/ErrorModal.js +++ b/app/assets/javascripts/es6_browserified/time_tables/components/ErrorModal.js @@ -1,18 +1,19 @@ var React = require('react') var Component = require('react').Component var PropTypes = require('react').PropTypes +var errorModalMessage = require('../actions').errorModalMessage -const ErrorModal = ({dispatch, modal, onModalClose}) => ( +const ErrorModal = ({dispatch, modal, I18n, 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> + <h4 className='modal-title'>{window.I18n.fr.time_tables.edit.error_modal.title}</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> + <p>{errorModalMessage(modal.modalProps.error)}</p> </div> </div> <div className='modal-footer'> diff --git a/app/assets/javascripts/es6_browserified/time_tables/components/ExceptionsInDay.js b/app/assets/javascripts/es6_browserified/time_tables/components/ExceptionsInDay.js index 10b558373..4879e537f 100644 --- a/app/assets/javascripts/es6_browserified/time_tables/components/ExceptionsInDay.js +++ b/app/assets/javascripts/es6_browserified/time_tables/components/ExceptionsInDay.js @@ -20,7 +20,7 @@ class ExceptionsInDay extends Component { data-actiontype='remove' onClick={(e) => { $(e.currentTarget).toggleClass('active') - this.props.onExcludeDateFromPeriod(this.props.index, this.props.metas.day_types) + this.props.onExcludeDateFromPeriod(this.props.index, this.props.metas.day_types, this.props.currentDate) }} > <span className='fa fa-times'></span> @@ -36,7 +36,7 @@ class ExceptionsInDay extends Component { data-actiontype='add' onClick={(e) => { $(e.currentTarget).toggleClass('active') - this.props.onIncludeDateInPeriod(this.props.index, this.props.metas.day_types) + this.props.onIncludeDateInPeriod(this.props.index, this.props.metas.day_types, this.props.currentDate) }} > <span className='fa fa-plus'></span> diff --git a/app/assets/javascripts/es6_browserified/time_tables/components/PeriodForm.js b/app/assets/javascripts/es6_browserified/time_tables/components/PeriodForm.js index 028974fc8..3234a3fd7 100644 --- a/app/assets/javascripts/es6_browserified/time_tables/components/PeriodForm.js +++ b/app/assets/javascripts/es6_browserified/time_tables/components/PeriodForm.js @@ -1,5 +1,6 @@ var React = require('react') var PropTypes = require('react').PropTypes +var _ = require('lodash') let monthsArray = ['Janvier', 'Février', 'Mars', 'Avril', 'Mai', 'Juin', 'Juillet', 'Août', 'Septembre', 'Octobre', 'Novembre', 'Décembre'] const formatNumber = (val) => { @@ -107,7 +108,7 @@ const PeriodForm = ({modal, timetable, metas, onOpenAddPeriodForm, onClosePeriod <button type='button' className='btn btn-outline-primary mr-sm' - onClick={() => onValidatePeriodForm(modal.modalProps, timetable.time_table_periods, metas)} + onClick={() => onValidatePeriodForm(modal.modalProps, timetable.time_table_periods, metas, _.filter(timetable.time_table_dates, ['in_out', true]))} > Valider </button> 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 e8c0aa3ba..779fd8e25 100644 --- a/app/assets/javascripts/es6_browserified/time_tables/components/SaveTimetable.js +++ b/app/assets/javascripts/es6_browserified/time_tables/components/SaveTimetable.js @@ -10,6 +10,8 @@ class SaveTimetable extends Component{ } render() { + const error = actions.errorModalKey(this.props.timetable.time_table_periods, this.props.metas.day_types) + return ( <div className='row mt-md'> <div className='col-lg-12 text-right'> @@ -19,9 +21,9 @@ class SaveTimetable extends Component{ type='button' onClick={e => { e.preventDefault() - if(this.props.timetable.time_table_periods.length == 0 && _.some(this.props.metas.day_types)){ - this.props.onShowErrorModal() - }else{ + if (error) { + this.props.onShowErrorModal(error) + } else { actions.submitTimetable(this.props.getDispatch(), this.props.timetable, this.props.metas) } }} diff --git a/app/assets/javascripts/es6_browserified/time_tables/components/Timetable.js b/app/assets/javascripts/es6_browserified/time_tables/components/Timetable.js index d562655b9..3af1a11a4 100644 --- a/app/assets/javascripts/es6_browserified/time_tables/components/Timetable.js +++ b/app/assets/javascripts/es6_browserified/time_tables/components/Timetable.js @@ -79,6 +79,7 @@ class Timetable extends Component{ <ExceptionsInDay index={i} value={this.props.timetable} + currentDate={d.date} metas={this.props.metas} blueDaytype={this.props.metas.day_types[d.wday]} onExcludeDateFromPeriod={this.props.onExcludeDateFromPeriod} diff --git a/app/assets/javascripts/es6_browserified/time_tables/containers/ErrorModal.js b/app/assets/javascripts/es6_browserified/time_tables/containers/ErrorModal.js index 16a7d45dd..e0b2c1240 100644 --- a/app/assets/javascripts/es6_browserified/time_tables/containers/ErrorModal.js +++ b/app/assets/javascripts/es6_browserified/time_tables/containers/ErrorModal.js @@ -12,6 +12,7 @@ const mapDispatchToProps = (dispatch) => { return { onModalClose: () =>{ dispatch(actions.closeModal()) + dispatch(actions.resetModalErrors()) } } } diff --git a/app/assets/javascripts/es6_browserified/time_tables/containers/PeriodForm.js b/app/assets/javascripts/es6_browserified/time_tables/containers/PeriodForm.js index 7f2db785a..951a09741 100644 --- a/app/assets/javascripts/es6_browserified/time_tables/containers/PeriodForm.js +++ b/app/assets/javascripts/es6_browserified/time_tables/containers/PeriodForm.js @@ -7,7 +7,7 @@ const mapStateToProps = (state) => { return { modal: state.modal, timetable: state.timetable, - metas: state.metas + metas: state.metas, } } @@ -27,8 +27,14 @@ const mapDispatchToProps = (dispatch) => { val = (val < 10) ? '0' + String(val) : String(val) dispatch(actions.updatePeriodForm(val, group, 'day')) }, - onValidatePeriodForm: (modalProps, timeTablePeriods, metas) => { - dispatch(actions.validatePeriodForm(modalProps, timeTablePeriods, metas)) + onValidatePeriodForm: (modalProps, timeTablePeriods, metas, timetableInDates) => { + let period_start = actions.formatDate(modalProps.begin) + let period_end = actions.formatDate(modalProps.end) + let error = '' + if (new Date(period_end) <= new Date(period_start)) error = 'La date de départ doit être antérieure à la date de fin' + if (error == '') error = actions.checkErrorsInPeriods(period_start, period_end, modalProps.index, timeTablePeriods) + if (error == '') error = actions.checkErrorsInDates(period_start, period_end, timetableInDates) + dispatch(actions.validatePeriodForm(modalProps, timeTablePeriods, metas, timetableInDates, error)) } } } 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 b5539e7d8..6287da15b 100644 --- a/app/assets/javascripts/es6_browserified/time_tables/containers/SaveTimetable.js +++ b/app/assets/javascripts/es6_browserified/time_tables/containers/SaveTimetable.js @@ -13,8 +13,8 @@ const mapStateToProps = (state) => { const mapDispatchToProps = (dispatch) => { return { - onShowErrorModal: () => { - dispatch(actions.showErrorModal()) + onShowErrorModal: (errorKey) => { + dispatch(actions.showErrorModal(errorKey)) }, getDispatch: () => { return dispatch diff --git a/app/assets/javascripts/es6_browserified/time_tables/containers/Timetable.js b/app/assets/javascripts/es6_browserified/time_tables/containers/Timetable.js index c6b5fcc6b..639a1e2ab 100644 --- a/app/assets/javascripts/es6_browserified/time_tables/containers/Timetable.js +++ b/app/assets/javascripts/es6_browserified/time_tables/containers/Timetable.js @@ -15,11 +15,11 @@ const mapDispatchToProps = (dispatch) => { onDeletePeriod: (index, dayTypes) =>{ dispatch(actions.deletePeriod(index, dayTypes)) }, - onExcludeDateFromPeriod: (index, dayTypes) => { - dispatch(actions.excludeDateFromPeriod(index, dayTypes)) + onExcludeDateFromPeriod: (index, dayTypes, date) => { + dispatch(actions.excludeDateFromPeriod(index, dayTypes, date)) }, - onIncludeDateInPeriod: (index, dayTypes) => { - dispatch(actions.includeDateInPeriod(index, dayTypes)) + onIncludeDateInPeriod: (index, dayTypes, date) => { + dispatch(actions.includeDateInPeriod(index, dayTypes, date)) }, onOpenEditPeriodForm: (period, index) => { dispatch(actions.openEditPeriodForm(period, index)) diff --git a/app/assets/javascripts/es6_browserified/time_tables/index.js b/app/assets/javascripts/es6_browserified/time_tables/index.js index 01f8c428e..a91747991 100644 --- a/app/assets/javascripts/es6_browserified/time_tables/index.js +++ b/app/assets/javascripts/es6_browserified/time_tables/index.js @@ -22,7 +22,8 @@ var initialState = { current_month: [], current_periode_range: '', periode_range: [], - time_table_periods: [] + time_table_periods: [], + time_table_dates: [] }, metas: { comment: '', @@ -61,7 +62,7 @@ var initialState = { let store = createStore( timeTablesApp, - initialState + initialState, // applyMiddleware(thunkMiddleware, promise, loggerMiddleware) ) 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 69f7b206e..c61296f1c 100644 --- a/app/assets/javascripts/es6_browserified/time_tables/reducers/modal.js +++ b/app/assets/javascripts/es6_browserified/time_tables/reducers/modal.js @@ -21,9 +21,13 @@ const modal = (state = {}, action) => { }) case 'OPEN_ERROR_MODAL': $('#ErrorModal').modal('show') - return _.assign({}, state, {type: 'error'}) + newModalProps = _.assign({}, state.modalProps, {error: action.error}) + return _.assign({}, state, {type: 'error'}, {modalProps: newModalProps}) + case 'RESET_MODAL_ERRORS': + newModalProps = _.assign({}, state.modalProps, {error: ''}) + return _.assign({}, state, {type: ''}, {modalProps: newModalProps}) case 'CLOSE_PERIOD_FORM': - newModalProps = _.assign({}, state.modalProps, {active: false}) + newModalProps = _.assign({}, state.modalProps, {active: false, error: ""}) return _.assign({}, state, {modalProps: newModalProps}) case 'OPEN_EDIT_PERIOD_FORM': period_start = action.period.period_start.split('-') @@ -50,19 +54,9 @@ const modal = (state = {}, action) => { newModalProps[action.group][action.selectType] = action.val return _.assign({}, state, {modalProps: newModalProps}) case 'VALIDATE_PERIOD_FORM': - period_start = actions.formatDate(action.modalProps.begin) - period_end = actions.formatDate(action.modalProps.end) - newModalProps = _.assign({}, state.modalProps) - - if(new Date(period_end) <= new Date(period_start)){ - newModalProps.error = 'La date de départ doit être antérieure à la date de fin' - return _.assign({}, state, {modalProps: newModalProps}) - } - - let newPeriods = JSON.parse(JSON.stringify(action.timeTablePeriods)) - let error = actions.checkErrorsInPeriods(period_start, period_end, action.modalProps.index, newPeriods) - newModalProps.error = error - newModalProps.active = (error == '') ? false : true + newModalProps = JSON.parse(JSON.stringify(state.modalProps)) + newModalProps.error = action.error + newModalProps.active = (newModalProps.error == '') ? false : true return _.assign({}, state, {modalProps: newModalProps}) default: return state 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 3d96fb7b7..45fec6b5f 100644 --- a/app/assets/javascripts/es6_browserified/time_tables/reducers/pagination.js +++ b/app/assets/javascripts/es6_browserified/time_tables/reducers/pagination.js @@ -26,6 +26,8 @@ const pagination = (state = {}, action) => { case 'VALIDATE_PERIOD_FORM': case 'UPDATE_COMMENT': case 'UPDATE_COLOR': + case 'UPDATE_DAY_TYPES': + case 'UPDATE_CURRENT_MONTH_FROM_DAYTYPES': toggleOnConfirmModal('modal') return _.assign({}, state, {stateChanged: true}) default: diff --git a/app/assets/javascripts/es6_browserified/time_tables/reducers/timetable.js b/app/assets/javascripts/es6_browserified/time_tables/reducers/timetable.js index 65cd9231a..390bdffb0 100644 --- a/app/assets/javascripts/es6_browserified/time_tables/reducers/timetable.js +++ b/app/assets/javascripts/es6_browserified/time_tables/reducers/timetable.js @@ -1,6 +1,7 @@ const _ = require('lodash') var actions = require('../actions') let newState = {} +let newDates = [] const timetable = (state = {}, action) => { switch (action.type) { @@ -9,7 +10,8 @@ const timetable = (state = {}, action) => { current_month: action.json.current_month, current_periode_range: action.json.current_periode_range, periode_range: action.json.periode_range, - time_table_periods: action.json.time_table_periods + time_table_periods: action.json.time_table_periods, + time_table_dates: action.json.time_table_dates }) return _.assign({}, fetchedState, {current_month: actions.updateSynthesis(fetchedState, actions.strToArrayDayTypes(action.json.day_types))}) case 'RECEIVE_MONTH': @@ -38,36 +40,46 @@ const timetable = (state = {}, action) => { newState = _.assign({}, state, {time_table_periods : ttperiods}) return _.assign({}, newState, {current_month: actions.updateSynthesis(newState, action.dayTypes)}) case 'INCLUDE_DATE_IN_PERIOD': + newDates = actions.checkIfTTHasDate(state.time_table_dates, {date: action.date, in_out: true}) let newCMi = state.current_month.map((d, i) => { if(i == action.index){ d.include_date = !d.include_date } return d }) - newState = _.assign({}, state, {current_month: newCMi}) + newState = _.assign({}, state, {current_month: newCMi, time_table_dates: newDates}) return _.assign({}, newState, {current_month: actions.updateSynthesis(newState, action.dayTypes)}) case 'EXCLUDE_DATE_FROM_PERIOD': + newDates = actions.checkIfTTHasDate(state.time_table_dates, {date: action.date, in_out: false}) let newCMe = state.current_month.map((d, i) => { if(i == action.index){ d.excluded_date = !d.excluded_date } return d }) - newState = _.assign({}, state, {current_month: newCMe}) + newState = _.assign({}, state, {current_month: newCMe, time_table_dates: newDates}) return _.assign({}, newState, {current_month: actions.updateSynthesis(newState, action.dayTypes)}) + case 'UPDATE_DAY_TYPES': + // We get the week days of the activated day types to reject the out_dates that that are out of newDayTypes + let weekDays = _.reduce(action.dayTypes, (array, dt, i) => { + if (dt) array.push(i) + return array + }, []) + + newDates = _.reject(state.time_table_dates, (d) => { + return d.in_out == false && !weekDays.includes(new Date(d.date).getDay()) + }) + return _.assign({}, state, {time_table_dates: newDates}) case 'UPDATE_CURRENT_MONTH_FROM_DAYTYPES': return _.assign({}, state, {current_month: actions.updateSynthesis(state, action.dayTypes)}) case 'VALIDATE_PERIOD_FORM': + if (action.error != '') return state + let period_start = actions.formatDate(action.modalProps.begin) let period_end = actions.formatDate(action.modalProps.end) - if(new Date(period_end) <= new Date(period_start)){ - return state - } + let newPeriods = JSON.parse(JSON.stringify(action.timeTablePeriods)) - let error = actions.checkErrorsInPeriods(period_start, period_end, action.modalProps.index, newPeriods) - if(error != ''){ - return state - } + if (action.modalProps.index !== false){ newPeriods[action.modalProps.index].period_start = period_start newPeriods[action.modalProps.index].period_end = period_end @@ -80,7 +92,6 @@ const timetable = (state = {}, action) => { } newState =_.assign({}, state, {time_table_periods: newPeriods}) return _.assign({}, newState, {current_month: actions.updateSynthesis(newState, action.metas.day_types)}) - default: return state } 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 c30f460d8..de87c14af 100644 --- a/app/assets/javascripts/es6_browserified/vehicle_journeys/actions/index.js +++ b/app/assets/javascripts/es6_browserified/vehicle_journeys/actions/index.js @@ -7,6 +7,12 @@ if (!window.Promise) { var batchActions = require('../batch').batchActions const actions = { + enterEditMode: () => ({ + type: "ENTER_EDIT_MODE" + }), + exitEditMode: () => ({ + type: "EXIT_EDIT_MODE" + }), receiveVehicleJourneys : (json) => ({ type: "RECEIVE_VEHICLE_JOURNEYS", json @@ -121,6 +127,9 @@ const actions = { objectid: selectedCompany.objectid } }), + unselect2Company: () => ({ + type: 'UNSELECT_CP_EDIT_MODAL', + }), editVehicleJourney : (data, selectedCompany) => ({ type: 'EDIT_VEHICLEJOURNEY', data, @@ -130,13 +139,14 @@ const actions = { type: 'EDIT_VEHICLEJOURNEY_NOTES', footnotes }), - shiftVehicleJourney : (data) => ({ + shiftVehicleJourney : (addtionalTime) => ({ type: 'SHIFT_VEHICLEJOURNEY', - data + addtionalTime }), - duplicateVehicleJourney : (data, departureDelta) => ({ + duplicateVehicleJourney : (addtionalTime, duplicateNumber, departureDelta) => ({ type: 'DUPLICATE_VEHICLEJOURNEY', - data, + addtionalTime, + duplicateNumber, departureDelta }), deleteVehicleJourneys : () => ({ @@ -259,10 +269,7 @@ const actions = { type: 'RECEIVE_TOTAL_COUNT', total }), - humanOID : (oid) => { - var a = oid.split(':') - return a[a.length - 1] - }, + humanOID: (oid) => oid.split(':')[2], fetchVehicleJourneys : (dispatch, currentPage, nextPage, queryString) => { if(currentPage == undefined){ currentPage = 1 @@ -371,6 +378,7 @@ const actions = { dispatch(actions.updateTotalCount(window.currentItemsLength - json.length)) } window.currentItemsLength = json.length + dispatch(actions.exitEditMode()) dispatch(actions.receiveVehicleJourneys(json)) } } @@ -384,7 +392,7 @@ const actions = { }, simplePad: (d) => { if(d.toString().length == 1){ - return (d < 10) ? '0' + d.toString() : d.toString(); + return '0' + d.toString() }else{ return d.toString() } @@ -418,8 +426,8 @@ const actions = { return vjas }, getDuplicateDelta: (original, newDeparture) => { - if (original.departure_time.hour != '' && original.departure_time.minute != '' && newDeparture.departure_time.hour != '' && newDeparture.departure_time.minute != ''){ - return (parseInt(newDeparture.departure_time.hour) - parseInt(original.departure_time.hour)) * 60 + (parseInt(newDeparture.departure_time.minute) - parseInt(original.departure_time.minute)) + if (original.departure_time.hour != '' && original.departure_time.minute != '' && newDeparture.departure_time.hour != undefined && newDeparture.departure_time.minute != undefined){ + return (newDeparture.departure_time.hour - parseInt(original.departure_time.hour)) * 60 + (newDeparture.departure_time.minute - parseInt(original.departure_time.minute)) } return 0 }, @@ -431,69 +439,25 @@ const actions = { vjas.delta = delta return vjas }, - checkSchedules: (schedule) => { - let hours = 0 - let minutes = 0 - if (parseInt(schedule.departure_time.minute) > 59){ - hours = Math.floor(parseInt(schedule.departure_time.minute) / 60) - minutes = parseInt(schedule.departure_time.minute) % 60 - schedule.departure_time.minute = actions.simplePad(minutes, 'minute') - schedule.departure_time.hour = parseInt(schedule.departure_time.hour) + hours - } - if (parseInt(schedule.arrival_time.minute) > 59){ - hours = Math.floor(parseInt(schedule.arrival_time.minute) / 60) - minutes = parseInt(schedule.arrival_time.minute) % 60 - schedule.arrival_time.minute = actions.simplePad(minutes, 'minute') - schedule.arrival_time.hour = parseInt(schedule.arrival_time.hour) + hours - } - if (parseInt(schedule.departure_time.minute) < 0){ - hours = Math.floor(parseInt(schedule.departure_time.minute) / 60) - minutes = (parseInt(schedule.departure_time.minute) % 60) + 60 - if(minutes == 60){ - minutes = 0 - } - schedule.departure_time.minute = actions.simplePad(minutes, 'minute') - schedule.departure_time.hour = parseInt(schedule.departure_time.hour) + hours - } - if (parseInt(schedule.arrival_time.minute) < 0){ - hours = Math.floor(parseInt(schedule.arrival_time.minute) / 60) - minutes = (parseInt(schedule.arrival_time.minute) % 60) + 60 - if(minutes == 60){ - minutes = 0 - } - schedule.arrival_time.minute = actions.simplePad(minutes, 'minute') - schedule.arrival_time.hour = parseInt(schedule.arrival_time.hour) + hours - } + getShiftedSchedule: ({departure_time, arrival_time}, additional_time) => { + // We create dummy dates objects to manipulate time more easily + let departureDT = new Date (Date.UTC(2017, 2, 1, parseInt(departure_time.hour), parseInt(departure_time.minute))) + let arrivalDT = new Date (Date.UTC(2017, 2, 1, parseInt(arrival_time.hour), parseInt(arrival_time.minute))) - if(parseInt(schedule.departure_time.hour) > 23){ - schedule.departure_time.hour = '23' - schedule.departure_time.minute = '59' - } - if(parseInt(schedule.arrival_time.hour) > 23){ - schedule.arrival_time.hour = '23' - schedule.arrival_time.minute = '59' - } + let newDepartureDT = new Date (departureDT.getTime() + additional_time * 60000) + let newArrivalDT = new Date (arrivalDT.getTime() + additional_time * 60000) - if(parseInt(schedule.departure_time.hour) < 0){ - schedule.departure_time.hour = '00' - schedule.departure_time.minute = '00' - } - if(parseInt(schedule.arrival_time.hour) < 0){ - schedule.arrival_time.hour = '00' - schedule.arrival_time.minute = '00' + return { + departure_time: { + hour: actions.simplePad(newDepartureDT.getUTCHours()), + minute: actions.simplePad(newDepartureDT.getUTCMinutes()) + }, + arrival_time: { + hour: actions.simplePad(newArrivalDT.getUTCHours()), + minute: actions.simplePad(newArrivalDT.getUTCMinutes()) + } } - - schedule.departure_time.hour = actions.simplePad(parseInt(schedule.departure_time.hour), 'hour') - schedule.arrival_time.hour = actions.simplePad(parseInt(schedule.arrival_time.hour), 'hour') - // if (parseInt(schedule.departure_time.hour) > 23){ - // schedule.departure_time.hour = parseInt(schedule.departure_time.hour) - 24 - // } - // if (parseInt(schedule.arrival_time.hour) > 23){ - // schedule.arrival_time.hour = parseInt(schedule.arrival_time.hour) - 24 - // } - // schedule.departure_time.hour = actions.pad(schedule.departure_time.hour, 'hour') - // schedule.arrival_time.hour = actions.pad(schedule.arrival_time.hour, 'hour') - } + }, } module.exports = actions diff --git a/app/assets/javascripts/es6_browserified/vehicle_journeys/components/SaveVehicleJourneys.js b/app/assets/javascripts/es6_browserified/vehicle_journeys/components/SaveVehicleJourneys.js index 05dda976d..3c45e5758 100644 --- a/app/assets/javascripts/es6_browserified/vehicle_journeys/components/SaveVehicleJourneys.js +++ b/app/assets/javascripts/es6_browserified/vehicle_journeys/components/SaveVehicleJourneys.js @@ -9,7 +9,7 @@ class SaveVehicleJourneys extends Component{ } render() { - if(this.props.filters.policy['vehicle_journeys.update'] == false) { + if (this.props.filters.policy['vehicle_journeys.update'] == false) { return false }else{ return ( @@ -21,10 +21,10 @@ class SaveVehicleJourneys extends Component{ type='button' onClick={e => { e.preventDefault() - actions.submitVehicleJourneys(this.props.dispatch, this.props.vehicleJourneys) + this.props.editMode ? this.props.onSubmitVehicleJourneys(this.props.dispatch, this.props.vehicleJourneys) : this.props.onEnterEditMode() }} > - Valider + {this.props.editMode ? "Valider" : "Editer"} </button> </form> </div> @@ -38,7 +38,9 @@ SaveVehicleJourneys.propTypes = { vehicleJourneys: PropTypes.array.isRequired, page: PropTypes.number.isRequired, status: PropTypes.object.isRequired, - filters: PropTypes.object.isRequired + filters: PropTypes.object.isRequired, + onEnterEditMode: PropTypes.func.isRequired, + onSubmitVehicleJourneys: PropTypes.func.isRequired } module.exports = SaveVehicleJourneys diff --git a/app/assets/javascripts/es6_browserified/vehicle_journeys/components/Tools.js b/app/assets/javascripts/es6_browserified/vehicle_journeys/components/Tools.js index b417828db..4948e6b1a 100644 --- a/app/assets/javascripts/es6_browserified/vehicle_journeys/components/Tools.js +++ b/app/assets/javascripts/es6_browserified/vehicle_journeys/components/Tools.js @@ -9,28 +9,34 @@ var NotesEditVehicleJourney = require('../containers/tools/NotesEditVehicleJourn var TimetablesEditVehicleJourney = require('../containers/tools/TimetablesEditVehicleJourney') var actions = require('../actions') -const Tools = ({vehicleJourneys, onCancelSelection}) => { +const Tools = ({vehicleJourneys, onCancelSelection, filters: {policy}, editMode}) => { return ( - <div className='select_toolbox'> - <ul> - <AddVehicleJourney /> - <DuplicateVehicleJourney /> - <ShiftVehicleJourney /> - <EditVehicleJourney /> - <TimetablesEditVehicleJourney /> - <NotesEditVehicleJourney /> - <DeleteVehicleJourneys /> - </ul> + <div> + { + (policy['vehicle_journeys.create'] && policy['vehicle_journeys.update'] && policy['vehicle_journeys.destroy'] && editMode) && + <div className='select_toolbox'> + <ul> + <AddVehicleJourney /> + <DuplicateVehicleJourney /> + <ShiftVehicleJourney /> + <EditVehicleJourney /> + <TimetablesEditVehicleJourney /> + <NotesEditVehicleJourney /> + <DeleteVehicleJourneys /> + </ul> - <span className='info-msg'>{actions.getSelected(vehicleJourneys).length} course(s) sélectionnée(s)</span> - <button className='btn btn-xs btn-link pull-right' onClick={onCancelSelection}>Annuler la sélection</button> + <span className='info-msg'>{actions.getSelected(vehicleJourneys).length} course(s) sélectionnée(s)</span> + <button className='btn btn-xs btn-link pull-right' onClick={onCancelSelection}>Annuler la sélection</button> + </div> + } </div> ) } Tools.propTypes = { vehicleJourneys : PropTypes.array.isRequired, - onCancelSelection: PropTypes.func.isRequired + onCancelSelection: PropTypes.func.isRequired, + filters: PropTypes.object.isRequired } module.exports = Tools diff --git a/app/assets/javascripts/es6_browserified/vehicle_journeys/components/VehicleJourney.js b/app/assets/javascripts/es6_browserified/vehicle_journeys/components/VehicleJourney.js index f2bd0c3cd..ca6694f61 100644 --- a/app/assets/javascripts/es6_browserified/vehicle_journeys/components/VehicleJourney.js +++ b/app/assets/javascripts/es6_browserified/vehicle_journeys/components/VehicleJourney.js @@ -58,7 +58,7 @@ class VehicleJourney extends Component { )} </div> - {(this.props.filters.policy['vehicle_journeys.update'] == true) && + {(this.props.filters.policy['vehicle_journeys.update'] == true && this.props.editMode) && <div className={(this.props.value.deletable ? 'disabled ' : '') + 'checkbox'}> <input id={this.props.index} @@ -79,13 +79,13 @@ class VehicleJourney extends Component { <div className={'cellwrap' + (this.cityNameChecker(vj) ? ' headlined' : '')}> {this.props.filters.toggleArrivals && <div data-headline='Arrivée à'> - <span className={((this.isDisabled(this.props.value.deletable, vj.dummy) || this.props.filters.policy['vehicle_journeys.update'] == false) ? 'disabled ' : '') + 'input-group time'}> + <span className={((this.isDisabled(this.props.value.deletable, vj.dummy) || this.props.filters.policy['vehicle_journeys.update'] == false || this.props.editMode == false) ? 'disabled ' : '') + 'input-group time'}> <input type='number' min='00' max='23' className='form-control' - disabled={(this.isDisabled(this.props.value.deletable, vj.dummy) || this.props.filters.policy['vehicle_journeys.update'] == false)} + disabled={(this.isDisabled(this.props.value.deletable, vj.dummy) || this.props.filters.policy['vehicle_journeys.update'] == false || this.props.editMode == false)} onChange={(e) => {this.props.onUpdateTime(e, i, this.props.index, 'hour', false, false)}} value={vj.arrival_time['hour']} /> @@ -95,7 +95,7 @@ class VehicleJourney extends Component { min='00' max='59' className='form-control' - disabled={((this.isDisabled(this.props.value.deletable), vj.dummy) || this.props.filters.policy['vehicle_journeys.update'] == false)} + disabled={((this.isDisabled(this.props.value.deletable), vj.dummy) || this.props.filters.policy['vehicle_journeys.update'] == false || this.props.editMode == false)} onChange={(e) => {this.props.onUpdateTime(e, i, this.props.index, 'minute', false, false)}} value={vj.arrival_time['minute']} /> @@ -108,13 +108,13 @@ class VehicleJourney extends Component { } </div> <div data-headline='Départ à'> - <span className={((this.isDisabled(this.props.value.deletable, vj.dummy) || this.props.filters.policy['vehicle_journeys.update'] == false) ? 'disabled ' : '') + 'input-group time'}> + <span className={((this.isDisabled(this.props.value.deletable, vj.dummy) || this.props.filters.policy['vehicle_journeys.update'] == false || this.props.editMode == false) ? 'disabled ' : '') + 'input-group time'}> <input type='number' min='00' max='23' className='form-control' - disabled={(this.isDisabled(this.props.value.deletable, vj.dummy) || this.props.filters.policy['vehicle_journeys.update'] == false)} + disabled={(this.isDisabled(this.props.value.deletable, vj.dummy) || this.props.filters.policy['vehicle_journeys.update'] == false || this.props.editMode == false)} onChange={(e) => {this.props.onUpdateTime(e, i, this.props.index, 'hour', true, this.props.filters.toggleArrivals)}} value={vj.departure_time['hour']} /> @@ -124,7 +124,7 @@ class VehicleJourney extends Component { min='00' max='59' className='form-control' - disabled={(this.isDisabled(this.props.value.deletable, vj.dummy) || this.props.filters.policy['vehicle_journeys.update'] == false)} + disabled={(this.isDisabled(this.props.value.deletable, vj.dummy) || this.props.filters.policy['vehicle_journeys.update'] == false || this.props.editMode == false)} onChange={(e) => {this.props.onUpdateTime(e, i, this.props.index, "minute", true, this.props.filters.toggleArrivals)}} value={vj.departure_time['minute']} /> diff --git a/app/assets/javascripts/es6_browserified/vehicle_journeys/components/VehicleJourneys.js b/app/assets/javascripts/es6_browserified/vehicle_journeys/components/VehicleJourneys.js index e8673a25a..8f3f91b25 100644 --- a/app/assets/javascripts/es6_browserified/vehicle_journeys/components/VehicleJourneys.js +++ b/app/assets/javascripts/es6_browserified/vehicle_journeys/components/VehicleJourneys.js @@ -97,7 +97,7 @@ class VehicleJourneys extends Component{ <div className="alert alert-danger mt-sm"> <strong>Erreur : </strong> {this.props.vehicleJourneys.map((vj, index) => - vj.errors.map((err, i) => { + vj.errors && vj.errors.map((err, i) => { return ( <ul key={i}> <li>{err}</li> @@ -131,6 +131,7 @@ class VehicleJourneys extends Component{ value={vj} key={index} index={index} + editMode={this.props.editMode} filters={this.props.filters} onUpdateTime={this.props.onUpdateTime} onSelectVehicleJourney={this.props.onSelectVehicleJourney} 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 34463600a..9446b993a 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 @@ -7,33 +7,64 @@ var _ = require('lodash') class DuplicateVehicleJourney extends Component { constructor(props) { super(props) + this.state = {} + this.onFormChange = this.onFormChange.bind(this) + this.handleSubmit = this.handleSubmit.bind(this) + } + + componentWillReceiveProps() { + if (actions.getSelected(this.props.vehicleJourneys).length > 0) { + let hour = parseInt(this.getDefaultValue('hour')) + let miunte = parseInt(this.getDefaultValue('minute')) + this.setState((state, props) => { + return { + originalDT: { + hour: hour, + minute: miunte + }, + duplicate_time_hh: hour, + duplicate_time_mm: miunte, + additional_time: 0, + duplicate_number: 1 + } + }) + } } handleSubmit() { if(actions.validateFields(this.refs) == true) { let newDeparture = { departure_time : { - hour: this.refs.duplicate_time_hh.value, - minute: this.refs.duplicate_time_mm.value + hour: this.state.duplicate_time_hh, + minute: this.state.duplicate_time_mm } } let val = actions.getDuplicateDelta(_.find(actions.getSelected(this.props.vehicleJourneys)[0].vehicle_journey_at_stops, {'dummy': false}), newDeparture) - this.refs.additional_time.value = parseInt(this.refs.additional_time.value) - this.props.onDuplicateVehicleJourney(this.refs, val) + this.props.onDuplicateVehicleJourney(this.state.additional_time, this.state.duplicate_number, val) this.props.onModalClose() $('#DuplicateVehicleJourneyModal').modal('hide') } } + onFormChange(e) { + let {name, value} = e.target + this.setState((state, props) => { + return { + [name]: parseInt(value) + } + }) + } + getDefaultValue(type) { let vjas = _.find(actions.getSelected(this.props.vehicleJourneys)[0].vehicle_journey_at_stops, {'dummy': false}) return vjas.departure_time[type] } + render() { if(this.props.status.isFetching == true) { return false } - if(this.props.status.fetchSuccess == true) { + if(this.props.status.fetchSuccess == true && actions.getSelected(this.props.vehicleJourneys).length > 0) { return ( <li className='st_action'> <button @@ -65,22 +96,26 @@ class DuplicateVehicleJourney extends Component { <span className={'input-group time' + (actions.getSelected(this.props.vehicleJourneys).length > 1 ? ' disabled' : '')}> <input type='number' + name='duplicate_time_hh' ref='duplicate_time_hh' min='00' max='23' className='form-control' - defaultValue={this.getDefaultValue('hour')} - disabled={(actions.getSelected(this.props.vehicleJourneys).length > 1 ? 'disabled' : '')} + value={this.state.duplicate_time_hh} + onChange={e => this.onFormChange(e)} + disabled={actions.getSelected(this.props.vehicleJourneys) && (actions.getSelected(this.props.vehicleJourneys).length > 1 ? 'disabled' : '')} /> <span>:</span> <input type='number' + name='duplicate_time_mm' ref='duplicate_time_mm' min='00' max='59' className='form-control' - defaultValue={this.getDefaultValue('minute')} - disabled={(actions.getSelected(this.props.vehicleJourneys).length > 1 ? 'disabled' : '')} + value={this.state.duplicate_time_mm} + onChange={e => this.onFormChange(e)} + disabled={actions.getSelected(this.props.vehicleJourneys) && (actions.getSelected(this.props.vehicleJourneys).length > 1 ? 'disabled' : '')} /> </span> </span> @@ -92,11 +127,13 @@ class DuplicateVehicleJourney extends Component { <input type='number' style={{'width': 104}} + name='duplicate_number' ref='duplicate_number' min='1' max='20' - defaultValue='1' + value={this.state.duplicate_number} className='form-control' + onChange={e => this.onFormChange(e)} onKeyDown={(e) => actions.resetValidation(e.currentTarget)} required /> @@ -105,19 +142,21 @@ class DuplicateVehicleJourney extends Component { <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"> + <span className="col-sm-4"> <input type='number' style={{'width': 104}} + name='additional_time' ref='additional_time' - min='-59' - max='59' - defaultValue='0' - className='form-control' + min='-720' + max='720' + value={this.state.additional_time} + className='form-control disabled' + onChange={e => this.onFormChange(e)} onKeyDown={(e) => actions.resetValidation(e.currentTarget)} required - /> - </div> + /> + </span> </div> </div> @@ -131,9 +170,9 @@ class DuplicateVehicleJourney extends Component { Annuler </button> <button - className='btn btn-primary' + className={'btn btn-primary ' + (this.state.additional_time == 0 && this.state.originalDT.hour == this.state.duplicate_time_hh && this.state.originalDT.minute == this.state.duplicate_time_mm ? 'disabled' : '')} type='button' - onClick={this.handleSubmit.bind(this)} + onClick={this.handleSubmit} > Valider </button> diff --git a/app/assets/javascripts/es6_browserified/vehicle_journeys/components/tools/EditVehicleJourney.js b/app/assets/javascripts/es6_browserified/vehicle_journeys/components/tools/EditVehicleJourney.js index d49ea578a..2ff4999c6 100644 --- a/app/assets/javascripts/es6_browserified/vehicle_journeys/components/tools/EditVehicleJourney.js +++ b/app/assets/javascripts/es6_browserified/vehicle_journeys/components/tools/EditVehicleJourney.js @@ -14,8 +14,10 @@ class EditVehicleJourney extends Component { var company; if(this.props.modal.modalProps.selectedCompany) { company = this.props.modal.modalProps.selectedCompany - } else { + } else if (typeof this.props.modal.modalProps.vehicleJourney.company === Object) { company = this.props.modal.modalProps.vehicleJourney.company + } else { + company = undefined } this.props.onEditVehicleJourney(this.refs, company) this.props.onModalClose() @@ -96,6 +98,7 @@ class EditVehicleJourney extends Component { <CompanySelect2 company = {this.props.modal.modalProps.vehicleJourney.company} onSelect2Company = {(e) => this.props.onSelect2Company(e)} + onUnselect2Company = {() => this.props.onUnselect2Company()} /> </div> </div> diff --git a/app/assets/javascripts/es6_browserified/vehicle_journeys/components/tools/ShiftVehicleJourney.js b/app/assets/javascripts/es6_browserified/vehicle_journeys/components/tools/ShiftVehicleJourney.js index 269bb1b8c..dd0bade39 100644 --- a/app/assets/javascripts/es6_browserified/vehicle_journeys/components/tools/ShiftVehicleJourney.js +++ b/app/assets/javascripts/es6_browserified/vehicle_journeys/components/tools/ShiftVehicleJourney.js @@ -6,16 +6,27 @@ var actions = require('../../actions') class ShiftVehicleJourney extends Component { constructor(props) { super(props) + this.state = { + additional_time: 0 + } } handleSubmit() { if(actions.validateFields(this.refs) == true) { - this.props.onShiftVehicleJourney(this.refs) + this.props.onShiftVehicleJourney(this.state.additional_time) this.props.onModalClose() $('#ShiftVehicleJourneyModal').modal('hide') } } + handleAdditionalTimeChange() { + this.setState((state, props) => { + return { + additional_time: parseInt(this.refs.additional_time.value) + } + }) + } + render() { if(this.props.status.isFetching == true) { return false @@ -53,14 +64,16 @@ class ShiftVehicleJourney extends Component { <label className='control-label is-required'>Avec un décalage de</label> <input type='number' + style={{'width': 104}} ref='additional_time' - min='-59' - max='59' + min='-720' + max='720' + value={this.state.additional_time} className='form-control' - defaultValue='0' + onChange={this.handleAdditionalTimeChange.bind(this)} onKeyDown={(e) => actions.resetValidation(e.currentTarget)} required - /> + /> </div> </div> </div> @@ -75,7 +88,7 @@ class ShiftVehicleJourney extends Component { Annuler </button> <button - className='btn btn-primary' + className={'btn btn-primary ' + (this.state.additional_time == 0 ? 'disabled' : '')} type='button' onClick={this.handleSubmit.bind(this)} > diff --git a/app/assets/javascripts/es6_browserified/vehicle_journeys/components/tools/select2s/CompanySelect2.js b/app/assets/javascripts/es6_browserified/vehicle_journeys/components/tools/select2s/CompanySelect2.js index d277be003..c1ce0e92a 100644 --- a/app/assets/javascripts/es6_browserified/vehicle_journeys/components/tools/select2s/CompanySelect2.js +++ b/app/assets/javascripts/es6_browserified/vehicle_journeys/components/tools/select2s/CompanySelect2.js @@ -20,10 +20,11 @@ class BSelect4 extends React.Component{ data={(this.props.company) ? [this.props.company.name] : undefined} value={(this.props.company) ? this.props.company.name : undefined} onSelect={(e) => this.props.onSelect2Company(e) } + onUnselect={() => this.props.onUnselect2Company()} multiple={false} ref='company_id' options={{ - allowClear: false, + allowClear: true, theme: 'bootstrap', width: '100%', placeholder: 'Filtrer par transporteur...', 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 0183aac43..5157300ba 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 @@ -33,8 +33,13 @@ class BSelect4 extends React.Component{ dataType: 'json', delay: '500', data: function(params) { + let newParmas = params.term.split(" ") return { - q: {short_id_or_comment_cont: params.term}, + q: { + objectid_cont_any: newParmas, + comment_cont_any: newParmas, + m: 'or' + } }; }, processResults: function(data, params) { diff --git a/app/assets/javascripts/es6_browserified/vehicle_journeys/containers/SaveVehicleJourneys.js b/app/assets/javascripts/es6_browserified/vehicle_journeys/containers/SaveVehicleJourneys.js index 87bbe5353..c1ce90d38 100644 --- a/app/assets/javascripts/es6_browserified/vehicle_journeys/containers/SaveVehicleJourneys.js +++ b/app/assets/javascripts/es6_browserified/vehicle_journeys/containers/SaveVehicleJourneys.js @@ -5,6 +5,7 @@ var SaveVehicleJourneysComponent = require('../components/SaveVehicleJourneys') const mapStateToProps = (state) => { return { + editMode: state.editMode, vehicleJourneys: state.vehicleJourneys, page: state.pagination.page, status: state.status, @@ -12,6 +13,17 @@ const mapStateToProps = (state) => { } } -const SaveVehicleJourneys = connect(mapStateToProps)(SaveVehicleJourneysComponent) +const mapDispatchToProps = (dispatch) => { + return { + onEnterEditMode: () => { + dispatch(actions.enterEditMode()) + }, + onSubmitVehicleJourneys: (next, state) => { + actions.submitVehicleJourneys(dispatch, state, next) + } + } +} + +const SaveVehicleJourneys = connect(mapStateToProps, mapDispatchToProps)(SaveVehicleJourneysComponent) module.exports = SaveVehicleJourneys diff --git a/app/assets/javascripts/es6_browserified/vehicle_journeys/containers/Tools.js b/app/assets/javascripts/es6_browserified/vehicle_journeys/containers/Tools.js index 35f492c98..a4b3056ac 100644 --- a/app/assets/javascripts/es6_browserified/vehicle_journeys/containers/Tools.js +++ b/app/assets/javascripts/es6_browserified/vehicle_journeys/containers/Tools.js @@ -4,7 +4,9 @@ var actions = require('../actions') const mapStateToProps = (state) => { return { - vehicleJourneys: state.vehicleJourneys + vehicleJourneys: state.vehicleJourneys, + editMode: state.editMode, + filters: state.filters } } diff --git a/app/assets/javascripts/es6_browserified/vehicle_journeys/containers/VehicleJourneysList.js b/app/assets/javascripts/es6_browserified/vehicle_journeys/containers/VehicleJourneysList.js index 176a68500..f834e4457 100644 --- a/app/assets/javascripts/es6_browserified/vehicle_journeys/containers/VehicleJourneysList.js +++ b/app/assets/javascripts/es6_browserified/vehicle_journeys/containers/VehicleJourneysList.js @@ -4,6 +4,7 @@ var VehicleJourneys = require('../components/VehicleJourneys') const mapStateToProps = (state) => { return { + editMode: state.editMode, vehicleJourneys: state.vehicleJourneys, status: state.status, filters: state.filters, diff --git a/app/assets/javascripts/es6_browserified/vehicle_journeys/containers/tools/DuplicateVehicleJourney.js b/app/assets/javascripts/es6_browserified/vehicle_journeys/containers/tools/DuplicateVehicleJourney.js index 224b52a19..70e8fde4d 100644 --- a/app/assets/javascripts/es6_browserified/vehicle_journeys/containers/tools/DuplicateVehicleJourney.js +++ b/app/assets/javascripts/es6_browserified/vehicle_journeys/containers/tools/DuplicateVehicleJourney.js @@ -19,8 +19,8 @@ const mapDispatchToProps = (dispatch) => { onOpenDuplicateModal: () =>{ dispatch(actions.openDuplicateModal()) }, - onDuplicateVehicleJourney: (data, departureDelta) =>{ - dispatch(actions.duplicateVehicleJourney(data, departureDelta)) + onDuplicateVehicleJourney: (addtionalTime, duplicateNumber, departureDelta) =>{ + dispatch(actions.duplicateVehicleJourney(addtionalTime, duplicateNumber, departureDelta)) } } } diff --git a/app/assets/javascripts/es6_browserified/vehicle_journeys/containers/tools/EditVehicleJourney.js b/app/assets/javascripts/es6_browserified/vehicle_journeys/containers/tools/EditVehicleJourney.js index 8f4d43519..ac9772b8a 100644 --- a/app/assets/javascripts/es6_browserified/vehicle_journeys/containers/tools/EditVehicleJourney.js +++ b/app/assets/javascripts/es6_browserified/vehicle_journeys/containers/tools/EditVehicleJourney.js @@ -24,7 +24,10 @@ const mapDispatchToProps = (dispatch) => { }, onSelect2Company: (e) => { dispatch(actions.select2Company(e.params.data)) - } + }, + onUnselect2Company: () => { + dispatch(actions.unselect2Company()) + }, } } diff --git a/app/assets/javascripts/es6_browserified/vehicle_journeys/index.js b/app/assets/javascripts/es6_browserified/vehicle_journeys/index.js index 97aa60526..53bbcf952 100644 --- a/app/assets/javascripts/es6_browserified/vehicle_journeys/index.js +++ b/app/assets/javascripts/es6_browserified/vehicle_journeys/index.js @@ -19,6 +19,7 @@ if (window.journeyPatternId) selectedJP.push(window.journeyPatternId) var initialState = { + editMode: false, filters: { selectedJourneyPatterns : selectedJP, policy: window.perms, @@ -89,7 +90,7 @@ if (window.jpOrigin){ let store = createStore( enableBatching(vehicleJourneysApp), - initialState + initialState, // applyMiddleware(thunkMiddleware, promise, loggerMiddleware) ) diff --git a/app/assets/javascripts/es6_browserified/vehicle_journeys/reducers/editMode.js b/app/assets/javascripts/es6_browserified/vehicle_journeys/reducers/editMode.js new file mode 100644 index 000000000..2e8af1aa8 --- /dev/null +++ b/app/assets/javascripts/es6_browserified/vehicle_journeys/reducers/editMode.js @@ -0,0 +1,12 @@ +const editMode = (state = {}, action ) => { + switch (action.type) { + case "ENTER_EDIT_MODE": + return true + case "EXIT_EDIT_MODE": + return false + default: + return state + } +} + +module.exports = editMode diff --git a/app/assets/javascripts/es6_browserified/vehicle_journeys/reducers/index.js b/app/assets/javascripts/es6_browserified/vehicle_journeys/reducers/index.js index bd4d7226b..4e0839102 100644 --- a/app/assets/javascripts/es6_browserified/vehicle_journeys/reducers/index.js +++ b/app/assets/javascripts/es6_browserified/vehicle_journeys/reducers/index.js @@ -4,6 +4,7 @@ var pagination = require('./pagination') var modal = require('./modal') var status = require('./status') var filters = require('./filters') +var editMode = require('./editMode') var stopPointsList = require('./stopPointsList') const vehicleJourneysApp = combineReducers({ @@ -12,6 +13,7 @@ const vehicleJourneysApp = combineReducers({ modal, status, filters, + editMode, stopPointsList }) 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 229fd2058..1e5ff4294 100644 --- a/app/assets/javascripts/es6_browserified/vehicle_journeys/reducers/modal.js +++ b/app/assets/javascripts/es6_browserified/vehicle_journeys/reducers/modal.js @@ -57,6 +57,9 @@ const modal = (state = {}, action) => { case 'SELECT_CP_EDIT_MODAL': newModalProps = _.assign({}, state.modalProps, {selectedCompany : action.selectedItem}) return _.assign({}, state, {modalProps: newModalProps}) + case 'UNSELECT_CP_EDIT_MODAL': + newModalProps = _.assign({}, state.modalProps, {selectedCompany : undefined}) + return _.assign({}, state, {modalProps: newModalProps}) case 'SELECT_TT_CALENDAR_MODAL': newModalProps = _.assign({}, state.modalProps, {selectedTimetable : action.selectedItem}) return _.assign({}, state, {modalProps: newModalProps}) 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 d463d4b8f..969b2ddd8 100644 --- a/app/assets/javascripts/es6_browserified/vehicle_journeys/reducers/vehicleJourneys.js +++ b/app/assets/javascripts/es6_browserified/vehicle_journeys/reducers/vehicleJourneys.js @@ -51,17 +51,8 @@ const vehicleJourney= (state = {}, action, keep) => { let shiftedArray, shiftedSchedule, shiftedVjas shiftedArray = state.vehicle_journey_at_stops.map((vjas, i) => { if (!vjas.dummy){ - shiftedSchedule = { - departure_time: { - hour: vjas.departure_time.hour, - minute: actions.simplePad(parseInt(vjas.departure_time.minute) + parseInt(action.data.additional_time.value)) - }, - arrival_time: { - hour: vjas.arrival_time.hour, - minute: actions.simplePad(parseInt(vjas.arrival_time.minute) + parseInt(action.data.additional_time.value)) - } - } - actions.checkSchedules(shiftedSchedule) + shiftedSchedule = actions.getShiftedSchedule(vjas, action.addtionalTime) + shiftedVjas = _.assign({}, state.vehicle_journey_at_stops[i], shiftedSchedule) vjas = _.assign({}, state.vehicle_journey_at_stops[i], shiftedVjas) if(!keep){ @@ -181,13 +172,16 @@ const vehicleJourneys = (state = [], action) => { let dupeVj let dupes = [] let selectedIndex - let val = action.data.additional_time.value + let val = action.addtionalTime let departureDelta = action.departureDelta state.map((vj, i) => { if(vj.selected){ selectedIndex = i - for (i = 0; i< action.data.duplicate_number.value; i++){ - action.data.additional_time.value = (parseInt(val) * (i + 1)) + departureDelta + for (i = 0; i< action.duplicateNumber; i++){ + // We check if the departureDelta is != 0 to create the first VJ on the updated deparure time if it is the case + // let delta = departureDelta == 0 ? 1 : 0 + // action.addtionalTime = (val * (i + delta)) + departureDelta + action.addtionalTime = (val * (i + 1)) + departureDelta dupeVj = vehicleJourney(vj, action, false) dupeVj.published_journey_name = dupeVj.published_journey_name + '-' + i dupeVj.selected = false diff --git a/app/assets/javascripts/filters/calendar.js b/app/assets/javascripts/filters/calendar.js new file mode 100644 index 000000000..a4e84777c --- /dev/null +++ b/app/assets/javascripts/filters/calendar.js @@ -0,0 +1,6 @@ +const DateFilter = require('../helpers/date_filters') + +$(document).ready(function(){ + const calendarDF = new DateFilter("#calendar_filter_btn", "Tous les champs du filtre de date doivent être remplis", "#q_contains_date_NUMi") + calendarDF() +}) diff --git a/app/assets/javascripts/filters/import.js b/app/assets/javascripts/filters/import.js new file mode 100644 index 000000000..d0b96da10 --- /dev/null +++ b/app/assets/javascripts/filters/import.js @@ -0,0 +1,6 @@ +const DateFilter = require('../helpers/date_filters') + +$(document).ready(function(){ + const importDF = new DateFilter("#import_filter_btn", "Tous les champs du filtre de date doivent être remplis", "#q_started_on_date_NUMi") + importDF() +}) diff --git a/app/assets/javascripts/filters/time_table.js b/app/assets/javascripts/filters/time_table.js new file mode 100644 index 000000000..9e24d03fe --- /dev/null +++ b/app/assets/javascripts/filters/time_table.js @@ -0,0 +1,7 @@ +$(document).ready(function(){ + const DateFilter = require('../helpers/date_filters') + + const timetableDF = new DateFilter("#time_table_filter_btn", window.I18n.fr.time_tables.error_period_filter, "#q_start_date_gteq_NUMi", "#q_end_date_lteq_NUMi") + + timetableDF() +}) diff --git a/app/assets/javascripts/filters/workbench.js b/app/assets/javascripts/filters/workbench.js new file mode 100644 index 000000000..af3e13c59 --- /dev/null +++ b/app/assets/javascripts/filters/workbench.js @@ -0,0 +1,6 @@ +const DateFilter = require('../helpers/date_filters') + +$(document).ready(function(){ + const workbenchDF = new DateFilter("#referential_filter_btn", window.I18n.fr.referentials.error_period_filter, "#q_validity_period_begin_gteq_NUMi", "#q_validity_period_end_lteq_NUMi") + workbenchDF() +}) diff --git a/app/assets/javascripts/helpers/date_filters.js b/app/assets/javascripts/helpers/date_filters.js new file mode 100644 index 000000000..1f48bb28f --- /dev/null +++ b/app/assets/javascripts/helpers/date_filters.js @@ -0,0 +1,38 @@ +const DateFilter = function(buttonId, message, ...inputIds) { + this.buttonId = buttonId + this.inputIds = inputIds + this.message = message + + const getVal = (str, key) => { + let newStr = str.replace(/NUM/, key) + return $(newStr).val() + } + + const getDates = () => { + return this.inputIds.reduce((arr, id) => { + let newIds = [1, 2, 3].map(key => getVal(id, key)) + arr.push(...newIds) + return arr + },[]) + } + + const allInputFilled = () => { + return getDates().every(date => !!date) + } + + const noInputFilled = () => { + return getDates().every(date => !date) + } + + const execute = () => { + $(this.buttonId).on("click", (e) => { + if (allInputFilled() == false && noInputFilled() == false) { + e.preventDefault() + alert(this.message) + } + }) + } + return execute +} + +module.exports = DateFilter diff --git a/app/assets/javascripts/time_table.coffee b/app/assets/javascripts/time_table.coffee deleted file mode 100644 index 8789cb226..000000000 --- a/app/assets/javascripts/time_table.coffee +++ /dev/null @@ -1,14 +0,0 @@ - $(document).on("click", "#time_table_filter_btn", (e) -> - dates = [1, 2, 3].reduce (arr, key) -> - arr.push $("#q_start_date_gteq_#{key}i").val(), $("#q_end_date_lteq_#{key}i").val() - arr - , [] - - validDate = dates.every (date) -> !!date - - noDate = dates.every (date) -> !date - - unless (validDate || noDate) - e.preventDefault() - alert(window.I18n.fr.time_tables.error_period_filter) - ) diff --git a/app/assets/javascripts/workbench.coffee b/app/assets/javascripts/workbench.coffee deleted file mode 100644 index 0e9fe62a3..000000000 --- a/app/assets/javascripts/workbench.coffee +++ /dev/null @@ -1,18 +0,0 @@ - $(document).on("click", "#referential_filter_btn", (e) -> - dates = [1, 2, 3].reduce (arr, key) -> - arr.push $("#q_validity_period_begin_gteq_#{key}i").val(), $("#q_validity_period_end_lteq_#{key}i").val() - arr - , [] - - validDate = dates.every (date) -> !!date - - noDate = dates.every (date) -> !date - - console.log("valid dates :", validDate) - console.log("no dates :", noDate) - console.log(dates) - - unless (validDate || noDate) - e.preventDefault() - alert(window.I18n.fr.referentials.error_period_filter) - ) |
