OWL ITS + 탐지시스템(인터넷 진흥원)
wyu
2021-11-23 e35b0c987bac49abbb77d4b31e41270cc566e54d
이슈 상세 연관,하위 테이블 표시 설정 - [프론트]
12개 파일 변경됨
463 ■■■■ 파일 변경됨
src/main/java/kr/wisestone/owl/domain/enumType/IssueModifyType.java 3 ●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/service/impl/IssueServiceImpl.java 5 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/service/impl/IssueTableConfigServiceImpl.java 14 ●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/vo/IssueVo.java 20 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/web/controller/IssueTableConfigController.java 9 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/custom_components/js-table/tableColumnGenerator.directive.js 5 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/scripts/app/issue/issueAddDownTableConfig.controller.js 14 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/scripts/app/issue/issueAddRelationTableConfig.controller.js 44 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/scripts/app/issue/issueAddTableConfig.controller.js 41 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/scripts/app/issue/issueDetail.controller.js 284 ●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/scripts/app/issue/issueList.controller.js 22 ●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/views/issue/issueListNormal.html 2 ●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/domain/enumType/IssueModifyType.java
@@ -12,7 +12,8 @@
    ISSUE_STATUS,
    ISSUE_TYPE,
    PERIOD,
    ASSIGNEE,
//    ASSIGNEE,
    ASSIGNEE_TEAM,
    CUSTOM_FIELD,
    TITLE,
    DESCRIPTION
src/main/java/kr/wisestone/owl/service/impl/IssueServiceImpl.java
@@ -54,6 +54,9 @@
    private IssueRepository issueRepository;
    @Autowired
    private IssueTableConfigService issueTableConfigService;
    @Autowired
    private ProjectService projectService;
    @Autowired
@@ -859,8 +862,10 @@
        this.setIssueIspField(issue, issueVo);  //ISP 정보 세팅
        this.setIssueHostingField(issue, issueVo);  //HOSTING 정보 세팅
        this.setParentIssue(issue,issueVo); //상위 이슈 정보 세팅
    }
    //  상위일감 정보 추가
    private void setParentIssue(Issue issue, IssueVo issueVo) {
        if(issue.getParentIssue() != null){
src/main/java/kr/wisestone/owl/service/impl/IssueTableConfigServiceImpl.java
@@ -113,10 +113,9 @@
    private void detailMultipleCode(Map<String, Object> resJsonData, Long issueId, int issueTableType) {
        //  해당 업무 공간에서 사용자의 이슈 검색 조건을 조회한다.
        IssueTableConfig issueTableConfig = this.findByUserIdAndWorkspaceIdAndIssueIdAndIssueTableType(issueId, issueTableType);
        IssueTableConfig saveIssueTableType = this.findByIssueIdAndIssueTableType(issueId,issueTableType);
        if (issueTableConfig != null) {
            resJsonData.put(Constants.RES_KEY_CONTENTS, saveIssueTableType.getIssueTableConfigs());
            resJsonData.put(Constants.RES_KEY_CONTENTS, issueTableConfig.getIssueTableConfigs());
        }
        else {
            resJsonData.put(Constants.RES_KEY_CONTENTS, "");
@@ -129,7 +128,15 @@
    public void detailIssueTableConfig(Map<String, Object> resJsonData) {
        issueId = (long) -1;
        issueTableType = 1;
        this.detailMultipleCode(resJsonData, issueId, issueTableType);
        //  해당 업무 공간에서 사용자의 이슈 검색 조건을 조회한다.
        IssueTableConfig issueTableConfig = this.findByUserIdAndWorkspaceIdAndIssueIdAndIssueTableType(issueId, issueTableType);
        if (issueTableConfig != null) {
            resJsonData.put(Constants.RES_KEY_CONTENTS, issueTableConfig.getIssueTableConfigs());
        }
        else {
            resJsonData.put(Constants.RES_KEY_CONTENTS, "");
        }
    }
    //  저장된 연관 이슈 테이블 설정 조회
    @Override
@@ -147,4 +154,5 @@
    }
}
src/main/java/kr/wisestone/owl/vo/IssueVo.java
@@ -1,6 +1,7 @@
package kr.wisestone.owl.vo;
import com.google.common.collect.Lists;
import kr.wisestone.owl.domain.IssueTableConfig;
import java.util.ArrayList;
import java.util.List;
@@ -56,6 +57,9 @@
    private List<IssueCompanyVo> issueCompanyVos;
    private List<IssueIspVo> issueIspVos;
    private List<IssueHostingVo> issueHostingVos;
    private IssueTableConfig issueRelTableConfig;
    private IssueTableConfig issueDownTableConfig;
    public IssueVo(){}
@@ -426,4 +430,20 @@
    public void setParentIssueVo(IssueVo parentIssueVo) {
        this.parentIssueVo = parentIssueVo;
    }
    public IssueTableConfig getIssueRelTableConfig() {
        return issueRelTableConfig;
    }
    public void setIssueRelTableConfig(IssueTableConfig issueRelTableConfig) {
        this.issueRelTableConfig = issueRelTableConfig;
    }
    public IssueTableConfig getIssueDownTableConfig() {
        return issueDownTableConfig;
    }
    public void setIssueDownTableConfig(IssueTableConfig issueDownTableConfig) {
        this.issueDownTableConfig = issueDownTableConfig;
    }
}
src/main/java/kr/wisestone/owl/web/controller/IssueTableConfigController.java
@@ -63,6 +63,7 @@
    @ResponseBody
    Map<String, Object> detail() {
        Map<String, Object> resJsonData = new HashMap<>();
        this.issueTableConfigService.detailIssueTableConfig(resJsonData);
        return this.setSuccessMessage(resJsonData);
@@ -72,9 +73,9 @@
    @RequestMapping(value = "/issueTableConfig/relationDetail", produces = MediaType.APPLICATION_JSON_VALUE)
    public
    @ResponseBody
    Map<String, Object> relationDetail(@RequestBody Map<String, Object> params) {
    Map<String, Object> relationDetail(@RequestBody Map<String, Map<String, Object>> params) {
        Map<String, Object> resJsonData = new HashMap<>();
        this.issueTableConfigService.detailRelationIssueTableConfig(params,resJsonData);
        this.issueTableConfigService.detailRelationIssueTableConfig(params.get(Constants.REQ_KEY_CONTENT), resJsonData);
        return this.setSuccessMessage(resJsonData);
    }
@@ -83,9 +84,9 @@
    @RequestMapping(value = "/issueTableConfig/downDetail", produces = MediaType.APPLICATION_JSON_VALUE)
    public
    @ResponseBody
    Map<String, Object> downDetail(@RequestBody Map<String, Object> params) {
    Map<String, Object> downDetail(@RequestBody Map<String, Map<String, Object>> params) {
        Map<String, Object> resJsonData = new HashMap<>();
        this.issueTableConfigService.detailDownIssueTableConfig(params,resJsonData);
        this.issueTableConfigService.detailDownIssueTableConfig(params.get(Constants.REQ_KEY_CONTENT),resJsonData);
        return this.setSuccessMessage(resJsonData);
    }
src/main/webapp/custom_components/js-table/tableColumnGenerator.directive.js
@@ -266,6 +266,11 @@
                                            makeTag += '<div owl-profile-over class="" table-user-image="data" target="userVos"></div>';
                                            break;
                                        // case "ISSUE_DEPARTMENT" :
                                        //     scope.data.registsrVos = [scope.data.registerVo];
                                        //     makeTag += '<div owl-profile-over class="" table-user-image="data" target="departmentVos"></div>';
                                        //     break;
                                        case "REGISTER" :
                                            scope.data.registsrVos = [scope.data.registerVo];
                                            makeTag += '<div owl-profile-over class="" table-user-image="data" target="registsrVos"></div>';
src/main/webapp/scripts/app/issue/issueAddDownTableConfig.controller.js
@@ -17,7 +17,7 @@
                    formSubmit : formSubmit,    //  폼 전송
                    formCheck : formCheck,  //  폼 체크
                    getCustomFields : getCustomFields,   //  사용자 정의 필드 목록을 가져온다.
                    getIssueTableConfigs : getIssueTableConfigs //  이슈 목록 테이블 설정 정보를 가져온다.
                    getDownIssueTableConfigs : getDownIssueTableConfigs //  이슈 목록 테이블 설정 정보를 가져온다.
                };
                //  변수 모음
@@ -48,8 +48,8 @@
                        position : 4,
                        display : true
                    }, {
                        name : $filter("translate")("common.assignee"), // 담당자
                        key : "ASSIGNEE",
                        name : $filter("translate")("common.assigneeTeam"), // 담당부서
                        key : "ASSIGNEE_TEAM",
                        width : "width-100-p",
                        position : 5,
                        display : true
@@ -100,7 +100,9 @@
                        if (result.data.message.status === "success") {
                            SweetAlert.success($filter("translate")("issue.completedSavingIssueTable"), $filter("translate")("issue.saveIssueTableSettingsInformation")); // "이슈 테이블 설정 저장 완료", "이슈 테이블 설정 정보가 저장되었습니다."
                            //  변경된 이슈 테이블 정보를 이슈 목록 테이블에 갱신한다.
                            $rootScope.$broadcast("getIssueTableConfigs", {});
                            $rootScope.$broadcast("getDownIssueTableConfigs", {});
                            swal.close();
                            $scope.fn.cancel();
                        }
                        else {
                            SweetAlert.error($filter("translate")("issue.failedToSaveIssueTableSetting"), result.data.message.message); // 이슈 테이블 설정 저장 실패
@@ -135,7 +137,7 @@
                }
                //  이슈 목록 테이블 설정 정보를 가져온다.
                function getIssueTableConfigs() {
                function getDownIssueTableConfigs() {
                    var deferred = $q.defer();
                    var content = {
                        issueId : $rootScope.currentDetailIssueId,
@@ -170,7 +172,7 @@
                    });
                    //  이슈 목록 테이블 설정 정보를 가져온다.
                    $scope.fn.getIssueTableConfigs().then(function (issueTableConfigs) {
                    $scope.fn.getDownIssueTableConfigs().then(function (issueTableConfigs) {
                        if ($rootScope.isDefined(issueTableConfigs)) {
                            $rootScope.spinner = true;
src/main/webapp/scripts/app/issue/issueAddRelationTableConfig.controller.js
@@ -17,53 +17,65 @@
                    formSubmit : formSubmit,    //  폼 전송
                    formCheck : formCheck,  //  폼 체크
                    getCustomFields : getCustomFields,   //  사용자 정의 필드 목록을 가져온다.
                    getIssueTableConfigs : getIssueTableConfigs //  이슈 목록 테이블 설정 정보를 가져온다.
                    getRelIssueTableConfigs : getRelIssueTableConfigs //  이슈 목록 테이블 설정 정보를 가져온다.
                };
                //  변수 모음
                $scope.vm = {
                    issueId: "",
                    issueTableConfigs : [{
                        name : $filter("translate")("common.priority"), // 우선순위
                        key : "PRIORITY",
                        name : $filter("translate")("issue.relationIssueType"), //
                        key : "RELATION_ISSUE_TYPE",
                        width : "width-100-p",
                        position : 1,
                        display : true
                    }, {
                        name : $filter("translate")("issue.relationIssueTitle"), //
                        key : "RELATION_ISSUE_TITLE",
                        width : "width-80-p",
                        position : 2,
                        display : true
                    },{
                        name : $filter("translate")("common.priority"), // 우선순위
                        key : "PRIORITY",
                        width : "width-80-p",
                        position : 3,
                        display : true
                    }, {
                        name : $filter("translate")("common.importance"), // 중요도
                        key : "SEVERITY",
                        width : "width-80-p",
                        position : 2,
                        position : 4,
                        display : true
                    }, {
                        name : $filter("translate")("issue.issueType"), // 이슈 타입
                        key : "ISSUE_TYPE",
                        width : "width-140-p",
                        position : 3,
                        position : 5,
                        display : true
                    }, {
                        name : $filter("translate")("common.assignee"), // 담당자
                        key : "ASSIGNEE",
                        name : $filter("translate")("common.assigneeTeam"), // 담당부서
                        key : "ASSIGNEE_TEAM",
                        width : "width-100-p",
                        position : 4,
                        position : 6,
                        display : true
                    }, {
                        name : $filter("translate")("common.register"), // 등록자
                        key : "REGISTER",
                        width : "width-100-p",
                        position : 5,
                        position : 7,
                        display : false
                    }, {
                        name : $filter("translate")("common.period"), // 기간
                        key : "PERIOD",
                        width : "width-140-p",
                        position : 6,
                        position : 8,
                        display : false
                    }, {
                        name : $filter("translate")("common.lastChangeDate"), // 최근 변경일
                        key : "MODIFY_DATE",
                        width : "width-100-p",
                        position : 7,
                        position : 9,
                        display : false
                    }, {
                    }]
@@ -94,7 +106,9 @@
                        if (result.data.message.status === "success") {
                            SweetAlert.success($filter("translate")("issue.completedSavingIssueTable"), $filter("translate")("issue.saveIssueTableSettingsInformation")); // "이슈 테이블 설정 저장 완료", "이슈 테이블 설정 정보가 저장되었습니다."
                            //  변경된 이슈 테이블 정보를 이슈 목록 테이블에 갱신한다.
                            $rootScope.$broadcast("getIssueTableConfigs", {});
                            $rootScope.$broadcast("getRelIssueTableConfigs", {});
                            swal.close();
                            $scope.fn.cancel();
                        }
                        else {
                            SweetAlert.error($filter("translate")("issue.failedToSaveIssueTableSetting"), result.data.message.message); // 이슈 테이블 설정 저장 실패
@@ -129,7 +143,7 @@
                }
                //  이슈 목록 테이블 설정 정보를 가져온다.
                function getIssueTableConfigs() {
                function getRelIssueTableConfigs() {
                    var deferred = $q.defer();
                    var content = {
@@ -151,7 +165,7 @@
                //  사용자 정의 필드를 조회한 후 표시할 이슈 테이블 컬럼을 준비한다.
                $scope.fn.getCustomFields().then(function (result) {
                    var count = 7;
                    var count = 8;
                    angular.forEach(result, function (customField) {
                        $scope.vm.issueTableConfigs.push({
                            name : customField.name,
@@ -165,7 +179,7 @@
                    });
                    //  이슈 목록 테이블 설정 정보를 가져온다.
                    $scope.fn.getIssueTableConfigs().then(function (issueTableConfigs) {
                    $scope.fn.getRelIssueTableConfigs().then(function (issueTableConfigs) {
                        if ($rootScope.isDefined(issueTableConfigs)) {
                            $rootScope.spinner = true;
src/main/webapp/scripts/app/issue/issueAddTableConfig.controller.js
@@ -23,59 +23,47 @@
                //  변수 모음
                $scope.vm = {
                    issueTableConfigs : [{
                        name : $filter("translate")("issue.relationIssueType"), // 연관 이슈 구분
                        key : "RELATION_ISSUE_TYPE",
                        width : "width-100-p",
                        position : 1,
                        display : true
                    }, {
                        name : $filter("translate")("issue.relationIssueTitle"), // 연관 이슈 제목
                        key : "RELATION_ISSUE_TITLE",
                        width : "width-80-p",
                        position : 2,
                        display : true
                    }, {
                        name : $filter("translate")("common.importance"), // 우선순위
                        key : "PRIORITY",
                        width : "width-80-p",
                        position : 3,
                        position : 1,
                        display : true
                    }, {
                        name : $filter("translate")("common.importance"), // 중요도
                        key : "SEVERITY",
                        width : "width-80-p",
                        position : 4,
                        position : 2,
                        display : true
                    }, {
                        name : $filter("translate")("issue.issueType"), // 이슈 타입
                        key : "ISSUE_TYPE",
                        width : "width-140-p",
                        position : 5,
                        position : 3,
                        display : true
                    }, {
                        name : $filter("translate")("common.assignee"), // 담당자
                        key : "ASSIGNEE",
                        name : $filter("translate")("common.assigneeTeam"), // 담당부서
                        key : "ASSIGNEE_TEAM",
                        width : "width-100-p",
                        position : 6,
                        position : 4,
                        display : true
                    }, {
                        name : $filter("translate")("common.register"), // 등록자
                        key : "REGISTER",
                        width : "width-100-p",
                        position : 7,
                        display : false
                        position : 5,
                        display : true
                    }, {
                        name : $filter("translate")("common.period"), // 기간
                        key : "PERIOD",
                        width : "width-140-p",
                        position : 8,
                        display : false
                        position : 6,
                        display : true
                    }, {
                        name : $filter("translate")("common.lastChangeDate"), // 최근 변경일
                        key : "MODIFY_DATE",
                        width : "width-100-p",
                        position : 9,
                        display : false
                        position : 7,
                        display : true
                    }, {
                    }]
                };
@@ -103,8 +91,11 @@
                        if (result.data.message.status === "success") {
                            SweetAlert.success($filter("translate")("issue.completedSavingIssueTable"), $filter("translate")("issue.saveIssueTableSettingsInformation")); // "이슈 테이블 설정 저장 완료", "이슈 테이블 설정 정보가 저장되었습니다."
                            //  변경된 이슈 테이블 정보를 이슈 목록 테이블에 갱신한다.
                            $rootScope.$broadcast("getIssueTableConfigs", {});
                            swal.close();
                            $scope.fn.cancel();
                        }
                        else {
                            SweetAlert.error($filter("translate")("issue.failedToSaveIssueTableSetting"), result.data.message.message); // 이슈 테이블 설정 저장 실패
@@ -156,7 +147,7 @@
                //  사용자 정의 필드를 조회한 후 표시할 이슈 테이블 컬럼을 준비한다.
                $scope.fn.getCustomFields().then(function (result) {
                    var count = 9;
                    var count = 7;
                    angular.forEach(result, function (customField) {
                        $scope.vm.issueTableConfigs.push({
                            name : customField.name,
src/main/webapp/scripts/app/issue/issueDetail.controller.js
@@ -8,12 +8,14 @@
        'angular'
    ],
    function (app, angular) {
        app.controller('issueDetailController', ['$scope', '$rootScope', '$log', '$resourceProvider', '$tableProvider', '$state', '$uibModal', 'SweetAlert', '$timeout', 'Issue', 'IssueComment', 'IssueRelation', 'AttachedFile', 'IssueStatus', '$filter',
            function ($scope, $rootScope, $log, $resourceProvider, $tableProvider, $state, $uibModal, SweetAlert, $timeout, Issue, IssueComment, IssueRelation, AttachedFile, IssueStatus, $filter) {
        app.controller('issueDetailController', ['$scope', '$rootScope', '$log', '$resourceProvider', '$tableProvider', '$state', '$uibModal', 'SweetAlert', '$timeout', 'Issue', 'IssueComment', 'IssueRelation', 'AttachedFile', 'IssueStatus', 'IssueTableConfig', '$filter',
            function ($scope, $rootScope, $log, $resourceProvider, $tableProvider, $state, $uibModal, SweetAlert, $timeout, Issue, IssueComment, IssueRelation, AttachedFile, IssueStatus, IssueTableConfig, $filter) {
                //  IssueListController vm, fn 변수 상속.
                $scope.fn.getIssueDetail = getIssueDetail;  //  이슈 상세 정보 가져오기
                $scope.fn.setRelTableColumn = setRelTableColumn;
                $scope.fn.setTableColumnDown = setTableColumnDown;
                $scope.fn.addComment = addComment;  //  댓글 등록
                $scope.fn.removeComment = removeComment;    //  댓글 삭제
                $scope.fn.getCommentList = getCommentList;  //  댓글 목록 가져오기
@@ -36,6 +38,7 @@
                $scope.fn.addDownIssue = addDownIssue;      // 하위 이슈 추가
                $scope.fn.addRelationIssueTableConfig = addRelationIssueTableConfig;      // 연관 이슈 목록 테이블 설정
                $scope.fn.addDownIssueTableConfig = addDownIssueTableConfig;      // 하위 이슈 목록 테이블 설정
                $scope.fn.getRelTableConfigs = getRelTableConfigs;
                //  이슈 목록 컨트롤러 vm, fn 상속 중
                $scope.vm.viewer = {};
@@ -197,6 +200,105 @@
                    $scope.vm.autoCompletePage.issue.totalPage = result.data.page.totalPage;
                }
                //  테이블의 연관 이슈 컬럼을 만들어준다.
                function setRelTableColumn(issueTableConfig) {
                    //  연관 이슈  컬럼
                    switch(issueTableConfig.key) {
                        case "RELATION_ISSUE_TYPE" :
                            $scope.vm.relTableConfigs.push($tableProvider.config()
                                .setHName("issue.relationIssueType")
                                .setDType("renderer")
                                .setHWidth("width-30 bold")
                                .setHSort(false)
                                .setDRenderer("ISSUE_RELATION_TYPE"))
                            break;
                        case "RELATION_ISSUE_TITLE" :
                            $scope.vm.relTableConfigs.push($tableProvider.config()
                                .setHName("issue.relationIssueTitle")
                                .setDType("renderer")
                                .setHWidth("width-60 bold")
                                .setHSort(false)
                                .setDRenderer("ISSUE_RELATION_MOVE"))
                            break;
                        case "PRIORITY" :   //  우선순위
                            $scope.vm.relTableConfigs.push($tableProvider.config()
                                .setHName("common.priority")
                                .setDName("priorityName")
                                .setDType("renderer")
                                .setHWidth("bold " + issueTableConfig.width)
                                .setDAlign("text-center")
                                .setDRenderer("COMMON_PRIORITY"));
                            break;
                        case "SEVERITY" :   //  중요도
                            $scope.vm.relTableConfigs.push($tableProvider.config()
                                .setHName("common.importance")
                                .setDName("severityName")
                                .setDType("renderer")
                                .setHWidth("bold " + issueTableConfig.width)
                                .setDAlign("text-center")
                                .setDRenderer("COMMON_SEVERITY"));
                            break;
                        case "ISSUE_TYPE" : //  이슈 타입
                            $scope.vm.relTableConfigs.push($tableProvider.config()
                                .setHName("issue.issueType")
                                .setHWidth("bold " + issueTableConfig.width)
                                .setDAlign("text-center")
                                .setDName("issueTypeName"));
                            break;
                        case "ASSIGNEE_TEAM" :   //  담당부서
                            $scope.vm.relTableConfigs.push($tableProvider.config()
                                .setHName("common.assigneeTeam")
                                .setDType("renderer")
                                .setHWidth("bold " + issueTableConfig.width)
                                .setDAlign("text-center")
                                .setDRenderer("ISSUE_DEPARTMENT"));
                            break;
                        case "REGISTER" :   //  등록자
                            $scope.vm.relTableConfigs.push($tableProvider.config()
                                .setHName("common.register")
                                .setDType("renderer")
                                .setHWidth("bold " + issueTableConfig.width)
                                .setDAlign("text-center")
                                .setDRenderer("REGISTER"));
                            break;
                        case "PERIOD" : //  기간
                            $scope.vm.relTableConfigs.push($tableProvider.config()
                                .setHName("common.period")
                                .setDType("renderer")
                                .setHWidth("bold " + issueTableConfig.width)
                                .setDAlign("text-center")
                                .setDRenderer("ISSUE_DUE_DATE"));
                            break;
                        case "MODIFY_DATE" : //  최근 변경일
                            $scope.vm.relTableConfigs.push($tableProvider.config()
                                .setHName("common.lastChangeDate")
                                .setHWidth("bold " + issueTableConfig.width)
                                .setDAlign("text-center")
                                .setDName("modifyDate"));
                            break;
                    }
                    //  사용자 정의 필드 컬럼
                    if (issueTableConfig.key.indexOf("CUSTOM_FIELD_") !== -1) {
                        //  만약 이슈 테이블 컬럼명이 표시되지 않으면 이쪽이 문제
                        for (var count in $scope.vm.customFields) {
                            var customField = $scope.vm.customFields[count];
                            if (customField.id === Number(issueTableConfig.key.substring(13))) {
                                $scope.vm.relTableConfigs.push($tableProvider.config()
                                    .setHName(customField.name)
                                    .setDType("renderer")
                                    .setHWidth("bold " + issueTableConfig.width)
                                    .setDAlign("text-center")
                                    .setColumnHint(customField)
                                    .setDRenderer("ISSUE_CUSTOM_FIELD_VALUE_VIEW"));
                                break;
                            }
                        }
                    }
                }
                //  하위 이슈 테이블 설정
                function makeTableConfigsDown() {
                    $scope.vm.downTableConfigs = [];
@@ -213,6 +315,97 @@
                        .setDRenderer("ISSUE_DOWN_DELETE")
                        .setHSort(false)
                        .setDAlign("text-center"))
                    angular.forEach($scope.vm.relTableConfigs, function (issueTableConfig) {
                        //  표시 대상인 컬럼만 화면에 그려준다.
                        if (issueTableConfig.display) {
                            //  테이블의 컬럼을 만들어준다.
                            $scope.fn.setTableColumnDown(issueTableConfig);
                        }
                    });
                }
                //  테이블의 컬럼을 만들어준다.
                function setTableColumnDown(issueTableConfig) {
                    if (issueTableConfig == null) return;
                    //  일반 컬럼
                    switch(issueTableConfig.key) {
                        case "PRIORITY" :   //  우선순위
                            $scope.vm.tableConfigs.push($tableProvider.config()
                                .setHName("common.priority")
                                .setDName("priorityName")
                                .setDType("renderer")
                                .setHWidth("bold " + issueTableConfig.width)
                                .setDAlign("text-center")
                                .setDRenderer("COMMON_PRIORITY"));
                            break;
                        case "SEVERITY" :   //  중요도
                            $scope.vm.tableConfigs.push($tableProvider.config()
                                .setHName("common.importance")
                                .setDName("severityName")
                                .setDType("renderer")
                                .setHWidth("bold " + issueTableConfig.width)
                                .setDAlign("text-center")
                                .setDRenderer("COMMON_SEVERITY"));
                            break;
                        case "ISSUE_TYPE" : //  이슈 타입
                            $scope.vm.tableConfigs.push($tableProvider.config()
                                .setHName("issue.issueType")
                                .setHWidth("bold " + issueTableConfig.width)
                                .setDAlign("text-center")
                                .setDName("issueTypeName"));
                            break;
                        case "ASSIGNEE_TEAM" :   //  담당부서
                            $scope.vm.tableConfigs.push($tableProvider.config()
                                .setHName("common.assigneeTeam")
                                .setDType("renderer")
                                .setHWidth("bold " + issueTableConfig.width)
                                .setDAlign("text-center")
                                .setDRenderer("ISSUE_DEPARTMENT"));
                            break;
                        case "REGISTER" :   //  등록자
                            $scope.vm.tableConfigs.push($tableProvider.config()
                                .setHName("common.register")
                                .setDType("renderer")
                                .setHWidth("bold " + issueTableConfig.width)
                                .setDAlign("text-center")
                                .setDRenderer("REGISTER"));
                            break;
                        case "PERIOD" : //  기간
                            $scope.vm.tableConfigs.push($tableProvider.config()
                                .setHName("common.period")
                                .setDType("renderer")
                                .setHWidth("bold " + issueTableConfig.width)
                                .setDAlign("text-center")
                                .setDRenderer("ISSUE_DUE_DATE"));
                            break;
                        case "MODIFY_DATE" : //  최근 변경일
                            $scope.vm.tableConfigs.push($tableProvider.config()
                                .setHName("common.lastChangeDate")
                                .setHWidth("bold " + issueTableConfig.width)
                                .setDAlign("text-center")
                                .setDName("modifyDate"));
                            break;
                    }
                    //  사용자 정의 필드 컬럼
                    if (issueTableConfig.key.indexOf("CUSTOM_FIELD_") === -1) {
                        //  만약 이슈 테이블 컬럼명이 표시되지 않으면 이쪽이 문제
                        for (var count in $scope.vm.customFields) {
                            var customField = $scope.vm.customFields[count];
                            if (customField.id === Number(issueTableConfig.key.substring(13))) {
                                $scope.vm.tableConfigs.push($tableProvider.config()
                                    .setHName(customField.name)
                                    .setDType("renderer")
                                    .setHWidth("bold " + issueTableConfig.width)
                                    .setDAlign("text-center")
                                    .setColumnHint(customField)
                                    .setDRenderer("ISSUE_CUSTOM_FIELD_VALUE_VIEW"));
                                break;
                            }
                        }
                    }
                }
                //  연관 이슈 테이블 설정
@@ -230,33 +423,61 @@
                        .setHWidth("width-60 bold")
                        .setHSort(false)
                        .setDRenderer("ISSUE_RELATION_MOVE"))
                    $scope.vm.relTableConfigs.push($tableProvider.config()
                        .setHName("issue.relationIssueDelete")
                        .setDType("renderer")
                        .setHWidth("width-10 bold")
                        .setDRenderer("ISSUE_RELATION_DELETE")
                        .setHSort(false)
                        .setDAlign("text-center"))
                    angular.forEach($scope.vm.issueTableConfigs, function (issueTableConfig) {
                        //  표시 대상인 컬럼만 화면에 그려준다.
                        if (issueTableConfig.display) {
                            //  테이블의 컬럼을 만들어준다.
                            $scope.fn.setRelTableColumn(issueTableConfig);
                        }
                    });
                }
                // 연관 일감 목록 가져오기
                // function getRelationIssueList() {
                //     var contents = {
                //         issueId : $rootScope.currentDetailIssueId,
                //     };
                //
                //     IssueRelation.find($resourceProvider.getContent(
                //         contents,
                //         $resourceProvider.getPageContent(0, 10))).then(function (result) {
                //
                //         if (result.data.message.status === "success") {
                //             $scope.vm.relResponseData = result.data;
                //         }
                //         else {
                //             SweetAlert.error($filter("translate")("issue.failedToIssueAddIssueRelation"), result.data.message.message); // "연관일감 생성 실패"
                //         }
                //     });
                // }
                function getRelTableConfigs() {
                    var content = {
                        issueId : $scope.vm.viewer.id
                    };
                    IssueTableConfig.relationDetail($resourceProvider.getContent(
                        content,
                        $resourceProvider.getPageContent(0, 0))).then(function (result) {
                        if (result.data.message.status === "success") {
                            var issueTableConfigs = result.data.data;
                            //  연관 슈 목록 테이블 설정 값을 가져와서 적용한다.
                            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;
                                });
                                angular.forEach($scope.vm.issueRelTableConfigs, function (issueTableConfig) {
                                    //  표시 대상인 컬럼만 화면에 그려준다.
                                    if (issueTableConfig.display) {
                                        //  테이블의 컬럼을 만들어준다.
                                        $scope.fn.setRelTableColumn(issueTableConfig);
                                    }
                                });
                            } else {
                               makeTableConfigs();
                            }
                        }
                        else {
                            SweetAlert.swal($filter("translate")("issue.errorRemovableIssueStatusList"), result.data.message.message, "error"); // "이동 가능한 이슈 상태 목록 조회 오류"
                        }
                    });
                }
                // 하위 이슈 추가
                function addDownIssue() {
@@ -442,6 +663,8 @@
                    //  초기화 해야할 할목을 지정하여 다른 이슈를 클릭할 때 초기화해준다.
                    $scope.fn.initReload();
                    $scope.fn.getRelTableConfigs();
                    Issue.detail($resourceProvider.getContent(
                        {id : $scope.vm.viewer.id, deep : "02"},
                        $resourceProvider.getPageContent(0, 1))).then(function (result) {
@@ -470,13 +693,16 @@
                                $scope.vm.form.issuesDown = [];
                                $scope.vm.form.issuesDown.push(result.data.data);
                                makeTableConfigs();
                                // makeTableConfigs();
                                // $scope.vm.relTableConfigs = result.data.relTableConfigs;
                                angular.forEach(result.data.data.issueRelationVos, function (issueRelationVo){
                                    issueRelationVo.relationIssueTypeName = $scope.vm.relationIssueTypes[issueRelationVo.relationIssueType].name;
                                    $scope.vm.form.issues.push(issueRelationVo.issueRelation);
                                });
                                makeTableConfigsDown();
                                // makeTableConfigsDown();
                                // $scope.vm.downTableConfigs = result.data.downTableConfigs;
                                angular.forEach(result.data.data.issueDownVos, function (issueDownVo){
                                    $scope.vm.form.issuesDown.push(issueDownVo.issue);
                                });
src/main/webapp/scripts/app/issue/issueList.controller.js
@@ -73,6 +73,7 @@
                    priorities : [],    //  우선 순위
                    severities : [],    //  중요도
                    users : [], //  담당자
                    departments : [], //  담당부서
                    registers : [], //  등록자
                    customFields : [],  //  사용자 정의 필드
                    issueTableConfigs : [],  //  이슈 테이블 설정
@@ -103,6 +104,7 @@
                            search : $scope.vm.search,
                            projects : $scope.vm.projects,
                            users : $scope.vm.users,
                            departments : $scope.vm.departments,
                            registers : $scope.vm.registers,
                            parentIssueId : $scope.vm.parentIssueId
                        })
@@ -130,9 +132,10 @@
                                var issueListSearchObject = JSON.parse(result.data.data);
                                //  이슈 번호만 적용한다. - 삭제시 처리방법때문에 다른 속성은 적용 보류
                                $scope.vm.search = issueListSearchObject.search;
                                /*$scope.vm.users = issueListSearchObject.users;
                                $scope.vm.users = issueListSearchObject.users;
                                $scope.vm.departments = issueListSearchObject.departments;
                                $scope.vm.projects = issueListSearchObject.projects;
                                $scope.vm.registers = issueListSearchObject.registers;*/
                                $scope.vm.registers = issueListSearchObject.registers;
                                $scope.fn.getPageList(0, true);
                            } else {
@@ -242,13 +245,13 @@
                                .setDAlign("text-center")
                                .setDName("issueTypeName"));
                            break;
                        case "ASSIGNEETEAM" :   //  담당부서
                        case "ASSIGNEE_TEAM" :   //  담당부서
                            $scope.vm.tableConfigs.push($tableProvider.config()
                                .setHName("common.assigneeTeam")
                                .setDType("renderer")
                                .setHWidth("bold " + issueTableConfig.width)
                                .setDAlign("text-center")
                                .setDRenderer("ISSUE_USER"));
                                .setDRenderer("ISSUE_DEPARTMENT"));
                            break;
                        case "REGISTER" :   //  등록자
                            $scope.vm.tableConfigs.push($tableProvider.config()
@@ -376,6 +379,15 @@
                            });
                            return userIds;
                        })(),
                        departmentIds : (function () {
                            var departmentIds = [];
                            angular.forEach($scope.vm.departments, function (department) {
                                departmentIds.push(department.id);
                            });
                            return departmentIds;
                        })(),
                        registerIds : (function () {
                            var registerIds = [];
@@ -869,7 +881,7 @@
                                    display : true
                                }, {
                                    name : $filter("translate")("common.assigneeTeam"), // 담당부서
                                    key : "ASSIGNEETEAM",
                                    key : "ASSIGNEE_TEAM",
                                    width : "width-140-p",
                                    position : 4,
                                    display : true
src/main/webapp/views/issue/issueListNormal.html
@@ -192,7 +192,7 @@
                                                                           input-disabled="false"
                                                                           source="fn.getUserDepartmentList(vm.departmentName, vm.departments)"
                                                                           translation-texts="{ count : 'common.userNum', empty : 'common.emptyDepartment' }"
                                                                           extra-settings="{ displayProp : 'byName' , idProp : 'id', widthable : false, width : '', imageable : true, imagePathProp : 'profile', type : 'user', maxlength : 100 }">
                                                                           extra-settings="{ displayProp : 'byName' , idProp : 'id', widthable : false, width : '', imageable : true, imagePathProp : 'profile', type : 'department', maxlength : 100 }">
                                                    </js-autocomplete-multi>
                                                </div>
                                            </div>