OWL ITS + 탐지시스템(인터넷 진흥원)
이민희
2021-11-09 27659024a53ebf1c8b99f2848d6f58ae5bd17b3e
ISP, 호스팅 관리 프론트
8개 파일 추가됨
12개 파일 변경됨
1467 ■■■■■ 파일 변경됨
src/main/webapp/custom_components/js-table/tableColumnGenerator.directive.js 18 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/i18n/ko/global.json 29 ●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/scripts/app/hostingField/hostingField.js 1 ●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/scripts/app/hostingField/hostingFieldAdd.controller.js 79 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/scripts/app/hostingField/hostingFieldList.controller.js 192 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/scripts/app/hostingField/hostingFieldModify.controller.js 114 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/scripts/app/ispField/ispField.js 1 ●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/scripts/app/ispField/ispFieldAdd.controller.js 79 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/scripts/app/ispField/ispFieldList.controller.js 200 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/scripts/app/ispField/ispFieldModify.controller.js 113 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/scripts/components/HostingField/hostingField.service.js 28 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/scripts/components/ispField/ispField.service.js 26 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/scripts/main.js 4 ●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/views/companyField/companyFieldAdd.html 12 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/views/hostingField/hostingFieldAdd.html 137 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/views/hostingField/hostingFieldList.html 14 ●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/views/hostingField/hostingFieldModify.html 134 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/views/ispField/ispFieldAdd.html 137 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/views/ispField/ispFieldList.html 14 ●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/views/ispField/ispFieldModify.html 135 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/custom_components/js-table/tableColumnGenerator.directive.js
@@ -375,6 +375,24 @@
                                            }
                                            break;
                                        case "ISPFIELD_MODIFY" :
                                            if ($rootScope.checkMngPermission('USER_PERMISSION_MNG_CUSTOME_FIELD')) {
                                                makeTag += "<span class='titlename cursor table-word-break-all' ng-click='event.modify(data.id)'>" + scope.data.name.replace(/</gi, '&lt;') + "</span>";
                                            }
                                            else {
                                                makeTag += "<span class='titlename not-modify table-word-break-all'>" + scope.data.name + "</span>";
                                            }
                                            break;
                                        case "HOSTINGFIELD_MODIFY" :
                                            if ($rootScope.checkMngPermission('USER_PERMISSION_MNG_CUSTOME_FIELD')) {
                                                makeTag += "<span class='titlename cursor table-word-break-all' ng-click='event.modify(data.id)'>" + scope.data.name.replace(/</gi, '&lt;') + "</span>";
                                            }
                                            else {
                                                makeTag += "<span class='titlename not-modify table-word-break-all'>" + scope.data.name + "</span>";
                                            }
                                            break;
                                        case "ISSUE_CUSTOM_FIELD_VALUE_VIEW" :
                                            var values = [];
src/main/webapp/i18n/ko/global.json
@@ -789,13 +789,14 @@
    },
    "companyField" : {
        "add" : "업체 생성",
        "name" : "업체명",
        "name" : "업체 이름",
        "company" : "업체 분류",
        "profitYN" : "영리/비영리",
        "industry" : "산업 분류",
        "domain" : "도메인",
        "manager" : "담당자",
        "tel" : "전화번호",
        "code" : "코드",
        "email" : "이메일",
        "desc" : "비고",
        "failedToSelectCompanyFieldFullList" : "업체 관리 목록 조회 실패",
@@ -803,22 +804,42 @@
        "wantToDeleteSelectCompanyField" : "선택한 업체를 삭제하겠습니까? 삭제된 업체는 복구할 수 없습니다.",
        "failedCompanyFieldRegistration" : "업체 등록 실패",
        "failedToDetailCompanyFieldModify" : "업체 상세 정보 조회 실패",
        "pleaseEnterCompanyFieldName": "업체명을 입력하세요."
        "pleaseEnterCompanyFieldName": "업체 이름을 입력하세요.",
        "enterSpecialCharacters": "업체 이름에는 특수 문자를 입력 할 수 없습니다.",
        "invalidTelFormat": "전화번호 형식이 맞지 않습니다. xxx-xxx-xxxx 형식으로 입력하세요."
    },
    "ispField" : {
        "add" : "ISP 생성",
        "name" : "ISP 이름",
        "manager" : "담당자",
        "tel" : "전화번호",
        "code" : "코드",
        "email" : "이메일",
        "desc" : "비고"
        "desc" : "비고",
        "failedToSelectIspFieldFullList" : "ISP 관리 목록 조회 실패",
        "delete" : "ISP 삭제",
        "wantToDeleteSelectIspField" : "선택한 ISP를 삭제하겠습니까? 삭제된 ISP는 복구할 수 없습니다.",
        "failedIspFieldRegistration" : "ISP 등록 실패",
        "failedToDetailIspFieldModify" : "ISP 상세 정보 조회 실패",
        "pleaseEnterIspFieldName": "ISP 이름을 입력하세요.",
        "enterSpecialCharacters": "ISP 이름에는 특수 문자를 입력 할 수 없습니다.",
        "invalidCodeFormat": "코드명에는 특수 문자를 입력 할 수 없습니다."
    },
    "hostingField" : {
        "add" : "호스팅 생성",
        "name" : "호스팅 이름",
        "manager" : "담당자",
        "tel" : "전화번호",
        "code" : "코드",
        "email" : "이메일",
        "desc" : "비고"
        "desc" : "비고",
        "failedToSelectHostingFieldFullList" : "호스팅 관리 목록 조회 실패",
        "delete" : "호스팅 삭제",
        "wantToDeleteSelectHostingField" : "선택한 호스팅을 삭제하겠습니까? 삭제된 호스팅은 복구할 수 없습니다.",
        "failedHostingFieldRegistration" : "호스팅 등록 실패",
        "failedToDetailHostingFieldModify" : "호스팅 상세 정보 조회 실패",
        "pleaseEnterHostingFieldName": "호스팅 이름을 입력하세요.",
        "enterSpecialCharacters": "호스팅 이름에는 특수 문자를 입력 할 수 없습니다.",
        "invalidCodeFormat": "코드명에는 특수 문자를 입력 할 수 없습니다."
    }
}
src/main/webapp/scripts/app/hostingField/hostingField.js
@@ -33,6 +33,7 @@
                        loadController : ["$q", function ($q) {
                            var deferred = $q.defer();
                            require(["hostingFieldListController", 'jsTable', 'tableColumnGenerator', 'hostingFieldService', 'modalFormAutoScroll'
                                , 'hostingFieldAddController', 'hostingFieldModifyController'
                                , 'formSubmit', 'jsShortCut', 'inputRegex'], function () {
                                deferred.resolve();
                            });
src/main/webapp/scripts/app/hostingField/hostingFieldAdd.controller.js
New file
@@ -0,0 +1,79 @@
/**
 * Created by wisestone on 2018-02-19.
 */
'use strict';
define([
        'app'
    ],
    function (app) {
        app.controller('hostingFieldAddController', ['$scope', '$rootScope', '$log', '$resourceProvider', 'SweetAlert', '$uibModal', '$uibModalInstance', '$state', 'HostingField', '$filter',
            function ($scope, $rootScope, $log, $resourceProvider, SweetAlert, $uibModal, $uibModalInstance, $state, HostingField, $filter) {
                $scope.fn = {
                    cancel : cancel,    //  팝업 창 닫기
                    formSubmit : formSubmit,    //  폼 전송
                    formCheck : formCheck,   //  폼 체크
                };
                $scope.vm = {
                    form : {
                        code : "",  //코드
                        name : "",  //호스팅명
                        manager : "",   //담당자
                        tel : "",  //전화번호
                        email : "",  //이메일
                        memo : ""  //비고
                    }
                };
                //  폼 체크
                function formCheck(formInvalid) {
                    if (formInvalid) {
                        return true;
                    }
                    return false;
                }
                //  폼 전송
                function formSubmit(condition) {
                    $rootScope.spinner = true;
                    var content = {
                        code : $rootScope.preventXss($scope.vm.form.code),  //코드
                        name : $rootScope.preventXss($scope.vm.form.name),    //  호스팅명
                        manager : $scope.vm.form.manager,   //담당자
                        tel : $scope.vm.form.tel,  //전화번호
                        email : $scope.vm.form.email,  //이메일
                        memo : $scope.vm.form.memo  //비고
                    };
                    HostingField.add($resourceProvider.getContent(content,
                        $resourceProvider.getPageContent(0, 10))).then(function (result) {
                        if (result.data.message.status === "success") {
                            $scope.fn.cancel();
                            //  목록 화면 갱신
                            $rootScope.$broadcast("getPageList", {});
                        }
                        else {
                            SweetAlert.error($filter("translate")("hostingField.failedHostingFieldRegistration"), result.data.message.message);
                        }
                        $rootScope.spinner = false;
                    });
                }
                //  팝업 창 닫기
                function cancel() {
                    $rootScope.$broadcast("closeLayer");    //  팝업이 열리고 나서 js-multi, js-single 등에서 body 이벤트가 날아가는 현상 수정
                    $uibModalInstance.dismiss('cancel');
                    $(document).unbind("keydown");  //  단축키 이벤트 제거
                }
            }
        ]);
    }
);
src/main/webapp/scripts/app/hostingField/hostingFieldList.controller.js
@@ -13,13 +13,46 @@
                //  함수
                $scope.fn = {
                    getPageList : getPageList, // 호스팅 관리 리스트
                    makeTableConfigs : makeTableConfigs, //  테이블 설정
                    initSearch : initSearch, //검색 조건 초기화
                    add : add, //호스팅 생성
                    removes : removes, //호스팅 삭제
                    makeSearchConditions : makeSearchConditions //엑셀 다운로드
                };
                //  변수
                $scope.vm = {
                    tableConfigs : [],
                };
                $scope.tableEvent = {
                    modify : modify //호스팅 정보 변경
                };
                $scope.vm.search = {
                    name : "",  //  호스팅 이름
                };
                $scope.vm.page = {
                    selectedPage : 0,
                    selectedPageRowCount : String(10)
                };
                $scope.vm.responseData = {
                    data : []
                };
                //  호스팅 관리 리스트 불러오기
                $scope.$on("getPageList", function () {
                    $scope.fn.getPageList(0);
                });
                //  검색 조건 초기화
                function initSearch() {
                    $scope.vm.search.name = "";
                    $scope.fn.getPageList(0);
                }
                //  사용자 정의 필드 목록 테이블 설정
                function makeTableConfigs() {
@@ -35,38 +68,171 @@
                        .setDName("name")
                        .setDType("renderer")
                        .setDAlign("text-center")
                        .setDRenderer("COMMON_MODIFY"));
                        .setDRenderer("HOSTINGFIELD_MODIFY"));
                    $scope.vm.tableConfigs.push($tableProvider.config()
                        .setHName("hostingField.code")
                        .setHWidth("bold")
                        .setDName("code")
                        .setDAlign("text-center"));
                    $scope.vm.tableConfigs.push($tableProvider.config()
                        .setHName("hostingField.manager")
                        .setHWidth("bold")
                        .setDName("name")
                        .setDType("renderer")
                        .setDAlign("text-center")
                        .setDRenderer("COMMON_MODIFY"));
                        .setDAlign("text-center"));
                    $scope.vm.tableConfigs.push($tableProvider.config()
                        .setHName("hostingField.tel")
                        .setHWidth("bold")
                        .setDName("name")
                        .setDType("renderer")
                        .setDAlign("text-center")
                        .setDRenderer("COMMON_MODIFY"));
                        .setDAlign("text-center"));
                    $scope.vm.tableConfigs.push($tableProvider.config()
                        .setHName("hostingField.email")
                        .setHWidth("bold")
                        .setDName("name")
                        .setDType("renderer")
                        .setDAlign("text-center")
                        .setDRenderer("COMMON_MODIFY"));
                        .setDAlign("text-center"));
                    $scope.vm.tableConfigs.push($tableProvider.config()
                        .setHName("hostingField.desc")
                        .setHWidth("bold")
                        .setDName("name")
                        .setDType("renderer")
                        .setDAlign("text-center")
                        .setDRenderer("COMMON_MODIFY"));
                        .setDAlign("text-center"));
                }
                //  호스팅 관리 목록 조회
                function getPageList(selectedPage) {
                    if (selectedPage < 0) {
                        selectedPage = 0;
                    }
                    //  현재 페이지 정보
                    var currentPage = 0;
                    //  쿠키에 선택한 페이지 정보가 없으면 기본 페이지 정보 0 을 저장
                    if (angular.isUndefined(selectedPage) || selectedPage === "") {
                        currentPage = $scope.vm.page.selectedPage;
                    }
                    else {
                        currentPage = selectedPage;
                    }
                    var conditions = {
                        name : $scope.vm.search.name //호스팅 명
                    };
                    //테이블 리스트 데이터 컨트롤러 요청
                    HostingField.find($resourceProvider.getContent(conditions,
                        $resourceProvider.getPageContent(currentPage, $scope.vm.page.selectedPageRowCount))).then(function (result) {
                        if (result.data.message.status === "success") {
                            $scope.vm.page.selectedPage = currentPage + 1;
                            $scope.vm.responseData = result.data;
                        }
                        else {
                            SweetAlert.error($filter("translate")("hostingField.failedToSelectHostingFieldFullList"), result.data.message.message); // 호스팅 관리 목록 조회 실패
                        }
                    });
                }
                //  호스팅 생성
                function add() {
                    $uibModal.open({
                        templateUrl : 'views/hostingField/hostingFieldAdd.html',
                        size : "md",
                        controller : 'hostingFieldAddController',
                        backdrop : 'static',
                        resolve : {
                            parameter : function () {
                                return {
                                };
                            }
                        }
                    });
                }
                //  호스팅 수정
                function modify(id) {
                    $uibModal.open({
                        templateUrl : 'views/hostingField/hostingFieldModify.html',
                        size : "md",
                        controller : 'hostingFieldModifyController',
                        backdrop : 'static',
                        resolve : {
                            parameter : function () {
                                return {
                                    id : id
                                };
                            }
                        }
                    });
                }
                //  호스팅 삭제
                function removes() {
                    var removeIds = [];
                    angular.forEach($scope.vm.responseData.data, function (data) {
                        if (data.checked) {
                            removeIds.push(data.id);
                        }
                    });
                    if (removeIds.length < 1) {
                        SweetAlert.swal({
                            title : $filter("translate")("common.checkPurgingTargets"), // 삭제 대상 확인
                            text : $filter("translate")("common.selectDestinationDeletion"), // 삭제 대상을 선택하세요.
                            type : "warning"
                        });
                        return;
                    }
                    //  삭제 알림
                    SweetAlert.swal({
                            title : $filter("translate")("hostingField.delete"), // "삭제"
                            text : $filter("translate")("hostingField.wantToDeleteSelectHostingField"), // 선택한 호스팅을 삭제하겠습니까? 삭제된 호스팅은 복구할 수 없습니다.
                            type : "warning",
                            showCancelButton : true,
                            confirmButtonColor : "#DD6B55",
                            confirmButtonText : $filter("translate")("common.delete"), // 삭제
                            cancelButtonText : $filter("translate")("common.cancel"), // 취소
                            closeOnConfirm : false,
                            closeOnCancel : true
                        },
                        function (isConfirm) {
                            SweetAlert.close();
                            if (isConfirm) {
                                $rootScope.spinner = true;
                                HostingField.removes($resourceProvider.getContent(
                                    { removeIds : removeIds },
                                    $resourceProvider.getPageContent(0, 0))).then(function (result) {
                                    if (result.data.message.status === "success") {
                                        $timeout(function () {
                                            SweetAlert.success($filter("translate")("common.deleteSucceeded"), result.data.message.message); // 삭제 성공
                                        }, 100);
                                        $scope.fn.getPageList(0);
                                    }
                                    else {
                                        $timeout(function () {
                                            SweetAlert.error($filter("translate")("common.deleteFailed"), result.data.message.message); // 삭제 실패
                                        }, 100);
                                    }
                                    $rootScope.spinner = false;
                                });
                            }
                        });
                }
                function makeSearchConditions() {
                    var conditions = {
                        name: $scope.vm.search.name
                    }
                    return conditions;
                }
                $scope.fn.makeTableConfigs();
                $scope.fn.getPageList();
            }
        ]);
    }
src/main/webapp/scripts/app/hostingField/hostingFieldModify.controller.js
New file
@@ -0,0 +1,114 @@
/**
 * Created by wisestone on 2018-05-08.
 */
'use strict';
define([
        'app',
        'angular'
    ],
    function (app, angular) {
        app.controller('hostingFieldModifyController', ['$scope', '$rootScope', '$log', '$resourceProvider', '$uibModalInstance', 'HostingField', 'parameter', 'SweetAlert', '$filter', '$q',
            function ($scope, $rootScope, $log, $resourceProvider, $uibModalInstance, HostingField, parameter, SweetAlert, $filter, $q) {
                $scope.fn = {
                    detail : detail,  //  상세 조회
                    cancel : cancel,    //  팝업 창 닫기
                    formSubmit : formSubmit,    //  폼 전송
                    formCheck : formCheck,  //  폼 체크
                };
                $scope.vm = {
                    id : parameter.id,
                    form : {
                        code : "",  //코드
                        name : "",  //호스팅명
                        manager : "",   //담당자
                        tel : "",  //전화번호
                        email : "",  //이메일
                        memo : ""  //메모(비고)
                    }
                };
                function formCheck(formInvalid) {
                    if (formInvalid) {
                        return true;
                    }
                    return false;
                }
                //  폼 전송
                function formSubmit() {
                    $rootScope.spinner = true;
                    var content = {
                        id : parameter.id,
                        code : $rootScope.preventXss($scope.vm.form.name),
                        name : $rootScope.preventXss($scope.vm.form.name),
                        manager : $rootScope.preventXss($scope.vm.form.manager),
                        tel : $rootScope.preventXss($scope.vm.form.tel),
                        email : $rootScope.preventXss($scope.vm.form.email),
                        memo : $rootScope.preventXss($scope.vm.form.memo)
                    };
                    HostingField.modify($resourceProvider.getContent(
                        content,
                        $resourceProvider.getPageContent(0, 0))).then(function (result) {
                        if (result.data.message.status === "success") {
                            $scope.fn.cancel();
                            //  목록 화면 갱신
                            $rootScope.$broadcast("getPageList", {});
                        }
                        else {
                            SweetAlert.error($filter("translate")("hostingField.failedHostingFieldRegistration"), result.data.message.message); //등록 실패
                        }
                        $rootScope.spinner = false;
                    });
                }
                //  팝업 창 닫기
                function cancel() {
                    $rootScope.$broadcast("closeLayer");    //  팝업이 열리고 나서 js-multi, js-single 등에서 body 이벤트가 날아가는 현상 수정
                    $uibModalInstance.dismiss('cancel');
                    $(document).unbind("keydown");  //  단축키 이벤트 제거
                }
                //  상세 정보
                function detail() {
                    var deferred = $q.defer();
                    var conditions = {
                        id : parameter.id
                    }
                    HostingField.detail($resourceProvider.getContent(
                        conditions,
                        $resourceProvider.getPageContent(0, 1))).then(function (result) {
                        if (result.data.message.status === "success") {
                            if (angular.isDefined(result.data.content)) {
                                $scope.vm.form.code = result.data.content.code;
                                $scope.vm.form.name = result.data.content.name;
                                $scope.vm.form.manager = result.data.content.manager;
                                $scope.vm.form.email = result.data.content.email;
                                $scope.vm.form.tel = result.data.content.tel;
                                $scope.vm.form.memo = result.data.content.memo;
                            }
                        }
                        else {
                            SweetAlert.swal($filter("translate")("hostingField.failedToDetailHostingFieldModify"), result.data.message.message, "error"); // "상세 정보 조회 실패"
                        }
                        deferred.resolve(result.data.data);
                    });
                    return deferred.promise;
                }
                $scope.fn.detail();
            }]);
    });
src/main/webapp/scripts/app/ispField/ispField.js
@@ -33,6 +33,7 @@
                        loadController : ["$q", function ($q) {
                            var deferred = $q.defer();
                            require(["ispFieldListController", 'jsTable', 'tableColumnGenerator', 'ispFieldService', 'modalFormAutoScroll'
                                , 'ispFieldAddController', 'ispFieldModifyController'
                                , 'formSubmit', 'jsShortCut', 'inputRegex'], function () {
                                deferred.resolve();
                            });
src/main/webapp/scripts/app/ispField/ispFieldAdd.controller.js
New file
@@ -0,0 +1,79 @@
/**
 * Created by wisestone on 2018-02-19.
 */
'use strict';
define([
        'app'
    ],
    function (app) {
        app.controller('ispFieldAddController', ['$scope', '$rootScope', '$log', '$resourceProvider', 'SweetAlert', '$uibModal', '$uibModalInstance', '$state', 'IspField', '$filter',
            function ($scope, $rootScope, $log, $resourceProvider, SweetAlert, $uibModal, $uibModalInstance, $state, IspField, $filter) {
                $scope.fn = {
                    cancel : cancel,    //  팝업 창 닫기
                    formSubmit : formSubmit,    //  폼 전송
                    formCheck : formCheck,   //  폼 체크
                };
                $scope.vm = {
                    form : {
                        code : "",  //코드
                        name : "",  //ISP명
                        manager : "",   //담당자
                        tel : "",  //전화번호
                        email : "",  //이메일
                        memo : ""  //비고
                    }
                };
                //  폼 체크
                function formCheck(formInvalid) {
                    if (formInvalid) {
                        return true;
                    }
                    return false;
                }
                //  폼 전송
                function formSubmit(condition) {
                    $rootScope.spinner = true;
                    var content = {
                        code : $rootScope.preventXss($scope.vm.form.code),  //코드
                        name : $rootScope.preventXss($scope.vm.form.name),    //  ISP명
                        manager : $scope.vm.form.manager,   //담당자
                        tel : $scope.vm.form.tel,  //전화번호
                        email : $scope.vm.form.email,  //이메일
                        memo : $scope.vm.form.memo  //비고
                    };
                    IspField.add($resourceProvider.getContent(content,
                        $resourceProvider.getPageContent(0, 10))).then(function (result) {
                        if (result.data.message.status === "success") {
                            $scope.fn.cancel();
                            //  목록 화면 갱신
                            $rootScope.$broadcast("getPageList", {});
                        }
                        else {
                            SweetAlert.error($filter("translate")("ispField.failedToSelectIspFieldFullList"), result.data.message.message);
                        }
                        $rootScope.spinner = false;
                    });
                }
                //  팝업 창 닫기
                function cancel() {
                    $rootScope.$broadcast("closeLayer");    //  팝업이 열리고 나서 js-multi, js-single 등에서 body 이벤트가 날아가는 현상 수정
                    $uibModalInstance.dismiss('cancel');
                    $(document).unbind("keydown");  //  단축키 이벤트 제거
                }
            }
        ]);
    }
);
src/main/webapp/scripts/app/ispField/ispFieldList.controller.js
@@ -13,13 +13,46 @@
                //  함수
                $scope.fn = {
                    getPageList : getPageList, // ISP 관리 리스트
                    makeTableConfigs : makeTableConfigs, //  테이블 설정
                    initSearch : initSearch, //검색 조건 초기화
                    add : add, //ISP 생성
                    removes : removes, //ISP 삭제
                    makeSearchConditions : makeSearchConditions //엑셀 다운로드
                };
                //  변수
                $scope.vm = {
                    tableConfigs : [],
                };
                $scope.tableEvent = {
                    modify : modify //ISP 정보 변경
                };
                $scope.vm.search = {
                    name : "",  //  ISP 이름
                };
                $scope.vm.page = {
                    selectedPage : 0,
                    selectedPageRowCount : String(10)
                };
                $scope.vm.responseData = {
                    data : []
                };
                //  iSP 관리 리스트 불러오기
                $scope.$on("getPageList", function () {
                    $scope.fn.getPageList(0);
                });
                //  검색 조건 초기화
                function initSearch() {
                    $scope.vm.search.name = "";
                    $scope.fn.getPageList(0);
                }
                //  사용자 정의 필드 목록 테이블 설정
                function makeTableConfigs() {
@@ -35,38 +68,171 @@
                        .setDName("name")
                        .setDType("renderer")
                        .setDAlign("text-center")
                        .setDRenderer("COMMON_MODIFY"));
                        .setDRenderer("ISPFIELD_MODIFY"));
                    $scope.vm.tableConfigs.push($tableProvider.config()
                        .setHName("ispField.code")
                        .setHWidth("bold")
                        .setDName("code")
                        .setDAlign("text-center"));
                    $scope.vm.tableConfigs.push($tableProvider.config()
                        .setHName("ispField.manager")
                        .setHWidth("bold")
                        .setDName("name")
                        .setDType("renderer")
                        .setDAlign("text-center")
                        .setDRenderer("COMMON_MODIFY"));
                        .setDName("manager")
                        .setDAlign("text-center"));
                    $scope.vm.tableConfigs.push($tableProvider.config()
                        .setHName("ispField.tel")
                        .setHWidth("bold")
                        .setDName("name")
                        .setDType("renderer")
                        .setDAlign("text-center")
                        .setDRenderer("COMMON_MODIFY"));
                        .setDName("tel")
                        .setDAlign("text-center"));
                    $scope.vm.tableConfigs.push($tableProvider.config()
                        .setHName("ispField.email")
                        .setHWidth("bold")
                        .setDName("name")
                        .setDType("renderer")
                        .setDAlign("text-center")
                        .setDRenderer("COMMON_MODIFY"));
                        .setDName("email")
                        .setDAlign("text-center"));
                    $scope.vm.tableConfigs.push($tableProvider.config()
                        .setHName("ispField.desc")
                        .setHWidth("bold")
                        .setDName("name")
                        .setDType("renderer")
                        .setDAlign("text-center")
                        .setDRenderer("COMMON_MODIFY"));
                        .setDName("memo")
                        .setDAlign("text-center"));
                }
                //  ISP 관리 목록 조회
                function getPageList(selectedPage) {
                    if (selectedPage < 0) {
                        selectedPage = 0;
                    }
                    //  현재 페이지 정보
                    var currentPage = 0;
                    //  쿠키에 선택한 페이지 정보가 없으면 기본 페이지 정보 0 을 저장
                    if (angular.isUndefined(selectedPage) || selectedPage === "") {
                        currentPage = $scope.vm.page.selectedPage;
                    }
                    else {
                        currentPage = selectedPage;
                    }
                    var conditions = {
                        name : $scope.vm.search.name //ISP 명
                    };
                    //테이블 리스트 데이터 컨트롤러 요청
                    IspField.find($resourceProvider.getContent(conditions,
                        $resourceProvider.getPageContent(currentPage, $scope.vm.page.selectedPageRowCount))).then(function (result) {
                        if (result.data.message.status === "success") {
                            $scope.vm.page.selectedPage = currentPage + 1;
                            $scope.vm.responseData = result.data;
                        }
                        else {
                            SweetAlert.error($filter("translate")("ispField.failedToSelectIspFieldFullList"), result.data.message.message); // 목록 조회 실패
                        }
                    });
                }
                //  ISP 생성
                function add() {
                    $uibModal.open({
                        templateUrl : 'views/ispField/ispFieldAdd.html',
                        size : "md",
                        controller : 'ispFieldAddController',
                        backdrop : 'static',
                        resolve : {
                            parameter : function () {
                                return {
                                };
                            }
                        }
                    });
                }
                //  ISP 수정
                function modify(id) {
                    $uibModal.open({
                        templateUrl : 'views/ispField/ispFieldModify.html',
                        size : "md",
                        controller : 'ispFieldModifyController',
                        backdrop : 'static',
                        resolve : {
                            parameter : function () {
                                return {
                                    id : id
                                };
                            }
                        }
                    });
                }
                //  ISP 삭제
                function removes() {
                    var removeIds = [];
                    angular.forEach($scope.vm.responseData.data, function (data) {
                        if (data.checked) {
                            removeIds.push(data.id);
                        }
                    });
                    if (removeIds.length < 1) {
                        SweetAlert.swal({
                            title : $filter("translate")("common.checkPurgingTargets"), // 삭제 대상 확인
                            text : $filter("translate")("common.selectDestinationDeletion"), // 삭제 대상을 선택하세요.
                            type : "warning"
                        });
                        return;
                    }
                    //  삭제 알림
                    SweetAlert.swal({
                            title : $filter("translate")("ispField.delete"), // "삭제"
                            text : $filter("translate")("ispField.wantToDeleteSelectIspField"),
                            type : "warning",
                            showCancelButton : true,
                            confirmButtonColor : "#DD6B55",
                            confirmButtonText : $filter("translate")("common.delete"), // 삭제
                            cancelButtonText : $filter("translate")("common.cancel"), // 취소
                            closeOnConfirm : false,
                            closeOnCancel : true
                        },
                        function (isConfirm) {
                            SweetAlert.close();
                            if (isConfirm) {
                                $rootScope.spinner = true;
                                IspField.removes($resourceProvider.getContent(
                                    { removeIds : removeIds },
                                    $resourceProvider.getPageContent(0, 0))).then(function (result) {
                                    if (result.data.message.status === "success") {
                                        $timeout(function () {
                                            SweetAlert.success($filter("translate")("common.deleteSucceeded"), result.data.message.message); // 삭제 성공
                                        }, 100);
                                        $scope.fn.getPageList(0);
                                    }
                                    else {
                                        $timeout(function () {
                                            SweetAlert.error($filter("translate")("common.deleteFailed"), result.data.message.message); // 삭제 실패
                                        }, 100);
                                    }
                                    $rootScope.spinner = false;
                                });
                            }
                        });
                }
                function makeSearchConditions() {
                    var conditions = {
                        name: $scope.vm.search.name
                    }
                    return conditions;
                }
                $scope.fn.makeTableConfigs();
                $scope.fn.getPageList();
            }
        ]);
    }
src/main/webapp/scripts/app/ispField/ispFieldModify.controller.js
New file
@@ -0,0 +1,113 @@
/**
 * Created by wisestone on 2018-05-08.
 */
'use strict';
define([
        'app',
        'angular'
    ],
    function (app, angular) {
        app.controller('ispFieldModifyController', ['$scope', '$rootScope', '$log', '$resourceProvider', '$uibModalInstance', 'IspField', 'parameter', 'SweetAlert', '$filter', '$q',
            function ($scope, $rootScope, $log, $resourceProvider, $uibModalInstance, IspField, parameter, SweetAlert, $filter, $q) {
                $scope.fn = {
                    detail : detail,  //  상세 조회
                    cancel : cancel,    //  팝업 창 닫기
                    formSubmit : formSubmit,    //  폼 전송
                    formCheck : formCheck,  //  폼 체크
                };
                $scope.vm = {
                    id : parameter.id,
                    form : {
                        name : "",  //ISP명
                        manager : "",   //담당자
                        tel : "",  //전화번호
                        email : "",  //이메일
                        memo : ""  //메모(비고)
                    }
                };
                function formCheck(formInvalid) {
                    if (formInvalid) {
                        return true;
                    }
                    return false;
                }
                //  폼 전송
                function formSubmit() {
                    $rootScope.spinner = true;
                    var content = {
                        id : parameter.id,
                        code : $rootScope.preventXss($scope.vm.form.name),
                        name : $rootScope.preventXss($scope.vm.form.name),
                        manager : $rootScope.preventXss($scope.vm.form.manager),
                        tel : $rootScope.preventXss($scope.vm.form.tel),
                        email : $rootScope.preventXss($scope.vm.form.email),
                        memo : $rootScope.preventXss($scope.vm.form.memo)
                    };
                    IspField.modify($resourceProvider.getContent(
                        content,
                        $resourceProvider.getPageContent(0, 0))).then(function (result) {
                        if (result.data.message.status === "success") {
                            $scope.fn.cancel();
                            //  목록 화면 갱신
                            $rootScope.$broadcast("getPageList", {});
                        }
                        else {
                            SweetAlert.error($filter("translate")("ispField.failedIspFieldRegistration"), result.data.message.message); //등록 실패
                        }
                        $rootScope.spinner = false;
                    });
                }
                //  팝업 창 닫기
                function cancel() {
                    $rootScope.$broadcast("closeLayer");    //  팝업이 열리고 나서 js-multi, js-single 등에서 body 이벤트가 날아가는 현상 수정
                    $uibModalInstance.dismiss('cancel');
                    $(document).unbind("keydown");  //  단축키 이벤트 제거
                }
                //  상세 정보
                function detail() {
                    var deferred = $q.defer();
                    var conditions = {
                        id : parameter.id
                    }
                    IspField.detail($resourceProvider.getContent(
                        conditions,
                        $resourceProvider.getPageContent(0, 1))).then(function (result) {
                        if (result.data.message.status === "success") {
                            if (angular.isDefined(result.data.content)) {
                                $scope.vm.form.code = result.data.content.code;
                                $scope.vm.form.name = result.data.content.name;
                                $scope.vm.form.manager = result.data.content.manager;
                                $scope.vm.form.email = result.data.content.email;
                                $scope.vm.form.tel = result.data.content.tel;
                                $scope.vm.form.memo = result.data.content.memo;
                            }
                        }
                        else {
                            SweetAlert.swal($filter("translate")("ispField.failedToDetailIspFieldModify"), result.data.message.message, "error"); // "상세 정보 조회 실패"
                        }
                        deferred.resolve(result.data.data);
                    });
                    return deferred.promise;
                }
                $scope.fn.detail();
            }]);
    });
src/main/webapp/scripts/components/HostingField/hostingField.service.js
@@ -9,11 +9,37 @@
    app.factory("HostingField", ['$http', '$log', function ($http, $log) {
        return {
            find : function (conditions) {
                return $http.post("HostingField/find", conditions).then(function (response) {
                return $http.post("hostingField/find", conditions).then(function (response) {
                    $log.debug("Hosting 필드 목록 데이터 : ", response);
                    return response;
                });
            },
            add : function (conditions) {
                return $http.post("hostingField/add", conditions).then(function (response) {
                    $log.debug("HostingField 생성 결과 : ", response);
                    return response;
                });
            },
            modify : function (conditions) {
                return $http.post("hostingField/modify", conditions).then(function (response) {
                    $log.debug("HostingField 수정 결과 : ", response);
                    return response;
                });
            },
            detail : function (conditions) {
                return $http.post("hostingField/detail", conditions).then(function (response) {
                    $log.debug("HostingField 상세 : ", response);
                    return response;
                });
            },
            removes : function (conditions) {
                return $http.post("hostingField/remove", conditions).then(function (response) {
                    $log.debug("HostingField 삭제 결과 : ", response);
                    return response;
                });
            }
        }
    }
    ]);
src/main/webapp/scripts/components/ispField/ispField.service.js
@@ -9,10 +9,34 @@
    app.factory("IspField", ['$http', '$log', function ($http, $log) {
        return {
            find : function (conditions) {
                return $http.post("IspField/find", conditions).then(function (response) {
                return $http.post("ispField/find", conditions).then(function (response) {
                    $log.debug("ISP 필드 목록 데이터 : ", response);
                    return response;
                });
            },
            add : function (conditions) {
                return $http.post("ispField/add", conditions).then(function (response) {
                    $log.debug("IspField 생성 결과 : ", response);
                    return response;
                });
            },
            modify : function (conditions) {
                return $http.post("ispField/modify", conditions).then(function (response) {
                    $log.debug("IspField 수정 결과 : ", response);
                    return response;
                });
            },
            detail : function (conditions) {
                return $http.post("ispField/detail", conditions).then(function (response) {
                    $log.debug("IspField 상세 : ", response);
                    return response;
                });
            },
            removes : function (conditions) {
                return $http.post("ispField/remove", conditions).then(function (response) {
                    $log.debug("IspField 삭제 결과 : ", response);
                    return response;
                });
            }
        }
    }
src/main/webapp/scripts/main.js
@@ -339,11 +339,15 @@
        'ispFieldRoute' : 'app/ispField/ispField',   // ISP route 정보
        'ispFieldService' : 'components/ispField/ispField.service',  // ISP 관련된 통신 담당
        'ispFieldListController' : 'app/ispField/ispFieldList.controller', // ISP 목록 컨트롤러
        'ispFieldAddController' : 'app/ispField/ispFieldAdd.controller', // ISP 생성 컨트롤러
        'ispFieldModifyController' : 'app/ispField/ispFieldModify.controller', // ISP 수정 컨트롤러
        /* 호스팅 */
        'hostingFieldRoute' : 'app/hostingField/hostingField',   // 호스팅 route 정보
        'hostingFieldService' : 'components/HostingField/hostingField.service',  // 호스팅 관련된 통신 담당
        'hostingFieldListController' : 'app/hostingField/hostingFieldList.controller', // 호스팅 목록 컨트롤러
        'hostingFieldAddController' : 'app/hostingField/hostingFieldAdd.controller', // 호스팅 생성 컨트롤러
        'hostingFieldModifyController' : 'app/hostingField/hostingFieldModify.controller', // 호스팅 수정 컨트롤러
    },
    shim : {
        'jquery-ui' : {
src/main/webapp/views/companyField/companyFieldAdd.html
@@ -27,7 +27,7 @@
                       ng-maxlength="100"
                       maxlength="100"
                       required>
                <!--<small translate="notice.enterSpecialCharacters">제목에는 특수 문자를 입력할 수 없습니다.</small>-->
                <small translate="companyField.enterSpecialCharacters">업체 이름에는 특수 문자를 입력 할수 없습니다.</small>
            </div>
            <!--<div class="row">
                <div class="col-md-3">
@@ -132,12 +132,14 @@
                           type="text"
                           class="form-control"
                           kr-input
                           input-regex="[^0-9]"
                           ng-pattern="/^\d{2,3}-\d{3,4}-\d{4}$/"
                           autocomplete="off"
                           ng-model="vm.form.tel"
                           maxlength="20"
                    >
                    <!--<small translate="notice.enterSpecialCharacters">제목에는 특수 문자를 입력할 수 없습니다.</small>-->
                    <div ng-show="companyFieldAddForm.tel.$error.pattern" class="help-block form-text text-danger"
                         translate="companyField.invalidTelFormat">전화번호 형식이 맞지 않습니다. xxx-xxx-xxxx 형식으로 입력하세요.
                    </div>
                </div>
            </div>
            <div>
@@ -155,7 +157,9 @@
                           kr-input
                           ng-pattern="/^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/"
                    >
                    <!--<small translate="notice.enterSpecialCharacters">제목에는 특수 문자를 입력할 수 없습니다.</small>-->
                    <div ng-show="companyFieldAddForm.email.$error.pattern" class="help-block form-text text-danger"
                         translate="users.invalidEmailFormat">이메일 형식이 맞지 않습니다.
                    </div>
                </div>
            </div>
            <div>
src/main/webapp/views/hostingField/hostingFieldAdd.html
New file
@@ -0,0 +1,137 @@
<div class="formModal">
    <div class="modal-header faded smaller">
        <div class="modal-title">
            <strong>호스팅 등록</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="hostingFieldAddForm">
            <div class="form-group">
                <label for="hostingFieldAddForm1">
                    <span translate="hostingField.name">호스팅명</span>
                    <code class="highlighter-rouge">*</code>
                </label>
                <input id="hostingFieldAddForm1"
                       name="name"
                       type="text"
                       class="form-control"
                       autofocus
                       kr-input
                       input-regex="[^a-zA-Z0-9 가-힣ㄱ-ㅎㅏ-ㅣ\u318D\u119E\u11A2\u2022\u2025a\u00B7\uFE55]"
                       autocomplete="off"
                       ng-model="vm.form.name"
                       ng-maxlength="100"
                       maxlength="100"
                       required>
                <small translate="hostingField.enterSpecialCharacters">호스팅 이름에는 특수 문자를 입력 할수 없습니다.</small>
            </div>
            <div class="form-group">
                <label for="hostingFieldAddForm10">
                    <span translate="hostingField.code">코드</span>
                    <code class="highlighter-rouge">*</code>
                </label>
                <input id="hostingFieldAddForm10"
                       name="code"
                       type="text"
                       class="form-control"
                       kr-input
                       input-regex="[^a-zA-Z0-9 가-힣ㄱ-ㅎㅏ-ㅣ\u318D\u119E\u11A2\u2022\u2025a\u00B7\uFE55]"
                       autocomplete="off"
                       ng-model="vm.form.code"
                       ng-maxlength="100"
                       maxlength="100"
                       required>
                <small translate="hostingField.invalidCodeFormat">코드명에는 특수 문자를 입력 할수 없습니다.</small>
            </div>
            <div>
                <div class="form-group">
                    <label for="hostingFieldAddForm9" class="issue-label">
                        <span translate="hostingField.manager">담당자</span>
                    </label>
                    <input id="hostingFieldAddForm9"
                           name="manager"
                           type="text"
                           class="form-control"
                           kr-input
                           input-regex="[^a-zA-Z0-9 가-힣ㄱ-ㅎㅏ-ㅣ\u318D\u119E\u11A2\u2022\u2025a\u00B7\uFE55]"
                           autocomplete="off"
                           ng-model="vm.form.manager"
                           ng-maxlength="100"
                           maxlength="100"
                    >
                </div>
            </div>
            <div>
                <div class="form-group">
                    <label for="hostingFieldAddForm7" class="issue-label">
                        <span translate="hostingField.tel">전화번호</span>
                    </label>
                    <input id="hostingFieldAddForm7"
                           name="tel"
                           type="text"
                           class="form-control"
                           kr-input
                           ng-pattern="/^\d{2,3}-\d{3,4}-\d{4}$/"
                           autocomplete="off"
                           ng-model="vm.form.tel"
                           maxlength="20"
                    >
                    <div ng-show="hostingFieldAddForm.tel.$error.pattern" class="help-block form-text text-danger"
                         translate="companyField.invalidTelFormat">전화번호 형식이 맞지 않습니다. xxx-xxx-xxxx 형식으로 입력하세요.
                    </div>
                </div>
            </div>
            <div>
                <div class="form-group">
                    <label for="hostingFieldAddForm6" class="issue-label">
                        <span translate="hostingField.email">이메일</span>
                    </label>
                    <input id="hostingFieldAddForm6"
                           name="email"
                           type="email"
                           class="form-control"
                           autocomplete="off"
                           maxLength="50"
                           ng-model="vm.form.email"
                           kr-input
                           ng-pattern="/^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/"
                    >
                    <div ng-show="hostingFieldAddForm.email.$error.pattern" class="help-block form-text text-danger"
                         translate="users.invalidEmailFormat">이메일 형식이 맞지 않습니다.
                    </div>
                </div>
            </div>
            <div>
                <div class="form-group">
                    <label for="hostingFieldAddForm8" class="issue-label">
                        <span translate="hostingField.desc">비고</span>
                    </label>
                    <input id="hostingFieldAddForm8"
                           name="memo"
                           type="text"
                           class="form-control"
                           kr-input
                           autocomplete="off"
                           ng-model="vm.form.memo"
                           ng-maxlength="200"
                           maxlength="200"
                    >
                </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(hostingFieldAddForm.$invalid) || $root.spinner) ? null : fn.formSubmit()"
                ng-disabled="fn.formCheck(hostingFieldAddForm.$invalid)"
                ng-click="fn.formSubmit()"><span translate="common.save">저장</span>
        </button>
    </div>
</div>
src/main/webapp/views/hostingField/hostingFieldList.html
@@ -13,20 +13,20 @@
                <div class="row">
                    <div class="col-sm-12">
                        <div class="searchdiv">
                            <form name="customFieldListForm" role="form" ng-enter="fn.getPageList(0)">
                            <form name="hostingFieldListForm" role="form" ng-enter="fn.getPageList(0)">
                                <div class="row">
                                    <div class="col-lg-3">
                                        <div class="form-group">
                                            <label for="customFieldListForm1"><span translate="hostingField.name">사용자 정의 필드 명</span></label>
                                            <label for="hostingFieldListForm1"><span translate="hostingField.name">ISP 이름</span></label>
                                            <input type="text"
                                                   name="name"
                                                   id="customFieldListForm1"
                                                   id="hostingFieldListForm1"
                                                   autocomplete="off"
                                                   maxlength="15"
                                                   kr-input
                                                   owl-auto-focus
                                                   class="form-control"
                                                   ng-model="vm.search.name" placeholder="{{'customField.pleaseEnterUserDefinedFieldName' | translate}}">
                                                   ng-model="vm.search.name" placeholder="{{'hostingField.pleaseEnterHostingFieldName' | translate}}">
                                        </div>
                                    </div>
@@ -66,8 +66,8 @@
                        </div>
                        <div class="col-5 text-right" ng-if="$root.checkMngPermission('USER_PERMISSION_MNG_CUSTOME_FIELD')">
                            <form class="form-inline justify-content-sm-end pull-right" method="post"
                                  action="/customField/downloadExcel"
                                  name="customFieldListForm">
                                  action="/hostingField/downloadExcel"
                                  name="hostingFieldListForm">
                                <input type="hidden" name="conditions">
                                <div class="btn-group">
                                    <button aria-expanded="false" aria-haspopup="true"
@@ -76,7 +76,7 @@
                                    </button>
                                    <div aria-labelledby="dropdownMenuButton2" class="dropdown-menu left-menu"
                                         x-placement="bottom-start">
                                        <a class="dropdown-item cursor" form-submit="customFieldListForm" make-search-conditions="fn.makeSearchConditions()"><span translate="common.downloadExcel">엑셀 다운로드</span></a>
                                        <a class="dropdown-item cursor" form-submit="hostingFieldListForm" make-search-conditions="fn.makeSearchConditions()"><span translate="common.downloadExcel">엑셀 다운로드</span></a>
                                        <a class="dropdown-item cursor" ng-click="fn.removes()"> <span translate="common.delete">삭제</span></a>
                                    </div>
                                </div>
src/main/webapp/views/hostingField/hostingFieldModify.html
New file
@@ -0,0 +1,134 @@
<div class="formModal">
    <div class="modal-header faded smaller">
        <div class="modal-title">
            <strong>호스팅 수정</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="hostingFieldModifyForm">
            <div class="form-group">
                <label for="hostingFieldModifyForm1">
                    <span translate="hostingField.name">호스팅명</span>
                    <code class="highlighter-rouge">*</code>
                </label>
                <input id="hostingFieldModifyForm1"
                       name="name"
                       type="text"
                       class="form-control"
                       autofocus
                       kr-input
                       input-regex="[^a-zA-Z0-9 가-힣ㄱ-ㅎㅏ-ㅣ\u318D\u119E\u11A2\u2022\u2025a\u00B7\uFE55]"
                       autocomplete="off"
                       ng-model="vm.form.name"
                       ng-maxlength="100"
                       maxlength="100"
                       required>
                <!--<small translate="notice.enterSpecialCharacters">제목에는 특수 문자를 입력할 수 없습니다.</small>-->
            </div>
            <div class="form-group">
                <label for="hostingFieldModifyForm10">
                    <span translate="hostingField.code">코드</span>
                    <code class="highlighter-rouge">*</code>
                </label>
                <input id="hostingFieldModifyForm10"
                       name="code"
                       type="text"
                       class="form-control"
                       disabled
                       kr-input
                       input-regex="[^a-zA-Z0-9 가-힣ㄱ-ㅎㅏ-ㅣ\u318D\u119E\u11A2\u2022\u2025a\u00B7\uFE55]"
                       autocomplete="off"
                       ng-model="vm.form.code"
                       ng-maxlength="100"
                       maxlength="100"
                       required>
            </div>
            <div>
                <div class="form-group">
                    <label for="hostingFieldModifyForm9" class="issue-label">
                        <span translate="hostingField.manager">담당자</span>
                    </label>
                    <input id="hostingFieldModifyForm9"
                           name="manager"
                           type="text"
                           class="form-control"
                           kr-input
                           input-regex="[^a-zA-Z0-9 가-힣ㄱ-ㅎㅏ-ㅣ\u318D\u119E\u11A2\u2022\u2025a\u00B7\uFE55]"
                           autocomplete="off"
                           ng-model="vm.form.manager"
                           ng-maxlength="100"
                           maxlength="100"
                    >
                    <!--<small translate="notice.enterSpecialCharacters">제목에는 특수 문자를 입력할 수 없습니다.</small>-->
                </div>
            </div>
            <div>
                <div class="form-group">
                    <label for="hostingFieldModifyForm7" class="issue-label">
                        <span translate="hostingField.tel">전화번호</span>
                    </label>
                    <input id="hostingFieldModifyForm7"
                           name="tel"
                           type="text"
                           class="form-control"
                           kr-input
                           input-regex="[^0-9]"
                           autocomplete="off"
                           ng-model="vm.form.tel"
                           maxlength="20"
                    >
                    <!--<small translate="notice.enterSpecialCharacters">제목에는 특수 문자를 입력할 수 없습니다.</small>-->
                </div>
            </div>
            <div>
                <div class="form-group">
                    <label for="hostingFieldModifyForm6" class="issue-label">
                        <span translate="hostingField.email">이메일</span>
                    </label>
                    <input id="hostingFieldModifyForm6"
                           name="email"
                           type="email"
                           class="form-control"
                           autocomplete="off"
                           maxLength="50"
                           ng-model="vm.form.email"
                           kr-input
                           ng-pattern="/^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/"
                    >
                    <!--<small translate="notice.enterSpecialCharacters">제목에는 특수 문자를 입력할 수 없습니다.</small>-->
                </div>
            </div>
            <div>
                <div class="form-group">
                    <label for="hostingFieldModifyForm8" class="issue-label">
                        <span translate="hostingField.desc">비고</span>
                    </label>
                    <input id="hostingFieldModifyForm8"
                           name="memo"
                           type="text"
                           class="form-control"
                           kr-input
                           autocomplete="off"
                           ng-model="vm.form.memo"
                           ng-maxlength="200"
                           maxlength="200"
                    >
                </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(hostingFieldModifyForm.$invalid) || $root.spinner) ? null : fn.formSubmit()"
                ng-disabled="fn.formCheck(hostingFieldModifyForm.$invalid)"
                ng-click="fn.formSubmit()"><span translate="common.save">저장</span>
        </button>
    </div>
</div>
src/main/webapp/views/ispField/ispFieldAdd.html
New file
@@ -0,0 +1,137 @@
<div class="formModal">
    <div class="modal-header faded smaller">
        <div class="modal-title">
            <strong>ISP 등록</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="ispFieldAddForm">
            <div class="form-group">
                <label for="ispFieldAddForm1">
                    <span translate="ispField.name">ISP명</span>
                    <code class="highlighter-rouge">*</code>
                </label>
                <input id="ispFieldAddForm1"
                       name="name"
                       type="text"
                       class="form-control"
                       autofocus
                       kr-input
                       input-regex="[^a-zA-Z0-9 가-힣ㄱ-ㅎㅏ-ㅣ\u318D\u119E\u11A2\u2022\u2025a\u00B7\uFE55]"
                       autocomplete="off"
                       ng-model="vm.form.name"
                       ng-maxlength="100"
                       maxlength="100"
                       required>
                <small translate="ispField.enterSpecialCharacters">ISP 이름에는 특수 문자를 입력 할수 없습니다.</small>
            </div>
            <div class="form-group">
                <label for="ispFieldAddForm10">
                    <span translate="ispField.code">코드</span>
                    <code class="highlighter-rouge">*</code>
                </label>
                <input id="ispFieldAddForm10"
                       name="code"
                       type="text"
                       class="form-control"
                       kr-input
                       input-regex="[^a-zA-Z0-9 가-힣ㄱ-ㅎㅏ-ㅣ\u318D\u119E\u11A2\u2022\u2025a\u00B7\uFE55]"
                       autocomplete="off"
                       ng-model="vm.form.code"
                       ng-maxlength="100"
                       maxlength="100"
                       required>
                <small translate="hostingField.invalidCodeFormat">코드명에는 특수 문자를 입력 할수 없습니다.</small>
            </div>
            <div>
                <div class="form-group">
                    <label for="ispFieldAddForm9" class="issue-label">
                        <span translate="ispField.manager">담당자</span>
                    </label>
                    <input id="ispFieldAddForm9"
                           name="manager"
                           type="text"
                           class="form-control"
                           kr-input
                           input-regex="[^a-zA-Z0-9 가-힣ㄱ-ㅎㅏ-ㅣ\u318D\u119E\u11A2\u2022\u2025a\u00B7\uFE55]"
                           autocomplete="off"
                           ng-model="vm.form.manager"
                           ng-maxlength="100"
                           maxlength="100"
                    >
                </div>
            </div>
            <div>
                <div class="form-group">
                    <label for="ispFieldAddForm7" class="issue-label">
                        <span translate="ispField.tel">전화번호</span>
                    </label>
                    <input id="ispFieldAddForm7"
                           name="tel"
                           type="text"
                           class="form-control"
                           kr-input
                           ng-pattern="/^\d{2,3}-\d{3,4}-\d{4}$/"
                           autocomplete="off"
                           ng-model="vm.form.tel"
                           maxlength="20"
                    >
                    <div ng-show="ispFieldAddForm.tel.$error.pattern" class="help-block form-text text-danger"
                         translate="companyField.invalidTelFormat">전화번호 형식이 맞지 않습니다. xxx-xxx-xxxx 형식으로 입력하세요.
                    </div>
                </div>
            </div>
            <div>
                <div class="form-group">
                    <label for="ispFieldAddForm6" class="issue-label">
                        <span translate="ispField.email">이메일</span>
                    </label>
                    <input id="ispFieldAddForm6"
                           name="email"
                           type="email"
                           class="form-control"
                           autocomplete="off"
                           maxLength="50"
                           ng-model="vm.form.email"
                           kr-input
                           ng-pattern="/^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/"
                    >
                    <div ng-show="ispFieldAddForm.email.$error.pattern" class="help-block form-text text-danger"
                         translate="users.invalidEmailFormat">이메일 형식이 맞지 않습니다.
                    </div>
                </div>
            </div>
            <div>
                <div class="form-group">
                    <label for="ispFieldAddForm8" class="issue-label">
                        <span translate="ispField.desc">비고</span>
                    </label>
                    <input id="ispFieldAddForm8"
                           name="memo"
                           type="text"
                           class="form-control"
                           kr-input
                           autocomplete="off"
                           ng-model="vm.form.memo"
                           ng-maxlength="200"
                           maxlength="200"
                    >
                </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(ispFieldAddForm.$invalid) || $root.spinner) ? null : fn.formSubmit()"
                ng-disabled="fn.formCheck(ispFieldAddForm.$invalid)"
                ng-click="fn.formSubmit()"><span translate="common.save">저장</span>
        </button>
    </div>
</div>
src/main/webapp/views/ispField/ispFieldList.html
@@ -13,20 +13,20 @@
                <div class="row">
                    <div class="col-sm-12">
                        <div class="searchdiv">
                            <form name="customFieldListForm" role="form" ng-enter="fn.getPageList(0)">
                            <form name="ispFieldListForm" role="form" ng-enter="fn.getPageList(0)">
                                <div class="row">
                                    <div class="col-lg-3">
                                        <div class="form-group">
                                            <label for="customFieldListForm1"><span translate="ispField.name">사용자 정의 필드 명</span></label>
                                            <label for="ispFieldListForm1"><span translate="ispField.name">사용자 정의 필드 명</span></label>
                                            <input type="text"
                                                   name="name"
                                                   id="customFieldListForm1"
                                                   id="ispFieldListForm1"
                                                   autocomplete="off"
                                                   maxlength="15"
                                                   kr-input
                                                   owl-auto-focus
                                                   class="form-control"
                                                   ng-model="vm.search.name" placeholder="{{'customField.pleaseEnterUserDefinedFieldName' | translate}}">
                                                   ng-model="vm.search.name" placeholder="{{'ispField.pleaseEnterIspFieldName' | translate}}">
                                        </div>
                                    </div>
@@ -66,8 +66,8 @@
                        </div>
                        <div class="col-5 text-right" ng-if="$root.checkMngPermission('USER_PERMISSION_MNG_CUSTOME_FIELD')">
                            <form class="form-inline justify-content-sm-end pull-right" method="post"
                                  action="/customField/downloadExcel"
                                  name="customFieldListForm">
                                  action="/ispField/downloadExcel"
                                  name="ispFieldListForm">
                                <input type="hidden" name="conditions">
                                <div class="btn-group">
                                    <button aria-expanded="false" aria-haspopup="true"
@@ -76,7 +76,7 @@
                                    </button>
                                    <div aria-labelledby="dropdownMenuButton2" class="dropdown-menu left-menu"
                                         x-placement="bottom-start">
                                        <a class="dropdown-item cursor" form-submit="customFieldListForm" make-search-conditions="fn.makeSearchConditions()"><span translate="common.downloadExcel">엑셀 다운로드</span></a>
                                        <a class="dropdown-item cursor" form-submit="ispFieldListForm" make-search-conditions="fn.makeSearchConditions()"><span translate="common.downloadExcel">엑셀 다운로드</span></a>
                                        <a class="dropdown-item cursor" ng-click="fn.removes()"> <span translate="common.delete">삭제</span></a>
                                    </div>
                                </div>
src/main/webapp/views/ispField/ispFieldModify.html
New file
@@ -0,0 +1,135 @@
<div class="formModal">
    <div class="modal-header faded smaller">
        <div class="modal-title">
            <strong>ISP 수정</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="hostingFieldModifyForm">
            <div class="form-group">
                <label for="hostingFieldModifyForm1">
                    <span translate="hostingField.name">ISP명</span>
                    <code class="highlighter-rouge">*</code>
                </label>
                <input id="hostingFieldModifyForm1"
                       name="name"
                       type="text"
                       class="form-control"
                       autofocus
                       kr-input
                       input-regex="[^a-zA-Z0-9 가-힣ㄱ-ㅎㅏ-ㅣ\u318D\u119E\u11A2\u2022\u2025a\u00B7\uFE55]"
                       autocomplete="off"
                       ng-model="vm.form.name"
                       ng-maxlength="100"
                       maxlength="100"
                       required>
                <!--<small translate="notice.enterSpecialCharacters">제목에는 특수 문자를 입력할 수 없습니다.</small>-->
            </div>
            <div class="form-group">
                <label for="hostingFieldModifyForm10">
                    <span translate="ispField.code">코드</span>
                    <code class="highlighter-rouge">*</code>
                </label>
                <input id="hostingFieldModifyForm10"
                       name="code"
                       type="text"
                       class="form-control"
                       disabled
                       kr-input
                       input-regex="[^a-zA-Z0-9 가-힣ㄱ-ㅎㅏ-ㅣ\u318D\u119E\u11A2\u2022\u2025a\u00B7\uFE55]"
                       autocomplete="off"
                       ng-model="vm.form.code"
                       ng-maxlength="100"
                       maxlength="100"
                       required>
                <small translate="hostingField.invalidCodeFormat">코드명에는 특수 문자를 입력 할수 없습니다.</small>
            </div>
            <div>
                <div class="form-group">
                    <label for="hostingFieldModifyForm9" class="issue-label">
                        <span translate="hostingField.manager">담당자</span>
                    </label>
                    <input id="hostingFieldModifyForm9"
                           name="manager"
                           type="text"
                           class="form-control"
                           kr-input
                           input-regex="[^a-zA-Z0-9 가-힣ㄱ-ㅎㅏ-ㅣ\u318D\u119E\u11A2\u2022\u2025a\u00B7\uFE55]"
                           autocomplete="off"
                           ng-model="vm.form.manager"
                           ng-maxlength="100"
                           maxlength="100"
                    >
                    <!--<small translate="notice.enterSpecialCharacters">제목에는 특수 문자를 입력할 수 없습니다.</small>-->
                </div>
            </div>
            <div>
                <div class="form-group">
                    <label for="hostingFieldModifyForm7" class="issue-label">
                        <span translate="hostingField.tel">전화번호</span>
                    </label>
                    <input id="hostingFieldModifyForm7"
                           name="tel"
                           type="text"
                           class="form-control"
                           kr-input
                           input-regex="[^0-9]"
                           autocomplete="off"
                           ng-model="vm.form.tel"
                           maxlength="20"
                    >
                    <!--<small translate="notice.enterSpecialCharacters">제목에는 특수 문자를 입력할 수 없습니다.</small>-->
                </div>
            </div>
            <div>
                <div class="form-group">
                    <label for="hostingFieldModifyForm6" class="issue-label">
                        <span translate="hostingField.email">이메일</span>
                    </label>
                    <input id="hostingFieldModifyForm6"
                           name="email"
                           type="email"
                           class="form-control"
                           autocomplete="off"
                           maxLength="50"
                           ng-model="vm.form.email"
                           kr-input
                           ng-pattern="/^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/"
                    >
                    <!--<small translate="notice.enterSpecialCharacters">제목에는 특수 문자를 입력할 수 없습니다.</small>-->
                </div>
            </div>
            <div>
                <div class="form-group">
                    <label for="hostingFieldModifyForm8" class="issue-label">
                        <span translate="hostingField.desc">비고</span>
                    </label>
                    <input id="hostingFieldModifyForm8"
                           name="memo"
                           type="text"
                           class="form-control"
                           kr-input
                           autocomplete="off"
                           ng-model="vm.form.memo"
                           ng-maxlength="200"
                           maxlength="200"
                    >
                </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(hostingFieldModifyForm.$invalid) || $root.spinner) ? null : fn.formSubmit()"
                ng-disabled="fn.formCheck(hostingFieldModifyForm.$invalid)"
                ng-click="fn.formSubmit()"><span translate="common.save">저장</span>
        </button>
    </div>
</div>