angular-gantt
Version:
Gantt chart component for AngularJS
137 lines (119 loc) • 6.13 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.bounds', ['gantt', 'gantt.bounds.templates']).directive('ganttBounds', ['moment', '$compile', '$document', function(moment, $compile, $document) {
return {
restrict: 'E',
require: '^gantt',
scope: {
enabled: '=?'
},
link: function(scope, element, attrs, ganttCtrl) {
var api = ganttCtrl.gantt.api;
// Load options from global options attribute.
if (scope.options && typeof(scope.options.bounds) === 'object') {
for (var option in scope.options.bounds) {
scope[option] = scope.options[option];
}
}
if (scope.enabled === undefined) {
scope.enabled = true;
}
api.directives.on.new(scope, function(directiveName, taskScope, taskElement) {
if (directiveName === 'ganttTask') {
var boundsScope = taskScope.$new();
boundsScope.pluginScope = scope;
var ifElement = $document[0].createElement('div');
angular.element(ifElement).attr('data-ng-if', 'task.model.est && task.model.lct && pluginScope.enabled');
var boundsElement = $document[0].createElement('gantt-task-bounds');
if (attrs.templateUrl !== undefined) {
angular.element(boundsElement).attr('data-template-url', attrs.templateUrl);
}
if (attrs.template !== undefined) {
angular.element(boundsElement).attr('data-template', attrs.template);
}
angular.element(ifElement).append(boundsElement);
taskElement.append($compile(ifElement)(boundsScope));
}
});
api.tasks.on.clean(scope, function(model) {
if (model.est !== undefined && !moment.isMoment(model.est)) {
model.est = moment(model.est); //Earliest Start Time
}
if (model.lct !== undefined && !moment.isMoment(model.lct)) {
model.lct = moment(model.lct); //Latest Completion Time
}
});
}
};
}]);
}());
(function(){
'use strict';
angular.module('gantt.bounds').directive('ganttTaskBounds', ['$templateCache', 'moment', function($templateCache, moment) {
// Displays a box representing the earliest allowable start time and latest completion time for a job
return {
restrict: 'E',
templateUrl: function(tElement, tAttrs) {
var templateUrl;
if (tAttrs.templateUrl === undefined) {
templateUrl = 'plugins/bounds/taskBounds.tmpl.html';
} else {
templateUrl = tAttrs.templateUrl;
}
if (tAttrs.template) {
$templateCache.put(templateUrl, tAttrs.template);
}
return templateUrl;
},
replace: true,
scope: true,
controller: ['$scope', '$element', function($scope, $element) {
$element.toggleClass('ng-hide', true);
$scope.simplifyMoment = function(d) {
return moment.isMoment(d) ? d.unix() : d;
};
$scope.$watchGroup(['simplifyMoment(task.model.est)', 'simplifyMoment(task.model.lct)', 'task.left', 'task.width'], function() {
var left = $scope.task.rowsManager.gantt.getPositionByDate($scope.task.model.est);
var right = $scope.task.rowsManager.gantt.getPositionByDate($scope.task.model.lct);
$element.css('left', left - $scope.task.left + 'px');
$element.css('width', right - left + 'px');
$element.toggleClass('gantt-task-bounds-in', false);
$element.toggleClass('gantt-task-bounds-out', false);
if ($scope.task.model.est === undefined || $scope.task.model.lct === undefined) {
$element.toggleClass('gantt-task-bounds-in', true);
} else if ($scope.task.model.est > $scope.task.model.from) {
$element.toggleClass('gantt-task-bounds-out', true);
}
else if ($scope.task.model.lct < $scope.task.model.to) {
$element.toggleClass('gantt-task-bounds-out', true);
} else {
$element.toggleClass('gantt-task-bounds-in', true);
}
});
$scope.task.$element.bind('mouseenter', function() {
$element.toggleClass('ng-hide', false);
});
$scope.task.$element.bind('mouseleave', function() {
$element.toggleClass('ng-hide', true);
});
$scope.task.rowsManager.gantt.api.directives.raise.new('ganttBounds', $scope, $element);
$scope.$on('$destroy', function() {
$scope.task.rowsManager.gantt.api.directives.raise.destroy('ganttBounds', $scope, $element);
});
}]
};
}]);
}());
angular.module('gantt.bounds.templates', []).run(['$templateCache', function($templateCache) {
$templateCache.put('plugins/bounds/taskBounds.tmpl.html',
'<div ng-cloak class="gantt-task-bounds" ng-style="getCss()" ng-class="getClass()"></div>\n' +
'');
}]);
//# sourceMappingURL=angular-gantt-bounds-plugin.js.map