OWL ITS + 탐지시스템(인터넷 진흥원)
- etc 메뉴추가
=> 업체 관리/ISP관리/호스팅 관리 메뉴 추가
=> 관련 파일들만 추가. 추가 구현 필요.
12개 파일 추가됨
4개 파일 변경됨
830 ■■■■■ 파일 변경됨
src/main/webapp/i18n/ko/global.json 28 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/scripts/app/companyField/companyField.js 45 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/scripts/app/companyField/companyFieldList.controller.js 77 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/scripts/app/hostingField/hostingField.js 45 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/scripts/app/hostingField/hostingFieldList.controller.js 73 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/scripts/app/ispField/ispField.js 45 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/scripts/app/ispField/ispFieldList.controller.js 73 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/scripts/components/HostingField/hostingField.service.js 20 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/scripts/components/companyField/companyField.service.js 20 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/scripts/components/ispField/ispField.service.js 20 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/scripts/main.js 24 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/views/common/sidebar.html 26 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/views/companyField/companyFieldList.html 110 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/views/hostingField/hostingFieldList.html 110 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/views/ispField/ispFieldList.html 110 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/views/project/projectAdd.html 4 ●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/i18n/ko/global.json
@@ -291,6 +291,7 @@
        "projectType": "프로젝트 타입",
        "projectAdmin": "프로젝트 관리자",
        "projectTeam": "프로젝트 팀원",
        "projectDepartment": "프로젝트 담당부서",
        "modifyProject": "프로젝트 수정",
        "settingCustomFields": "사용자 정의 필드 설정",
        "selectCustomField": "사용자 정의 필드 선택",
@@ -601,6 +602,9 @@
        "changeReason": "변경 사유",
        "failedToIssueStatusListLookup": "이슈 상태 목록 조회 실패",
        "customField": "사용자 정의 필드",
        "customCompanyField" : "업체 관리",
        "customIspField" : "ISP 관리",
        "customHostingField" : "호스팅 관리",
        "select": "선택",
        "checkAll": "전체 선택",
        "unCheckAll": "전체 해제",
@@ -772,5 +776,29 @@
        "create" : "토큰 생성",
        "example" : "사용 예시",
        "columnSetting" : "기본값 설정"
    },
    "companyField" : {
        "add" : "업체 생성",
        "name" : "업체 이름",
        "manager" : "담당자",
        "tel" : "전화번호",
        "email" : "이메일",
        "desc" : "비고"
    },
    "ispField" : {
        "add" : "ISP 생성",
        "name" : "ISP 이름",
        "manager" : "담당자",
        "tel" : "전화번호",
        "email" : "이메일",
        "desc" : "비고"
    },
    "hostingField" : {
        "add" : "호스팅 생성",
        "name" : "호스팅 이름",
        "manager" : "담당자",
        "tel" : "전화번호",
        "email" : "이메일",
        "desc" : "비고"
    }
}
src/main/webapp/scripts/app/companyField/companyField.js
New file
@@ -0,0 +1,45 @@
/**
 * Created by maprex on 2021-11-04.
 */
'use strict';
define(['app'],
    function (app) {
        app.config(function ($stateProvider) {
            $stateProvider
                .state('companyField', {
                    abstract : true,
                    url : "/companyField",
                    templateUrl : "views/common/app.html",
                    resolve : {
                        authorize : function (Auth) {
                            return Auth.authorize();
                        },
                        translatePartialLoader : function ($translate, $translatePartialLoader) {
                            $translatePartialLoader.addPart('global');
                            return $translate.refresh();
                        }
                    }
                })
                .state('companyField.list', {
                    url : '/companyField',
                    data : {
                        authorities : ['CUSTOM_FIELD_TOTAL']
                    },
                    templateUrl : 'views/companyField/companyFieldList.html',
                    controller : "companyFieldListController",
                    resolve : {
                        loadController : ["$q", function ($q) {
                            var deferred = $q.defer();
                            require(["companyFieldListController", 'jsTable', 'tableColumnGenerator', 'companyFieldService', 'modalFormAutoScroll'
                                , 'formSubmit', 'jsShortCut', 'inputRegex'], function () {
                                deferred.resolve();
                            });
                            return deferred.promise;
                        }]
                    }
                });
        })
    });
src/main/webapp/scripts/app/companyField/companyFieldList.controller.js
New file
@@ -0,0 +1,77 @@
/**
 * Created by maprex on 2021-11-04.
 */
'use strict';
define([
        'app',
        'angular'
    ],
    function (app, angular) {
        app.controller('companyFieldListController', ['$scope', '$rootScope', '$log', '$resourceProvider', '$tableProvider', '$state', '$uibModal', 'CompanyField', 'SweetAlert', '$timeout', '$filter',
            function ($scope, $rootScope, $log, $resourceProvider, $tableProvider, $state, $uibModal, CompanyField, SweetAlert, $timeout, $filter) {
                //  함수
                $scope.fn = {
                    makeTableConfigs : makeTableConfigs, //  테이블 설정
                };
                //  변수
                $scope.vm = {
                    tableConfigs : [],
                };
                $scope.vm.responseData = {
                    data : []
                };
                //  사용자 정의 필드 목록 테이블 설정
                function makeTableConfigs() {
                    $scope.vm.tableConfigs = [];
                    $scope.vm.tableConfigs.push($tableProvider.config()
                        .setDType("checkbox")
                        .setHWidth("width-20-p")
                        .setDAlign("text-center"));
                    $scope.vm.tableConfigs.push($tableProvider.config()
                        .setHName("companyField.name")
                        .setHWidth("bold")
                        .setDName("name")
                        .setDType("renderer")
                        .setDAlign("text-center")
                        .setDRenderer("COMMON_MODIFY"));
                    $scope.vm.tableConfigs.push($tableProvider.config()
                        .setHName("companyField.manager")
                        .setHWidth("bold")
                        .setDName("name")
                        .setDType("renderer")
                        .setDAlign("text-center")
                        .setDRenderer("COMMON_MODIFY"));
                    $scope.vm.tableConfigs.push($tableProvider.config()
                        .setHName("companyField.tel")
                        .setHWidth("bold")
                        .setDName("name")
                        .setDType("renderer")
                        .setDAlign("text-center")
                        .setDRenderer("COMMON_MODIFY"));
                    $scope.vm.tableConfigs.push($tableProvider.config()
                        .setHName("companyField.email")
                        .setHWidth("bold")
                        .setDName("name")
                        .setDType("renderer")
                        .setDAlign("text-center")
                        .setDRenderer("COMMON_MODIFY"));
                    $scope.vm.tableConfigs.push($tableProvider.config()
                        .setHName("companyField.desc")
                        .setHWidth("bold")
                        .setDName("name")
                        .setDType("renderer")
                        .setDAlign("text-center")
                        .setDRenderer("COMMON_MODIFY"));
                }
                $scope.fn.makeTableConfigs();
            }
        ]);
    }
);
src/main/webapp/scripts/app/hostingField/hostingField.js
New file
@@ -0,0 +1,45 @@
/**
 * Created by maprex on 2021-11-04.
 */
'use strict';
define(['app'],
    function (app) {
        app.config(function ($stateProvider) {
            $stateProvider
                .state('hostingField', {
                    abstract : true,
                    url : "/hostingField",
                    templateUrl : "views/common/app.html",
                    resolve : {
                        authorize : function (Auth) {
                            return Auth.authorize();
                        },
                        translatePartialLoader : function ($translate, $translatePartialLoader) {
                            $translatePartialLoader.addPart('global');
                            return $translate.refresh();
                        }
                    }
                })
                .state('hostingField.list', {
                    url : '/hostingField',
                    data : {
                        authorities : ['CUSTOM_FIELD_TOTAL']
                    },
                    templateUrl : 'views/hostingField/hostingFieldList.html',
                    controller : "hostingFieldListController",
                    resolve : {
                        loadController : ["$q", function ($q) {
                            var deferred = $q.defer();
                            require(["hostingFieldListController", 'jsTable', 'tableColumnGenerator', 'hostingFieldService', 'modalFormAutoScroll'
                                , 'formSubmit', 'jsShortCut', 'inputRegex'], function () {
                                deferred.resolve();
                            });
                            return deferred.promise;
                        }]
                    }
                });
        })
    });
src/main/webapp/scripts/app/hostingField/hostingFieldList.controller.js
New file
@@ -0,0 +1,73 @@
/**
 * Created by maprex on 2021-11-04.
 */
'use strict';
define([
        'app',
        'angular'
    ],
    function (app, angular) {
        app.controller('hostingFieldListController', ['$scope', '$rootScope', '$log', '$resourceProvider', '$tableProvider', '$state', '$uibModal', 'HostingField', 'SweetAlert', '$timeout', '$filter',
            function ($scope, $rootScope, $log, $resourceProvider, $tableProvider, $state, $uibModal, HostingField, SweetAlert, $timeout, $filter) {
                //  함수
                $scope.fn = {
                    makeTableConfigs : makeTableConfigs, //  테이블 설정
                };
                //  변수
                $scope.vm = {
                    tableConfigs : [],
                };
                //  사용자 정의 필드 목록 테이블 설정
                function makeTableConfigs() {
                    $scope.vm.tableConfigs = [];
                    $scope.vm.tableConfigs.push($tableProvider.config()
                        .setDType("checkbox")
                        .setHWidth("width-20-p")
                        .setDAlign("text-center"));
                    $scope.vm.tableConfigs.push($tableProvider.config()
                        .setHName("hostingField.name")
                        .setHWidth("bold")
                        .setDName("name")
                        .setDType("renderer")
                        .setDAlign("text-center")
                        .setDRenderer("COMMON_MODIFY"));
                    $scope.vm.tableConfigs.push($tableProvider.config()
                        .setHName("hostingField.manager")
                        .setHWidth("bold")
                        .setDName("name")
                        .setDType("renderer")
                        .setDAlign("text-center")
                        .setDRenderer("COMMON_MODIFY"));
                    $scope.vm.tableConfigs.push($tableProvider.config()
                        .setHName("hostingField.tel")
                        .setHWidth("bold")
                        .setDName("name")
                        .setDType("renderer")
                        .setDAlign("text-center")
                        .setDRenderer("COMMON_MODIFY"));
                    $scope.vm.tableConfigs.push($tableProvider.config()
                        .setHName("hostingField.email")
                        .setHWidth("bold")
                        .setDName("name")
                        .setDType("renderer")
                        .setDAlign("text-center")
                        .setDRenderer("COMMON_MODIFY"));
                    $scope.vm.tableConfigs.push($tableProvider.config()
                        .setHName("hostingField.desc")
                        .setHWidth("bold")
                        .setDName("name")
                        .setDType("renderer")
                        .setDAlign("text-center")
                        .setDRenderer("COMMON_MODIFY"));
                }
                $scope.fn.makeTableConfigs();
            }
        ]);
    }
);
src/main/webapp/scripts/app/ispField/ispField.js
New file
@@ -0,0 +1,45 @@
/**
 * Created by maprex on 2021-11-04.
 */
'use strict';
define(['app'],
    function (app) {
        app.config(function ($stateProvider) {
            $stateProvider
                .state('ispField', {
                    abstract : true,
                    url : "/ispField",
                    templateUrl : "views/common/app.html",
                    resolve : {
                        authorize : function (Auth) {
                            return Auth.authorize();
                        },
                        translatePartialLoader : function ($translate, $translatePartialLoader) {
                            $translatePartialLoader.addPart('global');
                            return $translate.refresh();
                        }
                    }
                })
                .state('ispField.list', {
                    url : '/ispField',
                    data : {
                        authorities : ['CUSTOM_FIELD_TOTAL']
                    },
                    templateUrl : 'views/ispField/ispFieldList.html',
                    controller : "ispFieldListController",
                    resolve : {
                        loadController : ["$q", function ($q) {
                            var deferred = $q.defer();
                            require(["ispFieldListController", 'jsTable', 'tableColumnGenerator', 'ispFieldService', 'modalFormAutoScroll'
                                , 'formSubmit', 'jsShortCut', 'inputRegex'], function () {
                                deferred.resolve();
                            });
                            return deferred.promise;
                        }]
                    }
                });
        })
    });
src/main/webapp/scripts/app/ispField/ispFieldList.controller.js
New file
@@ -0,0 +1,73 @@
/**
 * Created by maprex on 2021-11-04.
 */
'use strict';
define([
        'app',
        'angular'
    ],
    function (app, angular) {
        app.controller('ispFieldListController', ['$scope', '$rootScope', '$log', '$resourceProvider', '$tableProvider', '$state', '$uibModal', 'IspField', 'SweetAlert', '$timeout', '$filter',
            function ($scope, $rootScope, $log, $resourceProvider, $tableProvider, $state, $uibModal, IspField, SweetAlert, $timeout, $filter) {
                //  함수
                $scope.fn = {
                    makeTableConfigs : makeTableConfigs, //  테이블 설정
                };
                //  변수
                $scope.vm = {
                    tableConfigs : [],
                };
                //  사용자 정의 필드 목록 테이블 설정
                function makeTableConfigs() {
                    $scope.vm.tableConfigs = [];
                    $scope.vm.tableConfigs.push($tableProvider.config()
                        .setDType("checkbox")
                        .setHWidth("width-20-p")
                        .setDAlign("text-center"));
                    $scope.vm.tableConfigs.push($tableProvider.config()
                        .setHName("ispField.name")
                        .setHWidth("bold")
                        .setDName("name")
                        .setDType("renderer")
                        .setDAlign("text-center")
                        .setDRenderer("COMMON_MODIFY"));
                    $scope.vm.tableConfigs.push($tableProvider.config()
                        .setHName("ispField.manager")
                        .setHWidth("bold")
                        .setDName("name")
                        .setDType("renderer")
                        .setDAlign("text-center")
                        .setDRenderer("COMMON_MODIFY"));
                    $scope.vm.tableConfigs.push($tableProvider.config()
                        .setHName("ispField.tel")
                        .setHWidth("bold")
                        .setDName("name")
                        .setDType("renderer")
                        .setDAlign("text-center")
                        .setDRenderer("COMMON_MODIFY"));
                    $scope.vm.tableConfigs.push($tableProvider.config()
                        .setHName("ispField.email")
                        .setHWidth("bold")
                        .setDName("name")
                        .setDType("renderer")
                        .setDAlign("text-center")
                        .setDRenderer("COMMON_MODIFY"));
                    $scope.vm.tableConfigs.push($tableProvider.config()
                        .setHName("ispField.desc")
                        .setHWidth("bold")
                        .setDName("name")
                        .setDType("renderer")
                        .setDAlign("text-center")
                        .setDRenderer("COMMON_MODIFY"));
                }
                $scope.fn.makeTableConfigs();
            }
        ]);
    }
);
src/main/webapp/scripts/components/HostingField/hostingField.service.js
New file
@@ -0,0 +1,20 @@
/**
 * Created by maprex on 2021-11-04
 */
'use strict';
define([
    'app'
], function (app) {
    app.factory("HostingField", ['$http', '$log', function ($http, $log) {
        return {
            find : function (conditions) {
                return $http.post("HostingField/find", conditions).then(function (response) {
                    $log.debug("Hosting 필드 목록 데이터 : ", response);
                    return response;
                });
            }
        }
    }
    ]);
});
src/main/webapp/scripts/components/companyField/companyField.service.js
New file
@@ -0,0 +1,20 @@
/**
 * Created by maprex on 2021-11-04
 */
'use strict';
define([
    'app'
], function (app) {
    app.factory("CompanyField", ['$http', '$log', function ($http, $log) {
        return {
            find : function (conditions) {
                return $http.post("companyField/find", conditions).then(function (response) {
                    $log.debug("업체 필드 목록 데이터 : ", response);
                    return response;
                });
            }
        }
    }
    ]);
});
src/main/webapp/scripts/components/ispField/ispField.service.js
New file
@@ -0,0 +1,20 @@
/**
 * Created by maprex on 2021-11-04
 */
'use strict';
define([
    'app'
], function (app) {
    app.factory("IspField", ['$http', '$log', function ($http, $log) {
        return {
            find : function (conditions) {
                return $http.post("IspField/find", conditions).then(function (response) {
                    $log.debug("ISP 필드 목록 데이터 : ", response);
                    return response;
                });
            }
        }
    }
    ]);
});
src/main/webapp/scripts/main.js
@@ -326,6 +326,21 @@
        'apiAuthController' :'app/api/apiAuth.controller',   // api 인증 컨트롤러
        'apiSettingController' : 'app/api/apiSetting.controller',    // api 설정 컨트롤러
        'apiMonitorController' : 'app/api/apiMonitor.controller', // api 모니터링 컨트롤러
        /* 업체 */
        'companyFieldRoute' : 'app/companyField/companyField',   // 업체 route 정보
        'companyFieldService' : 'components/companyField/companyField.service',  // 업체 관련된 통신 담당
        'companyFieldListController' : 'app/companyField/companyFieldList.controller', // 업체 목록 컨트롤러
        /* ISP */
        'ispFieldRoute' : 'app/ispField/ispField',   // ISP route 정보
        'ispFieldService' : 'components/ispField/ispField.service',  // ISP 관련된 통신 담당
        'ispFieldListController' : 'app/ispField/ispFieldList.controller', // ISP 목록 컨트롤러
        /* 호스팅 */
        'hostingFieldRoute' : 'app/hostingField/hostingField',   // 호스팅 route 정보
        'hostingFieldService' : 'components/HostingField/hostingField.service',  // 호스팅 관련된 통신 담당
        'hostingFieldListController' : 'app/hostingField/hostingFieldList.controller', // 호스팅 목록 컨트롤러
    },
    shim : {
        'jquery-ui' : {
@@ -513,6 +528,9 @@
    'supportRoute',
    'ganttRoute',
    'apiRoute',
    'companyFieldRoute',
    'ispFieldRoute',
    'hostingFieldRoute',
    'ganttService',
    'workflowService',
    'issueSearchService',
@@ -524,8 +542,10 @@
    'qnaService',
    'taskService',
    'taskCommentService',
    'workflowStatusService'
    'workflowStatusService',
    'companyFieldService',
    'ispFieldService',
    'hostingFieldService'
], function ($, angular, domReady, app, sortable, crypto) {
    //  대시보드에서 Sortable 인식 못하는 문제 해결
    window.Sortable = sortable;
src/main/webapp/views/common/sidebar.html
@@ -331,6 +331,32 @@
                </div>
                <span translate="managementType.managementIssueType">일감 유형 관리</span></a>
        </li>
        <li class="sub-header" ng-if="$root.checkMngPermissionSettings()">
            <span>Etc</span>
        </li>
        <li class="" ng-if="$root.checkMngPermission('USER_PERMISSION_MNG_ISSUE_STATUS')">
            <a ui-sref="companyField.list" tabindex="-1">
                <div class="icon-w">
                    <div class="os-icon os-icon-agenda-1"></div>
                </div>
                <span translate="common.customCompanyField">업체 관리</span></a>
        </li>
        <li class="" ng-if="$root.checkMngPermission('USER_PERMISSION_MNG_ISSUE_STATUS')">
            <a ui-sref="ispField.list" tabindex="-1">
                <div class="icon-w">
                    <div class="os-icon os-icon-agenda-1"></div>
                </div>
                <span translate="common.customIspField">ISP 관리</span></a>
        </li>
        <li class="" ng-if="$root.checkMngPermission('USER_PERMISSION_MNG_ISSUE_STATUS')">
            <a ui-sref="hostingField.list" tabindex="-1">
                <div class="icon-w">
                    <div class="os-icon os-icon-agenda-1"></div>
                </div>
                <span translate="common.customHostingField">호스팅 관리</span></a>
        </li>
        <li class="sub-header" ng-if="$root.checkMngPermissionManager()">
            <span>Management</span>
        </li>
src/main/webapp/views/companyField/companyFieldList.html
New file
@@ -0,0 +1,110 @@
<div class="row">
    <div class="col-sm-12">
        <div class="element-wrapper">
            <div class="element-actions" ng-if="$root.checkMngPermission('USER_PERMISSION_MNG_CUSTOME_FIELD')">
                <button ng-click="fn.add()"
                        class="btn btn-xlg btn-danger"><i class="os-icon os-icon-plus"></i> <span translate="companyField.add">업체 생성</span>
                </button>
            </div>
            <h6 class="element-header" translate="common.customCompanyField">
                업체 관리
            </h6>
            <div class="element-box">
                <div class="row">
                    <div class="col-sm-12">
                        <div class="searchdiv">
                            <form name="customFieldListForm" role="form" ng-enter="fn.getPageList(0)">
                                <div class="row">
                                    <div class="col-lg-3">
                                        <div class="form-group">
                                            <label for="customFieldListForm1"><span translate="companyField.name">사용자 정의 필드 명</span></label>
                                            <input type="text"
                                                   name="name"
                                                   id="customFieldListForm1"
                                                   autocomplete="off"
                                                   maxlength="15"
                                                   kr-input
                                                   owl-auto-focus
                                                   class="form-control"
                                                   ng-model="vm.search.name" placeholder="{{'customField.pleaseEnterUserDefinedFieldName' | translate}}">
                                        </div>
                                    </div>
                                    <div class="col-lg-6">
                                        <div class="form-group form-buttons-w2">
                                            <button class="btn btn-xlg btn-navy" ng-click="fn.getPageList(0)">
                                                <i class="os-icon os-icon-ui-37"></i>
                                                &nbsp; &nbsp; <span translate="common.search">검색</span> &nbsp; &nbsp;
                                            </button>
                                            <button class="btn btn-xlg btn-white" ng-click="fn.initSearch()">
                                                <i class="os-icon os-icon-grid-18"></i>
                                                &nbsp; &nbsp;<span translate="common.reset">초기화</span> &nbsp; &nbsp;
                                            </button>
                                        </div>
                                    </div>
                                </div>
                            </form>
                        </div>
                    </div>
                </div>
                <div class="controls-above-table mt-30">
                    <div class="row">
                        <div class="col-7">
                            <div class="dataTables_length">
                                <label>
                                    <select name="pageRow"
                                            class="form-control form-control-sm"
                                            ng-change="fn.changePageRowCount()"
                                            ng-model="vm.page.selectedPageRowCount">
                                        <option value="10">10</option>
                                        <option value="50">50</option>
                                        <option value="100">100</option>
                                    </select> {{vm.page.selectedPage}}-{{vm.responseData.page.totalPage}} /
                                    {{vm.responseData.page.totalCount | number}}<span translate="common.few">건</span>
                                </label>
                            </div>
                        </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">
                                <input type="hidden" name="conditions">
                                <div class="btn-group">
                                    <button aria-expanded="false" aria-haspopup="true"
                                            class="btn btn-secondary dropdown-toggle"
                                            data-toggle="dropdown" type="button"><span translate="common.addFunction">추가기능</span>
                                    </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" ng-click="fn.removes()"> <span translate="common.delete">삭제</span></a>
                                    </div>
                                </div>
                            </form>
                        </div>
                    </div>
                </div>
                <div class="table-responsive">
                    <js-table data="vm.responseData.data" table-configs="vm.tableConfigs" event="tableEvent"></js-table>
                </div>
                <div class="controls-below-table text-center">
                    <ul uib-pagination
                        boundary-links-numbes="true"
                        items-per-page="vm.page.selectedPageRowCount"
                        total-items="vm.responseData.page.totalCount"
                        ng-model="vm.page.selectedPage"
                        max-size="10"
                        ng-click="fn.getPageList(vm.page.selectedPage-1)"
                        class="pagination pagination-sm"
                        previous-text="&lt;"
                        next-text="&gt;"
                        first-text=""
                        last-text="">
                    </ul>
                </div>
            </div>
        </div>
    </div>
</div>
src/main/webapp/views/hostingField/hostingFieldList.html
New file
@@ -0,0 +1,110 @@
<div class="row">
    <div class="col-sm-12">
        <div class="element-wrapper">
            <div class="element-actions" ng-if="$root.checkMngPermission('USER_PERMISSION_MNG_CUSTOME_FIELD')">
                <button ng-click="fn.add()"
                        class="btn btn-xlg btn-danger"><i class="os-icon os-icon-plus"></i> <span translate="hostingField.add">업체 생성</span>
                </button>
            </div>
            <h6 class="element-header" translate="common.customHostingField">
                업체 관리
            </h6>
            <div class="element-box">
                <div class="row">
                    <div class="col-sm-12">
                        <div class="searchdiv">
                            <form name="customFieldListForm" 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>
                                            <input type="text"
                                                   name="name"
                                                   id="customFieldListForm1"
                                                   autocomplete="off"
                                                   maxlength="15"
                                                   kr-input
                                                   owl-auto-focus
                                                   class="form-control"
                                                   ng-model="vm.search.name" placeholder="{{'customField.pleaseEnterUserDefinedFieldName' | translate}}">
                                        </div>
                                    </div>
                                    <div class="col-lg-6">
                                        <div class="form-group form-buttons-w2">
                                            <button class="btn btn-xlg btn-navy" ng-click="fn.getPageList(0)">
                                                <i class="os-icon os-icon-ui-37"></i>
                                                &nbsp; &nbsp; <span translate="common.search">검색</span> &nbsp; &nbsp;
                                            </button>
                                            <button class="btn btn-xlg btn-white" ng-click="fn.initSearch()">
                                                <i class="os-icon os-icon-grid-18"></i>
                                                &nbsp; &nbsp;<span translate="common.reset">초기화</span> &nbsp; &nbsp;
                                            </button>
                                        </div>
                                    </div>
                                </div>
                            </form>
                        </div>
                    </div>
                </div>
                <div class="controls-above-table mt-30">
                    <div class="row">
                        <div class="col-7">
                            <div class="dataTables_length">
                                <label>
                                    <select name="pageRow"
                                            class="form-control form-control-sm"
                                            ng-change="fn.changePageRowCount()"
                                            ng-model="vm.page.selectedPageRowCount">
                                        <option value="10">10</option>
                                        <option value="50">50</option>
                                        <option value="100">100</option>
                                    </select> {{vm.page.selectedPage}}-{{vm.responseData.page.totalPage}} /
                                    {{vm.responseData.page.totalCount | number}}<span translate="common.few">건</span>
                                </label>
                            </div>
                        </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">
                                <input type="hidden" name="conditions">
                                <div class="btn-group">
                                    <button aria-expanded="false" aria-haspopup="true"
                                            class="btn btn-secondary dropdown-toggle"
                                            data-toggle="dropdown" type="button"><span translate="common.addFunction">추가기능</span>
                                    </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" ng-click="fn.removes()"> <span translate="common.delete">삭제</span></a>
                                    </div>
                                </div>
                            </form>
                        </div>
                    </div>
                </div>
                <div class="table-responsive">
                    <js-table data="vm.responseData.data" table-configs="vm.tableConfigs" event="tableEvent"></js-table>
                </div>
                <div class="controls-below-table text-center">
                    <ul uib-pagination
                        boundary-links-numbes="true"
                        items-per-page="vm.page.selectedPageRowCount"
                        total-items="vm.responseData.page.totalCount"
                        ng-model="vm.page.selectedPage"
                        max-size="10"
                        ng-click="fn.getPageList(vm.page.selectedPage-1)"
                        class="pagination pagination-sm"
                        previous-text="&lt;"
                        next-text="&gt;"
                        first-text=""
                        last-text="">
                    </ul>
                </div>
            </div>
        </div>
    </div>
</div>
src/main/webapp/views/ispField/ispFieldList.html
New file
@@ -0,0 +1,110 @@
<div class="row">
    <div class="col-sm-12">
        <div class="element-wrapper">
            <div class="element-actions" ng-if="$root.checkMngPermission('USER_PERMISSION_MNG_CUSTOME_FIELD')">
                <button ng-click="fn.add()"
                        class="btn btn-xlg btn-danger"><i class="os-icon os-icon-plus"></i> <span translate="ispField.add">업체 생성</span>
                </button>
            </div>
            <h6 class="element-header" translate="common.customIspField">
                업체 관리
            </h6>
            <div class="element-box">
                <div class="row">
                    <div class="col-sm-12">
                        <div class="searchdiv">
                            <form name="customFieldListForm" 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>
                                            <input type="text"
                                                   name="name"
                                                   id="customFieldListForm1"
                                                   autocomplete="off"
                                                   maxlength="15"
                                                   kr-input
                                                   owl-auto-focus
                                                   class="form-control"
                                                   ng-model="vm.search.name" placeholder="{{'customField.pleaseEnterUserDefinedFieldName' | translate}}">
                                        </div>
                                    </div>
                                    <div class="col-lg-6">
                                        <div class="form-group form-buttons-w2">
                                            <button class="btn btn-xlg btn-navy" ng-click="fn.getPageList(0)">
                                                <i class="os-icon os-icon-ui-37"></i>
                                                &nbsp; &nbsp; <span translate="common.search">검색</span> &nbsp; &nbsp;
                                            </button>
                                            <button class="btn btn-xlg btn-white" ng-click="fn.initSearch()">
                                                <i class="os-icon os-icon-grid-18"></i>
                                                &nbsp; &nbsp;<span translate="common.reset">초기화</span> &nbsp; &nbsp;
                                            </button>
                                        </div>
                                    </div>
                                </div>
                            </form>
                        </div>
                    </div>
                </div>
                <div class="controls-above-table mt-30">
                    <div class="row">
                        <div class="col-7">
                            <div class="dataTables_length">
                                <label>
                                    <select name="pageRow"
                                            class="form-control form-control-sm"
                                            ng-change="fn.changePageRowCount()"
                                            ng-model="vm.page.selectedPageRowCount">
                                        <option value="10">10</option>
                                        <option value="50">50</option>
                                        <option value="100">100</option>
                                    </select> {{vm.page.selectedPage}}-{{vm.responseData.page.totalPage}} /
                                    {{vm.responseData.page.totalCount | number}}<span translate="common.few">건</span>
                                </label>
                            </div>
                        </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">
                                <input type="hidden" name="conditions">
                                <div class="btn-group">
                                    <button aria-expanded="false" aria-haspopup="true"
                                            class="btn btn-secondary dropdown-toggle"
                                            data-toggle="dropdown" type="button"><span translate="common.addFunction">추가기능</span>
                                    </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" ng-click="fn.removes()"> <span translate="common.delete">삭제</span></a>
                                    </div>
                                </div>
                            </form>
                        </div>
                    </div>
                </div>
                <div class="table-responsive">
                    <js-table data="vm.responseData.data" table-configs="vm.tableConfigs" event="tableEvent"></js-table>
                </div>
                <div class="controls-below-table text-center">
                    <ul uib-pagination
                        boundary-links-numbes="true"
                        items-per-page="vm.page.selectedPageRowCount"
                        total-items="vm.responseData.page.totalCount"
                        ng-model="vm.page.selectedPage"
                        max-size="10"
                        ng-click="fn.getPageList(vm.page.selectedPage-1)"
                        class="pagination pagination-sm"
                        previous-text="&lt;"
                        next-text="&gt;"
                        first-text=""
                        last-text="">
                    </ul>
                </div>
            </div>
        </div>
    </div>
</div>
src/main/webapp/views/project/projectAdd.html
@@ -67,7 +67,7 @@
            <div class="row">
                <div class="col-lg-6">
                    <div class="form-group">
                        <label><span translate="common.period">기간</span> <code class="highlighter-rouge">*</code></label>
                        <label><span translate="common.period">기간</span></label>
                        <input type="text"
                               class="form-control input-readonly"
                               ng-model="vm.form.startEndDateRange"
@@ -132,7 +132,7 @@
            </div>
            <div class="form-group">
                <label><span translate="project.projectTeam">프로젝트 팀원</span> </label>
                <label><span translate="project.projectDepartment">프로젝트 담당부서</span> </label>
                <js-autocomplete-multi data-input-name="users"
                                       selected-model="vm.form.users"
                                       search="vm.userName"