From 49a02aa2071bcaf94f0f8c19e2578cd7650160a4 Mon Sep 17 00:00:00 2001
From: wyu <kknd09321@nate.com>
Date: 금, 10 12월 2021 19:22:13 +0900
Subject: [PATCH] Merge branch 'master' of http://192.168.0.25:9001/r/owl-kisa

---
 src/main/java/kr/wisestone/owl/vo/IssueVo.java                                   |   12 
 src/main/webapp/scripts/app/issue/issue.js                                       |    2 
 src/main/java/kr/wisestone/owl/domain/CompanyField.java                          |   18 
 src/main/webapp/views/issue/issueAdd.html                                        |    2 
 src/main/java/kr/wisestone/owl/web/controller/ApiController.java                 |    1 
 src/main/resources/mybatis/query-template/issue-template.xml                     |   41 
 src/main/java/kr/wisestone/owl/vo/CompanyFieldVo.java                            |   39 
 src/main/java/kr/wisestone/owl/web/condition/IssueCustomFieldValueCondition.java |    9 
 src/main/java/kr/wisestone/owl/service/impl/IspFieldServiceImpl.java             |   24 
 src/main/java/kr/wisestone/owl/web/condition/CompanyFieldCondition.java          |   18 
 src/main/webapp/custom_components/js-tree/js-tree.directive.js                   |   36 +
 src/main/webapp/scripts/main.js                                                  |   10 
 src/main/java/kr/wisestone/owl/service/impl/IssueServiceImpl.java                |  181 +++--
 src/main/webapp/custom_components/js-tree/treeColumnGenerator.directive.js       |   64 ++
 src/main/webapp/custom_components/js-tree/js-tree.html                           |   16 
 src/main/java/kr/wisestone/owl/web/condition/IssueCondition.java                 |   13 
 src/main/java/kr/wisestone/owl/service/impl/IssueRelationServiceImpl.java        |   18 
 src/main/resources/mybatis/query-template/companyField-template.xml              |    4 
 src/main/webapp/scripts/app/companyField/companyFieldModify.controller.js        |   65 +
 src/main/webapp/views/issue/issueListNormal.html                                 |  600 +++++++++---------
 src/main/webapp/scripts/app/companyField/companyFieldAdd.controller.js           |   35 
 src/main/java/kr/wisestone/owl/constant/MsgConstants.java                        |    1 
 src/main/webapp/views/companyField/companyFieldModify.html                       |   35 +
 src/main/webapp/scripts/app/issue/issueAdd.controller.js                         |   54 
 src/main/resources/migration/V1_13__Alter_Table.sql                              |   10 
 src/main/java/kr/wisestone/owl/service/IssueService.java                         |    3 
 src/main/java/kr/wisestone/owl/service/impl/CompanyFieldServiceImpl.java         |   60 +
 src/main/webapp/scripts/app/issue/issueList.controller.js                        |  131 ++++
 src/main/java/kr/wisestone/owl/service/impl/HostingFieldServiceImpl.java         |   27 
 src/main/java/kr/wisestone/owl/web/form/CompanyFieldForm.java                    |   19 
 src/main/webapp/i18n/ko/global.json                                              |    2 
 src/main/java/kr/wisestone/owl/web/form/IssueCustomFieldValueForm.java           |    9 
 src/main/webapp/custom_components/js-tree/tree.provider.js                       |  234 +++++++
 src/main/webapp/views/companyField/companyFieldAdd.html                          |    9 
 34 files changed, 1,260 insertions(+), 542 deletions(-)

diff --git a/src/main/java/kr/wisestone/owl/constant/MsgConstants.java b/src/main/java/kr/wisestone/owl/constant/MsgConstants.java
index 5793400..8689148 100644
--- a/src/main/java/kr/wisestone/owl/constant/MsgConstants.java
+++ b/src/main/java/kr/wisestone/owl/constant/MsgConstants.java
@@ -240,6 +240,7 @@
     public static final String API_PARAMETER_ERROR = "API_PARAMETER_ERROR";     // api �뙆�씪誘명꽣 �삤瑜�
     public static final String API_USER_ERROR = "API_USER_ERROR";     // api �궗�슜�옄 �삤瑜�
     public static final String API_OVERLAP_ERROR = "API_OVERLAP_ERROR";     // API 以묐났�맂 �긽�쐞 �씠�뒋媛� �뿬�윭媛쒖씪 寃쎌슦
+    public static final String API_OVERLAP_SETTING_NOT_EXIST = "API_OVERLAP_SETTING_NOT_EXIST";     // API 以묐났�맂 �꽕�젙�씠 �븞�릺�뼱 �엳�쓣 寃쎌슦
     public static final String API_ISSUE_NOT_EXIST = "API_ISSUE_NOT_EXIST";     // �닔�젙�븷 �씠�뒋瑜� 李얠쓣�닔 �뾾�뒿�땲�떎.
     public static final String API_COMPLETE_ISSUE_STATUS_NOT_EXIST = "API_COMPLETE_ISSUE_STATUS_NOT_EXIST";     // �옄�룞 醫낅즺 泥섎━�븷 �긽�깭媛� �꽕�젙�릺吏� �븡�븯�뒿�땲�떎.
 }
diff --git a/src/main/java/kr/wisestone/owl/domain/CompanyField.java b/src/main/java/kr/wisestone/owl/domain/CompanyField.java
index 53fae93..d733e82 100644
--- a/src/main/java/kr/wisestone/owl/domain/CompanyField.java
+++ b/src/main/java/kr/wisestone/owl/domain/CompanyField.java
@@ -19,6 +19,8 @@
     private String url;
     private String email;
     private String memo;
+    private Long ispId;
+    private Long hostingId;
 
     public CompanyField() {}
 
@@ -77,4 +79,20 @@
     public void setUrl(String url) {
         this.url = url;
     }
+
+    public Long getIspId() {
+        return ispId;
+    }
+
+    public void setIspId(Long ispId) {
+        this.ispId = ispId;
+    }
+
+    public Long getHostingId() {
+        return hostingId;
+    }
+
+    public void setHostingId(Long hostingId) {
+        this.hostingId = hostingId;
+    }
 }
diff --git a/src/main/java/kr/wisestone/owl/service/IssueService.java b/src/main/java/kr/wisestone/owl/service/IssueService.java
index 302a9e4..dab91fe 100644
--- a/src/main/java/kr/wisestone/owl/service/IssueService.java
+++ b/src/main/java/kr/wisestone/owl/service/IssueService.java
@@ -35,7 +35,8 @@
 
     List<Issue> modifyIssue(IssueApiForm issueApiForm, List<MultipartFile> files);
 
-    List<IssueVo> findIssue(IssueApiForm issueApiform);
+    List<Issue> findIssue(IssueApiForm issueApiform);
+
 
     List<IssueVo> findIssue(Map<String, Object> resJsonData,
                             IssueCondition condition, Pageable pageable);
diff --git a/src/main/java/kr/wisestone/owl/service/impl/CompanyFieldServiceImpl.java b/src/main/java/kr/wisestone/owl/service/impl/CompanyFieldServiceImpl.java
index f777fde..67037b3 100644
--- a/src/main/java/kr/wisestone/owl/service/impl/CompanyFieldServiceImpl.java
+++ b/src/main/java/kr/wisestone/owl/service/impl/CompanyFieldServiceImpl.java
@@ -6,10 +6,11 @@
 import kr.wisestone.owl.domain.IspField;
 import kr.wisestone.owl.repository.HostingFieldRepository;
 import kr.wisestone.owl.repository.IspFieldRepository;
-import kr.wisestone.owl.service.UserService;
+import kr.wisestone.owl.service.*;
 import kr.wisestone.owl.web.condition.CompanyFieldCondition;
 import kr.wisestone.owl.web.form.CompanyFieldForm;
 import org.apache.commons.lang3.StringUtils;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.ui.Model;
 import com.google.common.collect.Lists;
 import kr.wisestone.owl.common.ExcelConditionCheck;
@@ -18,8 +19,6 @@
 import kr.wisestone.owl.exception.OwlRuntimeException;
 import kr.wisestone.owl.mapper.CompanyFieldMapper;
 import kr.wisestone.owl.repository.CompanyFieldRepository;
-import kr.wisestone.owl.service.CompanyFieldService;
-import kr.wisestone.owl.service.WorkspaceService;
 import kr.wisestone.owl.util.ConvertUtil;
 import kr.wisestone.owl.vo.*;
 import kr.wisestone.owl.web.view.ExcelView;
@@ -33,6 +32,7 @@
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Optional;
 
 @Service
 public class CompanyFieldServiceImpl extends AbstractServiceImpl<CompanyField, Long, JpaRepository<CompanyField, Long>> implements CompanyFieldService {
@@ -48,6 +48,12 @@
 
     @Autowired
     private HostingFieldRepository hostingFieldRepository;
+
+    @Autowired
+    private IspFieldService ispFieldService;
+
+    @Autowired
+    private HostingFieldService hostingFieldService;
 
     @Autowired
     private UserService userService;
@@ -112,13 +118,30 @@
 
     // �뾽泥� �긽�꽭 議고쉶�븳�떎.
     @Override
+    @Transactional
     public void detailCompany(Map<String, Object> resJsonData, CompanyFieldCondition companyFieldCondition) {
         CompanyFieldVo companyFieldVo = new CompanyFieldVo();
+        IspFieldVo ispFieldVo = new IspFieldVo();
+        HostingFieldVo hostingFieldVo = new HostingFieldVo();
+
+        IspField ispField = new IspField();
+        HostingField hostingField = new HostingField();
 
         Long companyId = companyFieldCondition.getId();
         if (companyId != null) {
             CompanyField companyField = this.getCompany(companyId);
+            if(companyField.getIspId() != null){
+                ispField = this.ispFieldRepository.getOne(companyField.getIspId());
+            }
+            if(companyField.getHostingId() != null){
+                hostingField = this.hostingFieldRepository.getOne(companyField.getHostingId());
+            }
             companyFieldVo = ConvertUtil.copyProperties(companyField, CompanyFieldVo.class);
+            ispFieldVo = ConvertUtil.copyProperties(ispField, IspFieldVo.class);
+            hostingFieldVo = ConvertUtil.copyProperties(hostingField, HostingFieldVo.class);
+
+            companyFieldVo.setIspFieldVo(ispFieldVo);
+            companyFieldVo.setHostingFieldVo(hostingFieldVo);
         }
         resJsonData.put(Constants.REQ_KEY_CONTENT, companyFieldVo);
     }
@@ -185,28 +208,25 @@
     //  寃��깋 寃곌낵瑜� CompanyFieldVo 濡� 蹂��솚�븳�떎.
     private List<CompanyFieldVo> convertCompanyVoToMap(List<Map<String, Object>> results, Long totalCompanyCount, Pageable pageable, Map<String, Object> resJsonData) {
         List<CompanyFieldVo> companyFieldVos = Lists.newArrayList();
-        List<IspFieldVo> ispFieldVos = Lists.newArrayList();
-        List<HostingFieldVo> hostingFieldVos = Lists.newArrayList();
 
         for (Map<String, Object> result : results) {
             CompanyFieldVo companyFieldVo = ConvertUtil.convertMapToClass(result, CompanyFieldVo.class);
-
-            String url = companyFieldVo.getUrl();
-
-            IspField ispField = this.ispFieldRepository.findByUrl(url);
-            if(ispField != null){
-                IspFieldVo ispFieldVo = ConvertUtil.copyProperties(ispField, IspFieldVo.class);
-                ispFieldVos.add(ispFieldVo);
+            if(companyFieldVo.getIspId() != null && companyFieldVo.getIspId() != -1){
+                //IspField ispField = this.ispFieldRepository.getOne(companyFieldVo.getIspId());
+                IspField ispField = this.ispFieldService.getIsp(companyFieldVo.getIspId());
+                if(ispField != null){
+                    IspFieldVo ispFieldVo = ConvertUtil.copyProperties(ispField, IspFieldVo.class);
+                    companyFieldVo.setIspFieldVo(ispFieldVo);
+                }
             }
-            companyFieldVo.setIspFieldVos(ispFieldVos);
-
-            HostingField hostingField = this.hostingFieldRepository.findByUrl(url);
-            if(hostingField != null){
-                HostingFieldVo hostingFieldVo = ConvertUtil.copyProperties(hostingField, HostingFieldVo.class);
-                hostingFieldVos.add(hostingFieldVo);
+            if(companyFieldVo.getHostingId() != null && companyFieldVo.getIspId() != -1){
+                //HostingField hostingField = this.hostingFieldRepository.getOne(companyFieldVo.getHostingId());
+                HostingField hostingField = this.hostingFieldService.getHosting(companyFieldVo.getHostingId());
+                if(hostingField != null){
+                    HostingFieldVo hostingFieldVo = ConvertUtil.copyProperties(hostingField, HostingFieldVo.class);
+                    companyFieldVo.setHostingFieldVo(hostingFieldVo);
+                }
             }
-            companyFieldVo.setHostingFieldVos(hostingFieldVos);
-
             companyFieldVos.add(companyFieldVo);
         }
 
diff --git a/src/main/java/kr/wisestone/owl/service/impl/HostingFieldServiceImpl.java b/src/main/java/kr/wisestone/owl/service/impl/HostingFieldServiceImpl.java
index 855418a..44d32d4 100644
--- a/src/main/java/kr/wisestone/owl/service/impl/HostingFieldServiceImpl.java
+++ b/src/main/java/kr/wisestone/owl/service/impl/HostingFieldServiceImpl.java
@@ -58,30 +58,9 @@
     // Hosting 異붽�
     @Override
     public HostingField add(HostingFieldForm HostingFieldForm) {
-        if(HostingFieldForm.getUrl() != null){
-            //  url �쑀�슚�꽦 泥댄겕
-            this.verifyUrl(HostingFieldForm.getUrl(), null);
-        }
-
         HostingField HostingField = ConvertUtil.copyProperties(HostingFieldForm, HostingField.class);
         hostingFieldRepository.saveAndFlush(HostingField);
         return HostingField;
-    }
-
-    //  url �쑀�슚�꽦 泥댄겕
-    private void verifyUrl(String url, Long id) {
-        HostingField hostingField;
-
-        if(id == null){
-            hostingField = this.hostingFieldRepository.findByUrl(url);
-        } else {
-            hostingField = this.hostingFieldRepository.findByUrlAndIdNot(url,id);
-        }
-
-        if (hostingField != null) {
-            throw new OwlRuntimeException(
-                    this.messageAccessor.getMessage(MsgConstants.COMPANYFIELD_USED_URL));
-        }
     }
 
     // Hosting 紐⑸줉�쓣 媛��졇�삩�떎.
@@ -114,15 +93,9 @@
     // Hosting �젙濡쒕�� �닔�젙�븳�떎.
     @Override
     public void modify(HostingFieldForm HostingFieldForm) {
-        //  url �쑀�슚�꽦 泥댄겕
-        if(HostingFieldForm.getUrl() != null){
-            this.verifyUrl(HostingFieldForm.getUrl(), HostingFieldForm.getId());
-        }
-
         HostingField HostingField = ConvertUtil.copyProperties(HostingFieldForm, HostingField.class);
         hostingFieldRepository.saveAndFlush(HostingField);
     }
-
 
     // Hosting瑜� �궘�젣�븳�떎.
     @Override
diff --git a/src/main/java/kr/wisestone/owl/service/impl/IspFieldServiceImpl.java b/src/main/java/kr/wisestone/owl/service/impl/IspFieldServiceImpl.java
index d91bec3..785fb73 100644
--- a/src/main/java/kr/wisestone/owl/service/impl/IspFieldServiceImpl.java
+++ b/src/main/java/kr/wisestone/owl/service/impl/IspFieldServiceImpl.java
@@ -58,11 +58,6 @@
     // Isp 異붽�
     @Override
     public IspField add(IspFieldForm IspFieldForm) {
-        //  url �쑀�슚�꽦 泥댄겕
-        if(IspFieldForm.getUrl() != null){
-            this.verifyUrl(IspFieldForm.getUrl(), null);
-        }
-
         IspField IspField = ConvertUtil.copyProperties(IspFieldForm, IspField.class);
         ispFieldRepository.saveAndFlush(IspField);
         return IspField;
@@ -81,23 +76,6 @@
         return this.convertIspVoToMap(results, totalIspCount, pageable, resJsonData);
     }
 
-    //  url �쑀�슚�꽦 泥댄겕
-    private void verifyUrl(String url, Long id) {
-        IspField ispField;
-
-        if(id == null){
-            ispField = this.ispFieldRepository.findByUrl(url);
-        } else {
-            ispField = this.ispFieldRepository.findByUrlAndIdNot(url,id);
-        }
-
-        if (ispField != null) {
-            throw new OwlRuntimeException(
-                    this.messageAccessor.getMessage(MsgConstants.COMPANYFIELD_USED_URL));
-        }
-    }
-
-
     // Isp �긽�꽭 議고쉶�븳�떎.
     @Override
     public void detail(Map<String, Object> resJsonData, IspFieldCondition ispFieldCondition) {
@@ -115,8 +93,6 @@
     @Override
     public void modify(IspFieldForm IspFieldForm) {
         if(IspFieldForm.getUrl() != null){
-            //  url �쑀�슚�꽦 泥댄겕
-            this.verifyUrl(IspFieldForm.getUrl(), IspFieldForm.getId());
         }
 
         IspField IspField = ConvertUtil.copyProperties(IspFieldForm, IspField.class);
diff --git a/src/main/java/kr/wisestone/owl/service/impl/IssueRelationServiceImpl.java b/src/main/java/kr/wisestone/owl/service/impl/IssueRelationServiceImpl.java
index c613a5d..f16b414 100644
--- a/src/main/java/kr/wisestone/owl/service/impl/IssueRelationServiceImpl.java
+++ b/src/main/java/kr/wisestone/owl/service/impl/IssueRelationServiceImpl.java
@@ -65,24 +65,16 @@
     // �뿰愿� �씪媛� 媛��졇�삤湲�
     @Override
     public List<IssueVo> findRelationIssue(Map<String, Object> resJsonData, IssueRelationCondition condition, Pageable pageable) {
-        List<IssueRelation> issueRelations = issueRelationRepository.findAllByIssueId(condition.getIssueId());
-        List<IssueVo> issueVos = new ArrayList<>();
+        List<IssueVo> issueVos = findRelationIssue(condition.getIssueId());
 
-        if (issueRelations != null) {
-            for (IssueRelation issueRelation : issueRelations) {
-                issueVos.add(ConvertUtil.copyProperties(issueRelation.getRelationIssue(), IssueVo.class));
-            }
-
-            int totalCount = issueVos.size();
-
-            resJsonData.put(Constants.RES_KEY_CONTENTS, issueVos);
-            resJsonData.put(Constants.REQ_KEY_PAGE_VO, new ResPage(pageable.getPageNumber(), pageable.getPageSize(),
-                1, totalCount));
-        }
+        resJsonData.put(Constants.RES_KEY_CONTENTS, issueVos);
+        resJsonData.put(Constants.REQ_KEY_PAGE_VO, new ResPage(pageable.getPageNumber(), pageable.getPageSize(),
+            1, issueVos.size()));
 
         return  issueVos;
     }
 
+
     // �뿰愿� �씪媛� 媛��졇�삤湲�
     @Override
     public List<IssueVo> findRelationIssue(Long issueId) {
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 5f53d71..dafd80e 100644
--- a/src/main/java/kr/wisestone/owl/service/impl/IssueServiceImpl.java
+++ b/src/main/java/kr/wisestone/owl/service/impl/IssueServiceImpl.java
@@ -257,15 +257,24 @@
 
             // �긽�쐞�씪媛먯뿉 �궗�슜�븷 以묐났媛� �꽕�젙
             List<CustomFieldApiOverlap> customFieldApiOverlaps = this.customFieldApiOverlapService.find(user.getId(), issueApiForm.getIssueTypeId());
+            if (customFieldApiOverlaps == null || customFieldApiOverlaps.size() == 0){
+                throw new OwlRuntimeException(this.messageAccessor.getMessage(MsgConstants.API_OVERLAP_SETTING_NOT_EXIST));
+            }
             for(int i=0; i < customFieldApiOverlaps.size() ; i++ ){
                 CustomFieldApiOverlap customFieldApiOverlap = customFieldApiOverlaps.get(i);
                 issueApiForm.addUseIssueCustomFieldId(customFieldApiOverlap.getCustomField().getId());
             }
 
-            List<IssueVo> issueVos = this.findIssue(issueApiForm, customFieldApiOverlaps, user.getId());
-            int size = issueVos.size();
+            // 以묐났�맂 �씠�뒋寃��깋
+            List<Issue> issues = this.findIssue(issueApiForm, customFieldApiOverlaps, user.getId());
+            int size = issues.size();
             if (size > 0) {
-                issueForm.setParentIssueId(issueVos.get(0).getId());
+                Issue targetIssue = issues.get(0);
+                if (targetIssue.getParentIssue() != null) {
+                    issueForm.setParentIssueId(targetIssue.getParentIssue().getId());
+                } else {
+                    issueForm.setParentIssueId(targetIssue.getId());
+                }
             }
 
             issueForm.setIsApi(Issue.IS_API_YES);
@@ -326,9 +335,9 @@
     }
 
     // 以묐났�맂 �긽�쐞 �씠�뒋 寃��깋
-    private List<IssueVo> findIssue(IssueApiForm issueApiform, List<CustomFieldApiOverlap> customFieldApiOverlaps, Long userId) {
+    private List<Issue> findIssue(IssueApiForm issueApiform, List<CustomFieldApiOverlap> customFieldApiOverlaps, Long userId) {
         List<IssueCustomFieldValueForm> issueCustomFieldValueForms = issueApiform.getIssueCustomFieldValues();
-        List<IssueVo> resultIssueVos = Lists.newArrayList();
+        List<Issue> resultIssueVos = Lists.newArrayList();
         String comma = ",";
 
         if (issueCustomFieldValueForms.size() > 0) {
@@ -352,10 +361,11 @@
 
             IssueCustomFieldValueCondition issueCustomFieldValueCondition = new IssueCustomFieldValueCondition();
             issueCustomFieldValueCondition.setUseValue(concatUseValue);
+            issueCustomFieldValueCondition.setIssueTypeId(issueApiform.getIssueTypeId());
             List<Map<String, Object>> results = this.issueMapper.findByCustomFieldValue(issueCustomFieldValueCondition);
             if (results != null && results.size() > 0) {
                 for (Map<String, Object> result : results) {
-                    resultIssueVos.add(ConvertUtil.convertMapToClass(result, IssueVo.class));
+                    resultIssueVos.add(this.getIssue(MapUtil.getLong(result, "id")));
                 }
             }
         }
@@ -718,11 +728,11 @@
     public List<IssueVo> findIssue(Map<String, Object> resJsonData, IssueCondition issueCondition, Pageable pageable) {
 
         //  寃��깋 議곌굔�쓣 留뚮뱺�떎
-        /*if (!this.makeIssueSearchCondition(issueCondition, Lists.newArrayList("01", "02", "03"), pageable)) {
+        if (!this.makeIssueSearchCondition(issueCondition, Lists.newArrayList("01", "02", "03"), pageable)) {
             //  �씠�뒋 紐⑸줉�쓣 李얠� 紐삵븷 寃쎌슦 湲곕낯 �젙蹂대줈 由ы꽩�븳�떎.
             this.notFoundIssueList(resJsonData, pageable);
             return Lists.newArrayList();
-        }*/
+        }
 
         Set<String> issueIds = new HashSet<>(); //  �궗�슜�옄 �젙�쓽 �븘�뱶 寃��깋�떆 �굹�삤�뒗 �씠�뒋 �븘�씠�뵒 ���옣 而щ젆�뀡
 
@@ -771,12 +781,19 @@
 
         int totalPage = (int) Math.ceil((totalCount - 1) / pageable.getPageSize()) + 1;
         //  �씠�뒋 �븘�씠�뵒 珥덇린�솕
+
         issueCondition.setIsApi(issueCondition.getIsApi());
+
         issueCondition.setIssueIds(Lists.newArrayList());
         //  Map �뿉 �엳�뒗 �뜲�씠�꽣瑜� IssueVo �뜲�씠�꽣濡� 蹂��솚�븳�떎.
         this.setMapToIssueVo(results, issueVos, issueCondition, user);
 
+        if (issueCondition.getTree()) {
+            this.setDownIssues(issueVos);
+            this.setRelationIssues(issueVos);
+        }
         this.setCountDownIssues(results, issueVos);
+
         this.SetWorkflowDepartment(issueVos); //�썙�겕�뵆濡쒖슦�뿉 �꽕�젙�븳 �떞�떦遺��꽌 媛��졇�삤湲�
 
         resJsonData.put(Constants.RES_KEY_CONTENTS, issueVos);
@@ -786,6 +803,27 @@
         //  �궗�슜�옄 �떆�뒪�뀥 湲곕뒫 �궗�슜 �젙蹂� �닔吏�
         log.info(ElasticSearchUtil.makeUserActiveHistoryMessage(this.webAppUtil.getLoginUser(), ElasticSearchConstants.ISSUE_FIND));
         return issueVos;
+    }
+
+
+    // �븯�쐞 �씠�뒋 �꽭�똿
+    private void setDownIssues(List<IssueVo> issueVos) {
+        for(IssueVo issueVo : issueVos) {
+            List<Issue> downIssues = this.issueRepository.findByParentIssueId(issueVo.getId());
+            for(Issue downIssue : downIssues){
+                issueVo.addIssueDownVo(ConvertUtil.copyProperties(downIssue, IssueVo.class));
+            }
+        }
+    }
+
+    // �뿰愿� �씠�뒋 �꽭�똿
+    private void setRelationIssues(List<IssueVo> issueVos) {
+        for(IssueVo issueVo : issueVos) {
+            List<IssueVo> relationIssues = this.issueRelationService.findRelationIssue(issueVo.getId());
+            for(IssueVo relationIssue : relationIssues){
+                issueVo.addRelationIssueVo(ConvertUtil.copyProperties(relationIssue, IssueVo.class));
+            }
+        }
     }
 
     @Override
@@ -1038,7 +1076,6 @@
         condition.setWorkspaceId(this.userService.getUser(this.webAppUtil.getLoginId()).getLastWorkspaceId());
         projectCondition.setWorkspaceId(condition.getWorkspaceId());
 
-
         //  �봽濡쒖젥�듃 �궎媛� 議댁옱�븷 寃쎌슦 �봽濡쒖젥�듃 �궎�뿉 �빐�떦�븯�뒗 �봽濡쒖젥�듃瑜� 議고쉶�븯怨� 寃��깋 議곌굔�뿉 �뀑�똿�븳�떎.
         if (!this.getProjectByProjectKey(condition.getProjectKey(), condition)) {
             return false;
@@ -1047,9 +1084,7 @@
         //  �봽濡쒖젥�듃瑜� �꽑�깮�븯吏� �븡�븯�쑝硫� �빐�떦 �뾽臾� 怨듦컙�뿉�꽌 李몄뿬�븯怨� �엳�뒗 �봽濡쒖젥�듃瑜� 李얜뒗�떎.
         if (condition.getProjectIds().size() < 1) {
             List<Map<String, Object>> projects = null;
-            UserLevel userLevel = this.userLevelService.getUserLevel(user.getUserLevel().getId());
-            if (this.userWorkspaceService.checkWorkspaceManager(user)
-                    || MngPermission.checkMngPermission(userLevel.getPermission(), MngPermission.USER_PERMISSION_MNG_ISSUE_PROJECT_ALL)) {
+            if (this.userWorkspaceService.checkWorkspaceManager(user)) {
                 projects = this.projectMapper.findByWorkspaceManagerAll(projectCondition);
             } else  {
                 projects = this.projectService.findByWorkspaceIdAndIncludeProjectAll(projectCondition);
@@ -1266,26 +1301,26 @@
     // �븯�쐞 �씠�뒋 �젙蹂대�� �뀑�똿�븳�떎
     private void setDownIssues(Issue issue, IssueVo issueVo) {
         List<Issue> downIssues = this.issueRepository.findByParentIssueId(issue.getId());
-            if(downIssues != null && downIssues.size()>0){
-                List<IssueVo> resultList = new ArrayList<>();
-                for(Issue downIssue : downIssues){
-                    IssueVo downIssueVo = ConvertUtil.copyProperties(downIssue, IssueVo.class);
-                    downIssueVo.setIssueTypeVo(ConvertUtil.copyProperties(downIssue.getIssueType(), IssueTypeVo.class));
-                    downIssueVo.setPriorityVo(ConvertUtil.copyProperties(downIssue.getPriority(), PriorityVo.class));
-                    downIssueVo.setSeverityVo(ConvertUtil.copyProperties(downIssue.getSeverity(), SeverityVo.class));
-                    //�씠�뒋 �긽�깭 異붽�
-                    IssueStatusVo issueStatusVo = ConvertUtil.copyProperties(downIssue.getIssueStatus(), IssueStatusVo.class, "issueStatusType");
-                    issueStatusVo.setIssueStatusType(downIssue.getIssueStatus().getIssueStatusType().toString());
-                    downIssueVo.setIssueStatusVo(issueStatusVo);
+        if(downIssues != null && downIssues.size()>0){
+            List<IssueVo> resultList = new ArrayList<>();
+            for(Issue downIssue : downIssues){
+                IssueVo downIssueVo = ConvertUtil.copyProperties(downIssue, IssueVo.class);
+                downIssueVo.setIssueTypeVo(ConvertUtil.copyProperties(downIssue.getIssueType(), IssueTypeVo.class));
+                downIssueVo.setPriorityVo(ConvertUtil.copyProperties(downIssue.getPriority(), PriorityVo.class));
+                downIssueVo.setSeverityVo(ConvertUtil.copyProperties(downIssue.getSeverity(), SeverityVo.class));
+                //�씠�뒋 �긽�깭 異붽�
+                IssueStatusVo issueStatusVo = ConvertUtil.copyProperties(downIssue.getIssueStatus(), IssueStatusVo.class, "issueStatusType");
+                issueStatusVo.setIssueStatusType(downIssue.getIssueStatus().getIssueStatusType().toString());
+                downIssueVo.setIssueStatusVo(issueStatusVo);
 
-                    this.setRegister(downIssue, downIssueVo); // �벑濡앹옄
-                    this.setIssueDepartment(downIssue, downIssueVo);  //  �떞�떦遺��꽌 �젙蹂� �뀑�똿
-                    this.setIssueCustomFields(downIssue, downIssueVo);   // �궗�슜�옄�젙�쓽�븘�뱶 �젙蹂� �꽭�똿
+                this.setRegister(downIssue, downIssueVo); // �벑濡앹옄
+                this.setIssueDepartment(downIssue, downIssueVo);  //  �떞�떦遺��꽌 �젙蹂� �뀑�똿
+                this.setIssueCustomFields(downIssue, downIssueVo);   // �궗�슜�옄�젙�쓽�븘�뱶 �젙蹂� �꽭�똿
 
-                    resultList.add(downIssueVo);
-                }
-                issueVo.setIssueDownVos(resultList);
+                resultList.add(downIssueVo);
             }
+            issueVo.setIssueDownVos(resultList);
+        }
     }
 
     //  �씠�뒋 �긽�꽭 �젙蹂대�� �뀑�똿�븳�떎.
@@ -1482,10 +1517,10 @@
     // �궗�슜�옄 �젙�쓽 �븘�뱶 媛믪씠 媛숈� �씠�뒋 李얘린
     @Override
     @Transactional
-    public List<IssueVo> findIssue(IssueApiForm issueApiform) {
+    public List<Issue> findIssue(IssueApiForm issueApiform) {
 
         List<IssueCustomFieldValueForm> issueCustomFieldValueForms = issueApiform.getIssueCustomFieldValues();
-        List<IssueVo> resultIssueVos = Lists.newArrayList();
+        List<Issue> resultIssueVos = Lists.newArrayList();
         String comma = ",";
 
         if (issueCustomFieldValueForms.size() > 0) {
@@ -1500,10 +1535,11 @@
 
             IssueCustomFieldValueCondition issueCustomFieldValueCondition = new IssueCustomFieldValueCondition();
             issueCustomFieldValueCondition.setUseValue(concatUseValue);
+            issueCustomFieldValueCondition.setIssueTypeId(issueApiform.getIssueTypeId());
             List<Map<String, Object>> results = this.issueMapper.findByCustomFieldValue(issueCustomFieldValueCondition);
             if (results != null && results.size() > 0) {
                 for (Map<String, Object> result : results) {
-                    resultIssueVos.add(ConvertUtil.convertMapToClass(result, IssueVo.class));
+                    resultIssueVos.add(this.getIssue(MapUtil.getLong(result, "id")));
                 }
             }
         }
@@ -1529,11 +1565,10 @@
         User user = this.convertToUser(issueApiForm.getToken());
         IssueForm issueForm = this.convertToIssueForm(issueApiForm, user);
 
-        List<IssueVo> issueVos = this.findIssue(issueApiForm);
-        if (issueVos != null && issueVos.size() > 0) {
-            List<Issue> issue = Lists.newArrayList();
-            for (IssueVo issueVo : issueVos) {
-                IssueVo parentIssueVo = issueVo.getParentIssueVo();
+        List<Issue> issue = this.findIssue(issueApiForm);
+        if (issue != null && issue.size() > 0) {
+            List<Issue> issues = Lists.newArrayList();
+            for (Issue issueVo : issue) {
                 issueForm.setId(issueVo.getId());
 
                 // �옄�룞 醫낅즺 �긽�깭 �꽕�젙�씠 �릺�뼱 �엳吏� �븡�쑝硫� �삤瑜섎컻�깮
@@ -1555,9 +1590,9 @@
                     }
                 }
 
-                issue.add(modifyIssue);
+                issues.add(modifyIssue);
             }
-            return issue;
+            return issues;
         } else {
             throw new OwlRuntimeException(
                     this.messageAccessor.getMessage(MsgConstants.API_ISSUE_NOT_EXIST));
@@ -1879,8 +1914,8 @@
         //hasPermission = this.checkIssueModifyPermission(hasPermission, Issue.ASSIGNEE, issueVo, issueUserVos);
         //  �떞�떦�옄媛� �뾾�쑝硫� 紐⑤뱺 �궗�슜�옄媛� �닔�젙 沅뚰븳�쓣 媛뽯뒗�떎.
 
-        hasPermission = this.checkIssueModifyPermission(hasPermission, Issue.ALL_ISSUE_MANAGER, issueVo, null, null, user);
-        hasPermission = this.checkIssueModifyPermission(hasPermission, Issue.ALL_PROJECT_MANAGER, issueVo, null, null, user);
+        //hasPermission = this.checkIssueModifyPermission(hasPermission, Issue.ALL_ISSUE_MANAGER, issueVo, null, null, user);
+        //hasPermission = this.checkIssueModifyPermission(hasPermission, Issue.ALL_PROJECT_MANAGER, issueVo, null, null, user);
 
         return hasPermission;
     }
@@ -2163,38 +2198,39 @@
     }
 
     private Issue issueRemoves(Long issueId, User user) {
-        Issue issue = this.findOne(issueId);
-        if(issue != null){
-            //  �씠�뒋 �닔�젙 沅뚰븳�쓣 媛뽮퀬 �엳�뒗吏� �솗�씤
-            this.verifyIssueModifyPermission(issue, user);
-
-            //  �씠�뒋 泥⑤� �뙆�씪�쓣 �궘�젣�븳�떎.
-            if (issue.getAttachedFiles().size() > 0) {
-                List<Long> attachedFileIds = Lists.newArrayList();
-
-                for (AttachedFile attachedFile : issue.getAttachedFiles()) {
-                    attachedFileIds.add(attachedFile.getId());
-                }
-                //  泥⑤��뙆�씪 �궘�젣
-                this.attachedFileService.removeAttachedFiles(attachedFileIds);
-            }
-
-            // 吏��슱 �씠�뒋媛� �뿰愿��씠�뒋�씤吏� 泥댄겕 �썑 �뿰愿��씠�뒋 �뀒�씠釉붿뿉�꽌�룄 �궘�젣�븳�떎.
-            List<IssueRelation> issueRelationList = this.issueRelationRepository.findByRelationIssueId(issueId);
-            if (issueRelationList != null && issueRelationList.size() > 0) {
-                for(IssueRelation issueRelation : issueRelationList){
-                    StringBuilder sb = new StringBuilder();
-                    issueHistoryService.detectRelationIssue(IssueHistoryType.DELETE, issueRelation, sb);
-                    issueHistoryService.addIssueHistory(issueRelation.getIssue(), IssueHistoryType.MODIFY, sb.toString());
-                    this.issueRelationRepository.delete(issueRelation);
-                }
-            }
-
-            //  �씠�뒋 �깮�꽦, �궘�젣�떆 �삁�빟 �씠硫붿씪�뿉 �벑濡앺빐�넃�뒗�떎.
-            this.reservationIssueEmail(issue, EmailType.ISSUE_REMOVE);
-            //  �씠�뒋 �궘�젣
-            this.issueRepository.delete(issue);
+        Issue issue = null;
+        if(issueId != null){
+            issue = this.getIssue(issueId);
         }
+        //  �씠�뒋 �닔�젙 沅뚰븳�쓣 媛뽮퀬 �엳�뒗吏� �솗�씤
+        this.verifyIssueModifyPermission(issue, user);
+
+        //  �씠�뒋 泥⑤� �뙆�씪�쓣 �궘�젣�븳�떎.
+        if (issue.getAttachedFiles().size() > 0) {
+            List<Long> attachedFileIds = Lists.newArrayList();
+
+            for (AttachedFile attachedFile : issue.getAttachedFiles()) {
+                attachedFileIds.add(attachedFile.getId());
+            }
+            //  泥⑤��뙆�씪 �궘�젣
+            this.attachedFileService.removeAttachedFiles(attachedFileIds);
+        }
+
+        // 吏��슱 �씠�뒋媛� �뿰愿��씠�뒋�씤吏� 泥댄겕 �썑 �뿰愿��씠�뒋 �뀒�씠釉붿뿉�꽌�룄 �궘�젣�븳�떎.
+        List<IssueRelation> issueRelationList = this.issueRelationRepository.findByRelationIssueId(issueId);
+        if (issueRelationList != null && issueRelationList.size() > 0) {
+            for(IssueRelation issueRelation : issueRelationList){
+                StringBuilder sb = new StringBuilder();
+                issueHistoryService.detectRelationIssue(IssueHistoryType.DELETE, issueRelation, sb);
+                issueHistoryService.addIssueHistory(issueRelation.getIssue(), IssueHistoryType.MODIFY, sb.toString());
+                this.issueRelationRepository.delete(issueRelation);
+            }
+        }
+
+        //  �씠�뒋 �깮�꽦, �궘�젣�떆 �삁�빟 �씠硫붿씪�뿉 �벑濡앺빐�넃�뒗�떎.
+        this.reservationIssueEmail(issue, EmailType.ISSUE_REMOVE);
+        //  �씠�뒋 �궘�젣
+        this.issueRepository.delete(issue);
 
         return issue;
     }
@@ -3458,7 +3494,6 @@
         }
         this.issueHistoryService.addIssueHistory(parentIssue, IssueHistoryType.MODIFY, sb.toString()); //parentIssue = myIssue(湲곕줉�� �쁽�옱 �긽�꽭�럹�씠吏��뿉 �빐�빞�븯�땲源�)
         this.issueRepository.saveAndFlush(issue);
-
     }
 
     @Override
diff --git a/src/main/java/kr/wisestone/owl/vo/CompanyFieldVo.java b/src/main/java/kr/wisestone/owl/vo/CompanyFieldVo.java
index f09ad46..5005a50 100644
--- a/src/main/java/kr/wisestone/owl/vo/CompanyFieldVo.java
+++ b/src/main/java/kr/wisestone/owl/vo/CompanyFieldVo.java
@@ -11,14 +11,15 @@
     private String email;
     private String url;
     private String memo;
+    private Long ispId;
+    private Long hostingId;
 
-    private List<IspFieldVo> ispFieldVos = Lists.newArrayList();
-    private List<HostingFieldVo> hostingFieldVos = Lists.newArrayList();
+    private IspFieldVo ispFieldVo;
+    private HostingFieldVo hostingFieldVo;
 
     public CompanyFieldVo() {}
 
     public CompanyFieldVo(String manager, String tel, String email, String memo) {
-
         this.manager = manager;
         this.tel = tel;
         this.email = email;
@@ -66,19 +67,35 @@
         this.url = url;
     }
 
-    public List<IspFieldVo> getIspFieldVos() {
-        return ispFieldVos;
+    public IspFieldVo getIspFieldVo() {
+        return ispFieldVo;
     }
 
-    public void setIspFieldVos(List<IspFieldVo> ispFieldVos) {
-        this.ispFieldVos = ispFieldVos;
+    public void setIspFieldVo(IspFieldVo ispFieldVo) {
+        this.ispFieldVo = ispFieldVo;
     }
 
-    public List<HostingFieldVo> getHostingFieldVos() {
-        return hostingFieldVos;
+    public HostingFieldVo getHostingFieldVo() {
+        return hostingFieldVo;
     }
 
-    public void setHostingFieldVos(List<HostingFieldVo> hostingFieldVos) {
-        this.hostingFieldVos = hostingFieldVos;
+    public void setHostingFieldVo(HostingFieldVo hostingFieldVo) {
+        this.hostingFieldVo = hostingFieldVo;
+    }
+
+    public Long getIspId() {
+        return ispId;
+    }
+
+    public void setIspId(Long ispId) {
+        this.ispId = ispId;
+    }
+
+    public Long getHostingId() {
+        return hostingId;
+    }
+
+    public void setHostingId(Long hostingId) {
+        this.hostingId = hostingId;
     }
 }
diff --git a/src/main/java/kr/wisestone/owl/vo/IssueVo.java b/src/main/java/kr/wisestone/owl/vo/IssueVo.java
index 69600a2..264c5d3 100644
--- a/src/main/java/kr/wisestone/owl/vo/IssueVo.java
+++ b/src/main/java/kr/wisestone/owl/vo/IssueVo.java
@@ -420,6 +420,12 @@
         this.issueRelations.add(issueRelationVo);
     }
 
+    public void addRelationIssueVo(IssueVo issueVo) {
+        if (this.issueRelationVos != null) {
+            this.issueRelationVos.add(issueVo);
+        }
+    }
+
     /*public void addIssueDownVo(IssueDownVo issueDownVo) {
         if (this.issueDownVos == null){
             this.issueDownVos = new ArrayList<>();
@@ -456,6 +462,12 @@
         this.issueDownVos = issueDownVos;
     }
 
+    public void addIssueDownVo(IssueVo issueVo) {
+        if (this.issueDownVos != null) {
+            this.issueDownVos.add(issueVo);
+        }
+    }
+
     public IssueVo getParentIssueVo() {
         return parentIssueVo;
     }
diff --git a/src/main/java/kr/wisestone/owl/web/condition/CompanyFieldCondition.java b/src/main/java/kr/wisestone/owl/web/condition/CompanyFieldCondition.java
index f0b62ab..a87a5af 100644
--- a/src/main/java/kr/wisestone/owl/web/condition/CompanyFieldCondition.java
+++ b/src/main/java/kr/wisestone/owl/web/condition/CompanyFieldCondition.java
@@ -12,6 +12,8 @@
     private String email;
     private String url;
     private String memo;
+    private Long ispId;
+    private Long hostingId;
 
     private Integer Page;
     private Integer PageSize;
@@ -91,4 +93,20 @@
     public void setUrl(String url) {
         this.url = url;
     }
+
+    public Long getIspId() {
+        return ispId;
+    }
+
+    public void setIspId(Long ispId) {
+        this.ispId = ispId;
+    }
+
+    public Long getHostingId() {
+        return hostingId;
+    }
+
+    public void setHostingId(Long hostingId) {
+        this.hostingId = hostingId;
+    }
 }
diff --git a/src/main/java/kr/wisestone/owl/web/condition/IssueCondition.java b/src/main/java/kr/wisestone/owl/web/condition/IssueCondition.java
index f25688b..c67133a 100644
--- a/src/main/java/kr/wisestone/owl/web/condition/IssueCondition.java
+++ b/src/main/java/kr/wisestone/owl/web/condition/IssueCondition.java
@@ -54,6 +54,7 @@
     private List<Long> excludeIds = Lists.newArrayList();
     private List<Long> myDepartmentIds; // �궡媛� �냽�빐�엳�뒗 遺��꽌 ID
     private Boolean hideIssue;
+    private Boolean isTree; // �듃由ш뎄議� 紐⑤뱶 �씪�븣
 
     public IssueCondition(){}
 
@@ -182,6 +183,10 @@
 
         if (MapUtil.getBoolean(conditions, "hideIssue") != null) {
             condition.setHideIssue(MapUtil.getBoolean(conditions, "hideIssue"));
+        }
+
+        if (MapUtil.getBoolean(conditions, "isTree") != null) {
+            condition.setTree(MapUtil.getBoolean(conditions, "isTree"));
         }
 
         return condition;
@@ -510,4 +515,12 @@
     public void setHideIssue(Boolean hideIssue) {
         this.hideIssue = hideIssue;
     }
+
+    public Boolean getTree() {
+        return isTree;
+    }
+
+    public void setTree(Boolean tree) {
+        isTree = tree;
+    }
 }
diff --git a/src/main/java/kr/wisestone/owl/web/condition/IssueCustomFieldValueCondition.java b/src/main/java/kr/wisestone/owl/web/condition/IssueCustomFieldValueCondition.java
index 9231e18..063557f 100644
--- a/src/main/java/kr/wisestone/owl/web/condition/IssueCustomFieldValueCondition.java
+++ b/src/main/java/kr/wisestone/owl/web/condition/IssueCustomFieldValueCondition.java
@@ -13,6 +13,7 @@
  * Created by wisestone on 2018-06-07.
  */
 public class IssueCustomFieldValueCondition {
+    private Long issueTypeId;
     private Long workspaceId;
     private Long customFieldId;
     private String customFieldType;
@@ -61,6 +62,14 @@
         return condition;
     }
 
+    public Long getIssueTypeId() {
+        return issueTypeId;
+    }
+
+    public void setIssueTypeId(Long issueTypeId) {
+        this.issueTypeId = issueTypeId;
+    }
+
     public Long getWorkspaceId() {
         return workspaceId;
     }
diff --git a/src/main/java/kr/wisestone/owl/web/controller/ApiController.java b/src/main/java/kr/wisestone/owl/web/controller/ApiController.java
index 7033cf2..ed16ccc 100644
--- a/src/main/java/kr/wisestone/owl/web/controller/ApiController.java
+++ b/src/main/java/kr/wisestone/owl/web/controller/ApiController.java
@@ -72,7 +72,6 @@
         Pageable pageable = this.pageUtil.convertPageable(this.getPageVo(params));
 
         // todo
-
         return this.setSuccessMessage(resJsonData);
     }
 }
diff --git a/src/main/java/kr/wisestone/owl/web/form/CompanyFieldForm.java b/src/main/java/kr/wisestone/owl/web/form/CompanyFieldForm.java
index 4c4f8e3..4d7b4a0 100644
--- a/src/main/java/kr/wisestone/owl/web/form/CompanyFieldForm.java
+++ b/src/main/java/kr/wisestone/owl/web/form/CompanyFieldForm.java
@@ -12,6 +12,9 @@
     private String tel;
     private String url;
     private String memo;
+    private Long ispId;
+    private Long hostingId;
+
     private List<Long> removeIds = Lists.newArrayList();
 
     public CompanyFieldForm() {
@@ -57,6 +60,22 @@
         this.memo = memo;
     }
 
+    public Long getIspId() {
+        return ispId;
+    }
+
+    public void setIspId(Long ispId) {
+        this.ispId = ispId;
+    }
+
+    public Long getHostingId() {
+        return hostingId;
+    }
+
+    public void setHostingId(Long hostingId) {
+        this.hostingId = hostingId;
+    }
+
     public List<Long> getRemoveIds() {
         return removeIds;
     }
diff --git a/src/main/java/kr/wisestone/owl/web/form/IssueCustomFieldValueForm.java b/src/main/java/kr/wisestone/owl/web/form/IssueCustomFieldValueForm.java
index d6c7278..3070949 100644
--- a/src/main/java/kr/wisestone/owl/web/form/IssueCustomFieldValueForm.java
+++ b/src/main/java/kr/wisestone/owl/web/form/IssueCustomFieldValueForm.java
@@ -1,11 +1,20 @@
 package kr.wisestone.owl.web.form;
 
 public class IssueCustomFieldValueForm {
+    private Long issueTypeId;
     private Long customFieldId;
     private String useValue;
 
     public IssueCustomFieldValueForm(){}
 
+    public Long getIssueTypeId() {
+        return issueTypeId;
+    }
+
+    public void setIssueTypeId(Long issueTypeId) {
+        this.issueTypeId = issueTypeId;
+    }
+
     public Long getCustomFieldId() {
         return customFieldId;
     }
diff --git a/src/main/resources/migration/V1_13__Alter_Table.sql b/src/main/resources/migration/V1_13__Alter_Table.sql
index 36a476b..7b53c33 100644
--- a/src/main/resources/migration/V1_13__Alter_Table.sql
+++ b/src/main/resources/migration/V1_13__Alter_Table.sql
@@ -15,3 +15,13 @@
 
 -- �뾽泥댁쓽 url 而щ읆 INDEX 異붽�
 ALTER TABLE `company_field` ADD INDEX `urlIndex`(`url`);
+
+ALTER TABLE `company_field` ADD COLUMN `isp_id` bigint(20) DEFAULT NULL;
+ALTER TABLE `company_field` ADD COLUMN `hosting_id` bigint(20) DEFAULT NULL;
+
+ALTER TABLE `company_field` ADD INDEX `ispIdIndex`(`isp_id`);
+ALTER TABLE `company_field` ADD INDEX `hostingIdIndex`(`hosting_id`);
+
+
+
+
diff --git a/src/main/resources/mybatis/query-template/companyField-template.xml b/src/main/resources/mybatis/query-template/companyField-template.xml
index 18c73ac..e4b8e15 100644
--- a/src/main/resources/mybatis/query-template/companyField-template.xml
+++ b/src/main/resources/mybatis/query-template/companyField-template.xml
@@ -11,7 +11,9 @@
         cf.tel as tel,
         cf.email as email,
         cf.url as url,
-        cf.memo as memo
+        cf.memo as memo,
+        cf.isp_id as ispId,
+        cf.hosting_id as hostingId
         FROM
         company_field cf
         WHERE 1=1
diff --git a/src/main/resources/mybatis/query-template/issue-template.xml b/src/main/resources/mybatis/query-template/issue-template.xml
index d6d1ee8..a86525d 100644
--- a/src/main/resources/mybatis/query-template/issue-template.xml
+++ b/src/main/resources/mybatis/query-template/issue-template.xml
@@ -200,7 +200,7 @@
         AND issue.reverse_index <![CDATA[ < ]]> 0
         AND workspace.id = #{workspaceId}
         GROUP BY issue.id
-        ORDER BY issue.register_date DESC
+        ORDER BY issue.modify_date DESC
         <if test="page != null and !page.equals('')">
             limit #{pageSize} offset #{page};
         </if>
@@ -252,7 +252,7 @@
         LEFT OUTER JOIN (SELECT issue_id, COUNT(id) as issueCommentCount FROM issue_comment GROUP BY issue_id)
         temp_issue_comment on (temp_issue_comment.issue_id = issue.id)
         WHERE 1=1
-        <if test="keyWord != null and !keyWord.equals('') ">
+        <if test="keyWord != null and !keyWord.equals('') and myDepartmentIds.size != 0">
             AND issue.title like CONCAT('%',#{keyWord},'%')
             OR issue.description like CONCAT('%',#{keyWord},'%')
             OR issue.start_date like CONCAT('%',#{keyWord},'%')
@@ -395,7 +395,7 @@
         AND issue.reverse_index <![CDATA[ < ]]> 0
         AND workspace.id = #{workspaceId}
         GROUP BY issue.id
-        ORDER BY issue.register_date DESC
+        ORDER BY issue.modify_date DESC
         <if test="page != null and !page.equals('')">
             limit #{pageSize} offset #{page};
         </if>
@@ -808,11 +808,11 @@
     <select id="findByIssueTypeId" resultType="java.util.HashMap"
             parameterType="java.lang.Long">
         SELECT
-        i.id as issueId,
-        iss.id as issueStatusId,
-        iss.name as issueStatusName
+            i.id as issueId,
+            iss.id as issueStatusId,
+            iss.name as issueStatusName
         FROM issue i
-        INNER JOIN issue_status iss on iss.id = i.issue_status_id
+                 INNER JOIN issue_status iss on iss.id = i.issue_status_id
         WHERE i.issue_type_id = #{issueTypeId}
     </select>
 
@@ -832,7 +832,7 @@
     <select id="findByProjectId" resultType="java.util.HashMap"
             parameterType="kr.wisestone.owl.web.condition.IssueCondition">
         SELECT
-        id
+            id
         FROM issue
         WHERE project_id = #{projectId}
     </select>
@@ -955,24 +955,24 @@
 
     <!--    �씠�뒋 �쑀�삎�쓣 �궗�슜�븯�뒗 �씠�뒋 媛��닔瑜� 議고쉶�븳�떎 -->
     <select id="countByIssueTypeId" resultType="java.lang.Long" parameterType="java.lang.Long">
-      SELECT COUNT(DISTINCT id) FROM
-      issue WHERE issue_type_id = #{issueTypeId};
+        SELECT COUNT(DISTINCT id) FROM
+            issue WHERE issue_type_id = #{issueTypeId};
     </select>
 
     <!--    �씠�뒋 �쑀�삎�쓣 �궗�슜�븯�뒗 �씠�뒋 媛��닔瑜� 議고쉶�븳�떎(湲곌컙) -->
     <select id="countByIssueTypeIdAndDate" resultType="java.lang.Long" parameterType="kr.wisestone.owl.web.condition.IssueTypeCondition">
         SELECT
-               COUNT(DISTINCT id)
+            COUNT(DISTINCT id)
         FROM issue
         WHERE issue_type_id = #{id}
-                    AND register_date BETWEEN #{startDate} AND #{endDate}
-                    AND is_api = #{isApi};
+          AND register_date BETWEEN #{startDate} AND #{endDate}
+          AND is_api = #{isApi};
     </select>
 
     <!--    �씠�뒋 �긽�깭瑜� �궗�슜�븯�뒗 �씠�뒋 媛��닔瑜� 議고쉶�븳�떎. -->
     <select id="countByIssueStatusId" resultType="java.lang.Long" parameterType="java.lang.Long">
         SELECT COUNT(DISTINCT id) FROM
-        issue WHERE issue_status_id = #{issueStatusId};
+            issue WHERE issue_status_id = #{issueStatusId};
     </select>
 
 
@@ -985,12 +985,13 @@
             GROUP_CONCAT(customFieldValue.useValue) AS concatUseValue
         FROM issue issue FORCE INDEX(reverseIndex)
         INNER JOIN issue_status as issStatus ON issue.issue_status_id = issStatus.id
-        LEFT OUTER JOIN (
+            LEFT OUTER JOIN (
             SELECT cf.id AS customFieldId, cf.custom_field_type AS customFieldType, issue_custom.use_value AS useValue, issue_custom.issue_id AS issueId
             FROM issue_custom_field_value issue_custom
             INNER JOIN custom_field cf ON cf.id = issue_custom.custom_field_id
             ORDER BY issue_custom.id ASC) customFieldValue ON customFieldValue.issueId = issue.id
         WHERE issStatus.issue_status_type != 'CLOSE'
+          AND issue.issue_type_id = #{issueTypeId}
         GROUP BY issue.id
         HAVING concatUseValue LIKE CONCAT('%', #{useValue}, '%')
     </select>
@@ -999,12 +1000,12 @@
     <!--  醫낅즺 �븞�맂 �븯�쐞 �씠�뒋 媛��졇�삤湲� -->
     <select id="findNotCompleteByParentIssueId" resultType="java.util.HashMap" parameterType="kr.wisestone.owl.web.condition.IssueCondition">
         SELECT
-        iss.id as id,
-        iss.title as title
+            iss.id as id,
+            iss.title as title
         FROM issue iss
-        INNER JOIN issue_status issueStatus on iss.issue_status_id = issueStatus.id
+                 INNER JOIN issue_status issueStatus on iss.issue_status_id = issueStatus.id
         WHERE iss.parent_issue_id = #{parentIssueId}
-        AND iss.id != #{id}
-        AND issueStatus.issue_status_type != 'CLOSE'
+          AND iss.id != #{id}
+          AND issueStatus.issue_status_type != 'CLOSE'
     </select>
 </mapper>
diff --git a/src/main/webapp/custom_components/js-tree/js-tree.directive.js b/src/main/webapp/custom_components/js-tree/js-tree.directive.js
new file mode 100644
index 0000000..dea51c0
--- /dev/null
+++ b/src/main/webapp/custom_components/js-tree/js-tree.directive.js
@@ -0,0 +1,36 @@
+'use strict';
+
+define(['app'],
+    function (app) {
+        app.directive('jsTree', ['$log',
+            function ($log) {
+                return {
+                    restrict : 'E',
+                    scope : {
+                        event : '=',
+                        data : '=',
+                        tableConfigs : '=',
+                        useSort : '=', // �젙�졊 湲곕뒫 �궗�슜 �뿬遺�
+                        detailView : "="    //  �씠�뒋 紐⑸줉 �긽�꽭�삎 蹂�寃쎌쓣 �쐞�빐 �궗�슜. �떎瑜� �솕硫댁� �궗�슜�븯吏� �븡�쓬.
+                    },
+                    replace : true,
+                    templateUrl : '/custom_components/js-tree/js-tree.html',
+                    controller : function ($scope, $element, $attrs) {
+                        $scope.fn = {
+                            getResponseData : getResponseData
+                        }
+
+                        //  �뀒�씠釉� �젙蹂� 媛��졇�삤湲�
+                        function getResponseData() {
+                            return $scope.data;
+                        }
+                    },
+                    link : function (scope, element, attrs) {
+
+                    },
+
+                };
+            }])
+    });
+
+
diff --git a/src/main/webapp/custom_components/js-tree/js-tree.html b/src/main/webapp/custom_components/js-tree/js-tree.html
new file mode 100644
index 0000000..d3c2950
--- /dev/null
+++ b/src/main/webapp/custom_components/js-tree/js-tree.html
@@ -0,0 +1,16 @@
+<ul>
+    <li ng-repeat="row in fn.getResponseData()">
+        <span>{{row.title}}</span>
+        <ul>
+            <li ng-repeat="downRow in row.issueDownVos">
+
+
+                <span>{{downRow.title}}</span>
+            </li>
+        </ul>
+    </li>
+
+    <li ng-if="fn.getResponseData().length == 0">
+        <span translate="common.noData">�뜲�씠�꽣媛� �뾾�뒿�땲�떎.</span>
+    </li>
+</ul>
\ No newline at end of file
diff --git a/src/main/webapp/custom_components/js-tree/tree.provider.js b/src/main/webapp/custom_components/js-tree/tree.provider.js
new file mode 100644
index 0000000..544308a
--- /dev/null
+++ b/src/main/webapp/custom_components/js-tree/tree.provider.js
@@ -0,0 +1,234 @@
+'use strict';
+
+define(['app', 'angular'],
+    function (app, angular) {
+        app.provider("$treeProvider", function () {
+            return {
+                $get : function ($log) {
+                    return {
+                        config : function () {
+                            var tableConfig = {
+                                hName : "",	//	�뿤�뜑 �씠由�
+                                hWidth : "",	//	移쇰읆 湲몄씠
+                                hChecked : false,	//	泥댄겕 諛뺤뒪 �꽑�깮 �뿬遺�
+                                hAlign : "text-center",	//	�뿤�뜑 �젙�젹 湲곗�
+                                hSort : true,	//	�젙�젹 媛��뒫 �뿬遺�
+                                dName : "",	//	�뜲�씠�꽣 �씠由�
+                                dAlign : "text-left",	//	�뜲�씠�꽣 �젙�젹 湲곗�
+                                dRenderer : "",	//	�젋�뜑�윭 �뿬遺�
+                                dVisible : "",  //      bootstrap 諛섏쓳�삎 而щ읆 �몴�떆 �뿬遺�
+                                dType : "none",        // �깭洹� ���엯
+                                dDateFormat : "",   //  �궇吏� �삎�떇
+                                rowSpan : 0,    //  rowspan �쓣 吏��썝�븳�떎.
+                                colSpan : 0,    //  colspan �쓣 吏��썝�븳�떎.
+                                subHead : false,    //  留뚯빟 rowspan, colspan �쓣 �궗�슜�븯寃� �릺硫� true 濡� �뀑�똿.
+                                columnHint : "",    //  而щ읆 �젙蹂대�� 異붿텧�븯湲� �쐞�븳 �엺�듃 �젙蹂대�� 以��떎 - tableColumnGenerator �쓽 �궗�슜�옄 �젙�쓽 �븘�뱶 遺�遺꾩뿉�꽌 �궗�슜
+                                setHName : function (hName) {
+                                    this.hName = hName;
+                                    return this;
+                                },
+                                setHWidth : function (hWidth) {
+                                    this.hWidth = hWidth;
+                                    return this;
+                                },
+                                setHChecked : function (hChecked) {
+                                    this.hChecked = hChecked;
+                                    return this;
+                                },
+                                setHAlign : function (hAlign) {
+                                    this.hAlign = hAlign;
+                                    return this;
+                                },
+                                setHSort : function (hSort) {
+                                    this.hSort = hSort;
+                                    return this;
+                                },
+                                setDName : function (dName) {
+                                    this.dName = dName;
+                                    return this;
+                                },
+                                setDAlign : function (dAlign) {
+                                    this.dAlign = dAlign;
+                                    return this;
+                                },
+                                setDRenderer : function (dRenderer) {
+                                    this.dRenderer = dRenderer;
+                                    return this;
+                                },
+                                setDVisible : function (dVisible) {
+                                    this.dVisible = dVisible;
+                                    return this;
+                                },
+                                setDType : function (dType) {
+                                    this.dType = dType;
+                                    return this;
+                                },
+                                setDDateFormat : function (dDateFormat) {
+                                    this.dDateFormat = dDateFormat;
+                                    return this;
+                                },
+                                setRowSpan : function (dRowSpan) {
+                                    this.rowSpan = dRowSpan;
+                                    return this;
+                                },
+                                setColSpan : function (dColSpan) {
+                                    this.colSpan = dColSpan;
+                                    return this;
+                                },
+                                setSubHead : function (dSubHead) {
+                                    this.subHead = dSubHead;
+                                    return this;
+                                },
+                                setColumnHint : function (dColumnHint) {
+                                    this.columnHint = dColumnHint;
+                                    return this;
+                                }
+                            };
+
+                            return tableConfig;
+                        },
+                        toggleChecked : function (checkStatus, datas) {
+                            //  �쟾泥� �꽑�깮 泥댄겕 諛뺤뒪瑜� �겢由��뻽�쓣 寃쎌슦
+                            angular.forEach(datas, function (data) {
+                                if (angular.isDefined(data.defaultYn)) {
+                                    if (!data.defaultYn) {
+                                        data.checked = checkStatus;
+                                    }
+                                }
+                                else {
+                                    data.checked = checkStatus;
+                                }
+                            });
+                        },
+                        radioChecked : function (target, datas) {
+                            //  �빐�떦 row 媛� �씪�뵒�삤 踰꾪듉�씪 寃쎌슦
+                            angular.forEach(datas, function (data) {
+                                if (target.id == data.id) {
+                                    data.checked = true;
+                                }
+                                else {
+                                    data.checked = false;
+                                }
+                            });
+                        },
+                        rowChecked : function (tableConfig, target, datas) {
+                            //  媛� row �쓽 泥댄겕諛뺤뒪/�씪�뵒�삤 踰꾪듉�쓣 �겢由��뻽�쓣 寃쎌슦
+                            if (tableConfig[0].dType == "checkbox") {
+                                target.checked = !target.checked;
+
+                                for (var data in datas) {
+                                    if (!data.checked) {
+                                        this.hChecked = false;
+                                        break;
+                                    }
+                                }
+                            }
+                            else if (tableConfig[0].dType == "radio") {
+                                this.radioChecked(target, datas);
+                            }
+                        },
+                        orderByColumn : "",  // table order By column name
+                        reverse : true,
+                        setOrderByColumn : function (column) {
+                            if (column == "") {
+                                return;
+                            }
+
+                            if (this.orderByColumn == column) {
+                                this.reverse = !this.reverse;
+                            }
+                            else {
+                                this.reverse = true;
+                            }
+
+                            this.orderByColumn = column;
+                            return this;
+                        },
+                        getDateFormat : function (formatType, date) {
+                            if (formatType == "" || formatType == null) {
+                                formatType = "01";
+                            }
+                            Date.prototype.format = function (f) {
+                                if (!this.valueOf()) {
+                                    return " ";
+                                }
+                                var weekName = ["�씪�슂�씪", "�썡�슂�씪", "�솕�슂�씪", "�닔�슂�씪", "紐⑹슂�씪", "湲덉슂�씪", "�넗�슂�씪"];
+                                var d = this;
+
+                                return f.replace(/(yyyy|yy|MM|dd|E|hh|mm|ss|a\/p)/gi, function ($1) {
+                                    switch ($1) {
+                                        case "yyyy":
+                                            return d.getFullYear();
+                                        case "yy":
+                                            return (d.getFullYear() % 1000).zf(2);
+                                        case "MM":
+                                            return (d.getMonth() + 1).zf(2);
+                                        case "dd":
+                                            return d.getDate().zf(2);
+                                        case "E":
+                                            return weekName[d.getDay()];
+                                        case "HH":
+                                            return d.getHours().zf(2);
+                                        case "hh":
+                                            var h = d.getHours();
+                                            return ((h = d.getHours() % 12) ? h : 12).zf(2);
+                                        case "mm":
+                                            return d.getMinutes().zf(2);
+                                        case "ss":
+                                            return d.getSeconds().zf(2);
+                                        case "a/p":
+                                            return d.getHours() < 12 ? "�삤�쟾" : "�삤�썑";
+                                        default:
+                                            return $1;
+                                    }
+                                });
+                            };
+
+                            String.prototype.string = function (len) {
+                                var s = '', i = 0;
+                                while (i++ < len) {
+                                    s += this;
+                                }
+                                return s;
+                            };
+                            String.prototype.zf = function (len) {
+                                return "0".string(len - this.length) + this;
+                            };
+                            Number.prototype.zf = function (len) {
+                                return this.toString().zf(len);
+                            };
+
+                            var dateFormat = "";
+                            var dynamicTime = false;
+                            var today = new Date().format("yyyy-MM-dd");
+                            var compareDate = new Date(date).format("yyyy-MM-dd");
+
+                            if (today == compareDate) {
+                                dynamicTime = true;
+                            }
+
+                            switch (formatType) {
+                                case "01":  //  �궇吏�
+                                    dateFormat = "yyyy-MM-dd";
+                                    break;
+                                case "02":  //  �궇吏� + �떆媛�
+                                    dateFormat = "yyyy-MM-dd HH:mm";
+                                    break;
+                                case "03":  //  �쑀�룞�쟻 �몴�떆
+                                    if (dynamicTime) {
+                                        dateFormat = "HH:mm";
+                                    }
+                                    else {
+                                        dateFormat = "yyyy-MM-dd HH:mm";
+                                    }
+
+                                    break;
+                            }
+
+                            return dateFormat;
+                        }
+                    }
+                }
+            }
+        });
+    });
diff --git a/src/main/webapp/custom_components/js-tree/treeColumnGenerator.directive.js b/src/main/webapp/custom_components/js-tree/treeColumnGenerator.directive.js
new file mode 100644
index 0000000..c6854fe
--- /dev/null
+++ b/src/main/webapp/custom_components/js-tree/treeColumnGenerator.directive.js
@@ -0,0 +1,64 @@
+'use strict';
+
+define(['app', 'angular'],
+    function (app, angular) {
+
+        app.directive('treeColumnGenerator', ['$compile', '$log', '$rootScope', '$tableProvider', '$filter',
+            function ($compile, $log, $rootScope, $tableProvider, $filter) {
+                return {
+                    restrict : "A",
+                    compile : function (tElement, tAttrs) {
+                        return function (scope, element, attrs) {
+                            scope.data = scope[attrs["treeColumnGenerator"]];
+
+                            var makeTag = "";
+                            var treeStartToken = "�뵒";
+
+                            scope.tableConfigs.forEach(function (tableConfig, index) {
+
+                                if (tableConfig.colSpan > 0) {
+                                    return;
+                                }
+
+                                makeTag = '<li class="' + tableConfig.dAlign + ' ' + tableConfig.dVisible + '">';
+
+                                if (tableConfig.dType === "checkbox") {
+                                    //  泥댄겕 諛뺤뒪�씪�븣
+                                    if (scope.data.defaultYn) {
+                                        makeTag += '<input type="checkbox" ng-checked="data.checked == true ? true : false" disabled ng-click="$root.$tableProvider.rowChecked(tableConfigs, data, fn.getResponseData())">';
+                                    }
+                                    else {
+                                        makeTag += '<input type="checkbox" ng-checked="data.checked == true ? true : false" ng-click="$root.$tableProvider.rowChecked(tableConfigs, data, fn.getResponseData())">';
+                                    }
+
+                                    tableConfig.hChecked = false;
+                                }
+                                else if (tableConfig.dType === "radio") {
+                                    //  �씪�뵒�삤 踰꾪듉�씪�븣
+                                    makeTag += '<input type="radio" ng-checked="data.checked == true ? true : false" ng-click="$root.$tableProvider.rowChecked(tableConfigs, data, fn.getResponseData())">';
+                                }
+                                else if (tableConfig.dType === "date") {
+                                    makeTag += $filter('date')(scope.data[tableConfig.dName], $tableProvider.getDateFormat(tableConfig.dDateFormat, scope.data[tableConfig.dName]));
+                                }
+                                else {
+                                    if (angular.isDefined(scope.data[tableConfig.dName]) && scope.data[tableConfig.dName] != null) {
+                                        makeTag += '<span>' + scope.data[tableConfig.dName] + '</span>';
+                                    }
+                                    else {
+                                        makeTag += '<span></span>';
+                                    }
+                                }
+
+                                makeTag += '</li>';
+
+                                var linkFn = $compile(makeTag);
+                                var content = linkFn(scope);
+
+                                element.append(content);
+
+                            });
+                        }
+                    }
+                }
+            }]);
+    });
diff --git a/src/main/webapp/i18n/ko/global.json b/src/main/webapp/i18n/ko/global.json
index fd062aa..1a16158 100644
--- a/src/main/webapp/i18n/ko/global.json
+++ b/src/main/webapp/i18n/ko/global.json
@@ -925,6 +925,7 @@
     },
     "ispField" : {
         "info": "ISP�젙蹂�",
+        "select": "ISP �꽑�깮",
         "add" : "ISP�깮�꽦",
         "name" : "ISP�씠由�",
         "ispName" : "ISP紐�",
@@ -944,6 +945,7 @@
     },
     "hostingField" : {
         "info": "�샇�뒪�똿�젙蹂�",
+        "select": "�샇�뒪�똿 �꽑�깮",
         "add" : "�샇�뒪�똿�깮�꽦",
         "name" : "�샇�뒪�똿�씠由�",
         "manager" : "�샇�뒪�똿�씠由�",
diff --git a/src/main/webapp/scripts/app/companyField/companyFieldAdd.controller.js b/src/main/webapp/scripts/app/companyField/companyFieldAdd.controller.js
index 42bdacc..41c6544 100644
--- a/src/main/webapp/scripts/app/companyField/companyFieldAdd.controller.js
+++ b/src/main/webapp/scripts/app/companyField/companyFieldAdd.controller.js
@@ -21,12 +21,10 @@
                 $scope.vm = {
                     form : {
                         name : "",  //�뾽泥대챸
+                        ispId : "",
                         ispName : "",
                         hostingName : "",
-                        //companyType : "", //�뾽泥대텇瑜�
-                        //profitYN : "",  //�쁺由�/鍮꾩쁺由�
-                        //industry : "",  //�궛�뾽遺꾨쪟
-                        //domain : "",  //�룄硫붿씤
+                        hostingId : "",
                         manager : "",   //�떞�떦�옄
                         tel : "",  //�쟾�솕踰덊샇
                         email : "",  //�씠硫붿씪
@@ -44,7 +42,6 @@
                         }
                     }
                 };
-
 
                 angular.extend(this, $controller('autoCompleteController', {$scope : $scope, $injector : $injector}));
 
@@ -67,18 +64,34 @@
                     return false;
                 }
 
+                $scope.$on("ispFieldEvent", function (event, result) {
+                    $scope.vm.form.ispId = result[0].id;
+                });
+
+                $scope.$on("hostingFieldEvent", function (event, result) {
+                    $scope.vm.form.hostingId = result[0].id;
+                });
+
                 //  �뤌 �쟾�넚
                 function formSubmit(condition) {
                     $rootScope.spinner = true;
 
                     var content = {
                         name : $rootScope.preventXss($scope.vm.form.name),    //  �뾽泥대챸
-                        ispName : $rootScope.preventXss($scope.vm.form.ispName),    //  �뾽泥대챸
-                        hostingName : $rootScope.preventXss($scope.vm.form.hostingName),    //  �뾽泥대챸
-                        //companyType : $scope.vm.form.companyType, //�뾽泥대텇瑜�
-                        //profitYN : $scope.vm.form.profitYN,  //�쁺由�/鍮꾩쁺由�
-                        //industry : $scope.vm.form.industry,  //�궛�뾽遺꾨쪟
-                        //domain : $scope.vm.form.domain,  //�룄硫붿씤
+                        ispId : (function () {  // ISP �븘�씠�뵒
+                            var ispId = -1;
+                            if ($scope.vm.form.issueIspFields != null) {
+                                ispId = $scope.vm.form.ispId;
+                            }
+                            return ispId;
+                        })(),
+                        hostingId : (function () {  // Hosting �븘�씠�뵒
+                            var hostingId = -1;
+                            if ($scope.vm.form.issueHostingFields != null) {
+                                hostingId = $scope.vm.form.hostingId;
+                            }
+                            return hostingId;
+                        })(),
                         manager : $scope.vm.form.manager,   //�떞�떦�옄
                         tel : $scope.vm.form.tel,  //�쟾�솕踰덊샇
                         email : $scope.vm.form.email,  //�씠硫붿씪
diff --git a/src/main/webapp/scripts/app/companyField/companyFieldModify.controller.js b/src/main/webapp/scripts/app/companyField/companyFieldModify.controller.js
index c163f32..7a452d3 100644
--- a/src/main/webapp/scripts/app/companyField/companyFieldModify.controller.js
+++ b/src/main/webapp/scripts/app/companyField/companyFieldModify.controller.js
@@ -8,27 +8,56 @@
         'angular'
     ],
     function (app, angular) {
-        app.controller('companyFieldModifyController', ['$scope', '$rootScope', '$log', '$resourceProvider', '$uibModalInstance', 'CompanyField', 'parameter', 'SweetAlert', '$filter', '$q',
-            function ($scope, $rootScope, $log, $resourceProvider, $uibModalInstance, CompanyField, parameter, SweetAlert, $filter, $q) {
+        app.controller('companyFieldModifyController', ['$scope', '$rootScope', '$log', '$resourceProvider', '$uibModalInstance', 'CompanyField', 'parameter', 'SweetAlert', '$filter', '$q', '$injector','$controller',
+            function ($scope, $rootScope, $log, $resourceProvider, $uibModalInstance, CompanyField, parameter, SweetAlert, $filter, $q, $injector, $controller) {
 
                 $scope.fn = {
                     detail : detail,  //  �긽�꽭 議고쉶
                     cancel : cancel,    //  �뙘�뾽 李� �떕湲�
                     formSubmit : formSubmit,    //  �뤌 �쟾�넚
                     formCheck : formCheck,  //  �뤌 泥댄겕
+                    getIssueIspFieldListCallBack : getIssueIspFieldListCallBack,
+                    getIssueHostingFieldListCallBack : getIssueHostingFieldListCallBack
                 };
 
                 $scope.vm = {
                     id : parameter.id,
                     form : {
                         name : "",  //�뾽泥대챸
+                        ispId : "",
+                        ispName : "",
+                        hostingName : "",
+                        hostingId : "",
                         manager : "",   //�떞�떦�옄
                         tel : "",  //�쟾�솕踰덊샇
                         email : "",  //�씠硫붿씪
                         url : "", // url
                         memo : ""  //硫붾え(鍮꾧퀬)
+                    },
+                    autoCompletePage : {
+                        ispField : {
+                            page : 0,
+                            totalPage : 0
+                        },
+                        hostingField : {
+                            page : 0,
+                            totalPage : 0
+                        }
                     }
                 };
+
+                angular.extend(this, $controller('autoCompleteController', {$scope : $scope, $injector : $injector}));
+
+
+                // ISP�젙蹂� autocomplete page �뾽�뜲�씠�듃
+                function getIssueIspFieldListCallBack(result) {
+                    $scope.vm.autoCompletePage.ispField.totalPage = result.data.page.totalPage;
+                }
+
+                // �샇�뒪�똿�젙蹂� autocomplete page �뾽�뜲�씠�듃
+                function getIssueHostingFieldListCallBack(result) {
+                    $scope.vm.autoCompletePage.hostingField.totalPage = result.data.page.totalPage;
+                }
 
                 function formCheck(formInvalid) {
                     if (formInvalid) {
@@ -38,6 +67,14 @@
                     return false;
                 }
 
+                $scope.$on("ispFieldEvent", function (event, result) {
+                    $scope.vm.form.ispId = result[0].id;
+                });
+
+                $scope.$on("hostingFieldEvent", function (event, result) {
+                    $scope.vm.form.hostingId = result[0].id;
+                });
+
                 //  �뤌 �쟾�넚
                 function formSubmit() {
                     $rootScope.spinner = true;
@@ -45,10 +82,20 @@
                     var content = {
                         id : parameter.id,
                         name : $rootScope.preventXss($scope.vm.form.name),
-                        /*companyType : $rootScope.preventXss($scope.vm.form.companyType),
-                        profitYN : $rootScope.preventXss($scope.vm.form.profitYN),
-                        industry : $rootScope.preventXss($scope.vm.form.industry),
-                        domain : $rootScope.preventXss($scope.vm.form.domain),*/
+                        ispId : (function () {  // ISP �븘�씠�뵒
+                            var ispId = -1;
+                            if ($scope.vm.form.issueIspFields.length > 0) {
+                                ispId = $scope.vm.form.ispId;
+                            }
+                            return ispId;
+                        })(),
+                        hostingId : (function () {  // Hosting �븘�씠�뵒
+                            var hostingId = -1;
+                            if ($scope.vm.form.issueHostingFields.length > 0) {
+                                hostingId = $scope.vm.form.hostingId;
+                            }
+                            return hostingId;
+                        })(),
                         manager : $rootScope.preventXss($scope.vm.form.manager),
                         tel : $rootScope.preventXss($scope.vm.form.tel),
                         email : $rootScope.preventXss($scope.vm.form.email),
@@ -102,6 +149,12 @@
                                 $scope.vm.form.tel = result.data.content.tel;
                                 $scope.vm.form.url = result.data.content.url;
                                 $scope.vm.form.memo = result.data.content.memo;
+                                if(result.data.content.ispFieldVo != null){
+                                    $scope.vm.form.ispName = result.data.content.ispFieldVo.name;
+                                }
+                                if(result.data.content.hostingFieldVo != null){
+                                    $scope.vm.form.hostingName = result.data.content.hostingFieldVo.name;
+                                }
                             }
                         }
                         else {
diff --git a/src/main/webapp/scripts/app/issue/issue.js b/src/main/webapp/scripts/app/issue/issue.js
index 1e0adad..aaeedd3 100644
--- a/src/main/webapp/scripts/app/issue/issue.js
+++ b/src/main/webapp/scripts/app/issue/issue.js
@@ -34,7 +34,7 @@
                             var deferred = $q.defer();
                             require([
                                 'issueListTimelineController', 'issueManagerController', 'issueListController', 'issueAddController', 'issueModifyController', 'issueDetailController', 'issueAddRelationController', 'issueImportExcelController',
-                                'chartLoader', 'jsTable', 'tableColumnGenerator', 'modalFormAutoScroll', 'summerNote', 'summerNote-ko-KR', 'fullScroll', 'workflowService', 'priorityService', 'issueSearchService', 'issueTableConfigService', 'inputRegex',
+                                'chartLoader', 'jsTable', 'jsTree', 'tableColumnGenerator', 'treeColumnGenerator', 'modalFormAutoScroll', 'summerNote', 'summerNote-ko-KR', 'fullScroll', 'workflowService', 'priorityService', 'issueSearchService', 'issueTableConfigService', 'inputRegex',
                                 'severityService', 'issueTypeService', 'issueTypeCustomFieldService', 'issueService', 'issueStatusService', 'issueUserService','issueDepartmentService','issueModifyUserController', 'issueModifyDepartmentController', 'customFieldService', 'issueSearchFieldKeyViewElement',
                                 'issueSearchCustomFieldViewElement', 'tableUserImage', 'fullScroll', 'issueCommentService', 'detectIssueEditor', 'formSubmit', 'issueModifyStatusController', 'downIssueModifyStatusController', 'jsShortCut',
                                 'issueAddTableConfigController','issueAddRelationTableConfigController','issueAddDownTableConfigController','domAppend', 'issueDetailImagePreview', 'issueSendMailPartnersController', 'htmlDiff', 'issueVersionViewController', 'issueVersionService',
diff --git a/src/main/webapp/scripts/app/issue/issueAdd.controller.js b/src/main/webapp/scripts/app/issue/issueAdd.controller.js
index 429a84e..a207ca6 100644
--- a/src/main/webapp/scripts/app/issue/issueAdd.controller.js
+++ b/src/main/webapp/scripts/app/issue/issueAdd.controller.js
@@ -388,8 +388,8 @@
 
                 // �뾽泥댁젙蹂� 寃곌낵 媛� Event 泥섎━(set)
                 $scope.$on("companyFieldEvent", function (event, result) {
-                    var ispFieldVos = result[0].ispFieldVos[0];
-                    var hostingFieldVos = result[0].hostingFieldVos[0];
+                    var ispFieldVo = result[0].ispFieldVo;
+                    var hostingFieldVo = result[0].hostingFieldVo;
 
                     $scope.vm.companyId = result[0].id;
                     $scope.vm.companyName = result[0].name;
@@ -399,34 +399,34 @@
                     $scope.vm.companyUrl = result[0].url;
                     $scope.vm.companyMemo = result[0].memo;
 
-                    $scope.vm.ispName = ispFieldVos.name;
-                    $scope.vm.ispCode = ispFieldVos.code;
-                    $scope.vm.ispManager = ispFieldVos.manager;
-                    $scope.vm.ispTel = ispFieldVos.tel;
-                    $scope.vm.ispEmail = ispFieldVos.email;
-                    $scope.vm.ispUrl = ispFieldVos.url;
-                    $scope.vm.ispMemo = ispFieldVos.memo;
+                    $scope.vm.ispName = ispFieldVo.name;
+                    $scope.vm.ispCode = ispFieldVo.code;
+                    $scope.vm.ispManager = ispFieldVo.manager;
+                    $scope.vm.ispTel = ispFieldVo.tel;
+                    $scope.vm.ispEmail = ispFieldVo.email;
+                    $scope.vm.ispUrl = ispFieldVo.url;
+                    $scope.vm.ispMemo = ispFieldVo.memo;
 
-                    $scope.vm.hostingName = hostingFieldVos.name;
-                    $scope.vm.hostingCode = hostingFieldVos.code;
-                    $scope.vm.hostingManager = hostingFieldVos.manager;
-                    $scope.vm.hostingTel = hostingFieldVos.tel;
-                    $scope.vm.hostingEmail = hostingFieldVos.email;
-                    $scope.vm.hostingUrl = hostingFieldVos.url;
-                    $scope.vm.hostingMemo = hostingFieldVos.memo;
+                    $scope.vm.hostingName = hostingFieldVo.name;
+                    $scope.vm.hostingCode = hostingFieldVo.code;
+                    $scope.vm.hostingManager = hostingFieldVo.manager;
+                    $scope.vm.hostingTel = hostingFieldVo.tel;
+                    $scope.vm.hostingEmail = hostingFieldVo.email;
+                    $scope.vm.hostingUrl = hostingFieldVo.url;
+                    $scope.vm.hostingMemo = hostingFieldVo.memo;
                 });
 
-                // ISP�젙蹂� 寃곌낵 媛� Event 泥섎━(set)
-                // $scope.$on("ispFieldEvent", function (event, result) {
-                //     $scope.vm.ispId = result[0].id;
-                //     $scope.vm.ispName = result[0].name;
-                //     $scope.vm.ispCode = result[0].code;
-                //     $scope.vm.ispManager = result[0].manager;
-                //     $scope.vm.ispTel = result[0].tel;
-                //     $scope.vm.ispEmail = result[0].email;
-                //     $scope.vm.ispUrl = result[0].url;
-                //     $scope.vm.ispMemo = result[0].memo;
-                // });
+                //ISP�젙蹂� 寃곌낵 媛� Event 泥섎━(set)
+                $scope.$on("ispFieldEvent", function (event, result) {
+                    $scope.vm.ispId = result[0].id;
+                    $scope.vm.ispName = result[0].name;
+                    $scope.vm.ispCode = result[0].code;
+                    $scope.vm.ispManager = result[0].manager;
+                    $scope.vm.ispTel = result[0].tel;
+                    $scope.vm.ispEmail = result[0].email;
+                    $scope.vm.ispUrl = result[0].url;
+                    $scope.vm.ispMemo = result[0].memo;
+                });
 
                 // �샇�뒪�똿�젙蹂� 寃곌낵 媛� Event 泥섎━(set)
                 $scope.$on("hostingFieldEvent", function (event, result) {
diff --git a/src/main/webapp/scripts/app/issue/issueList.controller.js b/src/main/webapp/scripts/app/issue/issueList.controller.js
index 7cbdfe6..265a815 100644
--- a/src/main/webapp/scripts/app/issue/issueList.controller.js
+++ b/src/main/webapp/scripts/app/issue/issueList.controller.js
@@ -8,9 +8,9 @@
         'angular'
     ],
     function (app, angular) {
-        app.controller('issueListController', ['$scope', '$rootScope', '$log', '$resourceProvider', '$tableProvider', '$state', '$uibModal', '$q',
+        app.controller('issueListController', ['$scope', '$rootScope', '$log', '$resourceProvider', '$tableProvider', '$treeProvider', '$state', '$uibModal', '$q',
             '$controller', '$injector', 'SweetAlert', 'Issue', 'IssueType', 'Priority', 'Severity', 'IssueStatus', 'CustomField', 'IssueSearch', 'IssueTableConfig', '$timeout', '$filter',
-            function ($scope, $rootScope, $log, $resourceProvider, $tableProvider, $state, $uibModal, $q, $controller, $injector, SweetAlert, Issue, IssueType, Priority, Severity, IssueStatus, CustomField,
+            function ($scope, $rootScope, $log, $resourceProvider, $tableProvider, $treeProvider, $state, $uibModal, $q, $controller, $injector, SweetAlert, Issue, IssueType, Priority, Severity, IssueStatus, CustomField,
                       IssueSearch, IssueTableConfig, $timeout, $filter) {
 
                 //  �븿�닔
@@ -20,6 +20,7 @@
                     changePageRowCount : changePageRowCount,    //  �럹�씠吏� 蹂�寃�
                     makeTableConfigs : makeTableConfigs, //  �뀒�씠釉� �꽕�젙
                     setTableColumn : setTableColumn,    //  �뀒�씠釉붿쓽 而щ읆�쓣 留뚮뱾�뼱以��떎.
+                    setTreeColumn : setTreeColumn,
                     add : add,   //  �씠�뒋 �깮�꽦
                     modify : modify,    //  �씠�뒋 �닔�젙
                     addRelationIssueForm : addRelationIssueForm,    //  �뿰愿� �씠�뒋 異붽�
@@ -39,7 +40,8 @@
                     makeSearchConditions : makeSearchConditions,    //  寃��깋 議곌굔�쓣 留뚮뱺�떎.
                     getIssueTableConfigs : getIssueTableConfigs,  //  �궗�슜�옄 �씠�뒋 紐⑸줉 �뀒�씠釉� �꽕�젙 媛믪쓣 媛��졇���꽌 �쟻�슜�븳�떎.
                     startExecute : startExecute, //  而⑦듃濡� 濡쒕뵫�떆 泥섏쓬�쑝濡� �떆�옉�릺�뒗 �븿�닔
-                    getResponseData : getResponseData //  而⑦듃濡� 濡쒕뵫�떆 泥섏쓬�쑝濡� �떆�옉�릺�뒗 �븿�닔
+                    getResponseData : getResponseData, //  而⑦듃濡� 濡쒕뵫�떆 泥섏쓬�쑝濡� �떆�옉�릺�뒗 �븿�닔
+                    onClickListMode : onClickListMode   // 由ъ뒪�듃 紐⑤뱶 蹂�寃쎌떆 �떎�뻾�릺�뒗 �븿�닔
                 };
 
                 //  蹂��닔
@@ -67,6 +69,7 @@
                         selectedPageRowCount : String(10)
                     },
                     tableConfigs : [],  //  �뀒�씠釉� �뀑�똿 �젙蹂�
+                    treeConfigs : [], // �듃由� �뀑�똿 �젙蹂�
                     responseData : {
                         data : []
                     },
@@ -85,7 +88,8 @@
                     customFields : [],  //  �궗�슜�옄 �젙�쓽 �븘�뱶
                     issueTableConfigs : [],  //  �씠�뒋 �뀒�씠釉� �꽕�젙
                     parentIssueId : "",
-                    hideIssue : false
+                    hideIssue : false,
+                    listMode : 0, // 紐⑸줉 紐⑤뱶 0:湲곕낯 由ъ뒪�듃 1:�듃由ш뎄議� 由ъ뒪�듃
                 };
 
                 //  �뀒�씠釉� �씠踰ㅽ듃
@@ -233,8 +237,109 @@
                         if (issueTableConfig.display) {
                             //  �뀒�씠釉붿쓽 而щ읆�쓣 留뚮뱾�뼱以��떎.
                             $scope.fn.setTableColumn(issueTableConfig);
+                            $scope.fn.setTreeColumn(issueTableConfig);
                         }
                     });
+                }
+
+                //  �듃由� 而щ읆�쓣 留뚮뱾�뼱以��떎.
+                function setTreeColumn(issueTableConfig) {
+
+                    //  �씪諛� 而щ읆
+                    switch(issueTableConfig.key) {
+                        case "ISSUE_TITLE" :   //  �씠�뒋 �젣紐�
+                            $scope.vm.treeConfigs.push($treeProvider.config()
+                                .setHName("issue.issueTitle")
+                                .setDType("renderer")
+                                .setHWidth("bold " + issueTableConfig.width)
+                                .setDAlign("text-center")
+                                .setDRenderer("ISSUE_TITLE"));
+                            break;
+
+                        case "PRIORITY" :   //  �슦�꽑�닚�쐞
+                            $scope.vm.treeConfigs.push($treeProvider.config()
+                                .setHName("common.priority")
+                                .setDName("priorityName")
+                                .setDType("renderer")
+                                .setHWidth("bold " + issueTableConfig.width)
+                                .setDAlign("text-center")
+                                .setDRenderer("COMMON_PRIORITY"));
+                            break;
+                        case "SEVERITY" :   //  以묒슂�룄
+                            $scope.vm.treeConfigs.push($treeProvider.config()
+                                .setHName("common.importance")
+                                .setDName("severityName")
+                                .setDType("renderer")
+                                .setHWidth("bold " + issueTableConfig.width)
+                                .setDAlign("text-center")
+                                .setDRenderer("COMMON_SEVERITY"));
+                            break;
+                        case "ISSUE_TYPE" : //  �씠�뒋 ���엯
+                            $scope.vm.treeConfigs.push($treeProvider.config()
+                                .setHName("issue.issueType")
+                                .setHWidth("bold " + issueTableConfig.width)
+                                .setDAlign("text-center")
+                                .setDName("issueTypeName"));
+                            break;
+                        case "ASSIGNEE_TEAM" :   //  �떞�떦遺��꽌
+                            $scope.vm.treeConfigs.push($treeProvider.config()
+                                .setHName("common.assigneeTeam")
+                                .setDType("renderer")
+                                .setHWidth("bold " + issueTableConfig.width)
+                                .setDAlign("text-center")
+                                .setDRenderer("ISSUE_DEPARTMENT"));
+                            break;
+                        case "REGISTER" :   //  �벑濡앹옄
+                            $scope.vm.treeConfigs.push($treeProvider.config()
+                                .setHName("common.register")
+                                .setDType("renderer")
+                                .setHWidth("bold " + issueTableConfig.width)
+                                .setDAlign("text-center")
+                                .setDRenderer("REGISTER"));
+                            break;
+                        case "PERIOD" : //  湲곌컙
+                            $scope.vm.treeConfigs.push($treeProvider.config()
+                                .setHName("common.period")
+                                .setDType("renderer")
+                                .setHWidth("bold " + issueTableConfig.width)
+                                .setDAlign("text-center")
+                                .setDRenderer("ISSUE_DUE_DATE"));
+                            break;
+                        case "MODIFY_DATE" : //  理쒓렐 蹂�寃쎌씪
+                            $scope.vm.treeConfigs.push($treeProvider.config()
+                                .setHName("common.lastChangeDate")
+                                .setHWidth("bold " + issueTableConfig.width)
+                                .setDAlign("text-center")
+                                .setDName("modifyDate"));
+                            break;
+                        case "COUNT_DOWN_ISSUE" : //  �븯�쐞 �씠�뒋 媛쒖닔
+                            $scope.vm.treeConfigs.push($treeProvider.config()
+                                .setHName("common.countDownIssue")
+                                .setDType("renderer")
+                                .setHWidth("bold " + issueTableConfig.width)
+                                .setDAlign("text-center")
+                                .setDRenderer("DOWN_ISSUE_COUNT"));
+                            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.treeConfigs.push($treeProvider.config()
+                                    .setHName(customField.name)
+                                    .setDType("renderer")
+                                    .setHWidth("bold " + issueTableConfig.width)
+                                    .setDAlign("text-center")
+                                    .setColumnHint(customField)
+                                    .setDRenderer("ISSUE_CUSTOM_FIELD_VALUE_VIEW"));
+                                break;
+                            }
+                        }
+                    }
                 }
 
                 //  �뀒�씠釉붿쓽 而щ읆�쓣 留뚮뱾�뼱以��떎.
@@ -367,6 +472,7 @@
                         beginCompleteDate : "",
                         endCompleteDate : "",
                         hideIssue : $scope.vm.hideIssue,
+                        isTree : $scope.vm.listMode === 1,
                         projectIds : (function () {
                             var projectIds = [];
 
@@ -485,6 +591,10 @@
                     }
 
                     return conditions;
+                }
+
+                function getTreeList() {
+
                 }
 
                 //  �씠�뒋 紐⑸줉�쓣 議고쉶�븳�떎.
@@ -1055,6 +1165,19 @@
                     return deferred.promise;
                 }
 
+                // 由ъ뒪�듃 紐⑤뱶 蹂�寃쎌떆 �떎�뻾
+                function onClickListMode(listMode) {
+                    if ($scope.vm.listMode !== listMode) {
+                        $scope.vm.listMode = listMode;
+
+                        if ($scope.vm.listMode === 0) {
+                            $scope.fn.getPageList(0);
+                        } else {
+                            $scope.fn.getPageList(0);
+                        }
+                    }
+                }
+
                 //  理쒖큹 �떎�뻾
                 function startExecute() {
                     // �뙆�씪誘명꽣 �씫湲�
diff --git a/src/main/webapp/scripts/main.js b/src/main/webapp/scripts/main.js
index 0973abc..eb07840 100644
--- a/src/main/webapp/scripts/main.js
+++ b/src/main/webapp/scripts/main.js
@@ -55,12 +55,14 @@
         'angularTranslate' : '../custom_components/angular-translate/angular-translate', //  �떎援��뼱 泥섎━�뿉 �궗�슜
         'commonController' : 'app/common/common.controller', //  怨듯넻 而⑦듃濡ㅻ윭
         'tableProvider' : '../custom_components/js-table/table.provider', //  �뀒�씠釉� �냽�꽦 媛믪쓣 愿�由ы븳�떎.
+        'treeProvider' : '../custom_components/js-tree/tree.provider', //   �듃由� �냽�꽦 媛믪쓣 愿�由ы븳�떎.
         'resourceProvider' : 'components/utils/resource.provider',   //  怨듯넻�쟻�쑝濡� �꽌踰� json �쟾�넚�뿉 �궗�슜
         'lodash' : '../bower_components/lodash/lodash.min', //  硫��떚 ���젆�듃, auto complete 而댄룷�꼳�듃�뱾�뿉�꽌 �궗�슜
         'angularDropMultiSelect' : '../custom_components/angular-multi-select/angularjs-dropdown-multiselect',  //  硫��떚 ���젆�듃 而댄룷�꼳�듃
         'jsTable' : '../custom_components/js-table/js-table.directive',   //  紐⑸줉 �솕硫댁뿉�꽌 �궗�슜�릺�뒗 �뀒�씠釉붿쓣 �샇異쒗븳�떎.
-        'jsTreeTable' : '../custom_components/js-table/js-tree-table.directive',   //  紐⑸줉 �솕硫댁뿉�꽌 �궗�슜�릺�뒗 �뀒�씠釉�(�듃由ш뎄議�)�쓣 �샇異쒗븳�떎.
+        'jsTree' : '../custom_components/js-tree/js-tree.directive',   //  紐⑸줉 �솕硫댁뿉�꽌 �궗�슜�릺�뒗 �뀒�씠釉�(�듃由ш뎄議�)�쓣 �샇異쒗븳�떎.
         'tableColumnGenerator' : '../custom_components/js-table/tableColumnGenerator.directive', //  �뀒�씠釉� �옖�뜑�윭瑜� �떞�떦�븳�떎.
+        'treeColumnGenerator' : '../custom_components/js-tree/treeColumnGenerator.directive', //  �뀒�씠釉� �옖�뜑�윭瑜� �떞�떦�븳�떎.
         'jsAutoCompleteMulti' : '../custom_components/js-autocomplete-multi/js-autocomplete-multi', //  �떎以� �꽑�깮�씠 媛��뒫�븳 autoComplete 而댄룷�꼳�듃
         'jsInputAutoComplete' : '../custom_components/js-input-autocomplete/js-input-autocomplete',   //  input 諛뺤뒪�뿉 autoComplete 湲곕뒫�씠 遺숈� 而댄룷�꼳�듃
         'jsAutoCompleteSingle' : '../custom_components/js-autocomplete-single/js-autocomplete-single',   //  input 諛뺤뒪�뿉 �븳媛쒖쓽 ���긽留� �꽑�깮 媛��뒫�븷�닔 �엳�뒗 autoComplete 湲곕뒫�씠 遺숈� 而댄룷�꼳�듃
@@ -400,10 +402,13 @@
         'jsTable' : {
             deps : ['app']
         },
-        'jsTreeTable' : {
+        'jsTree' : {
             deps : ['app']
         },
         'tableColumnGenerator' : {
+            deps : ['app']
+        },
+        'treeColumnGenerator' : {
             deps : ['app']
         },
         'ngStomp' : {
@@ -523,6 +528,7 @@
     'authInterceptor',
     'resourceProvider',
     'tableProvider',
+    'treeProvider',
     'permissionService',
     'authService',
     'userInviteService',
diff --git a/src/main/webapp/views/companyField/companyFieldAdd.html b/src/main/webapp/views/companyField/companyFieldAdd.html
index eda4407..ed0d363 100644
--- a/src/main/webapp/views/companyField/companyFieldAdd.html
+++ b/src/main/webapp/views/companyField/companyFieldAdd.html
@@ -32,14 +32,15 @@
 
             <div class="form-group">
                 <label class="issue-label">
-                    <span translate="ispField.name">ISP �씠由�</span>
+                    <span translate="ispField.select">ISP �꽑�깮</span>
                 </label>
                 <js-autocomplete-single data-input-name="ispField"
                                     selected-model="vm.form.issueIspFields"
+                                    ng-model="vm.form.ispName"
                                     search="vm.form.ispName"
                                     source="fn.getIssueIspFieldList(vm.ispName, vm.form.issueIspFields, vm.autoCompletePage.issueIspFields.page, fn.getIssueIspFieldListCallBack)"
-                                    page="vm.autoCompletePage.IspField.page"
-                                    total-page="vm.autoCompletePage.IspField.totalPage"
+                                    page="vm.autoCompletePage.ispField.page"
+                                    total-page="vm.autoCompletePage.ispField.totalPage"
                                     input-disabled="false"
                                     translation-texts="{ empty : 'common.emptyHosting' }"
                                     broad-cast="ispFieldEvent"
@@ -49,7 +50,7 @@
 
             <div class="form-group">
                 <label class="issue-label">
-                    <span translate="hostingField.name">�샇�뒪�똿 �씠由�</span>
+                    <span translate="hostingField.select">�샇�뒪�똿 �꽑�깮</span>
                 </label>
                 <js-autocomplete-single data-input-name="hostingField"
                                     selected-model="vm.form.issueHostingFields"
diff --git a/src/main/webapp/views/companyField/companyFieldModify.html b/src/main/webapp/views/companyField/companyFieldModify.html
index 9404e5c..9909836 100644
--- a/src/main/webapp/views/companyField/companyFieldModify.html
+++ b/src/main/webapp/views/companyField/companyFieldModify.html
@@ -29,6 +29,41 @@
                        required>
                 <small translate="companyField.enterSpecialCharacters">�뾽泥� �씠由꾩뿉�뒗 �듅�닔 臾몄옄瑜� �엯�젰 �븷�닔 �뾾�뒿�땲�떎.</small>
             </div>
+            <div class="form-group">
+                <label class="issue-label">
+                    <span translate="ispField.select">ISP �꽑�깮</span>
+                </label>
+                <js-autocomplete-single data-input-name="ispField"
+                                        selected-model="vm.form.issueIspFields"
+                                        ng-model="vm.form.ispName"
+                                        search="vm.form.ispName"
+                                        source="fn.getIssueIspFieldList(vm.ispName, vm.form.issueIspFields, vm.autoCompletePage.issueIspFields.page, fn.getIssueIspFieldListCallBack)"
+                                        page="vm.autoCompletePage.ispField.page"
+                                        total-page="vm.autoCompletePage.ispField.totalPage"
+                                        input-disabled="false"
+                                        translation-texts="{ empty : 'common.emptyHosting' }"
+                                        broad-cast="ispFieldEvent"
+                                        extra-settings="{ displayProp : 'name' , idProp : 'id', imageable : false, imagePathProp : '',
+                    type : '', maxlength : 200, autoResize : false, stopRemoveBodyEvent : true }"></js-autocomplete-single>
+            </div>
+
+            <div class="form-group">
+                <label class="issue-label">
+                    <span translate="hostingField.select">�샇�뒪�똿 �꽑�깮</span>
+                </label>
+                <js-autocomplete-single data-input-name="hostingField"
+                                        selected-model="vm.form.issueHostingFields"
+                                        ng-model="vm.form.hostingName"
+                                        search="vm.form.hostingName"
+                                        source="fn.getIssueHostingFieldList(vm.hostingName, vm.form.issueHostingFields, vm.autoCompletePage.hostingField.page, fn.getIssueHostingFieldListCallBack)"
+                                        page="vm.autoCompletePage.hostingField.page"
+                                        total-page="vm.autoCompletePage.hostingField.totalPage"
+                                        input-disabled="false"
+                                        translation-texts="{ empty : 'common.emptyHosting' }"
+                                        broad-cast="hostingFieldEvent"
+                                        extra-settings="{ displayProp : 'name' , idProp : 'id', imageable : false, imagePathProp : '',
+                    type : '', maxlength : 200, autoResize : false, stopRemoveBodyEvent : true }"></js-autocomplete-single>
+            </div>
             <div>
                 <div class="form-group">
                     <label for="companyFieldAddForm10" class="issue-label">
diff --git a/src/main/webapp/views/issue/issueAdd.html b/src/main/webapp/views/issue/issueAdd.html
index 00c2b80..b84d4e3 100644
--- a/src/main/webapp/views/issue/issueAdd.html
+++ b/src/main/webapp/views/issue/issueAdd.html
@@ -373,7 +373,7 @@
                 <div class="col-lg-8 fontcolor_green">
                     <label class="issue-label"><span class="fontcolor_green" translate="companyField.info">�뾽泥댁젙蹂�</span>
                         &nbsp;&nbsp;<span class="select3-selection__choice" style="position: relative; bottom: 2px;"><code class="highlighter-rouge">*</code>&nbsp;
-                            &nbsp;�뾽泥� �씠由� �겢由��떆 �꽑�깮�맂 �씠由꾩쓽 �뾽泥� �젙蹂닿� 議고쉶�릺硫�, 媛숈� url�쓣 媛�吏�怨좎엳�뒗 ISP, �샇�뒪�똿 �젙蹂대�� 遺덈윭�샃�땲�떎.</span>
+                            &nbsp;�뾽泥� �씠由� �겢由��떆 �꽑�깮�맂 �씠由꾩쓽 �뾽泥� �젙蹂닿� 議고쉶�릺硫�, �뾽泥댁젙蹂댁뿉�꽌 異붽��븳 ISP, �샇�뒪�똿 �젙蹂대�� 遺덈윭�샃�땲�떎.</span>
                     </label>
                 </div>
             </div>
diff --git a/src/main/webapp/views/issue/issueListNormal.html b/src/main/webapp/views/issue/issueListNormal.html
index b7144d8..2c18f42 100644
--- a/src/main/webapp/views/issue/issueListNormal.html
+++ b/src/main/webapp/views/issue/issueListNormal.html
@@ -3,312 +3,312 @@
         <div class="col-sm-12" >
             <div class="element-wrapper" ng-if="!vm.detailView">
                 <div class="element-box">
-                  <div class="row" >
-                    <div class="col-sm-12">
-                        <div class="searchdiv">
-                            <form name="issueSearchForm" role="form" ng-enter="fn.getPageList(0)">
-                                <div class="row">
-                                    <div class="col-sm-6">
-                                        <div class="input-group">
-                                            <input class="form-control"
-                                                   type="text"
-                                                   tabindex="-1"
-                                                   maxlength="300"
-                                                   kr-input
-                                                   owl-auto-focus
-                                                   ng-model="vm.search.keyWord"
-                                                   placeholder="{{'issue.pleaseEnterIssueKeyWord' | translate}}">
-                                            <div class="input-group-prepend ml-10">
-                                                <button class="btn btn-navy" ng-click="fn.getPageList(0)"> <span translate="common.search">寃��깋</span></button>
+                    <div class="row" >
+                        <div class="col-sm-12">
+                            <div class="searchdiv">
+                                <form name="issueSearchForm" role="form" ng-enter="fn.getPageList(0)">
+                                    <div class="row">
+                                        <div class="col-sm-6">
+                                            <div class="input-group">
+                                                <input class="form-control"
+                                                       type="text"
+                                                       tabindex="-1"
+                                                       maxlength="300"
+                                                       kr-input
+                                                       owl-auto-focus
+                                                       ng-model="vm.search.keyWord"
+                                                       placeholder="{{'issue.pleaseEnterIssueKeyWord' | translate}}">
+                                                <div class="input-group-prepend ml-10">
+                                                    <button class="btn btn-navy" ng-click="fn.getPageList(0)"> <span translate="common.search">寃��깋</span></button>
+                                                </div>
                                             </div>
                                         </div>
                                     </div>
-                                </div>
 
-                                <div class="row">
-                                    <div class="col-sm-12">
-                                        <div class="tabfilter">
-                                            <div translate="common.selectedSearchCriteria">�꽑�깮�븳 寃��깋 議곌굔</div>
-                                            <!--    �씠�뒋 �젣紐�   -->
-                                            <p ng-if="$root.isDefined(vm.search.title)">
-                                                {{vm.search.title}}
-                                                <span ng-click="vm.search.title = ''">횞</span>
-                                            </p>
+                                    <div class="row">
+                                        <div class="col-sm-12">
+                                            <div class="tabfilter">
+                                                <div translate="common.selectedSearchCriteria">�꽑�깮�븳 寃��깋 議곌굔</div>
+                                                <!--    �씠�뒋 �젣紐�   -->
+                                                <p ng-if="$root.isDefined(vm.search.title)">
+                                                    {{vm.search.title}}
+                                                    <span ng-click="vm.search.title = ''">횞</span>
+                                                </p>
 
-                                            <!--    �봽濡쒖젥�듃    -->
-                                            <issue-search-array-view-element lists="vm.projects"
-                                                                             type="'project'"></issue-search-array-view-element>
+                                                <!--    �봽濡쒖젥�듃    -->
+                                                <issue-search-array-view-element lists="vm.projects"
+                                                                                 type="'project'"></issue-search-array-view-element>
 
-                                            <!--    �씠�뒋 ���엯   -->
-                                            <issue-search-field-key-view-element lists="vm.issueTypes"
-                                                                                 keys="vm.search.issueTypeIds"></issue-search-field-key-view-element>
+                                                <!--    �씠�뒋 ���엯   -->
+                                                <issue-search-field-key-view-element lists="vm.issueTypes"
+                                                                                     keys="vm.search.issueTypeIds"></issue-search-field-key-view-element>
 
-                                            <!--    �씠�뒋 �긽�깭   -->
-                                            <issue-search-field-key-view-element lists="vm.issueStatuses"
-                                                                                 keys="vm.search.issueStatusIds"></issue-search-field-key-view-element>
+                                                <!--    �씠�뒋 �긽�깭   -->
+                                                <issue-search-field-key-view-element lists="vm.issueStatuses"
+                                                                                     keys="vm.search.issueStatusIds"></issue-search-field-key-view-element>
 
-                                            <!--    �씠�뒋 �궡�슜   -->
-                                            <p ng-if="$root.isDefined(vm.search.description)">
-                                                {{vm.search.description}}
-                                                <span ng-click="vm.search.description = ''">횞</span>
-                                            </p>
+                                                <!--    �씠�뒋 �궡�슜   -->
+                                                <p ng-if="$root.isDefined(vm.search.description)">
+                                                    {{vm.search.description}}
+                                                    <span ng-click="vm.search.description = ''">횞</span>
+                                                </p>
 
-                                            <!--    �슦�꽑 �닚�쐞   -->
-                                            <issue-search-field-key-view-element lists="vm.priorities"
-                                                                                 keys="vm.search.priorityIds"></issue-search-field-key-view-element>
+                                                <!--    �슦�꽑 �닚�쐞   -->
+                                                <issue-search-field-key-view-element lists="vm.priorities"
+                                                                                     keys="vm.search.priorityIds"></issue-search-field-key-view-element>
 
-                                            <!--    以묒슂�룄   -->
-                                            <issue-search-field-key-view-element lists="vm.severities"
-                                                                                 keys="vm.search.severityIds"></issue-search-field-key-view-element>
+                                                <!--    以묒슂�룄   -->
+                                                <issue-search-field-key-view-element lists="vm.severities"
+                                                                                     keys="vm.search.severityIds"></issue-search-field-key-view-element>
 
-                                            <!--    �떞�떦�옄   -->
-                                            <issue-search-array-view-element lists="vm.users"
-                                                                             type="'user'"></issue-search-array-view-element>
+                                                <!--    �떞�떦�옄   -->
+                                                <issue-search-array-view-element lists="vm.users"
+                                                                                 type="'user'"></issue-search-array-view-element>
 
-                                            <!--    �벑濡앹옄   -->
-                                            <issue-search-array-view-element lists="vm.registers"
-                                                                             type="'user'"></issue-search-array-view-element>
+                                                <!--    �벑濡앹옄   -->
+                                                <issue-search-array-view-element lists="vm.registers"
+                                                                                 type="'user'"></issue-search-array-view-element>
 
-                                            <!--    �떆�옉�씪   -->
-                                            <p ng-if="$root.isDefined(vm.search.startDateRange)">
-                                                {{vm.search.startDateRange}}
-                                                <span ng-click="vm.search.startDateRange = ''">횞</span>
-                                            </p>
+                                                <!--    �떆�옉�씪   -->
+                                                <p ng-if="$root.isDefined(vm.search.startDateRange)">
+                                                    {{vm.search.startDateRange}}
+                                                    <span ng-click="vm.search.startDateRange = ''">횞</span>
+                                                </p>
 
-                                            <!--    醫낅즺�씪   -->
-                                            <p ng-if="$root.isDefined(vm.search.completeDateRange)">
-                                                {{vm.search.completeDateRange}}
-                                                <span ng-click="vm.search.completeDateRange = ''">횞</span>
-                                            </p>
+                                                <!--    醫낅즺�씪   -->
+                                                <p ng-if="$root.isDefined(vm.search.completeDateRange)">
+                                                    {{vm.search.completeDateRange}}
+                                                    <span ng-click="vm.search.completeDateRange = ''">횞</span>
+                                                </p>
 
-                                            <!--    �벑濡앹씪   -->
-                                            <p ng-if="$root.isDefined(vm.search.registerDateRange)">
-                                                {{vm.search.registerDateRange}}
-                                                <span ng-click="vm.search.registerDateRange = ''">횞</span>
-                                            </p>
+                                                <!--    �벑濡앹씪   -->
+                                                <p ng-if="$root.isDefined(vm.search.registerDateRange)">
+                                                    {{vm.search.registerDateRange}}
+                                                    <span ng-click="vm.search.registerDateRange = ''">횞</span>
+                                                </p>
 
-                                            <!--    �뀓�뒪�듃 �엯�젰 �븘�뱶   -->
-                                            <issue-search-custom-field-view-element
-                                                    custom-fields="vm.customFields"></issue-search-custom-field-view-element>
+                                                <!--    �뀓�뒪�듃 �엯�젰 �븘�뱶   -->
+                                                <issue-search-custom-field-view-element
+                                                        custom-fields="vm.customFields"></issue-search-custom-field-view-element>
+                                            </div>
                                         </div>
                                     </div>
-                                </div>
 
 
-                                <div class="">
-                                    <label class="issue-search-label" ng-class="{ 'icon-reverse' : vm.searchView }"
-                                           ng-click="vm.searchView = !vm.searchView">
-                                        <span translate="common.detailedSearch">�긽�꽭寃��깋</span>
-                                    </label>
-                                    <div ng-if="vm.searchView">
-                                        <div class="row">
-                                            <div class="col-lg-3">
-                                                <div class="form-group">
-                                                    <label> <span translate="issue.issueTitle">�씠�뒋 �젣紐�</span></label>
-                                                    <input type="text"
-                                                           name="title"
-                                                           class="form-control input-sm"
-                                                           kr-input
-                                                           maxlength="20"
-                                                           autocomplete="off"
-                                                           ng-model="vm.search.title">
-                                                </div>
-                                            </div>
-
-                                            <div class="col-lg-3">
-                                                <div class="form-group">
-                                                    <label> <span translate="common.project">�봽濡쒖젥�듃</span></label>
-                                                    <js-autocomplete-multi data-input-name="projects"
-                                                                           selected-model="vm.projects"
-                                                                           search="vm.projectName"
-                                                                           input-disabled="false"
-                                                                           translation-texts="{ empty : 'common.emptyProject', selectList : 'common.' }"
-                                                                           source="fn.getProjectList(vm.projectName, vm.projects, null, null, ['01', '02', '03'])"
-                                                                           extra-settings="{ displayProp : 'name' , idProp : 'id', imageable : false, imagePathProp : '', type : '', maxlength : 100}"></js-autocomplete-multi>
-                                                </div>
-                                            </div>
-
-                                            <div class="col-lg-3">
-                                                <div class="form-group">
-                                                    <label> <span translate="issue.issueType">�씠�뒋 ���엯</span></label>
-                                                    <ng-dropdown-multiselect class="multiSelect cursor"
-                                                                             data-input-name="issueStatuses"
-                                                                             selected-model="vm.search.issueTypeIds"
-                                                                             options="::vm.issueTypes"></ng-dropdown-multiselect>
-                                                </div>
-                                            </div>
-
-                                            <div class="col-lg-3">
-                                                <div class="form-group">
-                                                    <label> <span translate="issue.issueStatus">�씠�뒋 �긽�깭</span></label>
-                                                    <ng-dropdown-multiselect class="multiSelect cursor"
-                                                                             data-input-name="issueStatuses"
-                                                                             selected-model="vm.search.issueStatusIds"
-                                                                             options="::vm.issueStatuses"></ng-dropdown-multiselect>
-                                                </div>
-                                            </div>
-                                        </div>
-
-                                        <div class="row">
-                                            <div class="col-lg-3">
-                                                <div class="form-group">
-                                                    <label> <span translate="issue.issueNumber">�씠�뒋 踰덊샇</span></label>
-                                                    <input type="text"
-                                                           name="name"
-                                                           class="form-control input-sm"
-                                                           autocomplete="off"
-                                                           kr-input
-                                                           maxlength="20"
-                                                           ng-model="vm.search.combinationIssueNumber">
-                                                </div>
-                                            </div>
-
-                                            <div class="col-lg-3">
-                                                <div class="form-group">
-                                                    <label> <span translate="issue.issueContent">�씠�뒋 �궡�슜</span></label>
-                                                    <input type="text"
-                                                           name="description"
-                                                           class="form-control input-sm"
-                                                           kr-input
-                                                           maxlength="20"
-                                                           autocomplete="off"
-                                                           ng-model="vm.search.description">
-                                                </div>
-                                            </div>
-
-                                            <div class="col-lg-3">
-                                                <div class="form-group">
-                                                    <label> <span translate="common.priority">�슦�꽑 �닚�쐞</span></label>
-                                                    <ng-dropdown-multiselect class="multiSelect cursor"
-                                                                             data-input-name="priorities"
-                                                                             selected-model="vm.search.priorityIds"
-                                                                             options="::vm.priorities"></ng-dropdown-multiselect>
-                                                </div>
-                                            </div>
-
-                                            <div class="col-lg-3">
-                                                <div class="form-group">
-                                                    <label> <span translate="common.importance">以묒슂�룄</span></label>
-                                                    <ng-dropdown-multiselect class="multiSelect cursor"
-                                                                             data-input-name="severities"
-                                                                             selected-model="vm.search.severityIds"
-                                                                             options="::vm.severities"></ng-dropdown-multiselect>
-                                                </div>
-                                            </div>
-                                        </div>
-
-                                        <div class="row">
-                                            <div class="col-lg-3">
-                                                <div class="form-group">
-                                                    <label> <span translate="common.register">�벑濡앹옄</span></label>
-                                                    <js-autocomplete-multi data-input-name="registers"
-                                                                           selected-model="vm.registers"
-                                                                           search="vm.registerName"
-                                                                           input-disabled="false"
-                                                                           source="fn.getUserList(vm.registerName, vm.registers)"
-                                                                           translation-texts="{ count : 'common.userNum', empty : 'common.emptyUser' }"
-                                                                           extra-settings="{ displayProp : 'byName' , idProp : 'id', widthable : false, width : '', imageable : true, imagePathProp : 'profile', type : 'user', maxlength : 100 }">
-                                                    </js-autocomplete-multi>
-                                                </div>
-                                            </div>
-
-                                            <div class="col-lg-3">
-                                                <div class="form-group">
-                                                    <label> <span translate="common.registrationDate">�벑濡앹씪</span></label>
-                                                    <input type="text"
-                                                           readonly
-                                                           class="form-control input-sm input-readonly"
-                                                           ng-model="vm.search.registerDateRange"
-                                                           modal-form-auto-scroll
-                                                           date-format="YY-MM-DD"
-                                                           parent-el="'#createdWidget'"
-                                                           date-range-picker>
-                                                </div>
-                                            </div>
-
-                                            <div class="col-lg-3">
-                                                <div class="form-group">
-                                                    <label> <span translate="common.startDate">�떆�옉�씪</span></label>
-                                                    <input type="text"
-                                                           readonly
-                                                           class="form-control input-sm input-readonly"
-                                                           ng-model="vm.search.startDateRange"
-                                                           date-format="YY-MM-DD"
-                                                           parent-el="'#createdWidget'"
-                                                           date-range-picker>
-                                                </div>
-                                            </div>
-
-                                            <div class="col-lg-3">
-                                                <div class="form-group">
-                                                    <label> <span translate="common.endDate">醫낅즺�씪</span></label>
-                                                    <input type="text"
-                                                           readonly
-                                                           class="form-control input-sm input-readonly"
-                                                           ng-model="vm.search.completeDateRange"
-                                                           modal-form-auto-scroll
-                                                           date-format="YY-MM-DD"
-                                                           parent-el="'#createdWidget'"
-                                                           date-range-picker>
-                                                </div>
-                                            </div>
-
-                                            <div class="col-lg-3">
-                                                <div class="form-group">
-                                                    <label> <span translate="common.assigneeTeam">�떞�떦遺��꽌</span></label>
-                                                    <js-autocomplete-multi data-input-name="departments"
-                                                                           selected-model="vm.departments"
-                                                                           search="vm.departmentName"
-                                                                           input-disabled="false"
-                                                                           source="fn.getUserDepartmentList(vm.departmentName, vm.departments)"
-                                                                           translation-texts="{ count : 'common.userNum', empty : 'common.emptyProjectDepartment' }"
-                                                                           extra-settings="{ displayProp : 'byName' , idProp : 'id', widthable : false, width : '', imageable : true, imagePathProp : 'profile', type : 'department', maxlength : 100 }">
-                                                    </js-autocomplete-multi>
-                                                </div>
-                                            </div>
-
-                                            <div class="col-lg-3" ng-repeat="customField in vm.customFields">
-                                                <label>{{::customField.name}}</label>
-
-                                                <div ng-switch on="customField.customFieldType">
-                                                    <div ng-switch-when="INPUT">
-                                                        <input type="text" class="form-control input-sm"
-                                                               ng-model="customField.useValues"
-                                                               maxlength="100">
+                                    <div class="">
+                                        <label class="issue-search-label" ng-class="{ 'icon-reverse' : vm.searchView }"
+                                               ng-click="vm.searchView = !vm.searchView">
+                                            <span translate="common.detailedSearch">�긽�꽭寃��깋</span>
+                                        </label>
+                                        <div ng-if="vm.searchView">
+                                            <div class="row">
+                                                <div class="col-lg-3">
+                                                    <div class="form-group">
+                                                        <label> <span translate="issue.issueTitle">�씠�뒋 �젣紐�</span></label>
+                                                        <input type="text"
+                                                               name="title"
+                                                               class="form-control input-sm"
+                                                               kr-input
+                                                               maxlength="20"
+                                                               autocomplete="off"
+                                                               ng-model="vm.search.title">
                                                     </div>
+                                                </div>
 
-                                                    <div ng-switch-default>
+                                                <div class="col-lg-3">
+                                                    <div class="form-group">
+                                                        <label> <span translate="common.project">�봽濡쒖젥�듃</span></label>
+                                                        <js-autocomplete-multi data-input-name="projects"
+                                                                               selected-model="vm.projects"
+                                                                               search="vm.projectName"
+                                                                               input-disabled="false"
+                                                                               translation-texts="{ empty : 'common.emptyProject', selectList : 'common.' }"
+                                                                               source="fn.getProjectList(vm.projectName, vm.projects, null, null, ['01', '02', '03'])"
+                                                                               extra-settings="{ displayProp : 'name' , idProp : 'id', imageable : false, imagePathProp : '', type : '', maxlength : 100}"></js-autocomplete-multi>
+                                                    </div>
+                                                </div>
+
+                                                <div class="col-lg-3">
+                                                    <div class="form-group">
+                                                        <label> <span translate="issue.issueType">�씠�뒋 ���엯</span></label>
                                                         <ng-dropdown-multiselect class="multiSelect cursor"
-                                                                                 data-input-name="customField.name"
-                                                                                 selected-model="customField.useValues"
-                                                                                 extra-settings="{ 'idProp' : 'value', 'externalIdProp' : 'value', 'displayProp' : 'value', 'stringTypeOption' : 'true', 'stopRemoveBodyEvent' : 'true' }"
-                                                                                 options="::customField.customFieldValueVos"></ng-dropdown-multiselect>
+                                                                                 data-input-name="issueStatuses"
+                                                                                 selected-model="vm.search.issueTypeIds"
+                                                                                 options="::vm.issueTypes"></ng-dropdown-multiselect>
+                                                    </div>
+                                                </div>
+
+                                                <div class="col-lg-3">
+                                                    <div class="form-group">
+                                                        <label> <span translate="issue.issueStatus">�씠�뒋 �긽�깭</span></label>
+                                                        <ng-dropdown-multiselect class="multiSelect cursor"
+                                                                                 data-input-name="issueStatuses"
+                                                                                 selected-model="vm.search.issueStatusIds"
+                                                                                 options="::vm.issueStatuses"></ng-dropdown-multiselect>
                                                     </div>
                                                 </div>
                                             </div>
 
-                                        </div>
+                                            <div class="row">
+                                                <div class="col-lg-3">
+                                                    <div class="form-group">
+                                                        <label> <span translate="issue.issueNumber">�씠�뒋 踰덊샇</span></label>
+                                                        <input type="text"
+                                                               name="name"
+                                                               class="form-control input-sm"
+                                                               autocomplete="off"
+                                                               kr-input
+                                                               maxlength="20"
+                                                               ng-model="vm.search.combinationIssueNumber">
+                                                    </div>
+                                                </div>
 
-                                        <div class="row">
-                                            <div class="col-sm-12">
-                                                <div class="form-buttons-w text-center mb-20">
-                                                    <button class="btn btn-xlg btn-navy" ng-click="fn.getPageList(0)">
-                                                        <i class="os-icon os-icon-ui-37"></i> &nbsp;
-                                                        &nbsp; <span translate="common.search">寃��깋</span> &nbsp; &nbsp;
-                                                    </button>
-                                                    <button class="btn btn-xlg btn-white" ng-click="fn.initSearch()">
-                                                        <i class="os-icon os-icon-grid-18"></i> &nbsp;
-                                                        &nbsp; <span translate="common.reset">珥덇린�솕</span> &nbsp; &nbsp;
-                                                    </button>
+                                                <div class="col-lg-3">
+                                                    <div class="form-group">
+                                                        <label> <span translate="issue.issueContent">�씠�뒋 �궡�슜</span></label>
+                                                        <input type="text"
+                                                               name="description"
+                                                               class="form-control input-sm"
+                                                               kr-input
+                                                               maxlength="20"
+                                                               autocomplete="off"
+                                                               ng-model="vm.search.description">
+                                                    </div>
+                                                </div>
+
+                                                <div class="col-lg-3">
+                                                    <div class="form-group">
+                                                        <label> <span translate="common.priority">�슦�꽑 �닚�쐞</span></label>
+                                                        <ng-dropdown-multiselect class="multiSelect cursor"
+                                                                                 data-input-name="priorities"
+                                                                                 selected-model="vm.search.priorityIds"
+                                                                                 options="::vm.priorities"></ng-dropdown-multiselect>
+                                                    </div>
+                                                </div>
+
+                                                <div class="col-lg-3">
+                                                    <div class="form-group">
+                                                        <label> <span translate="common.importance">以묒슂�룄</span></label>
+                                                        <ng-dropdown-multiselect class="multiSelect cursor"
+                                                                                 data-input-name="severities"
+                                                                                 selected-model="vm.search.severityIds"
+                                                                                 options="::vm.severities"></ng-dropdown-multiselect>
+                                                    </div>
+                                                </div>
+                                            </div>
+
+                                            <div class="row">
+                                                <div class="col-lg-3">
+                                                    <div class="form-group">
+                                                        <label> <span translate="common.register">�벑濡앹옄</span></label>
+                                                        <js-autocomplete-multi data-input-name="registers"
+                                                                               selected-model="vm.registers"
+                                                                               search="vm.registerName"
+                                                                               input-disabled="false"
+                                                                               source="fn.getUserList(vm.registerName, vm.registers)"
+                                                                               translation-texts="{ count : 'common.userNum', empty : 'common.emptyUser' }"
+                                                                               extra-settings="{ displayProp : 'byName' , idProp : 'id', widthable : false, width : '', imageable : true, imagePathProp : 'profile', type : 'user', maxlength : 100 }">
+                                                        </js-autocomplete-multi>
+                                                    </div>
+                                                </div>
+
+                                                <div class="col-lg-3">
+                                                    <div class="form-group">
+                                                        <label> <span translate="common.registrationDate">�벑濡앹씪</span></label>
+                                                        <input type="text"
+                                                               readonly
+                                                               class="form-control input-sm input-readonly"
+                                                               ng-model="vm.search.registerDateRange"
+                                                               modal-form-auto-scroll
+                                                               date-format="YY-MM-DD"
+                                                               parent-el="'#createdWidget'"
+                                                               date-range-picker>
+                                                    </div>
+                                                </div>
+
+                                                <div class="col-lg-3">
+                                                    <div class="form-group">
+                                                        <label> <span translate="common.startDate">�떆�옉�씪</span></label>
+                                                        <input type="text"
+                                                               readonly
+                                                               class="form-control input-sm input-readonly"
+                                                               ng-model="vm.search.startDateRange"
+                                                               date-format="YY-MM-DD"
+                                                               parent-el="'#createdWidget'"
+                                                               date-range-picker>
+                                                    </div>
+                                                </div>
+
+                                                <div class="col-lg-3">
+                                                    <div class="form-group">
+                                                        <label> <span translate="common.endDate">醫낅즺�씪</span></label>
+                                                        <input type="text"
+                                                               readonly
+                                                               class="form-control input-sm input-readonly"
+                                                               ng-model="vm.search.completeDateRange"
+                                                               modal-form-auto-scroll
+                                                               date-format="YY-MM-DD"
+                                                               parent-el="'#createdWidget'"
+                                                               date-range-picker>
+                                                    </div>
+                                                </div>
+
+                                                <div class="col-lg-3">
+                                                    <div class="form-group">
+                                                        <label> <span translate="common.assigneeTeam">�떞�떦遺��꽌</span></label>
+                                                        <js-autocomplete-multi data-input-name="departments"
+                                                                               selected-model="vm.departments"
+                                                                               search="vm.departmentName"
+                                                                               input-disabled="false"
+                                                                               source="fn.getUserDepartmentList(vm.departmentName, vm.departments)"
+                                                                               translation-texts="{ count : 'common.userNum', empty : 'common.emptyProjectDepartment' }"
+                                                                               extra-settings="{ displayProp : 'byName' , idProp : 'id', widthable : false, width : '', imageable : true, imagePathProp : 'profile', type : 'department', maxlength : 100 }">
+                                                        </js-autocomplete-multi>
+                                                    </div>
+                                                </div>
+
+                                                <div class="col-lg-3" ng-repeat="customField in vm.customFields">
+                                                    <label>{{::customField.name}}</label>
+
+                                                    <div ng-switch on="customField.customFieldType">
+                                                        <div ng-switch-when="INPUT">
+                                                            <input type="text" class="form-control input-sm"
+                                                                   ng-model="customField.useValues"
+                                                                   maxlength="100">
+                                                        </div>
+
+                                                        <div ng-switch-default>
+                                                            <ng-dropdown-multiselect class="multiSelect cursor"
+                                                                                     data-input-name="customField.name"
+                                                                                     selected-model="customField.useValues"
+                                                                                     extra-settings="{ 'idProp' : 'value', 'externalIdProp' : 'value', 'displayProp' : 'value', 'stringTypeOption' : 'true', 'stopRemoveBodyEvent' : 'true' }"
+                                                                                     options="::customField.customFieldValueVos"></ng-dropdown-multiselect>
+                                                        </div>
+                                                    </div>
+                                                </div>
+
+                                            </div>
+
+                                            <div class="row">
+                                                <div class="col-sm-12">
+                                                    <div class="form-buttons-w text-center mb-20">
+                                                        <button class="btn btn-xlg btn-navy" ng-click="fn.getPageList(0)">
+                                                            <i class="os-icon os-icon-ui-37"></i> &nbsp;
+                                                            &nbsp; <span translate="common.search">寃��깋</span> &nbsp; &nbsp;
+                                                        </button>
+                                                        <button class="btn btn-xlg btn-white" ng-click="fn.initSearch()">
+                                                            <i class="os-icon os-icon-grid-18"></i> &nbsp;
+                                                            &nbsp; <span translate="common.reset">珥덇린�솕</span> &nbsp; &nbsp;
+                                                        </button>
+                                                    </div>
                                                 </div>
                                             </div>
                                         </div>
                                     </div>
-                                </div>
-                            </form>
+                                </form>
+                            </div>
                         </div>
                     </div>
-                </div>
                     <div class="controls-above-table mt-30">
                         <div class="row">
                             <!--    醫뚯륫  -->
@@ -326,15 +326,20 @@
                                         </select> {{vm.page.selectedPage}}-{{vm.responseData.page.totalPage}} /
                                         {{vm.responseData.page.totalCount | number}}<span translate="common.few">嫄�</span>
                                     </label>
+                                    <div class="btn-group ml-2" role="group" aria-label="list-group">
+                                        <button class="btn" ng-class="{'btn-info': vm.listMode === 0, 'btn-light': vm.listMode !== 0}" ng-click="fn.onClickListMode(0)">List</button>
+                                        <button class="btn" ng-class="{'btn-info': vm.listMode === 1, 'btn-light': vm.listMode !== 1}" ng-click="fn.onClickListMode(1)">Tree</button>
+                                    </div>
                                 </div>
                             </div>
-                            <!--    �슦痢�  -->
-                            <div class="col-5 " >
-                                <span class="issue-detail-label" style="position: relative; left: 18.8rem; bottom: 5px"><span style="color: #0a7cf8">�뾾</span> �셿猷� �씠�뒋 �닲湲곌린</span>
-                                    <label class='switch' style="left: 19.3rem"><input type='checkbox' ng-model='vm.hideIssue' ng-click='fn.getPageList(0)'>
-                                        <span class='slider round'></span>
-                                    </label>
 
+
+                            <!--    �슦痢�  -->
+                            <div class="col-5" >
+                                <span class="issue-detail-label" style="position: relative; left: 18.8rem; bottom: 5px"><span style="color: #0a7cf8">�뾾</span> �셿猷� �씠�뒋 �닲湲곌린</span>
+                                <label class='switch' style="left: 19.3rem"><input type='checkbox' ng-model='vm.hideIssue' ng-click='fn.getPageList(0)'>
+                                    <span class='slider round'></span>
+                                </label>
                                 <form class="form-inline justify-content-sm-end  pull-right" method="post" action="/issue/downloadExcel" name="issueListForm" >
                                     <!--span class="badge-tip" function-tool-tip  data-placement="top" data-toggle="tooltip" data-original-title="�뿊�� �떎�슫濡쒕뱶, �씪愿� 蹂�寃� �벑 �떎�뼇�븳 湲곕뒫�쓣 �젣怨듯빀�땲�떎.">?</span-->
                                     <input type="hidden" name="conditions">
@@ -359,26 +364,31 @@
                         </div>
                     </div>
 
-                    <div class="table-responsive">
-                        <js-table data="vm.responseData.data" table-configs="vm.tableConfigs"
+                    <div class="table-responsive" >
+                        <js-table ng-if="vm.listMode === 0"
+                                  data="vm.responseData.data" table-configs="vm.tableConfigs"
                                   event="tableEvent" detail-view="vm.detailView"></js-table>
+
+                        <js-tree ng-if="vm.listMode === 1"
+                                  data="vm.responseData.data" table-configs="vm.tableConfigs"
+                                  event="tableEvent" detail-view="vm.detailView"></js-tree>
                     </div>
-                <div class="controls-below-table text-center">
-                    <ul uib-pagination
-                        boundary-links-numbes="true"
-                        items-per-page="vm.page.selectedPageRowCount"
-                        total-items="vm.responseData.page.totalCount"
-                        ng-model="vm.page.selectedPage"
-                        max-size="10"
-                        ng-click="fn.getPageList(vm.page.selectedPage - 1)"
-                        class="pagination pagination-sm"
-                        previous-text="&lt;"
-                        next-text="&gt;"
-                        first-text=""
-                        last-text="">
-                    </ul>
+                    <div class="controls-below-table text-center">
+                        <ul uib-pagination
+                            boundary-links-numbes="true"
+                            items-per-page="vm.page.selectedPageRowCount"
+                            total-items="vm.responseData.page.totalCount"
+                            ng-model="vm.page.selectedPage"
+                            max-size="10"
+                            ng-click="fn.getPageList(vm.page.selectedPage - 1)"
+                            class="pagination pagination-sm"
+                            previous-text="&lt;"
+                            next-text="&gt;"
+                            first-text=""
+                            last-text="">
+                        </ul>
+                    </div>
                 </div>
-            </div>
             </div>
         </div>
     </div>

--
Gitblit v1.8.0