angular-gantt
Version:
Gantt chart component for AngularJS
107 lines (93 loc) • 4.54 kB
JavaScript
/*
Project: angular-gantt v1.2.9 - Gantt chart component for AngularJS
Authors: Marco Schweighauser, Rémi Alvergnat
License: MIT
Homepage: https://www.angular-gantt.com
Github: https://github.com/angular-gantt/angular-gantt.git
*/
(function(){
'use strict';
angular.module('gantt.overlap', ['gantt', 'gantt.overlap.templates']).directive('ganttOverlap', ['moment',function(moment) {
return {
restrict: 'E',
require: '^gantt',
scope: {
enabled: '=?'
// Add other option attributes for this plugin
},
link: function(scope, element, attrs, ganttCtrl) {
var api = ganttCtrl.gantt.api;
if (scope.enabled === undefined) {
scope.enabled = true;
}
if (scope.enabled){
api.tasks.on.change(scope, function (task) {
// on every task change check for overlaps
scope.handleOverlaps(task);
});
}
var overlapsTasks = {};
scope.handleOverlaps = function (changedTask) {
// Get all the tasks in the row.
var allTasks = changedTask.row.tasks;
var newOverlapsTasks = {};
var removedOverlapsTasks = {};
angular.forEach(allTasks, function(task) {
removedOverlapsTasks[task.model.id] = task;
});
// set overlaps flag to each task that overlaps other task.
angular.forEach(allTasks,function(currentTask){
var currentStart,currentEnd;
if (currentTask.model.from.isBefore(currentTask.model.to)){
currentStart = currentTask.model.from;
currentEnd = currentTask.model.to;
} else {
currentStart = currentTask.model.to;
currentEnd = currentTask.model.from;
}
var currentRange = moment().range(currentStart, currentEnd);
angular.forEach(allTasks,function(task){
if (currentTask.model.id !== task.model.id){
var start,end;
if (task.model.from.isBefore(task.model.to)){
start = task.model.from;
end = task.model.to;
} else {
start = task.model.to;
end = task.model.from;
}
var range = moment().range(start, end);
if (range.overlaps(currentRange)){
if (!overlapsTasks.hasOwnProperty(task.model.id)) {
newOverlapsTasks[task.model.id] = task;
}
delete removedOverlapsTasks[task.model.id];
if (!overlapsTasks.hasOwnProperty(currentTask.model.id)) {
newOverlapsTasks[currentTask.model.id] = currentTask;
}
delete removedOverlapsTasks[currentTask.model.id];
}
}
});
});
angular.forEach(removedOverlapsTasks, function(task) {
if (task.$element){
task.$element.removeClass('gantt-task-overlaps');
}
delete overlapsTasks[task.model.id];
});
angular.forEach(newOverlapsTasks, function(task) {
if (task.$element){
task.$element.addClass('gantt-task-overlaps');
}
overlapsTasks[task.model.id] = task;
});
overlapsTasks = newOverlapsTasks;
};
}
};
}]);
}());
angular.module('gantt.overlap.templates', []).run(['$templateCache', function($templateCache) {
}]);
//# sourceMappingURL=angular-gantt-overlap-plugin.js.map