OWL ITS + 탐지시스템(인터넷 진흥원)
wyu
2021-11-19 4cef9a63afe347bcc007f2f18c21da69b346da64
이슈 상세 수정 -부서 [프론트]
3개 파일 추가됨
10개 파일 변경됨
507 ■■■■ 파일 변경됨
src/main/webapp/assets/styles/main.css 16 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/i18n/ko/global.json 28 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/scripts/app/issue/issue.js 2 ●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/scripts/app/issue/issueAdd.controller.js 11 ●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/scripts/app/issue/issueDetail.controller.js 21 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/scripts/app/issue/issueModifyDepartment.controller.js 133 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/scripts/app/project/projectModify.controller.js 2 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/scripts/components/issueDepartment/issueDepartment.service.js 20 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/scripts/main.js 3 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/views/issue/issueDetail.html 199 ●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/views/issue/issueModifyDepartment.html 46 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/views/issue/issueModifyUser.html 24 ●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/views/project/projectModify.html 2 ●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/assets/styles/main.css
@@ -30207,4 +30207,20 @@
.country {
    margin-left: 3.25rem;
}
.h3-div {
    font-size: 1.75rem;
}
.info_font {
    color: #000;
    font-size: 1rem;
    line-height: 1.5;
    font-weight: 600;
}
.email_color {
    color:#0066ff;
}
/* 간트차트 end */
src/main/webapp/i18n/ko/global.json
@@ -13,7 +13,7 @@
        "processingRate": "처리율",
        "dailyAverage": "일 평균",
        "inProgressStatusOfProject": "진행중인 프로젝트 현황",
        "progressProject": "진행 프로젝트",
        "progressProject": "진행 프로ㅇ젝트",
        "issueAll": "전체 이슈",
        "projectProgress": "프로젝트 진행률",
        "admin": "관리자",
@@ -158,6 +158,7 @@
        "issueNumber": "이슈 번호",
        "issueContent": "이슈 내용",
        "issueTitle": "이슈 제목",
        "issueInfo": "이슈 정보",
        "relationIssue": "연관 이슈",
        "addRelationIssue": "연관 이슈 추가",
        "relationIssueTitle": "연관 이슈 제목",
@@ -290,6 +291,7 @@
        "relationIssueType5" : "다음에 진행할 이슈",
        "relationIssueType6" : "다음 이슈를 우선 진행",
        "updateIssueUser" : "이슈 담당자 변경",
        "updateIssueDepartment" : "이슈 담당부서 변경",
        "normalList" : "이슈 목록",
        "timeLine" : "타임 라인",
        "useProjects" : "사용 프로젝트",
@@ -769,6 +771,7 @@
        "emptyUser": "선택할 수 있는 사용자가 없습니다.",
        "emptyProject": "선택할 수 있는 프로젝트가 없습니다.",
        "emptyDepartment": "선택할 수 있는 부서가 없습니다.",
        "noDepartment": "담당부서가 없습니다.",
        "emptyCompany": "선택할 수 있는 업체가 없습니다.",
        "emptyIssue": "선택할 수 있는 이슈가 없습니다.",
        "emptyIsp": "선택할 수 있는 ISP가 없습니다.",
@@ -815,9 +818,11 @@
        "successToApiTokenAdd" : "API 토큰 생성 성공"
    },
    "companyField" : {
        "info": "업체 정보",
        "add" : "업체 생성",
        "name" : "업체 이름",
        "info": "업체정보",
        "add" : "업체생성",
        "name" : "업체이름",
        "manager": "담당자",
        "companyName" : "업체명",
        "company" : "업체 분류",
        "profitYN" : "영리/비영리",
        "industry" : "산업 분류",
@@ -838,9 +843,10 @@
        "invalidTelFormat": "전화번호 형식이 맞지 않습니다. xxx-xxx-xxxx 형식으로 입력하세요."
    },
    "ispField" : {
        "info": "ISP 정보",
        "add" : "ISP 생성",
        "name" : "ISP 이름",
        "info": "ISP정보",
        "add" : "ISP생성",
        "name" : "ISP이름",
        "ispName" : "ISP명",
        "manager" : "담당자",
        "tel" : "전화번호",
        "code" : "코드",
@@ -856,9 +862,11 @@
        "invalidCodeFormat": "코드명에는 특수 문자를 입력 할 수 없습니다."
    },
    "hostingField" : {
        "info": "호스팅 정보",
        "add" : "호스팅 생성",
        "name" : "호스팅 이름",
        "info": "호스팅정보",
        "add" : "호스팅생성",
        "name" : "호스팅이름",
        "manager" : "호스팅이름",
        "hostingName" : "호스팅명",
        "manager" : "담당자",
        "tel" : "전화번호",
        "code" : "코드",
src/main/webapp/scripts/app/issue/issue.js
@@ -35,7 +35,7 @@
                            require([
                                'issueListTimelineController', 'issueManagerController', 'issueListController', 'issueAddController', 'issueModifyController', 'issueDetailController', 'issueImportExcelController',
                                'chartLoader', 'jsTable', 'tableColumnGenerator', 'modalFormAutoScroll', 'summerNote', 'summerNote-ko-KR', 'fullScroll', 'workflowService', 'priorityService', 'issueSearchService', 'issueTableConfigService', 'inputRegex',
                                'severityService', 'issueTypeService', 'issueTypeCustomFieldService', 'issueService', 'issueStatusService', 'issueUserService', 'issueModifyUserController', 'customFieldService', 'issueSearchFieldKeyViewElement',
                                'severityService', 'issueTypeService', 'issueTypeCustomFieldService', 'issueService', 'issueStatusService', 'issueUserService','issueDepartmentService','issueModifyUserController', 'issueModifyDepartmentController', 'customFieldService', 'issueSearchFieldKeyViewElement',
                                'issueSearchCustomFieldViewElement', 'tableUserImage', 'fullScroll', 'issueCommentService', 'detectIssueEditor', 'formSubmit', 'issueModifyStatusController', 'jsShortCut',
                                'issueAddTableConfigController', 'domAppend', 'issueDetailImagePreview', 'issueSendMailController', 'htmlDiff', 'issueVersionViewController', 'issueVersionService',
                                'jsHtmlDiff', 'issueReservationController', 'issueReservationService', 'issueVersionService', 'issueStatusAutoFocus', 'issueRelationService'
src/main/webapp/scripts/app/issue/issueAdd.controller.js
@@ -60,25 +60,26 @@
                    projectName : "",   //  프로젝트 명 검색
                    userName : "",  //  사용자 검색
                    departmentName : "",  // 부서명 검색
                    companyId : -1, // 부서 ID
                    companyName : "",   // 업체명 검색
                    companyManager : "",   // 업체 담당자
                    companyTel : "",  // 업체 전화번호
                    companyEmail : "",  // 업체 이메일
                    companyMemo : "",  // 업체 비고
                    ispId : -1, // ISP ID
                    ispName : "", // ISP 명
                    ispCode : "", // ISP 코드
                    ispManager : "", // ISP 담당자
                    ispTel : "", // ISP 전화번호
                    ispEmail : "", // ISP 이메일
                    ispMemo : "", // ISP 비고
                    hostingId : -1, // 호스팅 ID
                    hostingName : "", // 호스팅명 검색
                    hostingManager : "", // 호스팅 담당자
                    hostingTel : "", // 호스팅 전화번호
                    hostingEmail : "", // 호스팅 이메일
                    hostingMemo : "", // 호스팅 비고
                    companyId : -1,
                    ispId : -1,
                    hostingId : -1,
                    hostingMemo :"", // 호스팅 비고
                    autoCompletePage : {
                        user : {
                            page : 0,
@@ -551,7 +552,7 @@
                                else {
                                    $scope.fn.cancel();
                                    if ($state.current.name !== "issues.list") {
                                    if ($state.current.name !== "issues.list" || $state.current.name === "issues.list") {
                                        $state.go("issues.list");
                                    }
                                }
src/main/webapp/scripts/app/issue/issueDetail.controller.js
@@ -26,6 +26,7 @@
                $scope.fn.getChangeIssueStatusList = getChangeIssueStatusList;    //  이슈의 현재 상태에서 변경 가능한 이슈 샅태 목록 가져오기
                $scope.fn.modifyIssueStatus = modifyIssueStatus;    //  이슈 상태 변경
                $scope.fn.modifyIssueUser = modifyIssueUser;    //  이슈 담당자 변경
                $scope.fn.modifyIssueDepartment = modifyIssueDepartment;    //  이슈 담당부서 변경
                $scope.fn.initReload = initReload;  //  초기화 해야할 할목을 지정하여 다른 이슈를 클릭할 때 초기화해준다.
                $scope.fn.sendMail = sendMail;  //  특정 사용자에게 이슈 정보를 메일로 발송
                $scope.fn.versionView = versionView;    //  버전 정보를 표시한다.
@@ -363,6 +364,26 @@
                    });
                }
                //  담당부서 변경
                function modifyIssueDepartment() {
                    $uibModal.open({
                        templateUrl : 'views/issue/issueModifyDepartment.html',
                        size : "md",
                        controller : 'issueModifyDepartmentController',
                        backdrop : 'static',
                        resolve : {
                            parameter : function () {
                                return {
                                    departmentVos : [$scope.vm.form.issues[0].departmentVos],
                                    id : [$scope.vm.form.issues[0].id],
                                    projectId : [$scope.vm.form.issues[0].projectVo.id],
                                    project : [$scope.vm.form.issues[0].projectVo]
                                };
                            }
                        }
                    });
                }
                //  변경 가능한 이슈 상태 목록을 조회하고 수정 모드로 화면을 변경한다.
                function getChangeIssueStatusList(checkPermission) {
                    //  수정 권한이 없으면 이슈 상태 변경 불가
src/main/webapp/scripts/app/issue/issueModifyDepartment.controller.js
New file
@@ -0,0 +1,133 @@
/**
 * Created by Maprex on 2021-06-08
 */
'use strict';
define([
        'app',
        'angular'
    ],
    function (app, angular) {
        app.controller('issueModifyDepartmentController', ['$scope', '$rootScope', '$log', '$resourceProvider', '$uibModalInstance','$injector', '$controller', 'SweetAlert', '$timeout', '$stateParams', '$q', 'parameter',
            'IssueDepartment', '$filter',
            function ($scope, $rootScope, $log, $resourceProvider, $uibModalInstance, $injector, $controller, SweetAlert, $timeout, $stateParams, $q, parameter, IssueDepartment, $filter) {
                //  함수 모음
                $scope.fn = {
                    cancel: cancel,    //  팝업 창 닫기
                    formSubmit: formSubmit,    //  폼 전송
                    formCheck: formCheck,  //  폼 체크
                    removeManager : removeManager, // 담당자 삭제
                    load : load, // 현재 담당자 가져오기
                    startExecute : startExecute // 시작시 실행
                };
                //  변수 모음
                $scope.vm = {
                    form : {
                        departments : [],     //  담당부서
                        projects : []
                    },
                    departmentName : "",  //  부서 검색
                    autoCompletePage : {
                        department : {
                            page : 0,
                            totalPage : 0
                        }
                    },
                };
                angular.extend(this, $controller('autoCompleteController', {$scope : $scope, $injector : $injector}));
                //  담당부서 삭제
                function removeManager(index) {
                    $scope.vm.form.departments.splice(index, 1);
                }
                //  담당부서 autocomplete page 업데이트트
                function getDepartmentListCallBack(result) {
                    $scope.vm.autoCompletePage.department.totalPage = result.data.page.totalPage;
                }
                //  폼 전송
                function formCheck(formInvalid) {
                    if (formInvalid) {
                        return true;
                    }
                    return false;
                }
                //  폼 전송
                function formSubmit() {
                    $rootScope.spinner = true;
                    var content = {
                        id : parameter.id[0],
                        projectId : parameter.projectId[0],
                        departmentIds : (function () {
                            var departmentIds = [];
                            angular.forEach($scope.vm.form.departments, function (department) {
                                departmentIds.push(department.id);
                            });
                            return departmentIds;
                        })(),
                    };
                    IssueDepartment.modify($resourceProvider.getContent(content,
                        $resourceProvider.getPageContent(0, 0))).then(function (result) {
                        if (result.data.message.status === "success") {
                            $scope.fn.cancel();
                            $rootScope.$broadcast("getIssueList", {});
                            if ($rootScope.isDefined($rootScope.currentDetailIssueId)) {
                                $rootScope.$broadcast("getIssueDetail", {id: $rootScope.currentDetailIssueId});
                            }
                        } else {
                            SweetAlert.error($filter("translate")("issue.failedToChangeMultipleIssueStatus"), result.data.message.message); // 다중 이슈 상태 변경 실패
                        }
                        $rootScope.spinner = false;
                    });
                }
                //  팝업 창 닫기
                function cancel() {
                    $rootScope.$broadcast("closeLayer");    //  팝업이 열리고 나서 js-multi, js-single 등에서 body 이벤트가 날아가는 현상 수정
                    $uibModalInstance.dismiss('cancel');
                    $(document).unbind("keydown");  //  단축키 이벤트 제거
                }
                //  최초 실행
                function startExecute() {
                    var promises = {
                        users : $scope.fn.load()
                    };
                    $q.all(promises).then(function (results) {
                        $log.debug("promises 결과 ", results);
                    });
                }
                function load() {
                    $scope.vm.form.projects = [];
                    $scope.vm.form.projects.push(parameter.project[0]);
                    var departmentVos = parameter.departmentVos[0];
                    if (departmentVos.length > 0 && departmentVos[0] != undefined) {
                        $scope.vm.form.departments = departmentVos;
                    } else {
                        $scope.vm.form.departments = [];
                    }
                }
                $scope.fn.startExecute();
            }]);
    });
src/main/webapp/scripts/app/project/projectModify.controller.js
@@ -38,10 +38,12 @@
                        description : "",
                        managers : [],  //  관리자
                        users : [], //  일반 사용자
                        departments : [], //  부서
                        startEndDateRange : ""
                    },
                    managerName : "",   //  관리자 이름 검색
                    userName : "",  //  일반 사용자 이름 검색
                    departmentName : "",  // 부서 이름 검색
                    projectName : "",   //  상위 프로젝트 이름 검색
                    autoCompletePage : {
                        manager : {
src/main/webapp/scripts/components/issueDepartment/issueDepartment.service.js
New file
@@ -0,0 +1,20 @@
/**
 * Created by maprex on 2021-06-08
 */
'use strict';
define([
    'app'
], function (app) {
    app.factory("IssueDepartment", ['$http', '$log', function ($http, $log) {
        return {
            modify : function (conditions) {
                return $http.post("issueDepartment/modify", conditions).then(function (response) {
                    $log.debug("이슈 담당부서 수정 결과 : ", response);
                    return response;
                });
            }
        }
    }
    ]);
});
src/main/webapp/scripts/main.js
@@ -187,11 +187,13 @@
        'issueVersionViewController' : 'app/issue/issueVersionView.controller', //  이슈 버전 확인 컨트롤러
        'issueReservationController' : 'app/issue/issueReservation.controller', //  이슈 발생 예약 컨트롤러
        'issueModifyUserController' : 'app/issue/issueModifyUser.controller', // 이슈 담당자 컨트롤러
        'issueModifyDepartmentController' : 'app/issue/issueModifyDepartment.controller', // 이슈 담당부서 컨트롤러
        'issueService' : 'components/issue/issue.service', //  이슈에 관련된 통신을 담당한다.
        'issueVersionService' : 'components/issueVersion/issueVersion.service', //  이슈 버전에 관련된 통신을 담당한다.
        'issueReservationService' : 'components/issueReservation/issueReservation.service', //  이슈 발생 예약에 관련된 통신을 담당한다.
        'issueRelationService' : 'components/issueRelation/issueRelation.service', //  관련 이슈에 관련된 통신을 담당한다.
        'issueUserService' : 'components/issueUser/issueUser.service', // 이슈 담당자 관련 통신을 담당한다.
        'issueDepartmentService' : 'components/issueDepartment/issueDepartment.service', // 이슈 담당자 관련 통신을 담당한다.
        /* 할일 관련 */
@@ -503,6 +505,7 @@
    'summerNote-ja-JP', //  이슈 만들기에서 사용
    'summerNote-vi-VN', //  이슈 만들기에서 사용
    'issueUserService',
    'issueDepartmentService',
    'jsShortCut',
    'languageService',
    'principalService',
src/main/webapp/views/issue/issueDetail.html
@@ -86,18 +86,18 @@
<!--    상세 화면   -->
<div class="support-ticket-content-w" ng-controller="issueDetailController">
    <div class="support-ticket-content">
        <div class="support-ticket-content-header issue-detail-word-break">
            <h3 class="ticket-header">
        <div class="support-ticket-content-header issue-detail-word-break" style="height: 8vh">
            <span class="ticket-header">
                <div class="tasks-header-w">
                    <span class="tags">
                        <span class="tag">{{vm.viewer.projectVo.projectKey}}-{{vm.viewer.issueNumber}} &nbsp; / &nbsp; {{vm.viewer.projectVo.name}}</span>
                    </span>
                </div>
                {{vm.viewer.title}}
            </h3>
                <span class="h3-div">{{vm.viewer.title}}</span>
            </span>
            <div class="col-sm-2">
                <div class="form-group">
                    <label class="issue-detail-label"><span translate="issue.issueType">이슈 타입</span> </label>
                <div class="form-group ml-4">
                    <label class="issue-detail-label"><span translate="issue.issueType">이슈 유형</span> </label>
                    <span class="status-pill smaller"
                          ng-style="{'background-color': vm.viewer.issueTypeVo.color }"></span><span>{{vm.viewer.issueTypeVo.name}}</span>
                </div>
@@ -116,7 +116,6 @@
                    </span>
            </div>
            <a class="show-ticket-info cursor">
                <i class="os-icon os-icon-email-forward mr-20" ng-click="fn.sendMail(vm.viewer.id, vm.viewer.projectVo.id)" 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>
@@ -130,7 +129,7 @@
        <div class="ticket-thread">
            <div class="todo-content">
                <h6 class="todo-content-subheader mt-20" translate="common.detailInformation">상세 정보</h6>
                <h6 class="todo-content-subheader" translate="issue.issueInfo">이슈 정보</h6>
                <div class="row mt-20">
                    <div class="col-md-4">
                        <div class="form-group">
@@ -140,14 +139,13 @@
                                        <label class="issue-detail-label"><span translate="common.assigneeTeam">담당부서</span> </label>
                                        <div class="">
                                            <div class="select3-selection__choicediv">
                                                <span class="select3-selection__choice" ng-repeat="user in vm.viewer.userVos">
                                                    <span class="avatar-w"><img ng-src="{{::user.profile}}"></span>
                                                    <span>{{::user.byName}}</span>
                                                <span class="select3-selection__choice" ng-repeat="department in vm.viewer.departmentVos">
                                                    <span>{{::department.byName}}</span>
                                                </span>
                                                <span ng-if="vm.viewer.userVos.length < 1" translate="common.noAssignee">담당자가 없습니다.</span>
                                                <span ng-if="vm.viewer.departmentVos.length < 1" translate="common.noDepartment">담당부서가 없습니다.</span>
                                                            <i class="fa fa-edit fa-2x issue-status-edit cursor"
                                                               ng-click="fn.modifyIssueUser()" data-toggle="tooltip" data-placement="right" title="담당자 변경 하기"></i>
                                                               ng-click="fn.modifyIssueDepartment()" data-toggle="tooltip" data-placement="right" title="담당자 변경 하기"></i>
                                            </div>
                                        </div>
@@ -195,7 +193,7 @@
                <div class="row">
                    <div class="col-md-4">
                        <div class="form-group">
                            <label class="issue-detail-label"><span translate="common.detectingInfo">탐지정보</span> </label>
                            <h6 class="info_font" translate="common.detectingInfo">탐지정보</h6>
                            <div class="">
                                <label class="issue-detail-label"><span translate="common.diffuserURL">유포자URL</span> </label>
                                <label class="issue-detail-label offset-2"><span translate="common.country">국가</span></label>
@@ -206,36 +204,183 @@
<!--                                <span ng-if="vm.viewer.userVos.length < 1" translate="common.noAssignee">담당자가 없습니다.</span>-->
                            </div>
                        </div>
                    </div>
                </div>
                <hr>
<!--                <span class="tag">{{vm.viewer.projectVo.projectKey}}-{{vm.viewer.issueNumber}} &nbsp; / &nbsp; {{vm.viewer.projectVo.name}}</span>-->
                <div class="row">
                    <div class="col-sm-2">
                        <div class="form-group">
                            <h6 class="info_font" translate="companyField.info">업체정보</h6>
                            <button style="display: inline">1111</button>
                        </div>
                    </div>
                </div>
                <div class="row">
                    <div class="col-md-4">
                    <div class="col-sm-2">
                        <div class="form-group">
                            <label class="issue-detail-label"><span translate="common.registrationDate">등록일</span>
                            </label>
                            <span translate="companyField.companyName">업체명</span>:
                            <span>{{vm.viewer.issueCompanyVos[0].name}}</span>
                        </div>
                    </div>
                    <div class="col-sm-2">
                        <div class="form-group">
                            <div class="">
                                {{vm.viewer.registerDate}}
                                <span translate="companyField.manager">담당자</span>:
                                <span>{{vm.viewer.issueCompanyVos[0].manager}}</span>
                            </div>
                        </div>
                    </div>
                    <div class="col-md-4">
                    <div class="col-sm-2">
                        <div class="form-group">
                            <label class="issue-detail-label"><span translate="common.register">등록자</span></label>
                            <div class="">
                                <div class="select3-selection__choicediv">
                                    <span class="select3-selection__choice">
                                        <span class="avatar-w"><img ng-src="{{vm.viewer.registerVo.profile}}"></span>
                                        <span>{{vm.viewer.registerVo.byName}}</span>
                                    </span>
                                </div>
                                <span translate="companyField.tel">전화번호</span>:
                                <span>{{vm.viewer.issueCompanyVos[0].tel}}</span>
                            </div>
                        </div>
                    </div>
                    <div class="col-sm-2">
                        <div class="form-group">
                            <div class="">
                                <span translate="companyField.email">이메일</span>:
                                <span class="email_color">{{vm.viewer.issueCompanyVos[0].email}}</span>
                            </div>
                        </div>
                    </div>
                    <div class="col-sm-2">
                        <div class="form-group">
                            <div class="">
                                <span translate="companyField.memo">비고</span>:
                                <span>{{vm.viewer.issueCompanyVos[0].memo}}</span>
                            </div>
                        </div>
                    </div>
                </div>
                <div class="row">
                    <div class="col-sm-2">
                        <div class="form-group">
                            <h6 class="info_font" translate="ispField.info">ISP정보</h6>
                        </div>
                    </div>
                </div>
                <div class="row">
                    <div class="col-sm-2">
                        <div class="form-group">
                            <span translate="ispField.ispName">ISP명</span>:
                            <span>{{vm.viewer.issueIspVos[0].name}}</span>
                        </div>
                    </div>
                    <div class="col-sm-2">
                        <div class="form-group">
                            <span translate="ispField.code">코드</span>:
                            <span>{{vm.viewer.issueIspVos[0].code}}</span>
                        </div>
                    </div>
                    <div class="col-sm-2">
                        <div class="form-group">
                            <div class="">
                                <span translate="ispField.manager">담당자</span>:
                                <span>{{vm.viewer.issueIspVos[0].manager}}</span>
                            </div>
                        </div>
                    </div>
                    <div class="col-sm-2">
                        <div class="form-group">
                            <div class="">
                                <span translate="ispField.tel">전화번호</span>:
                                <span>{{vm.viewer.issueIspVos[0].tel}}</span>
                            </div>
                        </div>
                    </div>
                    <div class="col-sm-2">
                        <div class="form-group">
                            <div class="">
                                <span translate="ispField.email">이메일</span>:
                                <span class="email_color">{{vm.viewer.issueIspVos[0].email}}</span>
                            </div>
                        </div>
                    </div>
                    <div class="col-sm-2">
                        <div class="form-group">
                            <div class="">
                                <span translate="ispField.memo">비고</span>:
                                <span>{{vm.viewer.issueIspVos[0].memo}}</span>
                            </div>
                        </div>
                    </div>
                </div>
                <div class="row">
                    <div class="col-sm-2">
                        <div class="form-group">
                            <h6 class="info_font" translate="hostingField.info">호스팅정보</h6>
                        </div>
                    </div>
                </div>
                <div class="row">
                    <div class="col-sm-2">
                        <div class="form-group">
                            <span translate="hostingField.hostingName">호스팅명</span>:
                            <span>{{vm.viewer.issueHostingVos[0].name}}</span>
                        </div>
                    </div>
                    <div class="col-sm-2">
                        <div class="form-group">
                            <span translate="hostingField.code">코드</span>:
                            <span>{{vm.viewer.issueHostingVos[0].code}}</span>
                        </div>
                    </div>
                    <div class="col-sm-2">
                        <div class="form-group">
                            <div class="">
                                <span translate="hostingField.manager">담당자</span>:
                                <span>{{vm.viewer.issueHostingVos[0].manager}}</span>
                            </div>
                        </div>
                    </div>
                    <div class="col-sm-2">
                        <div class="form-group">
                            <div class="">
                                <span translate="hostingField.tel">전화번호</span>:
                                <span>{{vm.viewer.issueHostingVos[0].tel}}</span>
                            </div>
                        </div>
                    </div>
                    <div class="col-sm-2">
                        <div class="form-group">
                            <div class="">
                                <span translate="hostingField.email">이메일</span>:
                                <span class="email_color">{{vm.viewer.issueHostingVos[0].email}}</span>
                            </div>
                        </div>
                    </div>
                    <div class="col-sm-2">
                        <div class="form-group">
                            <div class="">
                                <span translate="hostingField.memo">비고</span>:
                                <span>{{vm.viewer.issueHostingVos[0].memo}}</span>
                            </div>
                        </div>
                    </div>
                </div>
                <div class="row">
src/main/webapp/views/issue/issueModifyDepartment.html
New file
@@ -0,0 +1,46 @@
<div class="formModal">
    <div class="modal-header faded smaller">
        <div class="modal-title">
            <strong translate="issue.updateIssueDepartment">이슈 담당부서 변경</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="issueDepartmentModifyForm">
            <div class="form-group">
                <div class="form-group mgb5">
                    <label class="issue-label"> <span translate="common.assigneeTeam">담당부서</span> </label>
                    <js-autocomplete-multi data-input-name="departments"
                                           selected-model="vm.form.departments"
                                           search="vm.departmentName"
                                           source="fn.getUserDepartmentList(vm.departmentName, vm.form.departments)"
                                           input-disabled="false"
                                           translation-texts="{ count : 'common.userNum', empty : 'common.emptyUser' }"
                                           extra-settings="{ displayProp : 'byName' , idProp : 'id', imageable : false, maxlength : 100, autoResize : true }"></js-autocomplete-multi>
                    <div class="select3-selection__choicediv mt-10">
                            <span class="select3-selection__choice" ng-repeat="department in vm.form.departments">
                                <span>{{department.byName}}</span> <!--사용자가 속해 있는 부서 이름 출력-->
                                <span class="select3-selection__choice__remove" ng-click="fn.removeDepartments($index)">×</span>
                            </span>
                    </div>
                </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
                translate="common.cancel">취소</span></button>
        <button type="button" class="btn btn-md btn-primary bold"
                js-short-cut
                js-short-cut-action="(fn.formCheck(issueMultiStatusModifyForm.$invalid) || $root.spinner) ? null : fn.formSubmit()"
                ng-disabled="fn.formCheck(issueMultiStatusModifyForm.$invalid)"
                ng-click="fn.formSubmit()"><span translate="common.save">저장</span>
        </button>
    </div>
</div>
src/main/webapp/views/issue/issueModifyUser.html
@@ -12,23 +12,23 @@
        <form role="form" name="issueUserModifyForm">
            <div class="form-group">
                <div class="form-group mgb5">
                    <label class="issue-label"> <span translate="common.assigneeTeam">담당부서</span> </label>
                    <js-input-autocomplete data-input-name="departments"
                                           selected-model="vm.form.departments"
                                           search="vm.departmentName"
                                           page="vm.autoCompletePage.department.page"
                                           total-page="vm.autoCompletePage.department.totalPage"
                                           source="fn.getDepartmentList(vm.departmentName, vm.form.departments, vm.autoCompletePage.department.page, fn.getDepartmentListCallBack)"
                                           input-disabled="vm.form.departments.length == 0"
                    <label class="issue-label"> <span translate="common.assignee">담당자</span> </label>
                    <js-input-autocomplete data-input-name="users"
                                           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)"
                                           input-disabled="vm.form.users.length == 0"
                                           translation-texts="{ empty : 'common.emptyDepartment'}"
                                           extra-settings="{ displayProp : 'byName' , idProp : 'id', imageable : true, imagePathProp : 'profile',
                                               type : 'department', maxlength : 100, autoResize : true, stopRemoveBodyEvent : true }"></js-input-autocomplete>
                                               type : 'user', maxlength : 100, autoResize : true, stopRemoveBodyEvent : true }"></js-input-autocomplete>
                    <div class="select3-selection__choicediv">
                            <span class="select3-selection__choice" ng-repeat="department in vm.form.departments">
                            <span class="select3-selection__choice" ng-repeat="user in vm.form.users">
                                <span class="avatar-w"></span>
                                <!--                                <img ng-src="{{department.profile}}">-->
                                <span>{{department.name}}({{department.id}})</span>
                                <img ng-src="{{department.profile}}">
                                <span>{{user.name}}({{user.id}})</span>
                                <span class="select3-selection__choice__remove"
                                      ng-click="fn.removeManager($index)">×</span>
                            </span>
src/main/webapp/views/project/projectModify.html
@@ -107,7 +107,7 @@
            <div class="form-group">
                <label><span translate="project.projectDepartment">프로젝트 부서</span> </label>
                <js-autocomplete-multi data-input-name="users"
                <js-autocomplete-multi data-input-name="departments"
                                       selected-model="vm.form.users"
                                       search="vm.userName"
                                       source="fn.getUserList(vm.userName, vm.form.users.concat(vm.form.managers))"