From d3d9848c0833a0835eb2fac8345c0e406e066535 Mon Sep 17 00:00:00 2001
From: 박지현 <jhpark@maprex.co.kr>
Date: 금, 11 3월 2022 15:50:43 +0900
Subject: [PATCH] 이슈 상세페이지 - 하위이슈: 완료이슈 숨기기 기능 추가

---
 src/main/java/kr/wisestone/owl/service/impl/IssueServiceImpl.java |   25 ++++++++++--
 src/main/java/kr/wisestone/owl/service/IssueService.java          |    2 +
 src/main/java/kr/wisestone/owl/repository/IssueRepository.java    |    6 +++
 src/main/webapp/views/issue/issueDetail.html                      |   60 +++++++++++++++++------------
 src/main/webapp/scripts/app/issue/issueDetail.controller.js       |    7 ++-
 5 files changed, 69 insertions(+), 31 deletions(-)

diff --git a/src/main/java/kr/wisestone/owl/repository/IssueRepository.java b/src/main/java/kr/wisestone/owl/repository/IssueRepository.java
index eaeb137..accd3a1 100644
--- a/src/main/java/kr/wisestone/owl/repository/IssueRepository.java
+++ b/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);
 }
diff --git a/src/main/java/kr/wisestone/owl/service/IssueService.java b/src/main/java/kr/wisestone/owl/service/IssueService.java
index f0eccc6..83cd8b2 100644
--- a/src/main/java/kr/wisestone/owl/service/IssueService.java
+++ b/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);
diff --git a/src/main/java/kr/wisestone/owl/service/impl/IssueServiceImpl.java b/src/main/java/kr/wisestone/owl/service/impl/IssueServiceImpl.java
index 6cd7ff7..bdbb163 100644
--- a/src/main/java/kr/wisestone/owl/service/impl/IssueServiceImpl.java
+++ b/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);   //  �씠�뒋 湲곕줉 �젙蹂� �뀑�똿
 
diff --git a/src/main/webapp/scripts/app/issue/issueDetail.controller.js b/src/main/webapp/scripts/app/issue/issueDetail.controller.js
index 6cbd9ca..962075f 100644
--- a/src/main/webapp/scripts/app/issue/issueDetail.controller.js
+++ b/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) {
diff --git a/src/main/webapp/views/issue/issueDetail.html b/src/main/webapp/views/issue/issueDetail.html
index 9b71d71..746d8be 100644
--- a/src/main/webapp/views/issue/issueDetail.html
+++ b/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>

--
Gitblit v1.8.0