From 541fd7610fc292dcf2df3e7fb156e8dbbddfd663 Mon Sep 17 00:00:00 2001
From: Jorrit Schaap <schaap@astron.nl>
Date: Tue, 16 Aug 2016 10:12:01 +0000
Subject: [PATCH] Task #9607: draw gantt project task rows in same order as
 grid, add row in case of overlapping tasks

---
 .../app/controllers/ganttprojectcontroller.js | 134 ++++++++----------
 .../static/app/controllers/gridcontroller.js  |   2 +-
 2 files changed, 61 insertions(+), 75 deletions(-)

diff --git a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/app/controllers/ganttprojectcontroller.js b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/app/controllers/ganttprojectcontroller.js
index 526e3c87849..f124ea381a9 100644
--- a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/app/controllers/ganttprojectcontroller.js
+++ b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/app/controllers/ganttprojectcontroller.js
@@ -113,24 +113,18 @@ ganttProjectControllerMod.controller('GanttProjectController', ['$scope', 'dataS
         var projectsDict = $scope.dataService.momProjectsDict;
         var numProjecs = $scope.dataService.momProjects.length;
 
-        var taskDict = $scope.dataService.filteredTaskDict;
-        var tasks = $scope.dataService.filteredTasks;
-        var numTasks = tasks.length;
-
-        var tasktypesDict = $scope.dataService.tasktypesDict;
-        var tasktypes = $scope.dataService.tasktypes;
-        var numTasktypes = tasktypes.length;
-
-        if(numProjecs == 0 || numTasktypes == 0){
+        if(numProjecs == 0) {
             $scope.ganttData = [];
             return;
         }
 
-        var editableTaskStatusIds = $scope.dataService.editableTaskStatusIds;
+        var taskDict = $scope.dataService.filteredTaskDict;
+        var tasks = $scope.dataService.filteredTasks;
+        var numTasks = tasks.length;
 
-        var ganntRowsDict = {};
+        var ganntRows = [];
 
-        if(numProjecs > 0 && numTasks > 0 && numTasktypes > 0) {
+        if(numProjecs > 0 && numTasks > 0) {
             $scope.options.fromDate = $scope.dataService.viewTimeSpan.from;
             $scope.options.toDate = $scope.dataService.viewTimeSpan.to;
             var fullTimespanInMinutes = ($scope.options.toDate - $scope.options.fromDate) / (60 * 1000);
@@ -154,82 +148,74 @@ ganttProjectControllerMod.controller('GanttProjectController', ['$scope', 'dataS
             //only enable dependencies (arrows between tasks) in detailed view
             $scope.options.dependencies = (fullTimespanInMinutes <= 3*60);
 
-            for(var i = 0; i < numTasks; i++) {
-                var task = tasks[i];
-
-                var projectRowId = 'project_' + task.project_mom_id;
-                var ganntProjectRow = ganntRowsDict[projectRowId];
+            var editableTaskStatusIds = $scope.dataService.editableTaskStatusIds;
 
-                if(!ganntProjectRow) {
-                    var project = projectsDict[task.project_mom_id];
+            var ganntRowsDict = {};
 
-                    if(project) {
-                        ganntProjectRow = {
-                            id: projectRowId,
-                            name: project.name,
-                            project: project,
-                            tasks: []
-                        };
+            for(var i = 0; i < numTasks; i++) {
+                var task = tasks[i];
+                var project = projectsDict[task.project_mom_id];
 
-                        ganntRowsDict[projectRowId] = ganntProjectRow;
-                    }
+                if(!project) {
+                    continue;
                 }
 
-                if(ganntProjectRow) {
-                    var typeRowId = 'project_' + task.project_mom_id + '_type_' + task.type_id;
-                    var ganntTypeRow = ganntRowsDict[typeRowId];
+                var projectTypeRowsId = 'project_' + task.project_mom_id + '_type_' + task.type_id;
+                var ganntProjectTypeRows = ganntRowsDict[projectTypeRowsId];
 
-                    if(!ganntTypeRow) {
-                        var tasktype = tasktypesDict[task.type_id].name;
-
-                        if(tasktype) {
-                            ganntTypeRow = {
-                                id: typeRowId,
-                                parent: projectRowId,
-                                name: tasktype,
-                                project: project,
-                                tasks: []
-                            };
-
-                            ganntRowsDict[typeRowId] = ganntTypeRow;
-                        }
-                    }
+                if(!ganntProjectTypeRows) {
+                    ganntProjectTypeRows = [];
+                    ganntRowsDict[projectTypeRowsId] = ganntProjectTypeRows;
+                }
 
-                    if(ganntTypeRow) {
-                        var rowTask = {
-                            id: task.id.toString(),
-                            name: task.name,
-                            from: task.starttime,
-                            to: task.endtime,
-                            raTask: task,
-                            color: self.taskStatusColors[task.status],
-                            classes: 'task-status-' + task.status,
-                            movable: $.inArray(task.status_id, editableTaskStatusIds) > -1
-                        };
-
-                        if(dataService.isTaskIdSelected(task.id)) {
-                            rowTask.classes += ' task-selected-task';
-                        }
+                var availableRow = ganntProjectTypeRows.find(function(row) {
+                    var overlappingTasks = row.tasks.filter(function(t) {
+                        return (t.from >= task.starttime && t.from <= task.endtime) ||
+                               (t.to >= task.starttime && t.to <= task.endtime) ||
+                               (t.from <= task.starttime && t.to >= task.endtime);
+                    });
+                    return overlappingTasks.length == 0;
+                });
+
+                if(!availableRow)
+                {
+                    availableRow = {
+                        id: projectTypeRowsId + '_' + (ganntProjectTypeRows.length+1),
+                        name: project.name + ' ' + task.type,
+                        project: project,
+                        tasks: []
+                    };
+
+                    ganntProjectTypeRows.push(availableRow);
+                    ganntRows.push(availableRow);
+                }
 
-                        if($scope.options.dependencies && task.predecessor_ids && task.predecessor_ids.length > 0) {
-                            rowTask['dependencies'] = [];
-                            for(var predId of task.predecessor_ids) {
-                                 rowTask['dependencies'].push({'from': predId});
-                            }
-                        }
+                var rowTask = {
+                    id: task.id.toString(),
+                    name: task.name,
+                    from: task.starttime,
+                    to: task.endtime,
+                    raTask: task,
+                    color: self.taskStatusColors[task.status],
+                    classes: 'task-status-' + task.status,
+                    movable: $.inArray(task.status_id, editableTaskStatusIds) > -1
+                };
+
+                if(dataService.isTaskIdSelected(task.id)) {
+                    rowTask.classes += ' task-selected-task';
+                }
 
-                        ganntTypeRow.tasks.push(rowTask);
+                if($scope.options.dependencies && task.predecessor_ids && task.predecessor_ids.length > 0) {
+                    rowTask['dependencies'] = [];
+                    for(var predId of task.predecessor_ids) {
+                            rowTask['dependencies'].push({'from': predId});
                     }
                 }
+
+                availableRow.tasks.push(rowTask);
             }
         }
 
-        var ganntRows = [];
-
-        for (var rowId in ganntRowsDict)
-            ganntRows.push(ganntRowsDict[rowId]);
-
-        ganntRows.sort(function(a, b) { return ((a.name < b.name) ? -1 : ((a.name > b.name) ? 1 : 0)); });
         $scope.ganttData = ganntRows;
     };
 
diff --git a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/app/controllers/gridcontroller.js b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/app/controllers/gridcontroller.js
index 97d6da7fd8c..ecd9a4d7585 100644
--- a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/app/controllers/gridcontroller.js
+++ b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/app/controllers/gridcontroller.js
@@ -145,7 +145,7 @@ $scope.columns = [
                 $scope.$evalAsync(function() {
                     var taskDict = $scope.dataService.taskDict;
                     $scope.dataService.filteredTasks = [];
-                    var rows = $scope.gridApi.grid.rows;
+                    var rows = $scope.gridApi.core.getVisibleRows(grid);
                     var numRows = rows.length;
                     for(var i = 0; i < numRows; i++) {
                         var row = rows[i];
-- 
GitLab