diff --git a/src/diagrams/gantt/ganttDb.js b/src/diagrams/gantt/ganttDb.js index ed4364c4c..fe2492589 100644 --- a/src/diagrams/gantt/ganttDb.js +++ b/src/diagrams/gantt/ganttDb.js @@ -33,7 +33,7 @@ export const setDateFormat = function (txt) { } export const setExcludes = function (txt) { - excludes = txt.split(' ') + excludes = txt.toLowerCase().split(/[\s,]+/) } export const setTitle = function (txt) { @@ -67,18 +67,27 @@ const isInvalidDate = function (date, dateFormat, excludes) { if (date.isoWeekday() >= 6 && excludes.indexOf('weekends') >= 0) { return true } + if (excludes.indexOf(date.format('dddd').toLowerCase()) >= 0) { + return true + } return excludes.indexOf(date.format(dateFormat.trim())) >= 0 } -const getNextValidDate = function (date, dateFormat, excludes) { - let mDate = moment(date, dateFormat, true) - while (isInvalidDate(mDate, dateFormat, excludes)) { - mDate = mDate.add(1, 'd') +const fixTaskDates = function (task, dateFormat, excludes) { + if (excludes.length && ! task.manualEndTime) { + let startTime = moment(task.startTime).add(1, 'd') + let endTime = moment(task.endTime) + while (startTime.date() <= endTime.date()) { + if (isInvalidDate(startTime, dateFormat, excludes)) { + endTime.add(1, 'd') + } + startTime.add(1, 'd') + } + task.endTime = endTime.toDate() } - return mDate.toDate() } -const getStartDate = function (prevTime, dateFormat, excludes, str) { +const getStartDate = function (prevTime, dateFormat, str) { str = str.trim() // Test for after @@ -99,17 +108,17 @@ const getStartDate = function (prevTime, dateFormat, excludes, str) { // Check for actual date set let mDate = moment(str, dateFormat.trim(), true) if (mDate.isValid()) { - return getNextValidDate(mDate, dateFormat, excludes) + return mDate.toDate() } else { logger.debug('Invalid date:' + str) logger.debug('With date format:' + dateFormat.trim()) } // Default date - now - return getNextValidDate(new Date(), dateFormat, excludes) + return new Date() } -const getEndDate = function (prevTime, dateFormat, excludes, str) { +const getEndDate = function (prevTime, dateFormat, str) { str = str.trim() // Check for actual date @@ -143,7 +152,7 @@ const getEndDate = function (prevTime, dateFormat, excludes, str) { } } // Default date - now - return getNextValidDate(d, dateFormat, excludes) + return d.toDate() } let taskCnt = 0 @@ -202,25 +211,32 @@ const compileData = function (prevTask, dataStr) { data[i] = data[i].trim() } + let endTimeData = '' switch (data.length) { case 1: task.id = parseId() task.startTime = prevTask.endTime - task.endTime = getEndDate(task.startTime, dateFormat, excludes, data[0]) + endTimeData = data[0] break case 2: task.id = parseId() - task.startTime = getStartDate(undefined, dateFormat, excludes, data[0]) - task.endTime = getEndDate(task.startTime, dateFormat, excludes, data[1]) + task.startTime = getStartDate(undefined, dateFormat, data[0]) + endTimeData = data[1] break case 3: task.id = parseId(data[0]) - task.startTime = getStartDate(undefined, dateFormat, excludes, data[1]) - task.endTime = getEndDate(task.startTime, dateFormat, excludes, data[2]) + task.startTime = getStartDate(undefined, dateFormat, data[1]) + endTimeData = data[2] break default: } + if (endTimeData) { + task.endTime = getEndDate(task.startTime, dateFormat, endTimeData) + task.manualEndTime = endTimeData == moment(task.endTime).format(dateFormat.trim()) + fixTaskDates(task, dateFormat, excludes) + } + return task } @@ -291,6 +307,7 @@ export const addTask = function (descr, data) { section: currentSection, type: currentSection, processed: false, + manualEndTime: false, raw: { data: data }, task: descr } @@ -343,7 +360,7 @@ const compileTasks = function () { task.startTime = prevTask.endTime break case 'getStartDate': - startTime = getStartDate(undefined, dateFormat, excludes, rawTasks[pos].raw.startTime.startData) + startTime = getStartDate(undefined, dateFormat, rawTasks[pos].raw.startTime.startData) if (startTime) { rawTasks[pos].startTime = startTime } @@ -351,9 +368,11 @@ const compileTasks = function () { } if (rawTasks[pos].startTime) { - rawTasks[pos].endTime = getEndDate(rawTasks[pos].startTime, dateFormat, excludes, rawTasks[pos].raw.endTime.data) + rawTasks[pos].endTime = getEndDate(rawTasks[pos].startTime, dateFormat, rawTasks[pos].raw.endTime.data) if (rawTasks[pos].endTime) { rawTasks[pos].processed = true + rawTasks[pos].manualEndTime = rawTasks[pos].raw.endTime.data == moment(rawTasks[pos].endTime).format(dateFormat.trim()); + fixTaskDates(rawTasks[pos], dateFormat, excludes); } } diff --git a/src/diagrams/gantt/ganttDb.spec.js b/src/diagrams/gantt/ganttDb.spec.js index aef2cd92e..9b5e0d0e6 100644 --- a/src/diagrams/gantt/ganttDb.spec.js +++ b/src/diagrams/gantt/ganttDb.spec.js @@ -174,16 +174,40 @@ describe('when using the ganttDb', function () { }) it('should ignore weekends', function () { ganttDb.setDateFormat('YYYY-MM-DD') - ganttDb.setExcludes('weekends 2019-02-06') + ganttDb.setExcludes('weekends 2019-02-06,friday') ganttDb.addSection('testa1') ganttDb.addTask('test1', 'id1,2019-02-01,1d') - ganttDb.addTask('test2', 'id2,after id1,3d') + ganttDb.addTask('test2', 'id2,after id1,2d') + ganttDb.addTask('test3', 'id3,after id2,7d') + ganttDb.addTask('test4', 'id4,2019-02-01,2019-02-20') // Fixed endTime + ganttDb.addTask('test5', 'id5,after id4,1d') const tasks = ganttDb.getTasks() + expect(tasks[0].startTime).toEqual(moment('2019-02-01', 'YYYY-MM-DD').toDate()) + expect(tasks[0].endTime).toEqual(moment('2019-02-04', 'YYYY-MM-DD').toDate()) + expect(tasks[0].id).toEqual('id1') + expect(tasks[0].task).toEqual('test1') + expect(tasks[1].startTime).toEqual(moment('2019-02-04', 'YYYY-MM-DD').toDate()) expect(tasks[1].endTime).toEqual(moment('2019-02-07', 'YYYY-MM-DD').toDate()) expect(tasks[1].id).toEqual('id2') expect(tasks[1].task).toEqual('test2') + + expect(tasks[2].startTime).toEqual(moment('2019-02-07', 'YYYY-MM-DD').toDate()) + expect(tasks[2].endTime).toEqual(moment('2019-02-20', 'YYYY-MM-DD').toDate()) + expect(tasks[2].id).toEqual('id3') + expect(tasks[2].task).toEqual('test3') + + expect(tasks[3].startTime).toEqual(moment('2019-02-01', 'YYYY-MM-DD').toDate()) + expect(tasks[3].endTime).toEqual(moment('2019-02-20', 'YYYY-MM-DD').toDate()) + expect(tasks[3].id).toEqual('id4') + expect(tasks[3].task).toEqual('test4') + + expect(tasks[4].startTime).toEqual(moment('2019-02-20', 'YYYY-MM-DD').toDate()) + expect(tasks[4].endTime).toEqual(moment('2019-02-21', 'YYYY-MM-DD').toDate()) + expect(tasks[4].id).toEqual('id5') + expect(tasks[4].task).toEqual('test5') + }) })