/** * Created by wisestone on 2018-01-05. */ 'use strict'; define([ 'app', 'angular' ], function (app, angular) { app.controller('taskModifyController', ['$scope', '$rootScope', '$log', '$resourceProvider', '$uibModalInstance', '$injector', '$controller', '$tableProvider', 'Task', 'parameter', 'User', 'AttachedFile', 'SweetAlert', 'WorkflowStatus', '$q', 'TaskComment', '$timeout', function ($scope, $rootScope, $log, $resourceProvider, $uibModalInstance, $injector, $controller, $tableProvider, Task, parameter, User, AttachedFile, SweetAlert, WorkflowStatus, $q, TaskComment, $timeout) { $scope.fn = { cancel : cancel, changePriority : changePriority, changeStatus : changeStatus, formSubmit : formSubmit, getWorkflowStatus : getWorkflowStatus, startExecute : startExecute, onFileSelect : onFileSelect, getTaskData : getTaskData, broadCastTasks : broadCastTasks, fileRemove : fileRemove, taskUserRemove : taskUserRemove, addComment : addComment, removeComment : removeComment, getCommentList : getCommentList, updateMyScreenAndOtherUsers : updateMyScreenAndOtherUsers, updateTaskStatusMove : updateTaskStatusMove, taskRemove : taskRemove, broadCastRemoveTasks : broadCastRemoveTasks, getUserListCallBack : getUserListCallBack }; $scope.vm = { form : { id : parameter.id, title : "", // 제목 description : "", // 설명 priorityId : "", // 우선순위 id priorityName : "", // 우선순위 명 priorityColor : "", // 우선순위 색상 workflowStatusId : "", // 상태 id workflowStatusName : "", // 상태 명 workflowStatusColor : "", // 상태 색상 users : [], // 담당자 attachedFiles : [], // 서버에 이미 올라간 첨부파일 startCompleteDateRange : "", // 기간 registerDate : "", // 생성일 registerName : "", comment : "", // 댓글 내용 taskComments : [], // 댓글 전체 }, autoCompletePage : { user : { page : 0, totalPage : 0 } }, userName : "", workflowStatus : [] }; angular.extend(this, $controller('autoCompleteController', {$scope : $scope, $injector : $injector})); // 다른 사용자가 같은 할일을 수정하고 있으면 데이터를 최신으로 업데이트한다. $scope.$on("taskModifyModalUpdate", function (event, args) { if (args.content.taskVo.id == parameter.id) { $scope.fn.getTaskData(); } }); $scope.$on("taskModifyScreenClose", function (event, args) { SweetAlert.swal("할일 삭제 알림", "다른 사용자에 의해 할일이 삭제되었습니다.", "warning"); $scope.fn.cancel(); }); // 할일 삭제 function taskRemove() { // 삭제 알림 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 : parameter.id}], $resourceProvider.getPageContent(0, 0))).then(function (result) { if (result.data.message.status == "success") { $scope.fn.cancel(); SweetAlert.swal("삭제 성공", "삭제가 정상적으로 실행되었습니다.", "success"); $scope.fn.broadCastRemoveTasks($scope.vm.form); } else { $timeout(function () { SweetAlert.swal("삭제 실패", result.data.message.message, "error"); }, 100); } }); } }); } // 삭제 정보를 다른 사용자들에게 전파한다. function broadCastRemoveTasks(task) { var content = { projectId : $rootScope.lastProject.id, taskVo : task, actionType : "/notification/task-remove" }; User.taskUpdate($resourceProvider.getContent(content, $resourceProvider.getPageContent(0, 0))).then(function (result) { if (result.data.message.status == "success") { $rootScope.$broadcast("taskRemove", { content : { workflowStatusId : $scope.vm.form.workflowStatusId, projectId : $rootScope.lastProject.id, taskVo : task } }); } else { // TODO - 웹 소켓으로 경고창 표시 } }); } // 수정 후 업데이트된 정보를 자신의 화면/다른 사용자에게 전달한다. function updateMyScreenAndOtherUsers() { Task.modifyData($resourceProvider.getContent( {id : $scope.vm.form.id}, $resourceProvider.getPageContent(0, 1))).then(function (result) { if (result.data.message.status == "success") { // 업무 카드 업데이트 $scope.fn.broadCastTasks(result.data.data); // 목록 화면 갱신 $rootScope.$broadcast("taskModify", { content : { workflowStatusId : parameter.workflowStatusId, projectId : $rootScope.lastProject.id, taskVo : result.data.data } }); } }); } // 우선순위를 변경한다. function changePriority(priority) { // 폼에 선택한 우선순위 값 업데이트 $scope.vm.form.priorityId = priority.fieldKey; $scope.vm.form.priorityName = priority.fieldValue; $scope.vm.form.priorityColor = priority.color; $scope.fn.formSubmit(); } // 할일 상태를 변경한다. function changeStatus(workflowStatus) { $scope.vm.form.workflowStatusId = workflowStatus.id; $scope.vm.form.workflowStatusName = workflowStatus.name; $scope.vm.form.workflowStatusColor = workflowStatus.color; $scope.fn.formSubmit(); // 할일 상태 이동 화면 업데이트 $scope.fn.updateTaskStatusMove(); } // 담당자를 변경한다. $scope.$on("taskUserUpdate", function (args) { $scope.fn.formSubmit(); }); // 시작일 ~ 종료일 변경 $scope.$on("dateUpdate", function (newValue, oldValue) { $scope.fn.formSubmit(); }); // 파일 첨부 function onFileSelect($files) { var permit = true; for (var count in $files) { if ($files[count].size > 1048576000) { permit = false; break; } } if (!permit) { SweetAlert.swal("파일 사이즈 제한", "업로드 최대 가능 용량은 1GB 입니다.", "error"); return; } AttachedFile.add({ method : "POST", file : $files, // data 속성으로 별도의 데이터 전송 fields : { content : { taskId : parameter.id } }, fileFormDataName : "file" }) .then(function (result) { if (result.data.message.status == "success") { $scope.vm.form.attachedFiles = result.data.data; // 변경 사항 화면 업데이트 $scope.fn.updateMyScreenAndOtherUsers(); } else { SweetAlert.swal("파일 업로드 오류", result.data.message.message, "error"); } }); } // 파일 삭제 function fileRemove(attachedFile) { // 삭제 알림 SweetAlert.swal({ title : "파일 삭제", text : "선택한 파일 삭제하겠습니까? 삭제된 파일은 복구할 수 없습니다.", type : "warning", showCancelButton : true, confirmButtonColor : "#DD6B55", confirmButtonText : "삭제", cancelButtonText : "취소", closeOnConfirm : true, closeOnCancel : true }, function (isConfirm) { SweetAlert.close(); if (isConfirm) { AttachedFile.remove($resourceProvider.getContent({id : attachedFile.id, taskId : parameter.id}, $resourceProvider.getPageContent(0, 255))).then(function (result) { if (result.data.message.status == "success") { $scope.vm.form.attachedFiles = result.data.data; // 변경 사항 화면 업데이트 $scope.fn.updateMyScreenAndOtherUsers(); } else { $timeout(function () { SweetAlert.swal("삭제 실패", result.data.message.message, "error"); }, 100); } }); } }); } // 사용자 선택 auto complete 에서 사용 function getUserListCallBack(result) { $scope.vm.autoCompletePage.user.totalPage = result.data.page.totalPage; } // 사용자 제거 function taskUserRemove(id) { var users = []; angular.forEach($scope.vm.form.users, function (user) { if (user.id != id) { users.push(user); } }); $scope.vm.form.users = angular.copy(users); $scope.fn.formSubmit(); } // 댓글 등록 function addComment() { var comment = $scope.vm.form.comment.replace(/(\s*)/g, ""); if (comment.length < 1) { SweetAlert.swal({ title : "댓글 입력 확인", text : "댓글을 입력하세요.", type : "warning" }); return; } var content = { taskId : $scope.vm.form.id, comment : $scope.vm.form.comment }; TaskComment.add($resourceProvider.getContent( content, $resourceProvider.getPageContent(0, 0))).then(function (result) { if (result.data.message.status == "success") { $scope.vm.form.comment = ""; // 변경 사항 화면 업데이트 $scope.fn.updateMyScreenAndOtherUsers(); // 댓글 전체 목록 로딩 $scope.fn.getCommentList(); } else { SweetAlert.swal("댓글 등록 실패", result.data.message.message, "error"); } }); } // 댓글 삭제 function removeComment(comment) { // 삭제 알림 SweetAlert.swal({ title : "댓글 삭제", text : "선택한 댓글을 삭제하겠습니까? 삭제된 댓글은 복구할 수 없습니다.", type : "warning", showCancelButton : true, confirmButtonColor : "#DD6B55", confirmButtonText : "삭제", cancelButtonText : "취소", closeOnConfirm : true, closeOnCancel : true }, function (isConfirm) { SweetAlert.close(); if (isConfirm) { TaskComment.remove($resourceProvider.getContent( {id : comment.id}, $resourceProvider.getPageContent(0, 0))).then(function (result) { if (result.data.message.status == "success") { // 변경 사항 화면 업데이트 $scope.fn.updateMyScreenAndOtherUsers(); // 댓글 목록 로딩 $scope.fn.getCommentList(); } else { $timeout(function () { SweetAlert.swal("삭제 실패", result.data.message.message, "error"); }, 100); } }); } }); } // 해당 할일의 전체 댓글을 가져온다. function getCommentList() { TaskComment.find($resourceProvider.getContent( {taskId : $scope.vm.form.id}, $resourceProvider.getPageContent(0, 0))).then(function (result) { if (result.data.message.status == "success") { $scope.vm.form.taskComments = result.data.data; } else { SweetAlert.swal({ title : "댓글 목록 데이터 가져오기 실패", text : result.message.message, type : "error" }); } }); } function formSubmit() { if (!$rootScope.isDefined($scope.vm.form.title)) { SweetAlert.swal({ title : "할일 제목 입력", text : "할일 제목을 입력하세요.", type : "warning" }); return; } var content = { id : $scope.vm.form.id, title : $scope.vm.form.title, // 제목 description : $scope.vm.form.description, // 설명 workflowStatusId : $scope.vm.form.workflowStatusId, // 상태 priorityId : $scope.vm.form.priorityId, // 우선순위 userIds : (function () { var userIds = []; angular.forEach($scope.vm.form.users, function (user) { userIds.push(user.id); }); return userIds; })(), // 담당자 startCompleteDateRange : $scope.vm.form.startCompleteDateRange // 시작일, 종료일 }; Task.modify({ method : "POST", file : $scope.vm.form.files, // data 속성으로 별도의 데이터 전송 fields : { content : content }, fileFormDataName : "file" }) .then(function (result) { if (result.data.message.status == "success") { // 변경 사항 화면 업데이트 $scope.fn.updateMyScreenAndOtherUsers(); } else { SweetAlert.swal("할일 수정 실패", result.data.message.message, "error"); } }); } function cancel() { $uibModalInstance.dismiss('cancel'); } // 할일 수정 데이터 function getTaskData() { var deferred = $q.defer(); $rootScope.lastTaskId = $scope.vm.form.id; Task.modifyData($resourceProvider.getContent( {id : $scope.vm.form.id}, $resourceProvider.getPageContent(0, 1))).then(function (result) { if (result.data.message.status == "success") { if (angular.isDefined(result.data.data)) { $scope.vm.form.title = result.data.data.title; $scope.vm.form.description = result.data.data.description; $scope.vm.form.priorityId = result.data.data.priorityVo.id; $scope.vm.form.priorityName = result.data.data.priorityVo.name; $scope.vm.form.priorityColor = result.data.data.priorityVo.color; $scope.vm.form.workflowStatusId = result.data.data.workflowStatusVo.id; $scope.vm.form.workflowStatusName = result.data.data.workflowStatusVo.name; $scope.vm.form.workflowStatusColor = result.data.data.workflowStatusVo.color; $scope.vm.form.registerDate = result.data.data.registerDate; $scope.vm.form.registerName = result.data.data.registerName; if ($rootScope.isDefined(result.data.data.startDate)) { $scope.vm.form.startCompleteDateRange = result.data.data.startDate + " ~ " + result.data.data.completeDate; } else { $scope.vm.form.startCompleteDateRange = ""; } $scope.vm.form.users = result.data.data.userVos; $scope.vm.form.attachedFiles = result.data.data.attachedFileVos; $scope.vm.form.taskComments = result.data.data.taskCommentVos; // owlAutoTextHeight 실행 $rootScope.$broadcast("dynamicTextareaHeight", {}); } deferred.resolve(result); } else { deferred.reject(result); } }); return deferred.promise; } // 워크플로우 상태 목록 function getWorkflowStatus() { var deferred = $q.defer(); 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) { workflowStatus.taskVos = workflowStatus.taskVos.sort(function (a, b) { // 오름차순 return a.position < b.position ? -1 : a.position > b.position ? 1 : 0; }); }); deferred.resolve(result); } else { deferred.reject(result); } }); return deferred.promise; } // 할일 수정 내용 다른 사용자에게 전파 function broadCastTasks(taskVo) { var content = { projectId : $rootScope.lastProject.id, workflowStatusId : parameter.workflowStatusId, taskVo : taskVo, actionType : "/notification/task-modify" }; User.taskUpdate($resourceProvider.getContent(content, $resourceProvider.getPageContent(0, 0))).then(function (result) { if (result.data.message.status == "success") { } else { // TODO - 웹 소켓으로 경고창 표시 } }); } // 할일의 상태를 변경하면 이동한 상태의 가장 처음으로 배치시킨다. function updateTaskStatusMove() { var content = { moveWorkflowStatusId : $scope.vm.form.workflowStatusId, // 이동한 status id prevTaskId : null, // 이동한 상태의 이전 task id nextTaskId : null, // 이동한 상태의 다음 task id taskId : parameter.id, // 이동한 task id projectId : $rootScope.lastProject.id, actionType : "/notification/task-move" }; // 목록 화면 갱신 $rootScope.$broadcast("taskMoveSelf", { content : content }); Task.updateTaskKanBan($resourceProvider.getContent(content, $resourceProvider.getPageContent(0, 0))).then(function (result) { if (result.data.message.status == "success") { } else { // TODO - 웹 소켓으로 경고창 표시 } }); } function startExecute() { var promises = { getTaskData : $scope.fn.getTaskData(), getWorkflowStatus : $scope.fn.getWorkflowStatus() }; $q.all(promises).then(function (results) { $log.debug("promises 결과 ", results); }); } $scope.fn.startExecute(); }]); });