OWL ITS + 탐지시스템(인터넷 진흥원)
이슈 상세 페이지에
"일반 메일 보내기 기능 추가"
이메일 템플릿 명칭 변경 -> 업체 이메일
이메일 템플릿 제목 추가
2개 파일 추가됨
12개 파일 변경됨
368 ■■■■ 파일 변경됨
src/main/java/kr/wisestone/owl/service/IssueService.java 3 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/service/impl/IssueServiceImpl.java 31 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/web/controller/IssueController.java 12 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/assets/styles/main.css 8 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/i18n/ko/global.json 13 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/scripts/app/issue/issue.js 2 ●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/scripts/app/issue/issueCommonSendMail.controller.js 111 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/scripts/app/issue/issueDetail.controller.js 16 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/scripts/app/issue/issueSendMailPartners.controller.js 21 ●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/scripts/components/issue/issue.service.js 6 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/scripts/main.js 4 ●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/views/issue/issueCommonSendMail.html 69 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/views/issue/issueDetail.html 3 ●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/views/issue/issueSendMailPartners.html 69 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/service/IssueService.java
@@ -9,6 +9,7 @@
import kr.wisestone.owl.web.condition.DepartmentCondition;
import kr.wisestone.owl.web.condition.IssueCondition;
import kr.wisestone.owl.web.condition.ProjectCondition;
import kr.wisestone.owl.web.form.EmailCommonForm;
import kr.wisestone.owl.web.form.EmailTemplateForm;
import kr.wisestone.owl.web.form.IssueApiForm;
import kr.wisestone.owl.web.form.IssueForm;
@@ -112,4 +113,6 @@
    void setCountDownIssues(List<IssueVo> issueVos);
    void makeIssueMapToIssue(Issue issue, Map<String, Object> issueMap);
    void sendCommonEmail(EmailCommonForm make);
}
src/main/java/kr/wisestone/owl/service/impl/IssueServiceImpl.java
@@ -3564,6 +3564,37 @@
        this.issueHistoryService.addIssueHistory(issue, IssueHistoryType.SEND, sb.toString());
    }
    @Override
    public void sendCommonEmail(EmailCommonForm emailCommonForm) {
        if (emailCommonForm.getSendEmails().size() < 1) {
            throw new OwlRuntimeException(
                    this.messageAccessor.getMessage(MsgConstants.ISSUE_NOT_SEND_USER));
        } else if (emailCommonForm.getIssueId() == null) {
            throw new OwlRuntimeException(
                    this.messageAccessor.getMessage(MsgConstants.ISSUE_NOT_EXIST));
        }
        Issue issue = this.getIssue(emailCommonForm.getIssueId());
        //  발신자 표시
        User user = this.webAppUtil.getLoginUserObject();
        UserVo toUser = this.webAppUtil.getLoginUser();
        //  사용자 시스템 기능 사용 정보 수집
        log.info(ElasticSearchUtil.makeUserActiveHistoryMessage(this.webAppUtil.getLoginUser(), ElasticSearchConstants.ISSUE_ANOTHER_USER_SEND_EMAIL));
        StringBuilder sb = new StringBuilder();
        Locale locale = CommonUtil.getUserLanguage(user.getLanguage());
        String[] sendMails = ConvertUtil.ToArray(emailCommonForm.getSendEmails());
        for(int i=0; i < sendMails.length; i++) {
            sendMails[i] = CommonUtil.decryptAES128(sendMails[i]);
        }
        this.systemEmailService.sendEmail(emailCommonForm.getTitle(), emailCommonForm.getDescription(), sendMails, null);
        this.issueHistoryService.detectSendIssueMail(IssueHistoryType.SEND, emailCommonForm.getSendEmails(), sb);
        this.issueHistoryService.addIssueHistory(issue, IssueHistoryType.SEND, sb.toString());
    }
    //  예약 발생 이슈를 실행한다
    @Override
    @Transactional
src/main/java/kr/wisestone/owl/web/controller/IssueController.java
@@ -7,6 +7,7 @@
import kr.wisestone.owl.web.condition.ApiMonitorCondition;
import kr.wisestone.owl.web.condition.DepartmentCondition;
import kr.wisestone.owl.web.condition.IssueCondition;
import kr.wisestone.owl.web.form.EmailCommonForm;
import kr.wisestone.owl.web.form.EmailTemplateForm;
import kr.wisestone.owl.web.form.IssueForm;
import org.slf4j.Logger;
@@ -245,6 +246,17 @@
    }
    // 일반 메일 발송 (사용자 직접 작성)
    @RequestMapping(value = "/issue/sendCommonEmail", produces = MediaType.APPLICATION_JSON_VALUE)
    public
    @ResponseBody
    Map<String, Object> sendCommonEmail(@RequestBody Map<String, Map<String, Object>> params) {
        Map<String, Object> resJsonData = new HashMap<>();
        this.issueService.sendCommonEmail(EmailCommonForm.make(params.get(Constants.REQ_KEY_CONTENT)));
        return this.setSuccessMessage(resJsonData);
    }
    //  api 기록 조회
    @RequestMapping(value = "/api/findHistory", produces = MediaType.APPLICATION_JSON_VALUE)
    public
src/main/webapp/assets/styles/main.css
@@ -11310,6 +11310,14 @@
    font-size: 0.79rem;
}
.select3-selection__email__remove {
    color: #0066ff;
    margin-left: 8px;
    margin-top: 7px;
    cursor: pointer;
    font-size: 0.79rem;
}
.select4-selection__choice {
    font-size: 0.66rem;
    letter-spacing: -0.01em;
src/main/webapp/i18n/ko/global.json
@@ -281,12 +281,16 @@
        "setIssueRelationTableDisplay": "연관 이슈 테이블 표시 설정",
        "setIssueDownTableDisplay": "하위 이슈 테이블 표시 설정",
        "columnName": "컬럼명",
        "selectPartners": "업체 선택",
        "partners" : "업체 이메일",
        "area": "넓이",
        "displayed": "표시 여부",
        "sequence": "순서",
        "cannotChangedIssueTitle": "이슈 제목은 변경할 수 없습니다.",
        "cannotChangedIssueType": "이슈 구분은 변경할 수 없습니다.",
        "selectSendIssueMail": "이슈 메일 발송 대상자 선택",
        "selectSendIssueMail": "업체 메일 발송",
        "CommonSendIssueMail": "일반 메일 발송",
        "SendIssueMail": "메일 발송 입력",
        "sendIssueSelectedUsers": "프로젝트에 참여하고 있는 다른 사용자에게 이슈 정보를 보냅니다.",
        "sendMail": "이메일 발송",
        "changedHistory": "이슈 변경 이력 상세정보",
@@ -327,6 +331,10 @@
        "succeededIssueMail": "이슈 메일 발송 완료",
        "sentToTheSelectedUser": "선택한 사용자에게 이메일이 발송되었습니다.",
        "failedIssueMail": "이슈 메일 발송 실패",
        "selectedPartnersMail": "업체 이메일을 선택하세요.",
        "selectedPartnersTemplate": "업체 이메일 템플릿을 선택해주세요.",
        "writeIssueMail": "이메일을 입력해주세요.",
        "writeMail": "이메일을 입력하셔야 추가할수 있습니다.",
        "issueVersionLookupFailed": "이슈 버전 조회 실패",
        "relationIssueType1" : "다음 이슈와 관련됨",
        "relationIssueType2" : "다음 이슈에 중복됨",
@@ -694,6 +702,8 @@
        "checkAll": "전체 선택",
        "unCheckAll": "전체 해제",
        "send": "보내기",
        "emailExplain": "받는 사람의 이메일 형식을 입력하셔야 합니다.",
        "sendToPerson" : "다른 사용자에게 메일을 보냅니다.",
        "selected": "선택됨",
        "selectable": "선택 가능",
        "password": "비밀번호",
@@ -710,6 +720,7 @@
        "priority": "우선 순위",
        "importance": "중요도",
        "assignee": "담당자",
        "toPerson": "받는 사람",
        "assigneeTeam" : "담당부서",
        "register": "등록자",
        "startDate": "시작일",
src/main/webapp/scripts/app/issue/issue.js
@@ -37,7 +37,7 @@
                                'chartLoader', 'jsTable', 'jsTree', 'tableColumnGenerator', 'treeColumnGenerator', 'modalFormAutoScroll', 'summerNote', 'summerNote-ko-KR', 'fullScroll', 'workflowService', 'priorityService', 'issueSearchService', 'issueTableConfigService', 'inputRegex',
                                'severityService', 'issueTypeService', 'issueTypeCustomFieldService', 'issueService', 'issueStatusService', 'emailTemplateService','issueUserService','issueDepartmentService','issueModifyUserController', 'issueModifyDepartmentController', 'customFieldService', 'issueSearchFieldKeyViewElement',
                                'issueSearchCustomFieldViewElement', 'tableUserImage', 'fullScroll', 'issueCommentService', 'detectIssueEditor', 'formSubmit', 'issueModifyStatusController', 'downIssueModifyStatusController', 'jsShortCut',
                                'issueAddTableConfigController','issueAddRelationTableConfigController','issueAddDownTableConfigController','domAppend', 'issueDetailImagePreview', 'issueSendMailPartnersController', 'htmlDiff', 'issueVersionViewController', 'issueVersionService',
                                'issueAddTableConfigController','issueAddRelationTableConfigController','issueAddDownTableConfigController','domAppend', 'issueDetailImagePreview', 'issueSendMailPartnersController', 'issueCommonSendMailController', 'htmlDiff', 'issueVersionViewController', 'issueVersionService',
                                'jsHtmlDiff', 'issueReservationController', 'issueReservationService', 'issueVersionService', 'issueStatusAutoFocus', 'issueRelationService'
                            ], function () {
                                deferred.resolve();
src/main/webapp/scripts/app/issue/issueCommonSendMail.controller.js
New file
@@ -0,0 +1,111 @@
'use strict';
define([
        'app'
    ],
    function (app) {
        app.controller('issueCommonSendMailController', ['$scope', '$rootScope', '$state', '$log', '$resourceProvider', '$uibModalInstance', '$controller', '$injector', '$q','SweetAlert', '$filter', 'Issue', 'parameter',
            function ($scope, $rootScope, $state, $log, $resourceProvider, $uibModalInstance, $controller, $injector, $q, SweetAlert, $filter, Issue, parameter) {
                $scope.fn = {
                    cancel : cancel,    //  팝업 창 닫기
                    formSubmit : formSubmit,    //  폼 전송
                    formCheck : formCheck,   //  폼 체크
                    addInput : addInput,
                    removeInput : removeInput
                };
                $scope.vm = {
                    form : {
                        issueId : parameter.issueId,
                        title : "",
                        description: "",
                        inputs : [0],
                        emails : {},    //  입력된 사용자 이메일
                    },
                    userName : "",
                    autoCompletePage : {
                        user : {
                            page : 0,
                            totalPage : 0
                        }
                    }
                };
                // 폼 체크
                function formCheck(formInvalid) {
                    if (formInvalid) {
                        return true;
                    }
                    return false;
                }
                // 메일 주소 input 창 추가 버튼
                function addInput() {
                    var arrayFull = true;      // 배열이 가득 차 있는지 여부
                    var index = 0;
                    $scope.vm.form.inputs.forEach(function (email) {
                        if (!$rootScope.isDefined($scope.vm.form.emails[index])) {
                            arrayFull = false;
                        }
                        index++;
                    });
                    if (arrayFull) {
                        $scope.vm.form.inputs.push(index);
                        $scope.vm.form.emails[index] = ""
                    } else {
                        SweetAlert.warning($filter("translate")("issue.writeIssueMail"), $filter("translate")("issue.writeMail")); // 추가버튼 경고
                    }
                }
                //  폼 전송
                function formSubmit() {
                    $rootScope.spinner = true;
                    var content = {
                        issueId : $scope.vm.form.issueId,
                        title : $scope.vm.form.title,
                        description : $scope.vm.form.description,
                        sendEmails : (function () {
                            var sendEmails = [];
                            var index = 0
                            $scope.vm.form.inputs.forEach(function (email) {
                                if ($rootScope.isDefined($scope.vm.form.emails[index])) {
                                    sendEmails.push($rootScope.encryption($scope.vm.form.emails[index]));   // 이메일주소 암호화
                                }
                                index++;
                            });
                            return sendEmails;
                        })()
                    };
                    Issue.sendCommonEmail($resourceProvider.getContent(
                        content,
                        $resourceProvider.getPageContent(0, 10))).then(function (result) {
                        if (result.data.message.status === "success") {
                            SweetAlert.success($filter("translate")("issue.succeededIssueMail"), $filter("translate")("issue.sentToTheSelectedUser")); // "이슈 메일 발송 완료"
                            $scope.fn.cancel();
                        }
                        else {
                            SweetAlert.error($filter("translate")("issue.failedIssueMail"), result.data.message.message); // "이슈 메일 발송 실패"
                        }
                        $rootScope.spinner = false;
                    });
                }
                // 이메일 주소 input 삭제
                function removeInput(index) {
                    $scope.vm.form.inputs.splice(index, 1);
                }
                function cancel() {
                    $rootScope.$broadcast("closeLayer");    //  팝업이 열리고 나서 js-multi, js-single 등에서 body 이벤트가 날아가는 현상 수정
                    $uibModalInstance.dismiss('cancel');
                    $(document).unbind("keydown");  //  단축키 이벤트 제거
                }
            }]);
    });
src/main/webapp/scripts/app/issue/issueDetail.controller.js
@@ -53,6 +53,7 @@
                $scope.fn.issueBack = issueBack;
                $scope.fn.removeRelationIssue = removeRelationIssue;
                $scope.fn.removeDownIssue = removeDownIssue;
                $scope.fn.sendCommonMail = sendCommonMail;
                //  이슈 목록 컨트롤러 vm, fn 상속 중
                $scope.vm.viewer = {};      // 현재 이슈
@@ -1290,6 +1291,21 @@
                    });
                }
                // 일반 메일 발송 (사용자 직접 작성)
                function sendCommonMail() {
                    $uibModal.open({
                        templateUrl : 'views/issue/issueCommonSendMail.html',
                        size : "md",
                        controller : 'issueCommonSendMailController',
                        backdrop : 'static',
                        resolve : {
                            parameter : {
                                issueId : $scope.vm.viewer.id,
                            }
                        }
                    });
                }
                function getParametersAll() {
                    var params = $scope.fn.getParameters(null, $scope.vm.viewer.issueCompanyVos);
                    params = $scope.fn.getParameters(params, $scope.vm.viewer.issueIspVos);
src/main/webapp/scripts/app/issue/issueSendMailPartners.controller.js
@@ -17,7 +17,6 @@
                    formCheck : formCheck,   //  폼 체크
                    onChangeEmailTemplate : onChangeEmailTemplate, // 이메일 템플릿 선택시 실행
                    getEmailTemplateList : getEmailTemplateList // 이메일 템플릿 목록 가져오기
                    // showEmailTemplate : showEmailTemplate,
                };
                $scope.vm = {
@@ -26,6 +25,7 @@
                    hostingVos : parameter.hostingVos,
                    partners : parameter.partnersAll.slice(),
                    html : "",
                    tab : "SEND_TEMPLATE",
                    form : {
                        id : parameter.issueId,  //  이슈 번호
                        projects : [{ id : parameter.projectId}],  //  프로젝트
@@ -59,7 +59,8 @@
                            $scope.vm.html = result.data.data.template;
                        }
                        else {
                            SweetAlert.error($filter("translate")("issue.failedIssueMail"), result.data.message.message); // "이슈 메일 발송 실패"
                            $scope.vm.html = "";
                            //SweetAlert.warning($filter("translate")("issue.selectedPartnersMail"),$filter("translate")("issue.selectedPartnersTemplate")); // option 선택 경고
                        }
                        $rootScope.spinner = false;
@@ -85,14 +86,13 @@
                    $scope.vm.emailTemplateId = 1;
                    $scope.vm.emailTitle = "";
                    $scope.vm.emailTemplates.forEach(function (emailTemplate) {
                        /*if (emailTemplate.id === $scope.vm.emailTemplateId) {
                            $scope.vm.emailTitle = emailTemplate.title;
                        }*/
                        if (emailTemplate.templateType === $scope.vm.emailTemplateType) {
                            $scope.vm.emailTitle = emailTemplate.title;
                        }
                    })
                    if ($rootScope.isDefined($scope.vm.emailTemplateType)) {
                        $scope.vm.emailTemplates.forEach(function (emailTemplate) {
                            if (emailTemplate.templateType === $scope.vm.emailTemplateType) {
                                $scope.vm.emailTitle = emailTemplate.title;
                            }
                        })
                    }
                }
@@ -182,6 +182,7 @@
                }
                $scope.fn.getEmailTemplateList();
            }]);
    });
src/main/webapp/scripts/components/issue/issue.service.js
@@ -144,6 +144,12 @@
                    $log.debug("이슈 이메일 발송 결과 : ", response);
                    return response;
                });
            },
            sendCommonEmail : function (conditions) {
                return $http.post("issue/sendCommonEmail", conditions).then(function (response) {
                    $log.debug("이슈 이메일 발송 결과 : ", response);
                    return response;
                });
            }
        }
    }
src/main/webapp/scripts/main.js
@@ -191,7 +191,8 @@
        'issueAddTableConfigController' : 'app/issue/issueAddTableConfig.controller',   //  이슈 테이블 설정 컨트롤러
        'issueAddRelationTableConfigController' : 'app/issue/issueAddRelationTableConfig.controller',   //  이슈 테이블 설정 컨트롤러
        'issueAddDownTableConfigController' : 'app/issue/issueAddDownTableConfig.controller',   //  이슈 테이블 설정 컨트롤러
        'issueSendMailPartnersController' : 'app/issue/issueSendMailPartners.controller',   //  이슈 이메일 발송 컨트롤러
        'issueSendMailPartnersController' : 'app/issue/issueSendMailPartners.controller',   //  업체 이메일 발송 컨트롤러
        'issueCommonSendMailController' : 'app/issue/issueCommonSendMail.controller',   //  일반 이메일 발송 컨트롤러
        'issueVersionViewController' : 'app/issue/issueVersionView.controller', //  이슈 버전 확인 컨트롤러
        'issueReservationController' : 'app/issue/issueReservation.controller', //  이슈 발생 예약 컨트롤러
        'issueModifyUserController' : 'app/issue/issueModifyUser.controller', // 이슈 담당자 컨트롤러
@@ -506,6 +507,7 @@
    'config',   //  angularJs 설정 - route 이동 관련, 이동시 초기화 로직이 들어있다. - 직접 로드
    'constants',
    'commonController',
    'issueCommonSendMailController',
    'autoCompleteController',
    'userInviteController',
    'issueAddController',   //  이슈 만들기에서 사용
src/main/webapp/views/issue/issueCommonSendMail.html
New file
@@ -0,0 +1,69 @@
<div class="formModal">
    <div class="modal-header faded smaller">
        <div class="modal-title">
            <strong translate="issue.CommonSendIssueMail">일반 메일 발송</strong>
        </div>
        <button aria-label="Close" class="close" type="button" ng-click="fn.cancel()">
            <span aria-hidden="true"> &times;</span>
        </button>
    </div>
    <div class="modal-body">
        <form role="form" name="issueSendForm">
            <button type="button" class="btn btn-secondary mr-3 float-right mb-1" ng-click="fn.addInput()">
                <span translate="common.add">추가</span>
            </button>
            <div class="form-group">
                <label class="issue-label mt-2"><span translate="common.toPerson">받는 사람</span>&nbsp;<code class="highlighter-rouge">*</code></label>
                <div class="input-group" ng-repeat="i in vm.form.inputs">
                    <input type="text"
                           name="email"
                           class="form-control mt-1"
                           kr-input
                           ng-model="vm.form.emails[$index]"
                           ng-pattern="/^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/"
                           required
                           autocomplete="off">
                    <span class="select3-selection__email__remove" ng-click="fn.removeInput($index)">×</span>
                </div>
                <small translate="common.emailExplain">받는 사람의 이메일 형식을 입력하셔야 합니다.</small>
                <div ng-if="issueSendForm.email.$error.pattern" class="help-block form-text text-danger"
                     translate="common.invalidEmailFormat">이메일 형식이 맞지 않습니다.
                </div>
            </div>
            <label class="issue-label"><span translate="common.title">제목</span></label>
            <input id="title"
                   type="text"
                   name="title"
                   class="form-control mt-1"
                   kr-input
                   ng-model="vm.form.title"
                   autocomplete="off">
            <div class="form-group mb10 mt-10">
                <label class="issue-label"><span translate="common.content">내용</span></label>
                <summernote
                        class="summernote mt-1"
                        lang="ko-KR"
                        summer-note-auto-focus
                        ng-model="vm.form.description"
                        data-editor="vm.summerNote.editor"
                        data-editable="vm.summerNote.editable"
                        on-image-upload="fn.imageUpload(files)"
                        target=".note-editable"></summernote>
            </div>
            <small class="mt-1" translate="common.sendToPerson">다른 사용자에게 메일을 보냅니다.</small>
        </form>
    </div>
    <div class="modal-footer buttons-on-right">
        <button type="button" class="btn btn-md btn-grey" ng-click="fn.cancel()"><span
                translate="common.cancel">취소</span></button>
        <button type="button" class="btn btn-md btn-primary bold"
                ng-disabled="fn.formCheck(issueSendForm.$invalid)"
                ng-click="fn.formSubmit()"><span translate="issue.sendMail">이메일 발송</span>
        </button>
    </div>
</div>
src/main/webapp/views/issue/issueDetail.html
@@ -102,7 +102,8 @@
                </div>
            </span>
            <a class="show-ticket-info cursor">
                <i class="os-icon os-icon-email-forward mr-20" ng-if="vm.viewer.modifyPermissionCheck" ng-click="fn.sendMailAll()" data-toggle="tooltip" data-placement="right" title="다른 사용자에게 이슈 보내기"></i>
                <i class="os-icon os-icon-email-2-at2 mr-20" ng-if="vm.viewer.modifyPermissionCheck" ng-click="fn.sendCommonMail()" data-toggle="tooltip" data-placement="right" title="직접 작성한 메일 보내기"></i>
                <i class="os-icon os-icon-email-forward mr-20" ng-if="vm.viewer.modifyPermissionCheck" ng-click="fn.sendMailAll()" data-toggle="tooltip" data-placement="right" title="업체 메일 보내기"></i>
                <i class="os-icon os-icon-airplay mr-20" ng-click="fn.versionView(vm.viewer.id)" data-toggle="tooltip" data-placement="right" title="이슈 변경 이력 상세 보기"></i>
                <i class="os-icon os-icon-calendar-time mr-20" ng-if="vm.viewer.modifyPermissionCheck"
                   ng-click="fn.reservation(vm.viewer.id)" data-toggle="tooltip" data-placement="right" title="이슈 발생 예약 하기"></i>
src/main/webapp/views/issue/issueSendMailPartners.html
@@ -1,7 +1,7 @@
<div class="formModal">
    <div class="modal-header faded smaller">
        <div class="modal-title">
            <strong translate="issue.selectSendIssueMail">이슈 메일 발송 대상자 선택</strong>
            <strong translate="issue.selectSendIssueMail">이슈 메일 발송</strong>
        </div>
        <button aria-label="Close" class="close" type="button" ng-click="fn.cancel()">
            <span aria-hidden="true"> &times;</span>
@@ -20,6 +20,9 @@
                    </span>
                </div>
                <label class="issue-label mt-10">
                    <span translate="issue.selectPartners">업체 선택</span>&nbsp;<code class="highlighter-rouge">*</code>
                </label>
                <js-input-autocomplete data-input-name="mailUsers"
                                       owl-auto-focus
                                       target=".auto-complete-i0nput"
@@ -29,38 +32,50 @@
                                       page="vm.autoCompletePage.user.page"
                                       total-page="vm.autoCompletePage.user.totalPage"
                                       source="fn.getMailTargetAll(vm.form.mailUsers)"
                                       translation-texts="{ empty : 'common.emptyUser'}"
                                       translation-texts="{ empty : 'common.emptyCompanyPartners'}"
                                       input-disabled="vm.form.mailUsers == null"
                                       extra-settings="{ displayProp : 'name' , idProp : 'id', imageable : false, imagePathProp : 'profile',
                                       type : 'partner', maxlength : 100, autoResize : true, stopRemoveBodyEvent : true }"></js-input-autocomplete>
                    <div class="Template-area mt-20">
                        <div class="form-group mb10">
                            <label for="emailTemplateForm" class="issue-label">
                                <span translate="common.emailTemplate">이메일 템플릿</span>
                            </label>
                            <select id="emailTemplateForm"
                                    name="emailTemplate"
                                    class="form-control input-sm issue-select-label"
                                    ng-model="vm.emailTemplateType"
                                    ng-change="fn.onChangeEmailTemplate()"
                                    required>
                                <option ng-repeat="emailTemplate in vm.emailTemplates"
                                        value="{{emailTemplate.templateType}}"
                                        translate="{{emailTemplate.title}}">
                                </option>
                            </select>
                        </div>
                    </div>
                <summernote
                        class="summernote"
                        lang="ko-KR"
                        config="vm.options"
                        ng-model="vm.html"
                        target=".note-editable"></summernote>
                <div class="form-group mb10 mt-20">
                    <label for="emailTemplateForm" class="issue-label">
                        <span translate="issue.partners">업체 이메일</span>&nbsp;<code class="highlighter-rouge">*</code>
                    </label>
                    <select id="emailTemplateForm"
                            name="emailTemplate"
                            class="form-control input-sm issue-select-label"
                            ng-model="vm.emailTemplateType"
                            ng-change="fn.onChangeEmailTemplate()"
                            required>
                        <option value="" ng-selected="true">선택하세요</option>
                        <option ng-repeat="emailTemplate in vm.emailTemplates"
                                value="{{emailTemplate.templateType}}"
                                translate="{{emailTemplate.title}}">
                        </option>
                    </select>
                </div>
                <label class="issue-label"><span translate="common.title">제목</span></label>
                <input id="title"
                       type="text"
                       name="title"
                       class="form-control"
                       kr-input
                       ng-model="vm.emailTitle"
                       autocomplete="off">
                <div class="form-group mb10 mt-10">
                    <label class="issue-label"><span translate="common.content">내용</span></label>
                    <summernote
                            class="summernote"
                            lang="ko-KR"
                            config="vm.options"
                            ng-model="vm.html"
                            target=".note-editable"></summernote>
                </div>
            </div>
        </form>
    </div>
    <div class="modal-footer buttons-on-right">
        <button type="button" class="btn btn-md btn-grey" ng-click="fn.cancel()"><span