OWL ITS + 탐지시스템(인터넷 진흥원)
jhjang
2021-12-09 ab7e04765622b7ef31bb891a91e89abcf203c31d
Merge branch 'master' of http://192.168.0.25:9001/r/owl-kisa
16개 파일 변경됨
348 ■■■■ 파일 변경됨
src/main/java/kr/wisestone/owl/service/IssueService.java 4 ●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/service/impl/IssueServiceImpl.java 83 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/vo/IssueVo.java 9 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/web/condition/IssueCondition.java 9 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/web/controller/IssueController.java 24 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/resources/mybatis/query-template/issue-template.xml 1 ●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/bower_components/bootstrap-daterangepicker/daterangepicker.js 2 ●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/custom_components/js-table/tableColumnGenerator.directive.js 13 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/i18n/ko/global.json 3 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/scripts/app/issue/issueDetail.controller.js 14 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/scripts/app/issue/issueList.controller.js 110 ●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/scripts/app/project/projectList.controller.js 22 ●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/scripts/components/issue/issue.service.js 12 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/scripts/components/utils/dateRangePicker.directive.js 5 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/views/issue/issueDetail.html 4 ●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/views/login/login.html 33 ●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/service/IssueService.java
@@ -54,6 +54,10 @@
    void removeIssues(IssueForm issueForm);
    void removeAllIssues(IssueForm issueForm);
    void removeDownIssues(IssueForm issueForm);
    void modifyIssueStatus(IssueForm issueForm, User user);
    Issue getIssue(Long taskId);
src/main/java/kr/wisestone/owl/service/impl/IssueServiceImpl.java
@@ -2068,20 +2068,95 @@
        List<Issue> removeIssues = Lists.newArrayList();
        for (Long issueId : issueForm.getRemoveIds()) {
            //하위이슈 체크
            List<Issue> downIssues = this.issueRepository.findByParentIssueId(issueId);
            if(downIssues != null && downIssues.size() > 0){
                for(Issue downIssue : downIssues){
                    if(downIssue.getParentIssue() != null){
                        downIssue.setParentIssue(null);
                    }
                }
            }
            Issue issue = this.issueRemoves(issueId, user);
            removeIssues.add(issue);
        }
        if (removeIssues.size() > 0) {
            //this.issueRepository.deleteAll(removeIssues);
        }
        /*if (removeIssues.size() > 0) {
            this.issueRepository.deleteAll(removeIssues);
        }*/
        //  사용자 시스템 기능 사용 정보 수집
        log.info(ElasticSearchUtil.makeUserActiveHistoryMessage(this.webAppUtil.getLoginUser(), ElasticSearchConstants.ISSUE_REMOVE));
    }
    //  이슈를 삭제한다.
    @Override
    @Transactional
    public void removeAllIssues(IssueForm issueForm) {
        //  사용하고 있는 업무 공간이 활성 상태인지 확인한다. 사용 공간에서 로그인한 사용자가 비활성인지 확인한다.
        User user = this.webAppUtil.getLoginUserObject();
        this.workspaceService.checkUseWorkspace();
        if (issueForm.getRemoveIds().size() < 1) {
            throw new OwlRuntimeException(
                    this.messageAccessor.getMessage(MsgConstants.ISSUE_REMOVE_NOT_SELECT));
        }
        List<Issue> removeIssues = Lists.newArrayList();
        for (Long issueId : issueForm.getRemoveIds()) {
            //하위이슈 체크
            List<Issue> downIssues = this.issueRepository.findByParentIssueId(issueId);
            if(downIssues != null && downIssues.size() > 0){
                for(Issue downIssue : downIssues){
                    Long downIssueId = downIssue.getId();
                    downIssue = this.issueRemoves(downIssueId, user);
                    removeIssues.add(downIssue);
                }
            }
            Issue issue = this.issueRemoves(issueId, user);
            removeIssues.add(issue);
        }
        //  사용자 시스템 기능 사용 정보 수집
        log.info(ElasticSearchUtil.makeUserActiveHistoryMessage(this.webAppUtil.getLoginUser(), ElasticSearchConstants.ISSUE_REMOVE));
    }
    //  하위이슈를 삭제한다.
    @Override
    @Transactional
    public void removeDownIssues(IssueForm issueForm) {
        //  사용하고 있는 업무 공간이 활성 상태인지 확인한다. 사용 공간에서 로그인한 사용자가 비활성인지 확인한다.
        User user = this.webAppUtil.getLoginUserObject();
        this.workspaceService.checkUseWorkspace();
        if (issueForm.getRemoveIds().size() < 1) {
            throw new OwlRuntimeException(
                    this.messageAccessor.getMessage(MsgConstants.ISSUE_REMOVE_NOT_SELECT));
        }
        List<Issue> removeIssues = Lists.newArrayList();
        Long downIssueId = 0L;
        for (Long issueId : issueForm.getRemoveIds()) {
            //삭제 할 이슈의 하위이슈 체크
            List<Issue> downIssues = this.issueRepository.findByParentIssueId(issueId);
            if(downIssues != null && downIssues.size() > 0){
                for(Issue downIssue : downIssues){
                    downIssueId = downIssue.getId();
                }
            }
            Issue issue = this.issueRemoves(downIssueId, user);
            removeIssues.add(issue);
        }
        //  사용자 시스템 기능 사용 정보 수집
        log.info(ElasticSearchUtil.makeUserActiveHistoryMessage(this.webAppUtil.getLoginUser(), ElasticSearchConstants.ISSUE_REMOVE));
    }
    private Issue issueRemoves(Long issueId, User user) {
        Issue issue = this.getIssue(issueId);
        Issue issue = null;
        if(issueId != null){
            issue = this.getIssue(issueId);
        }
        //  이슈 수정 권한을 갖고 있는지 확인
        this.verifyIssueModifyPermission(issue, user);
src/main/java/kr/wisestone/owl/vo/IssueVo.java
@@ -31,6 +31,7 @@
    private Long severityId;
    private String severityName;
    private String severityColor;
    private String isApi;
    private ProjectVo projectVo;    //  이슈 상세에서 사용
    private IssueStatusVo issueStatusVo;    //  이슈 상세에서 사용
    private IssueTypeVo issueTypeVo;    //  이슈 상세에서 사용
@@ -231,6 +232,14 @@
        this.severityColor = severityColor;
    }
    public String getIsApi() {
        return isApi;
    }
    public void setIsApi(String isApi) {
        this.isApi = isApi;
    }
    public Boolean getModifyPermissionCheck() {
        return modifyPermissionCheck;
    }
src/main/java/kr/wisestone/owl/web/condition/IssueCondition.java
@@ -34,6 +34,7 @@
    private Long workspaceId;
    private String projectType;
    private String deep;
    private String isApi;
    private Long parentIssueId;     // 상위 일감
    private String useValue;
    private List<Long> projectIds = Lists.newArrayList();
@@ -301,6 +302,14 @@
        this.deep = deep;
    }
    public String getIsApi() {
        return isApi;
    }
    public void setIsApi(String isApi) {
        this.isApi = isApi;
    }
    public List<Long> getProjectIds() {
        return projectIds;
    }
src/main/java/kr/wisestone/owl/web/controller/IssueController.java
@@ -137,6 +137,30 @@
        return this.setSuccessMessage(resJsonData);
    }
    //  하위이슈 삭제
    @RequestMapping(value = "/issue/removeAll", produces = MediaType.APPLICATION_JSON_VALUE)
    public
    @ResponseBody
    Map<String, Object> removesAll(@RequestBody Map<String, Map<String, Object>> params) {
        Map<String, Object> resJsonData = new HashMap<>();
        this.issueService.removeAllIssues(IssueForm.make(params.get(Constants.REQ_KEY_CONTENT)));
        return this.setSuccessMessage(resJsonData);
    }
    //  하위이슈 삭제
    /*@RequestMapping(value = "/issue/removeDown", produces = MediaType.APPLICATION_JSON_VALUE)
    public
    @ResponseBody
    Map<String, Object> removesDown(@RequestBody Map<String, Map<String, Object>> params) {
        Map<String, Object> resJsonData = new HashMap<>();
        this.issueService.removeDownIssues(IssueForm.make(params.get(Constants.REQ_KEY_CONTENT)));
        return this.setSuccessMessage(resJsonData);
    }*/
    //  이슈 다중 상태 변경
    @RequestMapping(value = "/issue/modifyMultiIssueStatus", produces = MediaType.APPLICATION_JSON_VALUE)
    public
src/main/resources/mybatis/query-template/issue-template.xml
@@ -15,6 +15,7 @@
        issue.complete_date as completeDate,
        issue.issue_number as issueNumber,
        issue.register_date as registerDate,
        issue.is_api as isApi,
        SUBSTRING(issue.modify_date, 1, 19) as modifyDate,
        project.id as projectId,
        project.name as projectName,
src/main/webapp/bower_components/bootstrap-daterangepicker/daterangepicker.js
@@ -108,7 +108,7 @@
                      '<i class="fa fa-calendar glyphicon glyphicon-calendar"></i>' +
                      '<div class="calendar-time">' +
                        '<div></div>' +
                        '<i class="fa fa-clock-o glyphicon glyphicon-time"></i>' +
                        '<i class="fa fa-clock-o glyphicon glyphicon-time" style="position: relative; left:12.3rem; bottom: 1.23rem "></i>' +
                      '</div>' +
                    '</div>' +
                    '<div class="calendar-table"></div>' +
src/main/webapp/custom_components/js-table/tableColumnGenerator.directive.js
@@ -75,13 +75,9 @@
                                        //  프로젝트 이름(프로젝트 리스트에서 사용)
                                        case "PROJECT_NAME" :
                                            if ($rootScope.workProject != null && $rootScope.workProject.id == scope.data.id) {
                                                // makeTag += "<span class='titlenameSelect cursor table-word-break-all sub-line' ng-click='event.changeLastProject(data.id)'>" + myToken + scope.data.name.replace(/</gi, '&lt;') + "</span>";
                                                makeTag += "<span class='titlenameSelect cursor table-word-break-all sub-line' ng-click='event.moveIssue(data.id)'>" + myToken + scope.data.name.replace(/</gi, '&lt;') + "</span>";
                                                // makeTag += "<span class='titlenameSelect cursor table-word-break-all sub-line' ng-click='event.changeDetailView(data.id)'>" + myToken + scope.data.name.replace(/</gi, '&lt;') + "</span>";
                                                makeTag += "<span class='titlenameSelect cursor table-word-break-all sub-line' ng-click='event.changeLastProject(data.id)'>" + myToken + scope.data.name.replace(/</gi, '&lt;') + "</span>";
                                            } else {
                                                // makeTag += "<span class='titlename cursor table-word-break-all sub-line' ng-click='event.changeLastProject(data.id)'>" + myToken + scope.data.name.replace(/</gi, '&lt;') + "</span>";
                                                makeTag += "<span class='titlename cursor table-word-break-all sub-line' ng-click='event.moveIssue(data.id)'>" + myToken + scope.data.name.replace(/</gi, '&lt;') + "</span>";
                                                // makeTag += "<span class='titlename cursor table-word-break-all sub-line' ng-click='event.changeDetailView(data.id)'>" + myToken + scope.data.name.replace(/</gi, '&lt;') + "</span>";
                                                makeTag += "<span class='titlename cursor table-word-break-all sub-line' ng-click='event.changeLastProject(data.id)'>" + myToken + scope.data.name.replace(/</gi, '&lt;') + "</span>";
                                            }
                                            break;
@@ -306,7 +302,6 @@
                                        // 하위 이슈 이동(제목)
                                        case "ISSUE_DOWN_MOVE" :
                                            makeTag += "<span class=\"titlename cursor\" ng-click=\"event.changeDetailView(data)\">" + scope.data.title + "</span></a>";
                                            break;
@@ -429,8 +424,8 @@
                                            makeTag += '<span class="number-tag">' + scope.data.projectKey + ' - ' + scope.data.issueNumber + '</span>';
                                            makeTag += ' <span class="tag"> / </span> ';
                                            makeTag += "<span class='badge' ng-style='{ \"background-color\" : \"" + scope.data.issueStatusColor + "\"," + "\"border-color\"" + " : \"" + scope.data.issueStatusColor + "\", \"color\": \"#FFFFFF\" }'>" + scope.data.issueStatusName + "</span>";
                                            // makeTag += ' <span class="tag"> / </span> ';
                                            // makeTag += '<span class="tag">' + scope.data.projectName + '</span>';
                                            makeTag += '<span class="tag"> &nbsp;/ </span> ';
                                            makeTag += '<span class="tag">' +'<span>API:&nbsp;</span>' + scope.data.isApi + '</span>';
                                            makeTag += '</div>';
                                            makeTag += '<div class="titlename cursor text-left" ng-click="event.changeDetailView(data.id)">' + scope.data.title.replace(/</gi, '&lt;') + '</div>';
                                            makeTag += '<div class="extra-infodiv text-left">';
src/main/webapp/i18n/ko/global.json
@@ -218,6 +218,8 @@
        "settingTableDisplay": "테이블 표시 설정",
        "deleteIssue": "이슈 삭제",
        "wantToDeleteSelectIssue": "선택한 이슈를 삭제하겠습니까? \n 사용자가 직접 삭제한 이슈는 어떠한 경우에도 복구가 불가능합니다.",
        "wantToDeleteOnlySelectIssue": "선택한 이슈만 삭제하겠습니까? \n 사용자가 직접 삭제한 이슈는 어떠한 경우에도 복구가 불가능합니다.",
        "wantToDeleteSelectDownIssue": "선택한 이슈의 하위 이슈가 존재 합니다. \n 선택한 이슈와 하위 이슈 모두 삭제하겠습니까? \n 사용자가 직접 삭제한 이슈는 어떠한 경우에도 복구가 불가능합니다.",
        "wantToDeleteSelectRelationIssue": "선택한 연관 이슈를 삭제하겠습니까? \n 사용자가 직접 삭제한 연관 이슈는 복구가 불가능합니다.",
        "failedToSaveFieldConditions": "검색 필드 조건 저장 실패",
        "failedToGetSearchFieldCondition": "검색 필드 조건 가져오기 실패",
@@ -783,6 +785,7 @@
        "createIssue": "이슈 생성",
        "updateIssue": "이슈 변경",
        "deleteIssue": "이슈 삭제",
        "deleteDownIssue": "하위 이슈 삭제",
        "sendMailIssue": "이슈 메일 전송",
        "updateTitle": "제목이 변경되었습니다.",
        "updateContent": "내용이 변경되었습니다.",
src/main/webapp/scripts/app/issue/issueDetail.controller.js
@@ -50,6 +50,7 @@
                $scope.fn.setDownTableConfigs = setDownTableConfigs;
                $scope.fn.containsPartner = containsPartner;
                $scope.fn.onActivate = onActivate;
                $scope.fn.issueBack = issueBack;
                //  이슈 목록 컨트롤러 vm, fn 상속 중
                $scope.vm.viewer = {};
@@ -125,6 +126,12 @@
                    //$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});
                }
                function onActivate() {
@@ -656,7 +663,6 @@
                //     $scope.fn.getIssueDetail();
                // });
                // todo 이건 또 뭐지
                $scope.$watch(function() {
                    return $rootScope.currentDetailIssueId;
                }, function() {
@@ -889,11 +895,7 @@
                                    angular.forEach(result.data.data.issueDownVos, function (issueDownVo){
                                        //$scope.vm.form.issuesDown.push(issueDownVo.issueDown);
                                        $scope.vm.form.issuesDown.push(issueDownVo);
                                        // 간헐적인 하위 이슈 갱신 오류 방지
                                        // $scope.$on("getIssueDetail", function (event, args) {
                                        //      $scope.fn.getIssueDetail();
                                        //  });
                                    });
                                }
                                $scope.vm.viewer.issueRelationVos = result.data.data.issueRelationVos;
src/main/webapp/scripts/app/issue/issueList.controller.js
@@ -689,6 +689,7 @@
                function removes() {
                    var removeIds = [];
                    var removePermission = true;
                    var downIssueIds = false;
                    angular.forEach($scope.vm.responseData.data, function (data) {
                        if (data.checked && data.modifyPermissionCheck) {
@@ -697,6 +698,10 @@
                        if (data.checked && !data.modifyPermissionCheck) {
                            removePermission = false;
                        }
                        if (data.downIssueAllCount > 0){
                            downIssueIds = true;
                        }
                    });
@@ -719,25 +724,23 @@
                        return;
                    }
                    //  삭제 알림
                    SweetAlert.swal({
                            title : $filter("translate")("issue.deleteIssue"), // 이슈 삭제
                            text : $filter("translate")("issue.wantToDeleteSelectIssue"), // 선택한 이슈을 삭제하겠습니까? 삭제된 이슈은 복구할 수 없습니다.
                    if (downIssueIds) {
                        SweetAlert.swal({
                            title : $filter("translate")("common.deleteIssue"), // 이슈 삭제
                            text : $filter("translate")("issue.wantToDeleteSelectDownIssue"), // 하위 이슈가 존재 합니다. 선택한 이슈와 하위 이슈 모두 삭제하겠습니까? 삭제된 이슈는 복구할 수 없습니다.
                            type : "warning",
                            showCancelButton : true,
                            confirmButtonColor : "#DD6B55",
                            confirmButtonText : $filter("translate")("common.delete"), // 삭제
                            cancelButtonText : $filter("translate")("common.cancel"), // 취소
                            closeOnConfirm : false,
                            closeOnCancel : true
                            closeOnCancel : false
                        },
                        function (isConfirm) {
                            SweetAlert.close();
                            if (isConfirm) {
                            if (isConfirm) { //이슈 + 하위 삭제
                                $rootScope.spinner = true;
                                Issue.remove($resourceProvider.getContent(
                                Issue.removeAllIssues($resourceProvider.getContent(
                                    { removeIds : removeIds },
                                    $resourceProvider.getPageContent(0, 0))).then(function (result) {
@@ -745,9 +748,7 @@
                                        $timeout(function () {
                                            SweetAlert.success($filter("translate")("common.deleteSucceeded"), result.data.message.message); // 삭제 성공
                                        }, 100);
                                        $scope.fn.listView();
                                        $scope.fn.getPageList(0);
                                    }
                                    else {
@@ -755,11 +756,96 @@
                                            SweetAlert.error($filter("translate")("common.deleteFailed"), result.data.message.message); // 삭제 실패
                                        }, 100);
                                    }
                                    $rootScope.spinner = false;
                                });
                            } else {//  선택 한 이슈만 삭제
                                //  삭제 알림
                                SweetAlert.swal({
                                        title : $filter("translate")("issue.deleteIssue"), // 이슈 삭제
                                        text : $filter("translate")("issue.wantToDeleteOnlySelectIssue"), // 선택한 이슈만 삭제하겠습니까? 삭제된 이슈은 복구할 수 없습니다.
                                        type : "warning",
                                        showCancelButton : true,
                                        confirmButtonColor : "#DD6B55",
                                        confirmButtonText : $filter("translate")("common.delete"), // 삭제
                                        cancelButtonText : $filter("translate")("common.cancel"), // 취소
                                        closeOnConfirm : false,
                                        closeOnCancel : true
                                    },
                                    function (isConfirm) {
                                        SweetAlert.close();
                                        if (isConfirm) {
                                            $rootScope.spinner = true;
                                            Issue.remove($resourceProvider.getContent(
                                                { removeIds : removeIds },
                                                $resourceProvider.getPageContent(0, 0))).then(function (result) {
                                                if (result.data.message.status === "success") {
                                                    $timeout(function () {
                                                        SweetAlert.success($filter("translate")("common.deleteSucceeded"), result.data.message.message); // 삭제 성공
                                                    }, 100);
                                                    $scope.fn.listView();
                                                    $scope.fn.getPageList(0);
                                                }
                                                else {
                                                    $timeout(function () {
                                                        SweetAlert.error($filter("translate")("common.deleteFailed"), result.data.message.message); // 삭제 실패
                                                    }, 100);
                                                }
                                                $rootScope.spinner = false;
                                            });
                                        }
                                    });
                            }
                        });
                    } else {
                        //  삭제 알림
                        SweetAlert.swal({
                                title : $filter("translate")("issue.deleteIssue"), // 이슈 삭제
                                text : $filter("translate")("issue.wantToDeleteSelectIssue"), // 선택한 이슈을 삭제하겠습니까? 삭제된 이슈은 복구할 수 없습니다.
                                type : "warning",
                                showCancelButton : true,
                                confirmButtonColor : "#DD6B55",
                                confirmButtonText : $filter("translate")("common.delete"), // 삭제
                                cancelButtonText : $filter("translate")("common.cancel"), // 취소
                                closeOnConfirm : false,
                                closeOnCancel : true
                            },
                            function (isConfirm) {
                                SweetAlert.close();
                                if (isConfirm) {
                                    $rootScope.spinner = true;
                                    Issue.remove($resourceProvider.getContent(
                                        { removeIds : removeIds },
                                        $resourceProvider.getPageContent(0, 0))).then(function (result) {
                                        if (result.data.message.status === "success") {
                                            $timeout(function () {
                                                SweetAlert.success($filter("translate")("common.deleteSucceeded"), result.data.message.message); // 삭제 성공
                                            }, 100);
                                            $scope.fn.listView();
                                            $scope.fn.getPageList(0);
                                        }
                                        else {
                                            $timeout(function () {
                                                SweetAlert.error($filter("translate")("common.deleteFailed"), result.data.message.message); // 삭제 실패
                                            }, 100);
                                        }
                                        $rootScope.spinner = false;
                                    });
                                }
                            });
                    }
                }
                //  이슈 목록 테이블 설정
src/main/webapp/scripts/app/project/projectList.controller.js
@@ -69,9 +69,7 @@
                $scope.tableEvent = {
                    modify : modify,
                    projectCustomFieldConfig : projectCustomFieldConfig,
                    changeLastProject : changeLastProject,
                    moveIssue : moveIssue,
                    changeDetailView : changeDetailView
                    changeLastProject : changeLastProject
                };
                angular.extend(this, $controller('autoCompleteController', {$scope : $scope, $injector : $injector}));
@@ -363,22 +361,8 @@
                }
                function changeLastProject(projectId) {
                    $rootScope.changeLastProject(projectId);
                }
                function moveIssue(projectId) {
                    // $rootScope.currentDetailIssueId = null;
                    // 이슈 번호를 저장한 후 이슈 목록으로 이동한다.
                    // $rootScope.$broadcast("makeIssueSearch", {id :$rootScope.currentDetailIssueId});
                    //$rootScope.$broadcast("makeIssueSearch", {id :$rootScope.issueTypeMenu.id});
                    $rootScope.$broadcast("makeIssueSearch",projectId);
                }
                function changeDetailView() {
                    // $rootScope.$broadcast("getIssueDetail", {id: $rootScope.currentDetailIssueId});
                    //$scope.$broadcast("getIssueDetail", {id: $rootScope.currentDetailIssueId});
                    // $rootScope.$broadcast("getIssueDetail", {id :$rootScope.currentDetailIssueId});
                    //$rootScope.$broadcast("getIssueList", {id :$rootScope.issueTypeMenu.id});
                    //$rootScope.changeLastProject(projectId);
                    $state.go("issues.list")
                }
                $scope.fn.makeTableConfigs();
src/main/webapp/scripts/components/issue/issue.service.js
@@ -92,6 +92,18 @@
                    return response;
                });
            },
            removeAllIssues : function (conditions) {
                return $http.post("issue/removeAll", conditions).then(function (response) {
                    $log.debug("하위이슈 삭제 결과 : ", response);
                    return response;
                });
            },
            /*removeDownIssues : function (conditions) {
                return $http.post("issue/removeDown", conditions).then(function (response) {
                    $log.debug("하위이슈 삭제 결과 : ", response);
                    return response;
                });
            },*/
            importExcel : function (conditions) {
                conditions.url = "issue/importExcel";
                return $upload.upload(conditions).then(function (response) {
src/main/webapp/scripts/components/utils/dateRangePicker.directive.js
@@ -77,7 +77,8 @@
                                    });
                                } else if ($attrs["rangeType"] === "singleDate") {
                                    $($element).daterangepicker({
                                        timePicker: false,
                                        timePicker: true,
                                        timePickerSeconds : true,
                                        autoUpdateInput: true,
                                        autoApply : true,
                                        singleDatePicker : true,
@@ -85,7 +86,7 @@
                                        //parentEl : $scope.parentEl !== undefined ? $scope.parentEl : "",
                                        locale: {
                                            format: 'YYYY-MM-DD',
                                            format: 'YYYY-MM-DD/hh-mm-ss A',
                                            applyLabel: options.applyLabel,
                                            cancelLabel: options.cancelLabel,
                                            daysOfWeek: options.daysOfWeek,
src/main/webapp/views/issue/issueDetail.html
@@ -87,7 +87,7 @@
<div class="support-ticket-content-w" ng-controller="issueDetailController">
    <div class="support-ticket-content">
        <span ng-if="vm.viewer.parentIssueVo != null" class="badge" ng-style="{'background-color' : '#353535', 'border-color' : vm.viewer.issueStatusVo.color, 'color' : '#FFFFFF' }">
            <span>상위 이슈:{{vm.viewer.parentIssueVo.title}}</span>
            <span class="cursor" ng-click="fn.issueBack()">상위 이슈:{{vm.viewer.parentIssueVo.title}}</span>
        </span>
        <div class="">
@@ -97,7 +97,7 @@
            <span class="ticket-header">
                <div class="tasks-header-w">
                    <span class="tags">
                        <span class="tag">{{vm.viewer.projectVo.projectKey}}-{{vm.viewer.issueNumber}} &nbsp; / &nbsp; {{vm.viewer.projectVo.name}}</span>
                        <span class="tag">{{vm.viewer.projectVo.projectKey}}-{{vm.viewer.issueNumber}} &nbsp; / &nbsp; {{vm.viewer.projectVo.name}} &nbsp; / &nbsp; <span>API :&nbsp;{{vm.viewer.isApi}}</span></span>
                    </span>
                </div>
            </span>
src/main/webapp/views/login/login.html
@@ -1,23 +1,24 @@
<div class="content-i">
    <div class="content-box">
        <div class="row mt-30">
        <div class="row mt-30" style="margin-right: 32rem">
            <div class="m-0">
                <div class="flex">
                    <div class="loginbackdiv">
                        <div class="loginback">
                            <img src="/assets/images/logo-kisa-vertical.png"/>
                            <div class="stardiv">
                            <!--    <div class="stars"></div>
                                <div class="twinkling"></div>
                            </div>
                            <div class="bgdiv">
                            </div>
                            <div class="login-circle">
                                <div class="circle1"></div>
                                <div class="circle2"></div>
                                <div class="circle3"></div>-->
                            </div>
                        </div>
<!--                        <div class="loginback">-->
<!--                            <img src="/assets/images/logo-kisa-vertical.png"/>-->
<!--                            <div class="stardiv">-->
<!--                                <div class="stars"></div>-->
<!--                                <div class="twinkling"></div>-->
<!--                            </div>-->
<!--                            <div class="bgdiv">-->
<!--                            </div>-->
<!--                            <div class="login-circle">-->
<!--                                <div class="circle1"></div>-->
<!--                                <div class="circle2"></div>-->
<!--                                <div class="circle3"></div>-->
<!--                            </div>-->
<!--                        </div>-->
<!--                    </div>-->
                    </div>
                    <div class="logincont">
                        <div class="auth-box-w">
@@ -131,7 +132,7 @@
                </div>
                -->
                <div class="footer-s" >
                    <small>CopyRight WISESTONE All rights reserved.</small>
                    <small style="margin-left: 8.8rem">CopyRight WISESTONE All rights reserved.</small>
                </div>
            </div>
        </div>