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