From 09da2536c13896a498629d1a82df122b0d475d83 Mon Sep 17 00:00:00 2001 From: wyu <kknd09321@nate.com> Date: 수, 08 12월 2021 10:51:08 +0900 Subject: [PATCH] Merge branch 'master' of http://192.168.0.25:9001/r/owl-kisa --- src/main/webapp/views/customField/customFieldModify.html | 1 src/main/webapp/views/issue/issueAdd.html | 7 src/main/java/kr/wisestone/owl/web/controller/IssueStatusController.java | 16 + src/main/webapp/views/api/apiSettingOverlap.html | 20 ++ src/main/webapp/scripts/app/customField/customFieldModify.controller.js | 10 src/main/webapp/scripts/app/issue/issueAdd.controller.js | 32 --- src/main/webapp/scripts/components/utils/autoComplete.controller.js | 12 src/main/webapp/views/customField/customFieldAdd.html | 2 src/main/java/kr/wisestone/owl/service/impl/IssueStatusServiceImpl.java | 13 + src/main/webapp/scripts/app/api/apiSetting.controller.js | 146 ++++++++++++++- src/main/java/kr/wisestone/owl/web/form/CustomFieldForm.java | 2 src/main/webapp/views/api/apiSettingSpec.html | 119 +++++++++++++ src/main/webapp/scripts/components/issueStatus/issueStatus.service.js | 6 src/main/webapp/scripts/app/issue/issueList.controller.js | 4 src/main/webapp/views/issue/issueAddRelation.html | 69 ++++++- src/main/webapp/i18n/ko/global.json | 8 src/main/webapp/views/issue/issueModify.html | 9 src/main/webapp/views/issue/issueDetail.html | 5 src/main/java/kr/wisestone/owl/service/IssueStatusService.java | 2 src/main/webapp/scripts/app/customField/customFieldAdd.controller.js | 2 src/main/webapp/scripts/main.js | 2 src/main/webapp/views/api/apiSetting.html | 10 src/main/webapp/views/api/apiSettingColumn.html | 35 ++- 23 files changed, 435 insertions(+), 97 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/java/kr/wisestone/owl/web/form/CustomFieldForm.java b/src/main/java/kr/wisestone/owl/web/form/CustomFieldForm.java index 4f9b04b..e92aa07 100644 --- a/src/main/java/kr/wisestone/owl/web/form/CustomFieldForm.java +++ b/src/main/java/kr/wisestone/owl/web/form/CustomFieldForm.java @@ -34,7 +34,7 @@ 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"); diff --git a/src/main/webapp/i18n/ko/global.json b/src/main/webapp/i18n/ko/global.json index 8061624..6c33199 100644 --- a/src/main/webapp/i18n/ko/global.json +++ b/src/main/webapp/i18n/ko/global.json @@ -831,6 +831,7 @@ "departmentCount": "遺��꽌�씤�썝", "departmentUser": "遺��꽌 ���썝", "detectingInfo": "�깘吏��젙蹂�", + "notExistDetectingInfo": "�궗�슜 媛��뒫�븳 �깘吏� �젙蹂닿� �뾾�뒿�땲�떎.", "detectingData": "�깘吏��씪�떆", "import": "媛��졇�삤湲�", "diffuserURL": "�쑀�룷�옄URL", @@ -861,6 +862,7 @@ "auth" : "API �씤利�", "setting" : "API �꽕�젙", "monitor" : "API 紐⑤땲�꽣留�", + "spec" : "API 臾몄꽌", "application" : "�뼱�뵆由ъ��씠�뀡 �씠由�", "token" : "�넗�겙", "apiKey": "API �넗�겙 �벑濡�", @@ -873,13 +875,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/app/customField/customFieldAdd.controller.js b/src/main/webapp/scripts/app/customField/customFieldAdd.controller.js index 65c1549..c309bd5 100644 --- a/src/main/webapp/scripts/app/customField/customFieldAdd.controller.js +++ b/src/main/webapp/scripts/app/customField/customFieldAdd.controller.js @@ -31,7 +31,7 @@ email : "", site : "", tel : "", - requiredData : "" + requiredData : false } }; diff --git a/src/main/webapp/scripts/app/customField/customFieldModify.controller.js b/src/main/webapp/scripts/app/customField/customFieldModify.controller.js index a0ff0e9..61cb612 100644 --- a/src/main/webapp/scripts/app/customField/customFieldModify.controller.js +++ b/src/main/webapp/scripts/app/customField/customFieldModify.controller.js @@ -164,7 +164,8 @@ 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 = ""; @@ -218,7 +219,12 @@ $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); diff --git a/src/main/webapp/scripts/app/issue/issueAdd.controller.js b/src/main/webapp/scripts/app/issue/issueAdd.controller.js index 151503e..f9a4215 100644 --- a/src/main/webapp/scripts/app/issue/issueAdd.controller.js +++ b/src/main/webapp/scripts/app/issue/issueAdd.controller.js @@ -58,8 +58,7 @@ attachedFiles : [], // �꽟癒몃끂�듃濡� �뙆�씪 �뾽濡쒕뱶瑜� �븷 寃쎌슦 �꽌踰꾩뿉�꽌 pk瑜� �뵲怨� issue id�� �뿰�룞 �옉�뾽�씠 �븘�슂�븯�떎. startCompleteDateRange : "", // �떆�옉�씪 ~ 醫낅즺�씪 detectingDateRange : "", // �깘吏��씪 - issueCustomFields : [], // �씠�뒋�뿉�꽌 �궗�슜�릺�뒗 �궗�슜�옄 �젙�쓽 �븘�뱶 - requiredDatas : [] // �궗�슜�옄 �젙�쓽 �븘�뱶 �븘�닔 �뜲�씠�꽣 泥댄겕 + issueCustomFields : [] // �씠�뒋�뿉�꽌 �궗�슜�릺�뒗 �궗�슜�옄 �젙�쓽 �븘�뱶 }, infiniteAdd : false, // �뿰�냽 �깮�꽦 projectName : "", // �봽濡쒖젥�듃 紐� 寃��깋 @@ -559,30 +558,6 @@ 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 = []; @@ -711,7 +686,6 @@ // �씠�뒋 �쑀�삎�뿉 �뿰寃곕맂 �궗�슜�옄 �젙�쓽 �븘�뱶 function getIssueTypeCustomFields() { $scope.vm.form.issueCustomFields = []; - $scope.vm.form.requiredDatas = []; // �씠�뒋 ���엯 �븘�씠�뵒�굹 �봽濡쒖젥�듃 �븘�씠�뵒媛� �뾾�쑝硫� �넻�떊�쓣 �븯吏� �븡�뒗�떎. if (!$rootScope.isDefined($scope.vm.form.issueTypeId) || $scope.vm.form.projects.length < 1) { return; @@ -727,7 +701,6 @@ 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" : @@ -756,9 +729,6 @@ break; } $scope.vm.form.issueCustomFields.push(issueTypeCustomField); - if(issueTypeCustomField.customFieldVo.requiredData === "Y") { - $scope.vm.form.requiredDatas.push(issueTypeCustomField.customFieldVo.requiredData); - } }); } else { diff --git a/src/main/webapp/scripts/app/issue/issueList.controller.js b/src/main/webapp/scripts/app/issue/issueList.controller.js index 4d49b24..006dc38 100644 --- a/src/main/webapp/scripts/app/issue/issueList.controller.js +++ b/src/main/webapp/scripts/app/issue/issueList.controller.js @@ -22,7 +22,7 @@ setTableColumn : setTableColumn, // �뀒�씠釉붿쓽 而щ읆�쓣 留뚮뱾�뼱以��떎. add : add, // �씠�뒋 �깮�꽦 modify : modify, // �씠�뒋 �닔�젙 - AddRelation : AddRelation, // �뿰愿� �씠�뒋 異붽� + addRelationIssueForm : addRelationIssueForm, // �뿰愿� �씠�뒋 異붽� modifyMultiIssueStatus : modifyMultiIssueStatus, // �씠�뒋 �떎以� �긽�깭 蹂�寃� removes : removes, // �씠�뒋 �궘�젣 addIssueTableConfig : addIssueTableConfig, // �씠�뒋 紐⑸줉 �뀒�씠釉� �꽕�젙 @@ -669,7 +669,7 @@ }); } - function AddRelation(id) { + function addRelationIssueForm(id) { $uibModal.open({ templateUrl : 'views/issue/issueAddRelation.html', size : "lg", 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/components/utils/autoComplete.controller.js b/src/main/webapp/scripts/components/utils/autoComplete.controller.js index 6402006..d40a45f 100644 --- a/src/main/webapp/scripts/components/utils/autoComplete.controller.js +++ b/src/main/webapp/scripts/components/utils/autoComplete.controller.js @@ -345,11 +345,13 @@ 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); 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 diff --git a/src/main/webapp/views/customField/customFieldAdd.html b/src/main/webapp/views/customField/customFieldAdd.html index 1f28b1d..ea027dd 100644 --- a/src/main/webapp/views/customField/customFieldAdd.html +++ b/src/main/webapp/views/customField/customFieldAdd.html @@ -34,7 +34,7 @@ <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> diff --git a/src/main/webapp/views/customField/customFieldModify.html b/src/main/webapp/views/customField/customFieldModify.html index 1360aed..8beb7b1 100644 --- a/src/main/webapp/views/customField/customFieldModify.html +++ b/src/main/webapp/views/customField/customFieldModify.html @@ -35,6 +35,7 @@ <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> diff --git a/src/main/webapp/views/issue/issueAdd.html b/src/main/webapp/views/issue/issueAdd.html index f1ac85a..690c9ab 100644 --- a/src/main/webapp/views/issue/issueAdd.html +++ b/src/main/webapp/views/issue/issueAdd.html @@ -230,7 +230,7 @@ <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"> <!-- 湲곕낯 �엯�젰 --> @@ -347,13 +347,14 @@ <!-- 硫��떚 ���젆�듃 --> <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" diff --git a/src/main/webapp/views/issue/issueAddRelation.html b/src/main/webapp/views/issue/issueAddRelation.html index c5a1262..728f926 100644 --- a/src/main/webapp/views/issue/issueAddRelation.html +++ b/src/main/webapp/views/issue/issueAddRelation.html @@ -29,7 +29,7 @@ </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" @@ -230,7 +230,7 @@ </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"> @@ -239,7 +239,7 @@ </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> @@ -247,62 +247,99 @@ <!-- 湲곕낯 �엯�젰 --> <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" @@ -311,16 +348,28 @@ {{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> diff --git a/src/main/webapp/views/issue/issueDetail.html b/src/main/webapp/views/issue/issueDetail.html index 2d6b118..91fb912 100644 --- a/src/main/webapp/views/issue/issueDetail.html +++ b/src/main/webapp/views/issue/issueDetail.html @@ -496,8 +496,9 @@ <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> diff --git a/src/main/webapp/views/issue/issueModify.html b/src/main/webapp/views/issue/issueModify.html index e737e65..6034426 100644 --- a/src/main/webapp/views/issue/issueModify.html +++ b/src/main/webapp/views/issue/issueModify.html @@ -219,7 +219,7 @@ </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"> @@ -228,7 +228,7 @@ </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> @@ -347,13 +347,14 @@ <!-- 硫��떚 ���젆�듃 --> <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" -- Gitblit v1.8.0