OWL ITS + 탐지시스템(인터넷 진흥원)
- 사용자 필드 기능 수정
- 이슈 추가/수정시 워크플로우에 설정된 담당부서로 변경되도록 수정
* DB 초기화 필요
1개 파일 추가됨
19개 파일 변경됨
339 ■■■■ 파일 변경됨
src/main/java/kr/wisestone/owl/domain/CustomField.java 9 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/service/DepartmentService.java 2 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/service/impl/DepartmentServiceImpl.java 29 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/service/impl/IssueServiceImpl.java 27 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/vo/CustomFieldVo.java 9 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/vo/IssueVo.java 9 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/web/condition/DepartmentCondition.java 11 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/web/controller/DepartmentController.java 11 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/web/form/CustomFieldForm.java 14 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/resources/migration/V1_12__Alter_Table.sql 7 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/resources/mybatis/query-template/project-template.xml 8 ●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/i18n/ko/global.json 1 ●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/scripts/app/customField/customFieldAdd.controller.js 5 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/scripts/app/customField/customFieldModify.controller.js 4 ●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/scripts/app/issue/issueAdd.controller.js 33 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/scripts/components/userWorkspace/userWorkspace.service.js 6 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/scripts/components/utils/autoComplete.controller.js 15 ●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/views/customField/customFieldAdd.html 1 ●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/views/issue/issueAdd.html 63 ●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/views/issue/issueModify.html 75 ●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/domain/CustomField.java
@@ -20,6 +20,7 @@
    private Long id;
    private String name;
    private String useFlag;
    private String requiredData;
    @Enumerated(EnumType.STRING)
    private CustomFieldType customFieldType;
@@ -118,4 +119,12 @@
    public void setUseFlag(String useFlag) {
        this.useFlag = useFlag;
    }
    public String getRequiredData() {
        return requiredData;
    }
    public void setRequiredData(String requiredData) {
        this.requiredData = requiredData;
    }
}
src/main/java/kr/wisestone/owl/service/DepartmentService.java
@@ -37,5 +37,7 @@
    void findProjectDepartment(Map<String, Object> resJsonData, DepartmentCondition departmentCondition);
    void findWorkflowDepartment(Map<String, Object> resJsonData, DepartmentCondition departmentCondition);
    List<Map<String, Object>> findProjectDepartment(Project project);
}
src/main/java/kr/wisestone/owl/service/impl/DepartmentServiceImpl.java
@@ -2,6 +2,7 @@
import kr.wisestone.owl.domain.*;
import kr.wisestone.owl.mapper.DepartmentMapper;
import kr.wisestone.owl.repository.WorkflowDepartmentRepository;
import kr.wisestone.owl.service.*;
import kr.wisestone.owl.util.CommonUtil;
import kr.wisestone.owl.web.condition.DepartmentCondition;
@@ -55,6 +56,12 @@
    @Autowired
    private ProjectRoleService projectRoleService;
    @Autowired
    private WorkflowDepartmentRepository workflowDepartmentRepository;
    @Autowired
    private IssueTypeService issueTypeService;
    @Autowired
    private WorkspaceService workspaceService;
@@ -156,6 +163,28 @@
        resJsonData.put(Constants.RES_KEY_CONTENTS, departmentVos);
    }
    //  워크플로우에 속해있는 부서 목록 조회
    @Override
    @Transactional(readOnly = true)
    public void findWorkflowDepartment(Map<String, Object> resJsonData, DepartmentCondition departmentCondition) {
        IssueType issueType = this.issueTypeService.getIssueType(departmentCondition.getIssueTypeId());
        Long workflowId = issueType.getWorkflow().getId();
        List<WorkflowDepartment> workflowDepartmentList = this.workflowDepartmentRepository.findByWorkflowId(workflowId);
        List<DepartmentVo> departmentVos = Lists.newArrayList();
        //List<Long> workflowDepartmentIds = Lists.newArrayList();
        if(workflowDepartmentList != null && workflowDepartmentList.size()>0){
            for(WorkflowDepartment workflowDepartment : workflowDepartmentList){
                DepartmentVo departmentVo = ConvertUtil.copyProperties(workflowDepartment.getDepartment(), DepartmentVo.class);
                departmentVo.setByName(departmentVo.getDepartmentName());
                //workflowDepartmentIds.add(workflowDepartment.getDepartment().getId());
                departmentVos.add(departmentVo);
            }
            resJsonData.put(Constants.RES_KEY_CONTENTS, departmentVos);
        }
    }
    // 부서 목록을 엑셀로 다운로드 한다.
    @Override
src/main/java/kr/wisestone/owl/service/impl/IssueServiceImpl.java
@@ -19,6 +19,7 @@
import kr.wisestone.owl.mapper.ProjectMapper;
import kr.wisestone.owl.repository.IssueRepository;
import kr.wisestone.owl.repository.UserDepartmentRepository;
import kr.wisestone.owl.repository.WorkflowDepartmentRepository;
import kr.wisestone.owl.service.*;
import kr.wisestone.owl.util.*;
import kr.wisestone.owl.util.DateUtil;
@@ -167,6 +168,9 @@
    @Autowired
    private UserDepartmentRepository userDepartmentRepository;
    @Autowired
    private WorkflowDepartmentRepository workflowDepartmentRepository;
    @Override
    protected JpaRepository<Issue, Long> getRepository() {
@@ -677,11 +681,28 @@
        issueCondition.setMyDepartmentIds(myDepartmentIds);
    }
    void SetWorkflowDepartment(List<IssueVo> issueVos){
        for(IssueVo issueVo : issueVos){
            Long issueTypeId = issueVo.getIssueTypeId();
            IssueType issueType = this.issueTypeService.getIssueType(issueTypeId);
            Long workflowId = issueType.getWorkflow().getId();
            List<WorkflowDepartment> workflowDepartmentList = this.workflowDepartmentRepository.findByWorkflowId(workflowId);
            List<Long> workflowDepartmentIds = Lists.newArrayList();
            if(workflowDepartmentList != null && workflowDepartmentList.size()>0){
                for(WorkflowDepartment workflowDepartment : workflowDepartmentList){
                    workflowDepartmentIds.add(workflowDepartment.getDepartment().getId());
                }
            }
            if(issueVo.getIssueTypeId().equals(issueTypeId)){
                issueVo.setWorkflowDepartmentIds(workflowDepartmentIds);
            }
        }
    }
    //  이슈 목록을 조회한다.
    @Override
    @Transactional(readOnly = true)
    public List<IssueVo> findIssue(Map<String, Object> resJsonData,
                                   IssueCondition issueCondition, Pageable pageable) {
    public List<IssueVo> findIssue(Map<String, Object> resJsonData, IssueCondition issueCondition, Pageable pageable) {
        //  검색 조건을 만든다
        if (!this.makeIssueSearchCondition(issueCondition, Lists.newArrayList("01", "02", "03"), pageable)) {
@@ -723,6 +744,7 @@
            totalCount = this.issueMapper.countByDepartment(issueCondition);
        }
        //  튜닝 전 - 0.8, 0.9, 0.9, 0.9, 0.9
        /*StopWatch serviceStart = new StopWatch();
        serviceStart.start();*/
@@ -738,6 +760,7 @@
        this.setMapToIssueVo(results, issueVos, issueCondition, user);
        this.setCountDownIssues(results, issueVos);
        this.SetWorkflowDepartment(issueVos); //워크플로우에 설정한 담당부서 가져오기
        resJsonData.put(Constants.RES_KEY_CONTENTS, issueVos);
        resJsonData.put(Constants.REQ_KEY_PAGE_VO, new ResPage(pageable.getPageNumber(), pageable.getPageSize(),
src/main/java/kr/wisestone/owl/vo/CustomFieldVo.java
@@ -16,6 +16,7 @@
    private List<CustomFieldValueVo> customFieldValueVos = Lists.newArrayList();
    private Boolean modifyPermissionCheck = Boolean.TRUE;   //  사용자 정의 필드는 모든 사람들이 수정, 삭제할 수 있어서 기본 값이 True
    private Boolean useCustomFieldValue = Boolean.FALSE;    //  이슈에서 사용자 정의 필드 옵션 값을 사용하고 있으면 true, 아닐경우는 false
    private String requiredData;
    public CustomFieldVo(){}
@@ -75,4 +76,12 @@
    public void setUseCustomFieldValue(Boolean useCustomFieldValue) {
        this.useCustomFieldValue = useCustomFieldValue;
    }
    public String getRequiredData() {
        return requiredData;
    }
    public void setRequiredData(String requiredData) {
        this.requiredData = requiredData;
    }
}
src/main/java/kr/wisestone/owl/vo/IssueVo.java
@@ -55,6 +55,7 @@
    private IssueVo parentIssueVo;
    private int downIssueCount;
    private int downIssueAllCount;
    private List<Long> workflowDepartmentIds; // 워크플로우에 설정한 담당부서 ID
    private List<IssueCompanyVo> issueCompanyVos;
    private List<IssueIspVo> issueIspVos;
@@ -475,4 +476,12 @@
    public void setDownIssueAllCount(int downIssueAllCount) {
        this.downIssueAllCount = downIssueAllCount;
    }
    public List<Long> getWorkflowDepartmentIds() {
        return workflowDepartmentIds;
    }
    public void setWorkflowDepartmentIds(List<Long> workflowDepartmentIds) {
        this.workflowDepartmentIds = workflowDepartmentIds;
    }
}
src/main/java/kr/wisestone/owl/web/condition/DepartmentCondition.java
@@ -18,8 +18,9 @@
    private Long projectId;
    private List<Long> excludeIds = Lists.newArrayList();
    private List<Long> departmentIds = Lists.newArrayList();
    private Long issueTypeId;
    private Integer Page;
    private Integer PageSize;
@@ -105,4 +106,12 @@
    public void setExcludeIds(List<Long> excludeIds) {
        this.excludeIds = excludeIds;
    }
    public Long getIssueTypeId() {
        return issueTypeId;
    }
    public void setIssueTypeId(Long issueTypeId) {
        this.issueTypeId = issueTypeId;
    }
}
src/main/java/kr/wisestone/owl/web/controller/DepartmentController.java
@@ -102,6 +102,17 @@
        return this.setSuccessMessage(resJsonData);
    }
    //  워크플로우에 속해있는 부서 목록 조회
    @RequestMapping(value = "/department/findWorkflowDepartment", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE)
    public
    @ResponseBody
    Map<String, Object> findWorkflowDepartment(@RequestBody Map<String, Map<String, Object>> params) {
        Map<String, Object> resJsonData = new HashMap<>();
        this.departmentService.findWorkflowDepartment(resJsonData, DepartmentCondition.make(params.get(Constants.REQ_KEY_CONTENT)));
        return this.setSuccessMessage(resJsonData);
    }
    // 부서 엑셀 다운로드
    @RequestMapping(value = "/department/downloadExcel", method = RequestMethod.POST)
src/main/java/kr/wisestone/owl/web/form/CustomFieldForm.java
@@ -19,6 +19,7 @@
    private Long workspaceId;
    private List<Long> removeIds = Lists.newArrayList();
    private String useFlag;
    private String requiredData;
    public CustomFieldForm(){}
@@ -33,6 +34,11 @@
            form.setOptions(MapUtil.getStrings(params, "options"));
        }
        if (MapUtil.getBoolean(params, "requiredData")) {
            form.setRequiredData("Y");
        }else {
            form.setRequiredData("N");
        }
        return form;
    }
@@ -103,4 +109,12 @@
    public void setUseFlag(String useFlag) {
        this.useFlag = useFlag;
    }
    public String getRequiredData() {
        return requiredData;
    }
    public void setRequiredData(String requiredData) {
        this.requiredData = requiredData;
    }
}
src/main/resources/migration/V1_12__Alter_Table.sql
New file
@@ -0,0 +1,7 @@
-- 필수 데이터 여부
ALTER TABLE `custom_field` ADD COLUMN  `required_data` VARCHAR(1) NOT NULL DEFAULT 'N';
-- 도메인 항목 추가
ALTER TABLE `company_field` ADD COLUMN  `url` VARCHAR(255) NULL;
ALTER TABLE `isp_field` ADD COLUMN  `url` VARCHAR(255) NULL;
ALTER TABLE `hosting_field` ADD COLUMN  `url` VARCHAR(255) NULL;
src/main/resources/mybatis/query-template/project-template.xml
@@ -331,7 +331,7 @@
    <!--    해당 업무 공간에서 참여하고 있는 진행중인 프로젝트를 조회한다  -->
    <!--<select id="findByWorkspaceIdAndIncludeProjectAll" resultType="java.util.HashMap"
    <select id="findByWorkspaceIdAndIncludeProjectAll" resultType="java.util.HashMap"
            parameterType="kr.wisestone.owl.web.condition.ProjectCondition">
        SELECT
        DISTINCT p.id as id,
@@ -367,9 +367,9 @@
                </foreach>
            </when>
        </choose>
    </select>-->
    </select>
    <select id="findByWorkspaceIdAndIncludeProjectAll" resultType="java.util.HashMap"
    <!--<select id="findByWorkspaceIdAndIncludeProjectAll" resultType="java.util.HashMap"
            parameterType="kr.wisestone.owl.web.condition.ProjectCondition">
        SELECT
        DISTINCT p.id as id,
@@ -406,7 +406,7 @@
                </foreach>
            </when>
        </choose>
    </select>
    </select>-->
    <!--    해당 업무 공간에서 참여하고 있는 진행중인 프로젝트를 조회한다  -->
    <!--<select id="findByWorkspaceIdAndIncludeProject" resultType="java.util.HashMap"
src/main/webapp/i18n/ko/global.json
@@ -207,6 +207,7 @@
        "initializedIssueStatus": "이슈 유형을 변경할 경우 사용자 정의 필드, 이슈 상태가 초기화 됩니다.",
        "clickToSelectDate": "클릭하면 날짜를 선택할 수 있습니다.",
        "notIssueTypeCustomFields": "이슈 유형에 연결된 사용자 정의 필드가 없습니다.",
        "pleaseEnterIssueTypeCustomFields": "해당 사용자정의필드는 필수 입력 값 입니다.",
        "attachOnlyFiles": "hwp, jpg, png, txt, pptx, ppt, pdf, xlsx, xls, docx, zip, gif, jpeg, doc, tif, bmp, wmv, avi, mp4, mkv, mov 파일만 첨부할 수 있습니다.",
        "registerExcelIssues": "엑셀로 이슈 등록하기",
        "videoExample": "동영상 예제",
src/main/webapp/scripts/app/customField/customFieldAdd.controller.js
@@ -30,7 +30,8 @@
                        ipAdress : "",
                        email : "",
                        site : "",
                        tel : ""
                        tel : "",
                        requiredData : ""
                    }
                };
@@ -106,7 +107,6 @@
                            return true;
                        }
                    }
                    return false;
                }
@@ -116,7 +116,6 @@
                    var content = angular.copy($scope.vm.form);
                    content.name = $rootScope.preventXss(content.name);
                    if ($scope.vm.form.customFieldType === 'MULTI_SELECT'|| $scope.vm.form.customFieldType === "SINGLE_SELECT") {
                        var convertDefaultValues = "";
src/main/webapp/scripts/app/customField/customFieldModify.controller.js
@@ -39,7 +39,8 @@
                        ipAdress : "",
                        email : "",
                        site : "",
                        tel : ""
                        tel : "",
                        requiredData: ""
                    },
                    origin : {
                        options : []    //  옵션 값 변경 여부 확인을 위해 서버에서 내려올 때 원본 값을 따로 관리한다.
@@ -217,6 +218,7 @@
                                $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;
                                angular.forEach(result.data.data.customFieldValueVos, function (customFieldValueVo) {
                                    $scope.vm.form.options.push(customFieldValueVo.value);
src/main/webapp/scripts/app/issue/issueAdd.controller.js
@@ -58,7 +58,8 @@
                        attachedFiles : [], //  섬머노트로 파일 업로드를 할 경우 서버에서 pk를 따고 issue id와 연동 작업이 필요하다.
                        startCompleteDateRange : "", //  시작일 ~ 종료일
                        detectingDateRange : "", //  탐지일
                        issueCustomFields : []  //  이슈에서 사용되는 사용자 정의 필드
                        issueCustomFields : [],  //  이슈에서 사용되는 사용자 정의 필드
                        requiredDatas : []  // 사용자 정의 필드 필수 데이터 체크
                    },
                    infiniteAdd : false,    //  연속 생성
                    projectName : "",   //  프로젝트 명 검색
@@ -558,6 +559,30 @@
                        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 = [];
@@ -686,6 +711,7 @@
                //  이슈 유형에 연결된 사용자 정의 필드
                function getIssueTypeCustomFields() {
                    $scope.vm.form.issueCustomFields = [];
                    $scope.vm.form.requiredDatas = [];
                    //  이슈 타입 아이디나 프로젝트 아이디가 없으면 통신을 하지 않는다.
                    if (!$rootScope.isDefined($scope.vm.form.issueTypeId) || $scope.vm.form.projects.length < 1) {
                        return;
@@ -701,6 +727,7 @@
                        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" :
@@ -728,8 +755,10 @@
                                        });
                                        break;
                                }
                                $scope.vm.form.issueCustomFields.push(issueTypeCustomField);
                                if(issueTypeCustomField.customFieldVo.requiredData === "Y") {
                                    $scope.vm.form.requiredDatas.push(issueTypeCustomField.customFieldVo.requiredData);
                                }
                            });
                        }
                        else {
src/main/webapp/scripts/components/userWorkspace/userWorkspace.service.js
@@ -75,6 +75,12 @@
                    return response;
                });
            },
            findWorkflowDepartment : function (conditions) {
                return $http.post("department/findWorkflowDepartment", conditions).then(function (response) {
                    $log.debug("워크플로우에 속해있는 부서 목록 조회 : ", response);
                    return response;
                });
            },
            
            //사용자 관리
            find : function (conditions) {
src/main/webapp/scripts/components/utils/autoComplete.controller.js
@@ -312,6 +312,7 @@
                function getIssueDepartmentList(query, excludeList, page, callBack) {
                    var conditions = {
                        issueTypeId : $scope.vm.form.issueTypeId,
                        departmentName : query,
                        userId : $rootScope.user.id,
                        projectId : (function () {
@@ -339,15 +340,21 @@
                    var deferred = $q.defer();
                    //프로젝트에 속해있는 담당부서 찾기
                    UserWorkspace.findProjectDepartment($resourceProvider.getContent(         //  페이징 업데이트가 필요한 컴포넌트 일경우, page 업데이트가 있을 경우 기본 10개씩 가져오고 아닐경우 25개씩 가져온다.
                    //워크플로우에 속해있는 담당부서 찾기
                    UserWorkspace.findWorkflowDepartment($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") {
                            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 ($rootScope.isDefined(callBack)) {
                                callBack(result);
                            }
                            deferred.resolve(result.data.data);
                            deferred.resolve(filterDepartments);
                        }
                        else {
                            SweetAlert.swal($filter("translate")("common.failedToProjectListLookUp"), result.data.message.message, "error"); // "프로젝트 목록 조회 실패"
src/main/webapp/views/customField/customFieldAdd.html
@@ -34,6 +34,7 @@
            <div class="form-group">
                <label for="customFieldAddForm2"><span translate="customField.fieldType">필드 유형</span> <code
                        class="highlighter-rouge">*</code></label>
                &nbsp;&nbsp; <label> <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>
src/main/webapp/views/issue/issueAdd.html
@@ -236,62 +236,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="issueAddForm.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="issueAddForm.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="issueAddForm.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="issueAddForm.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="issueAddForm.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="issueAddForm.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"
@@ -300,16 +337,28 @@
                                            {{customFieldValueVo.value}}
                                        </option>
                                    </select>
                                    <small class="help-block form-text text-danger"
                                           ng-show="issueCustomField.customFieldVo.requiredData == 'Y'"
                                           ng-if="issueAddForm.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="issueAddForm.multiSelect.$error.required"
                                           translate="issue.pleaseEnterIssueTypeCustomFields">해당 사용자 정의 필드는 필수 입력 값 입니다.
                                    </small>
                                </div>
                            </div>
                        </div>
src/main/webapp/views/issue/issueModify.html
@@ -212,18 +212,6 @@
                </div>
            </div>
            <div class="row">
                <div class="col-sm-4">
                    <select id="relationIssueType"
                            name="relationIssueType"
                            class="form-control input-sm"
                            ng-options="option.name for option in vm.relationIssueTypes track by option.id"
                            ng-model="vm.relationIssueType"
                            required>
                    </select>
                </div>
            </div>
            <hr>
            <div class="row">
                <div class="col-lg-4 fontcolor_green">
@@ -248,62 +236,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="issueAddForm.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="issueAddForm.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="issueAddForm.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="issueAddForm.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="issueAddForm.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="issueAddForm.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"
@@ -312,16 +337,28 @@
                                            {{customFieldValueVo.value}}
                                        </option>
                                    </select>
                                    <small class="help-block form-text text-danger"
                                           ng-show="issueCustomField.customFieldVo.requiredData == 'Y'"
                                           ng-if="issueAddForm.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="issueAddForm.multiSelect.$error.required"
                                           translate="issue.pleaseEnterIssueTypeCustomFields">해당 사용자 정의 필드는 필수 입력 값 입니다.
                                    </small>
                                </div>
                            </div>
                        </div>