mirror of
https://github.com/mermaid-js/mermaid.git
synced 2025-09-18 06:49:47 +02:00
Fixed weekend between dates; Manual endtimes; Additional testing
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -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')
|
||||
|
||||
})
|
||||
})
|
||||
|
Reference in New Issue
Block a user