mirror of
https://github.com/mermaid-js/mermaid.git
synced 2025-11-03 04:14:15 +01:00
Fix for issue #229, poor handling of activities in a gantt diagram where one activities follows a yet undefined activity.
This commit is contained in:
@@ -19,6 +19,8 @@ exports.clear = function(){
|
||||
title = '';
|
||||
taskCnt = 0;
|
||||
lastTask = undefined;
|
||||
lastTaskID = undefined;
|
||||
rawTasks = [];
|
||||
};
|
||||
|
||||
exports.setDateFormat = function(txt){
|
||||
@@ -41,23 +43,24 @@ exports.addSection = function(txt){
|
||||
sections.push(txt);
|
||||
};
|
||||
|
||||
exports.findTaskById = function(id) {
|
||||
var i;
|
||||
for(i=0;i<tasks.length;i++){
|
||||
if(tasks[i].id === id){
|
||||
return tasks[i];
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
exports.getTasks=function(){
|
||||
//compileTasks();
|
||||
var i;
|
||||
for(i=10000;i<tasks.length;i++){
|
||||
tasks[i].startTime = moment(tasks[i].startTime).format(dateFormat);
|
||||
tasks[i].endTime = moment(tasks[i].endTime).format(dateFormat);
|
||||
var allItemsPricessed = compileTasks();
|
||||
var maxDepth = 10;
|
||||
var iterationCount = 0;
|
||||
while(!allItemsPricessed && (iterationCount < maxDepth)){
|
||||
allItemsPricessed = compileTasks();
|
||||
iterationCount++;
|
||||
}
|
||||
|
||||
tasks = rawTasks;
|
||||
|
||||
//var i;
|
||||
//for(i=10000;i<tasks.length;i++){
|
||||
// tasks[i].startTime = moment(tasks[i].startTime).format(dateFormat);
|
||||
// tasks[i].endTime = moment(tasks[i].endTime).format(dateFormat);
|
||||
//}
|
||||
|
||||
return tasks;
|
||||
};
|
||||
|
||||
@@ -75,7 +78,7 @@ var getStartDate = function(prevTime, dateFormat, str){
|
||||
|
||||
if(afterStatement!==null){
|
||||
var task = exports.findTaskById(afterStatement[1]);
|
||||
//console.log('xxx'+JSON.stringify(task));
|
||||
|
||||
if(typeof task === 'undefined'){
|
||||
var dt = new Date();
|
||||
dt.setHours(0,0,0,0);
|
||||
@@ -222,7 +225,7 @@ var compileData = function(prevTask, dataStr){
|
||||
return task;
|
||||
};
|
||||
|
||||
var parseData = function(dataStr){
|
||||
var parseData = function(prevTaskId, dataStr){
|
||||
var ds;
|
||||
|
||||
if(dataStr.substr(0,1) === ':'){
|
||||
@@ -236,8 +239,6 @@ var parseData = function(dataStr){
|
||||
|
||||
|
||||
var task = {};
|
||||
var df = exports.getDateFormat();
|
||||
|
||||
|
||||
// Get tags like active, done cand crit
|
||||
var matchFound = true;
|
||||
@@ -269,7 +270,7 @@ var parseData = function(dataStr){
|
||||
switch(data.length){
|
||||
case 1:
|
||||
task.id = parseId();
|
||||
task.startTime = {type: 'prevTaskEnd'};
|
||||
task.startTime = {type: 'prevTaskEnd', id:prevTaskId};
|
||||
task.endTime = {data: data[0]};
|
||||
break;
|
||||
case 2:
|
||||
@@ -295,15 +296,15 @@ var lastTask;
|
||||
var lastTaskID;
|
||||
var rawTasks = [];
|
||||
var taskDb = {};
|
||||
exports.addTaskNew = function(descr,data){
|
||||
exports.addTask = function(descr,data){
|
||||
var rawTask = {
|
||||
section:currentSection,
|
||||
type:currentSection,
|
||||
description:descr,
|
||||
processed:false,
|
||||
raw:{data:data}
|
||||
raw:{data:data},
|
||||
task:descr
|
||||
};
|
||||
var taskInfo = parseData(data);
|
||||
var taskInfo = parseData(lastTaskID, data);
|
||||
rawTask.raw.startTime = taskInfo.startTime;
|
||||
rawTask.raw.endTime = taskInfo.endTime;
|
||||
rawTask.id = taskInfo.id;
|
||||
@@ -311,15 +312,29 @@ exports.addTaskNew = function(descr,data){
|
||||
rawTask.active = taskInfo.active;
|
||||
rawTask.done = taskInfo.done;
|
||||
rawTask.crit = taskInfo.crit;
|
||||
|
||||
var pos = rawTasks.push(rawTask);
|
||||
|
||||
lastTaskID = rawTask.id;
|
||||
// Store cross ref
|
||||
taskDb[rawTask.id]= pos;
|
||||
taskDb[rawTask.id]= pos-1;
|
||||
|
||||
};
|
||||
|
||||
exports.addTask = function(descr,data){
|
||||
|
||||
exports.findTaskById = function(id) {
|
||||
//var i;
|
||||
//for(i=0;i<tasks.length;i++){
|
||||
// if(tasks[i].id === id){
|
||||
// return tasks[i];
|
||||
// }
|
||||
//}
|
||||
|
||||
var pos = taskDb[id];
|
||||
return rawTasks[pos];
|
||||
};
|
||||
|
||||
exports.addTaskOrg = function(descr,data){
|
||||
|
||||
var newTask = {
|
||||
section:currentSection,
|
||||
@@ -339,8 +354,6 @@ exports.addTask = function(descr,data){
|
||||
};
|
||||
|
||||
var compileTasks=function(){
|
||||
console.log('Compiling tasks'+rawTasks.length);
|
||||
|
||||
var df = exports.getDateFormat();
|
||||
|
||||
var compileTask = function(pos){
|
||||
@@ -348,10 +361,11 @@ var compileTasks=function(){
|
||||
var startTime = '';
|
||||
switch(rawTasks[pos].raw.startTime.type){
|
||||
case 'prevTaskEnd':
|
||||
rawTasks[pos].startTime = rawTasks[taskDb[pos].prevTaskId].endTime;
|
||||
var prevTask = exports.findTaskById(task.prevTaskId);
|
||||
task.startTime = prevTask.endTime;
|
||||
break;
|
||||
case 'getStartDate':
|
||||
var startTime = getStartDate(undefined, df, rawTasks[pos].raw.startTime.startData);
|
||||
startTime = getStartDate(undefined, df, rawTasks[pos].raw.startTime.startData);
|
||||
if(startTime){
|
||||
rawTasks[pos].startTime = startTime;
|
||||
}
|
||||
@@ -360,17 +374,23 @@ var compileTasks=function(){
|
||||
|
||||
if(rawTasks[pos].startTime){
|
||||
rawTasks[pos].endTime = getEndDate(rawTasks[pos].startTime, df, rawTasks[pos].raw.endTime.data);
|
||||
if(rawTasks[pos].endTime){
|
||||
rawTasks[pos].processed = true;
|
||||
}
|
||||
}
|
||||
|
||||
return rawTasks[pos].processed;
|
||||
|
||||
};
|
||||
|
||||
var i;
|
||||
var allProcessed = true;
|
||||
for(i=0;i<rawTasks.length;i++){
|
||||
console.log('Pre ompiling: '+JSON.stringify(rawTasks[i]));
|
||||
compileTask(i);
|
||||
//console.log('Compiling: '+rawTasks[taskDb[i]].id);
|
||||
console.log('Compiling: '+JSON.stringify(rawTasks[i],null,2));
|
||||
|
||||
allProcessed = allProcessed && rawTasks[i].processed;
|
||||
}
|
||||
return allProcessed;
|
||||
};
|
||||
|
||||
exports.parseError = function(err,hash){
|
||||
|
||||
@@ -21,7 +21,7 @@ describe('when using the ganttDb',function() {
|
||||
expect(tasks[0].startTime).toEqual(moment('2013-01-01', 'YYYY-MM-DD').toDate());
|
||||
expect(tasks[0].endTime ).toEqual(moment('2013-01-12', 'YYYY-MM-DD').toDate());
|
||||
expect(tasks[0].id ).toEqual('id1');
|
||||
expect(tasks[0].description).toEqual('test1');
|
||||
expect(tasks[0].task).toEqual('test1');
|
||||
});
|
||||
it('should handle duration (days) instead of fixed date to determine end date', function () {
|
||||
gDb.setDateFormat('YYYY-MM-DD');
|
||||
@@ -31,7 +31,7 @@ describe('when using the ganttDb',function() {
|
||||
expect(tasks[0].startTime).toEqual(moment('2013-01-01', 'YYYY-MM-DD').toDate());
|
||||
expect(tasks[0].endTime ).toEqual(moment('2013-01-03', 'YYYY-MM-DD').toDate());
|
||||
expect(tasks[0].id ).toEqual('id1');
|
||||
expect(tasks[0].description).toEqual('test1');
|
||||
expect(tasks[0].task).toEqual('test1');
|
||||
});
|
||||
it('should handle duration (hours) instead of fixed date to determine end date', function () {
|
||||
gDb.setDateFormat('YYYY-MM-DD');
|
||||
@@ -41,7 +41,7 @@ describe('when using the ganttDb',function() {
|
||||
expect(tasks[0].startTime).toEqual(moment('2013-01-01', 'YYYY-MM-DD').toDate());
|
||||
expect(tasks[0].endTime ).toEqual(moment('2013-01-01 2:00', 'YYYY-MM-DD hh:mm').toDate());
|
||||
expect(tasks[0].id ).toEqual('id1');
|
||||
expect(tasks[0].description).toEqual('test1');
|
||||
expect(tasks[0].task).toEqual('test1');
|
||||
});
|
||||
it('should handle duration (minutes) instead of fixed date to determine end date', function () {
|
||||
gDb.setDateFormat('YYYY-MM-DD');
|
||||
@@ -51,7 +51,7 @@ describe('when using the ganttDb',function() {
|
||||
expect(tasks[0].startTime).toEqual(moment('2013-01-01', 'YYYY-MM-DD').toDate());
|
||||
expect(tasks[0].endTime ).toEqual(moment('2013-01-01 00:02', 'YYYY-MM-DD hh:mm').toDate());
|
||||
expect(tasks[0].id ).toEqual('id1');
|
||||
expect(tasks[0].description).toEqual('test1');
|
||||
expect(tasks[0].task).toEqual('test1');
|
||||
});
|
||||
it('should handle duration (seconds) instead of fixed date to determine end date', function () {
|
||||
gDb.setDateFormat('YYYY-MM-DD');
|
||||
@@ -61,7 +61,7 @@ describe('when using the ganttDb',function() {
|
||||
expect(tasks[0].startTime).toEqual(moment('2013-01-01', 'YYYY-MM-DD').toDate());
|
||||
expect(tasks[0].endTime ).toEqual(moment('2013-01-01 00:00:02', 'YYYY-MM-DD hh:mm:ss').toDate());
|
||||
expect(tasks[0].id ).toEqual('id1');
|
||||
expect(tasks[0].description).toEqual('test1');
|
||||
expect(tasks[0].task).toEqual('test1');
|
||||
});
|
||||
it('should handle duration (weeks) instead of fixed date to determine end date', function () {
|
||||
gDb.setDateFormat('YYYY-MM-DD');
|
||||
@@ -71,7 +71,7 @@ describe('when using the ganttDb',function() {
|
||||
expect(tasks[0].startTime).toEqual(moment('2013-01-01', 'YYYY-MM-DD').toDate());
|
||||
expect(tasks[0].endTime ).toEqual(moment('2013-01-15', 'YYYY-MM-DD').toDate());
|
||||
expect(tasks[0].id ).toEqual('id1');
|
||||
expect(tasks[0].description).toEqual('test1');
|
||||
expect(tasks[0].task).toEqual('test1');
|
||||
});
|
||||
|
||||
it('should handle relative start date based on id', function () {
|
||||
@@ -84,7 +84,7 @@ describe('when using the ganttDb',function() {
|
||||
|
||||
expect(tasks[1].startTime ).toEqual(moment('2013-01-15', 'YYYY-MM-DD').toDate());
|
||||
expect(tasks[1].id ).toEqual('id2');
|
||||
expect(tasks[1].description).toEqual('test2');
|
||||
expect(tasks[1].task).toEqual('test2');
|
||||
});
|
||||
|
||||
it('should handle relative start date based on id when id is invalid', function () {
|
||||
@@ -95,7 +95,7 @@ describe('when using the ganttDb',function() {
|
||||
var tasks = gDb.getTasks();
|
||||
expect(tasks[1].startTime).toEqual(new Date((new Date()).setHours(0,0,0,0)));
|
||||
expect(tasks[1].id ).toEqual('id2');
|
||||
expect(tasks[1].description).toEqual('test2');
|
||||
expect(tasks[1].task).toEqual('test2');
|
||||
});
|
||||
|
||||
it('should handle fixed dates without id', function () {
|
||||
@@ -106,7 +106,7 @@ describe('when using the ganttDb',function() {
|
||||
expect(tasks[0].startTime).toEqual(moment('2013-01-01', 'YYYY-MM-DD').toDate());
|
||||
expect(tasks[0].endTime ).toEqual(moment('2013-01-12', 'YYYY-MM-DD').toDate());
|
||||
expect(tasks[0].id ).toEqual('task1');
|
||||
expect(tasks[0].description).toEqual('test1');
|
||||
expect(tasks[0].task).toEqual('test1');
|
||||
});
|
||||
|
||||
it('should handle duration instead of a fixed date to determine end date without id', function () {
|
||||
@@ -117,7 +117,7 @@ describe('when using the ganttDb',function() {
|
||||
expect(tasks[0].startTime).toEqual(moment('2013-01-01', 'YYYY-MM-DD').toDate());
|
||||
expect(tasks[0].endTime ).toEqual(moment('2013-01-05', 'YYYY-MM-DD').toDate());
|
||||
expect(tasks[0].id ).toEqual('task1');
|
||||
expect(tasks[0].description).toEqual('test1');
|
||||
expect(tasks[0].task).toEqual('test1');
|
||||
});
|
||||
|
||||
it('should handle relative start date of a fixed date to determine end date without id', function () {
|
||||
@@ -130,7 +130,7 @@ describe('when using the ganttDb',function() {
|
||||
|
||||
expect(tasks[1].startTime ).toEqual(moment('2013-01-15', 'YYYY-MM-DD').toDate());
|
||||
expect(tasks[1].id ).toEqual('task1');
|
||||
expect(tasks[1].description).toEqual('test2');
|
||||
expect(tasks[1].task).toEqual('test2');
|
||||
});
|
||||
it('should handle a new task with only an end date as definition', function () {
|
||||
gDb.setDateFormat('YYYY-MM-DD');
|
||||
@@ -143,7 +143,7 @@ describe('when using the ganttDb',function() {
|
||||
expect(tasks[1].startTime).toEqual(moment('2013-01-15', 'YYYY-MM-DD').toDate());
|
||||
expect(tasks[1].endTime ).toEqual(moment('2013-01-26', 'YYYY-MM-DD').toDate());
|
||||
expect(tasks[1].id ).toEqual('task1');
|
||||
expect(tasks[1].description).toEqual('test2');
|
||||
expect(tasks[1].task).toEqual('test2');
|
||||
});
|
||||
it('should handle a new task with only an end date as definition', function () {
|
||||
gDb.setDateFormat('YYYY-MM-DD');
|
||||
@@ -156,9 +156,9 @@ describe('when using the ganttDb',function() {
|
||||
expect(tasks[1].startTime).toEqual(moment('2013-01-15', 'YYYY-MM-DD').toDate());
|
||||
expect(tasks[1].endTime ).toEqual(moment('2013-01-17', 'YYYY-MM-DD').toDate());
|
||||
expect(tasks[1].id ).toEqual('task1');
|
||||
expect(tasks[1].description).toEqual('test2');
|
||||
expect(tasks[1].task).toEqual('test2');
|
||||
});
|
||||
xit('should handle relative start date based on id regardless of sections', function () {
|
||||
it('should handle relative start date based on id regardless of sections', function () {
|
||||
gDb.setDateFormat('YYYY-MM-DD');
|
||||
gDb.addSection('testa1');
|
||||
gDb.addTask('test1','id1,2013-01-01,2w');
|
||||
@@ -168,13 +168,15 @@ describe('when using the ganttDb',function() {
|
||||
|
||||
var tasks = gDb.getTasks();
|
||||
|
||||
expect(tasks[1].startTime ).toEqual(moment('2013-01-15', 'YYYY-MM-DD').toDate());
|
||||
expect(tasks[1].startTime ).toEqual(moment('2013-01-17', 'YYYY-MM-DD').toDate());
|
||||
expect(tasks[1].endTime ).toEqual(moment('2013-01-18', 'YYYY-MM-DD').toDate());
|
||||
expect(tasks[1].id ).toEqual('id2');
|
||||
expect(tasks[1].description).toEqual('test2');
|
||||
expect(tasks[1].task).toEqual('test2');
|
||||
|
||||
expect(tasks[2].id ).toEqual('id3');
|
||||
expect(tasks[2].description).toEqual('test3');
|
||||
expect(tasks[2].task).toEqual('test3');
|
||||
expect(tasks[2].startTime ).toEqual(moment('2013-01-15', 'YYYY-MM-DD').toDate());
|
||||
expect(tasks[2].endTime ).toEqual(moment('2013-01-17', 'YYYY-MM-DD').toDate());
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user