From 107ab8e67d089738ad8b3a1ff0efc96680a13cf6 Mon Sep 17 00:00:00 2001 From: wyu <kknd09321@nate.com> Date: 목, 09 12월 2021 14:29:47 +0900 Subject: [PATCH] Merge branch 'master' of http://192.168.0.25:9001/r/owl-kisa --- src/main/java/kr/wisestone/owl/util/ConvertUtil.java | 2 src/main/webapp/views/issue/issueAdd.html | 12 + src/main/webapp/scripts/app/ispField/ispFieldModify.controller.js | 3 src/main/webapp/views/ispField/ispFieldModify.html | 2 src/main/java/kr/wisestone/owl/vo/CompanyFieldVo.java | 23 ++ src/main/java/kr/wisestone/owl/service/impl/IspFieldServiceImpl.java | 28 +++ src/main/webapp/scripts/app/api/apiSetting.controller.js | 6 src/main/java/kr/wisestone/owl/web/controller/IssueController.java | 24 +++ src/main/webapp/scripts/main.js | 2 src/main/java/kr/wisestone/owl/service/impl/IssueTypeServiceImpl.java | 2 src/main/java/kr/wisestone/owl/service/impl/IssueServiceImpl.java | 83 +++++++++ src/main/resources/migration/V1_12__Alter_Table.sql | 18 -- src/main/webapp/scripts/components/issue/issue.service.js | 12 + src/main/webapp/views/api/apiSettingOverlap.html | 2 src/main/java/kr/wisestone/owl/repository/IspFieldRepository.java | 4 src/main/webapp/scripts/app/issue/issueAdd.controller.js | 18 ++ src/main/webapp/scripts/app/hostingField/hostingFieldModify.controller.js | 2 src/main/resources/migration/V1_13__Alter_Table.sql | 17 ++ src/main/java/kr/wisestone/owl/repository/CompanyFieldRepository.java | 1 src/main/java/kr/wisestone/owl/service/impl/UserServiceImpl.java | 8 src/main/java/kr/wisestone/owl/service/IssueService.java | 4 src/main/java/kr/wisestone/owl/repository/HostingFieldRepository.java | 5 src/main/java/kr/wisestone/owl/service/impl/CompanyFieldServiceImpl.java | 44 ++++ src/main/webapp/scripts/app/issue/issueList.controller.js | 110 ++++++++++++- src/main/java/kr/wisestone/owl/service/impl/HostingFieldServiceImpl.java | 28 +++ src/main/webapp/i18n/ko/global.json | 3 src/main/webapp/index.html | 2 27 files changed, 416 insertions(+), 49 deletions(-) diff --git a/src/main/java/kr/wisestone/owl/repository/CompanyFieldRepository.java b/src/main/java/kr/wisestone/owl/repository/CompanyFieldRepository.java index d8fff79..3520b7e 100644 --- a/src/main/java/kr/wisestone/owl/repository/CompanyFieldRepository.java +++ b/src/main/java/kr/wisestone/owl/repository/CompanyFieldRepository.java @@ -8,4 +8,5 @@ CompanyField findByUrl(@Param("url") String url); + CompanyField findByUrlAndIdNot(@Param("url") String url, @Param("id") Long id); } diff --git a/src/main/java/kr/wisestone/owl/repository/HostingFieldRepository.java b/src/main/java/kr/wisestone/owl/repository/HostingFieldRepository.java index 406f77d..528ac5a 100644 --- a/src/main/java/kr/wisestone/owl/repository/HostingFieldRepository.java +++ b/src/main/java/kr/wisestone/owl/repository/HostingFieldRepository.java @@ -1,8 +1,13 @@ package kr.wisestone.owl.repository; +import kr.wisestone.owl.domain.CompanyField; import kr.wisestone.owl.domain.HostingField; +import kr.wisestone.owl.domain.IspField; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.repository.query.Param; public interface HostingFieldRepository extends JpaRepository<HostingField, Long> { + HostingField findByUrl(@Param("url") String url); + HostingField findByUrlAndIdNot(@Param("url") String url, @Param("id") Long id); } diff --git a/src/main/java/kr/wisestone/owl/repository/IspFieldRepository.java b/src/main/java/kr/wisestone/owl/repository/IspFieldRepository.java index 1da6f7f..8b4a52c 100644 --- a/src/main/java/kr/wisestone/owl/repository/IspFieldRepository.java +++ b/src/main/java/kr/wisestone/owl/repository/IspFieldRepository.java @@ -1,8 +1,12 @@ package kr.wisestone.owl.repository; +import kr.wisestone.owl.domain.CompanyField; import kr.wisestone.owl.domain.IspField; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.repository.query.Param; public interface IspFieldRepository extends JpaRepository<IspField, Long> { + IspField findByUrl(@Param("url") String url); + IspField findByUrlAndIdNot(@Param("url") String url, @Param("id") Long id); } diff --git a/src/main/java/kr/wisestone/owl/service/IssueService.java b/src/main/java/kr/wisestone/owl/service/IssueService.java index fff9510..302a9e4 100644 --- a/src/main/java/kr/wisestone/owl/service/IssueService.java +++ b/src/main/java/kr/wisestone/owl/service/IssueService.java @@ -54,6 +54,10 @@ void removeIssues(IssueForm issueForm); + void removeAllIssues(IssueForm issueForm); + + void removeDownIssues(IssueForm issueForm); + void modifyIssueStatus(IssueForm issueForm, User user); Issue getIssue(Long taskId); 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 06d7e86..383e006 100644 --- a/src/main/java/kr/wisestone/owl/service/impl/CompanyFieldServiceImpl.java +++ b/src/main/java/kr/wisestone/owl/service/impl/CompanyFieldServiceImpl.java @@ -2,6 +2,10 @@ import kr.wisestone.owl.domain.CompanyField; import kr.wisestone.owl.domain.CustomField; +import kr.wisestone.owl.domain.HostingField; +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.web.condition.CompanyFieldCondition; import kr.wisestone.owl.web.form.CompanyFieldForm; @@ -40,6 +44,12 @@ private CompanyFieldMapper companyFieldMapper; @Autowired + private IspFieldRepository ispFieldRepository; + + @Autowired + private HostingFieldRepository hostingFieldRepository; + + @Autowired private UserService userService; @Autowired @@ -60,7 +70,7 @@ @Override public CompanyField addCompany(CompanyFieldForm companyFieldForm) { // url �쑀�슚�꽦 泥댄겕 - this.verifyUrl(companyFieldForm.getUrl()); + this.verifyUrl(companyFieldForm.getUrl(), null); CompanyField companyField = ConvertUtil.copyProperties(companyFieldForm, CompanyField.class); companyFieldRepository.saveAndFlush(companyField); @@ -68,12 +78,18 @@ } // url �쑀�슚�꽦 泥댄겕 - private void verifyUrl(String url) { + private void verifyUrl(String url, Long id) { if (StringUtils.isEmpty(url)) { throw new OwlRuntimeException( this.messageAccessor.getMessage(MsgConstants.COMPANYFIELD_NOT_URL)); } - CompanyField companyField = this.companyFieldRepository.findByUrl(url); + CompanyField companyField; + + if(id == null){ + companyField = this.companyFieldRepository.findByUrl(url); + } else { + companyField = this.companyFieldRepository.findByUrlAndIdNot(url,id); + } if (companyField != null) { throw new OwlRuntimeException( @@ -94,7 +110,6 @@ return this.convertCompanyVoToMap(results, totalCompanyCount, pageable, resJsonData); } - // �뾽泥� �긽�꽭 議고쉶�븳�떎. @Override public void detailCompany(Map<String, Object> resJsonData, CompanyFieldCondition companyFieldCondition) { @@ -112,7 +127,7 @@ @Override public void modifyCompany(CompanyFieldForm companyFieldForm) { // url �쑀�슚�꽦 泥댄겕 - this.verifyUrl(companyFieldForm.getUrl()); + this.verifyUrl(companyFieldForm.getUrl(), companyFieldForm.getId()); CompanyField companyField = ConvertUtil.copyProperties(companyFieldForm, CompanyField.class); companyFieldRepository.saveAndFlush(companyField); @@ -170,9 +185,28 @@ // 寃��깋 寃곌낵瑜� 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); + IspFieldVo ispFieldVo = ConvertUtil.copyProperties(ispField, IspFieldVo.class); + if(ispFieldVo != null){ + ispFieldVos.add(ispFieldVo); + } + companyFieldVo.setIspFieldVos(ispFieldVos); + + HostingField hostingField = this.hostingFieldRepository.findByUrl(url); + HostingFieldVo hostingFieldVo = ConvertUtil.copyProperties(hostingField, HostingFieldVo.class); + if(hostingFieldVo != null){ + hostingFieldVos.add(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 eee1084..d969fe6 100644 --- a/src/main/java/kr/wisestone/owl/service/impl/HostingFieldServiceImpl.java +++ b/src/main/java/kr/wisestone/owl/service/impl/HostingFieldServiceImpl.java @@ -4,6 +4,7 @@ import kr.wisestone.owl.common.ExcelConditionCheck; import kr.wisestone.owl.constant.Constants; import kr.wisestone.owl.constant.MsgConstants; +import kr.wisestone.owl.domain.CompanyField; import kr.wisestone.owl.domain.HostingField; import kr.wisestone.owl.exception.OwlRuntimeException; import kr.wisestone.owl.mapper.HostingFieldMapper; @@ -18,6 +19,7 @@ import kr.wisestone.owl.web.condition.HostingFieldCondition; import kr.wisestone.owl.web.form.HostingFieldForm; import kr.wisestone.owl.web.view.ExcelView; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; @@ -56,9 +58,32 @@ // Hosting 異붽� @Override public HostingField add(HostingFieldForm HostingFieldForm) { + // 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) { + if (StringUtils.isEmpty(url)) { + throw new OwlRuntimeException( + this.messageAccessor.getMessage(MsgConstants.COMPANYFIELD_NOT_URL)); + } + 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 紐⑸줉�쓣 媛��졇�삩�떎. @@ -91,6 +116,9 @@ // Hosting �젙濡쒕�� �닔�젙�븳�떎. @Override public void modify(HostingFieldForm HostingFieldForm) { + // url �쑀�슚�꽦 泥댄겕 + this.verifyUrl(HostingFieldForm.getUrl(), HostingFieldForm.getId()); + HostingField HostingField = ConvertUtil.copyProperties(HostingFieldForm, HostingField.class); hostingFieldRepository.saveAndFlush(HostingField); } 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 d3fb15f..110f026 100644 --- a/src/main/java/kr/wisestone/owl/service/impl/IspFieldServiceImpl.java +++ b/src/main/java/kr/wisestone/owl/service/impl/IspFieldServiceImpl.java @@ -4,6 +4,7 @@ import kr.wisestone.owl.common.ExcelConditionCheck; import kr.wisestone.owl.constant.Constants; import kr.wisestone.owl.constant.MsgConstants; +import kr.wisestone.owl.domain.CompanyField; import kr.wisestone.owl.domain.IspField; import kr.wisestone.owl.exception.OwlRuntimeException; import kr.wisestone.owl.mapper.IspFieldMapper; @@ -18,6 +19,7 @@ import kr.wisestone.owl.web.condition.IspFieldCondition; import kr.wisestone.owl.web.form.IspFieldForm; import kr.wisestone.owl.web.view.ExcelView; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; @@ -56,6 +58,9 @@ // Isp 異붽� @Override public IspField add(IspFieldForm IspFieldForm) { + // url �쑀�슚�꽦 泥댄겕 + this.verifyUrl(IspFieldForm.getUrl(), null); + IspField IspField = ConvertUtil.copyProperties(IspFieldForm, IspField.class); ispFieldRepository.saveAndFlush(IspField); return IspField; @@ -72,6 +77,26 @@ Long totalIspCount = this.ispFieldMapper.count(condition); return this.convertIspVoToMap(results, totalIspCount, pageable, resJsonData); + } + + // url �쑀�슚�꽦 泥댄겕 + private void verifyUrl(String url, Long id) { + if (StringUtils.isEmpty(url)) { + throw new OwlRuntimeException( + this.messageAccessor.getMessage(MsgConstants.COMPANYFIELD_NOT_URL)); + } + 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)); + } } @@ -91,6 +116,9 @@ // Isp �젙濡쒕�� �닔�젙�븳�떎. @Override public void modify(IspFieldForm IspFieldForm) { + // url �쑀�슚�꽦 泥댄겕 + this.verifyUrl(IspFieldForm.getUrl(), IspFieldForm.getId()); + IspField IspField = ConvertUtil.copyProperties(IspFieldForm, IspField.class); ispFieldRepository.saveAndFlush(IspField); } 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 8e77478..2a11e37 100644 --- a/src/main/java/kr/wisestone/owl/service/impl/IssueServiceImpl.java +++ b/src/main/java/kr/wisestone/owl/service/impl/IssueServiceImpl.java @@ -2096,20 +2096,95 @@ List<Issue> removeIssues = Lists.newArrayList(); for (Long issueId : issueForm.getRemoveIds()) { + //�븯�쐞�씠�뒋 泥댄겕 + List<Issue> downIssues = this.issueRepository.findByParentIssueId(issueId); + if(downIssues != null && downIssues.size() > 0){ + for(Issue downIssue : downIssues){ + if(downIssue.getParentIssue() != null){ + downIssue.setParentIssue(null); + } + } + } + Issue issue = this.issueRemoves(issueId, user); removeIssues.add(issue); } - if (removeIssues.size() > 0) { - //this.issueRepository.deleteAll(removeIssues); - } + /*if (removeIssues.size() > 0) { + this.issueRepository.deleteAll(removeIssues); + }*/ // �궗�슜�옄 �떆�뒪�뀥 湲곕뒫 �궗�슜 �젙蹂� �닔吏� log.info(ElasticSearchUtil.makeUserActiveHistoryMessage(this.webAppUtil.getLoginUser(), ElasticSearchConstants.ISSUE_REMOVE)); } + // �씠�뒋瑜� �궘�젣�븳�떎. + @Override + @Transactional + public void removeAllIssues(IssueForm issueForm) { + // �궗�슜�븯怨� �엳�뒗 �뾽臾� 怨듦컙�씠 �솢�꽦 �긽�깭�씤吏� �솗�씤�븳�떎. �궗�슜 怨듦컙�뿉�꽌 濡쒓렇�씤�븳 �궗�슜�옄媛� 鍮꾪솢�꽦�씤吏� �솗�씤�븳�떎. + User user = this.webAppUtil.getLoginUserObject(); + this.workspaceService.checkUseWorkspace(); + + if (issueForm.getRemoveIds().size() < 1) { + throw new OwlRuntimeException( + this.messageAccessor.getMessage(MsgConstants.ISSUE_REMOVE_NOT_SELECT)); + } + + List<Issue> removeIssues = Lists.newArrayList(); + + for (Long issueId : issueForm.getRemoveIds()) { + //�븯�쐞�씠�뒋 泥댄겕 + List<Issue> downIssues = this.issueRepository.findByParentIssueId(issueId); + if(downIssues != null && downIssues.size() > 0){ + for(Issue downIssue : downIssues){ + Long downIssueId = downIssue.getId(); + downIssue = this.issueRemoves(downIssueId, user); + removeIssues.add(downIssue); + } + } + Issue issue = this.issueRemoves(issueId, user); + removeIssues.add(issue); + } + // �궗�슜�옄 �떆�뒪�뀥 湲곕뒫 �궗�슜 �젙蹂� �닔吏� + log.info(ElasticSearchUtil.makeUserActiveHistoryMessage(this.webAppUtil.getLoginUser(), ElasticSearchConstants.ISSUE_REMOVE)); + } + + // �븯�쐞�씠�뒋瑜� �궘�젣�븳�떎. + @Override + @Transactional + public void removeDownIssues(IssueForm issueForm) { + // �궗�슜�븯怨� �엳�뒗 �뾽臾� 怨듦컙�씠 �솢�꽦 �긽�깭�씤吏� �솗�씤�븳�떎. �궗�슜 怨듦컙�뿉�꽌 濡쒓렇�씤�븳 �궗�슜�옄媛� 鍮꾪솢�꽦�씤吏� �솗�씤�븳�떎. + User user = this.webAppUtil.getLoginUserObject(); + this.workspaceService.checkUseWorkspace(); + + if (issueForm.getRemoveIds().size() < 1) { + throw new OwlRuntimeException( + this.messageAccessor.getMessage(MsgConstants.ISSUE_REMOVE_NOT_SELECT)); + } + + List<Issue> removeIssues = Lists.newArrayList(); + Long downIssueId = 0L; + for (Long issueId : issueForm.getRemoveIds()) { + //�궘�젣 �븷 �씠�뒋�쓽 �븯�쐞�씠�뒋 泥댄겕 + List<Issue> downIssues = this.issueRepository.findByParentIssueId(issueId); + if(downIssues != null && downIssues.size() > 0){ + for(Issue downIssue : downIssues){ + downIssueId = downIssue.getId(); + } + } + Issue issue = this.issueRemoves(downIssueId, user); + removeIssues.add(issue); + } + // �궗�슜�옄 �떆�뒪�뀥 湲곕뒫 �궗�슜 �젙蹂� �닔吏� + log.info(ElasticSearchUtil.makeUserActiveHistoryMessage(this.webAppUtil.getLoginUser(), ElasticSearchConstants.ISSUE_REMOVE)); + } + private Issue issueRemoves(Long issueId, User user) { - Issue issue = this.getIssue(issueId); + Issue issue = null; + if(issueId != null){ + issue = this.getIssue(issueId); + } // �씠�뒋 �닔�젙 沅뚰븳�쓣 媛뽮퀬 �엳�뒗吏� �솗�씤 this.verifyIssueModifyPermission(issue, user); diff --git a/src/main/java/kr/wisestone/owl/service/impl/IssueTypeServiceImpl.java b/src/main/java/kr/wisestone/owl/service/impl/IssueTypeServiceImpl.java index 1ffff50..0c3b5b1 100644 --- a/src/main/java/kr/wisestone/owl/service/impl/IssueTypeServiceImpl.java +++ b/src/main/java/kr/wisestone/owl/service/impl/IssueTypeServiceImpl.java @@ -80,6 +80,8 @@ for (ProjectType projectType : projectTypes) { List<IssueType> issueTypes = Lists.newArrayList(); Workflow workflow = this.workflowService.findByWorkspaceIdAndProjectType(workspace.getId(), projectType); + //String projectKey = "BTS"; + //Project project = this.projectService.findByProjectKey(projectKey); switch (projectType) { case BTS_PROJECT: diff --git a/src/main/java/kr/wisestone/owl/service/impl/UserServiceImpl.java b/src/main/java/kr/wisestone/owl/service/impl/UserServiceImpl.java index f5f077d..09ccec0 100644 --- a/src/main/java/kr/wisestone/owl/service/impl/UserServiceImpl.java +++ b/src/main/java/kr/wisestone/owl/service/impl/UserServiceImpl.java @@ -93,6 +93,9 @@ private ProjectService projectService; @Autowired + private IssueTypeService issueTypeService; + + @Autowired private UserSecurityService userSecurityService; @Autowired @@ -258,7 +261,10 @@ this.userWorkspaceService.addUserWorkspace(user, workspace, true, true); // 湲곕낯�쑝濡� �젣怨듬릺�뒗 �봽濡쒖젥�듃瑜� �깮�꽦�븳�떎. -// this.projectService.addDefaultProject(user, workspace); + this.projectService.addDefaultProject(user, workspace); + + // 湲곕낯�쑝濡� �젣怨듬릺�뒗 �봽濡쒖젥�듃瑜� �씠�뒋 �쑀�삎�쓽 �궗�슜 �봽濡쒖젥�듃濡� �꽕�젙 + //this.issueTypeService.addDefaultUsedProject(workspace); user.setLastWorkspaceId(workspace.getId()); diff --git a/src/main/java/kr/wisestone/owl/util/ConvertUtil.java b/src/main/java/kr/wisestone/owl/util/ConvertUtil.java index c4470cf..5bc0f35 100644 --- a/src/main/java/kr/wisestone/owl/util/ConvertUtil.java +++ b/src/main/java/kr/wisestone/owl/util/ConvertUtil.java @@ -5,6 +5,8 @@ import com.fasterxml.jackson.databind.ObjectMapper; import kr.wisestone.owl.constant.MsgConstants; import kr.wisestone.owl.exception.OwlRuntimeException; +import kr.wisestone.owl.vo.CompanyFieldVo; +import kr.wisestone.owl.vo.IspFieldVo; import org.apache.commons.lang3.ArrayUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/src/main/java/kr/wisestone/owl/vo/CompanyFieldVo.java b/src/main/java/kr/wisestone/owl/vo/CompanyFieldVo.java index 6ab7497..f09ad46 100644 --- a/src/main/java/kr/wisestone/owl/vo/CompanyFieldVo.java +++ b/src/main/java/kr/wisestone/owl/vo/CompanyFieldVo.java @@ -1,5 +1,9 @@ package kr.wisestone.owl.vo; +import com.google.common.collect.Lists; + +import java.util.List; + public class CompanyFieldVo extends UsePartnerVo { private String manager; @@ -7,6 +11,9 @@ private String email; private String url; private String memo; + + private List<IspFieldVo> ispFieldVos = Lists.newArrayList(); + private List<HostingFieldVo> hostingFieldVos = Lists.newArrayList(); public CompanyFieldVo() {} @@ -58,4 +65,20 @@ public void setUrl(String url) { this.url = url; } + + public List<IspFieldVo> getIspFieldVos() { + return ispFieldVos; + } + + public void setIspFieldVos(List<IspFieldVo> ispFieldVos) { + this.ispFieldVos = ispFieldVos; + } + + public List<HostingFieldVo> getHostingFieldVos() { + return hostingFieldVos; + } + + public void setHostingFieldVos(List<HostingFieldVo> hostingFieldVos) { + this.hostingFieldVos = hostingFieldVos; + } } diff --git a/src/main/java/kr/wisestone/owl/web/controller/IssueController.java b/src/main/java/kr/wisestone/owl/web/controller/IssueController.java index f752960..460c4b5 100644 --- a/src/main/java/kr/wisestone/owl/web/controller/IssueController.java +++ b/src/main/java/kr/wisestone/owl/web/controller/IssueController.java @@ -137,6 +137,30 @@ return this.setSuccessMessage(resJsonData); } + // �븯�쐞�씠�뒋 �궘�젣 + @RequestMapping(value = "/issue/removeAll", produces = MediaType.APPLICATION_JSON_VALUE) + public + @ResponseBody + Map<String, Object> removesAll(@RequestBody Map<String, Map<String, Object>> params) { + Map<String, Object> resJsonData = new HashMap<>(); + + this.issueService.removeAllIssues(IssueForm.make(params.get(Constants.REQ_KEY_CONTENT))); + + return this.setSuccessMessage(resJsonData); + } + + // �븯�쐞�씠�뒋 �궘�젣 + /*@RequestMapping(value = "/issue/removeDown", produces = MediaType.APPLICATION_JSON_VALUE) + public + @ResponseBody + Map<String, Object> removesDown(@RequestBody Map<String, Map<String, Object>> params) { + Map<String, Object> resJsonData = new HashMap<>(); + + this.issueService.removeDownIssues(IssueForm.make(params.get(Constants.REQ_KEY_CONTENT))); + + return this.setSuccessMessage(resJsonData); + }*/ + // �씠�뒋 �떎以� �긽�깭 蹂�寃� @RequestMapping(value = "/issue/modifyMultiIssueStatus", produces = MediaType.APPLICATION_JSON_VALUE) public diff --git a/src/main/resources/migration/V1_12__Alter_Table.sql b/src/main/resources/migration/V1_12__Alter_Table.sql index 36a476b..9944ff1 100644 --- a/src/main/resources/migration/V1_12__Alter_Table.sql +++ b/src/main/resources/migration/V1_12__Alter_Table.sql @@ -1,17 +1 @@ --- �븘�닔 �뜲�씠�꽣 �뿬遺� -ALTER TABLE `custom_field` ADD COLUMN `required_data` VARCHAR(1) NOT NULL DEFAULT 'N'; - --- url �빆紐� 異붽� -ALTER TABLE `company_field` ADD COLUMN `url` VARCHAR(255) NULL; -ALTER TABLE `isp_field` ADD COLUMN `url` VARCHAR(255) NULL; -ALTER TABLE `hosting_field` ADD COLUMN `url` VARCHAR(255) NULL; - -ALTER TABLE `issue_company` ADD COLUMN `url` VARCHAR(255) NULL; -ALTER TABLE `issue_isp` ADD COLUMN `url` VARCHAR(255) NULL; -ALTER TABLE `issue_hosting` ADD COLUMN `url` VARCHAR(255) NULL; - --- �옄�룞 �셿猷� �긽�깭 異붽� -ALTER TABLE `issue_type` ADD COLUMN `complete_issue_status_id` BIGINT(20) NULL; - --- �뾽泥댁쓽 url 而щ읆 INDEX 異붽� -ALTER TABLE `company_field` ADD INDEX `urlIndex`(`url`); +ALTER TABLE `user` ADD INDEX `levelIdIndex`(`level_id`); \ No newline at end of file diff --git a/src/main/resources/migration/V1_13__Alter_Table.sql b/src/main/resources/migration/V1_13__Alter_Table.sql new file mode 100644 index 0000000..36a476b --- /dev/null +++ b/src/main/resources/migration/V1_13__Alter_Table.sql @@ -0,0 +1,17 @@ +-- �븘�닔 �뜲�씠�꽣 �뿬遺� +ALTER TABLE `custom_field` ADD COLUMN `required_data` VARCHAR(1) NOT NULL DEFAULT 'N'; + +-- url �빆紐� 異붽� +ALTER TABLE `company_field` ADD COLUMN `url` VARCHAR(255) NULL; +ALTER TABLE `isp_field` ADD COLUMN `url` VARCHAR(255) NULL; +ALTER TABLE `hosting_field` ADD COLUMN `url` VARCHAR(255) NULL; + +ALTER TABLE `issue_company` ADD COLUMN `url` VARCHAR(255) NULL; +ALTER TABLE `issue_isp` ADD COLUMN `url` VARCHAR(255) NULL; +ALTER TABLE `issue_hosting` ADD COLUMN `url` VARCHAR(255) NULL; + +-- �옄�룞 �셿猷� �긽�깭 異붽� +ALTER TABLE `issue_type` ADD COLUMN `complete_issue_status_id` BIGINT(20) NULL; + +-- �뾽泥댁쓽 url 而щ읆 INDEX 異붽� +ALTER TABLE `company_field` ADD INDEX `urlIndex`(`url`); diff --git a/src/main/webapp/i18n/ko/global.json b/src/main/webapp/i18n/ko/global.json index 5c27969..3c091ba 100644 --- a/src/main/webapp/i18n/ko/global.json +++ b/src/main/webapp/i18n/ko/global.json @@ -218,6 +218,8 @@ "settingTableDisplay": "�뀒�씠釉� �몴�떆 �꽕�젙", "deleteIssue": "�씠�뒋 �궘�젣", "wantToDeleteSelectIssue": "�꽑�깮�븳 �씠�뒋瑜� �궘�젣�븯寃좎뒿�땲源�? \n �궗�슜�옄媛� 吏곸젒 �궘�젣�븳 �씠�뒋�뒗 �뼱�뼚�븳 寃쎌슦�뿉�룄 蹂듦뎄媛� 遺덇��뒫�빀�땲�떎.", + "wantToDeleteOnlySelectIssue": "�꽑�깮�븳 �씠�뒋留� �궘�젣�븯寃좎뒿�땲源�? \n �궗�슜�옄媛� 吏곸젒 �궘�젣�븳 �씠�뒋�뒗 �뼱�뼚�븳 寃쎌슦�뿉�룄 蹂듦뎄媛� 遺덇��뒫�빀�땲�떎.", + "wantToDeleteSelectDownIssue": "�꽑�깮�븳 �씠�뒋�쓽 �븯�쐞 �씠�뒋媛� 議댁옱 �빀�땲�떎. \n �꽑�깮�븳 �씠�뒋�� �븯�쐞 �씠�뒋 紐⑤몢 �궘�젣�븯寃좎뒿�땲源�? \n �궗�슜�옄媛� 吏곸젒 �궘�젣�븳 �씠�뒋�뒗 �뼱�뼚�븳 寃쎌슦�뿉�룄 蹂듦뎄媛� 遺덇��뒫�빀�땲�떎.", "wantToDeleteSelectRelationIssue": "�꽑�깮�븳 �뿰愿� �씠�뒋瑜� �궘�젣�븯寃좎뒿�땲源�? \n �궗�슜�옄媛� 吏곸젒 �궘�젣�븳 �뿰愿� �씠�뒋�뒗 蹂듦뎄媛� 遺덇��뒫�빀�땲�떎.", "failedToSaveFieldConditions": "寃��깋 �븘�뱶 議곌굔 ���옣 �떎�뙣", "failedToGetSearchFieldCondition": "寃��깋 �븘�뱶 議곌굔 媛��졇�삤湲� �떎�뙣", @@ -783,6 +785,7 @@ "createIssue": "�씠�뒋 �깮�꽦", "updateIssue": "�씠�뒋 蹂�寃�", "deleteIssue": "�씠�뒋 �궘�젣", + "deleteDownIssue": "�븯�쐞 �씠�뒋 �궘�젣", "sendMailIssue": "�씠�뒋 硫붿씪 �쟾�넚", "updateTitle": "�젣紐⑹씠 蹂�寃쎈릺�뿀�뒿�땲�떎.", "updateContent": "�궡�슜�씠 蹂�寃쎈릺�뿀�뒿�땲�떎.", diff --git a/src/main/webapp/index.html b/src/main/webapp/index.html index cdf13fd..e8de587 100644 --- a/src/main/webapp/index.html +++ b/src/main/webapp/index.html @@ -40,7 +40,7 @@ <link type="text/css" rel="stylesheet" href="custom_components/js-autocomplete-single/js-autocomplete-single.css"> <link type="text/css" rel="stylesheet" href="custom_components/js-autocomplete-multi/js-autocomplete-multi.css"> <link type="text/css" rel="stylesheet" href="custom_components/js-html-diff/js-html-diff.css"> - <link type="text/css" rel="stylesheet" href="assets/styles/main.css?version=1.0.0"> + <link type="text/css" rel="stylesheet" href="assets/styles/main.css?version=0.9.0"> <link type="text/css" rel="stylesheet" href="https://fonts.googleapis.com/css?family=Rubik:300,400,500"> <!-- google font --> diff --git a/src/main/webapp/scripts/app/api/apiSetting.controller.js b/src/main/webapp/scripts/app/api/apiSetting.controller.js index 70103fc..acb070f 100644 --- a/src/main/webapp/scripts/app/api/apiSetting.controller.js +++ b/src/main/webapp/scripts/app/api/apiSetting.controller.js @@ -140,7 +140,7 @@ }); } - $scope.$watch("vm.issueTypeId", function (newValue){ + $scope.$watch("vm.issueTypeId", function (newValue, oldValue){ if (newValue != null && newValue !== "") { $scope.fn.loadPage(); } @@ -189,7 +189,6 @@ } function onChangeIssueTypeOverlap() { - $scope.fn.getIssueStatuses(); $scope.fn.getIssueTypeCustomFields(); $scope.fn.getOverlapList(); } @@ -237,8 +236,6 @@ if (result.data.message.status === "success") { SweetAlert.swal($filter("translate")("api.successToApiAutoCompleteIssueStatus"), result.data.message.message, "success"); // "�꽕�젙 �꽦怨�" $scope.fn.getIssueTypes(); - $scope.fn.getIssueStatuses(); - $scope.fn.getIssueTypeCustomFields(); } else { SweetAlert.swal($filter("translate")("api.failedToApiAutoCompleteIssueStatus"), result.data.message.message, "error"); // "�꽕�젙 �떎�뙣" } @@ -403,6 +400,7 @@ if (tab === "API_COL_SETTING") { $scope.fn.onChangeColumnSetting(); } else if (tab === "API_OVERLAP_SETTING") { + $scope.fn.getIssueStatuses(); $scope.fn.onChangeIssueTypeOverlap(); } else if (tab === "API_SPEC_SETTING") { $scope.fn.onChangeIssueTypeSpec(); diff --git a/src/main/webapp/scripts/app/hostingField/hostingFieldModify.controller.js b/src/main/webapp/scripts/app/hostingField/hostingFieldModify.controller.js index 36df870..86c33ff 100644 --- a/src/main/webapp/scripts/app/hostingField/hostingFieldModify.controller.js +++ b/src/main/webapp/scripts/app/hostingField/hostingFieldModify.controller.js @@ -45,7 +45,7 @@ var content = { id : parameter.id, - code : $rootScope.preventXss($scope.vm.form.name), + code : $rootScope.preventXss($scope.vm.form.code), name : $rootScope.preventXss($scope.vm.form.name), manager : $rootScope.preventXss($scope.vm.form.manager), tel : $rootScope.preventXss($scope.vm.form.tel), diff --git a/src/main/webapp/scripts/app/ispField/ispFieldModify.controller.js b/src/main/webapp/scripts/app/ispField/ispFieldModify.controller.js index f654894..4182144 100644 --- a/src/main/webapp/scripts/app/ispField/ispFieldModify.controller.js +++ b/src/main/webapp/scripts/app/ispField/ispFieldModify.controller.js @@ -24,6 +24,7 @@ name : "", //ISP紐� manager : "", //�떞�떦�옄 tel : "", //�쟾�솕踰덊샇 + code : "", email : "", //�씠硫붿씪 url : "", // url memo : "" //硫붾え(鍮꾧퀬) @@ -44,7 +45,7 @@ var content = { id : parameter.id, - code : $rootScope.preventXss($scope.vm.form.name), + code : $rootScope.preventXss($scope.vm.form.code), name : $rootScope.preventXss($scope.vm.form.name), manager : $rootScope.preventXss($scope.vm.form.manager), tel : $rootScope.preventXss($scope.vm.form.tel), diff --git a/src/main/webapp/scripts/app/issue/issueAdd.controller.js b/src/main/webapp/scripts/app/issue/issueAdd.controller.js index 18cb24a..5da56d6 100644 --- a/src/main/webapp/scripts/app/issue/issueAdd.controller.js +++ b/src/main/webapp/scripts/app/issue/issueAdd.controller.js @@ -388,6 +388,9 @@ // �뾽泥댁젙蹂� 寃곌낵 媛� Event 泥섎━(set) $scope.$on("companyFieldEvent", function (event, result) { + var ispFieldVos = result[0].ispFieldVos[0]; + var hostingFieldVos = result[0].hostingFieldVos[0]; + $scope.vm.companyId = result[0].id; $scope.vm.companyName = result[0].name; $scope.vm.companyManager = result[0].manager; @@ -396,6 +399,21 @@ $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.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; }); // ISP�젙蹂� 寃곌낵 媛� Event 泥섎━(set) diff --git a/src/main/webapp/scripts/app/issue/issueList.controller.js b/src/main/webapp/scripts/app/issue/issueList.controller.js index 006dc38..c596f5d 100644 --- a/src/main/webapp/scripts/app/issue/issueList.controller.js +++ b/src/main/webapp/scripts/app/issue/issueList.controller.js @@ -689,6 +689,7 @@ function removes() { var removeIds = []; var removePermission = true; + var downIssueIds = false; angular.forEach($scope.vm.responseData.data, function (data) { if (data.checked && data.modifyPermissionCheck) { @@ -697,6 +698,10 @@ if (data.checked && !data.modifyPermissionCheck) { removePermission = false; + } + + if (data.downIssueAllCount > 0){ + downIssueIds = true; } }); @@ -719,25 +724,23 @@ return; } - // �궘�젣 �븣由� - SweetAlert.swal({ - title : $filter("translate")("issue.deleteIssue"), // �씠�뒋 �궘�젣 - text : $filter("translate")("issue.wantToDeleteSelectIssue"), // �꽑�깮�븳 �씠�뒋�쓣 �궘�젣�븯寃좎뒿�땲源�? �궘�젣�맂 �씠�뒋�� 蹂듦뎄�븷 �닔 �뾾�뒿�땲�떎. + if (downIssueIds) { + SweetAlert.swal({ + title : $filter("translate")("common.deleteIssue"), // �씠�뒋 �궘�젣 + text : $filter("translate")("issue.wantToDeleteSelectDownIssue"), // �븯�쐞 �씠�뒋媛� 議댁옱 �빀�땲�떎. �꽑�깮�븳 �씠�뒋�� �븯�쐞 �씠�뒋 紐⑤몢 �궘�젣�븯寃좎뒿�땲源�? �궘�젣�맂 �씠�뒋�뒗 蹂듦뎄�븷 �닔 �뾾�뒿�땲�떎. type : "warning", showCancelButton : true, confirmButtonColor : "#DD6B55", confirmButtonText : $filter("translate")("common.delete"), // �궘�젣 cancelButtonText : $filter("translate")("common.cancel"), // 痍⑥냼 closeOnConfirm : false, - closeOnCancel : true + closeOnCancel : false }, function (isConfirm) { - SweetAlert.close(); - - if (isConfirm) { + if (isConfirm) { //�씠�뒋 + �븯�쐞 �궘�젣 $rootScope.spinner = true; - Issue.remove($resourceProvider.getContent( + Issue.removeAllIssues($resourceProvider.getContent( { removeIds : removeIds }, $resourceProvider.getPageContent(0, 0))).then(function (result) { @@ -745,9 +748,7 @@ $timeout(function () { SweetAlert.success($filter("translate")("common.deleteSucceeded"), result.data.message.message); // �궘�젣 �꽦怨� }, 100); - $scope.fn.listView(); - $scope.fn.getPageList(0); } else { @@ -755,11 +756,96 @@ SweetAlert.error($filter("translate")("common.deleteFailed"), result.data.message.message); // �궘�젣 �떎�뙣 }, 100); } - $rootScope.spinner = false; }); + + } else {// �꽑�깮 �븳 �씠�뒋留� �궘�젣 + // �궘�젣 �븣由� + SweetAlert.swal({ + title : $filter("translate")("issue.deleteIssue"), // �씠�뒋 �궘�젣 + text : $filter("translate")("issue.wantToDeleteOnlySelectIssue"), // �꽑�깮�븳 �씠�뒋留� �궘�젣�븯寃좎뒿�땲源�? �궘�젣�맂 �씠�뒋�� 蹂듦뎄�븷 �닔 �뾾�뒿�땲�떎. + type : "warning", + showCancelButton : true, + confirmButtonColor : "#DD6B55", + confirmButtonText : $filter("translate")("common.delete"), // �궘�젣 + cancelButtonText : $filter("translate")("common.cancel"), // 痍⑥냼 + closeOnConfirm : false, + closeOnCancel : true + }, + function (isConfirm) { + SweetAlert.close(); + + if (isConfirm) { + $rootScope.spinner = true; + + Issue.remove($resourceProvider.getContent( + { removeIds : removeIds }, + $resourceProvider.getPageContent(0, 0))).then(function (result) { + + if (result.data.message.status === "success") { + $timeout(function () { + SweetAlert.success($filter("translate")("common.deleteSucceeded"), result.data.message.message); // �궘�젣 �꽦怨� + }, 100); + + $scope.fn.listView(); + + $scope.fn.getPageList(0); + } + else { + $timeout(function () { + SweetAlert.error($filter("translate")("common.deleteFailed"), result.data.message.message); // �궘�젣 �떎�뙣 + }, 100); + } + + $rootScope.spinner = false; + }); + } + }); } }); + } else { + // �궘�젣 �븣由� + SweetAlert.swal({ + title : $filter("translate")("issue.deleteIssue"), // �씠�뒋 �궘�젣 + text : $filter("translate")("issue.wantToDeleteSelectIssue"), // �꽑�깮�븳 �씠�뒋�쓣 �궘�젣�븯寃좎뒿�땲源�? �궘�젣�맂 �씠�뒋�� 蹂듦뎄�븷 �닔 �뾾�뒿�땲�떎. + type : "warning", + showCancelButton : true, + confirmButtonColor : "#DD6B55", + confirmButtonText : $filter("translate")("common.delete"), // �궘�젣 + cancelButtonText : $filter("translate")("common.cancel"), // 痍⑥냼 + closeOnConfirm : false, + closeOnCancel : true + }, + function (isConfirm) { + SweetAlert.close(); + + if (isConfirm) { + $rootScope.spinner = true; + + Issue.remove($resourceProvider.getContent( + { removeIds : removeIds }, + $resourceProvider.getPageContent(0, 0))).then(function (result) { + + if (result.data.message.status === "success") { + $timeout(function () { + SweetAlert.success($filter("translate")("common.deleteSucceeded"), result.data.message.message); // �궘�젣 �꽦怨� + }, 100); + + $scope.fn.listView(); + + $scope.fn.getPageList(0); + } + else { + $timeout(function () { + SweetAlert.error($filter("translate")("common.deleteFailed"), result.data.message.message); // �궘�젣 �떎�뙣 + }, 100); + } + + $rootScope.spinner = false; + }); + } + }); + } } // �씠�뒋 紐⑸줉 �뀒�씠釉� �꽕�젙 diff --git a/src/main/webapp/scripts/components/issue/issue.service.js b/src/main/webapp/scripts/components/issue/issue.service.js index d606b2b..e4c3f90 100644 --- a/src/main/webapp/scripts/components/issue/issue.service.js +++ b/src/main/webapp/scripts/components/issue/issue.service.js @@ -92,6 +92,18 @@ return response; }); }, + removeAllIssues : function (conditions) { + return $http.post("issue/removeAll", conditions).then(function (response) { + $log.debug("�븯�쐞�씠�뒋 �궘�젣 寃곌낵 : ", response); + return response; + }); + }, + /*removeDownIssues : function (conditions) { + return $http.post("issue/removeDown", conditions).then(function (response) { + $log.debug("�븯�쐞�씠�뒋 �궘�젣 寃곌낵 : ", response); + return response; + }); + },*/ importExcel : function (conditions) { conditions.url = "issue/importExcel"; return $upload.upload(conditions).then(function (response) { diff --git a/src/main/webapp/scripts/main.js b/src/main/webapp/scripts/main.js index ef59c0d..0973abc 100644 --- a/src/main/webapp/scripts/main.js +++ b/src/main/webapp/scripts/main.js @@ -4,7 +4,7 @@ 'use strict'; require.config({ - urlArgs : "bust=v1.0.0", + urlArgs : "bust=v0.9.0", paths : { 'jquery' : '../bower_components/jquery/dist/jquery', 'jquery-ui' : '../bower_components/jquery-ui/jquery-ui', diff --git a/src/main/webapp/views/api/apiSettingOverlap.html b/src/main/webapp/views/api/apiSettingOverlap.html index 6d83e51..ecfe175 100644 --- a/src/main/webapp/views/api/apiSettingOverlap.html +++ b/src/main/webapp/views/api/apiSettingOverlap.html @@ -62,7 +62,7 @@ class="form-control input-sm issue-select-label" ng-style="{ 'color' : fn.getOptionColor(vm.completeIssueStatuses, vm.completeIssueStatusId) }" ng-model="vm.completeIssueStatusId" - ng-change="fn.onChangeIssueTypeSpec()" + ng-change="fn.onChangeIssueTypeOverlap()" required> <option ng-repeat="issueStatus in vm.completeIssueStatuses" ng-style="{ 'color' : issueStatus.color, 'font-weight': 600 }" diff --git a/src/main/webapp/views/ispField/ispFieldModify.html b/src/main/webapp/views/ispField/ispFieldModify.html index b4cd4bc..0598f3d 100644 --- a/src/main/webapp/views/ispField/ispFieldModify.html +++ b/src/main/webapp/views/ispField/ispFieldModify.html @@ -12,7 +12,7 @@ <form role="form" name="hostingFieldModifyForm"> <div class="form-group"> <label for="hostingFieldModifyForm1"> - <span translate="hostingField.name">ISP紐�</span> + <span translate="ispField.name">ISP紐�</span> <code class="highlighter-rouge">*</code> </label> <input id="hostingFieldModifyForm1" diff --git a/src/main/webapp/views/issue/issueAdd.html b/src/main/webapp/views/issue/issueAdd.html index e55ca04..57e7322 100644 --- a/src/main/webapp/views/issue/issueAdd.html +++ b/src/main/webapp/views/issue/issueAdd.html @@ -487,6 +487,17 @@ <div class="col-lg-4"> <div class="form-group mb10"> <label class="issue-label"> <span translate="ispField.name">ISP �씠由�</span> </label> + <!--<input ng-click="show==false" + ng-show="show" + ng-hide="!show" + name="ispName" + type="text" + class="form-control" + kr-input + autocomplete="off" + ng-model="vm.ispName" + ng-maxlength="100" + maxlength="100">--> <js-autocomplete-single data-input-name="ispField" selected-model="vm.form.issueIspFields" search="vm.ispName" @@ -609,6 +620,7 @@ <label class="issue-label"> <span translate="hostingField.name">�샇�뒪�똿 �씠由�</span> </label> <js-autocomplete-single data-input-name="hostingField" selected-model="vm.form.issueHostingFields" + ng-model="vm.hostingName" search="vm.hostingName" source="fn.getIssueHostingFieldList(vm.hostingName, vm.form.issueHostingFields, vm.autoCompletePage.hostingField.page, fn.getIssueHostingFieldListCallBack)" page="vm.autoCompletePage.hostingField.page" -- Gitblit v1.8.0