From 577502fbd1ec01a3023ca0eb515ab6ec52d67a5e Mon Sep 17 00:00:00 2001
From: jhjang <jhjang@maprex.co.kr>
Date: 금, 26 11월 2021 17:21:29 +0900
Subject: [PATCH] - api 기본값 설정 기능 추가

---
 src/main/webapp/scripts/components/issueType/issueType.service.js            |    3 
 src/main/java/kr/wisestone/owl/web/controller/ApiController.java             |    4 
 src/main/webapp/scripts/components/api/api.service.js                        |   14 
 src/main/java/kr/wisestone/owl/web/form/IssueApiDefaultForm.java             |   87 ++++++
 src/main/java/kr/wisestone/owl/repository/IssueApiDefaultRepository.java     |   15 +
 src/main/java/kr/wisestone/owl/service/impl/IssueApiDefaultServiceImpl.java  |  100 +++++++
 src/main/java/kr/wisestone/owl/web/controller/IssueApiDefaultController.java |   46 +++
 src/main/java/kr/wisestone/owl/vo/IssueApiDefaultVo.java                     |  136 +++++++++
 src/main/webapp/scripts/components/utils/autoComplete.controller.js          |   36 ++
 src/main/webapp/scripts/app/api/apiSetting.controller.js                     |  158 ++++++++++
 src/main/java/kr/wisestone/owl/web/controller/IssueTypeController.java       |    3 
 src/main/webapp/i18n/ko/global.json                                          |    7 
 src/main/java/kr/wisestone/owl/service/IssueApiDefaultService.java           |   13 
 src/main/webapp/views/api/apiSettingColumn.html                              |  202 ++-----------
 14 files changed, 639 insertions(+), 185 deletions(-)

diff --git a/src/main/java/kr/wisestone/owl/repository/IssueApiDefaultRepository.java b/src/main/java/kr/wisestone/owl/repository/IssueApiDefaultRepository.java
new file mode 100644
index 0000000..efad549
--- /dev/null
+++ b/src/main/java/kr/wisestone/owl/repository/IssueApiDefaultRepository.java
@@ -0,0 +1,15 @@
+package kr.wisestone.owl.repository;
+
+import kr.wisestone.owl.domain.IssueApiDefault;
+import kr.wisestone.owl.domain.IssueComment;
+import kr.wisestone.owl.vo.IssueCommentVo;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
+
+import java.util.List;
+
+public interface IssueApiDefaultRepository extends JpaRepository<IssueApiDefault, Long> {
+    List<IssueApiDefault> findByUserIdAndIssueTypeId(@Param("UserId") Long userId, @Param("IssueTypeId") Long issueTypeId);
+
+}
diff --git a/src/main/java/kr/wisestone/owl/service/IssueApiDefaultService.java b/src/main/java/kr/wisestone/owl/service/IssueApiDefaultService.java
new file mode 100644
index 0000000..72fe5b7
--- /dev/null
+++ b/src/main/java/kr/wisestone/owl/service/IssueApiDefaultService.java
@@ -0,0 +1,13 @@
+package kr.wisestone.owl.service;
+
+import kr.wisestone.owl.domain.IssueApiDefault;
+import kr.wisestone.owl.web.form.IssueApiDefaultForm;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+import java.util.List;
+import java.util.Map;
+
+public interface IssueApiDefaultService extends AbstractService<IssueApiDefault, Long, JpaRepository<IssueApiDefault, Long>> {
+    IssueApiDefault find(Map<String, Object> resJsonData, IssueApiDefaultForm form);
+    boolean modify(Map<String, Object> resJsonData, IssueApiDefaultForm form);
+}
diff --git a/src/main/java/kr/wisestone/owl/service/impl/IssueApiDefaultServiceImpl.java b/src/main/java/kr/wisestone/owl/service/impl/IssueApiDefaultServiceImpl.java
new file mode 100644
index 0000000..4fb83bc
--- /dev/null
+++ b/src/main/java/kr/wisestone/owl/service/impl/IssueApiDefaultServiceImpl.java
@@ -0,0 +1,100 @@
+package kr.wisestone.owl.service.impl;
+
+import kr.wisestone.owl.constant.Constants;
+import kr.wisestone.owl.domain.*;
+import kr.wisestone.owl.repository.IssueApiDefaultRepository;
+import kr.wisestone.owl.service.*;
+import kr.wisestone.owl.util.ConvertUtil;
+import kr.wisestone.owl.vo.*;
+import kr.wisestone.owl.web.form.IssueApiDefaultForm;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+import java.util.Map;
+
+@Service
+public class IssueApiDefaultServiceImpl extends AbstractServiceImpl<IssueApiDefault, Long, JpaRepository<IssueApiDefault, Long>>
+        implements IssueApiDefaultService {
+
+    static final Logger log = LoggerFactory.getLogger(IssueApiDefaultServiceImpl.class);
+
+    @Autowired
+    private IssueApiDefaultRepository issueApiDefaultRepository;
+
+    @Autowired
+    private IssueTypeService issueTypeService;
+
+    @Autowired
+    private PriorityService priorityService;
+
+    @Autowired
+    private SeverityService severityService;
+
+    @Autowired
+    private ProjectService projectService;
+
+    @Override
+    protected JpaRepository<IssueApiDefault, Long> getRepository() {
+        return this.issueApiDefaultRepository;
+    }
+
+    @Override
+    @Transactional
+    public IssueApiDefault find(Map<String, Object> resJsonData, IssueApiDefaultForm form) {
+        UserVo userVo = this.webAppUtil.getLoginUser();
+        List<IssueApiDefault> issueApiDefaults = this.issueApiDefaultRepository.findByUserIdAndIssueTypeId(userVo.getId(), form.getIssueTypeId());
+        if (issueApiDefaults != null && issueApiDefaults.size() > 0) {
+            IssueApiDefault issueApiDefault = issueApiDefaults.get(0);
+            IssueApiDefaultVo issueApiDefaultVo = ConvertUtil.copyProperties(issueApiDefault, IssueApiDefaultVo.class);
+            Project project = issueApiDefault.getProject();
+            if (project != null) {
+                issueApiDefaultVo.setProjectVo(ConvertUtil.copyProperties(project, ProjectVo.class));
+            }
+
+            Priority priority = issueApiDefault.getPriority();
+            if (project != null) {
+                issueApiDefaultVo.setPriorityId(priority.getId());
+            }
+
+            Severity severity = issueApiDefault.getSeverity();
+            if (severity != null) {
+                issueApiDefaultVo.setSeverityId(severity.getId());
+            }
+
+            resJsonData.put(Constants.RES_KEY_CONTENTS, issueApiDefaultVo);
+            return issueApiDefault;
+        }
+        return null;
+    }
+
+    @Override
+    public boolean modify(Map<String, Object> resJsonData, IssueApiDefaultForm form) {
+        User user = this.webAppUtil.getLoginUserObject();
+        List<IssueApiDefault> issueApiDefaults = this.issueApiDefaultRepository.findByUserIdAndIssueTypeId(user.getId(), form.getIssueTypeId());
+        if (issueApiDefaults != null && issueApiDefaults.size() > 0) {
+            this.issueApiDefaultRepository.deleteAll(issueApiDefaults);
+        }
+        IssueApiDefault issueApiDefault = new IssueApiDefault();
+        issueApiDefault = ConvertUtil.copyProperties(form, IssueApiDefault.class);
+        if (form.getPriorityId() != null)
+            issueApiDefault.setPriority(this.priorityService.getPriority(form.getPriorityId()));
+
+        if (form.getSeverityId() != null)
+            issueApiDefault.setSeverity(this.severityService.getSeverity(form.getSeverityId()));
+
+        if (form.getProjectId() != null)
+            issueApiDefault.setProject(this.projectService.getProject(form.getProjectId()));
+
+        issueApiDefault.setUser(user);
+        issueApiDefault.setIssueType(this.issueTypeService.getIssueType(form.getIssueTypeId()));
+
+        this.issueApiDefaultRepository.saveAndFlush(issueApiDefault);
+
+        return  true;
+    }
+}
diff --git a/src/main/java/kr/wisestone/owl/vo/IssueApiDefaultVo.java b/src/main/java/kr/wisestone/owl/vo/IssueApiDefaultVo.java
new file mode 100644
index 0000000..67e07e1
--- /dev/null
+++ b/src/main/java/kr/wisestone/owl/vo/IssueApiDefaultVo.java
@@ -0,0 +1,136 @@
+package kr.wisestone.owl.vo;
+
+import java.util.Date;
+
+public class IssueApiDefaultVo extends BaseVo {
+
+    private Long id;
+    private Long userId;
+    private Long issueTypeId;
+    private Long issueStatusId;
+    private Long projectId;
+    private Long priorityId;
+    private Long severityId;
+    private String title;
+    private String description;
+    private Long reverseIndex;
+    private Long issue_number;
+    private Date start_date;
+    private Date complete_date;
+    private ProjectVo projectVo;
+
+    public IssueApiDefaultVo() {
+    }
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public Long getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Long userId) {
+        this.userId = userId;
+    }
+
+    public Long getIssueTypeId() {
+        return issueTypeId;
+    }
+
+    public void setIssueTypeId(Long issueTypeId) {
+        this.issueTypeId = issueTypeId;
+    }
+
+    public Long getIssueStatusId() {
+        return issueStatusId;
+    }
+
+    public void setIssueStatusId(Long issueStatusId) {
+        this.issueStatusId = issueStatusId;
+    }
+
+    public Long getProjectId() {
+        return projectId;
+    }
+
+    public void setProjectId(Long projectId) {
+        this.projectId = projectId;
+    }
+
+    public Long getPriorityId() {
+        return priorityId;
+    }
+
+    public void setPriorityId(Long priorityId) {
+        this.priorityId = priorityId;
+    }
+
+    public Long getSeverityId() {
+        return severityId;
+    }
+
+    public void setSeverityId(Long severityId) {
+        this.severityId = severityId;
+    }
+
+    public String getTitle() {
+        return title;
+    }
+
+    public void setTitle(String title) {
+        this.title = title;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    public Long getReverseIndex() {
+        return reverseIndex;
+    }
+
+    public void setReverseIndex(Long reverseIndex) {
+        this.reverseIndex = reverseIndex;
+    }
+
+    public Long getIssue_number() {
+        return issue_number;
+    }
+
+    public void setIssue_number(Long issue_number) {
+        this.issue_number = issue_number;
+    }
+
+    public Date getStart_date() {
+        return start_date;
+    }
+
+    public void setStart_date(Date start_date) {
+        this.start_date = start_date;
+    }
+
+    public Date getComplete_date() {
+        return complete_date;
+    }
+
+    public void setComplete_date(Date complete_date) {
+        this.complete_date = complete_date;
+    }
+
+    public ProjectVo getProjectVo() {
+        return projectVo;
+    }
+
+    public void setProjectVo(ProjectVo projectVo) {
+        this.projectVo = projectVo;
+    }
+}
diff --git a/src/main/java/kr/wisestone/owl/web/controller/ApiController.java b/src/main/java/kr/wisestone/owl/web/controller/ApiController.java
index ed640c5..80ee790 100644
--- a/src/main/java/kr/wisestone/owl/web/controller/ApiController.java
+++ b/src/main/java/kr/wisestone/owl/web/controller/ApiController.java
@@ -23,7 +23,7 @@
     private GuideService guideService;
 
     //  �씠�뒋 異붽�
-    @RequestMapping(value = "/api/add", produces = MediaType.APPLICATION_JSON_VALUE)
+    @RequestMapping(value = "api/issue", produces = MediaType.APPLICATION_JSON_VALUE)
     public
     @ResponseBody
     Map<String, Object> add(@RequestBody Map<String, Map<String, Object>> params) {
@@ -35,7 +35,7 @@
     }
 
     //  �씠�뒋 議고쉶
-    @RequestMapping(value = "/api/find", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE)
+    @RequestMapping(value = "/api/issuelist", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
     public
     @ResponseBody
     Map<String, Object> find(@RequestBody Map<String, Map<String, Object>> params) {
diff --git a/src/main/java/kr/wisestone/owl/web/controller/IssueApiDefaultController.java b/src/main/java/kr/wisestone/owl/web/controller/IssueApiDefaultController.java
new file mode 100644
index 0000000..5bb6172
--- /dev/null
+++ b/src/main/java/kr/wisestone/owl/web/controller/IssueApiDefaultController.java
@@ -0,0 +1,46 @@
+package kr.wisestone.owl.web.controller;
+
+import kr.wisestone.owl.constant.Constants;
+import kr.wisestone.owl.service.IssueApiDefaultService;
+import kr.wisestone.owl.util.ConvertUtil;
+import kr.wisestone.owl.web.form.IssueApiDefaultForm;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.MediaType;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import java.util.HashMap;
+import java.util.Map;
+
+@Controller
+public class IssueApiDefaultController extends BaseController {
+
+    @Autowired
+    private IssueApiDefaultService issueApiDefaultService;
+
+    //  �씠�뒋 ���엯蹂� 湲곕낯媛� 媛��졇�삤湲�
+    @RequestMapping(value = "issueApiDefault/find", produces = MediaType.APPLICATION_JSON_VALUE)
+    public
+    @ResponseBody
+    Map<String, Object> find(@RequestBody Map<String, Map<String, Object>> params) {
+        Map<String, Object> resJsonData = new HashMap<>();
+
+        this.issueApiDefaultService.find(resJsonData, ConvertUtil.convertMapToClass(params.get(Constants.REQ_KEY_CONTENT), IssueApiDefaultForm.class));
+
+        return this.setSuccessMessage(resJsonData);
+    }
+
+    //  �씠�뒋 ���엯蹂� 湲곕낯媛� 媛��졇�삤湲�
+    @RequestMapping(value = "issueApiDefault/modify", produces = MediaType.APPLICATION_JSON_VALUE)
+    public
+    @ResponseBody
+    Map<String, Object> modify(@RequestBody Map<String, Map<String, Object>> params) {
+        Map<String, Object> resJsonData = new HashMap<>();
+
+        this.issueApiDefaultService.modify(resJsonData, ConvertUtil.convertMapToClass(params.get(Constants.REQ_KEY_CONTENT), IssueApiDefaultForm.class));
+
+        return this.setSuccessMessage(resJsonData);
+    }
+}
diff --git a/src/main/java/kr/wisestone/owl/web/controller/IssueTypeController.java b/src/main/java/kr/wisestone/owl/web/controller/IssueTypeController.java
index 3dafadf..a58371e 100644
--- a/src/main/java/kr/wisestone/owl/web/controller/IssueTypeController.java
+++ b/src/main/java/kr/wisestone/owl/web/controller/IssueTypeController.java
@@ -77,7 +77,6 @@
     }
 
     //  �씠�뒋 ���엯 �궘�젣
-    @SuppressWarnings("unchecked")
     @RequestMapping(value = "/issueType/remove", produces = MediaType.APPLICATION_JSON_VALUE)
     public
     @ResponseBody
@@ -94,4 +93,4 @@
     public ModelAndView downloadExcel(HttpServletRequest request, Model model) {
         return this.issueTypeService.downloadExcel(request, model);
     }
-}
+ }
diff --git a/src/main/java/kr/wisestone/owl/web/form/IssueApiDefaultForm.java b/src/main/java/kr/wisestone/owl/web/form/IssueApiDefaultForm.java
new file mode 100644
index 0000000..5674877
--- /dev/null
+++ b/src/main/java/kr/wisestone/owl/web/form/IssueApiDefaultForm.java
@@ -0,0 +1,87 @@
+package kr.wisestone.owl.web.form;
+
+import com.google.common.collect.Lists;
+import kr.wisestone.owl.util.ConvertUtil;
+import kr.wisestone.owl.util.MapUtil;
+import org.hibernate.annotations.DynamicInsert;
+
+import java.util.List;
+import java.util.Map;
+
+@DynamicInsert
+public class IssueApiDefaultForm {
+    private Long id;
+    private Long userId;
+    private Long issueTypeId;
+    private Long projectId;
+    private Long priorityId;
+    private Long severityId;
+    private String title;
+    private String description;
+
+    public IssueApiDefaultForm(){}
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public Long getIssueTypeId() {
+        return issueTypeId;
+    }
+
+    public void setIssueTypeId(Long issueTypeId) {
+        this.issueTypeId = issueTypeId;
+    }
+
+    public Long getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Long userId) {
+        this.userId = userId;
+    }
+
+    public Long getProjectId() {
+        return projectId;
+    }
+
+    public void setProjectId(Long projectId) {
+        this.projectId = projectId;
+    }
+
+    public Long getPriorityId() {
+        return priorityId;
+    }
+
+    public void setPriorityId(Long priorityId) {
+        this.priorityId = priorityId;
+    }
+
+    public Long getSeverityId() {
+        return severityId;
+    }
+
+    public void setSeverityId(Long severityId) {
+        this.severityId = severityId;
+    }
+
+    public String getTitle() {
+        return title;
+    }
+
+    public void setTitle(String title) {
+        this.title = title;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+}
diff --git a/src/main/webapp/i18n/ko/global.json b/src/main/webapp/i18n/ko/global.json
index b546364..6501a46 100644
--- a/src/main/webapp/i18n/ko/global.json
+++ b/src/main/webapp/i18n/ko/global.json
@@ -334,7 +334,8 @@
         "downIssueRemove" : "�븯�쐞 �씠�뒋 �궘�젣",
         "failedToIssueAddIssueDown": "�븯�쐞 �씠�뒋 異붽� �떎�뙣",
         "failedToIssueDeleteIssueDown": "�븯�쐞 �씠�뒋 �궘�젣 �떎�뙣",
-        "errorSelectDownIssue" : "�븯�쐞 �씠�뒋媛� �꽑�깮�릺吏� �븡�븯�뒿�땲�떎."
+        "errorSelectDownIssue" : "�븯�쐞 �씠�뒋媛� �꽑�깮�릺吏� �븡�븯�뒿�땲�떎.",
+        "failedToIssueTypeDefault": "�씠�뒋 �쑀�삎 湲곕낯媛� 議고쉶 �떎�뙣"
     },
     "project": {
         "createProject": "�봽濡쒖젥�듃 留뚮뱾湲�",
@@ -858,7 +859,9 @@
         "failedToApiTokenRemove" : "API �넗�겙 �궘�젣 �떎�뙣",
         "failedToApiTokenAdd" : "API �넗�겙 �깮�꽦 �떎�뙣",
         "successToApiTokenRemove" : "API �넗�겙 �궘�젣 �꽦怨�",
-        "successToApiTokenAdd" : "API �넗�겙 �깮�꽦 �꽦怨�"
+        "successToApiTokenAdd" : "API �넗�겙 �깮�꽦 �꽦怨�",
+        "successToApiIssueDefault" : "湲곕낯媛� �꽕�젙 �셿猷�."
+        "failedToApiIssueDefault" : "湲곕낯媛� �꽕�젙 �떎�뙣"
     },
     "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 db6427d..a96bc8c 100644
--- a/src/main/webapp/scripts/app/api/apiSetting.controller.js
+++ b/src/main/webapp/scripts/app/api/apiSetting.controller.js
@@ -7,30 +7,159 @@
         'app', 'angular'
     ],
     function (app, angular) {
-        app.controller('apiSettingController', ['$scope', '$rootScope', '$log', '$resourceProvider','$uibModal', 'SweetAlert', '$timeout', '$filter',
-            function ($scope, $rootScope, $log, $resourceProvider, $uibModal, SweetAlert, $timeout, $filter) {
+        app.controller('apiSettingController', ['$scope', '$rootScope', '$log', '$resourceProvider','$uibModal', 'SweetAlert', '$timeout', '$filter', '$injector', '$controller', 'Api', 'Priority', 'Severity',
+            function ($scope, $rootScope, $log, $resourceProvider, $uibModal, SweetAlert, $timeout, $filter, $injector, $controller, Api, Priority, Severity) {
 
                 $scope.fn = {
                     changeTab : changeTab,
-                    add : add,
+                    getIssueTypeCallback : getIssueTypeCallback,
+                    getProjectListCallback : getProjectListCallback,
+                    formSubmit : formSubmit,
+                    formCheck : formCheck,
+                    initForm : initForm,
+                    getPriorities : getPriorities,
+                    getSeverities : getSeverities,
+                    start : start
                 };
 
                 $scope.vm = {
                     tab : "API_COL_SETTING",
+                    issueTypes : [],
+                    severities : [],
+                    priorities : [],
+                    // projects : [],
                     form : {
+                        issueApiDefault : {
+                            title : "",
+                            description : "",
+                            priorityId : "",
+                            severityId : "",
+                            // projectName : "",
+                        }
+                    },
 
-                    }
+                    autoCompletePage : {
+                        issueType : {
+                            page : 0,
+                            totalPage : 0
+                        },
+                        // project : {
+                        //     page : 0,
+                        //     totalPage : 0
+                        // }
+                    },
+                    issueTypeName : "",
+                    issueTypeData : null            // �씠�뒋 �쑀�삎 媛앹껜
                 };
 
-                //  �깮�꽦 �뙘�뾽
-                function add() {
-                    $uibModal.open({
-                        templateUrl : 'views/api/apiOverlapAdd.html',
-                        size : "sm",
-                        // controller : 'apiOverlapAddController',
-                        backdrop : 'static'
+                angular.extend(this, $controller('autoCompleteController', {$scope : $scope, $injector : $injector}));
+
+                function initForm() {
+                    $scope.vm.form.issueApiDefault.title = "";
+                    $scope.vm.form.issueApiDefault.description = "";
+                    $scope.vm.form.issueApiDefault.priorityId = "";
+                    $scope.vm.form.issueApiDefault.severityId = "";
+                }
+
+                // �씠�뒋 �쑀�삎 �겢由��떆
+                $scope.$on("onClickIssueType", function (evnet, args) {
+                    if (args != null && args.length > 0) {
+
+                        let conditions = {
+                            issueTypeId: args[0].id
+                        }
+
+                        Api.findApiDefault($resourceProvider.getContent(
+                            conditions, $resourceProvider.getPageContent(0, 0))).then(function (result) {
+                            $scope.fn.initForm();
+                            if (result.data.message.status === "success") {
+                                if (angular.isDefined(result.data.data)) {
+                                    $scope.vm.form.issueApiDefault = result.data.data;
+                                    $scope.vm.form.issueApiDefault.priorityId = result.data.data.priorityId.toString();
+                                    $scope.vm.form.issueApiDefault.severityId = result.data.data.severityId.toString();
+
+                                    // if (angular.isDefined(result.data.data.projectVo)) {
+                                    //     $scope.vm.projects = [];
+                                    //     $scope.vm.projects.push(result.data.data.projectVo);
+                                    // }
+                                }
+                            } else {
+                                SweetAlert.swal($filter("translate")("common.failedToIssueTypeDefault"), result.data.message.message, "error"); // "�봽濡쒖젥�듃 紐⑸줉 議고쉶 �떎�뙣"
+                            }
+                        });
+                    }
+                });
+
+                //  �뤌 泥댄겕
+                function formCheck(formInvalid) {
+                    if (formInvalid) {
+                        return true;
+                    }
+
+                    return false;
+                }
+
+                function formSubmit() {
+                    if ($scope.vm.issueTypes == null || $scope.vm.issueTypes.length === 0)
+                        return;
+
+                    let condition = {
+                        issueTypeId : $scope.vm.issueTypes[0].id,
+                        title : $scope.vm.form.issueApiDefault.title,
+                        // projectId : $scope.vm.projects != null && $scope.vm.projects.length > 0 ? $scope.vm.projects[0].id : null,
+                        priorityId : $scope.vm.form.issueApiDefault.priorityId,
+                        severityId : $scope.vm.form.issueApiDefault.severityId,
+                        description : $scope.vm.form.issueApiDefault.description,
+                    }
+
+                    Api.modifyApiDefault($resourceProvider.getContent(condition,
+                        $resourceProvider.getPageContent(0, 1))).then(function (result) {
+
+                        if (result.data.message.status === "success") {
+                            SweetAlert.swal($filter("translate")("api.successToApiIssueDefault"), result.data.message.message, "success"); // "api �넗�겙 �깮�꽦 �꽦怨�"
+                        }
+                        else {
+                            SweetAlert.swal($filter("translate")("api.failedToApiIssueDefault"), result.data.message.message, "error"); // "api �넗�겙 �깮�꽦 �떎�뙣"
+                        }
                     });
                 }
+
+                function getIssueTypeCallback(result) {
+                    $scope.vm.autoCompletePage.issueType.totalPage = result.data.page.totalPage;
+                }
+
+                function getProjectListCallback(result) {
+                    $scope.vm.autoCompletePage.project.totalPage = result.data.page.totalPage;
+                }
+
+                //  �슦�꽑�닚�쐞 紐⑸줉
+                function getPriorities() {
+                    Priority.find($resourceProvider.getContent({},
+                        $resourceProvider.getPageContent(0, 1000))).then(function (result) {
+
+                        if (result.data.message.status === "success") {
+                            $scope.vm.priorities = result.data.data;
+                        }
+                        else {
+                            SweetAlert.swal($filter("translate")("issue.failedToPriorityListLookup"), result.data.message.message, "error"); // �슦�꽑�닚�쐞 紐⑸줉 議고쉶 �떎�뙣
+                        }
+                    });
+                }
+
+                //  以묒슂�룄 紐⑸줉
+                function getSeverities() {
+                    Severity.find($resourceProvider.getContent({},
+                        $resourceProvider.getPageContent(0, 1000))).then(function (result) {
+
+                        if (result.data.message.status === "success") {
+                            $scope.vm.severities = result.data.data;
+                        }
+                        else {
+                            SweetAlert.swal($filter("translate")("issue.failedToCriticalListLookup"), result.data.message.message, "error"); // 以묒슂�룄 紐⑸줉 議고쉶 �떎�뙣
+                        }
+                    });
+                }
+
 
                 function changeTab(tab) {
                     $scope.vm.tab = tab;
@@ -42,5 +171,12 @@
                     }
                 }
 
+                function start() {
+                    $scope.fn.initForm();
+                    $scope.fn.getSeverities();
+                    $scope.fn.getPriorities();
+                }
+
+                $scope.fn.start();
             }]);
     });
diff --git a/src/main/webapp/scripts/components/api/api.service.js b/src/main/webapp/scripts/components/api/api.service.js
index b95c0c1..9dd5537 100644
--- a/src/main/webapp/scripts/components/api/api.service.js
+++ b/src/main/webapp/scripts/components/api/api.service.js
@@ -3,7 +3,7 @@
 define([
     'app'
 ], function (app) {
-    app.factory("Api", ['$http', '$log', function ($http, $log) {
+    app.factory(  "Api", ['$http', '$log', function ($http, $log) {
         return {
             find : function (conditions) {
                 return $http.post("apiToken/find", conditions).then(function (response) {
@@ -22,6 +22,18 @@
                     $log.debug("�넗�겙 �궘�젣 寃곌낵 : ", response);
                     return response;
                 });
+            },
+            findApiDefault : function (conditions) {
+                return $http.post("issueApiDefault/find", conditions).then(function (response) {
+                    $log.debug("�씠�뒋 �쑀�삎 珥덇린媛� 議고쉶 寃곌낵 : ", response);
+                    return response;
+                });
+            },
+            modifyApiDefault : function (conditions) {
+                return $http.post("issueApiDefault/modify", conditions).then(function (response) {
+                    $log.debug("�씠�뒋 �쑀�삎 珥덇린媛� �닔�젙 寃곌낵 : ", response);
+                    return response;
+                });
             }
         }
     }
diff --git a/src/main/webapp/scripts/components/issueType/issueType.service.js b/src/main/webapp/scripts/components/issueType/issueType.service.js
index 5b6fa9e..3961b81 100644
--- a/src/main/webapp/scripts/components/issueType/issueType.service.js
+++ b/src/main/webapp/scripts/components/issueType/issueType.service.js
@@ -37,7 +37,8 @@
                     $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 c87f50b..1dd6f18 100644
--- a/src/main/webapp/scripts/components/utils/autoComplete.controller.js
+++ b/src/main/webapp/scripts/components/utils/autoComplete.controller.js
@@ -22,6 +22,7 @@
                 var UserWorkspace = $injector.get("UserWorkspace");
                 var IspField = $injector.get("IspField");
                 var HostingField = $injector.get("HostingField");
+                var IssueType = $injector.get("IssueType");
                 var $log = $injector.get("$log");
                 var SweetAlert = $injector.get("SweetAlert");
 
@@ -36,6 +37,7 @@
                 $scope.fn.getIssueIspFieldList = getIssueIspFieldList;    //  ISP 紐⑸줉 �젙蹂대�� 議고쉶�븳�떎.
                 $scope.fn.getIssueHostingFieldList = getIssueHostingFieldList;    //  �샇�뒪�똿 紐⑸줉 �젙蹂대�� 議고쉶�븳�떎.
                 $scope.fn.getCompanyList = getCompanyList;          // �뾽泥�/isp/�샇�뒪�똿 紐⑸줉 議고쉶
+                $scope.fn.getIssueTypeList = getIssueTypeList;          // �씠�뒋 �쑀�삎 紐⑸줉 議고쉶
 
                 function getUserList(query, excludeList, page, callBack) {
                     var conditions = {
@@ -400,6 +402,40 @@
 
                     return deferred.promise;
                 }
+
+                function getIssueTypeList(query, excludeList, page, callBack) {
+                    var conditions = {
+                        name : query,
+                        excludeIds : (function () {
+                            var excludeIds = [];
+
+                            angular.forEach(excludeList, function (exclude) {
+                                excludeIds.push(exclude.id);
+                            });
+
+                            return excludeIds;
+                        })()
+                    };
+
+                    var deferred = $q.defer();
+
+                    IssueType.find($resourceProvider.getContent(         //  �럹�씠吏� �뾽�뜲�씠�듃媛� �븘�슂�븳 而댄룷�꼳�듃 �씪寃쎌슦, page �뾽�뜲�씠�듃媛� �엳�쓣 寃쎌슦 湲곕낯 10媛쒖뵫 媛��졇�삤怨� �븘�땺寃쎌슦 25媛쒖뵫 媛��졇�삩�떎.
+                        conditions, $resourceProvider.getPageContent($rootScope.isDefined(page) ? page : 0, $rootScope.isDefined(page) ? 10 : 25))).then(function (result) {
+                        if (result.data.message.status === "success") {
+
+                            if ($rootScope.isDefined(callBack)) {
+                                callBack(result);
+                            }
+
+                            deferred.resolve(result.data.data);
+                        }
+                        else {
+                            SweetAlert.swal($filter("translate")("issue.failedToIssueTypeListLookup"), result.data.message.message, "error"); // "�씠�뒋 �쑀�삎 紐⑸줉 議고쉶 �떎�뙣"
+                        }
+                    });
+
+                    return deferred.promise;
+                }
             }
         ]);
     }
diff --git a/src/main/webapp/views/api/apiSettingColumn.html b/src/main/webapp/views/api/apiSettingColumn.html
index f134b54..6bcf4c8 100644
--- a/src/main/webapp/views/api/apiSettingColumn.html
+++ b/src/main/webapp/views/api/apiSettingColumn.html
@@ -1,37 +1,32 @@
 <div class="row">
     <div class="col-md-4">
         <div class="form-group mb10">
-            <label for="issueAddForm4" class="issue-label"> <span
-                    translate="issue.issueType">�씠�뒋 ���엯</span>
-            </label>
-            <select id="issueAddForm4"
-                    name="issueType"
-                    class="form-control input-sm issue-select-label"
-                    ng-model="vm.form.issueTypeId"
-                    ng-change="fn.getIssueTypeCustomFields()"
-                    ng-style="{ 'color' : fn.getOptionColor(vm.issueTypes, vm.form.issueTypeId) }"
-                    required>
-                <option ng-style="{ 'color' : '#353535' }" value="">�솃�럹�씠吏� 蹂�議� 媛먯�
-                </option>
-                <option ng-style="{ 'color' : '#353535' }" value="">寃쎌쑀吏� �깘吏�
-                </option>
-                <option ng-repeat="issueType in vm.issueTypes"
-                        ng-style="{ 'color' : issueType.color, 'font-weight': 600 }"
-                        value="{{issueType.id}}">�뿈&nbsp;{{issueType.name}}
-                </option>
-            </select>
+            <label class="issue-label"> <span translate="issue.issueType">�씠�뒋 �쑀�삎</span>
+                <code class="highlighter-rouge">*</code></label>
+            <js-autocomplete-single data-input-name="issueType"
+                                    selected-model="vm.issueTypes"
+                                    search="vm.issueTypeName"
+                                    source="fn.getIssueTypeList(vm.issueTypeName, vm.issueTypes, vm.autoCompletePage.issueType.page, fn.getIssueTypeCallback)"
+                                    page="vm.autoCompletePage.issueType.page"
+                                    total-page="vm.autoCompletePage.issueType.totalPage"
+                                    input-disabled="false"
+                                    required
+                                    broad-cast="onClickIssueType"
+                                    translation-texts="{ empty : 'common.emptyIssueType' }"
+                                    extra-settings="{ displayProp : 'name' , idProp : 'id', imageable : false, imagePathProp : '',
+                                            type : '', maxlength : 200, autoResize : false, stopRemoveBodyEvent : true }"></js-autocomplete-single>
         </div>
     </div>
 
 </div>
 
 <div class="element-box">
-    <form role="form" name="issueAddForm">
+    <form role="form" name="apiSettingColumnForm">
         <div class="form-group mb10">
             <label for="issueAddForm1" class="issue-label"><span translate="issue.issueTitle">�씪媛� �젣紐�</span> </label>
             <input id="issueAddForm1"
                    class="form-control input-sm"
-                   ng-model="vm.form.title"
+                   ng-model="vm.form.issueApiDefault.title"
                    name="title"
                    required
                    kr-input
@@ -42,29 +37,23 @@
                    owl-auto-focus>
         </div>
         <div class="row">
-            <div class="col-lg-4">
-                <div class="form-group mb10">
-                    <label class="issue-label"> <span translate="common.project">�봽濡쒖젥�듃</span> </label>
-                    <select id="issueAddForm6"
-                            name="issueType"
-                            class="form-control input-sm issue-select-label"
-                            ng-model="vm.form.issueTypeId"
-                            ng-change="fn.getIssueTypeCustomFields()"
-                            ng-style="{ 'color' : fn.getOptionColor(vm.issueTypes, vm.form.issueTypeId) }"
-                            required>
-                        <option ng-style="{ 'color' : '#353535' }" value="">�솃�럹�씠吏� 蹂�議� 媛먯�
-                        </option>
-                        <option ng-style="{ 'color' : '#353535' }" value="">MCF
-                        </option>
-                        <option ng-repeat="issueType in vm.issueTypes"
-                                ng-style="{ 'color' : issueType.color, 'font-weight': 600 }"
-                                value="{{issueType.id}}">�뿈&nbsp;{{issueType.name}}
-                        </option>
-                    </select>
-                </div>
-            </div>
+<!--            <div class="col-lg-4">-->
+<!--                <div class="form-group mb10">-->
+<!--                    <label class="issue-label"> <span translate="common.project">�봽濡쒖젥�듃</span></label>-->
+<!--                    <js-autocomplete-single data-input-name="issueType"-->
+<!--                                            selected-model="vm.projects"-->
+<!--                                            search="vm.form.projectName"-->
+<!--                                            source="fn.getProjectList(vm.form.projectName, vm.projects, vm.autoCompletePage.project.page, fn.getProjectListCallback)"-->
+<!--                                            page="vm.autoCompletePage.project.page"-->
+<!--                                            total-page="vm.autoCompletePage.project.totalPage"-->
+<!--                                            input-disabled="false"-->
+<!--                                            translation-texts="{ empty : 'common.emptyProject' }"-->
+<!--                                            extra-settings="{ displayProp : 'name' , idProp : 'id', imageable : false, imagePathProp : '',-->
+<!--                                            type : '', maxlength : 200, autoResize : false, stopRemoveBodyEvent : true }"></js-autocomplete-single>-->
+<!--                </div>-->
+<!--            </div>-->
 
-            <div class="col-lg-8 bdl1">
+            <div class="col-lg-8">
                 <div class="row">
 
                     <div class="col-md-4">
@@ -75,18 +64,9 @@
                             <select id="issueAddForm2"
                                     name="priority"
                                     class="form-control input-sm issue-select-label"
-                                    ng-model="vm.form.priorityId"
+                                    ng-model="vm.form.issueApiDefault.priorityId"
                                     ng-style="{ 'color' : fn.getOptionColor(vm.priorities, vm.form.priorityId) }"
                                     required>
-                                <option value="" ng-style="{ 'color' : '#353535' }">
-                                    <span >蹂댄넻</span>
-                                </option>
-                                <option value="" ng-style="{ 'color' : '#353535' }">
-                                    <span >�넂�쓬</span>
-                                </option>
-                                <option value="" ng-style="{ 'color' : '#353535' }">
-                                    <span >�궙�쓬</span>
-                                </option>
                                 <option ng-repeat="priority in vm.priorities"
                                         ng-style="{ 'color' : priority.color, 'font-weight': 600 }"
                                         value="{{priority.id}}"
@@ -102,18 +82,9 @@
                             <select id="issueAddForm3"
                                     name="severity"
                                     class="form-control input-sm issue-select-label"
-                                    ng-model="vm.form.severityId"
+                                    ng-model="vm.form.issueApiDefault.severityId"
                                     ng-style="{ 'color' : fn.getOptionColor(vm.severities, vm.form.severityId) }"
                                     required>
-                                <option value="" ng-style="{ color : '#353535' }">
-                                    <span>蹂댄넻</span>
-                                </option>
-                                <option value="" ng-style="{ color : '#353535' }">
-                                    <span>�넂�쓬</span>
-                                </option>
-                                <option value="" ng-style="{ color : '#353535' }">
-                                    <span>�궙�쓬</span>
-                                </option>
                                 <option ng-repeat="severity in vm.severities"
                                         ng-style="{ color : severity.color, 'font-weight': 600 }"
                                         value="{{severity.id}}"
@@ -133,119 +104,18 @@
                     class="summernote"
                     lang="ko-KR"
                     summer-note-auto-focus
-                    ng-model="vm.form.description"
+                    ng-model="vm.form.issueApiDefault.description"
                     data-editor="vm.summerNote.editor"
                     data-editable="vm.summerNote.editable"
                     on-image-upload="fn.imageUpload(files)"
                     target=".note-editable"></summernote>
         </div>
 
-        <div class="row">
-            <div class="col-lg-12">
-                <div class="form-group mb10">
-                    <label for="issueAddForm5" class="issue-label"> <span translate="common.period">湲곌컙</span>
-                    </label>
-                    <input id="issueAddForm5"
-                           tabindex="-1"
-                           type="text"
-                           readonly
-                           class="form-control cursor"
-                           placeholder="{{'issue.clickToSelectDate' | translate}}"
-                           ng-model="vm.form.startCompleteDateRange"
-                           modal-form-auto-scroll
-                           date-format="YYYY-MM-DD"
-                           parent-el="'#createdWidget'"
-                           date-range-picker>
-                    <div class="row">
-                        <div class="col-xs-12">
-                            <div id="createdWidget" class="bootstrap-datepicker"></div>
-                        </div>
-                    </div>
-                </div>
-            </div>
-        </div>
-        <div class="row">
-            <div class="col-lg-3">
-                <div class="form-group mb10">
-                    <div class="form-group mb10">
-                        <label class="issue-label"> <span translate="common.assigneeTeam">�떞�떦遺��꽌</span> </label>
-                        <select id="issueAddForm"
-                                name="issueType"
-                                class="form-control input-sm issue-select-label"
-                                ng-model="vm.form.issueTypeId"
-                                ng-change="fn.getIssueTypeCustomFields()"
-                                ng-style="{ 'color' : fn.getOptionColor(vm.issueTypes, vm.form.issueTypeId) }"
-                                required>
-                            <option value="" ng-style="{ 'color' : '#353535' }"><span>議곗튂�슜�뿭</span></option>
-                            <option value="" ng-style="{ 'color' : '#353535' }"><span>遺꾩꽍�슜�뿭</span></option>
-                            <option value="" ng-style="{ 'color' : '#353535' }"><span>�긽�솴�떎</span></option>
-                            <option ng-repeat="issueType in vm.issueTypes"
-                                    ng-style="{ 'color' : issueType.color, 'font-weight': 600 }"
-                                    value="{{issueType.id}}">�뿈&nbsp;{{issueType.name}}
-                            </option>
-                        </select>
-                    </div>
-                </div>
-
-            </div>
-            <div class="col-lg-3">
-                <div class="form-group mb10">
-                    <div class="form-group mb10">
-                        <label class="issue-label"> <span>�뾽醫�</span> </label>
-                        <select id="issueAddFormIP"
-                                name="issueType"
-                                class="form-control input-sm issue-select-label"
-                                ng-model="vm.form.issueTypeId"
-                                ng-change="fn.getIssueTypeCustomFields()"
-                                ng-style="{ 'color' : fn.getOptionColor(vm.issueTypes, vm.form.issueTypeId) }"
-                                required>
-                            <option value="" translate="common.selectTarget" ng-style="{ 'color' : '#353535' }"><span>���긽 �꽑�깮</span>
-                            </option>
-                            <option ng-repeat="issueType in vm.issueTypes"
-                                    ng-style="{ 'color' : issueType.color, 'font-weight': 600 }"
-                                    value="{{issueType.id}}">�뿈&nbsp;{{issueType.name}}
-                            </option>
-                        </select>
-                    </div>
-
-
-                </div>
-            </div>
-            <div class="col-lg-3">
-                <div class="form-group mb10">
-                    <div class="form-group mb10">
-                        <label class="issue-label"> <span>�룄硫붿씤</span> </label>
-                        <input id="issueAddForm8"
-                               tabindex="-1"
-                               type="text"
-                               class="form-control cursor"
-                        />
-
-                    </div>
-
-
-                </div>
-            </div>
-            <div class="col-lg-3">
-                <div class="form-group mb10">
-                    <div class="form-group mb10">
-                        <label class="issue-label"> <span>寃쎌쑀吏�IP</span> </label>
-                        <input id="issueAddForm*"
-                               tabindex="-1"
-                               type="text"
-                               class="form-control cursor"
-                        />
-                    </div>
-
-
-                </div>
-            </div>
-        </div>
     </form>
     <div class="modal-footer buttons-on-right">
         <button type="button" class="btn btn-md btn-primary bold"
                 js-short-cut
-                js-short-cut-action="(fn.formCheck(issueStatusAddForm.$invalid) || $root.spinner) ? null : fn.formSubmit()"
+                js-short-cut-action="(fn.formCheck(apiSettingColumnForm.$invalid) || $root.spinner) ? null : fn.formSubmit()"
                 ng-click="fn.formSubmit()"><span translate="common.saved">�깮�꽦</span>
         </button>
     </div>

--
Gitblit v1.8.0