src/main/java/kr/wisestone/owl/repository/IssueRepository.java | ●●●●● 패치 | 보기 | raw | blame | 히스토리 | |
src/main/java/kr/wisestone/owl/service/IssueService.java | ●●●●● 패치 | 보기 | raw | blame | 히스토리 | |
src/main/java/kr/wisestone/owl/service/impl/IssueServiceImpl.java | ●●●●● 패치 | 보기 | raw | blame | 히스토리 | |
src/main/webapp/scripts/app/issue/issueDetail.controller.js | ●●●●● 패치 | 보기 | raw | blame | 히스토리 | |
src/main/webapp/views/issue/issueDetail.html | ●●●●● 패치 | 보기 | 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>