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