OWL ITS + 탐지시스템(인터넷 진흥원)
src/main/webapp/scripts/app/issue/issueDetail.controller.js
@@ -8,9 +8,9 @@
        'angular'
    ],
    function (app, angular) {
        app.controller('issueDetailController', ['$scope', '$rootScope', '$log', '$resourceProvider', '$tableProvider', '$state', '$uibModal', '$q',
        app.controller('issueDetailController', ['$scope', '$rootScope', '$log', '$resourceProvider', '$tableProvider', '$relProvider', '$downProvider', '$state', '$uibModal', '$q',
            '$controller', '$injector', 'SweetAlert', '$timeout', 'Issue', 'IssueComment', 'IssueRelation', 'AttachedFile',  'Priority', 'Severity','IssueStatus', 'IssueTableConfig', '$filter',
            function ($scope, $rootScope, $log, $resourceProvider, $tableProvider, $state, $uibModal, $q, $controller, $injector, SweetAlert, $timeout, Issue, IssueComment, IssueRelation, AttachedFile, Priority, Severity, IssueStatus, IssueTableConfig, $filter) {
            function ($scope, $rootScope, $log, $resourceProvider, $tableProvider, $relProvider, $downProvider, $state, $uibModal, $q, $controller, $injector, SweetAlert, $timeout, Issue, IssueComment, IssueRelation, AttachedFile, Priority, Severity, IssueStatus, IssueTableConfig, $filter) {
                //  IssueListController vm, fn 변수 상속.
@@ -51,11 +51,17 @@
                $scope.fn.containsPartner = containsPartner;
                $scope.fn.onActivate = onActivate;
                $scope.fn.issueBack = issueBack;
                $scope.fn.goParentIssue = goParentIssue;
                $scope.fn.removeRelationIssue = removeRelationIssue;
                $scope.fn.removeDownIssue = removeDownIssue;
                $scope.fn.changeDetailPageRowCount = changeDetailPageRowCount;    //  페이지 변경
                $scope.fn.sendCommonMail = sendCommonMail;
                $scope.fn.getSubPageContent = getSubPageContent;
                //  이슈 목록 컨트롤러 vm, fn 상속 중
                $scope.vm.viewer = {};      // 현재 이슈
                $scope.vm.images = [];  //  첨부된 파일 중 이미지 파일
                $scope.vm.activeTab = "ALL";    //  활동 내역 탭
                $scope.vm.activeTab = "RECODE";    //  활동 내역 탭
                //  이슈 상태 변경 표시 여부
                $scope.vm.editor = {
                    issueStatus : false
@@ -81,11 +87,22 @@
                $scope.vm.form = {
                    issues : [], //연관 일감
                    issuesDown : [],  // 하위 일감
                    issuesDownStatus : [], //하위 이슈 상태
                    issueCompanyVos : [],
                    issueIspVos : [],
                    issueHostingVos : []
                };
                $scope.vm.responseData = {
                    data : []
                };
                $scope.vm.subPage = {
                    selectedRelPage : 0,
                    selectedRelPageRowCount : String(10),
                    selectedDownPage : 0,
                    selectedDownPageRowCount : String(10)
                };
                $scope.vm.issueNameDown = "";       // 선택된 하위 일감 이름
                $scope.vm.autoCompletePageDown = {
@@ -97,6 +114,7 @@
                $scope.vm.issueName = "";       // 선택된 연관 일감 이름
                $scope.vm.issueId = "";       //
                $scope.vm.parentIssueId = "";
                $scope.vm.issueTypeId = "";
                $scope.vm.autoCompletePage = {
                    issue : {
@@ -105,11 +123,14 @@
                    },
                };
                $scope.vm.inheritPartners = "";
                $scope.vm.downTotalCount = "";
                $scope.vm.relResponseData = [];
                $scope.vm.relTableConfigs = [];
                //  테이블 이벤트
                $scope.relTableEvent = {
                    removeRelationIssue : removeRelationIssue,   // 연관 일감 삭제
                    //removeRelationIssue : removeRelationIssue,   // 연관 일감 삭제
                    changeDetailView : changeDetailView
                };
@@ -117,7 +138,7 @@
                $scope.vm.downTableConfigs = [];
                //  테이블 이벤트
                $scope.downTableEvent = {
                    removeDownIssue : removeDownIssue,   // 연관 일감 삭제
                    //removeDownIssue : removeDownIssue,   // 연관 일감 삭제
                    changeDetailView : changeDetailView
                };
@@ -125,13 +146,31 @@
                    //  이슈 번호를 저장한 후 이슈 목록으로 이동한다.
                    //$rootScope.$broadcast("makeIssueSearch",issue);
                    $scope.$parent.tableEvent.changeDetailView(issue.id);
                    $scope.fn.onActivate();
                }
                // 상위 이슈 클릭시 상위 이슈로 이동
                // 뒤로가기 버튼
                function issueBack() {
                    $rootScope.currentDetailIssueId = $scope.vm.viewer.parentIssueVo.id
                    $rootScope.$broadcast("getIssueDetail", {id: $rootScope.currentDetailIssueId});
                    var index = $scope.$parent.vm.issueIds.length -2;
                    if (index > -1) {
                        var preIssueId = $scope.$parent.vm.issueIds[index];
                        $scope.$parent.vm.issueIds.splice(index + 1, 1);
                        $scope.$parent.tableEvent.changeDetailView(preIssueId, true);
                    }
                }
                // 상위 이슈 클릭시 상위 이슈로 이동
                function goParentIssue() {
                    var parentIssueId = $scope.vm.parentIssueId;
                    $scope.$parent.tableEvent.changeDetailView(parentIssueId, true);
                    //하위이슈-> 상위이슈 -> 연관이슈에서 뒤로가기 버튼 클릭 시 하위이슈로 이동되는 문제로 마지막 배열값 제거
                    $scope.$parent.vm.issueIds.pop();
                }
                //  페이지 변경
                function changeDetailPageRowCount() {
                    $scope.fn.getIssueDetail(0,0);
                }
                function onActivate() {
@@ -140,17 +179,48 @@
                angular.extend(this, $controller('autoCompleteController', {$scope : $scope, $injector : $injector}));
                 // 이슈 목록 데이터 갱신
                $scope.$on("getIssueList", function () {
                    $scope.fn.getIssueDetail();
                });
                // 이슈 목록 데이터 갱신
                /*$scope.$on("getIssueList", function () {
                    $scope.fn.getIssueDetail(0,0);
                });*/
                // 하위 이슈 삭제
                function removeDownIssue(id) {
                function removeDownIssue() {
                    var removeIds = [];
                    var removePermission = true;
                    angular.forEach($scope.vm.viewer.issueDownVos, function (data) {
                        if (data.checked && data.modifyPermissionCheck) {
                            removeIds.push(data.id);
                        }
                        if (data.checked && !data.modifyPermissionCheck) {
                            removePermission = false;
                        }
                    });
                    if (!removePermission) {
                        SweetAlert.swal({
                            html : true,
                            title : $filter("translate")("common.deleteFailed"), // 삭제 실패
                            text : $filter("translate")("project.notHaveDeletePermissionExistsProject"), // "삭제 권한이 없는 프로젝트가 존재합니다."
                            type : "error"
                        });
                        return;
                    }
                    if (removeIds.length < 1) {
                        SweetAlert.swal({
                            title : $filter("translate")("common.checkPurgingTargets"), // 삭제 대상 확인
                            text : $filter("translate")("common.selectDestinationDeletion"), // 삭제 대상을 선택하세요.
                            type : "warning"
                        });
                        return;
                    }
                    //  삭제 알림
                    SweetAlert.swal({
                            title : $filter("translate")("issue.downIssueRemove"), // 하위 이슈 삭제
                            text : $filter("translate")("issue.wantToDeleteSelectIssue"),
                            text : $filter("translate")("issue.wantToDeleteSelectDownIssueInList"),
                            type : "warning",
                            showCancelButton : true,
                            confirmButtonColor : "#DD6B55",
@@ -166,7 +236,7 @@
                                $rootScope.spinner = true;
                                var contents = {
                                    id : id
                                    ids : removeIds
                                };
                                Issue.modifyParentIssue($resourceProvider.getContent(
@@ -174,7 +244,7 @@
                                    $resourceProvider.getPageContent(0, 10))).then(function (result) {
                                    if (result.data.message.status === "success") {
                                        $scope.fn.getIssueDetail();
                                        $scope.fn.getIssueDetail(0,0);
                                    }
                                    else {
                                        SweetAlert.error($filter("translate")("issue.failedToIssueDeleteIssueDown"), result.data.message.message); // "연관일감 삭제 실패"
@@ -188,11 +258,42 @@
                }
                // 연관 이슈 삭제
                function removeRelationIssue(id) {
                function removeRelationIssue() {
                    var removeIds = [];
                    var removePermission = true;
                    angular.forEach($scope.vm.viewer.issueRelationVos, function (data) {
                        if (data.checked && data.modifyPermissionCheck) {
                            removeIds.push(data.id);
                        }
                        if (data.checked && !data.modifyPermissionCheck) {
                            removePermission = false;
                        }
                    });
                    if (!removePermission) {
                        SweetAlert.swal({
                            html : true,
                            title : $filter("translate")("common.deleteFailed"), // 삭제 실패
                            text : $filter("translate")("issue.notHaveDeletePermissionExistsAnIssue"), // 삭제 권한이 없는 이슈가 존재합니다.
                            type : "error"
                        });
                        return;
                    }
                    if (removeIds.length < 1) {
                        SweetAlert.swal({
                            title : $filter("translate")("common.checkPurgingTargets"), // 삭제 대상 확인
                            text : $filter("translate")("common.selectDestinationDeletion"), // 삭제 대상을 선택하세요.
                            type : "warning"
                        });
                        return;
                    }
                    //  삭제 알림
                    SweetAlert.swal({
                            title : $filter("translate")("issue.relationIssueRemove"), // 연관 이슈 삭제
                            text : $filter("translate")("issue.wantToDeleteSelectIssue"),
                            text : $filter("translate")("issue.wantToDeleteSelectRelIssueInList"),
                            type : "warning",
                            showCancelButton : true,
                            confirmButtonColor : "#DD6B55",
@@ -208,7 +309,7 @@
                                $rootScope.spinner = true;
                                var contents = {
                                    id : id
                                    removeIds : removeIds
                                };
                                IssueRelation.delete($resourceProvider.getContent(
@@ -216,7 +317,7 @@
                                    $resourceProvider.getPageContent(0, 10))).then(function (result) {
                                    if (result.data.message.status === "success") {
                                        $scope.fn.getIssueDetail();
                                        $scope.fn.getIssueDetail(0,0);
                                    }
                                    else {
                                        SweetAlert.error($filter("translate")("issue.failedToIssueDeleteIssueRelation"), result.data.message.message); // "연관일감 삭제 실패"
@@ -235,96 +336,129 @@
                }
                function getDownIssueListCallBack(result) {
                    $scope.vm.autoCompletePage.issue.totalPage = result.data.page.totalPage;
                    $scope.vm.autoCompletePageDown.issue.totalPage = result.data.page.totalPage;
                }
                //  테이블의 연관 이슈 컬럼을 만들어준다.
                function setRelTableColumn(Rel_issueTableConfig) {
                function setRelTableColumn(issueTableConfig) {
                    //  연관 이슈 컬럼
                    switch(Rel_issueTableConfig.key) {
                        // 연관 이슈 구분
                        case "RELATION_ISSUE_TYPE" :
                            $scope.vm.relTableConfigs.push($tableProvider.config()
                    switch(issueTableConfig.key) {
                        case "RELATION_ISSUE_TYPE" :    // 연관 이슈 구분
                            $scope.vm.relTableConfigs.push($relProvider.config()
                                .setHName("issue.relationIssueType")
                                .setDName("relationIssueType")
                                .setDType("renderer")
                                .setHWidth("width-30 bold")
                                .setHSort(false)
                                .setDAlign("text-center")
                                .setHWidth("bold " + issueTableConfig.width)
                                .setDRenderer("ISSUE_RELATION_TYPE"))
                                /*.setHWidth("width-30 bold")*/
                                /*.setHSort(false)*/
                            break;
                        // 연관 이슈 제목
                        case "RELATION_ISSUE_TITLE" :
                            $scope.vm.relTableConfigs.push($tableProvider.config()
                        case "RELATION_ISSUE_TITLE" :   // 연관 이슈 제목
                            $scope.vm.relTableConfigs.push($relProvider.config()
                                .setHName("issue.relationIssueTitle")
                                .setDName("title")
                                .setDType("renderer")
                                .setHWidth("width-60 bold")
                                .setHSort(false)
                                .setDAlign("text-center")
                                .setHWidth("bold " + issueTableConfig.width)
                                .setDRenderer("ISSUE_RELATION_MOVE"))
                                /*.setHWidth("width-60 bold")*/
                                /*.setHSort(true)*/
                            break;
                        case "PRIORITY" :   // 연관 이슈 우선순위
                            $scope.vm.relTableConfigs.push($tableProvider.config()
                        case "RELATION_PRIORITY" :   // 연관 이슈 우선순위
                            $scope.vm.relTableConfigs.push($relProvider.config()
                                .setHName("common.priority")
                                .setDName("priorityName")
                                .setDName("priorityVo.id")
                                .setDType("renderer")
                                .setHWidth("bold " + Rel_issueTableConfig.width)
                                .setHWidth("bold " + issueTableConfig.width)
                                .setDAlign("text-center")
                                .setDRenderer("REL_COMMON_PRIORITY"));
                            break;
                        case "SEVERITY" :   //  연관 이슈 중요도
                            $scope.vm.relTableConfigs.push($tableProvider.config()
                        case "RELATION_SEVERITY" :   //  연관 이슈 중요도
                            $scope.vm.relTableConfigs.push($relProvider.config()
                                .setHName("common.importance")
                                .setDName("severityName")
                                .setDName("severityVo.id")
                                .setDType("renderer")
                                .setHWidth("bold " + Rel_issueTableConfig.width)
                                .setHWidth("bold " + issueTableConfig.width)
                                .setDAlign("text-center")
                                .setDRenderer("REL_COMMON_SEVERITY"));
                            break;
                        case "ASSIGNEE_TEAM" :   // 연관 이슈 담당부서
                            $scope.vm.relTableConfigs.push($tableProvider.config()
                        case "RELATION_ASSIGNEE_TEAM" :   // 연관 이슈 담당부서
                            $scope.vm.relTableConfigs.push($relProvider.config()
                                .setHName("common.assigneeTeam")
                                .setDName("departmentVos.departmentName")
                                .setDType("renderer")
                                .setHWidth("bold " + Rel_issueTableConfig.width)
                                .setHWidth("bold " + issueTableConfig.width)
                                .setDAlign("text-center")
                                .setDRenderer("REL_ISSUE_DEPARTMENT"));
                            break;
                        case "REGISTER" :   // 연관 이슈  등록자
                            $scope.vm.relTableConfigs.push($tableProvider.config()
                        case "RELATION_REGISTER" :   // 연관 이슈 등록자
                            $scope.vm.relTableConfigs.push($relProvider.config()
                                .setHName("common.register")
                                .setDName("registerVo.id")
                                .setDType("renderer")
                                .setHWidth("bold " + Rel_issueTableConfig.width)
                                .setHWidth("bold " + issueTableConfig.width)
                                .setDAlign("text-center")
                                .setDRenderer("REL_REGISTER"));
                            break;
                        case "PERIOD" : // 연관 이슈 기간
                            $scope.vm.relTableConfigs.push($tableProvider.config()
                        case "RELATION_PERIOD" : // 연관 이슈 기간
                            $scope.vm.relTableConfigs.push($relProvider.config()
                                .setHName("common.period")
                                .setDType("renderer")
                                .setHWidth("bold " + Rel_issueTableConfig.width)
                                .setHWidth("bold " + issueTableConfig.width)
                                .setDAlign("text-center")
                                .setDRenderer("REL_ISSUE_DUE_DATE"));
                            break;
                        case "MODIFY_DATE" : // 연관 이슈  최근 변경일
                            $scope.vm.relTableConfigs.push($tableProvider.config()
                        case "RELATION_MODIFY_DATE" : // 연관 이슈 최근 변경일
                            $scope.vm.relTableConfigs.push($relProvider.config()
                                .setHName("common.lastChangeDate")
                                .setHWidth("bold " + Rel_issueTableConfig.width)
                                .setHWidth("bold " + issueTableConfig.width)
                                .setDAlign("text-center")
                                .setDName("modifyDate"));
                            break;
                        case "REL_COMPANY" :   //  업체
                            $scope.vm.relTableConfigs.push($tableProvider.config()
                                .setHName("common.company")
                                .setDName("companyName")
                                .setDType("renderer")
                                .setHWidth("bold " + issueTableConfig.width)
                                .setDAlign("text-center")
                                .setDRenderer("REL_USE_COMPANY"));
                            break;
                        case "REL_ISP" :   //  ISP
                            $scope.vm.relTableConfigs.push($tableProvider.config()
                                .setHName("common.isp")
                                .setDName("ispName")
                                .setDType("renderer")
                                .setHWidth("bold " + issueTableConfig.width)
                                .setDAlign("text-center")
                                .setDRenderer("REL_USE_ISP"));
                            break;
                        case "REL_HOSTING" :   //  HOSTING
                            $scope.vm.relTableConfigs.push($tableProvider.config()
                                .setHName("common.hosting")
                                .setDName("hostingName")
                                .setDType("renderer")
                                .setHWidth("bold " + issueTableConfig.width)
                                .setDAlign("text-center")
                                .setDRenderer("REL_USE_HOSTING"));
                            break;
                    }
                    //  사용자 정의 필드 컬럼
                    if (Rel_issueTableConfig.key.indexOf("CUSTOM_FIELD_") !== -1) {
                    if (issueTableConfig.key.indexOf("CUSTOM_FIELD_") !== -1) {
                        //  만약 이슈 테이블 컬럼명이 표시되지 않으면 이쪽이 문제
                        for (var count in $scope.vm.customFields) {
                            var customField = $scope.vm.customFields[count];
                            if (customField.id === Number(Rel_issueTableConfig.key.substring(13))) {
                                $scope.vm.relTableConfigs.push($tableProvider.config()
                            if (customField.id === Number(issueTableConfig.key.substring(13))) {
                                $scope.vm.relTableConfigs.push($relProvider.config()
                                    .setHName(customField.name)
                                    .setDName("relCustomFieldName" + [count])
                                    .setDType("renderer")
                                    .setHWidth("bold " + Rel_issueTableConfig.width)
                                    .setHWidth("bold " + issueTableConfig.width)
                                    .setDAlign("text-center")
                                    .setColumnHint(customField)
                                    .setDRenderer("REL_ISSUE_CUSTOM_FIELD_VALUE_VIEW"));
@@ -336,92 +470,123 @@
                //  테이블의 하위 이슈 컬럼을 만들어준다.
                function setDownTableColumn(Down_issueTableConfig) {
                function setDownTableColumn(issueTableConfig) {
                    // if (issueTableConfig == null) return;
                    //  하위 이슈 컬럼
                    switch(Down_issueTableConfig.key) {
                        //  하위 이슈 제목
                        case "DOWN_ISSUE_TITLE" :
                            $scope.vm.downTableConfigs.push($tableProvider.config()
                    switch(issueTableConfig.key) {
                        case "DOWN_ISSUE_TITLE" :   //  하위 이슈 제목
                            $scope.vm.downTableConfigs.push($downProvider.config()
                                .setHName("issue.downIssueTitle")
                                .setDName("title")
                                .setDType("renderer")
                                .setHWidth("bold " + Down_issueTableConfig.width)
                                .setHWidth("bold " + issueTableConfig.width)
                                .setDAlign("text-center")
                                .setDRenderer("ISSUE_DOWN_MOVE"));
                            break;
                        case "ISSUE_DOWN_STATUS_TYPE" : //  이슈 상태
                            $scope.vm.downTableConfigs.push($tableProvider.config()
                        case "ISSUE_DOWN_STATUS_TYPE" : // 하위 이슈 상태
                            $scope.vm.downTableConfigs.push($downProvider.config()
                                .setHName("issue.issueStatus")
                                .setDName("issueStatusVo.id")
                                .setDType("renderer")
                                .setHWidth("bold " + Down_issueTableConfig.width)
                                .setHWidth("bold " + issueTableConfig.width)
                                .setDAlign("text-center")
                                .setDRenderer("ISSUE_DOWN_STATUS_TYPE"));
                            break;
                        case "PRIORITY" :   // 하위 이슈 우선순위
                            $scope.vm.downTableConfigs.push($tableProvider.config()
                        case "DOWN_PRIORITY" :   // 하위 이슈 우선순위
                            $scope.vm.downTableConfigs.push($downProvider.config()
                                .setHName("common.priority")
                                .setDName("priorityName")
                                .setDName("priorityVo.id")
                                .setDType("renderer")
                                .setHWidth("bold " + Down_issueTableConfig.width)
                                .setHWidth("bold " + issueTableConfig.width)
                                .setDAlign("text-center")
                                .setDRenderer("DOWN_COMMON_PRIORITY"));
                            break;
                        case "SEVERITY" :   //  중요도
                            $scope.vm.downTableConfigs.push($tableProvider.config()
                        case "DOWN_SEVERITY" :   // 하위 이슈 중요도
                            $scope.vm.downTableConfigs.push($downProvider.config()
                                .setHName("common.importance")
                                .setDName("severityName")
                                .setDName("severityVo.id")
                                .setDType("renderer")
                                .setHWidth("bold " + Down_issueTableConfig.width)
                                .setHWidth("bold " + issueTableConfig.width)
                                .setDAlign("text-center")
                                .setDRenderer("DOWN_COMMON_SEVERITY"));
                            break;
                        case "ASSIGNEE_TEAM" :   //  담당부서
                            $scope.vm.downTableConfigs.push($tableProvider.config()
                        case "DOWN_ASSIGNEE_TEAM" :   // 하위 이슈 담당부서
                            $scope.vm.downTableConfigs.push($downProvider.config()
                                .setHName("common.assigneeTeam")
                                .setDName("departmentVos.departmentName")
                                .setDType("renderer")
                                .setHWidth("bold " + Down_issueTableConfig.width)
                                .setHWidth("bold " + issueTableConfig.width)
                                .setDAlign("text-center")
                                .setDRenderer("DOWN_ISSUE_DEPARTMENT"));
                            break;
                        case "REGISTER" :   //  등록자
                            $scope.vm.downTableConfigs.push($tableProvider.config()
                        case "DOWN_REGISTER" :   // 하위 이슈 등록자
                            $scope.vm.downTableConfigs.push($downProvider.config()
                                .setHName("common.register")
                                .setDName("registerVo.id")
                                .setDType("renderer")
                                .setHWidth("bold " + Down_issueTableConfig.width)
                                .setHWidth("bold " + issueTableConfig.width)
                                .setDAlign("text-center")
                                .setDRenderer("DOWN_REGISTER"));
                            break;
                        case "PERIOD" : //  기간
                            $scope.vm.downTableConfigs.push($tableProvider.config()
                        case "DOWN_PERIOD" : // 하위 이슈 기간
                            $scope.vm.downTableConfigs.push($downProvider.config()
                                .setHName("common.period")
                                .setDType("renderer")
                                .setHWidth("bold " + Down_issueTableConfig.width)
                                .setHWidth("bold " + issueTableConfig.width)
                                .setDAlign("text-center")
                                .setDRenderer("DOWN_ISSUE_DUE_DATE"));
                            break;
                        case "MODIFY_DATE" : //  최근 변경일
                            $scope.vm.downTableConfigs.push($tableProvider.config()
                        case "DOWN_MODIFY_DATE" : // 하위 이슈 최근 변경일
                            $scope.vm.downTableConfigs.push($downProvider.config()
                                .setHName("common.lastChangeDate")
                                .setHWidth("bold " + Down_issueTableConfig.width)
                                .setHWidth("bold " + issueTableConfig.width)
                                .setDAlign("text-center")
                                .setDName("modifyDate"));
                            break;
                        case "DOWN_COMPANY" :   //  업체
                            $scope.vm.downTableConfigs.push($tableProvider.config()
                                .setHName("common.company")
                                .setDName("companyName")
                                .setDType("renderer")
                                .setHWidth("bold " + issueTableConfig.width)
                                .setDAlign("text-center")
                                .setDRenderer("DOWN_USE_COMPANY"));
                            break;
                        case "DOWN_ISP" :   //  ISP
                            $scope.vm.downTableConfigs.push($tableProvider.config()
                                .setHName("common.isp")
                                .setDName("ispName")
                                .setDType("renderer")
                                .setHWidth("bold " + issueTableConfig.width)
                                .setDAlign("text-center")
                                .setDRenderer("DOWN_USE_ISP"));
                            break;
                        case "DOWN_HOSTING" :   //  HOSTING
                            $scope.vm.downTableConfigs.push($tableProvider.config()
                                .setHName("common.hosting")
                                .setDName("hostingName")
                                .setDType("renderer")
                                .setHWidth("bold " + issueTableConfig.width)
                                .setDAlign("text-center")
                                .setDRenderer("DOWN_USE_HOSTING"));
                            break;
                    }
                    //  사용자 정의 필드 컬럼
                    if (Down_issueTableConfig.key.indexOf("CUSTOM_FIELD_") !== -1) {
                    if (issueTableConfig.key.indexOf("CUSTOM_FIELD_") !== -1) {
                        //  만약 이슈 테이블 컬럼명이 표시되지 않으면 이쪽이 문제
                        for (var count in $scope.vm.customFields) {
                            var customField = $scope.vm.customFields[count];
                            if (customField.id === Number(Down_issueTableConfig.key.substring(13))) {
                                $scope.vm.downTableConfigs.push($tableProvider.config()
                            if (customField.id === Number(issueTableConfig.key.substring(13))) {
                                $scope.vm.downTableConfigs.push($downProvider.config()
                                    .setHName(customField.name)
                                    .setDName("downCustomFieldName" + [count])
                                    .setDType("renderer")
                                    .setHWidth("bold " + Down_issueTableConfig.width)
                                    .setHWidth("bold " + issueTableConfig.width)
                                    .setDAlign("text-center")
                                    .setColumnHint(customField)
                                    .setDRenderer("DOWN_ISSUE_CUSTOM_FIELD_VALUE_VIEW"));
@@ -435,34 +600,39 @@
                //  연관 이슈 테이블 설정
                function makeRelTableConfigs() {
                    $scope.vm.relTableConfigs = [];
                    $scope.vm.relTableConfigs.push($tableProvider.config()
                    $scope.vm.relTableConfigs.push($relProvider.config()
                        .setDType("checkbox")
                        .setHWidth("width-20-p")
                        .setDAlign("text-center"))
                    $scope.vm.relTableConfigs.push($relProvider.config()
                        .setHName("issue.relationIssueType")
                        .setDType("renderer")
                        .setDAlign("text-center")
                        .setHWidth("width-30-p bold")
                        .setHWidth("width-60-p bold")
                        .setHSort(false)
                        .setDRenderer("ISSUE_RELATION_TYPE"))
                    $scope.vm.relTableConfigs.push($tableProvider.config()
                    $scope.vm.relTableConfigs.push($relProvider.config()
                        .setHName("issue.relationIssueTitle")
                        .setDType("renderer")
                        .setDAlign("text-center")
                        .setHWidth("width-60-p bold")
                        .setHSort(false)
                        .setDRenderer("ISSUE_RELATION_MOVE"))
                    $scope.vm.relTableConfigs.push($tableProvider.config()
                        .setHName("issue.relationIssueDelete")
                        .setDType("renderer")
                        .setDAlign("text-center")
                        .setHWidth("width-20-p bold")
                        .setDRenderer("ISSUE_RELATION_DELETE")
                        .setHSort(false)
                        .setDAlign("text-center"))
                    angular.forEach($scope.vm.relTableConfigs, function (Rel_issueTableConfig) {
                    /*if($scope.vm.viewer.modifyPermissionCheck) {
                        $scope.vm.relTableConfigs.push($relProvider.config()
                            .setHName("issue.relationIssueDelete")
                            .setDType("renderer")
                            .setDAlign("text-center")
                            .setHWidth("width-40-p bold")
                            .setDRenderer("ISSUE_RELATION_DELETE")
                            .setHSort(false)
                            .setDAlign("text-center"))
                    }*/
                    angular.forEach($scope.vm.relTableConfigs, function (issueTableConfig) {
                        //  표시 대상인 컬럼만 화면에 그려준다.
                        if (Rel_issueTableConfig.display) {
                        if (issueTableConfig.display) {
                            //  테이블의 컬럼을 만들어준다.
                            $scope.fn.setRelTableColumn(Rel_issueTableConfig);
                            $scope.fn.setRelTableColumn(issueTableConfig);
                        }
                    });
                }
@@ -470,27 +640,33 @@
                //  하위 이슈 테이블 설정
                function makeDownTableConfigs() {
                    $scope.vm.downTableConfigs = [];
                    $scope.vm.downTableConfigs.push($tableProvider.config()
                    $scope.vm.downTableConfigs.push($downProvider.config()
                        .setDType("checkbox")
                        .setHWidth("width-20-p")
                        .setDAlign("text-center"))
                    $scope.vm.downTableConfigs.push($downProvider.config()
                        .setHName("issue.downIssueTitle")
                        .setDType("renderer")
                        .setDAlign("text-center")
                        .setHWidth("width-60-p bold")
                        .setHSort(false)
                        .setDRenderer("ISSUE_DOWN_MOVE"))
                    $scope.vm.downTableConfigs.push($tableProvider.config()
                        .setHName("issue.relationIssueDelete")
                        .setDType("renderer")
                        .setDAlign("text-center")
                        .setHWidth("width-20-p bold")
                        .setDRenderer("ISSUE_DOWN_DELETE")
                        .setHSort(false)
                        .setDAlign("text-center"))
                    /*if($scope.vm.viewer.modifyPermissionCheck){
                        $scope.vm.downTableConfigs.push($downProvider.config()
                            .setHName("issue.relationIssueDelete")
                            .setDType("renderer")
                            .setDAlign("text-center")
                            .setHWidth("width-40-p bold")
                            .setDRenderer("ISSUE_DOWN_DELETE")
                            .setHSort(false)
                            .setDAlign("text-center"))
                    }*/
                    angular.forEach($scope.vm.downTableConfigs, function (Down_issueTableConfig) {
                    angular.forEach($scope.vm.downTableConfigs, function (issueTableConfig) {
                        //  표시 대상인 컬럼만 화면에 그려준다.
                        if (Down_issueTableConfig.display) {
                        if (issueTableConfig.display) {
                            //  테이블의 컬럼을 만들어준다.
                            $scope.fn.setDownTableColumn(Down_issueTableConfig);
                            $scope.fn.setDownTableColumn(issueTableConfig);
                        }
                    });
                }
@@ -503,47 +679,52 @@
                    }
                    var issueTableConfigs = issueTableConfigVo.issueTableConfigs;
                    //  연관 슈 목록 테이블 설정 값을 가져와서 적용한다.
                    //  연관 이슈 목록 테이블 설정 값을 가져와서 적용한다.
                    if ($rootScope.isDefined(issueTableConfigs)) {
                        //  이슈 테이블 설정 정보를 저장 한다.
                        $scope.vm.issueRelTableConfigs = [];
                        $scope.vm.issueRelTableConfigs = JSON.parse(issueTableConfigs);
                        $scope.vm.issueRelTableConfigs.sort(function (a, b) {
                            return a.position < b.position ? -1 : a.position > b.position ? 1 : 0;
                            return parseInt(a.position) < parseInt(b.position) ? -1 : parseInt(a.position) > parseInt(b.position) ? 1 : 0;
                        });
                        $scope.vm.relTableConfigs = [];
                        $scope.vm.relTableConfigs.push($tableProvider.config()
                            .setHName("issue.relationIssueType")
                            .setDType("renderer")
                            .setDAlign("text-center")
                            .setHWidth("width-30-p bold")
                            .setHSort(false)
                            .setDRenderer("ISSUE_RELATION_TYPE"))
                        $scope.vm.relTableConfigs.push($tableProvider.config()
                            .setHName("issue.relationIssueTitle")
                            .setDType("renderer")
                            .setDAlign("text-center")
                            .setHWidth("width-60-p bold")
                            .setHSort(false)
                            .setDRenderer("ISSUE_RELATION_MOVE"))
                        angular.forEach($scope.vm.issueRelTableConfigs, function (Rel_issueTableConfig) {
    /*                  $scope.vm.relTableConfigs.push($relProvider.config()
                           .setHName("issue.relationIssueType")
                           .setDType("renderer")
                           .setDAlign("text-center")
                           .setHWidth("width-30-p bold")
                           .setHSort(false)
                           .setDRenderer("ISSUE_RELATION_TYPE"))
                        $scope.vm.relTableConfigs.push($relProvider.config()
                           .setHName("issue.relationIssueTitle")
                           .setDType("renderer")
                           .setDAlign("text-center")
                           .setHWidth("width-60-p bold")
                           .setHSort(false)
                           .setDRenderer("ISSUE_RELATION_MOVE"))*/
                        $scope.vm.relTableConfigs.push($relProvider.config()
                            .setDType("checkbox")
                            .setHWidth("width-20-p")
                            .setDAlign("text-center"))
                        angular.forEach($scope.vm.issueRelTableConfigs, function (issueTableConfig) {
                            //  표시 대상인 컬럼만 화면에 그려준다.
                            if (Rel_issueTableConfig.display) {
                            if (issueTableConfig.display) {
                                //  테이블의 컬럼을 만들어준다.
                                $scope.fn.setRelTableColumn(Rel_issueTableConfig);
                                $scope.fn.setRelTableColumn(issueTableConfig);
                            }
                        });
                        $scope.vm.relTableConfigs.push($tableProvider.config()
                            .setHName("issue.relationIssueDelete")
                            .setDType("renderer")
                            .setHWidth("width-20-p bold")
                            .setDRenderer("ISSUE_RELATION_DELETE")
                            .setHSort(false)
                            .setDAlign("text-center"))
                        /*if($scope.vm.viewer.modifyPermissionCheck) {
                            $scope.vm.relTableConfigs.push($relProvider.config()
                                .setHName("issue.relationIssueDelete")
                                .setDType("renderer")
                                .setHWidth("width-40-p bold")
                                .setDRenderer("ISSUE_RELATION_DELETE")
                                .setHSort(false)
                                .setDAlign("text-center"))
                        }*/
                    } else {
                        makeRelTableConfigs();
                    }
@@ -555,37 +736,42 @@
                    if (issueTableConfigVo == null) return;
                    var issueTableConfigs = issueTableConfigVo.issueTableConfigs;
                    //  연관 슈 목록 테이블 설정 값을 가져와서 적용한다.
                    //  연관 이슈 목록 테이블 설정 값을 가져와서 적용한다.
                    if ($rootScope.isDefined(issueTableConfigs)) {
                        //  이슈 테이블 설정 정보를 저장 한다.
                        $scope.vm.issueDownTableConfigs = [];
                        $scope.vm.issueDownTableConfigs = JSON.parse(issueTableConfigs);
                        $scope.vm.issueDownTableConfigs.sort(function (a, b) {
                            return a.position < b.position ? -1 : a.position > b.position ? 1 : 0;
                            return parseInt(a.position) < parseInt(b.position) ? -1 : parseInt(a.position) > parseInt(b.position) ? 1 : 0;
                        });
                        $scope.vm.downTableConfigs = [];
                        $scope.vm.downTableConfigs.push($tableProvider.config()
/*                      $scope.vm.downTableConfigs.push($downProvider.config()
                            .setHName("issue.downIssueTitle")
                            .setDType("renderer")
                            .setDAlign("text-center")
                            .setHWidth("width-60-p bold")
                            .setHSort(false)
                            .setDRenderer("ISSUE_DOWN_MOVE"))
                        angular.forEach($scope.vm.issueDownTableConfigs, function (Down_issueTableConfig) {
                            .setDRenderer("ISSUE_DOWN_MOVE"))*/
                        $scope.vm.downTableConfigs.push($downProvider.config()
                            .setDType("checkbox")
                            .setHWidth("width-20-p")
                            .setDAlign("text-center"))
                        angular.forEach($scope.vm.issueDownTableConfigs, function (issueTableConfig) {
                            //  표시 대상인 컬럼만 화면에 그려준다.
                            if (Down_issueTableConfig.display) {
                            if (issueTableConfig.display) {
                                //  테이블의 컬럼을 만들어준다.
                                $scope.fn.setDownTableColumn(Down_issueTableConfig);
                                $scope.fn.setDownTableColumn(issueTableConfig);
                            }
                        });
                        $scope.vm.downTableConfigs.push($tableProvider.config()
                            .setHName("issue.relationIssueDelete")
                            .setDType("renderer")
                            .setHWidth("width-20-p bold")
                            .setDRenderer("ISSUE_DOWN_DELETE")
                            .setHSort(false)
                            .setDAlign("text-center"))
                        /*if($scope.vm.viewer.modifyPermissionCheck) {
                            $scope.vm.downTableConfigs.push($downProvider.config()
                                .setHName("issue.relationIssueDelete")
                                .setDType("renderer")
                                .setHWidth("width-40-p bold")
                                .setDRenderer("ISSUE_DOWN_DELETE")
                                .setHSort(false)
                                .setDAlign("text-center"))
                        }*/
                    } else {
                        makeDownTableConfigs();
                    }
@@ -611,7 +797,7 @@
                        $resourceProvider.getPageContent(0, 10))).then(function (result) {
                        if (result.data.message.status === "success") {
                            $scope.fn.getIssueDetail();
                            $scope.fn.getIssueDetail(0,0);
                        }
                        else {
                            SweetAlert.error($filter("translate")("issue.failedToIssueAddIssueRelation"), result.data.message.message); // "연관일감 생성 실패"
@@ -627,23 +813,50 @@
                        return;
                    }
                    var contents = {
                        issueId : $rootScope.currentDetailIssueId,
                        id : $scope.vm.form.issuesDown[0].id,
                        parentIssueId : $rootScope.currentDetailIssueId
                    };
                    let inheritYn = false;
                    if ($scope.vm.inheritPartners) {
                        SweetAlert.swal({
                                title : $filter("translate")("issue.addDownIssue"), // 하위 이슈 추가
                                text : $filter("translate")("issue.wantToInheritPartnersOfParentIssue"), // 상위이슈의 파트너 정보(업체/ISP/호스팅)를 적용시키겠습니까?
                                type : "warning",
                                showCancelButton : true,
                                confirmButtonColor : "#DD6B55",
                                confirmButtonText : $filter("translate")("common.ok"), // 네
                                cancelButtonText : $filter("translate")("common.no"), // 아니오
                                closeOnConfirm : false,
                                closeOnCancel : false
                            },
                            function (isConfirm) {
                                if (isConfirm) {
                                    inheritYn = true;
                                }
                    Issue.modifyParentIssue($resourceProvider.getContent(
                        contents,
                        $resourceProvider.getPageContent(0, 10))).then(function (result) {
                                var ids = [];
                                if ($scope.vm.form.issuesDown[0].id != null) {
                                    ids.push($scope.vm.form.issuesDown[0].id);
                                }
                        if (result.data.message.status === "success") {
                            $scope.fn.getIssueDetail();
                        }
                        else {
                            SweetAlert.error($filter("translate")("issue.failedToIssueAddIssueDown"), result.data.message.message); // "연관일감 생성 실패"
                        }
                    });
                                var contents = {
                                    issueId : $rootScope.currentDetailIssueId,
                                    ids : ids,
                                    parentIssueId : $rootScope.currentDetailIssueId,
                                    inheritYn : inheritYn
                                };
                                Issue.modifyParentIssue($resourceProvider.getContent(
                                    contents,
                                    $resourceProvider.getPageContent(0, 10))).then(function (result) {
                                    if (result.data.message.status === "success") {
                                        SweetAlert.close();
                                        $scope.fn.getIssueDetail(0,0);
                                    }
                                    else {
                                        SweetAlert.error($filter("translate")("issue.failedToIssueAddIssueDown"), result.data.message.message); // "하위이슈 생성 실패"
                                    }
                                });
                            });
                    }
                }
                 // 이슈명을 클릭하면 이슈 상세 정보를 조회한다.
@@ -657,14 +870,14 @@
                //     $scope.vm.viewer.id = args["id"];
                //     $scope.fn.getIssueDetail();
                // });
                // 이메일 보낸후 상세화면 갱신
                //  $rootScope.$on("getIssueDetail", function (event, args) {
                //      $scope.fn.getIssueDetail();
                //  });
                $scope.$on("getIssueDetail", function (event, args) {
                    $scope.fn.getIssueDetail();
                    $scope.fn.getIssueDetail(0,0);
                });
                $scope.$watch(function() {
@@ -672,7 +885,7 @@
                }, function() {
                    if ($rootScope.currentDetailIssueId != null) {
                        $scope.vm.viewer.id = $rootScope.currentDetailIssueId;
                        $scope.fn.getIssueDetail();
                        $scope.fn.getIssueDetail(0,0);
                    }
                }, true);
@@ -698,7 +911,8 @@
                            parameter : function () {
                                return {
                                    issueIds : [$scope.vm.viewer.id],
                                    projectId : $scope.vm.viewer.projectVo.id
                                    projectId : $scope.vm.viewer.projectVo.id,
                                    downIssuesStatus : $scope.vm.form.issuesDownStatus
                                };
                            }
                        }
@@ -706,6 +920,20 @@
                }
                function modifyDownIssueStatus() {
                    var issueIds = [];
                    angular.forEach($scope.vm.viewer.issueDownVos, function (data) {
                        if (data.checked) {
                            issueIds.push(data.id);
                            //$scope.vm.projectId = data.projectId;
                        }
                    });
                    if (issueIds.length < 1) {
                        SweetAlert.warning($filter("translate")("issue.selectionCheck"), $filter("translate")("issue.selectIssueToChangeStatus")); // 선택 대상 확인, 상태 변경할 이슈를 선택하세요.
                        return;
                    }
                    $uibModal.open({
                        templateUrl : 'views/issue/downIssueModifyStatus.html',
                        size : "md",
@@ -716,7 +944,8 @@
                                return {
                                    issueTypeId : $scope.vm.viewer.issueTypeVo.id,
                                    issueIds : [$scope.vm.viewer.id],
                                    downIssues : $scope.vm.viewer.issueDownVos,
                                    //downIssues : $scope.vm.viewer.issueDownVos,
                                    downIssues : issueIds,
                                    projectId : $scope.vm.viewer.projectVo.id
                                };
                            }
@@ -776,7 +1005,6 @@
                            parameter : function () {
                                return {
                                    issueTypeId : $scope.vm.viewer.issueTypeVo.id
                                };
                            }
                        }
@@ -844,21 +1072,74 @@
                    return result;
                }
                function getSubPageContent(relPage, relPageSize, downPage, downPageSize) {
                    return {
                        relPage: relPage,
                        relPageSize: relPageSize,
                        downPage: downPage,
                        downPageSize: downPageSize
                    };
                }
                //  이슈 상세 정보 조회
                function getIssueDetail() {
                function getIssueDetail(selectedRelPage, selectedDownPage) {
                    $rootScope.spinner = true;
                    if (selectedRelPage < 0) {
                        selectedRelPage = 0;
                    }
                    if (selectedDownPage < 0) {
                        selectedDownPage = 0;
                    }
                    //  현재 페이지 정보
                    var currentRelPage = 0;
                    var currentDownPage = 0;
                    //  쿠키에 선택한 페이지 정보가 없으면 기본 페이지 정보 0 을 저장
                    if (angular.isUndefined(selectedRelPage) || selectedRelPage === "") {
                        currentRelPage = $scope.vm.page.selectedRelPage;
                    }
                    else {
                        currentRelPage = selectedRelPage;
                    }
                    if (angular.isUndefined(selectedDownPage) || selectedDownPage === "") {
                        currentDownPage = $scope.vm.page.selectedDownPage;
                    }
                    else {
                        currentDownPage = selectedDownPage;
                    }
                    //  초기화 해야할 할목을 지정하여 다른 이슈를 클릭할 때 초기화해준다.
                    $scope.fn.initReload();
                    // $scope.fn.getRelTableConfigs();
                    // $scope.fn.getDownTableConfigs();
                        Issue.detail($resourceProvider.getContent(
                        {id : $scope.vm.viewer.id, deep : "02"},
                        $resourceProvider.getPageContent(0, 1))).then(function (result) {
                    var pageContent = $scope.fn.getSubPageContent(currentRelPage, $scope.vm.subPage.selectedRelPageRowCount
                        , currentDownPage, $scope.vm.subPage.selectedDownPageRowCount);
                    var content = $resourceProvider.getContent(
                        {
                            id : $scope.vm.viewer.id
                            , issueTypeId : (function () {
                                var id = "";
                                if ($rootScope.allIssueList) {
                                    id = -1;
                                } else {
                                    id = $rootScope.getCurrentIssueTypeId();
                                }
                                return id;
                            })()
                            , deep : "02", pageContent
                        }, null);
                    Issue.detail(content).then(function (result) {
                        if (result.data.message.status === "success") {
                            if (angular.isDefined(result.data.data)) {
                                $scope.vm.subPage.selectedRelPage = currentRelPage + 1;
                                $scope.vm.subPage.selectedDownPage = currentDownPage + 1;
                                $scope.vm.responseData = result.data.data;
                                $scope.vm.viewer = angular.copy(result.data.data);
                                //  이슈 이미지 미리 보기 만들기
@@ -866,8 +1147,14 @@
                                //  활동 이력 만들기
                                $scope.fn.makeActiveHistory();
                                if ($rootScope.isDefined($scope.vm.viewer.parentIssueVo)) {
                                    $scope.vm.parentIssueId = $scope.vm.viewer.parentIssueVo.id;
                                }
                                $scope.vm.viewer.startDate = result.data.data.startDate == null ? "common.unspecified" : result.data.data.startDate; // 미지정
                                $scope.vm.viewer.completeDate = result.data.data.completeDate == null ? "common.unspecified" : result.data.data.completeDate; // 미지정
                                $scope.vm.rangeDate = result.data.data.startDate + "~" + result.data.data.completeDate
                                //  이슈 유형에 연결된 사용자 정의 필드 정보를 입력 폼에서 사용할 수 있게 가공한다.
                                $scope.fn.setFormByIssueTypeCustomFields(result.data.data.issueTypeCustomFieldVos);
@@ -879,6 +1166,7 @@
                                $scope.vm.form.issues = [];
                                $scope.vm.form.issues.push(result.data.data);
                                $scope.vm.form.issuesDown = [];
                                $scope.vm.form.issuesDownStatus = [];// 하위이슈 상태
                                $scope.vm.form.issuesDown.push(result.data.data);
                                var issueTableConfigVos = result.data.data.issueTableConfigVos;
@@ -891,6 +1179,9 @@
                                        issueRelationVo.relationIssueTypeName = $scope.vm.relationIssueTypes[issueRelationVo.relationIssueType].name;
                                        $scope.vm.form.issues.push(issueRelationVo.issueRelation);
                                    });
                                    result.data.data.issueRelationVos.sort(function (a, b) {   //최근변경일 내림차순
                                        return a.modifyDate > b.modifyDate ? -1 : a.modifyDate < b.modifyDate ? 1 : 0;
                                    });
                                }
                                // 하위 이슈 반목문
@@ -898,20 +1189,27 @@
                                    angular.forEach(result.data.data.issueDownVos, function (issueDownVo){
                                        //$scope.vm.form.issuesDown.push(issueDownVo.issueDown);
                                        $scope.vm.form.issuesDown.push(issueDownVo);
                                        $scope.vm.form.issuesDownStatus.push(issueDownVo.issueStatusVo.issueStatusType);
                                    });
                                    result.data.data.issueDownVos.sort(function (a, b) {   //최근변경일 내림차순
                                        return a.modifyDate > b.modifyDate ? -1 : a.modifyDate < b.modifyDate ? 1 : 0;
                                    });
                                }
                                $scope.vm.viewer.issueRelationVos = result.data.data.issueRelationVos;
                                $scope.vm.viewer.issueDownVos = result.data.data.issueDownVos;
                                if ($rootScope.workProject.id > -1 && result.data.data.projectVo !== null) {
                                    $rootScope.changeLastProject(result.data.data.projectVo.id);
                                    $rootScope.changeLastProject(result.data.data.projectVo.id, false, false);
                                }
                                $scope.vm.inheritPartners = result.data.data.issueTypeVo.inheritPartners;
                                $scope.vm.downTotalCount = result.data.data.downTotalCount;
                            }
                        }
                        else {
                            SweetAlert.swal($filter("translate")("issue.errorIssueDetails"), result.data.message.message, "error"); // 이슈 상세 정보 조회 오류
                        }
                        $rootScope.spinner = false;
                    });
                }
@@ -989,8 +1287,121 @@
                //  활동 이력 만들기
                function makeActiveHistory() {
                    $scope.vm.viewer.activeHistory = $scope.vm.viewer.issueCommentVos.concat($scope.vm.viewer.issueHistoryVos);
                    $scope.vm.viewer.activeHistory.sort(function (a, b) {
                    $scope.vm.viewer.activeParentHistory = [];
                    $scope.vm.viewer.activeHistory = [];
                    $scope.vm.viewer.activeParentMailHistory = [];
                    $scope.vm.viewer.activeAllMailAndReplyHistory = []; //상위+하위 메일,댓글 히스토리
                    var oriMailHistory = [];
                    var oriCommentHistory = [];
                    if ($scope.vm.viewer.issueHistoryVos != null && $scope.vm.viewer.issueHistoryVos.length > 0) {
                        //  상위이슈 메일 히스토리
                        for (var i=0; i<$scope.vm.viewer.issueHistoryVos.length; i++) {
                            if ($scope.vm.viewer.issueHistoryVos[i].issueHistoryType === "SEND") {
                                oriMailHistory.push($scope.vm.viewer.issueHistoryVos[i]);
                            }
                        }
                        //$scope.vm.viewer.activeParentMailHistory = angular.copy(oriMailHistory);
                    }
                    //  상위이슈 댓글 히스토리
                    if ($scope.vm.viewer.issueCommentVos != null && $scope.vm.viewer.issueCommentVos.length > 0) {
                        for (var i=0; i<$scope.vm.viewer.issueCommentVos.length; i++) {
                            oriCommentHistory.push($scope.vm.viewer.issueCommentVos[i]);
                        }
                    }
                    $scope.vm.viewer.activeAllMailAndReplyHistory = oriMailHistory.concat(oriCommentHistory);
                    //  하위이슈 히스토리
                    if ($scope.vm.viewer.issueDownVos != null && $scope.vm.viewer.issueDownVos.length > 0) {
                        $scope.vm.viewer.activeDownHistory = []; //하위이슈 히스토리만
                        $scope.vm.viewer.downComment = []; //하위이슈 댓글만
                        $scope.vm.viewer.activeDownAllHistory = []; //하위이슈 히스토리+댓글
                        $scope.vm.viewer.activeDownMailAndReplyHistory = []; //하위 메일+댓글 히스토리
                        var downTitle = "";
                        var oriDownHistory = [];
                        var oriDownCommentHistory = [];
                        var oriDownMailHistory = [];
                        // 하위이슈 히스토리
                        for (var i=0; i<$scope.vm.viewer.issueDownVos.length; i++){
                            oriDownHistory.push($scope.vm.viewer.issueDownVos[i].issueHistoryVos);
                            //  하위이슈 메일 기록
                            for (var j=0; j<$scope.vm.viewer.issueDownVos[i].issueHistoryVos.length; j++) {
                                if($scope.vm.viewer.issueDownVos[i].issueHistoryVos[j].issueHistoryType === "SEND") {
                                    oriDownMailHistory.push($scope.vm.viewer.issueDownVos[i].issueHistoryVos[j]);
                                }
                            }
                            //  하위이슈 댓글 기록
                            for (var k=0; k<$scope.vm.viewer.issueDownVos[i].issueCommentVos.length; k++) {
                                oriDownCommentHistory.push($scope.vm.viewer.issueDownVos[i].issueCommentVos[k]);
                            }
                        }
                        //  하위이슈 메일+댓글 저장
                        $scope.vm.viewer.activeDownMailAndReplyHistory = oriDownCommentHistory.concat(oriDownMailHistory);
                        for (var i=0; i<$scope.vm.viewer.activeDownMailAndReplyHistory.length; i++){
                            downTitle = "<div class='dot' style='margin-bottom: -8px'>*하위이슈 : "+$scope.vm.viewer.activeDownMailAndReplyHistory[i].title+"</div>";
                            $scope.vm.viewer.activeDownMailAndReplyHistory[i].desc = downTitle + $scope.vm.viewer.activeDownMailAndReplyHistory[i].description;
                        }
                        $scope.vm.viewer.activeDownMailAndReplyHistory.sort(function (a, b) {   //"MAIL_AND_REPLY_DOWN" 내림차순
                            return a.registerDate > b.registerDate ? -1 : a.registerDate < b.registerDate ? 1 : 0;
                        });
                        for (var i=0; i<oriDownHistory.length; i++){
                            if ($scope.vm.viewer.activeDownHistory === "") {
                                $scope.vm.viewer.activeDownHistory = oriDownHistory[i];
                            } else {
                                $scope.vm.viewer.activeDownHistory = $scope.vm.viewer.activeDownHistory.concat(oriDownHistory[i]);
                            }
                        }
                        for (var i=0; i<$scope.vm.viewer.activeDownHistory.length; i++){
                            downTitle = "<div class='dot' style='margin-bottom: -8px'>*하위이슈 : "+$scope.vm.viewer.activeDownHistory[i].title+"</div>";
                            $scope.vm.viewer.activeDownHistory[i].desc = downTitle + $scope.vm.viewer.activeDownHistory[i].description;
                        }
                        $scope.vm.viewer.activeDownHistory.sort(function (a, b) {   //내림차순
                            return a.registerDate > b.registerDate ? -1 : a.registerDate < b.registerDate ? 1 : 0;
                        });
                        // 하위이슈 댓글 히스토리
                        for (var i=0; i<oriDownCommentHistory.length; i++) {
                           if ($scope.vm.viewer.downComment === "") {
                               $scope.vm.viewer.downComment = oriDownCommentHistory[i];
                           } else {
                               $scope.vm.viewer.downComment = $scope.vm.viewer.downComment.concat(oriDownCommentHistory[i]);
                           }
                        }
                        $scope.vm.viewer.issueDownVos.sort(function (a, b) {   //내림차순
                            return a.registerDate > b.registerDate ? -1 : a.registerDate < b.registerDate ? 1 : 0;
                        });
                        $scope.vm.viewer.activeDownAllHistory = $scope.vm.viewer.downComment.concat($scope.vm.viewer.activeDownHistory);
                        $scope.vm.viewer.activeDownAllHistory.sort(function (a, b) {   //"RECODE_DOWN" 내림차순
                            return a.registerDate > b.registerDate ? -1 : a.registerDate < b.registerDate ? 1 : 0;
                        });
                        $scope.vm.viewer.activeParentHistory = $scope.vm.viewer.issueCommentVos.concat($scope.vm.viewer.issueHistoryVos);
                        $scope.vm.viewer.activeHistory = $scope.vm.viewer.activeParentHistory.concat($scope.vm.viewer.activeDownAllHistory);
                        $scope.vm.viewer.activeAllMailAndReplyHistory = $scope.vm.viewer.activeAllMailAndReplyHistory.concat($scope.vm.viewer.activeDownMailAndReplyHistory);
                    }else {
                        $scope.vm.viewer.activeParentHistory = $scope.vm.viewer.issueCommentVos.concat($scope.vm.viewer.issueHistoryVos);
                        $scope.vm.viewer.activeHistory = $scope.vm.viewer.issueCommentVos.concat($scope.vm.viewer.issueHistoryVos);
                    }
                    $scope.vm.viewer.activeHistory.sort(function (a, b) {   //"ALL" 내림차순
                        return a.registerDate > b.registerDate ? -1 : a.registerDate < b.registerDate ? 1 : 0;
                    });
                    $scope.vm.viewer.activeParentHistory.sort(function (a, b) {   //"RECODE" 내림차순
                        return a.registerDate > b.registerDate ? -1 : a.registerDate < b.registerDate ? 1 : 0;
                    });
                    $scope.vm.viewer.activeAllMailAndReplyHistory.sort(function (a, b) {   //"MAIL_AND_REPLY" 내림차순
                        return a.registerDate > b.registerDate ? -1 : a.registerDate < b.registerDate ? 1 : 0;
                    });
                }
@@ -1044,7 +1455,6 @@
                                        $timeout(function () {
                                            SweetAlert.success($filter("translate")("common.deleteSucceeded"), result.data.message.message); // 삭제 성공
                                        }, 100);
                                        $scope.fn.getCommentList();
                                    }
                                    else {
@@ -1067,6 +1477,7 @@
                        if (result.data.message.status === "success") {
                            $scope.vm.viewer.issueCommentVos = result.data.data;
                            $scope.fn.updateActiveHistory();
                        }
                        else {
                            SweetAlert.swal({
@@ -1124,17 +1535,59 @@
                    });
                }
                function getParametersAll() {
                    var params = $scope.fn.getParameters(null, $scope.vm.viewer.issueCompanyVos);
                    params = $scope.fn.getParameters(params, $scope.vm.viewer.issueIspVos);
                    params = $scope.fn.getParameters(params, $scope.vm.viewer.issueHostingVos);
                // 일반 메일 발송 (사용자 직접 작성)
                function sendCommonMail() {
                    $uibModal.open({
                        templateUrl : 'views/issue/issueCommonSendMail.html',
                        size : "md",
                        controller : 'issueCommonSendMailController',
                        backdrop : 'static',
                        resolve : {
                            parameter : {
                                issueId : $scope.vm.viewer.id,
                            }
                        }
                    });
                }
                    if (params != null && params.length > 0) {
                        for (let i = 0; i < params.length; i++) {
                            params[i].id = i;
                function getParametersAll() {
                    var params = [];
                    if ($scope.vm.viewer.issueCompanyVos != null && $scope.vm.viewer.issueCompanyVos.length > 0) {
                        var issueCompany = $scope.fn.getParameters(params, $scope.vm.viewer.issueCompanyVos);
                        if (issueCompany != null && issueCompany.length > 0) {
                            angular.forEach(issueCompany, function (data) {
                                params.push(data);
                            });
                        }
                    }
                    return params;
                    if ($scope.vm.viewer.issueIspVos != null && $scope.vm.viewer.issueIspVos.length > 0) {
                        var issueIsp = $scope.fn.getParameters(params, $scope.vm.viewer.issueIspVos)
                        if (issueIsp != null && issueIsp.length > 0) {
                            angular.forEach(issueIsp, function (data) {
                                params.push(data);
                            });
                        }
                    }
                    if ($scope.vm.viewer.issueHostingVos != null && $scope.vm.viewer.issueHostingVos.length > 0) {
                        var issueHosting = $scope.fn.getParameters(params, $scope.vm.viewer.issueHostingVos);
                        if (issueHosting != null && issueHosting.length > 0) {
                            angular.forEach(issueHosting, function (data) {
                                params.push(data);
                            });
                        }
                    }
                    if (params != null && params.length > 0) {
                        var filterData = params.filter(function(item, idx){
                            return params.findIndex(function(item2, idx2){
                                return item.email === item2.email
                            }) == idx;
                        });
                        for (let i = 0; i < filterData.length; i++) {
                            filterData[i].id = i;
                        }
                    }
                    return filterData;
                }
                function getParameters(sourceArr, partnerVos) {