From a8b47ed588d009da58f103221b16bbe2a578ec39 Mon Sep 17 00:00:00 2001 From: jhjang <jhjang@maprex.co.kr> Date: 화, 07 12월 2021 21:29:15 +0900 Subject: [PATCH] - api 문서 메뉴 추가 완료 - 기존 api 설정 메뉴 오류 수정 --- src/main/java/kr/wisestone/owl/service/impl/IssueStatusServiceImpl.java | 13 + src/main/webapp/scripts/app/api/apiSetting.controller.js | 146 +++++++++++++++++++- src/main/webapp/views/api/apiSettingSpec.html | 119 +++++++++++++++++ src/main/webapp/scripts/components/issueStatus/issueStatus.service.js | 6 src/main/java/kr/wisestone/owl/web/controller/IssueStatusController.java | 16 ++ src/main/webapp/views/api/apiSettingOverlap.html | 20 ++ src/main/webapp/i18n/ko/global.json | 8 + src/main/java/kr/wisestone/owl/service/IssueStatusService.java | 2 src/main/webapp/scripts/main.js | 2 src/main/webapp/views/api/apiSetting.html | 10 src/main/webapp/views/api/apiSettingColumn.html | 35 ++-- 11 files changed, 342 insertions(+), 35 deletions(-) diff --git a/src/main/java/kr/wisestone/owl/service/IssueStatusService.java b/src/main/java/kr/wisestone/owl/service/IssueStatusService.java index b972cf5..625d0cc 100644 --- a/src/main/java/kr/wisestone/owl/service/IssueStatusService.java +++ b/src/main/java/kr/wisestone/owl/service/IssueStatusService.java @@ -22,6 +22,8 @@ List<IssueStatus> findByWorkspaceId(Long workspaceId); + List<IssueStatusVo> findByIssueTypeId(Long issueTypeId); + IssueStatus addIssueStatus(IssueStatusForm issueStatusForm); List<IssueStatusVo> findIssueStatus(Map<String, Object> resJsonData, diff --git a/src/main/java/kr/wisestone/owl/service/impl/IssueStatusServiceImpl.java b/src/main/java/kr/wisestone/owl/service/impl/IssueStatusServiceImpl.java index b25d5e8..3cc0736 100644 --- a/src/main/java/kr/wisestone/owl/service/impl/IssueStatusServiceImpl.java +++ b/src/main/java/kr/wisestone/owl/service/impl/IssueStatusServiceImpl.java @@ -17,6 +17,7 @@ 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; @@ -37,6 +38,9 @@ @Autowired private IssueStatusRepository issueStatusRepository; + + @Autowired + private WorkflowService workflowService; @Autowired private WorkspaceService workspaceService; @@ -93,6 +97,15 @@ 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 diff --git a/src/main/java/kr/wisestone/owl/web/controller/IssueStatusController.java b/src/main/java/kr/wisestone/owl/web/controller/IssueStatusController.java index ce21874..59ae015 100644 --- a/src/main/java/kr/wisestone/owl/web/controller/IssueStatusController.java +++ b/src/main/java/kr/wisestone/owl/web/controller/IssueStatusController.java @@ -2,6 +2,7 @@ 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; @@ -17,6 +18,7 @@ import javax.servlet.http.HttpServletRequest; import java.util.HashMap; +import java.util.List; import java.util.Map; /** @@ -53,6 +55,20 @@ 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 diff --git a/src/main/webapp/i18n/ko/global.json b/src/main/webapp/i18n/ko/global.json index 70c9614..2bf7b28 100644 --- a/src/main/webapp/i18n/ko/global.json +++ b/src/main/webapp/i18n/ko/global.json @@ -830,6 +830,7 @@ "departmentCount": "遺��꽌�씤�썝", "departmentUser": "遺��꽌 ���썝", "detectingInfo": "�깘吏��젙蹂�", + "notExistDetectingInfo": "�궗�슜 媛��뒫�븳 �깘吏� �젙蹂닿� �뾾�뒿�땲�떎.", "detectingData": "�깘吏��씪�떆", "import": "媛��졇�삤湲�", "diffuserURL": "�쑀�룷�옄URL", @@ -860,6 +861,7 @@ "auth" : "API �씤利�", "setting" : "API �꽕�젙", "monitor" : "API 紐⑤땲�꽣留�", + "spec" : "API 臾몄꽌", "application" : "�뼱�뵆由ъ��씠�뀡 �씠由�", "token" : "�넗�겙", "apiKey": "API �넗�겙 �벑濡�", @@ -872,13 +874,17 @@ "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": "�뾽泥댁젙蹂�", diff --git a/src/main/webapp/scripts/app/api/apiSetting.controller.js b/src/main/webapp/scripts/app/api/apiSetting.controller.js index 9031cce..8b88ca9 100644 --- a/src/main/webapp/scripts/app/api/apiSetting.controller.js +++ b/src/main/webapp/scripts/app/api/apiSetting.controller.js @@ -7,8 +7,12 @@ '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, @@ -29,14 +33,25 @@ 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 : [], @@ -63,10 +78,15 @@ }, issueTypeId : "", issueTypeName : "", - customFieldName : "", - }; - angular.extend(this, $controller('autoCompleteController', {$scope : $scope, $injector : $injector})); + issueStatusId : "", + issueStatusName : "", + + customFieldName : "", + + projectId : "", + projectName : "", + }; function initForm() { $scope.vm.form.issueApiDefault.title = ""; @@ -119,7 +139,11 @@ $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 { @@ -272,21 +296,24 @@ $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"); // �씠�뒋 �쑀�삎�뿉 �뿰寃곕맂 �궗�슜�옄 �젙�쓽 �븘�뱶 紐⑸줉 議고쉶 �떎�뙣 } @@ -317,6 +344,16 @@ $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; @@ -325,15 +362,100 @@ $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(); diff --git a/src/main/webapp/scripts/components/issueStatus/issueStatus.service.js b/src/main/webapp/scripts/components/issueStatus/issueStatus.service.js index 9f72e34..093aef9 100644 --- a/src/main/webapp/scripts/components/issueStatus/issueStatus.service.js +++ b/src/main/webapp/scripts/components/issueStatus/issueStatus.service.js @@ -56,6 +56,12 @@ return response; }); }, + findIssueStatusesByIssueType : function (conditions) { + return $http.post("issueStatus/findIssueStatusesByWorkflow", conditions).then(function (response) { + $log.debug("�씠�뒋 �쑀�삎�뿉�꽌 �궗�슜 媛��뒫�븳 �씠�뒋 �긽�깭 湲곕줉 議고쉶 寃곌낵 : ", response); + return response; + }); + } } } ]); diff --git a/src/main/webapp/scripts/main.js b/src/main/webapp/scripts/main.js index ce2f8de..ef59c0d 100644 --- a/src/main/webapp/scripts/main.js +++ b/src/main/webapp/scripts/main.js @@ -337,6 +337,7 @@ 'apiSettingController' : 'app/api/apiSetting.controller', // api �꽕�젙 而⑦듃濡ㅻ윭 'apiMonitorController' : 'app/api/apiMonitor.controller', // api 紐⑤땲�꽣留� 而⑦듃濡ㅻ윭 + /* �뾽泥� */ 'companyFieldRoute' : 'app/companyField/companyField', // �뾽泥� route �젙蹂� 'companyFieldService' : 'components/companyField/companyField.service', // �뾽泥� 愿��젴�맂 �넻�떊 �떞�떦 @@ -554,6 +555,7 @@ 'workflowService', 'issueSearchService', 'systemEmailService', + 'issueStatusService', 'noticeService', 'faqService', 'guideService', diff --git a/src/main/webapp/views/api/apiSetting.html b/src/main/webapp/views/api/apiSetting.html index 1f2d2ad..350fe93 100644 --- a/src/main/webapp/views/api/apiSetting.html +++ b/src/main/webapp/views/api/apiSetting.html @@ -18,6 +18,9 @@ <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"> @@ -28,17 +31,16 @@ </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> diff --git a/src/main/webapp/views/api/apiSettingColumn.html b/src/main/webapp/views/api/apiSettingColumn.html index 0217992..b471b43 100644 --- a/src/main/webapp/views/api/apiSettingColumn.html +++ b/src/main/webapp/views/api/apiSettingColumn.html @@ -1,6 +1,23 @@ <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> @@ -98,22 +115,6 @@ </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> diff --git a/src/main/webapp/views/api/apiSettingOverlap.html b/src/main/webapp/views/api/apiSettingOverlap.html index 57c7609..6d0cc83 100644 --- a/src/main/webapp/views/api/apiSettingOverlap.html +++ b/src/main/webapp/views/api/apiSettingOverlap.html @@ -1,7 +1,25 @@ <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"> diff --git a/src/main/webapp/views/api/apiSettingSpec.html b/src/main/webapp/views/api/apiSettingSpec.html new file mode 100644 index 0000000..2d05b54 --- /dev/null +++ b/src/main/webapp/views/api/apiSettingSpec.html @@ -0,0 +1,119 @@ +<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> \ No newline at end of file -- Gitblit v1.8.0