OWL ITS + 탐지시스템(인터넷 진흥원)
wyu
2021-12-01 424867c3809bb49bd1cc8a8db10bf656d8617a1d
이메일 수정 진행중 , 이슈 상세 및 이슈 리스트 수정
12개 파일 변경됨
459 ■■■■ 파일 변경됨
src/main/java/kr/wisestone/owl/service/impl/IssueServiceImpl.java 1 ●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/scripts/app/issue/issueDetail.controller.js 57 ●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/scripts/app/issue/issueList.controller.js 36 ●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/scripts/app/issue/issueSendMail.controller.js 82 ●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/scripts/components/issue/issue.service.js 6 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/scripts/components/utils/autoComplete.controller.js 43 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/scripts/components/utils/issueDetailImagePreview.directive.js 2 ●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/scripts/components/utils/issueSearchFieldKeyViewElement.directive.js 11 ●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/scripts/config.js 32 ●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/views/issue/issueDetail.html 19 ●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/views/issue/issueListNormal.html 49 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/views/issue/issueSendMail.html 121 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/service/impl/IssueServiceImpl.java
@@ -923,6 +923,7 @@
                case "02": //  프로젝트, 이슈 유형, 이슈 상태,  우선순위, 중요도, 담당자, 첨부파일, 사용자 정의 필드 정보, 댓글, 기록을 셋팅한다.
                    this.setIssueDetail(issueVo, issue);    //  이슈 상세 정보를 셋팅한다.
                    issueVo.setProjectVo(ConvertUtil.copyProperties(issue.getProject(), ProjectVo.class));
                    break;
            }
        }
src/main/webapp/scripts/app/issue/issueDetail.controller.js
@@ -43,6 +43,7 @@
                $scope.fn.getDownTableConfigs = getDownTableConfigs;
                $scope.fn.containsPartner = containsPartner;
                $scope.fn.onActivate = onActivate;
                $scope.fn.makePartnersEmail = makePartnersEmail;
                //  이슈 목록 컨트롤러 vm, fn 상속 중
                $scope.vm.viewer = {};
@@ -72,7 +73,10 @@
                $scope.vm.form = {
                    issues : [], //연관 일감
                    issuesDown : []  // 하위 일감
                    issuesDown : [],  // 하위 일감
                    issueCompanyVos : [],
                    issueIspVos : [],
                    issueHostingVos : []
                };
@@ -636,16 +640,25 @@
                }
                //  이슈명을 클릭하면 이슈 상세 정보를 조회한다.
                $rootScope.$on("getIssueDetail", function (event, args) {
                    $scope.vm.viewer.id = args["id"];
                    $scope.fn.getIssueDetail();
                });
                // $rootScope.$on("getIssueDetail", function (event, args) {
                //     $scope.vm.viewer.id = args["id"];
                //     $scope.fn.getIssueDetail();
                // });
                //  이슈명을 클릭하면 이슈 상세 정보를 조회한다.
                $scope.$on("getIssueDetail", function (event, args) {
                    $scope.vm.viewer.id = args["id"];
                    $scope.fn.getIssueDetail();
                });
                // $scope.$on("getIssueDetail", function (event, args) {
                //     $scope.vm.viewer.id = args["id"];
                //     $scope.fn.getIssueDetail();
                // });
                $scope.$watch(function() {
                    return $rootScope.currentDetailIssueId;
                }, function() {
                    if ($rootScope.currentDetailIssueId != null) {
                        $scope.vm.viewer.id = $rootScope.currentDetailIssueId;
                        $scope.fn.getIssueDetail();
                    }
                }, true);
                //  초기화 해야할 할목을 지정하여 다른 이슈를 클릭할 때 초기화해준다.
                function initReload() {
@@ -653,9 +666,9 @@
                    $scope.vm.issueForm.issueStatusList = [];
                    $scope.vm.issueForm.issueStatusId = "";
                    $scope.vm.issueTypeId = $rootScope.getCurrentIssueTypeId();
                    /*if ($scope.$root.$$phase !== '$apply' && $scope.$root.$$phase !== '$digest') {
                        $scope.$apply();
                    }*/
                    // if ($scope.$root.$$phase !== '$apply' && $scope.$root.$$phase !== '$digest') {
                    //     $scope.$apply();
                    // }
                }
                //  이슈 상태 변경
@@ -804,7 +817,7 @@
                    $scope.fn.getDownTableConfigs();
                        Issue.detail($resourceProvider.getContent(
                        {id : $scope.vm.viewer.id, deep : "02", customFields : $scope.vm.customFields},
                        {id : $scope.vm.viewer.id, deep : "02"},
                        $resourceProvider.getPageContent(0, 1))).then(function (result) {
                        if (result.data.message.status === "success") {
@@ -846,6 +859,10 @@
                                }
                                $scope.vm.viewer.issueRelationVos = result.data.data.issueRelationVos;
                                $scope.vm.viewer.issueDownVos = result.data.data.issueDownVos;
                                if ($rootScope.workProject.id > -1) {
                                    $rootScope.changeLastProject(result.data.data.projectVo.id);
                                }
                            }
                        }
                        else {
@@ -1038,8 +1055,15 @@
                    });
                }
                // 업체/ISP/호스팅 배열값을 하나로 합쳐서 메일 클릭시 전달
                function makePartnersEmail() {
                    $scope.vm.form.partnersEmail = $scope.vm.viewer.issueCompanyVos.concat($scope.vm.viewer.issueIspVos, $scope.vm.viewer.issueHostingVos)
                    return $scope.vm.form.partnersEmail;
                }
                //  특정 사용자에게 이슈를 메일로 발송
                function sendMail(issueId, projectId) {
                    makePartnersEmail();
                    $uibModal.open({
                        templateUrl : 'views/issue/issueSendMail.html',
                        size : "md",
@@ -1049,11 +1073,12 @@
                            parameter : function () {
                                return {
                                    departmentVos : [$scope.vm.form.issues[0].departmentVos],
                                    issueCompanyFields : [$scope.vm.form.issues[0].issueCompanyVos],
                                    issueIspFields : [$scope.vm.form.issues[0].issueIspVos],
                                    issueHostingFields : [$scope.vm.form.issues[0].issueHostingVos],
                                    partners : $scope.vm.form.partnersEmail,
                                    issueId : issueId,
                                    projectId : projectId
                                    // issueCompanyFields : [$scope.vm.viewer.issueCompanyVos[0]],
                                    // issueIspFields : [$scope.vm.viewer.issueIspVos[0]],
                                    // issueHostingFields : [$scope.vm.viewer.issueHostingVos[0]],
                                };
                            }
                        }
src/main/webapp/scripts/app/issue/issueList.controller.js
@@ -169,10 +169,11 @@
                    //  현재 상세화면으로 보려고하는 이슈 id를 기억한다.
                    $rootScope.currentDetailIssueId = id;
                    //  이슈 상세 화면 요청
                    $rootScope.$broadcast("getIssueDetail", {
                        id : id
                    });
                    // $scope.$broadcast("getIssueDetail", {
                    //     id : id
                    // });
                }
                //  목록 화면으로 변경한다.
                function listView() {
@@ -183,6 +184,7 @@
                    $scope.vm.responseData.data = angular.copy(temp);
                    //  마지막으로 보고있던 이슈 id를 초기화한다.
                    $rootScope.currentDetailIssueId = null;
                    $scope.$broadcast("getIssueList", {id: $rootScope.currentDetailIssueId});
                }
                //  이슈 테이블 설정
@@ -508,6 +510,31 @@
                                if (detail) {
                                    changeDetailView(result.data.data[0].id);
                                }
                            }
                        }
                        else {
                            SweetAlert.error($filter("translate")("issue.failedIssueLookup"), result.data.message.message); // 이슈 조회 실패
                        }
                    });
                }
                // 이메일 프로젝트 경로로 이동 후 상세 진입시 조회
                function getDetailList(projectKey, number) {
                    var conditions = {
                        projectKey : projectKey,
                        combinationIssueNumber : number
                    };
                    Issue.find($resourceProvider.getContent(conditions,
                        $resourceProvider.getPageContent(0, 1))).then(function (result) {
                        if (result.data.message.status === "success") {
                            if (result.data.data !=  null && result.data.data.length > 0) {
                                $scope.vm.projectKey = result.data.data[0].projectKey;
                                $scope.vm.issueNumber = result.data.data[0].issueNumber;
                                $scope.vm.responseData = result.data;
                                changeDetailView(result.data.data[0].id);
                            }
                        }
                        else {
@@ -885,7 +912,8 @@
                    // 파라미터 읽기
                    var params = $rootScope.previousGetParams;
                    if ($rootScope.isDefined(params)) {
                        $rootScope.$broadcast("makeIssueSearch", {  projectKey : params.projectKey, issueNumber : params.issueNumber });
                        // $rootScope.$broadcast("makeIssueSearch", {  projectKey : params.projectKey, issueNumber : params.issueNumber });
                        getDetailList(params.projectKey, params.issueNumber);
                        $rootScope.previousGetParams = null;
                        // $rootScope.issueTypeId = $rootScope.issueTypeMenu.id;
                        return;
src/main/webapp/scripts/app/issue/issueSendMail.controller.js
@@ -13,49 +13,63 @@
                    removeManager : removeManager,  //  전송 대상자 삭제
                    cancel : cancel,    //  팝업 창 닫기
                    formSubmit : formSubmit,    //  폼 전송
                    formCheck : formCheck   //  폼 체크
                    // formCheck : formCheck  //  폼 체크
                };
                $scope.vm = {
                    form : {
                        id : parameter.issueId,  //  이슈 번호
                        projects : [{ id : parameter.projectId}],  //  프로젝트
                        users : []    //  메일 전송받는 사용자
                        partners : parameter.partners,
                        users : [],    //  메일 전송받는 사용자
                        issueCompanyVos : [],
                        issueIspVos : [],
                        issueHostingVos : []
                        // companyFields : parameter.issueCompanyFields,  //  업체 이메일
                        // ispFields : parameter.issueIspFields,  //  ISP 이메일
                        // hostingFields : parameter.issueHostingFields,  //  호스팅 이메일
                    },
                    userName : "",
                    partnerName : "",
                    autoCompletePage : {
                        user : {
                            page : 0,
                            totalPage : 0
                        },
                        partnersMail : {
                            page : 0,
                            totalPage :0
                        }
                    }
                };
                angular.extend(this, $controller('autoCompleteController', {$scope : $scope, $injector : $injector}));
                function formCheck(formInvalid) {
                    if (formInvalid) {
                        return true;
                    }
                    if ($scope.vm.form.users.length < 1) {
                        return true;
                    }
                    return false;
                }
                // function formCheck(formInvalid) {
                //     if (formInvalid) {
                //         return true;
                //     }
                //
                //     if ($scope.vm.form.users.length < 1) {
                //         return true;
                //     }
                //
                //     return false;
                // }
                //  폼 전송
                function formSubmit() {
                    $rootScope.spinner = true;
                    var content = {
                        id : $scope.vm.form.id,
                        sendEmails : (function () {
                            var sendEmails = [];
                            angular.forEach($scope.vm.form.users, function (user) {
                                sendEmails.push($rootScope.encryption(user.account));
                            angular.forEach($scope.vm.form.projects, function (project) {
                                sendEmails.push(project.id);
                            });
                            return sendEmails;
@@ -78,6 +92,42 @@
                    });
                }
                // function formSubmit() {
                //     $rootScope.spinner = true;
                //
                //     var content = {
                //         id : $scope.vm.form.id,
                //         companyFieldsEmail : $scope.vm.form.companyFieldsEmail,
                //         ispFieldsEmail : $scope.vm.form.ispFieldsEmail,
                //         hostingFieldsEmail : $scope.vm.form.hostingFieldsEmail,
                //         sendEmails : (function () {
                //             var sendEmails = [];
                //
                //             angular.forEach($scope.vm.form.projects, function (project) {
                //                 sendEmails.push(project.id);
                //             });
                //
                //             return sendEmails;
                //         })()
                //     };
                //
                //     Issue.findMailTargetAll($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;
                //     });
                // }
                //  사용자 auto complete callback function
                function getUserListCallBack(result) {
                    $scope.vm.autoCompletePage.user.totalPage = result.data.page.totalPage;
src/main/webapp/scripts/components/issue/issue.service.js
@@ -98,6 +98,12 @@
                    return response;
                });
            },
            findMailTargetAll : function (conditions) {
                return $http.post("issue/findMailTargetAll", conditions).then(function (response) {
                    $log.debug("이슈 이메일 발송 결과 : ", response);
                    return response;
                });
            }
        }
    }
    ])
src/main/webapp/scripts/components/utils/autoComplete.controller.js
@@ -40,6 +40,7 @@
                $scope.fn.getPartnerList = getPartnerList;          // 업체/isp/호스팅 목록 조회
                $scope.fn.getIssueTypeList = getIssueTypeList;          // 이슈 유형 목록 조회
                $scope.fn.getCustomFieldList = getCustomFieldList;          // 사용자 정의 필드 목록 조회
                $scope.fn.getMailTargetAll = getMailTargetAll;          // 사용자 정의 필드 목록 조회
                function getUserList(query, excludeList, page, callBack) {
                    var conditions = {
@@ -480,6 +481,48 @@
                    return deferred.promise;
                }
                function getMailTargetAll(query, excludeList, page, callBack) {
                    var conditions = {
                        id : query,
                        excludeIds : (function () {
                            var excludeIds = [];
                            angular.forEach(excludeList, function (exclude) {
                                excludeIds.push(exclude.id);
                            });
                            return excludeIds;
                        })(),
                        partnersEmailIds : (function () {
                            var partnersEmailIds = [];
                            angular.forEach($scope.vm.form.partners, function (partner) {
                                partnersEmailIds.push(partner.email);
                            });
                            return partnersEmailIds;
                        })(),
                    };
                    var deferred = $q.defer();
                    Issue.findMailTargetAll($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;
                }
            }
        ]);
    }
src/main/webapp/scripts/components/utils/issueDetailImagePreview.directive.js
@@ -25,7 +25,7 @@
                        //  이미지 갤러리 만들기
                        function makeNgImageGallery() {
                            var makeTag = '<ng-image-gallery images="images" thumb-size="80" bubbles="true" bubble-size="50" img-bubbles="true"></ng-image-gallery>';
                            var makeTag = '<ng-image-gallery images="images" thumb-size="60" bubbles="true" bubble-size="50" img-bubbles="true"></ng-image-gallery>';
                            var linkFn = $compile(makeTag);
                            var content = linkFn($scope);
                            $element.append(content);
src/main/webapp/scripts/components/utils/issueSearchFieldKeyViewElement.directive.js
@@ -51,9 +51,14 @@
                                        break;
                                    }
                                }
                                makeTag += "<span ng-click='fn.remove(" + key.fieldKey + ")'>×</span>";
                                makeTag += "</p>";
                                if (target.fieldValue !== null) {
                                    makeTag += "<span></span>";
                                    makeTag += "</p>";
                                }
                                else {
                                    makeTag += "<span ng-click='fn.remove(" + key.fieldKey + ")'>×</span>";
                                    makeTag += "</p>";
                                }
                            });
                            var linkFn = $compile(makeTag);
src/main/webapp/scripts/config.js
@@ -318,23 +318,25 @@
                };
                $rootScope.changeLastProject = function (projectId, reload = true) {
                    if (User != null) {
                        User.updateLastProject($resourceProvider.getContent(
                            {lastProjectId: projectId},
                            $resourceProvider.getPageContent(0, 0))).then(function (result) {
                    if ($rootScope.workProject == null || $rootScope.workProject.id !== projectId ) {
                        if (User != null) {
                            User.updateLastProject($resourceProvider.getContent(
                                {lastProjectId: projectId},
                                $resourceProvider.getPageContent(0, 0))).then(function (result) {
                            if (result.data.message.status === "success") {
                                $rootScope.user = result.data.data;
                                $rootScope.projects.forEach(function (el) {
                                    if (el.id == projectId) {
                                        $rootScope.workProject = el;
                                if (result.data.message.status === "success") {
                                    $rootScope.user = result.data.data;
                                    $rootScope.projects.forEach(function (el) {
                                        if (el.id == projectId) {
                                            $rootScope.workProject = el;
                                        $rootScope.$broadcast("changeLastProject", { id : el.id });
                                    }
                                });
                                $state.go($state.current, {}, {reload: reload});
                            }
                        });
                                            $rootScope.$broadcast("changeLastProject", {id: el.id});
                                        }
                                    });
                                    $state.go($state.current, {}, {reload: reload});
                                }
                            });
                        }
                    }
                };
src/main/webapp/views/issue/issueDetail.html
@@ -192,6 +192,11 @@
                            <span class="issue-detail-label" style="position: relative; top: 1rem" ng-show="vm.viewer.issueCustomFields == ''">사용자 정의 필드값이 없습니다.</span>
                        </div>
                    </div>
                    <div class="col-md-2">
                        <issue-detail-image-preview images="vm.images"></issue-detail-image-preview>
                    </div>
                    <div ng-show="vm.images.length < 1" class="detail-not-elements width-100">
                    </div>
                </div>
                <!-- 사용자 정의 필드 -->
                <div class="row">
@@ -256,13 +261,9 @@
                            </div>
                        </div>
                    </div>
                    <div class="pdt0" style="position: relative; bottom: 1rem">
                        <issue-detail-image-preview images="vm.images"></issue-detail-image-preview>
                    </div>
                    <div ng-show="vm.images.length < 1" class="detail-not-elements width-100">
                        <span></span>
                    </div>
                </div>
                           <!-- <div class="">
                                <label class="issue-detail-label"><span>{{vm.viewer.issueCustomFieldValueVos[0].useValue}}</span> </label>
@@ -312,7 +313,7 @@
                        <div class="form-group">
                            <div class="">
                                <span translate="companyField.email">이메일</span>:
                                <span class="email_color">{{vm.viewer.issueCompanyVos[0].email}}</span>
                                <span class="email_color cursor" ng-click="fn.sendMail(vm.viewer.id, vm.viewer.projectVo.id)">{{vm.viewer.issueCompanyVos[0].email}}</span>
                            </div>
                        </div>
                    </div>
@@ -372,7 +373,7 @@
                        <div class="form-group">
                            <div class="">
                                <span translate="ispField.email">이메일</span>:
                                <span class="email_color">{{vm.viewer.issueIspVos[0].email}}</span>
                                <span class="email_color cursor" ng-click="fn.sendMail(vm.viewer.id, vm.viewer.projectVo.id)">{{vm.viewer.issueIspVos[0].email}}</span>
                            </div>
                        </div>
                    </div>
@@ -433,7 +434,7 @@
                        <div class="form-group">
                            <div class="">
                                <span translate="hostingField.email">이메일</span>:
                                <span class="email_color">{{vm.viewer.issueHostingVos[0].email}}</span>
                                <span class="email_color cursor" ng-click="fn.sendMail(vm.viewer.id, vm.viewer.projectVo.id)">{{vm.viewer.issueHostingVos[0].email}}</span>
                            </div>
                        </div>
                    </div>
src/main/webapp/views/issue/issueListNormal.html
@@ -38,9 +38,7 @@
                                            <!--    프로젝트    -->
                                            <issue-search-array-view-element lists="vm.projects"
                                                                             type="'project'"></issue-search-array-view-element>
                                            <p ng-if="$root.isDefined(vm.projectKey)">
                                                {{vm.projectKey}}
                                            </p>
                                            <!--    이슈 타입   -->
                                            <issue-search-field-key-view-element lists="vm.issueTypes"
                                                                                 keys="vm.search.issueTypeIds"></issue-search-field-key-view-element>
@@ -48,16 +46,6 @@
                                            <!--    이슈 상태   -->
                                            <issue-search-field-key-view-element lists="vm.issueStatuses"
                                                                                 keys="vm.search.issueStatusIds"></issue-search-field-key-view-element>
                                            <!--    이슈 번호   -->
                                            <p ng-if="$root.isDefined(vm.issueNumber)">
                                                {{vm.issueNumber}}
                                            </p>
                                            <p ng-if="$root.isDefined(vm.search.combinationIssueNumber)">
                                                {{vm.search.combinationIssueNumber}}
                                                <span ng-click="vm.search.combinationIssueNumber = ''">×</span>
                                            </p>
                                            <!--    이슈 내용   -->
                                            <p ng-if="$root.isDefined(vm.search.description)">
@@ -159,7 +147,9 @@
                                                                             options="::vm.issueStatuses"></ng-dropdown-multiselect>
                                                </div>
                                            </div>
                                        </div>
                                        <div class="row">
                                            <div class="col-lg-3">
                                                <div class="form-group">
                                                    <label> <span translate="issue.issueNumber">이슈 번호</span></label>
@@ -169,13 +159,10 @@
                                                           autocomplete="off"
                                                           kr-input
                                                           maxlength="20"
                                                           ng-model="vm.issueNumber">
<!--                                                           ng-model="vm.search.combinationIssueNumber">-->
                                                           ng-model="vm.search.combinationIssueNumber">
                                                </div>
                                            </div>
                                        </div>
                                        <div class="row">
                                            <div class="col-lg-3">
                                                <div class="form-group">
                                                    <label> <span translate="issue.issueContent">이슈 내용</span></label>
@@ -206,20 +193,6 @@
                                                                             data-input-name="severities"
                                                                             selected-model="vm.search.severityIds"
                                                                             options="::vm.severities"></ng-dropdown-multiselect>
                                                </div>
                                            </div>
                                            <div class="col-lg-3">
                                                <div class="form-group">
                                                    <label> <span translate="common.assigneeTeam">담당부서</span></label>
                                                    <js-autocomplete-multi data-input-name="departments"
                                                                           selected-model="vm.departments"
                                                                           search="vm.departmentName"
                                                                           input-disabled="false"
                                                                           source="fn.getUserDepartmentList(vm.departmentName, vm.departments)"
                                                                           translation-texts="{ count : 'common.userNum', empty : 'common.emptyProjectDepartment' }"
                                                                           extra-settings="{ displayProp : 'byName' , idProp : 'id', widthable : false, width : '', imageable : true, imagePathProp : 'profile', type : 'department', maxlength : 100 }">
                                                    </js-autocomplete-multi>
                                                </div>
                                            </div>
                                        </div>
@@ -280,6 +253,20 @@
                                                </div>
                                            </div>
                                            <div class="col-lg-3">
                                                <div class="form-group">
                                                    <label> <span translate="common.assigneeTeam">담당부서</span></label>
                                                    <js-autocomplete-multi data-input-name="departments"
                                                                           selected-model="vm.departments"
                                                                           search="vm.departmentName"
                                                                           input-disabled="false"
                                                                           source="fn.getUserDepartmentList(vm.departmentName, vm.departments)"
                                                                           translation-texts="{ count : 'common.userNum', empty : 'common.emptyProjectDepartment' }"
                                                                           extra-settings="{ displayProp : 'byName' , idProp : 'id', widthable : false, width : '', imageable : true, imagePathProp : 'profile', type : 'department', maxlength : 100 }">
                                                    </js-autocomplete-multi>
                                                </div>
                                            </div>
                                            <div class="col-lg-3" ng-repeat="customField in vm.customFields">
                                                <label>{{::customField.name}}</label>
src/main/webapp/views/issue/issueSendMail.html
@@ -20,21 +20,97 @@
                                      ng-click="fn.removeManager($index)">×</span>
                            </span>
                </div>
                <js-input-autocomplete data-input-name="users"
                                       owl-auto-focus
                                       target=".auto-complete-input"
                                       selected-model="vm.form.users"
                                       search="vm.userName"
                                       page="vm.autoCompletePage.user.page"
                                       total-page="vm.autoCompletePage.user.totalPage"
                                       source="fn.getUserList(vm.userName, vm.form.users, vm.autoCompletePage.user.page, fn.getUserListCallBack)"
                                       translation-texts="{ empty : 'common.emptyUser'}"
                                       input-disabled="vm.form.projects.length == 0"
                                       extra-settings="{ displayProp : 'byName' , idProp : 'id', imageable : true, imagePathProp : 'profile',
                                               type : 'user', maxlength : 100, autoResize : true, stopRemoveBodyEvent : true }"></js-input-autocomplete>
<!--                <js-autocomplete-single data-input-name="issue"-->
<!--                                        selected-model="vm.form.issues"-->
<!--                                        search="vm.issueName"-->
<!--                                        source="fn.getIssueList(vm.issueName, vm.issueTypeId, vm.form.issues, vm.autoCompletePage.issue.page, fn.getIssueListCallBack)"-->
<!--                                        page="vm.autoCompletePage.issue.page"-->
<!--                                        total-page="vm.autoCompletePage.issue.totalPage"-->
<!--                                        input-disabled="false"-->
<!--                                        translation-texts="{ empty : 'common.emptyIssue' }"-->
<!--                                        extra-settings="{ displayProp : 'title' , idProp : 'id', imageable : false, imagePathProp : '',-->
<!--                                            type : '', maxlength : 200, autoResize : true, stopRemoveBodyEvent : true }"></js-autocomplete-single>-->
<!--                {{vm.form.companyFieldsEmail}}-->
                <label><span>협력사 메일</span></label>
                <js-autocomplete-multi data-input-name="partnersEmail"
                                       selected-model="vm.form.partnersEmail"
                                       search="vm.partnerName"
                                       source="fn.getMailTargetAll(vm.form.partnersEmail)"
                                       input-disabled="false"
                                       page="vm.autoCompletePage.partnersMail.page"
                                       total-page="vm.autoCompletePage.partnersMail.totalPage"
                                       modal-form-auto-scroll
                                       extra-settings="{ displayProp : 'byName' , idProp : 'email', imageable : false, maxlength : 100, autoResize : true }"></js-autocomplete-multi>
<!--                <ng-dropdown-multiselect class="multiSelect cursor"-->
<!--                                         data-input-name="companyFieldsEmail"-->
<!--                                         selected-model="vm.form.companyFieldsEmail.concat(vm.form.ispFieldsEmail,vm.form.hostingFieldsEmail)"-->
<!--                                         extra-settings="{ stringTypeOption : true }"-->
<!--                                         options="vm.options.companyFieldsEmail"></ng-dropdown-multiselect>-->
<!--                <span class="issue-detail-label" translate="companyField.info"></span>-->
<!--                <input ng-if="vm.form.companyFieldsEmail != null"-->
<!--                       type="text"-->
<!--                       class="form-control"-->
<!--                       kr-input-->
<!--                       autocomplete="off"-->
<!--                       ng-model="vm.form.companyFieldsEmail">-->
<!--                <span class="issue-detail-label" translate="ispField.info"></span>-->
<!--                <input ng-if="vm.form.ispFieldsEmail != null"-->
<!--                       type="text"-->
<!--                       class="form-control"-->
<!--                       kr-input-->
<!--                       autocomplete="off"-->
<!--                       ng-model="vm.form.ispFieldsEmail">-->
<!--                <span class="issue-detail-label" translate="hostingField.info"></span>-->
<!--                <input ng-if="vm.form.hostingFieldsEmail != null"-->
<!--                       type="text"-->
<!--                       class="form-control"-->
<!--                       kr-input-->
<!--                       autocomplete="off"-->
<!--                       ng-model="vm.form.hostingFieldsEmail">-->
<!--                <a style="display: flex; text-align: center; justify-content: center;">-->
<!--                    <i class="os-icon os-icon-email-forward mr-20 mt-20 cursor" ng-click="fn.formSubmit(data.id)">1</i>-->
<!--                    <i class="os-icon os-icon-email-forward mr-20 mt-20 cursor" ng-click="fn.formSubmit(data.id)">2</i>-->
<!--                    <i class="os-icon os-icon-email-forward mr-20 mt-20 cursor" ng-click="fn.formSubmit(data.id)">3</i>-->
<!--                </a>-->
<!--                <div class="modal-content">-->
<!--                    <a style="display: flex; text-align: center; justify-content: center;">-->
<!--                        <img onclick="emailTemplate()" id="template1" class="cursor" src="assets/images/btn_facebook.png">-->
<!--                        <img onclick="emailTemplate()" id="template2" class="cursor" src="assets/images/btn_kakao.png">-->
<!--                        <img onclick="emailTemplate()" id="template3" class="cursor" src="assets/images/btn_google.png">-->
<!--                    </a>-->
<!--                </div>-->
<!--                <form action="${pageContext.request.contextPath}/updatetNoticePro.do" method="post" enctype="multipart/form-data" name="noticeForm">-->
<!--                    <input type='file' id="filename" name="filename"/>-->
<!--                    <img id="preImage" src="${pageContext.request.contextPath}/saveFile/${noticeVO.filename}" alt="image_title" onerror='this.src="${pageContext.request.contextPath}/images/no_img.jpg"'/>-->
<!--                </form>-->
            </div>
        </form>
    </div>
<!--    <h6>{{vm.form.companyFieldsEmail}}</h6>-->
<!--   <span>{{vm.form.id}}===============</span>-->
<!--   <h6>{{vm.form.ispFieldsEmail}}===============</h6>-->
<!--   <span>===============</span>-->
<!--   <h6>{{vm.form.hostingFieldsEmail}}</h6>-->
<!--    <div style="display: flex; text-align: center">-->
<!--            템플릿1-->
<!--        </div>-->
<!--        <div style="border: 1px #111111; margin-left: 20px; box-sizing: border-box;">-->
<!--            템플릿2-->
    <!--        <div style="border: 1px #111111; margin-left: 20px; box-sizing: border-box;">-->
<!--        </div>-->
<!--        <div style="border: 1px #111111; margin-left: 20px; box-sizing: border-box;">-->
<!--            템플릿3-->
<!--        </div>-->
<!--    </div>-->
    <div class="modal-footer buttons-on-right">
        <button type="button" class="btn btn-md btn-grey" ng-click="fn.cancel()"><span
@@ -45,3 +121,24 @@
        </button>
    </div>
</div>
<script>
    function emailTemplate() {
        $('#template1').click(function() {
            $('#template1').hide();
        });
        $('#template2').click(function() {
            $('#template2').hide();
        });
        $('#template3').click(function() {
            $('#template3').hide();
        });
    }
    function changeIMG() {
        $('#template1').attr("src", "assets/images/previewTemplate.png")
    }
</script>