(function(){ 'use strict'; angular.module('gantt.contextmenu', ['gantt', 'gantt.contextmenu.templates']).directive('ganttContextmenu', ['$compile', '$document', '$window', function($compile, $document, $window) { 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.contextmenu) === 'object') { for (var option in scope.options.contextmenu) { scope[option] = scope.options[option]; } } if (scope.enabled === undefined) { scope.enabled = true; } api.directives.on.new(scope, function(dName, dScope, dElement, dAttrs, dController) { //for each new ganttTask if (dName === 'ganttTask') { dElement.bind('contextmenu', function(event) { //TODO: remove link to dataService in this generic plugin var dataService = dScope.scope.dataService; var cleanupCtrl = dScope.scope.$parent.cleanupCtrl; var docElement = angular.element($document); var task = dScope.task.model.raTask; if(!task) return; dataService.selected_task_id = task.id; //search for already existing contextmenu element while($document.find('#gantt-context-menu').length) { //found, remove it, so we can create a fresh one $document.find('#gantt-context-menu')[0].remove(); //unbind document close event handlers docElement.unbind('click', closeContextMenu); docElement.unbind('contextmenu', closeContextMenu); } //create contextmenu element //with list of menu items, //each with it's own action var contextmenuElement = angular.element('<div id="gantt-context-menu"></div>'); var ulElement = angular.element('<ul class="dropdown-menu" role="menu" style="left:' + event.clientX + 'px; top:' + event.clientY + 'px; z-index: 100000; display:block;"></ul>'); contextmenuElement.append(ulElement); // var liElement = angular.element('<li><a href="#">Copy Task</a></li>'); // ulElement.append(liElement); // liElement.on('click', function() { // closeContextMenu(); // //TODO: remove link to dataService in this generic plugin // dataService.copyTask(dScope.task.model.raTask); // }); if(task.type == 'observation' && dataService.config.inspection_plots_base_url) { var liElement = angular.element('<li><a href="#">Inspection Plots</a></li>'); ulElement.append(liElement); liElement.on('click', function() { closeContextMenu(); var url = dataService.config.inspection_plots_base_url + '/' + task.otdb_id; $window.open(url, '_blank'); }); } var liElement = angular.element('<li><a href="#">Show disk usage</a></li>'); ulElement.append(liElement); liElement.on('click', function() { closeContextMenu(); cleanupCtrl.showTaskDiskUsage(dScope.task.model.raTask); }); var liElement = angular.element('<li><a href="#">Delete data</a></li>'); ulElement.append(liElement); liElement.on('click', function() { closeContextMenu(); cleanupCtrl.deleteTaskDataWithConfirmation(dScope.task.model.raTask); }); var closeContextMenu = function() { contextmenuElement.remove(); //unbind document close event handlers docElement.unbind('click', closeContextMenu); docElement.unbind('contextmenu', closeContextMenu); }; //click anywhere to remove the contextmenu docElement.bind('click', closeContextMenu); docElement.bind('contextmenu', closeContextMenu); //add contextmenu to body var body = $document.find('body'); body.append(contextmenuElement); //prevent bubbling event upwards return false; }); } }); api.directives.on.destroy(scope, function(dName, dScope, dElement, dAttrs, dController) { //for each destroyed ganttTask if (dName === 'ganttTask') { dElement.unbind('contextmenu'); } }); } }; }]); }()); angular.module('gantt.contextmenu.templates', []).run(['$templateCache', function($templateCache) { }]);