Merge branch 'master' of http://192.168.0.25:9001/r/owl-kisa
| | |
| | | |
| | | List<IssueStatus> findByWorkspaceId(Long workspaceId); |
| | | |
| | | List<IssueStatusVo> findByIssueTypeId(Long issueTypeId); |
| | | |
| | | IssueStatus addIssueStatus(IssueStatusForm issueStatusForm); |
| | | |
| | | List<IssueStatusVo> findIssueStatus(Map<String, Object> resJsonData, |
| | |
| | | import kr.wisestone.owl.web.form.IssueStatusForm; |
| | | import kr.wisestone.owl.web.view.ExcelView; |
| | | import org.apache.commons.lang3.StringUtils; |
| | | import org.hibernate.jdbc.Work; |
| | | import org.slf4j.Logger; |
| | | import org.slf4j.LoggerFactory; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | |
| | | |
| | | @Autowired |
| | | private IssueStatusRepository issueStatusRepository; |
| | | |
| | | @Autowired |
| | | private WorkflowService workflowService; |
| | | |
| | | @Autowired |
| | | private WorkspaceService workspaceService; |
| | |
| | | return this.issueStatusRepository.findByWorkspaceId(workspaceId); |
| | | } |
| | | |
| | | |
| | | @Override |
| | | @Transactional(readOnly = true) |
| | | public List<IssueStatusVo> findByIssueTypeId(Long issueTypeId) { |
| | | IssueType issueType = this.issueTypeService.getIssueType(issueTypeId); |
| | | Workflow workflow = issueType.getWorkflow(); |
| | | return findByWorkflowId(workflow.getId()); |
| | | } |
| | | |
| | | // 이슈 상태를 생성한다. |
| | | @Override |
| | | @Transactional |
| | |
| | | |
| | | import kr.wisestone.owl.constant.Constants; |
| | | import kr.wisestone.owl.service.IssueStatusService; |
| | | import kr.wisestone.owl.vo.IssueStatusVo; |
| | | import kr.wisestone.owl.web.condition.IssueStatusCondition; |
| | | import kr.wisestone.owl.web.form.IssueStatusForm; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | |
| | | |
| | | import javax.servlet.http.HttpServletRequest; |
| | | import java.util.HashMap; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | |
| | | /** |
| | |
| | | return this.setSuccessMessage(resJsonData); |
| | | } |
| | | |
| | | // 이슈 유형에서 사용가능한 이슈상태 조회 |
| | | @RequestMapping(value = "/issueStatus/findIssueStatusesByWorkflow", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) |
| | | public |
| | | @ResponseBody |
| | | Map<String, Object> findIssueStatusesByWorkflow(@RequestBody Map<String, Map<String, Object>> params) { |
| | | Map<String, Object> resJsonData = new HashMap<>(); |
| | | |
| | | IssueStatusCondition issueStatusCondition = IssueStatusCondition.make(params.get(Constants.REQ_KEY_CONTENT)); |
| | | List<IssueStatusVo> issueStatusVoList = this.issueStatusService.findByIssueTypeId(issueStatusCondition.getIssueTypeId()); |
| | | resJsonData.put(Constants.RES_KEY_CONTENTS, issueStatusVoList); |
| | | |
| | | return this.setSuccessMessage(resJsonData); |
| | | } |
| | | |
| | | // 이슈 상태 전체 조회 |
| | | @RequestMapping(value = "/issueStatus/findAll", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) |
| | | public |
| | |
| | | form.setOptions(MapUtil.getStrings(params, "options")); |
| | | } |
| | | |
| | | if (MapUtil.getBoolean(params, "requiredData")) { |
| | | if (MapUtil.getBoolean(params, "requiredData") != null && MapUtil.getBoolean(params, "requiredData")) { |
| | | form.setRequiredData("Y"); |
| | | }else { |
| | | form.setRequiredData("N"); |
| | |
| | | "departmentCount": "부서인원", |
| | | "departmentUser": "부서 팀원", |
| | | "detectingInfo": "탐지정보", |
| | | "notExistDetectingInfo": "사용 가능한 탐지 정보가 없습니다.", |
| | | "detectingData": "탐지일시", |
| | | "import": "가져오기", |
| | | "diffuserURL": "유포자URL", |
| | |
| | | "auth" : "API 인증", |
| | | "setting" : "API 설정", |
| | | "monitor" : "API 모니터링", |
| | | "spec" : "API 문서", |
| | | "application" : "어플리케이션 이름", |
| | | "token" : "토큰", |
| | | "apiKey": "API 토큰 등록", |
| | |
| | | "failedToApiTokenFind" : "API 토큰 조회 실패", |
| | | "failedToApiTokenRemove" : "API 토큰 삭제 실패", |
| | | "failedToApiTokenAdd" : "API 토큰 생성 실패", |
| | | "useIssueStatus" : "사용 가능한 이슈 상태", |
| | | "successToApiTokenRemove" : "API 토큰 삭제 성공", |
| | | "successToApiTokenAdd" : "API 토큰 생성 성공", |
| | | "successToApiIssueDefault" : "기본값 설정 완료", |
| | | "failedToApiIssueDefault" : "기본값 설정 실패", |
| | | "successToApiIssueOverlap" : "중복값 설정 완료", |
| | | "failedToApiIssueOverlap" : "중복값 설정 실패", |
| | | "failedToApiMonitor": "API 기록 조회 실패" |
| | | "failedToApiMonitor": "API 기록 조회 실패", |
| | | "requestSample": "API 요청 샘플", |
| | | "requestSampleAdd": "이슈 추가", |
| | | "requestSampleModify": "이슈 수정" |
| | | }, |
| | | "companyField" : { |
| | | "info": "업체정보", |
| | |
| | | 'app', 'angular' |
| | | ], |
| | | function (app, angular) { |
| | | app.controller('apiSettingController', ['$scope', '$rootScope', '$log', '$resourceProvider','$uibModal', 'SweetAlert', '$timeout', '$filter', '$injector', '$controller', 'Api', 'Priority', 'Severity', 'IssueType', 'IssueTypeCustomField', |
| | | function ($scope, $rootScope, $log, $resourceProvider, $uibModal, SweetAlert, $timeout, $filter, $injector, $controller, Api, Priority, Severity, IssueType, IssueTypeCustomField) { |
| | | app.controller('apiSettingController', ['$scope', '$rootScope', '$log', '$resourceProvider','$uibModal', 'SweetAlert', |
| | | '$timeout', '$filter', '$injector', '$controller', 'Api', 'Priority', 'Severity', 'IssueType', 'IssueTypeCustomField', |
| | | 'IssueStatus', |
| | | function ($scope, $rootScope, $log, $resourceProvider, $uibModal, SweetAlert, |
| | | $timeout, $filter, $injector, $controller, Api, Priority, Severity, IssueType, IssueTypeCustomField, |
| | | IssueStatus) { |
| | | |
| | | $scope.fn = { |
| | | changeTab : changeTab, |
| | |
| | | getOverlapList : getOverlapList, |
| | | onChangeIssueTypeOverlap : onChangeIssueTypeOverlap, |
| | | getIssueTypeCustomFields : getIssueTypeCustomFields, |
| | | getCurrentIssueTypeVo : getCurrentIssueTypeVo |
| | | getCurrentIssueTypeVo : getCurrentIssueTypeVo, |
| | | loadSpec : loadSpec, |
| | | getIssueStatuses : getIssueStatuses, |
| | | onChangeIssueTypeSpec : onChangeIssueTypeSpec, |
| | | createRequestModifyJson : createRequestModifyJson, |
| | | createRequestAddJson : createRequestAddJson, |
| | | createCustomFields : createCustomFields, |
| | | getProjectList : getProjectList |
| | | }; |
| | | |
| | | $scope.vm = { |
| | | tab : "API_COL_SETTING", |
| | | issueTypes : [], |
| | | issueStatuses : [], |
| | | severities : [], |
| | | priorities : [], |
| | | projects : [], |
| | | sampleJsonAdd : "", |
| | | sampleJsonModify : "", |
| | | // projects : [], |
| | | form : { |
| | | issueCustomFields : [], |
| | |
| | | }, |
| | | issueTypeId : "", |
| | | issueTypeName : "", |
| | | customFieldName : "", |
| | | }; |
| | | |
| | | angular.extend(this, $controller('autoCompleteController', {$scope : $scope, $injector : $injector})); |
| | | issueStatusId : "", |
| | | issueStatusName : "", |
| | | |
| | | customFieldName : "", |
| | | |
| | | projectId : "", |
| | | projectName : "", |
| | | }; |
| | | |
| | | function initForm() { |
| | | $scope.vm.form.issueApiDefault.title = ""; |
| | |
| | | $scope.vm.issueTypes = result.data.data; |
| | | if ($scope.vm.issueTypes != null && $scope.vm.issueTypes.length > 0) { |
| | | $scope.vm.issueTypeId = $scope.vm.issueTypes[0].id.toString(); |
| | | $scope.fn.onChangeIssueType(); |
| | | if ($scope.vm.tab === "API_COL_SETTING") { |
| | | $scope.fn.onChangeIssueType(); |
| | | } else if ($scope.vm.tab === "API_SPEC_SETTING") { |
| | | $scope.fn.onChangeIssueTypeSpec(); |
| | | } |
| | | } |
| | | } |
| | | else { |
| | |
| | | $scope.vm.form.issueCustomFields = []; |
| | | |
| | | var issueTypeVo = $scope.fn.getCurrentIssueTypeVo(); |
| | | if (issueTypeVo.projectVo == null) return; |
| | | |
| | | if (issueTypeVo == null) return; |
| | | |
| | | IssueTypeCustomField.find($resourceProvider.getContent({ |
| | | projectId : issueTypeVo.projectVo.id, |
| | | projectId : $scope.vm.projectId, |
| | | IssueTypeId : issueTypeVo.id }, |
| | | $resourceProvider.getPageContent(0, 1000))).then(function (result) { |
| | | |
| | | $scope.vm.form.issueCustomFields = []; |
| | | if (result.data.message.status === "success") { |
| | | |
| | | $scope.vm.form.issueCustomFields = []; |
| | | angular.forEach(result.data.data, function (issueTypeCustomField) { |
| | | $scope.vm.form.issueCustomFields.push(issueTypeCustomField); |
| | | }); |
| | | |
| | | $scope.$broadcast("getIssueTypeListComplete", $scope.vm.form.issueCustomFields); |
| | | } |
| | | else { |
| | | |
| | | SweetAlert.swal($filter("translate")("issue.failedToUserDefinedFieldListAssociatedLookup"), result.data.message.message, "error"); // 이슈 유형에 연결된 사용자 정의 필드 목록 조회 실패 |
| | | } |
| | | |
| | |
| | | $scope.fn.getOverlapList(); |
| | | }); |
| | | |
| | | $rootScope.$on("changeSpecSettingTab", function (event, args){ |
| | | $scope.fn.loadSpec(); |
| | | }); |
| | | |
| | | $scope.$on("getIssueTypeListComplete", function (event, args) { |
| | | if ($scope.vm.tab === "API_SPEC_SETTING") { |
| | | $scope.fn.createRequestAddJson(); |
| | | $scope.fn.createRequestModifyJson(); |
| | | } |
| | | }); |
| | | |
| | | function changeTab(tab) { |
| | | $scope.vm.tab = tab; |
| | |
| | | $rootScope.$broadcast("changeColumnSettingTab"); |
| | | } else if (tab === "API_OVERLAP_SETTING") { |
| | | $rootScope.$broadcast("changeOverlapSettingTab"); |
| | | } else if (tab === "API_SPEC_SETTING") { |
| | | $rootScope.$broadcast("changeSpecSettingTab"); |
| | | } |
| | | } |
| | | |
| | | function getIssueStatuses() { |
| | | var condition = { |
| | | issueTypeId : $scope.vm.issueTypeId |
| | | } |
| | | IssueStatus.findIssueStatusesByIssueType($resourceProvider.getContent(condition, |
| | | $resourceProvider.getPageContent(0, 1000))).then(function (result) { |
| | | |
| | | if (result.data.message.status === "success") { |
| | | $scope.vm.issueStatuses = result.data.data; |
| | | if ($scope.vm.issueStatuses != null && $scope.vm.issueStatuses.length > 0) { |
| | | $scope.vm.issueStatusId = $scope.vm.issueStatuses[0].id.toString(); |
| | | } |
| | | } |
| | | else { |
| | | SweetAlert.swal($filter("translate")("issue.failedToCriticalListLookup"), result.data.message.message, "error"); // 중요도 목록 조회 실패 |
| | | } |
| | | }); |
| | | } |
| | | |
| | | function onChangeIssueTypeSpec() { |
| | | $scope.fn.getIssueTypeCustomFields(); |
| | | } |
| | | |
| | | // 요청 데이터 만들기( 추가) |
| | | function createRequestAddJson() { |
| | | var customFields = $scope.fn.createCustomFields(); |
| | | |
| | | var jsonData = { |
| | | token: "||발급받은 토큰}||", |
| | | title: "||이슈 제목||", |
| | | issueTypeId: $scope.vm.issueTypeId, |
| | | apiType: "add", |
| | | customFields : customFields |
| | | }; |
| | | |
| | | $scope.vm.sampleJsonAdd = JSON.stringify(jsonData,undefined, 4); |
| | | } |
| | | |
| | | function createCustomFields() { |
| | | var customFields = []; |
| | | $scope.vm.form.issueCustomFields.forEach(function (issueCustomField){ |
| | | customFields.push({ |
| | | customFieldId: issueCustomField.customFieldVo.id, |
| | | useValue: "||입력값||" |
| | | }) |
| | | }); |
| | | return customFields; |
| | | } |
| | | |
| | | // 요청 데이터 만들기(수정) |
| | | function createRequestModifyJson() { |
| | | var customFields = $scope.fn.createCustomFields(); |
| | | |
| | | var jsonData = { |
| | | token: "||발급받은 토큰||", |
| | | title: "||이슈 제목||", |
| | | issueTypeId: $scope.vm.issueTypeId, |
| | | apiType: "modify", |
| | | issueStatusId: $scope.vm.issueStatusId, |
| | | customFields : customFields |
| | | }; |
| | | |
| | | $scope.vm.sampleJsonModify = JSON.stringify(jsonData, undefined, 2); |
| | | } |
| | | |
| | | function getProjectList() { |
| | | if ($rootScope.projects != null) { |
| | | $scope.vm.projects = []; |
| | | $rootScope.projects.forEach(function (project){ |
| | | if (project.id > -1) { |
| | | $scope.vm.projects.push(project); |
| | | } |
| | | }); |
| | | $scope.vm.projectId = $scope.vm.projects[0].id.toString(); |
| | | } |
| | | } |
| | | |
| | | |
| | | function loadSpec() { |
| | | $scope.fn.getIssueStatuses(); |
| | | $scope.fn.getIssueTypeCustomFields(); |
| | | } |
| | | |
| | | function start() { |
| | | $scope.fn.initForm(); |
| | | $scope.fn.getProjectList(); |
| | | $scope.fn.getSeverities(); |
| | | $scope.fn.getPriorities(); |
| | | $scope.fn.getIssueTypes(); |
| | | |
| | | } |
| | | $scope.fn.start(); |
| | | |
| | |
| | | email : "", |
| | | site : "", |
| | | tel : "", |
| | | requiredData : "" |
| | | requiredData : false |
| | | } |
| | | }; |
| | | |
| | |
| | | content.ipAdress = $scope.vm.form.ipAdress; |
| | | content.email = $scope.vm.form.email; |
| | | content.site = $scope.vm.form.site; |
| | | content.tel =$scope.vm.form.tel; |
| | | content.tel = $scope.vm.form.tel; |
| | | content.requiredData = $scope.vm.form.requiredData; |
| | | |
| | | if ($scope.vm.form.customFieldType === 'MULTI_SELECT'|| $scope.vm.form.customFieldType === "SINGLE_SELECT") { |
| | | var convertDefaultValues = ""; |
| | |
| | | $scope.vm.form.customFieldType = result.data.data.customFieldType; |
| | | $scope.vm.form.defaultValue = result.data.data.defaultValue; |
| | | $scope.vm.form.useCustomFieldValue = result.data.data.useCustomFieldValue; |
| | | $scope.vm.form.requiredData = result.data.data.requiredData; |
| | | |
| | | if(result.data.data.requiredData === "Y"){ |
| | | $scope.vm.form.requiredData = true; |
| | | } else { |
| | | $scope.vm.form.requiredData = false; |
| | | } |
| | | |
| | | angular.forEach(result.data.data.customFieldValueVos, function (customFieldValueVo) { |
| | | $scope.vm.form.options.push(customFieldValueVo.value); |
| | |
| | | attachedFiles : [], // 섬머노트로 파일 업로드를 할 경우 서버에서 pk를 따고 issue id와 연동 작업이 필요하다. |
| | | startCompleteDateRange : "", // 시작일 ~ 종료일 |
| | | detectingDateRange : "", // 탐지일 |
| | | issueCustomFields : [], // 이슈에서 사용되는 사용자 정의 필드 |
| | | requiredDatas : [] // 사용자 정의 필드 필수 데이터 체크 |
| | | issueCustomFields : [] // 이슈에서 사용되는 사용자 정의 필드 |
| | | }, |
| | | infiniteAdd : false, // 연속 생성 |
| | | projectName : "", // 프로젝트 명 검색 |
| | |
| | | startCompleteDateRange : $scope.vm.form.startCompleteDateRange, |
| | | detectingDateRange : $scope.vm.form.detectingDateRange, |
| | | |
| | | requiredDatas : (function () { // 사용자 정의 필드 필수 데이터 체크 |
| | | var requiredDatas = []; |
| | | |
| | | angular.forEach($scope.vm.form.requiredDatas, 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; |
| | | })(), |
| | | |
| | | issueCustomFields : (function () { // 이슈에서 사용되는 사용자 정의 필드 |
| | | var issueCustomFields = []; |
| | | |
| | |
| | | // 이슈 유형에 연결된 사용자 정의 필드 |
| | | function getIssueTypeCustomFields() { |
| | | $scope.vm.form.issueCustomFields = []; |
| | | $scope.vm.form.requiredDatas = []; |
| | | // 이슈 타입 아이디나 프로젝트 아이디가 없으면 통신을 하지 않는다. |
| | | if (!$rootScope.isDefined($scope.vm.form.issueTypeId) || $scope.vm.form.projects.length < 1) { |
| | | return; |
| | |
| | | if (result.data.message.status === "success") { |
| | | |
| | | $scope.vm.form.issueCustomFields = []; |
| | | $scope.vm.form.requiredDatas = []; |
| | | angular.forEach(result.data.data, function (issueTypeCustomField) { |
| | | switch (issueTypeCustomField.customFieldVo.customFieldType) { |
| | | case "INPUT" : |
| | |
| | | break; |
| | | } |
| | | $scope.vm.form.issueCustomFields.push(issueTypeCustomField); |
| | | if(issueTypeCustomField.customFieldVo.requiredData === "Y") { |
| | | $scope.vm.form.requiredDatas.push(issueTypeCustomField.customFieldVo.requiredData); |
| | | } |
| | | }); |
| | | } |
| | | else { |
| | |
| | | setTableColumn : setTableColumn, // 테이블의 컬럼을 만들어준다. |
| | | add : add, // 이슈 생성 |
| | | modify : modify, // 이슈 수정 |
| | | AddRelation : AddRelation, // 연관 이슈 추가 |
| | | addRelationIssueForm : addRelationIssueForm, // 연관 이슈 추가 |
| | | modifyMultiIssueStatus : modifyMultiIssueStatus, // 이슈 다중 상태 변경 |
| | | removes : removes, // 이슈 삭제 |
| | | addIssueTableConfig : addIssueTableConfig, // 이슈 목록 테이블 설정 |
| | |
| | | }); |
| | | } |
| | | |
| | | function AddRelation(id) { |
| | | function addRelationIssueForm(id) { |
| | | $uibModal.open({ |
| | | templateUrl : 'views/issue/issueAddRelation.html', |
| | | size : "lg", |
| | |
| | | return response; |
| | | }); |
| | | }, |
| | | findIssueStatusesByIssueType : function (conditions) { |
| | | return $http.post("issueStatus/findIssueStatusesByWorkflow", conditions).then(function (response) { |
| | | $log.debug("이슈 유형에서 사용 가능한 이슈 상태 기록 조회 결과 : ", response); |
| | | return response; |
| | | }); |
| | | } |
| | | } |
| | | } |
| | | ]); |
| | |
| | | conditions, $resourceProvider.getPageContent($rootScope.isDefined(page) ? page : 0, $rootScope.isDefined(page) ? 10 : 25))).then(function (result) { |
| | | if (result.data.message.status === "success") { |
| | | const departments = result.data.data; |
| | | var filterDepartments = departments.filter(function(item, idx){ |
| | | return departments.findIndex(function(item2, idx2){ |
| | | return item.departmentName === item2.departmentName |
| | | }) == idx; |
| | | }); |
| | | if(departments != null && departments.length() > 0){ |
| | | var filterDepartments = departments.filter(function(item, idx){ |
| | | return departments.findIndex(function(item2, idx2){ |
| | | return item.departmentName === item2.departmentName |
| | | }) == idx; |
| | | }); |
| | | } |
| | | |
| | | if ($rootScope.isDefined(callBack)) { |
| | | callBack(result); |
| | |
| | | 'apiSettingController' : 'app/api/apiSetting.controller', // api 설정 컨트롤러 |
| | | 'apiMonitorController' : 'app/api/apiMonitor.controller', // api 모니터링 컨트롤러 |
| | | |
| | | |
| | | /* 업체 */ |
| | | 'companyFieldRoute' : 'app/companyField/companyField', // 업체 route 정보 |
| | | 'companyFieldService' : 'components/companyField/companyField.service', // 업체 관련된 통신 담당 |
| | |
| | | 'workflowService', |
| | | 'issueSearchService', |
| | | 'systemEmailService', |
| | | 'issueStatusService', |
| | | 'noticeService', |
| | | 'faqService', |
| | | 'guideService', |
| | |
| | | <div class="os-tabs-controls"> |
| | | <ul class="nav nav-tabs upper"> |
| | | <li class="nav-item"> |
| | | <a class="nav-link cursor" ng-class="{ 'active' : vm.tab == 'API_SPEC_SETTING' }" ng-click="fn.changeTab('API_SPEC_SETTING')" translate="api.spec">부서 관리</a> |
| | | </li> |
| | | <li class="nav-item"> |
| | | <a class="nav-link cursor" ng-class="{ 'active' : vm.tab == 'API_COL_SETTING' }" ng-click="fn.changeTab('API_COL_SETTING')" translate="api.columnSetting">사용자 등급 관리</a> |
| | | </li> |
| | | <li class="nav-item"> |
| | |
| | | </div> |
| | | |
| | | <div class="tab-content mt-30"> |
| | | <div ng-show="vm.tab == 'API_SPEC_SETTING'"> |
| | | <div ng-include include-replace src="'views/api/apiSettingSpec.html'"></div> |
| | | </div> |
| | | <div ng-show="vm.tab == 'API_COL_SETTING'"> |
| | | <div ng-include include-replace src="'views/api/apiSettingColumn.html'"></div> |
| | | </div> |
| | | |
| | | <div ng-show="vm.tab == 'API_OVERLAP_SETTING'"> |
| | | <div ng-include include-replace src="'views/api/apiSettingOverlap.html'"></div> |
| | | </div> |
| | | </div> |
| | | |
| | | |
| | | |
| | | </div> |
| | | </div> |
| | | </div> |
| | |
| | | <div class="row"> |
| | | <div class="col-md-4" ng-if="false"> |
| | | <div class="form-group mb10"> |
| | | <label for="projectForm" class="issue-label"> |
| | | <span translate="common.project">프로젝트</span> |
| | | </label> |
| | | <select id="projectForm" |
| | | name="project" |
| | | class="form-control input-sm issue-select-label" |
| | | ng-model="vm.projectId" |
| | | ng-change="fn.onChangeIssueTypeSpec()" |
| | | required> |
| | | <option ng-repeat="project in vm.projects" |
| | | value="{{project.id}}" |
| | | translate="{{project.name}}(id:{{project.id}})"> |
| | | </option> |
| | | </select> |
| | | </div> |
| | | </div> |
| | | <div class="col-md-4"> |
| | | |
| | | <div class="form-group mb10"> |
| | | <label for="issueTypeForm" class="issue-label"> |
| | | <span translate="issue.issueType">이슈 유형</span> |
| | |
| | | </option> |
| | | </select> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | |
| | | <div class="col-lg-8"> |
| | | <!-- 사용자 정의 필드 --> |
| | | <div class="row"> |
| | | <label for="issue-priority" class="issue-label"> |
| | | <span translate="common.detectingInfo">탐지 정보</span> |
| | | </label> |
| | | </div> |
| | | <div class="row"> |
| | | |
| | | <div class="col-md-4" ng-repeat="issueCustomField in vm.form.issueCustomFields"> |
| | | <label class="issue-detail-label">이름: {{::issueCustomField.customFieldVo.name}}</label> |
| | | <span class="issue-detail-word-break">ID: {{::issueCustomField.customFieldVo.id}}</span> |
| | | </div> |
| | | </div> |
| | | </div> |
| | |
| | | |
| | | |
| | | <div class="row"> |
| | | <div class="col-sm-5"> |
| | | <div class="col-md-4" ng-if="false"> |
| | | <div class="form-group mb10"> |
| | | <label for="projectForm" class="issue-label"> |
| | | <span translate="common.project">프로젝트</span> |
| | | </label> |
| | | <select id="projectForm" |
| | | name="project" |
| | | class="form-control input-sm issue-select-label" |
| | | ng-model="vm.projectId" |
| | | ng-change="fn.onChangeIssueTypeSpec()" |
| | | required> |
| | | <option ng-repeat="project in vm.projects" |
| | | value="{{project.id}}" |
| | | translate="{{project.name}}(id:{{project.id}})"> |
| | | </option> |
| | | </select> |
| | | </div> |
| | | </div> |
| | | <div class="col-sm-4"> |
| | | |
| | | <div class="element-wrapper"> |
| | | <div class="form-group mb10"> |
New file |
| | |
| | | <div class="row"> |
| | | <div class="col-md-4"> |
| | | <div class="form-group mb10"> |
| | | <label for="projectForm" class="issue-label"> |
| | | <span translate="common.project">프로젝트</span> |
| | | </label> |
| | | <select id="projectForm" |
| | | name="project" |
| | | class="form-control input-sm issue-select-label" |
| | | ng-model="vm.projectId" |
| | | ng-change="fn.onChangeIssueTypeSpec()" |
| | | required> |
| | | <option ng-repeat="project in vm.projects" |
| | | value="{{project.id}}" |
| | | translate="{{project.name}}(id:{{project.id}})"> |
| | | </option> |
| | | </select> |
| | | </div> |
| | | </div> |
| | | <div class="col-md-4"> |
| | | <div class="form-group mb10"> |
| | | <label for="issueTypeForm" class="issue-label"> |
| | | <span translate="issue.issueType">이슈 유형</span> |
| | | </label> |
| | | <select id="issueTypeForm" |
| | | name="issueType" |
| | | class="form-control input-sm issue-select-label" |
| | | ng-style="{ 'color' : fn.getOptionColor(vm.issueTypes, vm.issueTypeId) }" |
| | | ng-model="vm.issueTypeId" |
| | | ng-change="fn.onChangeIssueTypeSpec()" |
| | | required> |
| | | <option ng-repeat="issueType in vm.issueTypes" |
| | | ng-style="{ 'color' : issueType.color, 'font-weight': 600 }" |
| | | value="{{issueType.id}}" |
| | | translate="{{issueType.name}}(id:{{issueType.id}})"> |
| | | </option> |
| | | </select> |
| | | </div> |
| | | </div> |
| | | |
| | | </div> |
| | | |
| | | <div class="element-box"> |
| | | <form role="form" name="apiSettingColumnForm"> |
| | | <div class="form-group mb10"> |
| | | <div class="row"> |
| | | <div class="col-lg-8"> |
| | | <div class="row"> |
| | | <!-- 이슈 상태 --> |
| | | <div class="form-group mb10"> |
| | | <label for="issueStatusForm" class="issue-label"> |
| | | <span translate="api.useIssueStatus">이슈 상태</span> |
| | | </label> |
| | | <select id="issueStatusForm" |
| | | name="issueStatus" |
| | | class="form-control input-sm issue-select-label" |
| | | ng-style="{ 'color' : fn.getOptionColor(vm.issueStatuses, vm.issueStatusId) }" |
| | | ng-model="vm.issueStatusId" |
| | | ng-change="fn.onChangeIssueTypeSpec()" |
| | | required> |
| | | <option ng-repeat="issueStatus in vm.issueStatuses" |
| | | ng-style="{ 'color' : issueStatus.color, 'font-weight': 600 }" |
| | | value="{{issueStatus.id}}" |
| | | translate="{{issueStatus.name}}(id:{{issueStatus.id}})"> |
| | | </option> |
| | | </select> |
| | | </div> |
| | | </div> |
| | | <!-- 사용자 정의 필드 --> |
| | | <div class="row"> |
| | | <label for="issue-detectingInfo" class="issue-label"> |
| | | <span translate="common.detectingInfo">탐지 정보</span> |
| | | </label> |
| | | </div> |
| | | <div class="row"> |
| | | |
| | | <div ng-if="vm.form.issueCustomFields == null && vm.form.issueCustomFields.length === 0"> |
| | | <span translate="common.notExistDetectingInfo">사용 가능한 탐지 정보가 없습니다.</span> |
| | | </div> |
| | | <div id="issue-detectingInfo" class="col-md-4" ng-repeat="issueCustomField in vm.form.issueCustomFields"> |
| | | <label class="issue-detail-label">이름: {{::issueCustomField.customFieldVo.name}}</label> |
| | | <span class="issue-detail-word-break">( ID: {{::issueCustomField.customFieldVo.id}} )</span> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </form> |
| | | </div> |
| | | |
| | | <div class="row"> |
| | | <div class="col-md-4"> |
| | | <label for="issue-detectingInfo" class="issue-label"> |
| | | <span translate="api.requestSample">API 요청 데이터 샘플</span> |
| | | </label> |
| | | </div> |
| | | </div> |
| | | |
| | | <div class="element-box"> |
| | | <div class="row"> |
| | | <div class="col-md-1"> |
| | | <label for="issue-detectingInfo" class="issue-label"> |
| | | <span translate="api.requestSampleAdd">이슈 추가</span> |
| | | </label> |
| | | </div> |
| | | <div> |
| | | <pre>{{vm.sampleJsonAdd}}</pre> |
| | | </div> |
| | | <div class="col-md-1"></div> |
| | | <div class="col-md-1"> |
| | | <label for="issue-detectingInfo" class="issue-label"> |
| | | <span translate="api.requestSampleModify">이슈 수정</span> |
| | | </label> |
| | | </div> |
| | | <div> |
| | | <pre>{{vm.sampleJsonModify}}</pre> |
| | | </div> |
| | | </div> |
| | | </div> |
| | |
| | | <div class="form-group"> |
| | | <label for="customFieldAddForm2"><span translate="customField.fieldType">필드 유형</span> <code |
| | | class="highlighter-rouge">*</code></label> |
| | | <label> <input type="checkbox" ng-model="vm.form.requiredData"> 필수 데이터 </label> |
| | | <label for="customFieldAddForm2"> <input type="checkbox" ng-model="vm.form.requiredData"> 필수 데이터 </label> |
| | | <select id="customFieldAddForm2" class="form-control" ng-model="vm.form.customFieldType" |
| | | ng-change="fn.changeFieldType()"> |
| | | <option value="INPUT" translate="common.stringField">문자열 필드</option> |
| | |
| | | <div class="form-group"> |
| | | <label for="customFieldModifyForm2"><span translate="customField.fieldType">필드 유형</span><code |
| | | class="highlighter-rouge">*</code></label> |
| | | <label> <input type="checkbox" ng-model="vm.form.requiredData"> 필수 데이터 </label> |
| | | <select id="customFieldModifyForm2" class="form-control" ng-model="vm.form.customFieldType" |
| | | ng-change="fn.changeCustomFieldType()"> |
| | | <option value="INPUT" translate="common.stringField">문자열 필드</option> |
| | |
| | | |
| | | <div class="col-md-4" ng-repeat="issueCustomField in vm.form.issueCustomFields"> |
| | | <div class="form-group mgb5"> |
| | | <label class="issue-label">{{issueCustomField.customFieldVo.name}}<code ng-if="" class="highlighter-rouge"> *</code></label> |
| | | <label class="issue-label">{{issueCustomField.customFieldVo.name}}</label> |
| | | |
| | | <div ng-switch on="issueCustomField.customFieldVo.customFieldType"> |
| | | <!-- 기본 입력 --> |
| | |
| | | <!-- 멀티 셀렉트 --> |
| | | <div ng-switch-when="MULTI_SELECT"> |
| | | <ng-dropdown-multiselect class="multiSelect cursor" |
| | | name="multiSelect" |
| | | ng-required="issueCustomField.customFieldVo.requiredData == 'Y'" |
| | | data-input-name="" |
| | | modal-form-auto-scroll |
| | | selected-model="issueCustomField.useValues" |
| | | extra-settings="{ 'idProp' : 'value', 'externalIdProp' : 'value', 'displayProp' : 'value', 'stringTypeOption' : 'true', stopRemoveBodyEvent : true }" |
| | | options="issueCustomField.customFieldVo.customFieldValueVos"></ng-dropdown-multiselect> |
| | | <input class="form-control input-sm issue-select-label" |
| | | type="hidden" name="multiSelect" ng-model="issueCustomField.useValues[0]" |
| | | ng-required="issueCustomField.fieldOption == '01' || issueCustomField.customFieldVo.requiredData == 'Y'"> |
| | | <small class="help-block form-text text-danger" |
| | | ng-show="issueCustomField.customFieldVo.requiredData == 'Y'" |
| | | ng-if="issueAddForm.multiSelect.$error.required" |
| | |
| | | </small> |
| | | </div> |
| | | |
| | | <div class="form-group mb10 col-sm-4"> |
| | | <div class="form-group mb10"> |
| | | <label class="issue-label"><span class="highlighter-rouge">연관 이슈 구분</span></label> |
| | | <select id="relationIssueType" |
| | | name="relationIssueType" |
| | |
| | | </div> |
| | | </div> |
| | | |
| | | <div class="col-lg-8"> |
| | | <div class="col-lg-12"> |
| | | <div class="row"> |
| | | <div class="col-md-12"> |
| | | <div class="form-group mgb5" ng-show="vm.form.issueCustomFields.length < 1"> |
| | |
| | | </div> |
| | | </div> |
| | | |
| | | <div class="col-md-6" ng-repeat="issueCustomField in vm.form.issueCustomFields"> |
| | | <div class="col-md-4" ng-repeat="issueCustomField in vm.form.issueCustomFields"> |
| | | <div class="form-group mgb5"> |
| | | <label class="issue-label">{{issueCustomField.customFieldVo.name}}</label> |
| | | |
| | |
| | | <!-- 기본 입력 --> |
| | | <div ng-switch-when="INPUT"> |
| | | <input type="text" class="form-control input-sm" |
| | | name="input" |
| | | ng-model="issueCustomField.useValues" |
| | | maxlength="100" |
| | | autocomplete="off" |
| | | kr-input |
| | | ng-required="issueCustomField.fieldOption == '01'"> |
| | | ng-required="issueCustomField.fieldOption == '01' || issueCustomField.customFieldVo.requiredData == 'Y'"> |
| | | <small class="help-block form-text text-danger" |
| | | ng-show="issueCustomField.customFieldVo.requiredData == 'Y'" |
| | | ng-if="issueAddRelationForm.input.$error.required" |
| | | translate="issue.pleaseEnterIssueTypeCustomFields">해당 사용자정의필드는 필수 입력 값 입니다. |
| | | </small> |
| | | </div> |
| | | |
| | | <div ng-switch-when="NUMBER"> |
| | | <input type="text" class="form-control input-sm" |
| | | name="number" |
| | | ng-model="issueCustomField.useValues" |
| | | maxlength="100" |
| | | autocomplete="off" |
| | | kr-input |
| | | ng-required="issueCustomField.fieldOption == '01'"> |
| | | ng-required="issueCustomField.fieldOption == '01' || issueCustomField.customFieldVo.requiredData == 'Y'"> |
| | | <small class="help-block form-text text-danger" |
| | | ng-show="issueCustomField.customFieldVo.requiredData == 'Y'" |
| | | ng-if="issueAddRelationForm.number.$error.required" |
| | | translate="issue.pleaseEnterIssueTypeCustomFields">해당 사용자 정의 필드는 필수 입력 값 입니다. |
| | | </small> |
| | | </div> |
| | | |
| | | <div ng-switch-when="DATETIME"> |
| | | <input type="text" class="form-control input-sm" |
| | | name="dateTime" |
| | | ng-model="issueCustomField.useValues" |
| | | maxlength="100" |
| | | autocomplete="off" |
| | | kr-input |
| | | ng-required="issueCustomField.fieldOption == '01'"> |
| | | ng-required="issueCustomField.fieldOption == '01' || issueCustomField.customFieldVo.requiredData == 'Y'"> |
| | | <small class="help-block form-text text-danger" |
| | | ng-show="issueCustomField.customFieldVo.requiredData == 'Y'" |
| | | ng-if="issueAddRelationForm.dateTime.$error.required" |
| | | translate="issue.pleaseEnterIssueTypeCustomFields">해당 사용자 정의 필드는 필수 입력 값 입니다. |
| | | </small> |
| | | </div> |
| | | |
| | | <div ng-switch-when="IP_ADDRESS"> |
| | | <input type="text" class="form-control input-sm" |
| | | name="ipAddress" |
| | | ng-model="issueCustomField.useValues" |
| | | maxlength="100" |
| | | autocomplete="off" |
| | | kr-input |
| | | ng-required="issueCustomField.fieldOption == '01'"> |
| | | ng-required="issueCustomField.fieldOption == '01' || issueCustomField.customFieldVo.requiredData == 'Y'"> |
| | | <small class="help-block form-text text-danger" |
| | | ng-show="issueCustomField.customFieldVo.requiredData == 'Y'" |
| | | ng-if="issueAddRelationForm.ipAddress.$error.required" |
| | | translate="issue.pleaseEnterIssueTypeCustomFields">해당 사용자 정의 필드는 필수 입력 값 입니다. |
| | | </small> |
| | | </div> |
| | | |
| | | <div ng-switch-when="SITE"> |
| | | <input type="text" class="form-control input-sm" |
| | | name="site" |
| | | ng-model="issueCustomField.useValues" |
| | | maxlength="100" |
| | | autocomplete="off" |
| | | kr-input |
| | | ng-required="issueCustomField.fieldOption == '01'"> |
| | | ng-required="issueCustomField.fieldOption == '01' || issueCustomField.customFieldVo.requiredData == 'Y'"> |
| | | <small class="help-block form-text text-danger" |
| | | ng-show="issueCustomField.customFieldVo.requiredData == 'Y'" |
| | | ng-if="issueAddRelationForm.site.$error.required" |
| | | translate="issue.pleaseEnterIssueTypeCustomFields">해당 사용자 정의 필드는 필수 입력 값 입니다. |
| | | </small> |
| | | </div> |
| | | |
| | | <div ng-switch-when="TEL"> |
| | | <input type="text" class="form-control input-sm" |
| | | name="tel" |
| | | ng-model="issueCustomField.useValues" |
| | | maxlength="100" |
| | | autocomplete="off" |
| | | kr-input |
| | | ng-required="issueCustomField.fieldOption == '01'"> |
| | | ng-required="issueCustomField.fieldOption == '01' || issueCustomField.customFieldVo.requiredData == 'Y'"> |
| | | <small class="help-block form-text text-danger" |
| | | ng-show="issueCustomField.customFieldVo.requiredData == 'Y'" |
| | | ng-if="issueAddRelationForm.tel.$error.required" |
| | | translate="issue.pleaseEnterIssueTypeCustomFields">해당 사용자 정의 필드는 필수 입력 값 입니다. |
| | | </small> |
| | | </div> |
| | | |
| | | <!-- 단일 셀렉트 --> |
| | | <div ng-switch-when="SINGLE_SELECT"> |
| | | <select class="form-control input-sm issue-select-label" |
| | | ng-required="issueCustomField.fieldOption == '01'" |
| | | name="singleSelect" |
| | | ng-required="issueCustomField.fieldOption == '01' || issueCustomField.customFieldVo.requiredData == 'Y'" |
| | | ng-model="issueCustomField.useValues"> |
| | | <option value="" value="" translate="common.choose">선택하세요.</option> |
| | | <option ng-repeat="customFieldValueVo in issueCustomField.customFieldVo.customFieldValueVos" |
| | |
| | | {{customFieldValueVo.value}} |
| | | </option> |
| | | </select> |
| | | <small class="help-block form-text text-danger" |
| | | ng-show="issueCustomField.customFieldVo.requiredData == 'Y'" |
| | | ng-if="issueAddRelationForm.singleSelect.$error.required" |
| | | translate="issue.pleaseEnterIssueTypeCustomFields">해당 사용자 정의 필드는 필수 입력 값 입니다. |
| | | </small> |
| | | </div> |
| | | |
| | | <!-- 멀티 셀렉트 --> |
| | | <div ng-switch-when="MULTI_SELECT"> |
| | | <ng-dropdown-multiselect class="multiSelect cursor" |
| | | name="multiSelect" |
| | | ng-required="issueCustomField.customFieldVo.requiredData == 'Y'" |
| | | data-input-name="" |
| | | modal-form-auto-scroll |
| | | selected-model="issueCustomField.useValues" |
| | | extra-settings="{ 'idProp' : 'value', 'externalIdProp' : 'value', 'displayProp' : 'value', 'stringTypeOption' : 'true', stopRemoveBodyEvent : true }" |
| | | options="issueCustomField.customFieldVo.customFieldValueVos"></ng-dropdown-multiselect> |
| | | <small class="help-block form-text text-danger" |
| | | ng-show="issueCustomField.customFieldVo.requiredData == 'Y'" |
| | | ng-if="issueAddRelationForm.multiSelect.$error.required" |
| | | translate="issue.pleaseEnterIssueTypeCustomFields">해당 사용자 정의 필드는 필수 입력 값 입니다. |
| | | </small> |
| | | </div> |
| | | </div> |
| | | </div> |
| | |
| | | <button type="button" class="btn btn-primary form-control input-sm" |
| | | ng-click="fn.addRelationIssue()" |
| | | translate="issue.addRelationIssue">연관 이슈 추가</button> |
| | | <button type="button" class="btn btn-sm btn-primary btn-roundRel offset-1"> |
| | | <i class="os-icon os-icon-plus" ng-click="fn.AddRelation(vm.viewer.id)"><span></span></i> |
| | | <button type="button" class="btn btn-sm btn-primary btn-roundRel offset-1" |
| | | ng-click="fn.addRelationIssueForm(vm.viewer.id)"> |
| | | <i class="os-icon os-icon-plus"><span></span></i> |
| | | </button> |
| | | </div> |
| | | |
| | |
| | | </div> |
| | | </div> |
| | | |
| | | <div class="col-lg-8"> |
| | | <div class="col-lg-12"> |
| | | <div class="row"> |
| | | <div class="col-md-12"> |
| | | <div class="form-group mgb5" ng-show="vm.form.issueCustomFields.length < 1"> |
| | |
| | | </div> |
| | | </div> |
| | | |
| | | <div class="col-md-6" ng-repeat="issueCustomField in vm.form.issueCustomFields"> |
| | | <div class="col-md-4" ng-repeat="issueCustomField in vm.form.issueCustomFields"> |
| | | <div class="form-group mgb5"> |
| | | <label class="issue-label">{{issueCustomField.customFieldVo.name}}</label> |
| | | |
| | |
| | | <!-- 멀티 셀렉트 --> |
| | | <div ng-switch-when="MULTI_SELECT"> |
| | | <ng-dropdown-multiselect class="multiSelect cursor" |
| | | name="multiSelect" |
| | | ng-required="issueCustomField.customFieldVo.requiredData == 'Y'" |
| | | data-input-name="" |
| | | modal-form-auto-scroll |
| | | selected-model="issueCustomField.useValues" |
| | | extra-settings="{ 'idProp' : 'value', 'externalIdProp' : 'value', 'displayProp' : 'value', 'stringTypeOption' : 'true', stopRemoveBodyEvent : true }" |
| | | options="issueCustomField.customFieldVo.customFieldValueVos"></ng-dropdown-multiselect> |
| | | <input class="form-control input-sm issue-select-label" |
| | | type="hidden" name="multiSelect" ng-model="issueCustomField.useValues[0]" |
| | | ng-required="issueCustomField.fieldOption == '01' || issueCustomField.customFieldVo.requiredData == 'Y'"> |
| | | <small class="help-block form-text text-danger" |
| | | ng-show="issueCustomField.customFieldVo.requiredData == 'Y'" |
| | | ng-if="issueAddForm.multiSelect.$error.required" |