diff --git a/src/actions/Tasks.js b/src/actions/Tasks.js index 2db83b5..57ce456 100644 --- a/src/actions/Tasks.js +++ b/src/actions/Tasks.js @@ -8,7 +8,7 @@ import { actionGeneralCalculation } from './Calculation'; const changeWrapper = ({ dispatch, form, field, payload, touch = true }) => { - dispatch({ + return dispatch({ type: '@@redux-form/CHANGE', meta: { form, @@ -24,10 +24,13 @@ const recalculateTime = (field, getState, selector, dispatch, form) => { if (!field) return null; const currentTask = selector(getState(), field); - const sumTasks = currentTask.tasks.filter(({ isChecked }) => isChecked).reduce((sum, item) => ({ - min: sum.min + item.minimumMinutes, - max: sum.max + item.maximumMinutes, - }), { min: 0, max: 0 }); + const { tasks, maximumMinutes, minimumMinutes } = currentTask; + const sumTasks = tasks ? + tasks.filter(({ isChecked }) => isChecked).reduce((sum, item) => ({ + min: sum.min + item.minimumMinutes, + max: sum.max + item.maximumMinutes, + }), { min: 0, max: 0 }) + : { min: minimumMinutes, max: maximumMinutes } changeWrapper({ dispatch, form, field: `${field}.minimumMinutes`, payload: sumTasks.min }); changeWrapper({ dispatch, form, field: `${field}.maximumMinutes`, payload: sumTasks.max }); @@ -38,12 +41,34 @@ const recalculateTime = (field, getState, selector, dispatch, form) => { }; export const actionToggleTask = ({ form, field }) => - (dispatch, getState) => { + async (dispatch, getState) => { const selector = formValueSelector(form); const parentField = field.replace(/.?tasks\[\d+\]$/, ''); - - recalculateTime(parentField, getState, selector, dispatch, form); - + // find out task index + const match = field.split('.'); + const task = match && match[0]; + const replaceExp = /(tasks\[)|(\])/g; + const taskIndex = parseInt(task.replace(replaceExp, ''), 10); + if (taskIndex >= 0 && match.length < 2) { + // toggle all subtasks + const task = getState().form['ESTIMATE_FORM'].values.tasks[taskIndex]; + const subtasks = task && task.tasks + const subtaskCount = subtasks && subtasks.length; + if (subtaskCount) { + const { isChecked } = task; + const allChanges = []; + for(let i = 0; i < subtaskCount; i++ ) { + const subtaskField = `tasks[${taskIndex}].tasks[${i}]`; + const subTask = Object.assign({}, subtasks[i], { isChecked }); + allChanges.push(changeWrapper({ dispatch, form, field: subtaskField , payload: subTask })) + } + await Promise.all(allChanges); + recalculateTime(`tasks[${taskIndex}].tasks[${0}]`, getState, selector, dispatch, form); + + } + } else { + recalculateTime(parentField, getState, selector, dispatch, form); + } dispatch(actionGeneralCalculation({ form })); }; diff --git a/src/components/Header/Task.js b/src/components/Header/Task.js index 9900583..ff47d06 100644 --- a/src/components/Header/Task.js +++ b/src/components/Header/Task.js @@ -40,7 +40,8 @@ class Task extends React.Component { }, payload: checked, }); - + const exp = /task(\[){1,1}[0-9]+\]{1,1}/; + const tasks = field.split('.')[0]; actionToggleTask({ form, field, checked }); } diff --git a/src/utils/spreadsheets/sheetHelper.js b/src/utils/spreadsheets/sheetHelper.js index d3a35db..6704bbd 100644 --- a/src/utils/spreadsheets/sheetHelper.js +++ b/src/utils/spreadsheets/sheetHelper.js @@ -31,6 +31,7 @@ const createTaskTable = (startRow ,tasks, moneyRate) => { let totalMax = 0; tasks.forEach((t,i) => { + if (!t.isChecked) return; totalMin += t.minimumMinutes / 60; totalMax += t.maximumMinutes / 60; const { maximumMinutes , minimumMinutes, taskName } = t; @@ -52,6 +53,7 @@ const createTaskTable = (startRow ,tasks, moneyRate) => { // prink subtasks if (t.tasks) { t.tasks.forEach((subTask,j) => { + if (!subTask.isChecked) return; const subTaskCells = []; const { maximumMinutes , minimumMinutes, taskName } = subTask; subTaskCells.push(formatCell(createCell(`${i+1}.${j+1}. ${taskName}`), subtaskNameOptions));