/* Copyright 2005-2015 Alfresco Software, Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ 'use strict'; flowableAdminApp.controller('CmmnTaskController', ['$scope', '$rootScope', '$http', '$timeout','$location','$routeParams', '$modal', '$translate', '$q', 'gridConstants', function ($scope, $rootScope, $http, $timeout, $location, $routeParams, $modal, $translate, $q, gridConstants) { $rootScope.navigation = {main: 'cmmn-engine', sub: 'tasks'}; $scope.tabData = { tabs: [ {id: 'subTasks', name: 'TASK.TITLE.SUBTASKS'}, {id: 'variables', name: 'TASK.TITLE.VARIABLES'}, {id: 'identityLinks', name: 'TASK.TITLE.IDENTITY-LINKS'} ], }; $scope.tabData.activeTab = $scope.tabData.tabs[0].id; $scope.returnToList = function() { $location.path("/tasks"); }; $scope.openTask = function(taskId) { if (taskId) { $location.path("/task/" + taskId); } }; $scope.openCaseInstance = function(caseInstanceId) { if (caseInstanceId) { $location.path("/case-instance/" + caseInstanceId); } }; $scope.openCaseDefinition = function(caseDefinitionId) { if (caseDefinitionId) { $location.path("/case-definition/" + caseDefinitionId); } }; $scope.loadTask = function() { $scope.task = undefined; // Load task $http({method: 'GET', url: FlowableAdmin.Config.adminContextRoot + 'rest/admin/cmmn-tasks/' + $routeParams.taskId}). success(function(data, status, headers, config) { $scope.task = data; if(data) { $scope.taskCompleted = data.endTime != undefined; $scope.taskPartOfCase = data.caseInstanceId != undefined; } // Load runtime-task, if available, for accurate delegation-state $scope.loadRuntimeTask(); // Start loading children $scope.loadSubTasks(); $scope.loadVariables(); $scope.loadIdentityLinks(); }). error(function(data, status, headers, config) { if (data && data.message) { // Extract error-message $rootScope.addAlert(data.message, 'error'); } else { // Use default error-message $rootScope.addAlert($translate.instant('ALERT.GENERAL.HTTP-ERROR'), 'error'); } }); }; $scope.loadRuntimeTask = function() { if($scope.task && !$scope.taskCompleted) { // Load runtime task, if available to fetch delegation state $http({method: 'GET', url: FlowableAdmin.Config.adminContextRoot + 'rest/admin/cmmn-tasks/' + $routeParams.taskId, params: {runtime: 'true'}}). success(function(data, status, headers, config) { // Workaround for pre 5.15 installs, historic assignee is not updated when set to null $scope.task.assignee = data.assignee; if(data.delegationState) { $scope.task.delegationState = data.delegationState; } else { // Use empty string to trigger delegate-button to show when delegationState is loaded $scope.task.delegationState = ''; } $scope.task.delegationStateLoaded = true; }); } }; $scope.subTaskSelected = function(task) { if(task && task.getProperty('id')) { $scope.openTask(task.getProperty('id')); } }; // Config for subtasks grid $q.all([$translate('TASKS.HEADER.ID'), $translate('TASKS.HEADER.NAME'), $translate('TASKS.HEADER.ASSIGNEE'), $translate('TASKS.HEADER.OWNER')]) .then(function(headers) { $scope.subTaskGridDefinitions = { data: 'subTasks.data', enableRowReordering: false, enableColumnResize: true, multiSelect: false, keepLastSelected : false, enableSorting: false, rowHeight: 36, afterSelectionChange: $scope.subTaskSelected, columnDefs: [ { field: 'id', displayName: headers[0], width: 50, cellTemplate: gridConstants.defaultTemplate}, { field: 'name', displayName: headers[1], cellTemplate: gridConstants.defaultTemplate}, { field: 'assignee', displayName: headers[2], width: 100, cellTemplate: gridConstants.defaultTemplate}, { field: 'owner', displayName: headers[3], width: 100, cellTemplate: gridConstants.defaultTemplate} ] }; }); $q.all([$translate('VARIABLES.HEADER.NAME'), $translate('VARIABLES.HEADER.TYPE'), $translate('VARIABLES.HEADER.VALUE')]) .then(function(headers) { var variableValueTemplate = '<div><div class="ngCellText">{{row.getProperty("variable.valueUrl") && "(Binary)" || row.getProperty(col.field)}}</div></div>'; var variableTypeTemplate = '<div><div class="ngCellText">{{row.getProperty(col.field) && row.getProperty(col.field) || "null"}}</div></div>'; // Config for variable grid $scope.variableGridDefinitions = { data: 'variables.data', enableRowReordering: false, enableColumnResize: true, multiSelect: false, keepLastSelected : false, enableSorting: false, rowHeight: 36, columnDefs: [ { field: 'variable.name', displayName: headers[0]}, { field: 'variable.type', displayName: headers[1], cellTemplate: variableTypeTemplate}, { field: 'variable.value', displayName: headers[2], cellTemplate: variableValueTemplate} ] }; }); $q.all([$translate('IDENTITY-LINKS.HEADER.TYPE'), $translate('IDENTITY-LINKS.HEADER.GROUP-ID'), $translate('IDENTITY-LINKS.HEADER.USER-ID')]) .then(function(headers) { // Config for variable grid $scope.identityLinkGridDefinitions = { data: 'identityLinks.data', enableRowReordering: false, multiSelect: false, keepLastSelected : false, enableSorting: false, rowHeight: 36, columnDefs: [ { field: 'type', displayName: headers[0]}, { field: 'groupId', displayName: headers[1], cellTemplate: gridConstants.defaultTemplate}, { field: 'userId', displayName: headers[2], cellTemplate: gridConstants.defaultTemplate} ] }; }); $scope.showAllSubtasks = function() { // Populate the task-filter with parentId $rootScope.filters.forced.cmmnTaskFilter = { parentTaskId: $scope.task.id }; $scope.returnToList(); }; $scope.loadSubTasks = function() { $scope.subTasks = undefined; $http({method: 'GET', url: FlowableAdmin.Config.adminContextRoot + 'rest/admin/cmmn-tasks/' + $scope.task.id +'/subtasks'}). success(function(data, status, headers, config) { $scope.subTasks = data; $scope.tabData.tabs[0].info = data.total; }); }; $scope.loadVariables = function() { $scope.variables = undefined; $http({method: 'GET', url: FlowableAdmin.Config.adminContextRoot + 'rest/admin/cmmn-tasks/' + $scope.task.id +'/variables'}). success(function(data, status, headers, config) { $scope.variables = data; $scope.tabData.tabs[1].info = data.total; }); }; $scope.loadIdentityLinks = function() { $scope.identityLinks = undefined; $http({method: 'GET', url: FlowableAdmin.Config.adminContextRoot + 'rest/admin/cmmn-tasks/' + $scope.task.id +'/identitylinks'}). success(function(data, status, headers, config) { $scope.identityLinks = {data: data, size: data.length}; $scope.tabData.tabs[2].info = data.length; }); }; $scope.showTaskForm = function() { if($scope.task.endTime) { $http({method: 'GET', url: FlowableAdmin.Config.adminContextRoot + 'rest/admin/task-form-instance/' + $scope.task.id}). success(function(data, status, headers, config) { $rootScope.submittedForm = data.data[0]; // saving fetched submitted form in root scope to avoid another fetch in submitted form controller $location.path("/form-instance/" + data.data[0].id); }); } }; // Initial load of task $scope.executeWhenReady(function() { $scope.loadTask(); }); // Dialogs var resolve = { // Reference the current task task: function () { return $scope.task; } }; $scope.deleteTask = function() { var modalInstance = $modal.open({ templateUrl: 'views/task-delete-popup.html', controller: 'CmmnDeleteTaskModalInstanceCtrl', resolve: resolve }); modalInstance.result.then(function (deleteTask) { if(deleteTask) { $scope.addAlert($translate.instant('ALERT.TASK.DELETED', $scope.task), 'info'); $scope.returnToList(); } }); }; $scope.completeTask = function() { var modalInstance = $modal.open({ templateUrl: 'views/task-complete-popup.html', controller: 'CmmnCompleteModalInstanceCtrl', resolve: resolve }); modalInstance.result.then(function (completeTask) { if(completeTask) { $scope.addAlert($translate.instant('ALERT.TASK.COMPLETED', $scope.task), 'info'); $scope.loadTask(); } }); }; $scope.delegateTask = function() { var modalInstance = $modal.open({ templateUrl: 'views/task-delegate-popup.html', controller: 'CmmnDelegateModalInstanceCtrl', resolve: resolve }); modalInstance.result.then(function (user) { if(user) { $scope.addAlert($translate.instant('ALERT.TASK.DELEGATED', {id: $scope.task.id, user: user}), 'info'); $scope.loadTask(); } }); }; $scope.resolveTask = function() { var modalInstance = $modal.open({ templateUrl: 'views/task-resolve-popup.html', controller: 'CmmnResolveTaskModalInstanceCtrl', resolve: resolve }); modalInstance.result.then(function (user) { if(user) { $scope.addAlert($translate.instant('ALERT.TASK.RESOLVED', $scope.task), 'info'); $scope.loadTask(); } }); }; $scope.assignTask = function() { var modalInstance = $modal.open({ templateUrl: 'views/task-assign-popup.html', controller: 'CmmnAssignModalInstanceCtrl', resolve: resolve }); modalInstance.result.then(function (user) { if(user !== undefined) { if(user == '') { $scope.addAlert($translate.instant('ALERT.TASK.UNASSIGNED', $scope.task), 'info'); } else { $scope.addAlert($translate.instant('ALERT.TASK.ASSIGNED', {id: $scope.task.id, user: user}), 'info'); } $scope.loadTask(); } }); }; $scope.editTask = function() { var modalInstance = $modal.open({ templateUrl: 'views/task-edit-popup.html', controller: 'CmmnEditTaskModalInstanceCtrl', resolve: resolve }); modalInstance.result.then(function (taskUpdated) { if(taskUpdated) { $scope.addAlert($translate.instant('ALERT.TASK.UPDATED', $scope.task), 'info'); $scope.loadTask(); } }); }; }]); // Popup controllers flowableAdminApp.controller('CmmnCompleteModalInstanceCtrl', ['$rootScope', '$scope', '$modalInstance', '$http', 'task', function ($rootScope, $scope, $modalInstance, $http, task) { $scope.task = task; $scope.status = {loading: false}; $scope.ok = function () { $scope.status.loading = true; $http({method: 'POST', url: FlowableAdmin.Config.adminContextRoot + 'rest/admin/cmmn-tasks/' + $scope.task.id, data: {action: 'complete'}}). success(function(data, status, headers, config) { $modalInstance.close(true); $scope.status.loading = false; }).error(function(data, status, headers, config) { $modalInstance.close(false); $scope.status.loading = false; }); }; $scope.cancel = function () { if(!$scope.status.loading) { $modalInstance.dismiss('cancel'); } }; }]); flowableAdminApp.controller('CmmnResolveTaskModalInstanceCtrl', ['$rootScope', '$scope', '$modalInstance', '$http', 'task', function ($rootScope, $scope, $modalInstance, $http, task) { $scope.task = task; $scope.status = {loading: false}; $scope.ok = function () { $scope.status.loading = true; $http({method: 'POST', url: FlowableAdmin.Config.adminContextRoot + 'rest/admin/cmmn-tasks/' + $scope.task.id, data: {action: 'resolve'}}). success(function(data, status, headers, config) { $modalInstance.close(true); $scope.status.loading = false; }).error(function(data, status, headers, config) { $modalInstance.close(false); $scope.status.loading = false; }); }; $scope.cancel = function () { if(!$scope.status.loading) { $modalInstance.dismiss('cancel'); } }; }]); flowableAdminApp.controller('CmmnDeleteTaskModalInstanceCtrl', ['$rootScope', '$scope', '$modalInstance', '$http', 'task', function ($rootScope, $scope, $modalInstance, $http, task) { $scope.task = task; $scope.status = {loading: false}; $scope.ok = function () { $scope.status.loading = true; $http({method: 'DELETE', url: FlowableAdmin.Config.adminContextRoot + 'rest/admin/cmmn-tasks/' + $scope.task.id}). success(function(data, status, headers, config) { $modalInstance.close(true); $scope.status.loading = false; }). error(function(data, status, headers, config) { $modalInstance.close(false); $scope.status.loading = false; }); }; $scope.cancel = function () { if(!$scope.status.loading) { $modalInstance.dismiss('cancel'); } }; }]); flowableAdminApp.controller('CmmnDelegateModalInstanceCtrl', ['$rootScope', '$scope', '$modalInstance', '$http', 'task', function ($rootScope, $scope, $modalInstance, $http, task) { $scope.task = task; $scope.status = {loading: false}; $scope.ok = function () { $scope.status.loading = true; $http({method: 'POST', url: FlowableAdmin.Config.adminContextRoot + 'rest/admin/cmmn-tasks/' + $scope.task.id, data: {action: 'delegate', assignee: $scope.status.user}}). success(function(data, status, headers, config) { if ($scope.newAssignee && $scope.newAssignee.name) { $modalInstance.close($scope.newAssignee.name); } else { $modalInstance.close($scope.status.user); } $scope.status.loading = false; }).error(function(data, status, headers, config) { $modalInstance.close(false); $scope.status.loading = false; }); }; $scope.cancel = function () { if(!$scope.status.loading) { $modalInstance.dismiss('cancel'); } }; }]); flowableAdminApp.controller('CmmnAssignModalInstanceCtrl', ['$rootScope', '$scope', '$modalInstance', '$http', 'task', function ($rootScope, $scope, $modalInstance, $http, task) { $scope.task = task; $scope.status = {loading: false}; $scope.ok = function () { $scope.status.loading = true; var rawUserValue = $scope.status.user; var resultUserValue = $scope.status.user; if(!$scope.status.user) { rawUserValue = null; resultUserValue = ''; } else if ($scope.newAssignee && $scope.newAssignee.name) { resultUserValue = $scope.newAssignee.name; } $http({method: 'PUT', url: FlowableAdmin.Config.adminContextRoot + 'rest/admin/cmmn-tasks/' + $scope.task.id, data: {assignee: rawUserValue}}). success(function(data, status, headers, config) { $modalInstance.close(resultUserValue); $scope.status.loading = false; }).error(function(data, status, headers, config) { $modalInstance.close(false); $scope.status.loading = false; }); }; $scope.cancel = function () { if(!$scope.status.loading) { $modalInstance.dismiss('cancel'); } }; }]); flowableAdminApp.controller('CmmnEditTaskModalInstanceCtrl', ['$rootScope', '$scope', '$modalInstance', '$http', 'task', function ($rootScope, $scope, $modalInstance, $http, task) { $scope.task = task; $scope.model = { name: task.name, description: task.description, owner: task.owner, assignee: task.assignee, dueDate: task.dueDate, priority: task.priority, category: task.category, }; $scope.status = {loading: false}; $scope.ok = function () { $scope.status.loading = true; $http({method: 'PUT', url: FlowableAdmin.Config.adminContextRoot + 'rest/admin/cmmn-tasks/' + $scope.task.id, data: $scope.model}). success(function(data, status, headers, config) { $modalInstance.close(true); $scope.status.loading = false; }).error(function(data, status, headers, config) { $modalInstance.close(false); $scope.status.loading = false; }); }; $scope.cancel = function () { if(!$scope.status.loading) { $modalInstance.dismiss('cancel'); } }; }]);