From efa8b6072e35f09d580f227b0b3175260c145fea Mon Sep 17 00:00:00 2001 From: cedricnjanga Date: Mon, 21 Aug 2017 11:58:13 +0200 Subject: Add the possibility to add included days in a period --- .../es6_browserified/time_tables/actions/index.js | 36 ++++++++--- .../time_tables/components/ExceptionsInDay.js | 30 ++++++--- .../time_tables/components/PeriodsInDay.js | 2 +- .../time_tables/components/Timetable.js | 10 ++- .../time_tables/containers/Timetable.js | 12 ++++ .../es6_browserified/time_tables/index.js | 12 ++-- .../es6_browserified/time_tables/reducers/metas.js | 6 +- .../es6_browserified/time_tables/reducers/modal.js | 2 +- .../time_tables/reducers/pagination.js | 6 +- .../time_tables/reducers/timetable.js | 71 +++++++++++++++------- 10 files changed, 134 insertions(+), 53 deletions(-) (limited to 'app/assets/javascripts') 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 61667f5ab..7a1ba10ff 100644 --- a/app/assets/javascripts/es6_browserified/time_tables/actions/index.js +++ b/app/assets/javascripts/es6_browserified/time_tables/actions/index.js @@ -112,14 +112,26 @@ const actions = { metas, timetableInDates }), - includeDateInPeriod: (index, dayTypes, date) => ({ - type: 'INCLUDE_DATE_IN_PERIOD', + addIncludedDate: (index, dayTypes, date) => ({ + type: 'ADD_INCLUDED_DATE', index, dayTypes, date }), - excludeDateFromPeriod: (index, dayTypes, date) => ({ - type: 'EXCLUDE_DATE_FROM_PERIOD', + removeIncludedDate: (index, dayTypes, date) => ({ + type: 'REMOVE_INCLUDED_DATE', + index, + dayTypes, + date + }), + addExcludedDate: (index, dayTypes, date) => ({ + type: 'ADD_EXCLUDED_DATE', + index, + dayTypes, + date + }), + removeExcludedDate: (index, dayTypes, date) => ({ + type: 'REMOVE_EXCLUDED_DATE', index, dayTypes, date @@ -187,12 +199,20 @@ const actions = { let bool = isInPeriod(state.current_month[i]) return _.assign({}, state.current_month[i], { in_periods: bool, - include_date: bool ? false : state.current_month[i].include_date, + // include_date: bool ? false : state.current_month[i].include_date, excluded_date: !bool ? false : state.current_month[i].excluded_date }) }) return improvedCM }, + updateExcludedDates: (period_start, period_end, dates) => { + // We remove excluded dates which was in the updated/deleted period + let begin = new Date(period_start) + let end = new Date(period_end) + + return _.reject(dates, d => new Date(d.date) >= begin && new Date(d.date) <= end && d.in_out == false) + + }, checkConfirmModal: (event, callback, stateChanged, dispatch, metas, timetable) => { if(stateChanged){ const error = actions.errorModalKey(timetable.time_table_periods, metas.day_types) @@ -209,7 +229,7 @@ const actions = { formatDate: (props) => { return props.year + '-' + props.month + '-' + props.day }, - checkErrorsInPeriods: (start, end, index, periods, days) => { + checkErrorsInPeriods: (start, end, index, periods) => { let error = '' start = new Date(start) end = new Date(end) @@ -221,13 +241,13 @@ const actions = { }) return error }, - checkErrorsInDates: (start, end, in_days) => { + checkErrorsInDates: (start, end, in_days, dayTypes) => { let error = '' start = new Date(start) end = new Date(end) _.each(in_days, ({date}) => { - if (start <= new Date(date) && end >= new Date(date)) { + if (start <= new Date(date) && end >= new Date(date) && dayTypes[new Date(date).getDay()]) { error = 'Une période ne peut chevaucher une date dans un calendrier' } }) 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 4879e537f..80c2e4b7a 100644 --- a/app/assets/javascripts/es6_browserified/time_tables/components/ExceptionsInDay.js +++ b/app/assets/javascripts/es6_browserified/time_tables/components/ExceptionsInDay.js @@ -8,6 +8,15 @@ class ExceptionsInDay extends Component { super(props) } + handleClick() { + const {index, day, metas: {day_types} } = this.props + if (day.in_periods && day_types[day.wday]) { + day.excluded_date ? this.props.onRemoveExcludedDate(index, day_types, day.date) : this.props.onAddExcludedDate(index, day_types, day.date) + } else { + day.include_date ? this.props.onRemoveIncludedDate(index, day_types, day.date) : this.props.onAddIncludedDate(index, day_types, day.date) + } + } + render() { {/* display add or remove link, only if true in daytypes */} {/* display add or remove link, according to context (presence in period, or not) */} @@ -20,14 +29,14 @@ 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.currentDate) + this.handleClick() }} > ) - } else if(this.props.value.current_month[this.props.index].in_periods == false) { + } else { return (
) - } else if(this.props.value.current_month[this.props.index].in_periods == true && this.props.blueDaytype == false){ - return ( -
- ) - } else{ - return false - } + // } else if(this.props.value.current_month[this.props.index].in_periods == true && this.props.blueDaytype == false){ + // return ( + //
+ // ) + // } else{ + // return false + // } + } } } diff --git a/app/assets/javascripts/es6_browserified/time_tables/components/PeriodsInDay.js b/app/assets/javascripts/es6_browserified/time_tables/components/PeriodsInDay.js index ca44d3a07..f56509b99 100644 --- a/app/assets/javascripts/es6_browserified/time_tables/components/PeriodsInDay.js +++ b/app/assets/javascripts/es6_browserified/time_tables/components/PeriodsInDay.js @@ -35,7 +35,7 @@ class PeriodsInDay extends Component { render() { return (
{this.props.value.map((p, i) => { if(!p.deleted){ 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 3af1a11a4..a613549c3 100644 --- a/app/assets/javascripts/es6_browserified/time_tables/components/Timetable.js +++ b/app/assets/javascripts/es6_browserified/time_tables/components/Timetable.js @@ -60,13 +60,14 @@ class Timetable extends Component{ {this.props.timetable.current_month.map((d, i) =>
{/* day_types */} -
+
{/* periods */} 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 639a1e2ab..a37e99982 100644 --- a/app/assets/javascripts/es6_browserified/time_tables/containers/Timetable.js +++ b/app/assets/javascripts/es6_browserified/time_tables/containers/Timetable.js @@ -15,6 +15,18 @@ const mapDispatchToProps = (dispatch) => { onDeletePeriod: (index, dayTypes) =>{ dispatch(actions.deletePeriod(index, dayTypes)) }, + onAddIncludedDate: (index, dayTypes, date) => { + dispatch(actions.addIncludedDate(index, dayTypes, date)) + }, + onRemoveIncludedDate: (index, dayTypes, date) => { + dispatch(actions.removeIncludedDate(index, dayTypes, date)) + }, + onAddExcludedDate: (index, dayTypes, date) => { + dispatch(actions.addExcludedDate(index, dayTypes, date)) + }, + onRemoveExcludedDate: (index, dayTypes, date) => { + dispatch(actions.removeExcludedDate(index, dayTypes, date)) + }, onExcludeDateFromPeriod: (index, dayTypes, date) => { dispatch(actions.excludeDateFromPeriod(index, dayTypes, date)) }, diff --git a/app/assets/javascripts/es6_browserified/time_tables/index.js b/app/assets/javascripts/es6_browserified/time_tables/index.js index a91747991..9873f5532 100644 --- a/app/assets/javascripts/es6_browserified/time_tables/index.js +++ b/app/assets/javascripts/es6_browserified/time_tables/index.js @@ -6,10 +6,10 @@ var timeTablesApp = require('./reducers') var App = require('./containers/App') // logger, DO NOT REMOVE -// var applyMiddleware = require('redux').applyMiddleware -// var createLogger = require('redux-logger') -// var thunkMiddleware = require('redux-thunk').default -// var promise = require('redux-promise') +var applyMiddleware = require('redux').applyMiddleware +var createLogger = require('redux-logger') +var thunkMiddleware = require('redux-thunk').default +var promise = require('redux-promise') var initialState = { status: { @@ -58,12 +58,12 @@ var initialState = { confirmModal: {} } } -// const loggerMiddleware = createLogger() +const loggerMiddleware = createLogger() let store = createStore( timeTablesApp, initialState, - // applyMiddleware(thunkMiddleware, promise, loggerMiddleware) + applyMiddleware(thunkMiddleware, promise, loggerMiddleware) ) render( 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 2ce084efd..ab5ed3d91 100644 --- a/app/assets/javascripts/es6_browserified/time_tables/reducers/metas.js +++ b/app/assets/javascripts/es6_browserified/time_tables/reducers/metas.js @@ -15,8 +15,10 @@ const metas = (state = {}, action) => { 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 'ADD_INCLUDED_DATE': + case 'REMOVE_INCLUDED_DATE': + case 'ADD_EXCLUDED_DATE': + case 'REMOVE_EXCLUDED_DATE': case 'DELETE_PERIOD': case 'VALIDATE_PERIOD_FORM': return _.assign({}, state, {calendar: null}) 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 3fe4e43a2..3329aa56f 100644 --- a/app/assets/javascripts/es6_browserified/time_tables/reducers/modal.js +++ b/app/assets/javascripts/es6_browserified/time_tables/reducers/modal.js @@ -66,7 +66,7 @@ const modal = (state = {}, action) => { let newPeriods = JSON.parse(JSON.stringify(action.timeTablePeriods)) let newDays = JSON.parse(JSON.stringify(action.timetableInDates)) let error = actions.checkErrorsInPeriods(period_start, period_end, action.modalProps.index, newPeriods) - if (error == '') error = actions.checkErrorsInDates(period_start, period_end, newDays) + if (error == '') error = actions.checkErrorsInDates(period_start, period_end, newDays, action.metas.day_types) newModalProps.error = error newModalProps.active = (error == '') ? false : true 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 45fec6b5f..f38b124d9 100644 --- a/app/assets/javascripts/es6_browserified/time_tables/reducers/pagination.js +++ b/app/assets/javascripts/es6_browserified/time_tables/reducers/pagination.js @@ -20,8 +20,10 @@ const pagination = (state = {}, action) => { case 'CHANGE_PAGE': toggleOnConfirmModal() return _.assign({}, state, {currentPage : action.page, stateChanged: false}) - case 'INCLUDE_DATE_IN_PERIOD': - case 'EXCLUDE_DATE_FROM_PERIOD': + case 'ADD_INCLUDED_DATE': + case 'REMOVE_INCLUDED_DATE': + case 'ADD_EXCLUDED_DATE': + case 'REMOVE_EXCLUDED_DATE': case 'DELETE_PERIOD': case 'VALIDATE_PERIOD_FORM': case 'UPDATE_COMMENT': 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 64db1ccc1..cbdf8fa60 100644 --- a/app/assets/javascripts/es6_browserified/time_tables/reducers/timetable.js +++ b/app/assets/javascripts/es6_browserified/time_tables/reducers/timetable.js @@ -1,7 +1,9 @@ const _ = require('lodash') var actions = require('../actions') let newState = {} +let newPeriods = [] let newDates = [] +let newCM = [] const timetable = (state = {}, action) => { switch (action.type) { @@ -11,7 +13,7 @@ const timetable = (state = {}, action) => { current_periode_range: action.json.current_periode_range, periode_range: action.json.periode_range, time_table_periods: action.json.time_table_periods, - time_table_dates: action.json.time_table_dates + time_table_dates: _.sortBy(action.json.time_table_dates, ['date']) }) return _.assign({}, fetchedState, {current_month: actions.updateSynthesis(fetchedState, actions.strToArrayDayTypes(action.json.day_types))}) case 'RECEIVE_MONTH': @@ -31,33 +33,55 @@ const timetable = (state = {}, action) => { actions.fetchTimeTables(action.dispatch, action.page) return _.assign({}, state, {current_periode_range: action.page}) case 'DELETE_PERIOD': - let ttperiods = state.time_table_periods.map((period, i) =>{ + newPeriods = state.time_table_periods.map((period, i) =>{ if(i == action.index){ period.deleted = true } return period }) - newState = _.assign({}, state, {time_table_periods : ttperiods}) + let deletedPeriod = state.time_table_periods[action.index] + newDates = actions.updateExcludedDates(deletedPeriod.period_start, deletedPeriod.period_end, state.time_table_dates) + newState = _.assign({}, state, {time_table_periods : newPeriods, time_table_dates: newDates}) 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 + case 'ADD_INCLUDED_DATE': + newDates = state.time_table_dates.concat({date: action.date, in_out: true}) + newCM = state.current_month.map((d, i) => { + if (i == action.index){ + d.include_date = true } return d }) - newState = _.assign({}, state, {current_month: newCMi, time_table_dates: newDates}) + newState = _.assign({}, state, {current_month: newCM, 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 + case 'REMOVE_INCLUDED_DATE': + newDates = _.reject(state.time_table_dates, ['date', action.date]) + newCM = state.current_month.map((d, i) => { + if (i == action.index){ + d.include_date = false + } + return d + }) + newState = _.assign({}, state, {current_month: newCM, time_table_dates: newDates}) + return _.assign({}, newState, {current_month: actions.updateSynthesis(newState, action.dayTypes)}) + case 'ADD_EXCLUDED_DATE': + newDates = state.time_table_dates.concat({date: action.date, in_out: false}) + newCM = state.current_month.map((d, i) => { + if (i == action.index){ + d.excluded_date = true + } + return d + }) + newState = _.assign({}, state, {current_month: newCM, time_table_dates: newDates}) + return _.assign({}, newState, {current_month: actions.updateSynthesis(newState, action.dayTypes)}) + case 'REMOVE_EXCLUDED_DATE': + newDates = _.reject(state.time_table_dates, ['date', action.date]) + newCM = state.current_month.map((d, i) => { + if (i == action.index){ + d.excluded_date = false } return d }) - newState = _.assign({}, state, {current_month: newCMe, time_table_dates: newDates}) + newState = _.assign({}, state, {current_month: newCM, time_table_dates: newDates}) return _.assign({}, newState, {current_month: actions.updateSynthesis(newState, action.dayTypes)}) case 'UPDATE_CURRENT_MONTH_FROM_DAYTYPES': return _.assign({}, state, {current_month: actions.updateSynthesis(state, action.dayTypes)}) @@ -67,17 +91,20 @@ const timetable = (state = {}, action) => { if(new Date(period_end) <= new Date(period_start)){ return state } - let newPeriods = JSON.parse(JSON.stringify(action.timeTablePeriods)) - let newDays = JSON.parse(JSON.stringify(action.timetableInDates)) + newPeriods = JSON.parse(JSON.stringify(action.timeTablePeriods)) + let inDates = JSON.parse(JSON.stringify(action.timetableInDates)) let error = actions.checkErrorsInPeriods(period_start, period_end, action.modalProps.index, newPeriods) - if (error == '') error = actions.checkErrorsInDates(period_start, period_end, newDays) + if (error == '') error = actions.checkErrorsInDates(period_start, period_end, inDates, action.metas.day_types) if(error != ''){ return state } + let updatePeriod if (action.modalProps.index !== false){ - newPeriods[action.modalProps.index].period_start = period_start - newPeriods[action.modalProps.index].period_end = period_end + updatePeriod = state.time_table_periods[action.modalProps.index] + updatePeriod.period_start = period_start + updatePeriod.period_end = period_end + newDates = actions.updateExcludedDates(updatePeriod.period_start, updatePeriod.period_end, state.time_table_dates) }else{ let newPeriod = { period_start: period_start, @@ -85,7 +112,9 @@ const timetable = (state = {}, action) => { } newPeriods.push(newPeriod) } - newState =_.assign({}, state, {time_table_periods: newPeriods}) + + newDates = newDates || state.time_table_dates + newState =_.assign({}, state, {time_table_periods: newPeriods, time_table_dates: newDates}) return _.assign({}, newState, {current_month: actions.updateSynthesis(newState, action.metas.day_types)}) default: -- cgit v1.2.3 From ce579b6fe5edb8f462de45a84ab7f4affe1b525a Mon Sep 17 00:00:00 2001 From: cedricnjanga Date: Wed, 20 Sep 2017 12:00:45 +0200 Subject: Merge master to branch and resolve all the conflicts We also needed to take remove the right time table dates when we update day types : - excluded dates that are out of day types - included dates that are in day types and in periods --- .../es6_browserified/time_tables/actions/index.js | 12 +++++++- .../time_tables/reducers/timetable.js | 36 +++++++++------------- 2 files changed, 25 insertions(+), 23 deletions(-) (limited to 'app/assets/javascripts') 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 a6add8418..761c29ba3 100644 --- a/app/assets/javascripts/es6_browserified/time_tables/actions/index.js +++ b/app/assets/javascripts/es6_browserified/time_tables/actions/index.js @@ -169,7 +169,6 @@ const actions = { let date = new Date(strDate) return date.toLocaleDateString() }, - updateSynthesis: (state, daytypes) => { let periods = state.time_table_periods @@ -206,6 +205,17 @@ const actions = { }) return improvedCM }, + isInPeriod: (periods, date) => { + date = new Date(date) + + for (let period of periods) { + let begin = new Date(period.period_start) + let end = new Date(period.period_end) + if (date >= begin && date <= end) return true + } + + return false + }, updateExcludedDates: (period_start, period_end, dates) => { // We remove excluded dates which was in the updated/deleted period let begin = new Date(period_start) 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 d61c813ec..dcdee6f9b 100644 --- a/app/assets/javascripts/es6_browserified/time_tables/reducers/timetable.js +++ b/app/assets/javascripts/es6_browserified/time_tables/reducers/timetable.js @@ -42,47 +42,35 @@ const timetable = (state = {}, action) => { let deletedPeriod = state.time_table_periods[action.index] newDates = actions.updateExcludedDates(deletedPeriod.period_start, deletedPeriod.period_end, state.time_table_dates) newState = _.assign({}, state, {time_table_periods : newPeriods, time_table_dates: newDates}) - return _.assign({}, newState, {current_month: actions.updateSynthesis(newState, action.dayTypes)}) + return _.assign({}, newState, { current_month: actions.updateSynthesis(newState, action.dayTypes)}) case 'ADD_INCLUDED_DATE': newDates = state.time_table_dates.concat({date: action.date, in_out: true}) newCM = state.current_month.map((d, i) => { - if (i == action.index){ - d.include_date = true - } + if (i == action.index) d.include_date = true return d }) - newState = _.assign({}, state, {current_month: newCM, time_table_dates: newDates}) - return _.assign({}, newState, {current_month: actions.updateSynthesis(newState, action.dayTypes)}) + return _.assign({}, state, {current_month: newCM, time_table_dates: newDates}) case 'REMOVE_INCLUDED_DATE': newDates = _.reject(state.time_table_dates, ['date', action.date]) newCM = state.current_month.map((d, i) => { - if (i == action.index){ - d.include_date = false - } + if (i == action.index) d.include_date = false return d }) - newState = _.assign({}, state, {current_month: newCM, time_table_dates: newDates}) - return _.assign({}, newState, {current_month: actions.updateSynthesis(newState, action.dayTypes)}) + return _.assign({}, state, {current_month: newCM, time_table_dates: newDates}) case 'ADD_EXCLUDED_DATE': newDates = state.time_table_dates.concat({date: action.date, in_out: false}) newCM = state.current_month.map((d, i) => { - if (i == action.index){ - d.excluded_date = true - } + if (i == action.index) d.excluded_date = true return d }) - newState = _.assign({}, state, {current_month: newCM, time_table_dates: newDates}) - return _.assign({}, newState, {current_month: actions.updateSynthesis(newState, action.dayTypes)}) + return _.assign({}, state, {current_month: newCM, time_table_dates: newDates}) case 'REMOVE_EXCLUDED_DATE': newDates = _.reject(state.time_table_dates, ['date', action.date]) newCM = state.current_month.map((d, i) => { - if (i == action.index){ - d.excluded_date = false - } + if (i == action.index) d.excluded_date = false return d }) - newState = _.assign({}, state, {current_month: newCM, time_table_dates: newDates}) - return _.assign({}, newState, {current_month: actions.updateSynthesis(newState, action.dayTypes)}) + return _.assign({}, state, {current_month: newCM, time_table_dates: newDates}) 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) => { @@ -91,7 +79,11 @@ const timetable = (state = {}, action) => { }, []) newDates = _.reject(state.time_table_dates, (d) => { - return d.in_out == false && !weekDays.includes(new Date(d.date).getDay()) + let weekDay = new Date(d.date).getDay() + let excludedDatesToRemove = d.in_out == false && !weekDays.includes(weekDay) + let includedDatesToRemove = d.in_out == true && actions.isInPeriod(state.time_table_periods, d.date) && weekDays.includes(weekDay) + + return excludedDatesToRemove || includedDatesToRemove }) return _.assign({}, state, {time_table_dates: newDates}) case 'UPDATE_CURRENT_MONTH_FROM_DAYTYPES': -- cgit v1.2.3 From f7a9ddfa0bfa3bdceb140fea03964a2bb16090c6 Mon Sep 17 00:00:00 2001 From: cedricnjanga Date: Wed, 20 Sep 2017 15:07:05 +0200 Subject: Fix error in UPDATE_DAY_TYPE action in timetable reducer The condition to remove the right dates was not well implemented --- .../es6_browserified/time_tables/actions/index.js | 2 +- app/assets/javascripts/es6_browserified/time_tables/index.js | 12 ++++++------ .../es6_browserified/time_tables/reducers/timetable.js | 8 +++++--- 3 files changed, 12 insertions(+), 10 deletions(-) (limited to 'app/assets/javascripts') 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 761c29ba3..928a63d2b 100644 --- a/app/assets/javascripts/es6_browserified/time_tables/actions/index.js +++ b/app/assets/javascripts/es6_browserified/time_tables/actions/index.js @@ -256,7 +256,7 @@ const actions = { } return error }, - checkErrorsInDates: (start, end, in_days, dayTypes) => { + checkErrorsInDates: (start, end, in_days) => { let error = '' start = new Date(start) end = new Date(end) diff --git a/app/assets/javascripts/es6_browserified/time_tables/index.js b/app/assets/javascripts/es6_browserified/time_tables/index.js index 9873f5532..a91747991 100644 --- a/app/assets/javascripts/es6_browserified/time_tables/index.js +++ b/app/assets/javascripts/es6_browserified/time_tables/index.js @@ -6,10 +6,10 @@ var timeTablesApp = require('./reducers') var App = require('./containers/App') // logger, DO NOT REMOVE -var applyMiddleware = require('redux').applyMiddleware -var createLogger = require('redux-logger') -var thunkMiddleware = require('redux-thunk').default -var promise = require('redux-promise') +// var applyMiddleware = require('redux').applyMiddleware +// var createLogger = require('redux-logger') +// var thunkMiddleware = require('redux-thunk').default +// var promise = require('redux-promise') var initialState = { status: { @@ -58,12 +58,12 @@ var initialState = { confirmModal: {} } } -const loggerMiddleware = createLogger() +// const loggerMiddleware = createLogger() let store = createStore( timeTablesApp, initialState, - applyMiddleware(thunkMiddleware, promise, loggerMiddleware) + // applyMiddleware(thunkMiddleware, promise, loggerMiddleware) ) render( 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 dcdee6f9b..8bd830415 100644 --- a/app/assets/javascripts/es6_browserified/time_tables/reducers/timetable.js +++ b/app/assets/javascripts/es6_browserified/time_tables/reducers/timetable.js @@ -80,10 +80,12 @@ const timetable = (state = {}, action) => { newDates = _.reject(state.time_table_dates, (d) => { let weekDay = new Date(d.date).getDay() - let excludedDatesToRemove = d.in_out == false && !weekDays.includes(weekDay) - let includedDatesToRemove = d.in_out == true && actions.isInPeriod(state.time_table_periods, d.date) && weekDays.includes(weekDay) - return excludedDatesToRemove || includedDatesToRemove + if (d.in_out) { + return actions.isInPeriod(state.time_table_periods, d.date) && weekDays.includes(weekDay) + } else { + return !weekDays.includes(weekDay) + } }) return _.assign({}, state, {time_table_dates: newDates}) case 'UPDATE_CURRENT_MONTH_FROM_DAYTYPES': -- cgit v1.2.3 From 68192809695a5c2dc44198882b7cc7bc14b5500e Mon Sep 17 00:00:00 2001 From: cedricnjanga Date: Thu, 21 Sep 2017 15:11:26 +0200 Subject: Merge pull request 55 into master => Debug to add the possibility to add included dates in a period (outside of day types) => Refacto in the timetable reducer to share more code between some actions --- .../es6_browserified/time_tables/actions/index.js | 55 ++++------------------ .../es6_browserified/time_tables/index.js | 12 ++--- .../time_tables/reducers/timetable.js | 23 ++++----- 3 files changed, 25 insertions(+), 65 deletions(-) (limited to 'app/assets/javascripts') 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 928a63d2b..ba5d91568 100644 --- a/app/assets/javascripts/es6_browserified/time_tables/actions/index.js +++ b/app/assets/javascripts/es6_browserified/time_tables/actions/index.js @@ -169,38 +169,16 @@ const actions = { let date = new Date(strDate) return date.toLocaleDateString() }, - updateSynthesis: (state, daytypes) => { - let periods = state.time_table_periods + updateSynthesis: ({current_month, time_table_dates: dates, time_table_periods: periods}) => { + let newPeriods = _.reject(periods, 'deleted') + let improvedCM = current_month.map((d, i) => { + let isInPeriod = actions.isInPeriod(newPeriods, d.date) + let isIncluded = _.some(dates, {'date': d.date, 'in_out': true}) - let isInPeriod = function(d){ - let currentMonth = state.current_periode_range.split('-') - let twodigitsDay = d.mday < 10 ? ('0' + d.mday) : d.mday - let currentDate = new Date(currentMonth[0] + '-' + currentMonth[1] + '-' + twodigitsDay) - - // We compare periods & currentDate, to determine if it is included or not - let testDate = false - periods.map((p, i) => { - 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 - } - } - }) - return testDate - } - - let improvedCM = state.current_month.map((d, i) => { - let bool = isInPeriod(state.current_month[i]) - return _.assign({}, state.current_month[i], { - in_periods: bool, - // include_date: bool ? false : state.current_month[i].include_date, - excluded_date: !bool ? false : state.current_month[i].excluded_date + return _.assign({}, current_month[i], { + in_periods: isInPeriod, + include_date: isIncluded, + excluded_date: !isInPeriod ? false : current_month[i].excluded_date }) }) return improvedCM @@ -216,14 +194,6 @@ const actions = { return false }, - updateExcludedDates: (period_start, period_end, dates) => { - // We remove excluded dates which was in the updated/deleted period - let begin = new Date(period_start) - let end = new Date(period_end) - - return _.reject(dates, d => new Date(d.date) >= begin && new Date(d.date) <= end && d.in_out == false) - - }, checkConfirmModal: (event, callback, stateChanged, dispatch, metas, timetable) => { if(stateChanged){ const error = actions.errorModalKey(timetable.time_table_periods, metas.day_types) @@ -348,13 +318,6 @@ const actions = { } }, - checkIfTTHasDate: (dates, date) => { - if (_.some(dates, date)) { - return _.reject(dates, ['date', date.date]) - } else { - return dates.concat(date) - } - } } module.exports = actions diff --git a/app/assets/javascripts/es6_browserified/time_tables/index.js b/app/assets/javascripts/es6_browserified/time_tables/index.js index a91747991..9873f5532 100644 --- a/app/assets/javascripts/es6_browserified/time_tables/index.js +++ b/app/assets/javascripts/es6_browserified/time_tables/index.js @@ -6,10 +6,10 @@ var timeTablesApp = require('./reducers') var App = require('./containers/App') // logger, DO NOT REMOVE -// var applyMiddleware = require('redux').applyMiddleware -// var createLogger = require('redux-logger') -// var thunkMiddleware = require('redux-thunk').default -// var promise = require('redux-promise') +var applyMiddleware = require('redux').applyMiddleware +var createLogger = require('redux-logger') +var thunkMiddleware = require('redux-thunk').default +var promise = require('redux-promise') var initialState = { status: { @@ -58,12 +58,12 @@ var initialState = { confirmModal: {} } } -// const loggerMiddleware = createLogger() +const loggerMiddleware = createLogger() let store = createStore( timeTablesApp, initialState, - // applyMiddleware(thunkMiddleware, promise, loggerMiddleware) + applyMiddleware(thunkMiddleware, promise, loggerMiddleware) ) render( 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 8bd830415..edb965065 100644 --- a/app/assets/javascripts/es6_browserified/time_tables/reducers/timetable.js +++ b/app/assets/javascripts/es6_browserified/time_tables/reducers/timetable.js @@ -1,9 +1,6 @@ const _ = require('lodash') var actions = require('../actions') -let newState = {} -let newPeriods = [] -let newDates = [] -let newCM = [] +let newState, newPeriods, newDates, newCM const timetable = (state = {}, action) => { switch (action.type) { @@ -15,12 +12,12 @@ const timetable = (state = {}, action) => { time_table_periods: action.json.time_table_periods, time_table_dates: _.sortBy(action.json.time_table_dates, ['date']) }) - return _.assign({}, fetchedState, {current_month: actions.updateSynthesis(fetchedState, actions.strToArrayDayTypes(action.json.day_types))}) + return _.assign({}, fetchedState, {current_month: actions.updateSynthesis(fetchedState)}) case 'RECEIVE_MONTH': newState = _.assign({}, state, { current_month: action.json.days }) - return _.assign({}, newState, {current_month: actions.updateSynthesis(newState, actions.strToArrayDayTypes(action.json.day_types))}) + return _.assign({}, newState, {current_month: actions.updateSynthesis(newState)}) case 'GO_TO_PREVIOUS_PAGE': case 'GO_TO_NEXT_PAGE': let nextPage = action.nextPage ? 1 : -1 @@ -39,10 +36,10 @@ const timetable = (state = {}, action) => { } return period }) - let deletedPeriod = state.time_table_periods[action.index] - newDates = actions.updateExcludedDates(deletedPeriod.period_start, deletedPeriod.period_end, state.time_table_dates) + let deletedPeriod = Array.of(state.time_table_periods[action.index]) + newDates = _.reject(state.time_table_dates, d => actions.isInPeriod(deletedPeriod, d.date) && !d.in_out) newState = _.assign({}, state, {time_table_periods : newPeriods, time_table_dates: newDates}) - return _.assign({}, newState, { current_month: actions.updateSynthesis(newState, action.dayTypes)}) + return _.assign({}, newState, { current_month: actions.updateSynthesis(newState)}) case 'ADD_INCLUDED_DATE': newDates = state.time_table_dates.concat({date: action.date, in_out: true}) newCM = state.current_month.map((d, i) => { @@ -89,7 +86,7 @@ const timetable = (state = {}, action) => { }) return _.assign({}, state, {time_table_dates: newDates}) case 'UPDATE_CURRENT_MONTH_FROM_DAYTYPES': - return _.assign({}, state, {current_month: actions.updateSynthesis(state, action.dayTypes)}) + return _.assign({}, state, {current_month: actions.updateSynthesis(state)}) case 'VALIDATE_PERIOD_FORM': if (action.error != '') return state @@ -99,10 +96,10 @@ const timetable = (state = {}, action) => { let newPeriods = JSON.parse(JSON.stringify(action.timeTablePeriods)) if (action.modalProps.index !== false){ - updatePeriod = state.time_table_periods[action.modalProps.index] + updatePeriod = newPeriods[action.modalProps.index] updatePeriod.period_start = period_start updatePeriod.period_end = period_end - newDates = actions.updateExcludedDates(updatePeriod.period_start, updatePeriod.period_end, state.time_table_dates) + newDates = _.reject(state.time_table_dates, d => actions.isInPeriod(newPeriods, d.date) && !d.in_out) }else{ let newPeriod = { period_start: period_start, @@ -113,7 +110,7 @@ const timetable = (state = {}, action) => { newDates = newDates || state.time_table_dates newState =_.assign({}, state, {time_table_periods: newPeriods, time_table_dates: newDates}) - return _.assign({}, newState, {current_month: actions.updateSynthesis(newState, action.metas.day_types)}) + return _.assign({}, newState, {current_month: actions.updateSynthesis(newState)}) default: return state } -- cgit v1.2.3 From 95efd2d3bf7dea6c2f659d42d1c37cbb2a5fd831 Mon Sep 17 00:00:00 2001 From: cedricnjanga Date: Thu, 21 Sep 2017 16:53:56 +0200 Subject: Vehicle journey message error update to show the sort_id and not the local_id --- app/assets/javascripts/es6_browserified/time_tables/index.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) (limited to 'app/assets/javascripts') diff --git a/app/assets/javascripts/es6_browserified/time_tables/index.js b/app/assets/javascripts/es6_browserified/time_tables/index.js index 9873f5532..a91747991 100644 --- a/app/assets/javascripts/es6_browserified/time_tables/index.js +++ b/app/assets/javascripts/es6_browserified/time_tables/index.js @@ -6,10 +6,10 @@ var timeTablesApp = require('./reducers') var App = require('./containers/App') // logger, DO NOT REMOVE -var applyMiddleware = require('redux').applyMiddleware -var createLogger = require('redux-logger') -var thunkMiddleware = require('redux-thunk').default -var promise = require('redux-promise') +// var applyMiddleware = require('redux').applyMiddleware +// var createLogger = require('redux-logger') +// var thunkMiddleware = require('redux-thunk').default +// var promise = require('redux-promise') var initialState = { status: { @@ -58,12 +58,12 @@ var initialState = { confirmModal: {} } } -const loggerMiddleware = createLogger() +// const loggerMiddleware = createLogger() let store = createStore( timeTablesApp, initialState, - applyMiddleware(thunkMiddleware, promise, loggerMiddleware) + // applyMiddleware(thunkMiddleware, promise, loggerMiddleware) ) render( -- cgit v1.2.3 From 76b3b813fb3cafc6880e50a57e823634a79d9a32 Mon Sep 17 00:00:00 2001 From: cedricnjanga Date: Mon, 25 Sep 2017 11:41:17 +0200 Subject: Refs: #4601 Fix bug to keep the routes stop points if validation dont pass - Added functions to itineraries/form_helper to handle empty fields and modifiy input regarding the user input - Update the stop point checker to not add the error span each time the user hit the form's submit button --- .../es6_browserified/itineraries/form_helper.js | 62 ++++++++++++++++++---- .../es6_browserified/itineraries/index.js | 19 +++---- .../itineraries/reducers/stopPoints.js | 2 +- 3 files changed, 61 insertions(+), 22 deletions(-) (limited to 'app/assets/javascripts') diff --git a/app/assets/javascripts/es6_browserified/itineraries/form_helper.js b/app/assets/javascripts/es6_browserified/itineraries/form_helper.js index 0baba27ef..f682e39c0 100644 --- a/app/assets/javascripts/es6_browserified/itineraries/form_helper.js +++ b/app/assets/javascripts/es6_browserified/itineraries/form_helper.js @@ -1,11 +1,55 @@ -const addInput = (name, value, index) => { - let form = document.querySelector('form') - let input = document.createElement('input') - let formatedName = 'route[stop_points_attributes]['+ index.toString()+']['+name+']' - input.setAttribute('type', 'hidden') - input.setAttribute('name', formatedName) - input.setAttribute('value', value) - form.appendChild(input) +const formHelper = { + addInput: (name, value, index) => { + let form = document.querySelector('form') + let input = document.createElement('input') + let formatedName = `route[stop_points_attributes][${index.toString()}][${name}]` + input.setAttribute('type', 'hidden') + input.setAttribute('name', formatedName) + input.setAttribute('value', value) + form.appendChild(input) + }, + addError: (ids) => { + ids.forEach((id) => { + if (!$(id).parents('.form-group').hasClass('has-error')) { + $(id).parents('.form-group').addClass('has-error') + $(id).parent().append(`${'doit être rempli(e)'}`) + } + }) + }, + cleanInputs: (ids) => { + ids.forEach((id) =>{ + $(id).parents('.form-group').removeClass('has-error') + $(id).siblings('span').remove() + }) + }, + handleForm: (...ids) => { + let filledInputs = [] + let blankInputs = [] + ids.forEach(id => { + $(id).val() == "" ? blankInputs.push(id) : filledInputs.push(id) + }) + + if (filledInputs.length > 0) formHelper.cleanInputs(filledInputs) + if (blankInputs.length > 0) formHelper.addError(blankInputs) + }, + handleStopPoints: (event, state) => { + if (state.stopPoints.length >= 2) { + state.stopPoints.map((stopPoint, i) => { + formHelper.addInput('id', stopPoint.stoppoint_id ? stopPoint.stoppoint_id : '', i) + formHelper.addInput('stop_area_id', stopPoint.stoparea_id, i) + formHelper.addInput('position', i, i) + formHelper.addInput('for_boarding', stopPoint.for_boarding, i) + formHelper.addInput('for_alighting', stopPoint.for_alighting, i) + }) + if ($('.alert.alert-danger').length > 0) $('.alert.alert-danger').remove() + } else { + event.preventDefault() + let msg = "L'itinéraire doit comporter au moins deux arrêts" + if ($('.alert.alert-danger').length == 0) { + $('#stop_points').find('.subform').after(`
" ${msg} "
`) + } + } + } } -module.exports = addInput +module.exports = formHelper \ No newline at end of file diff --git a/app/assets/javascripts/es6_browserified/itineraries/index.js b/app/assets/javascripts/es6_browserified/itineraries/index.js index ad32b9519..bb06126f7 100644 --- a/app/assets/javascripts/es6_browserified/itineraries/index.js +++ b/app/assets/javascripts/es6_browserified/itineraries/index.js @@ -4,7 +4,7 @@ var Provider = require('react-redux').Provider var createStore = require('redux').createStore var reducers = require('./reducers') var App = require('./components/App') -var addInput = require('./form_helper') +var { handleForm, handleStopPoints } = require('./form_helper') let datas = JSON.parse(decodeURIComponent(window.itinerary_stop)) // logger, DO NOT REMOVE @@ -67,17 +67,12 @@ render( document.querySelector('input[name=commit]').addEventListener('click', (event)=>{ let state = store.getState() - if(state.stopPoints.length >= 2) { - state.stopPoints.map((stopPoint, i) => { - addInput('id', stopPoint.stoppoint_id ? stopPoint.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) - }) - } else { + let name = $("#route_name").val() + let publicName = $("#route_published_name").val() + if (name == "" || publicName == "") { event.preventDefault() - let msg = "L'itinéraire doit comporter au moins deux arrêts" - $('#stop_points').find('.subform').after("
" + msg + "
") + handleForm("#route_name", "#route_published_name") } + + handleStopPoints(event, state) }) diff --git a/app/assets/javascripts/es6_browserified/itineraries/reducers/stopPoints.js b/app/assets/javascripts/es6_browserified/itineraries/reducers/stopPoints.js index a3b8accb3..f3a26b8d7 100644 --- a/app/assets/javascripts/es6_browserified/itineraries/reducers/stopPoints.js +++ b/app/assets/javascripts/es6_browserified/itineraries/reducers/stopPoints.js @@ -1,5 +1,5 @@ var _ = require('lodash') -var addInput = require('../form_helper') +var { addInput } = require('../form_helper') const stopPoint = (state = {}, action, length) => { switch (action.type) { -- cgit v1.2.3