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> <span class="select3-selection__choice" style="position: relative; bottom: 2px;"><code class="highlighter-rouge">*</code> - �뾽泥� �씠由� �겢由��떆 �꽑�깮�맂 �씠由꾩쓽 �뾽泥� �젙蹂닿� 議고쉶�릺硫�, 媛숈� url�쓣 媛�吏�怨좎엳�뒗 ISP, �샇�뒪�똿 �젙蹂대�� 遺덈윭�샃�땲�떎.</span> + �뾽泥� �씠由� �겢由��떆 �꽑�깮�맂 �씠由꾩쓽 �뾽泥� �젙蹂닿� 議고쉶�릺硫�, �뾽泥댁젙蹂댁뿉�꽌 異붽��븳 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> - <span translate="common.search">寃��깋</span> - </button> - <button class="btn btn-xlg btn-white" ng-click="fn.initSearch()"> - <i class="os-icon os-icon-grid-18"></i> - <span translate="common.reset">珥덇린�솕</span> - </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> + <span translate="common.search">寃��깋</span> + </button> + <button class="btn btn-xlg btn-white" ng-click="fn.initSearch()"> + <i class="os-icon os-icon-grid-18"></i> + <span translate="common.reset">珥덇린�솕</span> + </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="<" - next-text=">" - 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="<" + next-text=">" + first-text="" + last-text=""> + </ul> + </div> </div> - </div> </div> </div> </div> -- Gitblit v1.8.0