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:
knsv
2015-10-24 12:44:47 +02:00
parent 1cd1423780
commit eecd56d6e0
8 changed files with 273 additions and 105 deletions

View File

@@ -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){