angular-gantt
Version:
Gantt chart component for AngularJS
115 lines (97 loc) • 4.61 kB
JavaScript
(function() {
'use strict';
angular.module('gantt').directive('ganttResizer', ['$document', '$parse', '$timeout', 'ganttMouseOffset', function($document, $parse, $timeout, mouseOffset) {
return {
restrict: 'A',
require: '^gantt',
scope: {
targetElement: '=ganttResizer',
enabled: '@?ganttResizerEnabled'
},
link: function ($scope, $element, $attrs, ganttCtrl) {
var api = ganttCtrl.gantt.api;
var eventTopic = $attrs.ganttResizerEventTopic;
if ($scope.enabled === undefined) {
$scope.enabled = true;
}
$attrs.$observe('ganttResizerEnabled', function(value) {
$scope.enabled = $parse(value)();
});
$scope.$watch('enabled', function (value) {
if (value === undefined) {
value = true;
}
$element.toggleClass('gantt-resizer-enabled', value);
if (value) {
$element.on('dblclick', dblclick);
$element.on('mousedown', mousedown);
} else {
$element.off('dblclick', dblclick);
$element.off('mousedown', mousedown);
}
});
function dblclick(event) {
event.preventDefault();
setWidth(undefined);
}
function mousedown(event) {
event.preventDefault();
if (eventTopic !== undefined) {
api[eventTopic].raise.resizeBegin(getWidth());
}
$document.on('mousemove', mousemove);
$document.on('mouseup', mouseup);
}
function mousemove(event) {
$scope.$evalAsync(function (){
var offset = mouseOffset.getOffsetForElement($scope.targetElement[0], event);
var maxWidth = ganttCtrl.gantt.getWidth()-ganttCtrl.gantt.scroll.getBordersWidth();
var width = Math.min(Math.max(offset.x, 0), maxWidth);
setWidth(width);
});
}
function mouseup() {
if (eventTopic !== undefined) {
api[eventTopic].raise.resizeEnd(getWidth());
}
$document.unbind('mousemove', mousemove);
$document.unbind('mouseup', mouseup);
}
$scope.$watch(function() {
return getWidth();
}, function(newValue, oldValue) {
if (newValue !== oldValue) {
$scope.targetElement.css('width', newValue + 'px');
// Setting width again is required when min-width of max-width is set on targetElement.
// This avoid going to a smaller or bigger value than targetElement capabilities.
// Call of 'offsetWidth' is slow. Behaviour needs to be improved.
if ($scope.targetElement[0].offsetWidth > 0) {
setWidth($scope.targetElement[0].offsetWidth);
}
}
});
function setWidth(width) {
if (width !== getWidth()) {
ganttCtrl.gantt.options.set($attrs.resizerWidth, width);
if (eventTopic !== undefined) {
api[eventTopic].raise.resize(width);
}
$timeout(function() {
ganttCtrl.gantt.columnsManager.updateColumnsMeta();
});
}
}
function getWidth() {
return ganttCtrl.gantt.options.value($attrs.resizerWidth);
}
if (eventTopic) {
api.registerEvent(eventTopic, 'resize');
api.registerEvent(eventTopic, 'resizeBegin');
api.registerEvent(eventTopic, 'resizeEnd');
api.registerMethod(eventTopic, 'setWidth', setWidth, this);
api.registerMethod(eventTopic, 'getWidth', getWidth, this);
}
}
};
}]);
}());