'use strict'; define(['app', 'angular'], function (app, angular) { return app.config(function ($controllerProvider, $provide, $filterProvider, $compileProvider, $logProvider, $urlRouterProvider, $httpProvider, $translateProvider) { // angularJs + requireJs 연동을 위해하는 셋팅. app.controller = $controllerProvider.register; app.service = $provide.service; app.filter = $filterProvider.register; app.directive = $compileProvider.directive; app.factory = $provide.factory; app.provider = $provide.provider; // 매칭되는 url이 없으면 login으로 이동한다. $urlRouterProvider.otherwise(function ($injector) { var $state = $injector.get('$state'); $state.go('login'); }); // 통신 인터셉터 $httpProvider.interceptors.push('authInterceptor'); // ajax 응답을 한번에 묶어 digest roof 실행 $httpProvider.useApplyAsync(true); // 다국어 설정 $translateProvider.useLoader('$translatePartialLoader', { urlTemplate : 'i18n/{lang}/{part}.json' }); $translateProvider.preferredLanguage('ko'); $translateProvider.useCookieStorage(); $translateProvider.useSanitizeValueStrategy('escaped'); $translateProvider.forceAsyncReload(true); // 로그 제어 $logProvider.debugEnabled(true); }) .run(function ($rootScope, $state, $sce, $log, $injector, $translate, $tableProvider, $relProvider, $downProvider, Principal, Auth, Language, SweetAlert, $filter, Workspace, $resourceProvider, User, constants, Project) { $rootScope.$state = $state; // html 태그 웹 보안 적용하여 바인딩. $rootScope.$sce = $sce; // 프로그래스바 표시 여부 결정 값 $rootScope.spinner = false; // 웹 소켓으로 관리하는 전체 사용자 정보 $rootScope.users = []; // 로그인한 사용자 정보 $rootScope.user = undefined; // 전체 워크스페이스 정보 $rootScope.workspaces = []; // 사용가능한 전체 프로젝트 정보 $rootScope.projects = []; // 현재 사용중인 프로젝트 $rootScope.workProject = null; // 현재 프로젝트에 사용중인 이슈 목록(유형) $rootScope.workIssueTypes = []; // 현재 선택중인 이슈 목록 $rootScope.issueTypeMenu = null; // 이슈 목록->상세화면에서 마지막으로 접근한 이슈 아이디 - 라우트 탈때마다 초기화 $rootScope.currentDetailIssueId = null; // 문의하기 $rootScope.information = false; // PrimaryWorkspace $rootScope.hasPrimaryWorkspace = false; // 최고관리자 존재 여부 $rootScope.hasSuperUser = false; // 대시보드 선택 0:전체 1:프로젝트 $rootScope.dashboard = 0; // 웹 소켓 연결 정보 $rootScope.webSocket = { socket : null, client : null }; // get parameter $rootScope.previousGetParams = null; // 사용자 사용 언어 $rootScope.language = $translate.proposedLanguage(); // 기본 한국어 // 파일 확장자 - 첨부 허용되는 확장자 모음 $rootScope.fileTypeMap = { "hwp" : "DOC", "txt" : "DOC", "pptx" : "DOC", "ppt" : "DOC", "pdf" : "DOC", "xlsx" : "DOC", "xls" : "DOC", "docx" : "DOC", "doc" : "DOC", "jpg" : "IMAGE", "png" : "IMAGE", "gif" : "IMAGE", "jpeg" : "IMAGE", "tif" : "IMAGE", "bmp" : "IMAGE", "wmv" : "MEDIA", "avi" : "MEDIA", "mp4" : "MEDIA", "mkv" : "MEDIA", "mov" : "MEDIA", "zip" : "ETC" }; // 파일 업로드 허용 바이트 $rootScope.fileByte = { image : 10485760, // 10MB file : 314572800 // 100MB }; $rootScope.isMainSearch = false; // 통합 검색 여부 // 테이블 설정 및 기능을 관리하는 서비스 $rootScope.$tableProvider = $tableProvider; // 연관테이블 설정 및 기능 관리하는 서비스 $rootScope.$relProvider = $relProvider; // 하위테이블 설정 및 기능 관리하는 서비스 $rootScope.$downProvider = $downProvider; // html tag convert - 신뢰할 수 있는 입력 값일 때만 사용, 사용자가 등록하는 값에는 사용 금지 $rootScope.trustAsHtml = function (string) { return $sce.trustAsHtml(string); }; // angular isDefined 은 공백 체크가 안되서 직접 만들어 쓰자. $rootScope.isDefined = function (value) { if (value == null || value === "" || value === undefined) { return false; } return true; }; // 이슈 생성, 수정에서 다중 선택, 단일 선택 옵션에 체크되게 해주는 기능 $rootScope.selectOption = function (useValues, value) { var result = false; // 멀티 셀렉트 일때 if (angular.isArray(useValues)) { for (var count in useValues) { if (useValues[count] === value) { result = true; break; } } } else { if (useValues === value) { result = true; } } return result; }; // 업로드한 파일이 이미지 확장자인지 확인 $rootScope.checkImageType = function ($file) { var fileTypes = $file.type.split("/"); if (fileTypes[0] !== "image") { return false; } return true; }; // 파일을 업로드할 때 파일 유형을 확인해주는 기능 - 허용되지 않은 확장자일 때는 첨부 금지 $rootScope.checkFileType = function ($file) { var fileName = $file.name.toLowerCase(); var pos = fileName.lastIndexOf("."); var ext = fileName.substring(pos + 1); if ($rootScope.isDefined($rootScope.fileTypeMap[ext])) { $file.fileType = $rootScope.fileTypeMap[ext]; } else { return false; } return true; }; // xss 공격 방지 $rootScope.preventXss = function (value) { if (!$rootScope.isDefined(value)) { return ""; } return value.replace(/(\b)(on\S+)(\s*)=|javascript|(<\s*)(\/*)script/gi, " "); }; // 암호화 $rootScope.encryption = function (text) { // PBKDF2 키 생성 var key128Bits100Iterations = CryptoJS.PBKDF2(constants.PASS_PHRASE, CryptoJS.enc.Hex.parse(constants.SALT), { keySize: constants.KEY_SIZE/32, iterations: constants.ITERATION_COUNT }); return CryptoJS.AES.encrypt( text, key128Bits100Iterations, { iv: CryptoJS.enc.Hex.parse(constants.IV) }).toString(); }; // 언어 변경 $rootScope.changeLocale = function (locale) { var serverLocale = ""; switch (locale) { case "ko" : serverLocale = "ko_KR"; break; case "en" : serverLocale = "en_US"; break; case "ja" : serverLocale = "ja_JP"; break; case "vi" : serverLocale = "vi_VN"; break; } if (!$rootScope.isDefined(serverLocale)) { SweetAlert.swal($filter("translate")("common.failedLanguageChange"), $filter("translate")("common.notSelectedLanguage"), "error"); // "언어 변경 실패", "언어 선택이 되지 않았습니다." } Language.change({language : serverLocale}).then(function (result) { if (result.data.message.status === "success") { $translate.use(locale); $translate.refresh(locale); $rootScope.$broadcast("languageChange", {language : locale}); } }); }; // 권한 리스트 $rootScope.mngPermission = { "USER_PERMISSION_MNG_WORKSPACE" : 16384, "USER_PERMISSION_MNG_PROJECT" : 8192, "USER_PERMISSION_MNG_ISSUE" : 4096, "USER_PERMISSION_MNG_PARTNER" : 2048, "USER_PERMISSION_MNG_API" : 1024, "USER_PERMISSION_MNG_ISSUE_STATUS" : 512, "USER_PERMISSION_MNG_WORKFLOW" : 256, "USER_PERMISSION_MNG_CUSTOME_FIELD" : 128, "USER_PERMISSION_MNG_ISSUE_TYPE" : 64, "USER_PERMISSION_MNG_NOTICE" : 32, "USER_PERMISSION_MNG_FAQ" : 16, "USER_PERMISSION_MNG_QNA" : 8, "USER_PERMISSION_MNG_EVENT" : 4, "USER_PERMISSION_MNG_GUIDE" : 2, }; // 쿠키 저장 $rootScope.setCookie = function (name, value, exp) { var date = new Date(); date.setTime(date.getTime() + exp*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + date.toUTCString() + ';path=/'; }; // 쿠키 가져오기 $rootScope.getCookie = function (name) { var value = document.cookie.match('(^|;) ?' + name + '=([^;]*)(;|$)'); return value? value[2] : null; } // 쿠키 삭제 $rootScope.deleteCookie = function (name) { document.cookie = name + '=; expires=Thu, 01 Jan 1999 00:00:10 GMT;'; } // 현재 선택된 이슈 타입 아이디 가져오기 $rootScope.getCurrentIssueTypeId = function () { return $rootScope.issueTypeMenu != null ? $rootScope.issueTypeMenu.id : null; } // 현재 선택된 이슈 타입 변경하기 $rootScope.setCurrentIssueTypeId = function (issueTypeVo) { if($rootScope.issueTypeMenu !== issueTypeVo) { $rootScope.issueTypeMenu = issueTypeVo; } } // 권한을 확인한다 $rootScope.checkMngPermission = function (userPermission) { if (!$rootScope.isDefined($rootScope.user)) { return false; } var permissionVal = $rootScope.mngPermission[userPermission]; if (($rootScope.user.permission & permissionVal) !== 0) { return true; } return false; }; // $rootScope.getMyInfo = function () { // // User.findMyLevelAndDepartment($resourceProvider.getContent({}, // $resourceProvider.getPageContent(0, 0))).then(function (result) { // // if (result.data.message.status === "success") { // $rootScope.myLevel = result.data.data.levelName // $rootScope.myDepartments = result.data.data.departmentName // } // }); // } /*$rootScope.checkMngPermissionViewIssueAndProject = function (userPermission) { if (!$rootScope.isDefined($rootScope.user)) { return false; } var permissionVal = $rootScope.mngPermission[userPermission]; if (($rootScope.user.permission & permissionVal) !== 0) { return true; } return false; };*/ // setting 관리자인지 확인한다. $rootScope.checkMngPermissionSettings = function () { if (!$rootScope.isDefined($rootScope.user)) { return false; } // 부서명 배열 합치기 if ($rootScope.user.departmentVos.length > 0) { $rootScope.departments = ''; let separator = ','; for (let i = 0; i < $rootScope.user.departmentVos.length; i++) { $rootScope.departments += $rootScope.user.departmentVos[i].departmentName + (i === $rootScope.user.departmentVos.length - 1 ? '': separator); } } var permissionVal = $rootScope.mngPermission['USER_PERMISSION_MNG_ISSUE_STATUS']; permissionVal += $rootScope.mngPermission['USER_PERMISSION_MNG_WORKFLOW']; permissionVal += $rootScope.mngPermission['USER_PERMISSION_MNG_CUSTOME_FIELD']; permissionVal += $rootScope.mngPermission['USER_PERMISSION_MNG_ISSUE_TYPE']; if ($rootScope.user.permission & permissionVal) { return true; } return false; }; // management 관리자인지 확인한다. $rootScope.checkMngPermissionManager = function () { if (!$rootScope.isDefined($rootScope.user)) { return false; } var permissionVal = $rootScope.mngPermission['USER_PERMISSION_MNG_API']; permissionVal += $rootScope.mngPermission['USER_PERMISSION_MNG_NOTICE']; permissionVal += $rootScope.mngPermission['USER_PERMISSION_MNG_FAQ']; permissionVal += $rootScope.mngPermission['USER_PERMISSION_MNG_QNA']; permissionVal += $rootScope.mngPermission['USER_PERMISSION_MNG_EVENT']; permissionVal += $rootScope.mngPermission['USER_PERMISSION_MNG_GUIDE']; // zenith edit if ($rootScope.user.permission & permissionVal) { return true; } return false; }; $rootScope.changeLastProject = function (projectId, reload = true, onEvent = true) { if ($rootScope.workProject == null || $rootScope.workProject.id !== projectId ) { if (User != null) { User.updateLastProject($resourceProvider.getContent( {lastProjectId: projectId}, $resourceProvider.getPageContent(0, 0))).then(function (result) { if (result.data.message.status === "success") { $rootScope.user = result.data.data; $rootScope.projects.forEach(function (el) { if (el.id == projectId) { $rootScope.workProject = el; if (onEvent) { $rootScope.$broadcast("changedLastProject", {id: el.id}); $state.go("issues.list"); } if (reload) { $state.go('dashboards.dashboard'); } } }); // $state.go($state.current, {}, {reload: reload}); } }); } } }; // 프로젝트 관리 권한이 있는지 확인한다 $rootScope.checkMngPermissionProject = function () { if (!$rootScope.isDefined($rootScope.user)) { return false; } var permissionVal = $rootScope.mngPermission['USER_PERMISSION_MNG_PROJECT']; if ($rootScope.user.permission & permissionVal) { return true; } return false; }; $rootScope.findProject = function (projectId) { if ($rootScope.projects != null && $rootScope.projects.length > 0) { for (var i=0; i < $rootScope.projects.length; i++) { if ($rootScope.projects[i].id == projectId) { return $rootScope.projects[i]; } } } return null; } // // Primary Workspace 확인 $rootScope.checkHasPrimaryWorkspace = function () { return $rootScope.hasPrimaryWorkspace; }; // edit by zenith at 20200801 // Check Primary workspace $rootScope.checkPrimaryWorkspace = function () { Workspace.findPrimaryWorkspace($resourceProvider.getContent( {}, $resourceProvider.getPageContent(0, 0))).then(function (result) { if (result.data.message.status === "success") { $rootScope.hasPrimaryWorkspace = result.data.data; if (!$rootScope.hasPrimaryWorkspace) { $state.go('superJoin'); } } else { $state.go('superJoin'); } }); }; //$rootScope.checkPirmaryWorkspace(); // 업무 공간 목록 조회 $rootScope.getWorkspaceList = function () { Workspace.find($resourceProvider.getContent({}, $resourceProvider.getPageContent(0, 0))).then(function (result) { if (result.data.message.status === "success") { $rootScope.workspaces = result.data.data; // 마지막 접근 업무 공간을 확인한다. $rootScope.checkIncludeLastWorkspace($rootScope.workspaces); } }); }; // 마지막 접근 업무 공간을 확인한다. $rootScope.checkIncludeLastWorkspace = function (workspaces) { // 로그인 정보가 없을 경우에는 수행하지 않는다. if (!$rootScope.isDefined($rootScope.user)) { return; } var include = false; for (var count in workspaces) { if ($rootScope.user.lastWorkspaceId === workspaces[count].id) { include = true; break; } } // 현재 업무 공간에 참여하지 않고 있다면 자신의 업무공간으로 쫓아낸다. if (!include) { User.updateUserSession({}).then(function (result) { if (result.data.message.status === "success") { $rootScope.user = result.data.data; // 전역으로 사용하는 로그인 사용자 정보. SweetAlert.warning($filter("translate")("common.disableParticipationWorkspace"), $filter("translate")("common.disableParticipationWorkspaceMessage")); // edit by zenith at 20200801 // direct oug out cause stand alone have just one workspace $rootScope.$broadcast("logout"); } else { SweetAlert.error($filter("translate")("common.failedToUpdateParticipatingSessions"), $filter("translate")("common.failedToUpdateParticipatingSessions")); // "참여 세션 업데이트 실패" } }); } }; $rootScope.getUrlParameter = function (){ var url = document.location.href; var tokenIndex = url.indexOf('?'); var result = []; if (tokenIndex > -1) { var qs = url.substring(tokenIndex + 1).split('&'); for (var i = 0, result = {}; i < qs.length; i++) { qs[i] = qs[i].split('='); result[qs[i][0]] = decodeURIComponent(qs[i][1]); } } return result; } // 객체에서 키 갯수를 추출한다. $rootScope.getObjectKeys = function (object) { return Object.keys(object).length; }; // 도움말 다국어 적용 $rootScope.translate = function (content) { return $filter("translate")(content); }; // 문의하기 버튼 $rootScope.showaskbtn = function () { var bShow = false; if( $rootScope.isDefined($rootScope.user) ) { bShow = true; if( $rootScope.toState.name === "qna.list" || $rootScope.toState.name === "support.support") { bShow = false; } } return bShow; }; // session check after route $rootScope.$on("$stateChangeStart", function (event, toState, toStateParams) { $("#page-container").trigger("click"); $("body").unbind("click"); var $uibModalStack = $injector.get('$uibModalStack'); $uibModalStack.dismissAll(); // 프로그래스바 숨김. $rootScope.spinner = false; $rootScope.toState = toState; $rootScope.toStateParams = toStateParams; // get 파라미터 읽기 var params = $rootScope.getUrlParameter(); if (Object.keys(params).length > 0) { $rootScope.previousGetParams = params; } /*if (Principal.isIdentityResolved()) { Auth.authorize(); }*/ // 업무 공간 목록을 갱신한다. $rootScope.getWorkspaceList(); }); // scroll is top after route success $rootScope.$on('$stateChangeSuccess', function (event, toState, toParams, fromState, fromParams) { // table orderBy column init setting $tableProvider.setOrderByColumn(); $tableProvider.reverse = false; $relProvider.setOrderByColumn(); $relProvider.reverse = false; // 이슈 목록->상세화면에서 마지막으로 접근한 이슈 아이디 - 라우트 탈때마다 초기화 $rootScope.currentDetailIssueId = null; // 사용자 정보를 가져온다. // $rootScope.getMyInfo(); $log.debug("toState.name : ", toState.name); $log.debug("$rootScope.previousStateName 확인 : ", $rootScope.previousStateName); if (toState.name !== 'login' && $rootScope.previousStateName) { $log.debug("previousStateName : ", fromState.name); $log.debug("fromParams : ", fromParams); $rootScope.previousStateName = fromState.name; $rootScope.previousStateNameParams = fromParams; } else { // edit by zenith at 20200802 // for check has primary workspace if (toState.name === 'login' || toState.name === 'join' ) { $rootScope.checkPrimaryWorkspace(); } } }); // if ui-router $http occur error, trigger this event $rootScope.$on('$stateChangeError', function (e) { }); $rootScope.$on('$stateNotFound', function () { }); $rootScope.$on('$includeContentLoaded', function () { }); $rootScope.$on('$viewContentLoaded', function () { }); $rootScope.back = function () { $log.debug("로그인시 마지막 접근 url : ", $rootScope.previousStateName); if ($state.get($rootScope.previousStateName) === null || $rootScope.previousStateName === "login" || $rootScope.previousStateName === "join") { $state.go('dashboards.dashboard'); } else { $state.go($rootScope.previousStateName, $rootScope.previousStateNameParams); } }; }) .constant("contextPath", (function () { var offset = location.href.indexOf(location.host) + location.host.length; var ctxPath = location.href.substring(offset, location.href.indexOf('/', offset + 1)); console.log("경로 : ", ctxPath); return ctxPath; })()); });