OWL ITS + 탐지시스템(인터넷 진흥원)
이민희
2021-11-03 aa5f2612d0b035a210dda5818e0d3d166efa6a0a
사용자등급관리 프론트 수정(상세보기 불가)
23개 파일 변경됨
2개 파일 추가됨
453 ■■■■■ 파일 변경됨
src/main/java/kr/wisestone/owl/constant/MsgConstants.java 2 ●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/service/impl/ManageUserServiceImpl.java 2 ●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/service/impl/UserLevelServiceImpl.java 2 ●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/service/impl/UserServiceImpl.java 1 ●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/service/impl/UserWorkspaceServiceImpl.java 6 ●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/vo/ManageUserVo.java 4 ●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/vo/UserLevelVo.java 4 ●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/web/form/ManageUserForm.java 10 ●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/web/form/UserLevelForm.java 14 ●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/resources/mybatis/query-template/user-template.xml 4 ●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/resources/mybatis/query-template/userLevel-template.xml 2 ●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/WEB-INF/i18n/messages_ko_KR.properties 1 ●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/custom_components/js-table/tableColumnGenerator.directive.js 13 ●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/i18n/ko/global.json 3 ●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/scripts/app/manageUser/manageUser.controller.js 7 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/scripts/app/workspace/levelModify.controller.js 114 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/scripts/app/workspace/workspace.js 2 ●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/scripts/app/workspace/workspacePaymentExecute.controller.js 5 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/scripts/app/workspace/workspaceUserConfig.controller.js 2 ●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/scripts/app/workspace/workspaceUserLevelConfig.controller.js 80 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/scripts/components/userWorkspace/userWorkspace.service.js 2 ●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/scripts/main.js 1 ●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/views/workspace/workspaceLevelAdd.html 11 ●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/views/workspace/workspaceLevelModify.html 114 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/views/workspace/workspaceUserLevelConfig.html 47 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/constant/MsgConstants.java
@@ -204,6 +204,6 @@
    public static final String PAGE_NEGATIVE_OR_NULL = "PAGE_NEGATIVE_OR_NULL"; //  요청한 페이지 정보가 잘못되었습니다.
    public static final String PAGE_SIZE_NEGATIVE_OR_NULL = "PAGE_SIZE_NEGATIVE_OR_NULL";   //  요청한 페이지 크기가 잘못되었습니다.
    public static final String USER_LEVEL_ALREADY = "USER_LEVEL_ALREADY"; // 사용자 등급을 사용하고 있는 사용자가 있습니다.
    public static final String USER_LEVEL_ALREADY_IN_USE = "USER_LEVEL_ALREADY_IN_USE"; // 사용자 등급을 사용하고 있는 사용자가 있습니다.
}
src/main/java/kr/wisestone/owl/service/impl/ManageUserServiceImpl.java
@@ -95,7 +95,7 @@
    public void modifyUserPermission(ManageUserForm manageUserForm) {
        int newPermission = MngPermission.USER_PERMISSION_MNG_NONE;
        newPermission |= MngPermission.makePermission(manageUserForm.getPermWorkSpace(), MngPermission.USER_PERMISSION_MNG_WORKSPACE);
        newPermission |= MngPermission.makePermission(manageUserForm.getPermWorkSpaceSetting(), MngPermission.USER_PERMISSION_MNG_WORKSPACE);
        newPermission |= MngPermission.makePermission(manageUserForm.getPermProjectSetting(), MngPermission.USER_PERMISSION_MNG_PROJECT);
        newPermission |= MngPermission.makePermission(manageUserForm.getPermIssueSetting(), MngPermission.USER_PERMISSION_MNG_ISSUE_SETTING);
        newPermission |= MngPermission.makePermission(manageUserForm.getPermUser(), MngPermission.USER_PERMISSION_MNG_USER);
src/main/java/kr/wisestone/owl/service/impl/UserLevelServiceImpl.java
@@ -100,7 +100,7 @@
                this.userLevelRepository.deleteById(id);
            } else {
                throw new OwlRuntimeException(
                        this.messageAccessor.getMessage(MsgConstants.USER_LEVEL_ALREADY));
                        this.messageAccessor.getMessage(MsgConstants.USER_LEVEL_ALREADY_IN_USE));
            }
        }
src/main/java/kr/wisestone/owl/service/impl/UserServiceImpl.java
@@ -1027,6 +1027,7 @@
        this.userRepository.saveAndFlush(user);
    }
    //  삭제 할 등급명을 유저가 사용하고 있는지 확인
    @Override
    public boolean useUserLevel(Long levelId) {
        return this.userMapper.findByLevelId(levelId) > 0;
src/main/java/kr/wisestone/owl/service/impl/UserWorkspaceServiceImpl.java
@@ -75,17 +75,17 @@
    public List<UserWorkspaceVo> findUserWorkspace(Map<String, Object> resJsonData,
                                                   UserWorkspaceCondition condition, Pageable pageable) {
        UserWorkspace userWorkspace = this.findMyWorkspace(this.webAppUtil.getLoginId()); //로그인한 아이디
        UserWorkspace userWorkspace = this.findMyWorkspace(this.webAppUtil.getLoginId());
        Workspace myWorkspace = userWorkspace.getWorkspace();
        condition.setPage(pageable.getPageNumber() * pageable.getPageSize());
        condition.setPageSize(pageable.getPageSize());
        condition.setWorkspaceId(myWorkspace.getId());
        condition.setAccount(CommonUtil.encryptAES128(condition.getAccount()));
        condition.setAccount(CommonUtil.encryptAES128(condition.getAccount())); //계정 암호화(필수 동작)
        List<Map<String, Object>> results = this.userWorkspaceMapper.find(condition);
        Long totalCount = this.userWorkspaceMapper.count(condition);
        int totalPage = (int) Math.ceil((totalCount - 1) / pageable.getPageSize()) + 1;
        List<UserWorkspaceVo> userWorkspaceVos = ConvertUtil.convertListToListClass(results, UserWorkspaceVo.class);
        List<UserWorkspaceVo> userWorkspaceVos = ConvertUtil.convertListToListClass(results, UserWorkspaceVo.class); //UserWorkspace의 데이터를 리스트 형식으로 복사해서 UserWorkspaceVo에 담기
        for (UserWorkspaceVo userWorkspaceVo : userWorkspaceVos) {
            userWorkspaceVo.setAccount(CommonUtil.decryptAES128(userWorkspaceVo.getAccount()));
src/main/java/kr/wisestone/owl/vo/ManageUserVo.java
@@ -12,7 +12,7 @@
    private Boolean useYn;
    private Integer permission;
    private Long userId;
    public Boolean permWorkSpace;
    public Boolean permWorkSpaceSetting;
    public Boolean permProjectSetting;
    public Boolean permIssueSetting;
    public Boolean permUser;
@@ -66,7 +66,7 @@
    }
    private void makePermission() {
        this.permWorkSpace = MngPermission.checkMngPermission(this.permission, MngPermission.USER_PERMISSION_MNG_WORKSPACE);
        this.permWorkSpaceSetting = MngPermission.checkMngPermission(this.permission, MngPermission.USER_PERMISSION_MNG_WORKSPACE);
        this.permProjectSetting = MngPermission.checkMngPermission(this.permission, MngPermission.USER_PERMISSION_MNG_PROJECT);
        this.permIssueSetting = MngPermission.checkMngPermission(this.permission, MngPermission.USER_PERMISSION_MNG_ISSUE_SETTING);
        this.permUser = MngPermission.checkMngPermission(this.permission, MngPermission.USER_PERMISSION_MNG_USER);
src/main/java/kr/wisestone/owl/vo/UserLevelVo.java
@@ -14,7 +14,7 @@
    private String levelName;
    private Integer permission;
    public Boolean permWorkSpace;
    public Boolean permWorkSpaceSetting;
    public Boolean permProjectSetting;
    public Boolean permIssueSetting;
    public Boolean permUser;
@@ -66,7 +66,7 @@
    }
    public void toPermissionValues() {
        this.permWorkSpace = MngPermission.checkMngPermission(this.permission, MngPermission.USER_PERMISSION_MNG_WORKSPACE);
        this.permWorkSpaceSetting = MngPermission.checkMngPermission(this.permission, MngPermission.USER_PERMISSION_MNG_WORKSPACE);
        this.permProjectSetting = MngPermission.checkMngPermission(this.permission, MngPermission.USER_PERMISSION_MNG_PROJECT);
        this.permIssueSetting = MngPermission.checkMngPermission(this.permission, MngPermission.USER_PERMISSION_MNG_ISSUE_SETTING);
        this.permUser = MngPermission.checkMngPermission(this.permission, MngPermission.USER_PERMISSION_MNG_USER);
src/main/java/kr/wisestone/owl/web/form/ManageUserForm.java
@@ -14,7 +14,7 @@
    private Long id;
    private Boolean useYn;
    private Long userId;
    private Boolean permWorkSpace;
    private Boolean permWorkSpaceSetting;
    private Boolean permProjectSetting;
    private Boolean permIssueSetting;
    private Boolean permUser;
@@ -56,12 +56,12 @@
        this.userId = userId;
    }
    public Boolean getPermWorkSpace() {
        return permWorkSpace;
    public Boolean getPermWorkSpaceSetting() {
        return permWorkSpaceSetting;
    }
    public void setPermWorkSpace(Boolean permWorkSpace) {
        this.permWorkSpace = permWorkSpace;
    public void setPermWorkSpaceSetting(Boolean permWorkSpaceSetting) {
        this.permWorkSpaceSetting = permWorkSpaceSetting;
    }
    public Boolean getPermProjectSetting() {
src/main/java/kr/wisestone/owl/web/form/UserLevelForm.java
@@ -43,13 +43,6 @@
        return form;
    }
    public Boolean getPermWorkspaceSetting() {
        return permWorkspaceSetting;
    }
    public void setPermWorkspaceSetting(Boolean permWorkspaceSetting) {
        this.permWorkspaceSetting = permWorkspaceSetting;
    }
    public Long getId() {
        return id;
@@ -75,6 +68,13 @@
        this.permission = permission;
    }
    public Boolean getPermWorkspaceSetting() {
        return permWorkspaceSetting;
    }
    public void setPermWorkspaceSetting(Boolean permWorkspaceSetting) {
        this.permWorkspaceSetting = permWorkspaceSetting;
    }
    public Boolean getPermProjectSetting() {
        return permProjectSetting;
src/main/resources/mybatis/query-template/user-template.xml
@@ -170,10 +170,10 @@
        GROUP BY u.id ORDER BY issueCount desc, loginCount DESC;
    </select>
    <select id="findByLevelId" resultType="java.util.HashMap" parameterType="java.lang.Long">
    <select id="findByLevelId" resultType="java.lang.Long" parameterType="java.lang.Long">
        SELECT count(u.id)
        FROM user u
        WHERE u.level_id = #{id}
        WHERE u.level_id = #{levelId}
    </select>
</mapper>
src/main/resources/mybatis/query-template/userLevel-template.xml
@@ -10,7 +10,7 @@
        ul.permission as permission
        FROM
        user_level ul
        WHERE 1=1
        WHERE id != 1 AND 1=1
        <if test="levelName != '' and levelName != null">
            AND ul.level_name like CONCAT('%',#{levelName},'%')
        </if>
src/main/webapp/WEB-INF/i18n/messages_ko_KR.properties
@@ -149,6 +149,7 @@
USER_EXPIRED_PASSWORD = \uBE44\uBC00\uBC88\uD638\uAC00 \uB9CC\uB8CC\uB418\uC5C8\uC2B5\uB2C8\uB2E4.
USER_RETURN_PASSWORD_NOT_PROVIDER_SOCIAL_JOIN_USER = \uBE44\uBC00\uBC88\uD638 \uCC3E\uAE30 \uAE30\uB2A5\uC744 \uC18C\uC15C \uACC4\uC815 \uAC00\uC785 \uC0AC\uC6A9\uC790\uB294 \uC0AC\uC6A9\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.
USER_NOT_USE_ACTIVE_STATUS = \uC0AC\uC6A9\uC790\uB294 \uD65C\uC131 \uC0C1\uD0DC\uAC00 \uC544\uB2C8\uBA74 \uB85C\uADF8\uC778\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.
USER_LEVEL_ALREADY_IN_USE = \uC120\uD0DD\uD55C \uC0AC\uC6A9\uC790 \uB4F1\uAE09\uC744 \uC774\uBBF8 \uC0AC\uC6A9\uD558\uACE0 \uC788\uB294 \uC0AC\uC6A9\uC790\uAC00 \uC788\uC2B5\uB2C8\uB2E4.
EXCEL_NOT_EXTENSION = \uC5D1\uC140 \uD30C\uC77C \uD655\uC7A5\uC790 (xlsx)\uB9CC \uC5C5\uB85C\uB4DC\uAC00 \uAC00\uB2A5\uD569\uB2C8\uB2E4.
EXCEL_DOWNLOAD_MAX_ROWS_OVER = \uC5D1\uC140 \uB2E4\uC6B4\uB85C\uB4DC\uB294 1.000 \uAC74 \uAE4C\uC9C0\uB9CC \uAC00\uB2A5\uD569\uB2C8\uB2E4. \uAC80\uC0C9 \uC870\uAC74\uC744 \uC0AC\uC6A9\uD558\uC5EC \uC870\uD68C\uB418\uB294 \uBAA9\uB85D\uC744 1,000 \uAC74 \uC774\uD558\uB85C \uBCC0\uACBD\uD558\uC5EC \uB2E4\uC6B4\uB85C\uB4DC\uB97C \uC9C4\uD589\uD574\uC8FC\uC138\uC694.
src/main/webapp/custom_components/js-table/tableColumnGenerator.directive.js
@@ -283,8 +283,17 @@
                                            makeTag += "<a ng-click='event.fileRemove(data.index)'><i class='fa fa-trash fa-lg' uib-tooltip='제거'></i></a>";
                                            break;
                                        case "WORKSPACE_USE_YN" :
                                            makeTag += "<label class='switch'><input type='checkbox' ng-model='data.useYn' ng-click='event.modifyUserWorkspace(data)'><span class='slider round'></span></label>";
                                        case "USER_LEVEL_MODIFY":
                                            if ($rootScope.checkMngPermission('USER_PERMISSION_MNG_WORKSPACE')) {
                                                makeTag += "<span class='titlename cursor table-word-break-all' ng-click='event.modify(data.id)'>" + scope.data.levelName.replace(/</gi, '&lt;') + "</span>";
                                            }
                                            else {
                                                makeTag += "<span class='titlename cursor table-word-break-all'>" + scope.data.levelName + "</span>";
                                            }
                                            break;
                                        case "WORKSPACE_SETTING_PERM_YN" :
                                            makeTag += "<label class='switch'><input type='checkbox' ng-model='data.permWorkSpaceSetting' ng-click='event.modify(data)'><span class='slider round'></span></label>";
                                            break;
                                        case "PROJECT_SETTING_PERM_YN" :
src/main/webapp/i18n/ko/global.json
@@ -138,7 +138,8 @@
        "failedToModifyWorkspaceName": "업무 공간 명 수정 실패",
        "failedToRegularPaymentChange": "정기 결제 변경 실패",
        "failedToParticipationStatusChange": "참여 상태 변경 실패",
        "failedToSelectWorkspaceFullUserList": "업무 공간 전체 사용자 목록 조회 실패"
        "failedToSelectWorkspaceFullUserList": "업무 공간 전체 사용자 목록 조회 실패",
        "failedToModifyUserLevel": "사용자 등급 상세 정보 조회 실패"
    },
    "issue": {
        "issueType": "이슈 유형",
src/main/webapp/scripts/app/manageUser/manageUser.controller.js
@@ -103,6 +103,13 @@
                        .setHWidth("width-40-p")
                        .setDAlign("text-center")
                        .setDName("account"));
                    $scope.vm.tableConfigs1.push($tableProvider.config()
                        .setHName("manageUser.manageWorkspacePerm")
                        .setHWidth("width-120-p")
                        .setDType("renderer")
                        .setDAlign("text-center")
                        .setDName("manageWorkspace")
                        .setDRenderer("WORKSPACE_SETTING_PERM_YN"));
                    $scope.vm.tableConfigs.push($tableProvider.config()
                        .setHName("manageUser.manageProjectPerm")
                        .setHWidth("width-20-p")
src/main/webapp/scripts/app/workspace/levelModify.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('levelModifyController', ['$scope', '$rootScope', '$log', '$resourceProvider', '$uibModalInstance', 'UserWorkspace', 'parameter', 'SweetAlert', '$filter',
            function ($scope, $rootScope, $log, $resourceProvider, $uibModalInstance, UserWorkspace, parameter, SweetAlert, $filter) {
                $scope.fn = {
                    cancel : cancel,    //  팝업 창 닫기
                    formSubmit : formSubmit,    //  폼 전송
                    formCheck : formCheck,  //  폼 체크
                    modifyUserPermission : modifyUserPermission,   //  권한 변경
                    //detail : detail //  상세 정보
                };
                $scope.vm = {
                    search : {
                        id : parameter.id
                    },
                    form : {
                        levelName : "",
                        permWorkspaceSetting : false,
                        permProjectSetting : false,
                        permIssueSetting : false,
                        permUser : false,
                        permNotice : false,
                        permFAQ : false,
                        permQnA : false,
                        permGuide : false
                    }
                };
                function formCheck(formInvalid) {
                    if (formInvalid) {
                        return true;
                    }
                    return false;
                }
                //  폼 전송
                function formSubmit(condition) {
                    $rootScope.spinner = true;
                    var content = {
                        id : parameter.id,
                        title : $rootScope.preventXss($scope.vm.form.title),
                        //description : $rootScope.preventXss($scope.vm.form.description)
                    };
                    UserWorkspace.modify($resourceProvider.getContent(condition,
                        content,
                        $resourceProvider.getPageContent(0, 0))).then(function (result) {
                        if (result.data.message.status === "success") {
                            $scope.fn.cancel();
                            //  목록 화면 갱신
                            $rootScope.$broadcast("getUserLevelList", {});
                        }
                        else {
                            SweetAlert.error($filter("translate")("managementWorkspace.failedLevelRegistration"), 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() {
                    Notice.detail($resourceProvider.getContent(
                        $scope.vm.search,
                        $resourceProvider.getPageContent(0, 1))).then(function (result) {
                        if (result.data.message.status === "success") {
                            if ($rootScope.isDefined(result.data.data)) {
                                $scope.vm.form.title = result.data.data.title;
                                $scope.vm.form.description = result.data.data.description;
                            }
                        }
                        else {
                            SweetAlert.error($filter("translate")("managementWorkspace.failedToModifyUserLevel"), result.data.message.message);  //공지사항 상세 정보 조회 실패
                        }
                    });
                }
                //  공지사항 상세 조회
                $scope.fn.detail();*/
                function modifyUserPermission(userPermission ) {
                    UserWorkspace.levelModify($resourceProvider.getContent(userPermission,
                        $resourceProvider.getPageContent(0, 0))).then(function (result) {
                        if (result.data.message.status === "success") {
                        }
                        else {
                            SweetAlert.error($filter("translate")("managementWorkspace.failedToParticipationStatusChange"), result.data.message.message); // "참여 상태 변경 실패"
                        }
                    });
                }
            }]);
    });
src/main/webapp/scripts/app/workspace/workspace.js
@@ -34,7 +34,7 @@
                            var deferred = $q.defer();
                            require(["modalFormAutoScroll", "workspaceController", "workspaceLevelAddController", "workspaceDepartmentAddController", "workspacePaymentExecuteController", "workspaceUserConfigController", "workspacePaymentModifyController",
                                "workspacePaymentAgreeTermController", "paymentService", "userWorkspaceService", "workspaceService", "numberOnly", 'jsTable', 'tableColumnGenerator', 'summerNote', 'summerNote-ko-KR',
                                "crypto", "reservationDisableUserService", "workspacePaymentAddController", "workspaceUserLevelController", "workspaceDepartmentConfigController"], function () {
                                "crypto", "reservationDisableUserService", "workspacePaymentAddController", "workspaceUserLevelController", "workspaceDepartmentConfigController", "levelModifyController"], function () {
                                deferred.resolve();
                            });
src/main/webapp/scripts/app/workspace/workspacePaymentExecute.controller.js
@@ -220,7 +220,8 @@
                        return;
                    }
                    Payment.detail($resourceProvider.getContent(content,
                    //"사용자 관리" 탭으로 이동 시 Payment/detail 요청이 들어와서 아래내용 주석처리
                    /*Payment.detail($resourceProvider.getContent(content,
                        $resourceProvider.getPageContent(0, 0))).then(function (result) {
                        if (result.data.message.status === "success") {
                            if (result.data.data != null) {
@@ -232,7 +233,7 @@
                        else {
                            SweetAlert.error($filter("translate")("managementWorkspace.failedToPaymentInformation"), result.data.message.message); // "결제 정보 조회 실패"
                        }
                    });
                    });*/
                }
                //  업무 공간 명 수정
src/main/webapp/scripts/app/workspace/workspaceUserConfig.controller.js
@@ -56,7 +56,7 @@
                    modifyUserWorkspace : modifyUserWorkspace   //  업무 공간 참여하는 사용자의 참여 상태 변경
                };
                //  결제 상세 정보
                //  상세 정보
                $scope.$on("getUserWorkspaceList", function () {
                    $scope.fn.getUserWorkspaceList(0);
                });
src/main/webapp/scripts/app/workspace/workspaceUserLevelConfig.controller.js
@@ -19,8 +19,8 @@
                $scope.fn.initSearch = initSearch;  //  검색 조건 초기화
                $scope.fn.levelAdd = levelAdd;    //  등급 추가
                $scope.fn.removes = removes;    // 사용자 등급 삭제
                $scope.fn.getPageList = getPageList;  //  목록 조회
                $scope.fn.listView = listView;    //  목록 화면으로 변경
                $scope.fn.modify = modify;    // 사용자 등급 수정
                /*  $scope.vm 상속 중  */
                $scope.vm.search = {
@@ -40,61 +40,13 @@
                //  테이블 이벤트
                $scope.vm.tableEvent = {
                    // modifyUserWorkspace : modifyUserWorkspace   //  업무 공간 참여하는 사용자의 참여 상태 변경
                    modify : modify   //  업무 공간 참여하는 사용자의 참여 상태 변경
                };
                //  사용자 등급 리스트 불러오기
                $scope.$on("getUserLevelList", function () {
                    $scope.fn.getUserLevelList(0);
                });
                //  이슈 목록을 조회한다.
                function getPageList(selectedPage, detail = false) {
                    if (selectedPage < 0) {
                        selectedPage = 0;
                    }
                    //  현재 페이지 정보
                    var currentPage = 0;
                    //  쿠키에 선택한 페이지 정보가 없으면 기본 페이지 정보 0 을 저장
                    if (angular.isUndefined(selectedPage) || selectedPage === "") {
                        currentPage = $scope.vm.page.selectedPage;
                    }
                    else {
                        currentPage = selectedPage;
                    }
                    //  검색 조건을 저장한다.
                    //$scope.fn.makeVmSearchObject();
                    // 현재 선택된 프로젝트를 검색 기본으로 추가
                    if ($rootScope.workProject != null && $rootScope.workProject.id > -1) {
                        var find = findProjectSearch($rootScope.workProject.id);
                        if (!find) {
                            $scope.vm.projects.push($rootScope.workProject);
                        }
                    }
                    //  이슈 검색 조건을 만든다.
                    var conditions = $scope.fn.makeSearchConditions();
                    Issue.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;
                            if (detail) {
                                changeDetailView(result.data.data[0].id);
                            }
                        }
                        else {
                            SweetAlert.error($filter("translate")("issue.failedIssueLookup"), result.data.message.message); // 이슈 조회 실패
                        }
                    });
                }
                //  목록 화면으로 변경한다.
                function listView() {
@@ -105,6 +57,23 @@
                    $scope.vm.responseData.data = angular.copy(temp);
                    //  마지막으로 보고있던 이슈 id를 초기화한다.
                    $rootScope.currentDetailIssueId = null;
                }
                //  사용자 등급 수정
                function modify(id) {
                    $uibModal.open({
                        templateUrl : 'views/workspace/workspaceLevelModify.html',
                        size : "md",
                        controller : 'levelModifyController',
                        backdrop : 'static',
                        resolve : {
                            parameter : function () {
                                return {
                                    id : id
                                };
                            }
                        }
                    });
                }
                // 사용자 등급 삭제
@@ -169,8 +138,7 @@
                                        }, 100);
                                        $scope.fn.listView();
                                        $scope.fn.getPageList(0);
                                        $scope.fn.getUserLevelList(0);
                                    }
                                    else {
                                        $timeout(function () {
@@ -205,14 +173,15 @@
                        .setHName("managementWorkspace.levelName")
                        .setHWidth("width-120-p")
                        .setDAlign("text-center")
                        .setDName("levelName"));
                        .setDType("renderer")
                        .setDRenderer("USER_LEVEL_MODIFY"));
                    $scope.vm.tableConfigs1.push($tableProvider.config()
                        .setHName("manageUser.manageWorkspacePerm")
                        .setHWidth("width-120-p")
                        .setDType("renderer")
                        .setDAlign("text-center")
                        .setDName("manageProject")
                        .setDRenderer("WORKSPACE_USE_YN"));
                        .setDName("manageWorkspace")
                        .setDRenderer("WORKSPACE_SETTING_PERM_YN"));
                    $scope.vm.tableConfigs1.push($tableProvider.config()
                        .setHName("manageUser.manageProjectPerm")
                        .setHWidth("width-120-p")
@@ -297,6 +266,7 @@
                        }
                    });
                }
                //  등급 추가
                function levelAdd() {
                    $uibModal.open({
src/main/webapp/scripts/components/userWorkspace/userWorkspace.service.js
@@ -49,7 +49,7 @@
                });
            },
            modify : function (conditions) {
                return $http.post("userWorkspace/modify", conditions).then(function (response) {
                return $http.post("userLevel/modify", conditions).then(function (response) {
                    $log.debug("워크스페이스 참여자 참여 상태 변경 결과 : ", response);
                    return response;
                });
src/main/webapp/scripts/main.js
@@ -226,6 +226,7 @@
        'workspacePaymentAgreeTermController' : 'app/workspace/workspacePaymentAgreeTerm.controller', //  업무 공간 이용 약관 확인 컨트롤러
        'workspaceUserLevelController' : 'app/workspace/workspaceUserLevelConfig.controller',  //  사용자 관리 컨트롤러
        'workspaceLevelAddController' : 'app/workspace/workspaceLevelAdd.controller',  //  사용자 등급 추가 컨트롤러
        'levelModifyController' : 'app/workspace/levelModify.controller',  //  사용자 등급 수정 컨트롤러
        'workspaceDepartmentAddController' : 'app/workspace/workspaceDepartmentAdd.controller',  //  부서 추가 컨트롤러
        'workspaceDepartmentConfigController' : 'app/workspace/workspaceDepartmentConfig.controller',  //  사용자 부서 관리 컨트롤러
        'workspaceService' : 'components/workspace/workspace.service',  //  업무 공간에 관련된 통신을 담당한다.
src/main/webapp/views/workspace/workspaceLevelAdd.html
@@ -18,11 +18,16 @@
                    <td>
                        <div class="input-group mb-0 mr-sm-0 mb-sm-0">
                            <input id="levelAddForm1"
                                   class="form-control" placeholder="추가 할 등급명을 입력하세요."
                                   name="levelName"
                                   type="text"
                                   ng-model="vm.form.levelName"
                                   maxlength="50"
                                   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.levelName"
                                   ng-maxlength="200"
                                   maxlength="200"
                                   required>
                        </div>
                    </td>
src/main/webapp/views/workspace/workspaceLevelModify.html
New file
@@ -0,0 +1,114 @@
<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="levelAddForm">
            <table class="table table-lightborder">
                <tr>
                    <td>
                        <label for="levelAddForm1"><span translate="managementWorkspace.levelName">등급명</span><code class="highlighter-rouge">*</code></label>
                    </td>
                    <td>
                        <div class="input-group mb-0 mr-sm-0 mb-sm-0">
                            <input id="levelAddForm1"
                                   name="levelName"
                                   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.levelName"
                                   ng-maxlength="200"
                                   maxlength="200"
                                   required>
                        </div>
                    </td>
                </tr>
                <!--tableColumnGenerator.dirextive.js 파일 참고-->
                <tr>
                    <td class="text-left bold">
                        <span translate="manageUser.manageWorkspacePerm">워크스페이스 관리</span>
                    </td>
                    <td colspan="2">
                        <label class='switch'><input type='checkbox' ng-model='vm.form.permWorkspaceSetting'><span class='slider round'></span></label>
                    </td>
                </tr>
                <tr>
                    <td class="text-left bold">
                        <span translate="manageUser.manageProjectPerm">프로젝트 관리</span>
                    </td>
                    <td colspan="2">
                        <label class='switch'><input type='checkbox' ng-model='vm.form.permProjectSetting'><span class='slider round'></span></label>
                    </td>
                </tr>
                <tr>
                    <td class="text-left bold">
                        <span translate="manageUser.manageIssueSystemPerm">이슈 시스템 관리</span>
                    </td>
                    <td>
                        <label class='switch'><input type='checkbox' ng-model='vm.form.permIssueSetting' ><span class='slider round'></span></label>
                    </td>
                </tr>
                <tr>
                    <td class="text-left bold">
                        <span translate="manageUser.manageUserPerm">사용자 관리</span>
                    </td>
                    <td>
                        <label class='switch'><input type='checkbox' ng-model='vm.form.permUser'><span class='slider round'></span></label>
                    </td>
                </tr>
                <tr>
                    <td class="text-left bold">
                        <span translate="manageUser.manageNoticePerm">공지사항 관리</span>
                    </td>
                    <td>
                        <label class='switch'><input type='checkbox' ng-model='vm.form.permNotice' ><span class='slider round'></span></label>
                    </td>
                </tr>
                <tr>
                    <td class="text-left bold">
                        <span translate="manageUser.manageFAQPerm">FAQ 관리</span>
                    </td>
                    <td>
                        <label class='switch'><input type='checkbox' ng-model='vm.form.permFAQ' ><span class='slider round'></span></label>
                    </td>
                </tr>
                <tr>
                    <td class="text-left bold">
                        <span translate="manageUser.manageQnAPerm">QnA 관리</span>
                    </td>
                    <td>
                        <label class='switch'><input type='checkbox' ng-model='vm.form.permQnA' ><span class='slider round'></span></label>
                    </td>
                </tr>
                <tr>
                    <td class="text-left bold">
                        <span translate="manageUser.manageGuidePerm">가이드 관리</span>
                    </td>
                    <td>
                        <label class='switch'><input type='checkbox' ng-model='vm.form.permGuide' ><span class='slider round'></span></label>
                    </td>
                </tr>
            </table>
        </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(levelAddForm.$invalid) || $root.spinner) ? null : fn.formSubmit(vm.form)"
                ng-disabled="fn.formCheck(paymentAddForm.$invalid)"
                ng-click="fn.formSubmit(vm.form)"><span translate="common.save">저장</span>
        </button>
    </div>
</div>
src/main/webapp/views/workspace/workspaceUserLevelConfig.html
@@ -4,35 +4,10 @@
            <div class="searchdiv">
                <form name="userWorkspaceForm" role="form" ng-enter="fn.getUserWorkspaceList(0)">
                    <div class="row">
                        <!--<div class="col-xl-2">
                            <div class="form-group">
                                <label translate="common.name">이름</label>
                                <input class="form-control" type="text" ng-model="vm.search.name" maxlength="10">
                            </div>
                        </div>
                        <div class="col-xl-3">
                            <div class="form-group">
                                <label translate="common.status">상태</label>
                                <ng-dropdown-multiselect class="multiSelect cursor"
                                                         data-input-name="statuses"
                                                         selected-model="vm.search.statuses"
                                                         extra-settings="{ stringTypeOption : true }"
                                                         options="vm.options.statuses"></ng-dropdown-multiselect>
                            </div>
                        </div>
                        <div class="col-xl-3">
                            <div class="form-group">
                                <label translate="common.email">이메일</label>
                                <input class="form-control" type="text" ng-model="vm.search.account" maxlength="50">
                            </div>
                        </div>-->
                        <div class="col-xl-4">
                            <div class="form-group" style="margin-left: 50px">
                                <label translate="managementWorkspace.levelName">등급명</label>
                                <input class="form-control" type="text" ng-model="vm.search.level" maxlength="50">
                                <input class="form-control" type="text" ng-click="" ng-model="vm.search.level" maxlength="50">
                            </div>
                        </div>
@@ -70,21 +45,6 @@
                        </div>
                    </div>
                    <div class="col-sm-6 text-right" ng-if="$root.checkMngPermission('USER_PERMISSION_MNG_USER')">
                        <!--<div class="btn-group">
                            <button aria-expanded="false"
                                    aria-haspopup="true"
                                    class="btn btn-secondary dropdown-toggle"
                                    data-toggle="dropdown"
                                    type="button">추가기능
                            </button>
                            <div aria-labelledby="dropdownMenuButton2"
                                 class="dropdown-menu"
                                 x-placement="bottom-start"
                                 style="position: absolute; transform: translate3d(0px, 30px, 0px); top: 0px; left: 0px; will-change: transform;">
                                <a class="dropdown-item cursor ng-isolate-scope" form-submit="projectListForm" make-search-conditions="fn.makeSearchConditions()"><span translate="common.downloadExcel" class="ng-scope">엑셀 다운로드</span></a>
                                <a class="dropdown-item" href="#"> 삭제</a>
                            </div>
                        </div>-->
                        <form class="form-inline justify-content-sm-end pull-right ng-pristine ng-valid" method="post" action="/workspace/downloadExcel" name="userLevelListForm">
                            <input type="hidden" name="conditions" autocomplete="off">
                            <div class="btn-group">
@@ -99,11 +59,6 @@
                    </div>
                </div>
            </div>
            <!--<div class="table-responsive">
                <js-table data="vm.responseData.data" table-configs="vm.tableConfigs"
                          event="vm.tableEvent"></js-table>
            </div>-->
            <div class="table-responsive">
                <js-table data="vm.responseData.data" table-configs="vm.tableConfigs1"