OWL ITS + 탐지시스템(인터넷 진흥원)
박지현
2022-03-11 d3d9848c0833a0835eb2fac8345c0e406e066535
이슈 상세페이지 - 하위이슈: 완료이슈 숨기기 기능 추가
5개 파일 변경됨
100 ■■■■■ 파일 변경됨
src/main/java/kr/wisestone/owl/repository/IssueRepository.java 6 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/service/IssueService.java 2 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/service/impl/IssueServiceImpl.java 25 ●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/scripts/app/issue/issueDetail.controller.js 7 ●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/views/issue/issueDetail.html 60 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/repository/IssueRepository.java
@@ -1,10 +1,13 @@
package kr.wisestone.owl.repository;
import kr.wisestone.owl.domain.Issue;
import kr.wisestone.owl.domain.enumType.IssueStatusType;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.EntityGraph;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import java.util.List;
@@ -13,4 +16,7 @@
    List<Issue> findByParentIssueId(@Param("parentIssueId") Long parentIssueId);
    Page<Issue> findByParentIssueId(@Param("parentIssueId") Long parentIssueId, Pageable pageable);
    @Query(value = "select i from Issue i where i.parentIssue.id = :parentIssueId and i.issueStatus.issueStatusType <> :issueStatusType")
    Page<Issue> findByParentIssueId(@Param("parentIssueId") Long parentIssueId,@Param("issueStatusType")  IssueStatusType issueStatusType, Pageable pageable);
}
src/main/java/kr/wisestone/owl/service/IssueService.java
@@ -94,6 +94,8 @@
    void setIssueDetail(IssueVo issueVo, Issue issue, User user);
    void setIssueDetail(IssueVo issueVo, Issue issue, User user, boolean hideCompleteIssue);
    void sendIssueEmail(IssueForm issueForm);
    void sendIssueEmailPartners(EmailTemplateForm emailTemplateForm, List<MultipartFile> files);
src/main/java/kr/wisestone/owl/service/impl/IssueServiceImpl.java
@@ -1661,6 +1661,7 @@
        IssueVo issueVo = new IssueVo();
        Pageable relPageable = issueCondition.getRelPageable();
        Pageable downPageable = issueCondition.getDownPageable();
        boolean hideCompleteIssue = issueCondition.getHideCompleteIssue();
        if (issueCondition.getId() != null) {
            Issue issue = this.getIssue(issueCondition.getId());
@@ -1692,11 +1693,11 @@
                    this.setAttachedFiles(issue, issueVo);  //  첨부 파일 정보 셋팅
                    this.setIssueCustomFields(issue, issueVo);  //  사용자 정의 필드 값 정보 셋팅
                    this.setRelationIssue(issue, issueVo);        //연관 일감 셋팅
                    this.setDownIssues(issue, issueVo); //하위 이슈 세팅
                    this.setDownIssues(issue, issueVo, hideCompleteIssue); //하위 이슈 세팅
                    break;
                case "02": //  프로젝트, 이슈 유형, 이슈 상태,  우선순위, 중요도, 담당자, 첨부파일, 사용자 정의 필드 정보, 댓글, 기록을 셋팅한다.
                    this.setIssueDetail(issueVo, issue, user);    //  이슈 상세 정보를 셋팅한다.
                    this.setIssueDetail(issueVo, issue, user, hideCompleteIssue);    //  이슈 상세 정보를 셋팅한다.
                    this.setIssueTableConfigs(issue, issueVo, issueCondition);
                    issueVo.setProjectVo(ConvertUtil.copyProperties(issue.getProject(), ProjectVo.class));
                    break;
@@ -1731,6 +1732,10 @@
    // 하위 이슈 정보를 셋팅한다
    private void setDownIssues(Issue issue, IssueVo issueVo) {
        setDownIssues(issue, issueVo, false);
    }
    private void setDownIssues(Issue issue, IssueVo issueVo, boolean hideCompleteIssue) {
        Page<Issue> downIssues = null;
        List<Issue> downIssueList = this.issueRepository.findByParentIssueId(issue.getId());
@@ -1740,7 +1745,13 @@
                startPage = (int) Math.floor(issueVo.getDownPage()/issueVo.getDownPageSize());
            }
            Pageable pageable = PageRequest.of(startPage, issueVo.getDownPageSize());
            downIssues = this.issueRepository.findByParentIssueId(issue.getId(), pageable);
            if(hideCompleteIssue){
                downIssues = this.issueRepository.findByParentIssueId(issue.getId(), IssueStatusType.CLOSE, pageable);
            }else {
                downIssues = this.issueRepository.findByParentIssueId(issue.getId(), pageable);
            }
        }
        if(downIssues != null){
            issueVo.setDownTotalPage(downIssues.getTotalPages());
@@ -1778,6 +1789,12 @@
    @Override
    @Transactional(readOnly = true)
    public void setIssueDetail(IssueVo issueVo, Issue issue, User user) {
        setIssueDetail(issueVo, issue, user, false);
    }
    @Override
    @Transactional(readOnly = true)
    public void setIssueDetail(IssueVo issueVo, Issue issue, User user, boolean hideCompleteIssue) {
        //  이슈 수정 권한을 갖고 있는지 확인
        if (this.checkHasPermission(issueVo, issueVo.getUserVos(), user, issueVo.getDepartmentVos())) {
            issueVo.setModifyPermissionCheck(Boolean.TRUE);
@@ -1796,7 +1813,7 @@
        this.setAttachedFiles(issue, issueVo);  //  첨부 파일 정보 셋팅
        this.setIssueCustomFields(issue, issueVo);  //  사용자 정의 필드 값 정보 셋팅
        this.setRelationIssue(issue, issueVo);        //연관 일감 셋팅
        this.setDownIssues(issue, issueVo); //하위 일감 세팅
        this.setDownIssues(issue, issueVo, hideCompleteIssue); //하위 일감 세팅
        this.setIssueComments(issue, issueVo);  //  댓글 정보 셋팅
        this.setIssueHistory(issue, issueVo);   //  이슈 기록 정보 셋팅
src/main/webapp/scripts/app/issue/issueDetail.controller.js
@@ -58,6 +58,8 @@
                $scope.fn.sendCommonMail = sendCommonMail;
                $scope.fn.getSubPageContent = getSubPageContent;
                $scope.vm.hideCompleteIssue = true;
                //  이슈 목록 컨트롤러 vm, fn 상속 중
                $scope.vm.viewer = {};      // 현재 이슈
                $scope.vm.images = [];  //  첨부된 파일 중 이미지 파일
@@ -889,7 +891,7 @@
                    }
                }, true);
                //  초기화 해야할 할목을 지정하여 다른 이슈를 클릭할 때 초기화해준다.
                //  초기화 해야할 항목을 지정하여 다른 이슈를 클릭할 때 초기화해준다.
                function initReload() {
                    $scope.vm.editor.issueStatus = false;
                    $scope.vm.issueForm.issueStatusList = [];
@@ -1109,7 +1111,7 @@
                        currentDownPage = selectedDownPage;
                    }
                    //  초기화 해야할 할목을 지정하여 다른 이슈를 클릭할 때 초기화해준다.
                    //  초기화 해야할 항목을 지정하여 다른 이슈를 클릭할 때 초기화해준다.
                    $scope.fn.initReload();
                    // $scope.fn.getRelTableConfigs();
                    // $scope.fn.getDownTableConfigs();
@@ -1130,6 +1132,7 @@
                                return id;
                            })()
                            , deep : "02", pageContent
                            , hideCompleteIssue : $scope.vm.hideCompleteIssue
                        }, null);
                    Issue.detail(content).then(function (result) {
src/main/webapp/views/issue/issueDetail.html
@@ -566,7 +566,7 @@
                </div>
            </div>
                <div class="row mt-30">
                <div class="row mt-30 align-items-end" style="justify-content: space-between;">
                    <div class="col-md-10">
                        <span class="info_detail_font h3" translate="issue.relationIssue">연관 이슈</span>
                    </div>
@@ -589,17 +589,19 @@
                            </label>
                        </div>
                    </div>
                    <div class="btn-group" style="left: 975px; padding: 5px">
                        <button aria-expanded="false" aria-haspopup="true"
                                tabindex="-1"
                                class="btn btn-secondary dropdown-toggle"
                                data-toggle="dropdown" type="button"><span translate="common.addFunction">추가기능</span>
                        </button>
                        <div aria-labelledby="dropdownMenuButton2" class="dropdown-menu left-menu"
                             x-placement="bottom-start" >
                            <!--<a class="dropdown-item cursor" form-submit="issueListForm" make-search-conditions="fn.makeSearchConditions()"> <span translate="common.allDownloadExcel">엑셀 다운로드</span></a>-->
                            <a class="dropdown-item cursor" ng-click="fn.addRelationIssueTableConfig()"> <span translate="issue.settingTableDisplay">테이블 표시 설정</span></a>
                            <a class="dropdown-item cursor" ng-click="fn.removeRelationIssue()"> <span translate="common.selectDelete">삭제</span></a>
                    <div class="col-5" style="display: flex; justify-content: flex-end; align-items: center">
                        <div class="btn-group" style="padding: 5px">
                            <button aria-expanded="false" aria-haspopup="true"
                                    tabindex="-1"
                                    class="btn btn-secondary dropdown-toggle"
                                    data-toggle="dropdown" type="button"><span translate="common.addFunction">추가기능</span>
                            </button>
                            <div aria-labelledby="dropdownMenuButton2" class="dropdown-menu left-menu"
                                 x-placement="bottom-start" >
                                <!--<a class="dropdown-item cursor" form-submit="issueListForm" make-search-conditions="fn.makeSearchConditions()"> <span translate="common.allDownloadExcel">엑셀 다운로드</span></a>-->
                                <a class="dropdown-item cursor" ng-click="fn.addRelationIssueTableConfig()"> <span translate="issue.settingTableDisplay">테이블 표시 설정</span></a>
                                <a class="dropdown-item cursor" ng-click="fn.removeRelationIssue()"> <span translate="common.selectDelete">삭제</span></a>
                            </div>
                        </div>
                    </div>
                </div>
@@ -660,7 +662,7 @@
                    </div>
                </div>
                <div class="row mt-30">
                <div class="row mt-30 align-items-end" style="justify-content: space-between;">
                    <div class="col-md-8">
                        <span class="info_detail_font h3" translate="issue.downIssue">하위 이슈</span>
                    </div>
@@ -689,18 +691,26 @@
                            </label>
                        </div>
                    </div>
                    <div class="btn-group" style="left: 730px; padding: 5px">
                        <button aria-expanded="false" aria-haspopup="true"
                                tabindex="-1"
                                class="btn btn-secondary dropdown-toggle"
                                data-toggle="dropdown" type="button"><span translate="common.addFunction">추가기능</span>
                        </button>
                        <div aria-labelledby="dropdownMenuButton2" class="dropdown-menu left-menu"
                             x-placement="bottom-start" >
                            <!--<a class="dropdown-item cursor" form-submit="issueListForm" make-search-conditions="fn.makeSearchConditions()"> <span translate="common.allDownloadExcel">엑셀 다운로드</span></a>-->
                            <a class="dropdown-item cursor" ng-if="vm.viewer.modifyPermissionCheck" ng-click="fn.modifyDownIssueStatus()"> <span translate="common.updateDownIssueStatus">하위이슈 상태 변경</span></a>
                            <a class="dropdown-item cursor" ng-click="fn.addDownIssueTableConfig()"> <span translate="issue.settingTableDisplay">테이블 표시 설정</span></a>
                            <a class="dropdown-item cursor" ng-click="fn.removeDownIssue()"> <span translate="common.selectDelete">삭제</span></a>
                    <div class="col-5" style="display: flex; justify-content: flex-end; align-items: center">
                        <div style="display: flex; align-items: center; margin-right: 10px;">
                            <span class="issue-detail-label" style="margin-right: 4px;padding-top: 6px;"><span style="color: #0a7cf8">◆</span> 완료 이슈 숨기기</span>
                            <label class='switch'><input type='checkbox' ng-model='vm.hideCompleteIssue' ng-click="fn.getIssueDetail(0,0)">
                                <span class='slider round'></span>
                            </label>
                        </div>
                        <div class="btn-group" style="padding: 5px">
                            <button aria-expanded="false" aria-haspopup="true"
                                    tabindex="-1"
                                    class="btn btn-secondary dropdown-toggle"
                                    data-toggle="dropdown" type="button"><span translate="common.addFunction">추가기능</span>
                            </button>
                            <div aria-labelledby="dropdownMenuButton2" class="dropdown-menu left-menu"
                                 x-placement="bottom-start" >
                                <!--<a class="dropdown-item cursor" form-submit="issueListForm" make-search-conditions="fn.makeSearchConditions()"> <span translate="common.allDownloadExcel">엑셀 다운로드</span></a>-->
                                <a class="dropdown-item cursor" ng-if="vm.viewer.modifyPermissionCheck" ng-click="fn.modifyDownIssueStatus()"> <span translate="common.updateDownIssueStatus">하위이슈 상태 변경</span></a>
                                <a class="dropdown-item cursor" ng-click="fn.addDownIssueTableConfig()"> <span translate="issue.settingTableDisplay">테이블 표시 설정</span></a>
                                <a class="dropdown-item cursor" ng-click="fn.removeDownIssue()"> <span translate="common.selectDelete">삭제</span></a>
                            </div>
                        </div>
                    </div>
                </div>