/** * Created by wisestone on 2018-01-09. */ 'use strict'; define([ 'app', 'angular' ], function (app, angular) { app.controller('taskAgileBoardController', ['$scope', '$rootScope', '$log', '$resourceProvider', 'SweetAlert', 'WorkflowStatus', '$uibModal', 'Task', 'User', '$state', '$timeout', function ($scope, $rootScope, $log, $resourceProvider, SweetAlert, WorkflowStatus, $uibModal, Task, User, $state, $timeout) { $scope.fn = { getWorkflowStatus : getWorkflowStatus, // 상태 목록을 조회한다. excelImport : excelImport, taskAdd : taskAdd, // 할일을 생성한다. taskModify : taskModify, // 할일 수정 팝업을 호출한다. taskRemove : taskRemove, // 할일을 삭제한다. broadCastTasks : broadCastTasks, // 다른 사용자들에게 내가 추가한 할일을 화면에 업데이트되도록 한다. executeAddTaskUpdate : executeAddTaskUpdate, // 다른 사람과 내 화면에서 추가한 업무 정보를 업데이트 한다. executeModifyTaskUpdate : executeModifyTaskUpdate, // 다른 사용자가 변경한 할일 내용을 화면에 반영한다. executeRemoveTaskUpdate : executeRemoveTaskUpdate, // 다른 사용자가 삭제한 할일을 화면에 반영한다. broadCastRemoveTasks : broadCastRemoveTasks, // 할일이 삭제된 것을 접속 중인 모든 사용자에게 알리고 업데이트 받게 한다. executeSelfMoveTaskUpdate : executeSelfMoveTaskUpdate, // 이동한 사람의 화면에서 업무 이동 정보를 업데이트한다. executeMoveTaskUpdate : executeMoveTaskUpdate, // 다른 사람의 화면에서 변경된 업무 이동 정보를 내 화면에 업데이트 한다. findPrevMoveTaskPosition : findPrevMoveTaskPosition, findNextMoveTaskPosition : findNextMoveTaskPosition, addStatus : addStatus, // 상태 추가 팝업을 호출한다. modifyStatus : modifyStatus // 상태 수정 팝업을 호출한다. }; $scope.vm = { workflowStatus : [] }; // 할일 수정에서 상태 변경시 칸반 보드에서 해당 할일의 상태를 이동시킨다. $scope.$on("taskMoveSelf", function (event, args) { $scope.fn.executeSelfMoveTaskUpdate(args.content); }); $scope.$on("taskMove", function (event, args) { // 다른 프로젝트일 경우 반영하지 않는다. if (args.content.projectId != $rootScope.lastProject.id) { return; } try { $scope.fn.executeMoveTaskUpdate(args.content); } catch (e) { $log.error("taskMove Error 가 발생하여 서버에 전체 데이터 재요청") $scope.fn.getWorkflowStatus(); } }); $scope.$on("taskAdd", function (event, args) { // 다른 프로젝트일 경우 반영하지 않는다. if (args.content.projectId != $rootScope.lastProject.id) { return; } try { $scope.fn.executeAddTaskUpdate(args.content); } catch (e) { $log.error("taskAdd Error 가 발생하여 서버에 전체 데이터 재요청") $scope.fn.getWorkflowStatus(); } }); $scope.$on("taskModify", function (event, args) { // 다른 프로젝트일 경우 반영하지 않는다. if (args.content.projectId != $rootScope.lastProject.id) { return; } try { $scope.fn.executeModifyTaskUpdate(args.content); } catch (e) { $log.error("taskModify Error 가 발생하여 서버에 전체 데이터 재요청") $scope.fn.getWorkflowStatus(); } }); $scope.$on("taskRemove", function (event, args) { // 다른 프로젝트일 경우 반영하지 않는다. if (args.content.projectId != $rootScope.lastProject.id) { return; } // 마지막으로 본 taskId와 삭제된 taskId가 일치할 경우 팝업창을 닫는다. if ($rootScope.lastTaskId == args.content.taskVo.id) { $rootScope.$broadcast("taskModifyScreenClose", {}); } try { $scope.fn.executeRemoveTaskUpdate(args.content); } catch (e) { $log.error("taskRemove Error 가 발생하여 서버에 전체 데이터 재요청") $scope.fn.getWorkflowStatus(); } }); // 다른 사용자가 변경한 할일 내용을 화면에 반영한다. function executeModifyTaskUpdate(content) { var targetCheck = false; for (var count in $scope.vm.workflowStatus) { var workflowStatus = $scope.vm.workflowStatus[count]; for (var taskCount in workflowStatus.taskVos) { if (workflowStatus.taskVos[taskCount].id == content.taskVo.id) { workflowStatus.taskVos[taskCount] = {}; workflowStatus.taskVos[taskCount] = angular.copy(content.taskVo); targetCheck = true; break; } } if (targetCheck) { break; } } } // 다른 사용자가 삭제한 할일을 화면에 반영한다. function executeRemoveTaskUpdate(content) { var targetCheck = false; for (var count in $scope.vm.workflowStatus) { var workflowStatus = $scope.vm.workflowStatus[count]; for (var taskCount in workflowStatus.taskVos) { if (workflowStatus.taskVos[taskCount].id == content.taskVo.id) { workflowStatus.taskVos.splice(taskCount, 1); targetCheck = true; break; } } if (targetCheck) { break; } } } // 다른 사람과 내 화면에서 추가한 업무 정보를 업데이트 한다. function executeAddTaskUpdate(content) { for (var count in $scope.vm.workflowStatus) { var workflowStatus = $scope.vm.workflowStatus[count]; if (workflowStatus.id == content.workflowStatusId) { workflowStatus.taskVos.unshift(content.taskVo); break; } } } // 이동한 사람의 화면에서 업무 이동 정보를 업데이트한다. function executeSelfMoveTaskUpdate(content) { var targetTask = null; for (var count in $scope.vm.workflowStatus) { var workflowStatus = $scope.vm.workflowStatus[count]; // 이동할 대상을 찾는다. for (var taskCount in workflowStatus.taskVos) { if (workflowStatus.taskVos[taskCount].id == content.taskId) { targetTask = workflowStatus.taskVos.splice(taskCount, 1); break; } } } var prevCheck = $scope.fn.findPrevMoveTaskPosition(content.moveWorkflowStatusId, content.prevTaskId, targetTask[0]); // prev 로 못찾을 경우 next 로 찾는다. if (!prevCheck) { $scope.fn.findNextMoveTaskPosition(content.moveWorkflowStatusId, content.nextTaskId, targetTask[0]); } } // 다른 사람의 화면에서 변경된 업무 이동 정보를 내 화면에 업데이트 한다. function executeMoveTaskUpdate(content) { var targetTask = null; for (var count in $scope.vm.workflowStatus) { var workflowStatus = $scope.vm.workflowStatus[count]; // 이동할 대상을 찾는다. for (var taskCount in workflowStatus.taskVos) { if (workflowStatus.taskVos[taskCount].id == content.taskId) { targetTask = workflowStatus.taskVos.splice(taskCount, 1); break; } } } var prevCheck = $scope.fn.findPrevMoveTaskPosition(content.moveWorkflowStatusId, content.prevTaskId, targetTask[0]); // prev 로 못찾을 경우 next 로 찾는다. if (!prevCheck) { $scope.fn.findNextMoveTaskPosition(content.moveWorkflowStatusId, content.nextTaskId, targetTask[0]); } } function findPrevMoveTaskPosition(findWorkflowStatusId, findTaskId, targetTask) { var prevCheck = false; for (var count in $scope.vm.workflowStatus) { var workflowStatus = $scope.vm.workflowStatus[count]; // 이동할 곳을 찾아 이동 대상을 넣는다. if (workflowStatus.id == findWorkflowStatusId) { if (findTaskId == null) { workflowStatus.taskVos.unshift(targetTask); prevCheck = true; } else { var taskCount = 0; for (taskCount = 0; taskCount < workflowStatus.taskVos.length; taskCount++) { if (workflowStatus.taskVos[taskCount].id == findTaskId) { prevCheck = true; taskCount++; break; } } if (prevCheck) { workflowStatus.taskVos.splice(taskCount, 0, targetTask); } } break; } } return prevCheck; } function findNextMoveTaskPosition(findWorkflowStatusId, findTaskId, targetTask) { for (var count in $scope.vm.workflowStatus) { var workflowStatus = $scope.vm.workflowStatus[count]; // 이동할 곳을 찾아 이동 대상을 넣는다. if (workflowStatus.id == findWorkflowStatusId) { if (findTaskId == null) { workflowStatus.taskVos.push(targetTask); } else { for (var taskCount = 0; taskCount < workflowStatus.taskVos.length; taskCount++) { if (workflowStatus.taskVos[taskCount].id == findTaskId) { workflowStatus.taskVos.splice(taskCount, 0, targetTask); break; } } } break; } } } // 상태 목록을 조회한다. function getWorkflowStatus() { WorkflowStatus.find($resourceProvider.getContent({projectId : $rootScope.lastProject.id}, $resourceProvider.getPageContent(0, 255))).then(function (result) { if (result.data.message.status == "success") { $scope.vm.workflowStatus = result.data.data; angular.forEach($scope.vm.workflowStatus, function (workflowStatus) { switch(workflowStatus.color) { case "btn-primary" : workflowStatus.borderColor = "#047bf8"; break; case "btn-danger" : workflowStatus.borderColor = "#e65252"; break; case "btn-info" : workflowStatus.borderColor = "#5bc0de"; break; case "btn-success" : workflowStatus.borderColor = "#5eb314"; break; case "btn-warning" : workflowStatus.borderColor = "#b17247"; break; case "btn-violet" : workflowStatus.borderColor = "#6156c5"; break; default : workflowStatus.borderColor = workflowStatus.color; } workflowStatus.taskVos = workflowStatus.taskVos.sort(function (a, b) { // 오름차순 return a.position < b.position ? -1 : a.position > b.position ? 1 : 0; }); }); } else { // 실패하면 본인의 기본 워크스페이스&프로젝트로 셋팅되어 화면 새로고침이 되어야 한다. User.initLastWorkspaceIdAndLastProjectId($resourceProvider.getContent({},$resourceProvider.getPageContent(0, 0))).then(function (result) { User.refreshSession($resourceProvider.getContent({},$resourceProvider.getPageContent(0, 0))).then(function (result) { if (result.data.message.status == "success") { SweetAlert.swal("프로젝트 제외", "프로젝트에서 제외되었습니다.", "warning"); $rootScope.user = result.data.data; $state.go("workspaces.workspace"); } }); }); } }); } // 다른 사용자들에게 내가 추가한 할일을 화면에 업데이트되도록 한다. function broadCastTasks(taskVo, workflowStatusId) { var content = { projectId : $rootScope.lastProject.id, workflowStatusId : workflowStatusId, taskVo : taskVo, actionType : "/notification/task-add" }; User.taskUpdate($resourceProvider.getContent(content, $resourceProvider.getPageContent(0, 0))).then(function (result) { if (result.data.message.status == "success") { } else { // TODO - 웹 소켓으로 경고창 표시 } }); } function taskAdd(workflowStatus) { if (workflowStatus.taskTitle == "" || workflowStatus.taskTitle == null) { SweetAlert.swal({ title : "할일 입력", text : "할일을 입력하세요.", type : "warning" }); return; } var content = { title : workflowStatus.taskTitle, description : "", priorityId : 2, // 중요도 기본값은 보통 userIds : [], startCompleteDateRange : "", workflowStatusId : workflowStatus.id, attachedFileIds : [] }; Task.add({ method : "POST", file : [], fields : { content : content }, fileFormDataName : "file" }) .then(function (result) { if (result.data.message.status == "success") { workflowStatus.taskTitle = ""; // 업무 카드 업데이트 $scope.fn.broadCastTasks(result.data.data, workflowStatus.id); $rootScope.$broadcast("taskAdd", { content : { projectId : $rootScope.lastProject.id, workflowStatusId : workflowStatus.id, taskVo : result.data.data } }); } }); } // 할일 수정 팝업을 호출한다. function taskModify(task) { $uibModal.open({ templateUrl : 'views/task/taskModify.html', size : "lg", controller : 'taskModifyController', backdrop : 'static', resolve : { parameter : function () { return { id : task.id }; } } }); } // 할일을 삭제한다. function taskRemove(task) { if (task == null) { SweetAlert.swal({ title : "삭제 대상 확인", text : "삭제 대상을 선택하세요.", type : "warning" }); return; } // 삭제 알림 SweetAlert.swal({ title : "할일 삭제", text : "선택한 할일을 삭제하겠습니까? 삭제된 할일은 복구할 수 없습니다.", type : "warning", showCancelButton : true, confirmButtonColor : "#DD6B55", confirmButtonText : "삭제", cancelButtonText : "취소", closeOnConfirm : false, closeOnCancel : true }, function (isConfirm) { SweetAlert.close(); if (isConfirm) { Task.remove($resourceProvider.getContent( [{id : task.id}], $resourceProvider.getPageContent(0, 0))).then(function (result) { if (result.data.message.status == "success") { $timeout(function () { SweetAlert.success("삭제 성공", "삭제가 정상적으로 실행되었습니다."); }, 100); $scope.fn.broadCastRemoveTasks(task); } else { $timeout(function () { SweetAlert.error("삭제 실패", result.data.message.message); }, 100); } }); } }); } // 할일이 삭제된 것을 접속 중인 모든 사용자에게 알리고 업데이트 받게 한다. function broadCastRemoveTasks(task) { var content = { projectId : $rootScope.lastProject.id, taskVo : task, actionType : "/notification/task-remove" }; $scope.fn.executeRemoveTaskUpdate(content); User.taskUpdate($resourceProvider.getContent(content, $resourceProvider.getPageContent(0, 0))).then(function (result) { if (result.data.message.status == "success") { } else { SweetAlert.swal("할일 업데이트 실패", "다른 사용자의 변경 내역을 업데이트하는데 실패하였습니다.", "warning"); } }); } function excelImport() { $uibModal.open({ templateUrl : 'views/task/taskExcelImport.html', size : "md", controller : 'taskExcelImportController', backdrop : 'static' }); } // 상태 생성 팝업 function addStatus() { $uibModal.open({ templateUrl : 'views/workflowStatus/workflowStatusAdd.html', size : "md", controller : 'workflowStatusAddController', backdrop : 'static', resolve : { parameter : function () { return { projectId : $rootScope.lastProject.id }; } } }); } // 상태 수정 팝업 function modifyStatus(id) { $uibModal.open({ templateUrl : 'views/workflowStatus/workflowStatusModify.html', size : "md", controller : 'workflowStatusModifyController', backdrop : 'static', resolve : { parameter : function () { return { id : id }; } } }); } $scope.fn.getWorkflowStatus(); } ]); } );