/**
|
* 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();
|
}
|
|
]);
|
}
|
);
|