src/main/java/kr/wisestone/owl/domain/IssueType.java
@@ -22,6 +22,7 @@ private String description; private String color; private Long usePartner; private Boolean inheritPartners; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "workspace_id") @@ -144,4 +145,12 @@ public void setIssueTypeApiEndStatuses(Set<IssueTypeApiEndStatus> issueTypeApiEndStatuses) { this.issueTypeApiEndStatuses = issueTypeApiEndStatuses; } public Boolean getInheritPartners() { return inheritPartners; } public void setInheritPartners(Boolean inheritPartners) { this.inheritPartners = inheritPartners; } } src/main/java/kr/wisestone/owl/service/impl/IssueServiceImpl.java
@@ -47,9 +47,7 @@ import javax.servlet.http.HttpServletRequest; import java.io.IOException; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.*; import java.util.regex.Pattern; import static kr.wisestone.owl.domain.enumType.CustomFieldType.*; @@ -1276,6 +1274,9 @@ private void setMapToIssueVo(List<Map<String, Object>> results, List<IssueVo> issueVos, IssueCondition issueCondition, User user) { for (Map<String, Object> result : results) { IssueVo issueVo = ConvertUtil.convertMapToClass(result, IssueVo.class); if (MapUtil.getString(result, "inheritPartners") != null && MapUtil.getString(result, "inheritPartners").equals("1")) { issueVo.setInheritPartners(true); } issueVos.add(issueVo); issueCondition.addIssueIds(String.valueOf(issueVo.getId())); } @@ -2126,6 +2127,15 @@ this.issueIspService.modifyIssueIspField(issue, issueForm, detectIssueChange); // HOSTING 정보 저장 this.issueHostingService.modifyIssueHostingField(issue, issueForm, detectIssueChange); // 파트너정보 하위이슈 상속 List<Issue> downIssues = this.issueRepository.findByParentIssueId(issue.getId()); if (issueForm.getInheritYn() != null && issueForm.getInheritYn() && downIssues != null && downIssues.size() > 0) { for (Issue downIssue : downIssues) { this.inheritPartners(downIssue, issue); } } // 이슈 이력 등록 if (!StringUtils.isEmpty(detectIssueChange.toString())) { @@ -3167,6 +3177,11 @@ issue = this.issueRepository.saveAndFlush(issue); if (issueForm.getInheritYn() != null && issueForm.getInheritYn() && issue.getParentIssue() != null) { // 상위이슈의 파트너 정보 상속 this.inheritPartners(issue, issue.getParentIssue()); } saveIssueForm.setId(issue.getId()); IssueDepartment issueDepartment = new IssueDepartment(); @@ -4153,11 +4168,71 @@ this.issueHistoryService.detectDownIssues(IssueHistoryType.DELETE, issue, sb); issue.setParentIssue(null); } if (issueDownForm.getInheritYn() != null && issueDownForm.getInheritYn() && issue.getParentIssue() != null) { // 상위이슈의 파트너 정보 상속받기 issue = this.inheritPartners(issue, parentIssue); } this.issueHistoryService.addIssueHistory(parentIssue, IssueHistoryType.MODIFY, sb.toString()); //parentIssue = myIssue(기록은 현재 상세페이지에 해야하니까) this.issueRepository.saveAndFlush(issue); } } /** * 상위이슈의 파트너 정보 상속받기 * @param issue Issue * @param parentIssue Issue * @return Issue */ private Issue inheritPartners(Issue issue, Issue parentIssue) { if (parentIssue != null) { if (parentIssue.getIssueType().getInheritPartners()) { IssueCompany issueCompany = new IssueCompany(); IssueIsp issueIsp = new IssueIsp(); IssueHosting issueHosting = new IssueHosting(); if (parentIssue.getIssueCompanies() != null && parentIssue.getIssueCompanies().size() > 0) { issue.getIssueCompanies().clear(); issue.getIssueCompanies().addAll(parentIssue.getIssueCompanies()); Iterator<IssueCompany> itrCompany = issue.getIssueCompanies().iterator(); ConvertUtil.copyProperties(itrCompany.next(), issueCompany, "id"); issueCompany.setIssue(issue); issueCompany.setCompanyField(parentIssue.getIssueCompanies().iterator().next().getCompanyField()); this.issueCompanyRepository.saveAndFlush(issueCompany); } else { this.issueCompanyRepository.deleteByIssueId(issue.getId()); this.issueCompanyRepository.flush(); } if (parentIssue.getIssueIspFields() != null && parentIssue.getIssueIspFields().size() > 0) { issue.getIssueIspFields().clear(); issue.getIssueIspFields().addAll(parentIssue.getIssueIspFields()); Iterator<IssueIsp> itrIsp = issue.getIssueIspFields().iterator(); ConvertUtil.copyProperties(itrIsp.next(), issueIsp, "id"); issueIsp.setIssue(issue); issueIsp.setIspField(parentIssue.getIssueIspFields().iterator().next().getIspField()); this.issueIspRepository.saveAndFlush(issueIsp); } else { this.issueIspRepository.deleteByIssueId(issue.getId()); this.issueIspRepository.flush(); } if (parentIssue.getIssueHostingFields() != null && parentIssue.getIssueHostingFields().size() > 0) { issue.getIssueHostingFields().clear(); issue.getIssueHostingFields().addAll(parentIssue.getIssueHostingFields()); Iterator<IssueHosting> itrHosting = issue.getIssueHostingFields().iterator(); ConvertUtil.copyProperties(itrHosting.next(), issueHosting, "id"); issueHosting.setIssue(issue); issueHosting.setHostingField(parentIssue.getIssueHostingFields().iterator().next().getHostingField()); this.issueHostingRepository.saveAndFlush(issueHosting); } else { this.issueHostingRepository.deleteByIssueId(issue.getId()); this.issueHostingRepository.flush(); } } } return issue; } @Override public void findPartner(Map<String, Object> resJsonData, Map<String, Object> params) { Long issueTypeId = MapUtil.getLong(params, "issueTypeId"); src/main/java/kr/wisestone/owl/service/impl/IssueTypeServiceImpl.java
@@ -155,6 +155,8 @@ issueType.setUsePartner(issueTypeForm.getUsePartner()); issueType.setInheritPartners(issueTypeForm.getInheritPartners()); return this.issueTypeRepository.saveAndFlush(issueType); } @@ -435,6 +437,8 @@ issueType.setUsePartner(issueTypeForm.getUsePartner()); issueType.setInheritPartners(issueTypeForm.getInheritPartners()); /*if(issueTypeForm.getCompanyId() != null){ CompanyField companyField = this.companyFieldService.getCompany(issueTypeForm.getCompanyId()); issueType.setCompanyField(companyField); src/main/java/kr/wisestone/owl/vo/IssueTypeVo.java
@@ -22,6 +22,8 @@ private Boolean modifyPermissionCheck = Boolean.TRUE; // 이슈 유형은 모든 사람들이 수정, 삭제할 수 있어서 기본 값이 True private Boolean inheritPartners; public IssueTypeVo(){} public Long getId() { @@ -103,4 +105,12 @@ public void setUsePartners(Integer usePartners) { this.usePartners = usePartners; } public Boolean getInheritPartners() { return inheritPartners; } public void setInheritPartners(Boolean inheritPartners) { this.inheritPartners = inheritPartners; } } src/main/java/kr/wisestone/owl/vo/IssueVo.java
@@ -83,6 +83,8 @@ private int downTotalPage = 1; private Long downTotalCount = 0L; private Boolean inheritPartners; // 파트너정보 상속유무 체크 public IssueVo(){} public Long getId() { @@ -650,4 +652,12 @@ public void setDownPageNumber(int downPageNumber) { this.downPageNumber = downPageNumber; } public Boolean getInheritPartners() { return inheritPartners; } public void setInheritPartners(Boolean inheritPartners) { this.inheritPartners = inheritPartners; } } src/main/java/kr/wisestone/owl/web/form/IssueForm.java
@@ -75,6 +75,8 @@ private String isApi = Issue.IS_API_NO; private List<String> downIssuesStatus = Lists.newArrayList(); //하위이슈 상태 private Boolean inheritYn; public IssueForm() { } @@ -241,6 +243,10 @@ } if (MapUtil.getString(params, "hostingMemo") != null) { form.setHostingMemo(MapUtil.getString(params, "hostingMemo")); } if (MapUtil.getBoolean(params, "inheritYn") != null) { form.setInheritYn(MapUtil.getBoolean(params, "inheritYn")); } return form; @@ -719,4 +725,12 @@ public void setStatusName(String statusName) { this.statusName = statusName; } public Boolean getInheritYn() { return inheritYn; } public void setInheritYn(Boolean inheritYn) { this.inheritYn = inheritYn; } } src/main/java/kr/wisestone/owl/web/form/IssueTypeForm.java
@@ -20,6 +20,7 @@ private Long projectId; private List<Long> removeIds = Lists.newArrayList(); private Long usePartner; private Boolean inheritPartners; public IssueTypeForm(){} @@ -41,6 +42,14 @@ } else { form.usePartner += id * 2; } } } if (MapUtil.getString(params, "inheritPartners") != null) { if (MapUtil.getString(params, "inheritPartners").equals("true")) { form.setInheritPartners(true); } else { form.setInheritPartners(false); } } @@ -114,4 +123,12 @@ public void setUsePartner(Long usePartner) { this.usePartner = usePartner; } public Boolean getInheritPartners() { return inheritPartners; } public void setInheritPartners(Boolean inheritPartners) { this.inheritPartners = inheritPartners; } } src/main/resources/migration/V1_6__alter_data.sql
New file @@ -0,0 +1,3 @@ /* issue_type 파트너 상속 true/false */ ALTER TABLE `issue_type` ADD COLUMN `inherit_partners` varchar(10) NOT NULL DEFAULT "false"; src/main/resources/mybatis/query-template/issue-template.xml
@@ -22,6 +22,7 @@ project.project_key as projectKey, issue_type.id as issueTypeId, issue_type.name as issueTypeName, issue_type.inherit_partners as inheritPartners, issue_status.id as issueStatusId, issue_status.issue_status_type as issueStatusType, issue_status.name as issueStatusName, src/main/resources/mybatis/query-template/issueType-template.xml
@@ -10,7 +10,8 @@ it.description as description, it.color as color, it.project_id as projectId, it.use_partner AS usePartners it.use_partner AS usePartners, it.inherit_partners as inheritPartners FROM issue_type it INNER JOIN workspace ws on it.workspace_id = ws.id src/main/webapp/assets/styles/main.css
@@ -7769,6 +7769,10 @@ margin-left: 3rem !important; } .ml--12 { margin-left: -12px !important; } .p-0 { padding: 0 !important; } src/main/webapp/i18n/ko/global.json
@@ -263,6 +263,7 @@ "notAllowedAttachment": "첨부가 허용되지 않는 파일입니다.", "nameErrorAttachment": "첨부 파일명 오류", "succeededIssueRegistration": "이슈 등록 성공", "succeededDownIssueRegistration": "하위 이슈 등록 성공", "failedIssueRegistration": "이슈 등록 실패", "failedIssueModify": "이슈 수정 실패", "failedToProjectDetails": "프로젝트 상세 정보 조회 실패", @@ -362,11 +363,14 @@ "downIssueTitle": "하위 이슈 제목", "downIssueType": "하위 이슈 구분", "addDownIssue": "하위 이슈 추가", "modifyDownIssue": "하위 이슈 변경", "downIssueRemove" : "하위 이슈 삭제", "failedToIssueAddIssueDown": "하위 이슈 추가 실패", "failedToIssueDeleteIssueDown": "하위 이슈 삭제 실패", "errorSelectDownIssue" : "하위 이슈가 선택되지 않았습니다.", "failedToIssueTypeDefault": "이슈 유형 기본값 조회 실패" "failedToIssueTypeDefault": "이슈 유형 기본값 조회 실패", "inheritPartners": "업체/ISP/호스팅 정보 상속 여부", "wantToInheritPartnersOfParentIssue": "상위이슈의 파트너 정보(업체/ISP/호스팅)를 적용시키겠습니까?" }, "project": { "createProject": "프로젝트 만들기", @@ -678,6 +682,8 @@ "failedToReceiveEnquiry": "문의 접수 실패" }, "common": { "ok" : "네", "no" : "아니오", "allIssueList" : "전체 이슈", "urgent": "긴급", "high": "높음", src/main/webapp/scripts/app/issue/issueAddDown.controller.js
@@ -861,39 +861,53 @@ }); } // 연관 이슈 추가 // 하위 이슈 추가 function addDownIssue(downId) { /*if ($scope.vm.issueName.length == 0 || $scope.vm.form.issues.length == 0 || $scope.vm.issueName != $scope.vm.form.issues[0].title) { SweetAlert.error($filter("translate")("issue.errorSelectRelationIssue"), ""); return; }*/ var ids = []; if (downId != null) { ids.push(downId); } let inheritYn = false; var contents = { //relationIssueType : $scope.vm.form.relationIssueTypeId, // issueId : $rootScope.currentDetailIssueId, issueId : parameter.id, ids : ids, parentIssueId : parameter.id }; Issue.modifyParentIssue($resourceProvider.getContent( contents, $resourceProvider.getPageContent(0, 10))).then(function (result) { if (result.data.message.status === "success") { // 이슈 상세 화면 요청 $rootScope.$broadcast("getIssueDetail", { id : parameter.id }); SweetAlert.swal({ title : $filter("translate")("issue.addDownIssue"), // 하위 이슈 추가 text : $filter("translate")("issue.wantToInheritPartnersOfParentIssue"), // 상위이슈의 파트너 정보(업체/ISP/호스팅)를 적용시키겠습니까? type : "warning", showCancelButton : true, confirmButtonColor : "#DD6B55", confirmButtonText : $filter("translate")("common.ok"), // 네 cancelButtonText : $filter("translate")("common.no"), // 아니오 closeOnConfirm : false, closeOnCancel : false }, function (isConfirm) { if (isConfirm) { inheritYn = true; } else { SweetAlert.error($filter("translate")("issue.failedToIssueAddIssueDown"), result.data.message.message); // "연관일감 생성 실패" if (downId != null) { ids.push(downId); } var contents = { issueId : parameter.id, ids : ids, parentIssueId : parameter.id, inheritYn : inheritYn }; Issue.modifyParentIssue($resourceProvider.getContent( contents, $resourceProvider.getPageContent(0, 10))).then(function (result) { if (result.data.message.status === "success") { SweetAlert.close(); // 이슈 상세 화면 요청 $rootScope.$broadcast("getIssueDetail", { id : parameter.id }); } else { SweetAlert.error($filter("translate")("issue.failedToIssueAddIssueDown"), result.data.message.message); // "하위이슈 생성 실패" } }); }); } src/main/webapp/scripts/app/issue/issueDetail.controller.js
@@ -123,6 +123,9 @@ }, }; $scope.vm.inheritPartners = ""; $scope.vm.downTotalCount = ""; $scope.vm.relResponseData = []; $scope.vm.relTableConfigs = []; // 테이블 이벤트 @@ -810,28 +813,50 @@ return; } var ids = []; if ($scope.vm.form.issuesDown[0].id != null) { ids.push($scope.vm.form.issuesDown[0].id); let inheritYn = false; if ($scope.vm.inheritPartners) { SweetAlert.swal({ title : $filter("translate")("issue.addDownIssue"), // 하위 이슈 추가 text : $filter("translate")("issue.wantToInheritPartnersOfParentIssue"), // 상위이슈의 파트너 정보(업체/ISP/호스팅)를 적용시키겠습니까? type : "warning", showCancelButton : true, confirmButtonColor : "#DD6B55", confirmButtonText : $filter("translate")("common.ok"), // 네 cancelButtonText : $filter("translate")("common.no"), // 아니오 closeOnConfirm : false, closeOnCancel : false }, function (isConfirm) { if (isConfirm) { inheritYn = true; } var ids = []; if ($scope.vm.form.issuesDown[0].id != null) { ids.push($scope.vm.form.issuesDown[0].id); } var contents = { issueId : $rootScope.currentDetailIssueId, ids : ids, parentIssueId : $rootScope.currentDetailIssueId, inheritYn : inheritYn }; Issue.modifyParentIssue($resourceProvider.getContent( contents, $resourceProvider.getPageContent(0, 10))).then(function (result) { if (result.data.message.status === "success") { SweetAlert.close(); $scope.fn.getIssueDetail(0,0); } else { SweetAlert.error($filter("translate")("issue.failedToIssueAddIssueDown"), result.data.message.message); // "하위이슈 생성 실패" } }); }); } var contents = { issueId : $rootScope.currentDetailIssueId, ids : ids, parentIssueId : $rootScope.currentDetailIssueId }; Issue.modifyParentIssue($resourceProvider.getContent( contents, $resourceProvider.getPageContent(0, 10))).then(function (result) { if (result.data.message.status === "success") { $scope.fn.getIssueDetail(0,0); } else { SweetAlert.error($filter("translate")("issue.failedToIssueAddIssueDown"), result.data.message.message); // "연관일감 생성 실패" } }); } // 이슈명을 클릭하면 이슈 상세 정보를 조회한다. @@ -1176,6 +1201,9 @@ if ($rootScope.workProject.id > -1 && result.data.data.projectVo !== null) { $rootScope.changeLastProject(result.data.data.projectVo.id); } $scope.vm.inheritPartners = result.data.data.issueTypeVo.inheritPartners; $scope.vm.downTotalCount = result.data.data.downTotalCount; } } else { src/main/webapp/scripts/app/issue/issueImportExcel.controller.js
@@ -122,40 +122,65 @@ function formSubmit() { $rootScope.spinner = true; Issue.importExcel({ method : "POST", file : $scope.vm.form.file, // data 속성으로 별도의 데이터 전송 fields : { content : { projectId : $scope.vm.form.projects[0].id, issueTypeId : $scope.vm.form.issueTypeId, parentIssueId : (function () { let id = -1; if ($rootScope.isDefined($scope.vm.form.issues)) { if ($rootScope.isDefined($scope.vm.form.issues[0])) { id = $scope.vm.form.issues[0].id; } let inheritYn = false; // 하위이슈 등록 & 파트너 정보 상속 일 경우 알림 창 if ($rootScope.isDefined($scope.vm.form.issues) && $rootScope.isDefined($scope.vm.form.issues[0])) { if ($scope.vm.form.issues[0].inheritPartners != null && $scope.vm.form.issues[0].inheritPartners === true) { SweetAlert.swal({ title : $filter("translate")("issue.addDownIssue"), // 하위 이슈 추가 text : $filter("translate")("issue.wantToInheritPartnersOfParentIssue"), // 상위이슈의 파트너 정보(업체/ISP/호스팅)를 적용시키겠습니까? type : "warning", showCancelButton : true, confirmButtonColor : "#DD6B55", confirmButtonText : $filter("translate")("common.ok"), // 네 cancelButtonText : $filter("translate")("common.no"), // 아니오 closeOnConfirm : false, closeOnCancel : false }, function (isConfirm) { if (isConfirm) { inheritYn = true; } return id; })() } }, fileFormDataName : "file" }).then(function (result) { if (result.data.message.status === "success") { $timeout(function () { SweetAlert.success($filter("translate")("issue.succeededIssueRegistration"), result.data.message.message); // 이슈 등록 성공 $scope.fn.cancel(); $rootScope.$broadcast("getIssueList"); $rootScope.spinner = false; }, 1000); } else { SweetAlert.error($filter("translate")("issue.failedIssueRegistration"), result.data.message.message); // 이슈 등록 실패 $rootScope.spinner = false; } }); Issue.importExcel({ method : "POST", file : $scope.vm.form.file, // data 속성으로 별도의 데이터 전송 fields : { content : { projectId : $scope.vm.form.projects[0].id, issueTypeId : $scope.vm.form.issueTypeId, parentIssueId : (function () { let id = -1; if ($rootScope.isDefined($scope.vm.form.issues)) { if ($rootScope.isDefined($scope.vm.form.issues[0])) { id = $scope.vm.form.issues[0].id; } } return id; })(), inheritYn : inheritYn } }, fileFormDataName : "file", }).then(function (result) { if (result.data.message.status === "success") { $timeout(function () { SweetAlert.success($filter("translate")("issue.succeededIssueRegistration"), result.data.message.message); // 이슈 등록 성공 $scope.fn.cancel(); $rootScope.$broadcast("getIssueList"); $rootScope.spinner = false; }, 1000); } else { SweetAlert.error($filter("translate")("issue.failedIssueRegistration"), result.data.message.message); // 이슈 등록 실패 $rootScope.spinner = false; } }); }); } } } function cancel() { src/main/webapp/scripts/app/issue/issueList.controller.js
@@ -848,7 +848,7 @@ } // 이슈 수정 팝업 호출 function modify(id) { function modify(id, downTotalCount) { $uibModal.open({ templateUrl : 'views/issue/issueModify.html', size : "lg", @@ -858,7 +858,9 @@ parameter : function () { return { id : id, issueTypeId : $scope.vm.viewer.issueTypeVo.id issueTypeId : $scope.vm.viewer.issueTypeVo.id, inheritPartners : $scope.vm.viewer.issueTypeVo.inheritPartners, downTotalCount : downTotalCount }; } } src/main/webapp/scripts/app/issue/issueModify.controller.js
@@ -169,6 +169,8 @@ priorities : [], // 우선순위 정보 severities : [], // 중요도 정보 fileTableConfigs : [], // 파일 업로드 정보 테이블 inheritPartners : parameter.inheritPartners, downTotalCount : parameter.downTotalCount }; // 연관 일감 관련 @@ -576,305 +578,326 @@ function formSubmit() { $rootScope.spinner = true; var content = { id : parameter.id, title : $rootScope.preventXss($scope.vm.form.title), // 제목 description : $rootScope.preventXss($scope.vm.form.description), // 내용 companyName : $scope.vm.companyName, companyManager : $scope.vm.companyManager, companyTel : $scope.vm.companyTel, companyEmail :$scope.vm.companyEmail, companyUrl : $scope.vm.companyUrl, companyMemo : $scope.vm.companyMemo, companyTypeId : (function () { var companyTypeId = null; if ($scope.vm.form.companyTypes != null && $scope.vm.form.companyTypes.length > 0) { companyTypeId = $scope.vm.form.companyTypes[0].id; } else { companyTypeId = $scope.vm.form.companyTypeId; } return companyTypeId; })(), parentSectorId : (function () { var parentSectorId = null; if ($scope.vm.form.parentSectors != null && $scope.vm.form.parentSectors.length > 0) { parentSectorId = $scope.vm.form.parentSectors[0].id; } else { parentSectorId = $scope.vm.form.parentSectorId; } return parentSectorId; })(), childSectorId : (function () { var childSectorId = null; if ($scope.vm.form.childSectors != null && $scope.vm.form.childSectors.length > 0) { childSectorId = $scope.vm.form.childSectors[0].id; } else { childSectorId = $scope.vm.form.childSectorId; } return childSectorId; })(), regionId : (function () { var regionId = null; if ($scope.vm.form.regions != null && $scope.vm.form.regions.length > 0) { regionId = $scope.vm.form.regions[0].id; } else { regionId = $scope.vm.form.regionId; } return regionId; })(), statusId : (function () { var statusId = null; if ($scope.vm.form.statuses != null && $scope.vm.form.statuses.length > 0) { statusId = $scope.vm.form.statuses[0].id; } else { statusId = $scope.vm.form.statusId; } return statusId; })(), statusName : $scope.vm.form.status, ispName : $scope.vm.ispName, ispCode : $scope.vm.ispCode, ispManager : $scope.vm.ispManager, ispTel : $scope.vm.ispTel, ispEmail : $scope.vm.ispEmail, ispUrl : $scope.vm.ispUrl, ispMemo : $scope.vm.ispMemo, hostingName : $scope.vm.hostingName, hostingCode : $scope.vm.hostingCode, hostingManager : $scope.vm.hostingManager, hostingTel : $scope.vm.hostingTel, hostingEmail : $scope.vm.hostingEmail, hostingUrl : $scope.vm.hostingUrl, hostingMemo : $scope.vm.hostingMemo, projectId : (function () { // 프로젝트 아이디 var projectId = ""; if ($scope.vm.form.projects.length > 0) { projectId = $scope.vm.form.projects[0].id; } return projectId; })(), issueTypeId : $scope.vm.form.issueTypeId, // 이슈 유형 아이디 priorityId : $scope.vm.form.priorityId, // 우선순위 아이디 severityId : $scope.vm.form.severityId, // 중요도 아이디 issueStatusId : $scope.vm.form.issueStatusId, // 이슈 상태 아이디 companyId : (function () { var companyId = null; if ($scope.vm.form.issueCompanyFields != null && $scope.vm.form.issueCompanyFields.length > 0) { companyId = $scope.vm.form.issueCompanyFields[0].id; } return companyId; }), ispId : (function () { var ispId = null; if ($scope.vm.form.issueIspFields != null && $scope.vm.form.issueIspFields.length > 0) { ispId = $scope.vm.form.issueIspFields[0].id; } return ispId; }), hostingId : (function () { var hostingId = null; if ($scope.vm.form.issueHostingFields != null && $scope.vm.form.issueHostingFields.length > 0) { hostingId = $scope.vm.form.issueHostingFields[0].id; } return hostingId; }), userIds : (function () { var userIds = []; angular.forEach($scope.vm.form.users, function (user) { userIds.push(user.id); }); return userIds; })(), departmentIds : (function () { var departmentIds = []; angular.forEach($scope.vm.form.departments, function (department) { departmentIds.push(department.id); }); return departmentIds; })(), attachedFileIds : (function () { var attachedFileIds = []; angular.forEach($scope.vm.form.attachedFiles, function (attachedFile) { if ($scope.vm.form.description.indexOf(attachedFile.path) !== -1) { attachedFileIds.push(attachedFile.id); } }); return attachedFileIds; })(), issueCompanyFields : (function () { var issueCompanyFields = []; if ($scope.vm.form.issueCompanyFields != null && $scope.vm.form.issueCompanyFields.length > 0 ){ var companyField = $scope.vm.form.issueCompanyFields[0]; //사용자가 직접 업체 추가 할 경우 if ($rootScope.isDefined(companyField) && companyField.name !== $scope.vm.companyName) { return issueCompanyFields; let inheritYn = false; if ($scope.vm.inheritPartners && $scope.vm.downTotalCount > 0) { SweetAlert.swal({ title : $filter("translate")("issue.modifyDownIssue"), // 하위 이슈 변경 text : $filter("translate")("issue.wantToInheritPartnersOfParentIssue"), // 상위이슈의 파트너 정보(업체/ISP/호스팅)를 적용시키겠습니까? type : "warning", showCancelButton : true, confirmButtonColor : "#DD6B55", confirmButtonText : $filter("translate")("common.ok"), // 네 cancelButtonText : $filter("translate")("common.no"), // 아니오 closeOnConfirm : false, closeOnCancel : false }, function (isConfirm) { if (isConfirm) { inheritYn = true; } issueCompanyFields.push({ id : companyField.id, companyId : $scope.vm.companyId, name : $scope.vm.companyName, manager : $scope.vm.companyManager, tel : $scope.vm.companyTel, email :$scope.vm.companyEmail, url :$scope.vm.companyUrl, memo : $scope.vm.companyMemo, companyTypeId : $scope.vm.form.companyTypeId, parentSectorId : $scope.vm.form.parentSectorId, childSectorId : $scope.vm.form.childSectorId, regionId : $scope.vm.form.regionId, statusId : $scope.vm.form.statusId, statusName : $scope.vm.form.status var content = { id : parameter.id, title : $rootScope.preventXss($scope.vm.form.title), // 제목 description : $rootScope.preventXss($scope.vm.form.description), // 내용 inheritYn : inheritYn, companyName : $scope.vm.companyName, companyManager : $scope.vm.companyManager, companyTel : $scope.vm.companyTel, companyEmail :$scope.vm.companyEmail, companyUrl : $scope.vm.companyUrl, companyMemo : $scope.vm.companyMemo, companyTypeId : (function () { var companyTypeId = null; if ($scope.vm.form.companyTypes != null && $scope.vm.form.companyTypes.length > 0) { companyTypeId = $scope.vm.form.companyTypes[0].id; } else { companyTypeId = $scope.vm.form.companyTypeId; } return companyTypeId; })(), parentSectorId : (function () { var parentSectorId = null; if ($scope.vm.form.parentSectors != null && $scope.vm.form.parentSectors.length > 0) { parentSectorId = $scope.vm.form.parentSectors[0].id; } else { parentSectorId = $scope.vm.form.parentSectorId; } return parentSectorId; })(), childSectorId : (function () { var childSectorId = null; if ($scope.vm.form.childSectors != null && $scope.vm.form.childSectors.length > 0) { childSectorId = $scope.vm.form.childSectors[0].id; } else { childSectorId = $scope.vm.form.childSectorId; } return childSectorId; })(), regionId : (function () { var regionId = null; if ($scope.vm.form.regions != null && $scope.vm.form.regions.length > 0) { regionId = $scope.vm.form.regions[0].id; } else { regionId = $scope.vm.form.regionId; } return regionId; })(), statusId : (function () { var statusId = null; if ($scope.vm.form.statuses != null && $scope.vm.form.statuses.length > 0) { statusId = $scope.vm.form.statuses[0].id; } else { statusId = $scope.vm.form.statusId; } return statusId; })(), statusName : $scope.vm.form.status, ispName : $scope.vm.ispName, ispCode : $scope.vm.ispCode, ispManager : $scope.vm.ispManager, ispTel : $scope.vm.ispTel, ispEmail : $scope.vm.ispEmail, ispUrl : $scope.vm.ispUrl, ispMemo : $scope.vm.ispMemo, hostingName : $scope.vm.hostingName, hostingCode : $scope.vm.hostingCode, hostingManager : $scope.vm.hostingManager, hostingTel : $scope.vm.hostingTel, hostingEmail : $scope.vm.hostingEmail, hostingUrl : $scope.vm.hostingUrl, hostingMemo : $scope.vm.hostingMemo, projectId : (function () { // 프로젝트 아이디 var projectId = ""; if ($scope.vm.form.projects.length > 0) { projectId = $scope.vm.form.projects[0].id; } return projectId; })(), issueTypeId : $scope.vm.form.issueTypeId, // 이슈 유형 아이디 priorityId : $scope.vm.form.priorityId, // 우선순위 아이디 severityId : $scope.vm.form.severityId, // 중요도 아이디 issueStatusId : $scope.vm.form.issueStatusId, // 이슈 상태 아이디 companyId : (function () { var companyId = null; if ($scope.vm.form.issueCompanyFields != null && $scope.vm.form.issueCompanyFields.length > 0) { companyId = $scope.vm.form.issueCompanyFields[0].id; } return companyId; }), ispId : (function () { var ispId = null; if ($scope.vm.form.issueIspFields != null && $scope.vm.form.issueIspFields.length > 0) { ispId = $scope.vm.form.issueIspFields[0].id; } return ispId; }), hostingId : (function () { var hostingId = null; if ($scope.vm.form.issueHostingFields != null && $scope.vm.form.issueHostingFields.length > 0) { hostingId = $scope.vm.form.issueHostingFields[0].id; } return hostingId; }), userIds : (function () { var userIds = []; angular.forEach($scope.vm.form.users, function (user) { userIds.push(user.id); }); return userIds; })(), departmentIds : (function () { var departmentIds = []; angular.forEach($scope.vm.form.departments, function (department) { departmentIds.push(department.id); }); return departmentIds; })(), attachedFileIds : (function () { var attachedFileIds = []; angular.forEach($scope.vm.form.attachedFiles, function (attachedFile) { if ($scope.vm.form.description.indexOf(attachedFile.path) !== -1) { attachedFileIds.push(attachedFile.id); } }); return attachedFileIds; })(), issueCompanyFields : (function () { var issueCompanyFields = []; if ($scope.vm.form.issueCompanyFields != null && $scope.vm.form.issueCompanyFields.length > 0 ){ var companyField = $scope.vm.form.issueCompanyFields[0]; //사용자가 직접 업체 추가 할 경우 if ($rootScope.isDefined(companyField) && companyField.name !== $scope.vm.companyName) { return issueCompanyFields; } issueCompanyFields.push({ id : companyField.id, companyId : $scope.vm.companyId, name : $scope.vm.companyName, manager : $scope.vm.companyManager, tel : $scope.vm.companyTel, email :$scope.vm.companyEmail, url :$scope.vm.companyUrl, memo : $scope.vm.companyMemo, companyTypeId : $scope.vm.form.companyTypeId, parentSectorId : $scope.vm.form.parentSectorId, childSectorId : $scope.vm.form.childSectorId, regionId : $scope.vm.form.regionId, statusId : $scope.vm.form.statusId, statusName : $scope.vm.form.status }); } return issueCompanyFields; })(), issueIspFields : (function () { var issueIspFields = []; if ($scope.vm.form.issueCompanyFields != null && $scope.vm.form.issueCompanyFields.length > 0 && $scope.vm.form.issueCompanyFields[0].ispFieldVo != null || $scope.vm.form.issueIspFields != null && $scope.vm.form.issueIspFields.length > 0 ){ var ispField = $scope.vm.form.issueIspFields[0]; //사용자가 직접 ISP 추가 할 경우 if ($rootScope.isDefined(ispField) && ispField.name !== $scope.vm.ispName) { return issueIspFields; } issueIspFields.push({ ispId : $scope.vm.ispId, code : $scope.vm.ispCode, name : $scope.vm.ispName, manager : $scope.vm.ispManager, tel : $scope.vm.ispTel, email :$scope.vm.ispEmail, url :$scope.vm.ispUrl, memo : $scope.vm.ispMemo }); } return issueIspFields; })(), issueHostingFields : (function () { var issueHostingFields = []; if ($scope.vm.form.issueCompanyFields != null && $scope.vm.form.issueCompanyFields.length > 0 && $scope.vm.form.issueCompanyFields[0].hostingFieldVo != null || $scope.vm.form.issueHostingFields != null && $scope.vm.form.issueHostingFields.length > 0 ){ var hostingField = $scope.vm.form.issueHostingFields[0]; //사용자가 직접 호스팅 추가 할 경우 if ($rootScope.isDefined(hostingField) && hostingField.name !== $scope.vm.hostingName) { return issueHostingFields; } issueHostingFields.push({ hostingId : $scope.vm.hostingId, name : $scope.vm.hostingName, code : $scope.vm.hostingCode, manager : $scope.vm.hostingManager, tel : $scope.vm.hostingTel, email :$scope.vm.hostingEmail, url :$scope.vm.hostingUrl, memo : $scope.vm.hostingMemo }); } return issueHostingFields; })(), removeFiles : $scope.vm.form.removeFiles, startCompleteDateRange : $scope.vm.form.startCompleteDateRange, issueCustomFields : (function () { // 이슈에서 사용되는 사용자 정의 필드 var issueCustomFields = []; angular.forEach($scope.vm.form.issueCustomFields, function (issueCustomField) { var useValues = []; if (angular.isArray(issueCustomField.useValues)) { angular.forEach(issueCustomField.useValues, function (useValue) { useValues.push(useValue.value); }); } else { useValues.push(issueCustomField.useValues); } // useValues 를 배열로 변환한다. var temp = angular.copy(issueCustomField); temp.useValues = useValues; issueCustomFields.push(temp); }); return issueCustomFields; })() }; Issue.modify({ method : "POST", file : (function () { var files = []; angular.forEach($scope.vm.form.files, function (file) { if (angular.isUndefined(file.id)) { files.push(file); } }); return files; })(), // data 속성으로 별도의 데이터 전송 fields : { content : content }, fileFormDataName : "file" }).then(function (result) { if (result.data.message.status === "success") { $scope.fn.cancel(); // 이슈 상세 화면 요청 $rootScope.$broadcast("getIssueDetail", { id : parameter.id }); $rootScope.$broadcast("getIssueList"); } else { SweetAlert.error($filter("translate")("issue.failedIssueModify"), result.data.message.message); // 이슈 수정 실패 } $rootScope.spinner = false; }); } return issueCompanyFields; })(), issueIspFields : (function () { var issueIspFields = []; if ($scope.vm.form.issueCompanyFields != null && $scope.vm.form.issueCompanyFields.length > 0 && $scope.vm.form.issueCompanyFields[0].ispFieldVo != null || $scope.vm.form.issueIspFields != null && $scope.vm.form.issueIspFields.length > 0 ){ var ispField = $scope.vm.form.issueIspFields[0]; //사용자가 직접 ISP 추가 할 경우 if ($rootScope.isDefined(ispField) && ispField.name !== $scope.vm.ispName) { return issueIspFields; } issueIspFields.push({ ispId : $scope.vm.ispId, code : $scope.vm.ispCode, name : $scope.vm.ispName, manager : $scope.vm.ispManager, tel : $scope.vm.ispTel, email :$scope.vm.ispEmail, url :$scope.vm.ispUrl, memo : $scope.vm.ispMemo }); } return issueIspFields; })(), issueHostingFields : (function () { var issueHostingFields = []; if ($scope.vm.form.issueCompanyFields != null && $scope.vm.form.issueCompanyFields.length > 0 && $scope.vm.form.issueCompanyFields[0].hostingFieldVo != null || $scope.vm.form.issueHostingFields != null && $scope.vm.form.issueHostingFields.length > 0 ){ var hostingField = $scope.vm.form.issueHostingFields[0]; //사용자가 직접 호스팅 추가 할 경우 if ($rootScope.isDefined(hostingField) && hostingField.name !== $scope.vm.hostingName) { return issueHostingFields; } issueHostingFields.push({ hostingId : $scope.vm.hostingId, name : $scope.vm.hostingName, code : $scope.vm.hostingCode, manager : $scope.vm.hostingManager, tel : $scope.vm.hostingTel, email :$scope.vm.hostingEmail, url :$scope.vm.hostingUrl, memo : $scope.vm.hostingMemo }); } return issueHostingFields; })(), removeFiles : $scope.vm.form.removeFiles, startCompleteDateRange : $scope.vm.form.startCompleteDateRange, issueCustomFields : (function () { // 이슈에서 사용되는 사용자 정의 필드 var issueCustomFields = []; angular.forEach($scope.vm.form.issueCustomFields, function (issueCustomField) { var useValues = []; if (angular.isArray(issueCustomField.useValues)) { angular.forEach(issueCustomField.useValues, function (useValue) { useValues.push(useValue.value); }); } else { useValues.push(issueCustomField.useValues); } // useValues 를 배열로 변환한다. var temp = angular.copy(issueCustomField); temp.useValues = useValues; issueCustomFields.push(temp); }); return issueCustomFields; })() }; Issue.modify({ method : "POST", file : (function () { var files = []; angular.forEach($scope.vm.form.files, function (file) { if (angular.isUndefined(file.id)) { files.push(file); } }); return files; })(), // data 속성으로 별도의 데이터 전송 fields : { content : content }, fileFormDataName : "file" }).then(function (result) { if (result.data.message.status === "success") { $scope.fn.cancel(); // 이슈 상세 화면 요청 $rootScope.$broadcast("getIssueDetail", { id : parameter.id }); $rootScope.$broadcast("getIssueList"); } else { SweetAlert.error($filter("translate")("issue.failedIssueModify"), result.data.message.message); // 이슈 수정 실패 } $rootScope.spinner = false; }); } } function cancel() { src/main/webapp/scripts/app/issueType/issueTypeAdd.controller.js
@@ -27,7 +27,8 @@ projects : [], // 프로젝트 description : "", // 설명 color : "#febd35", // 색상 companies : [] // 업체/isp/호스팅 선택 배열 companies : [], // 업체/isp/호스팅 선택 배열 inheritPartners : true // 파트너 상속 유무 }, companyName : "", projectName : "", @@ -161,7 +162,14 @@ name : $rootScope.preventXss($scope.vm.form.name), description : $rootScope.preventXss($scope.vm.form.description), color : $scope.vm.form.color color : $scope.vm.form.color, inheritPartners : (function () { let inheritPartners = false; if ($scope.vm.form.inheritPartners) { inheritPartners = true; } return inheritPartners; })() }; IssueType.add($resourceProvider.getContent( src/main/webapp/scripts/app/issueType/issueTypeModify.controller.js
@@ -33,7 +33,8 @@ projects : [], // 프로젝트 description : "", // 설명 color : "", // 색상 companies : [] // 업체/isp/호스팅 선택 배열 companies : [], // 업체/isp/호스팅 선택 배열 inheritPartners : "" // 파트너 상속 유무 }, companyName : "", workflowName : "", @@ -152,7 +153,14 @@ })(), name : $rootScope.preventXss($scope.vm.form.name), description : $rootScope.preventXss($scope.vm.form.description), color : $scope.vm.form.color color : $scope.vm.form.color, inheritPartners : (function () { let inheritPartners = false; if ($scope.vm.form.inheritPartners) { inheritPartners = true; } return inheritPartners; })() }; IssueType.modify($resourceProvider.getContent( @@ -212,8 +220,8 @@ $scope.vm.projectName = result.data.data.projectVo.name; } $scope.vm.form.companies = result.data.data.usePartnerVos; $scope.vm.form.color = result.data.data.color; $scope.vm.form.inheritPartners = result.data.data.inheritPartners; } } else { src/main/webapp/views/issue/issueDetail.html
@@ -107,7 +107,7 @@ <i class="os-icon os-icon-airplay mr-20" ng-click="fn.versionView(vm.viewer.id)" data-toggle="tooltip" data-placement="right" title="이슈 변경 이력 상세 보기"></i> <!-- <i class="os-icon os-icon-calendar-time mr-20" ng-if="vm.viewer.modifyPermissionCheck"--> <!-- ng-click="fn.reservation(vm.viewer.id)" data-toggle="tooltip" data-placement="right" title="이슈 발생 예약 하기"></i>--> <i class="os-icon os-icon-edit-1 mr-20" ng-click="fn.modify(vm.viewer.id)" <i class="os-icon os-icon-edit-1 mr-20" ng-click="fn.modify(vm.viewer.id, vm.viewer.downTotalCount)" ng-if="vm.viewer.modifyPermissionCheck" data-toggle="tooltip" data-placement="left" title="이슈 수정 하기"></i> <!-- 상위 이슈가 있을때 뒤로가기 버튼 생성 --> <span ng-if="vm.issueIds[0] != vm.viewer.id && vm.issueIds.length != 0 && vm.issueIds.length != 1" class="issue-close mr-10" ng-click="fn.issueBack()"><i class="os-icon os-icon-arrow-left7" data-toggle="tooltip" data-placement="left" title="이슈 뒤로 이동"></i></span> src/main/webapp/views/issueType/issueTypeAdd.html
@@ -71,12 +71,21 @@ <div class="select3-selection__choicediv mt-10"> <span class="select3-selection__choice" ng-repeat="company in vm.form.companies"> <span>{{company.byName}}</span> <!--사용자가 속해 있는 부서 이름 출력--> <span>{{company.byName}}</span> <span class="select3-selection__choice__remove" ng-click="fn.removeUsePartner($index)">×</span> </span> </div> </div> <div> <span class="issue-label mb-0" translate="issue.inheritPartners">파트너 정보 상속</span> </div> <div class="form-group mt-5 ml--12"> <label class='switch ml-3' style=""><input type='checkbox' ng-model='vm.form.inheritPartners'> <span class='slider round'></span> </label> </div> <div class="form-group"> <label for="issueTypeAddForm2"><span translate="common.color">색상</span> <code class="highlighter-rouge">*</code></label> <div class="input-group"> src/main/webapp/views/issueType/issueTypeModify.html
@@ -76,14 +76,20 @@ <div class="select3-selection__choicediv mt-10"> <span class="select3-selection__choice" ng-repeat="company in vm.form.companies"> <span>{{company.byName}}</span> <!--사용자가 속해 있는 부서 이름 출력--> <span>{{company.byName}}</span> <span class="select3-selection__choice__remove" ng-click="fn.removeUsePartner($index)">×</span> </span> </div> </div> <div> <span class="issue-label mb-0" translate="issue.inheritPartners">파트너 정보 상속</span> </div> <div class="form-group mt-5 ml--12"> <label class='switch ml-3' style=""><input type='checkbox' ng-model='vm.form.inheritPartners'> <span class='slider round'></span> </label> </div> <div class="form-group"> <label for="issueTypeModifyForm2"><span translate="common.color">색상</span> <code class="highlighter-rouge">*</code></label>