angular-gantt
Version:
Gantt chart component for AngularJS
213 lines (182 loc) • 8.34 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.table', ['gantt', 'gantt.table.templates']).directive('ganttTable', ['ganttUtils', '$compile', '$document', function(utils, $compile, $document) {
// Provides the row sort functionality to any Gantt row
// Uses the sortableState to share the current row
return {
restrict: 'E',
require: '^gantt',
scope: {
enabled: '=?',
columns: '=?',
headers: '=?',
classes: '=?',
contents: '=?',
headerContents: '=?',
formatters: '=?',
headerFormatter: '=?'
},
link: function(scope, element, attrs, ganttCtrl) {
var api = ganttCtrl.gantt.api;
// Load options from global options attribute.
if (scope.options && typeof(scope.options.sortable) === 'object') {
for (var option in scope.options.sortable) {
scope[option] = scope.options[option];
}
}
if (scope.enabled === undefined) {
scope.enabled = true;
}
if (scope.columns === undefined) {
scope.columns = ['model.name'];
}
if (scope.headers === undefined) {
scope.headers = {'model.name': 'Name'};
}
if (scope.contents === undefined) {
scope.contents = {};
}
if (scope.headerContents === undefined) {
scope.headerContents = {};
}
if (scope.classes === undefined) {
scope.classes = {};
}
if (scope.formatters === undefined) {
scope.formatters = {};
}
api.directives.on.new(scope, function(directiveName, sideContentScope, sideContentElement) {
if (directiveName === 'ganttSideContent') {
var tableScope = sideContentScope.$new();
tableScope.pluginScope = scope;
var ifElement = $document[0].createElement('div');
angular.element(ifElement).attr('data-ng-if', 'pluginScope.enabled');
angular.element(ifElement).addClass('side-element');
var tableElement = $document[0].createElement('gantt-side-content-table');
angular.element(ifElement).append(tableElement);
sideContentElement.append($compile(ifElement)(tableScope));
}
});
}
};
}]);
}());
(function(){
'use strict';
angular.module('gantt.table').directive('ganttSideContentTable', ['GanttDirectiveBuilder', 'ganttLayout', function(Builder, layout) {
var builder = new Builder('ganttSideContentTable', 'plugins/table/sideContentTable.tmpl.html');
builder.controller = function($scope) {
var hScrollBarHeight = layout.getScrollBarHeight();
$scope.getMaxHeightCss = function() {
var css = {};
if ($scope.maxHeight) {
var bodyScrollBarHeight = $scope.gantt.scroll.isHScrollbarVisible() ? hScrollBarHeight : 0;
css['max-height'] = $scope.maxHeight - bodyScrollBarHeight - $scope.gantt.header.getHeight() + 'px';
}
return css;
};
};
return builder.build();
}]);
}());
(function() {
'use strict';
angular.module('gantt.table').controller('TableColumnController', ['$scope', function($scope) {
$scope.getHeader = function() {
var header = $scope.pluginScope.headers[$scope.column];
if (header !== undefined) {
return header;
}
if ($scope.pluginScope.headerFormatter !== undefined) {
header = $scope.pluginScope.headerFormatter($scope.column);
}
if (header !== undefined) {
return header;
}
return header;
};
$scope.getHeaderContent = function() {
var headerContent = $scope.pluginScope.headerContents[$scope.column];
if (headerContent === undefined) {
return '{{getHeader()}}';
}
return headerContent;
};
$scope.getClass = function() {
return $scope.pluginScope.classes[$scope.column];
};
}]);
}());
(function() {
'use strict';
angular.module('gantt.table').controller('TableColumnRowController', ['$scope', function($scope) {
$scope.getValue = function() {
var value = $scope.$eval($scope.column, $scope.row);
var formatter = $scope.pluginScope.formatters[$scope.column];
if (formatter !== undefined) {
value = formatter(value, $scope.column, $scope.row);
}
return value;
};
$scope.getRowContent = function() {
var content;
if ($scope.row.model.columnContents) {
content = $scope.row.model.columnContents[$scope.column];
}
if (content === undefined && $scope.column === 'model.name') {
content = $scope.row.model.content;
}
if (content === undefined) {
content = $scope.pluginScope.contents[$scope.column];
}
if (content === undefined && $scope.column === 'model.name') {
content = $scope.row.rowsManager.gantt.options.value('rowContent');
}
if (content === undefined && $scope.pluginScope.content !== undefined) {
content = $scope.pluginScope.content;
}
if (content === undefined) {
return '{{getValue()}}';
}
return content;
};
}]);
}());
angular.module('gantt.table.templates', []).run(['$templateCache', function($templateCache) {
$templateCache.put('plugins/table/sideContentTable.tmpl.html',
'<div class="gantt-side-content-table">\n' +
'\n' +
' <div class="gantt-table-column {{getClass()}}" ng-repeat="column in pluginScope.columns" ng-controller="TableColumnController">\n' +
'\n' +
' <div class="gantt-table-header" ng-style="{height: ganttHeaderHeight + \'px\'}">\n' +
' <div ng-show="ganttHeaderHeight" class="gantt-row-label-header gantt-row-label gantt-table-row gantt-table-header-row">\n' +
' <span class="gantt-label-text" gantt-bind-compile-html="getHeaderContent()"/>\n' +
' </div>\n' +
' </div>\n' +
'\n' +
' <div class="gantt-table-content" ng-style="getMaxHeightCss()">\n' +
' <div gantt-vertical-scroll-receiver>\n' +
' <div class="gantt-table-row" ng-repeat="row in gantt.rowsManager.visibleRows track by row.model.id" ng-controller="TableColumnRowController">\n' +
' <div gantt-row-label class="gantt-row-label gantt-row-height" ng-class="row.model.classes" ng-style="{\'height\': row.model.height}">\n' +
' <div class="gantt-valign-container">\n' +
' <div class="gantt-valign-content">\n' +
' <span class="gantt-label-text" gantt-bind-compile-html="getRowContent()"></span>\n' +
' </div>\n' +
' </div>\n' +
' </div>\n' +
' </div>\n' +
' </div>\n' +
' </div>\n' +
'\n' +
' </div>\n' +
'</div>\n' +
'');
}]);
//# sourceMappingURL=angular-gantt-table-plugin.js.map