- api 문서 메뉴 추가 완료
- 기존 api 설정 메뉴 오류 수정
| | |
| | | |
| | | 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 |
| | |
| | | "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(); |
| | | |
| | |
| | | return response; |
| | | }); |
| | | }, |
| | | findIssueStatusesByIssueType : function (conditions) { |
| | | return $http.post("issueStatus/findIssueStatusesByWorkflow", conditions).then(function (response) { |
| | | $log.debug("이슈 유형에서 사용 가능한 이슈 상태 기록 조회 결과 : ", response); |
| | | return response; |
| | | }); |
| | | } |
| | | } |
| | | } |
| | | ]); |
| | |
| | | '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> |