/* Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ 'use strict'; var flowableApp = angular.module('flowableApp', [ 'http-auth-interceptor', 'ngCookies', 'ngResource', 'ngSanitize', 'ngRoute', 'mgcrea.ngStrap', 'ngAnimate', 'ngFileUpload', 'pascalprecht.translate', 'ui.grid', 'ui.grid.edit', 'ui.grid.selection', 'ui.grid.autoResize', 'ui.grid.cellNav' ]); var flowableModule = flowableApp; flowableApp // Initialize routes .config(['$provide', '$routeProvider', '$selectProvider', '$datepickerProvider', '$translateProvider', function ($provide, $routeProvider, $selectProvider, $datepickerProvider, $translateProvider) { var appName = ''; $provide.value('appName', appName); var ctx = FLOWABLE.CONFIG.webContextRoot; // Override caret for bs-select directive angular.extend($selectProvider.defaults, { caretHtml: ' ' }); // Override carets for bs-datepicker directive angular.extend($datepickerProvider.defaults, { iconLeft: 'icon icon-caret-left', iconRight: 'icon icon-caret-right' }); /* * Route resolver for all authenticated routes */ var authRouteResolver = ['$rootScope', 'AuthenticationSharedService', function($rootScope, AuthenticationSharedService) { if(!$rootScope.authenticated) { // Return auth-promise. On success, the promise resolves and user is assumed authenticated from now on. If // promise is rejected, route will not be followed (no unneeded HTTP-calls will be done, which case a 401 in the end, anyway) return AuthenticationSharedService.authenticate(); } else { // Authentication done on rootscope, no need to call service again. Any unauthenticated access to REST will result in // a 401 and will redirect to login anyway. Done to prevent additional call to authenticate every route-change $rootScope.authenticated = true; return true; } }]; /* * Route resolver for all unauthenticated routes */ var unauthRouteResolver = ['$rootScope', function($rootScope) { $rootScope.authenticationChecked = true; }]; $routeProvider .when('/login', { templateUrl: 'views/login.html', controller: 'LoginController', resolve: { verify: unauthRouteResolver } }) .when('/user-mgmt', { controller: 'IdmUserMgmtController', templateUrl: 'views/idm-user-mgmt.html', resolve: { verify: authRouteResolver } }) .when('/group-mgmt', { controller: 'GroupMgmtController', templateUrl: 'views/idm-group-mgmt.html', resolve: { verify: authRouteResolver } }) .when('/privilege-mgmt', { controller: 'PrivilegeMgmtController', templateUrl: 'views/idm-privilege-mgmt.html', resolve: { verify: authRouteResolver } }) .when('/logout', { templateUrl: 'views/empty.html', controller: 'LogoutController' }) .otherwise({ redirectTo: FLOWABLE.CONFIG.appDefaultRoute || '/user-mgmt' }); // Initialize angular-translate $translateProvider.useStaticFilesLoader({ prefix: './i18n/', suffix: '.json' }) /* This can be used to map multiple browser language keys to a angular translate language key. */ // .registerAvailableLanguageKeys(['en'], { // 'en-*': 'en' // }) .useSanitizeValueStrategy('escapeParameters') .uniformLanguageTag('bcp47') .determinePreferredLanguage(); }]) .run(['$rootScope', function($rootScope) { $rootScope.$on( "$routeChangeStart", function(event, next, current) { if (next !== null && next !== undefined) { $rootScope.onLogin = next.templateUrl === 'views/login.html'; } }); }]) .run(['$rootScope', '$timeout', '$translate', '$location', '$window', 'AuthenticationSharedService', function($rootScope, $timeout, $translate, $location, $window, AuthenticationSharedService) { // set angular translate fallback language $translate.fallbackLanguage(['en']); // setting Moment-JS (global) locale if (FLOWABLE.CONFIG.datesLocalization) { moment.locale($translate.proposedLanguage()); } // Common model (eg selected tenant id) $rootScope.common = {}; $rootScope.webRootUrl = function() { return FLOWABLE.CONFIG.webContextRoot; }; $rootScope.restRootUrl = function() { return FLOWABLE.CONFIG.contextIdmRestRoot; }; // Needed for auto-height $rootScope.window = {}; var updateWindowSize = function() { $rootScope.window.width = $window.innerWidth; $rootScope.window.height = $window.innerHeight; }; // Window resize hook angular.element($window).bind('resize', function() { $rootScope.$apply(updateWindowSize()); }); $rootScope.$watch('window.forceRefresh', function(newValue) { if(newValue) { $timeout(function() { updateWindowSize(); $rootScope.window.forceRefresh = false; }); } }); updateWindowSize(); // Main navigation depends on the account being fetched $rootScope.$watch('account', function() { $rootScope.mainNavigation = [ { id: 'userMgmt', title: 'IDM.GENERAL.NAVIGATION.USER-MGMT', path: '/user-mgmt' }, { id: 'groupMgmt', title: 'IDM.GENERAL.NAVIGATION.GROUP-MGMT', path: '/group-mgmt' }, { id: 'privilegeMgmt', title: 'IDM.GENERAL.NAVIGATION.PRIVILEGE-MGMT', path: '/privilege-mgmt' } ]; /* * Set the current main page, using the page object. If the page is already active, * this is a no-op. */ $rootScope.setMainPage = function(mainPage) { $rootScope.mainPage = mainPage; $location.path($rootScope.mainPage.path); }; /* * Set the current main page, using the page ID. If the page is already active, * this is a no-op. */ $rootScope.setMainPageById = function(mainPageId) { for (var i=0; i<$rootScope.mainNavigation.length; i++) { if (mainPageId == $rootScope.mainNavigation[i].id) { $rootScope.mainPage = $rootScope.mainNavigation[i]; break; } } }; }); } ]) .run(['$rootScope', '$timeout', '$translate', '$location', '$http', '$window', '$popover', function($rootScope, $timeout, $translate, $location, $http, $window, $popover) { // Alerts $rootScope.alerts = { queue: [] }; $rootScope.webRootUrl = function() { return FLOWABLE.CONFIG.webContextRoot; }; $rootScope.restRootUrl = function() { return FLOWABLE.CONFIG.contextRoot; }; $rootScope.showAlert = function(alert) { if(alert.queue.length > 0) { alert.current = alert.queue.shift(); // Start timout for message-pruning alert.timeout = $timeout(function() { if(alert.queue.length == 0) { alert.current = undefined; alert.timeout = undefined; } else { $rootScope.showAlert(alert); } }, (alert.current.type == 'error' ? 5000 : 1000)); } else { $rootScope.alerts.current = undefined; } }; $rootScope.addAlert = function(message, type) { var newAlert = {message: message, type: type}; if(!$rootScope.alerts.timeout) { // Timeout for message queue is not running, start one $rootScope.alerts.queue.push(newAlert); $rootScope.showAlert($rootScope.alerts); } else { $rootScope.alerts.queue.push(newAlert); } }; $rootScope.dismissAlert = function() { if(!$rootScope.alerts.timeout) { $rootScope.alerts.current = undefined; } else { $timeout.cancel($rootScope.alerts.timeout); $rootScope.alerts.timeout = undefined; $rootScope.showAlert($rootScope.alerts); } }; $rootScope.addAlertPromise = function(promise, type) { if(promise) { promise.then(function(data) { $rootScope.addAlert(data, type); }); } }; }]) .run(['$rootScope', '$location', '$window', 'AuthenticationSharedService', '$translate', '$modal', function($rootScope, $location, $window, AuthenticationSharedService, $translate, $modal) { /* Auto-height */ $rootScope.window = {}; var updateWindowSize = function() { $rootScope.window.width = $window.innerWidth; $rootScope.window.height = $window.innerHeight; }; // Window resize hook angular.element($window).bind('resize', function() { $rootScope.$apply(updateWindowSize()); }); $rootScope.$watch('window.forceRefresh', function(newValue) { if(newValue) { $timeout(function() { updateWindowSize(); $rootScope.window.forceRefresh = false; }); } }); updateWindowSize(); $rootScope.logout = function() { // Changing the href causes a reload, so no need to do a new reload again $window.location.href = FLOWABLE.CONFIG.contextRoot + '/app/logout'; }; // Call when the 401 response is returned by the client $rootScope.$on('event:auth-loginRequired', function(rejection) { $rootScope.authenticated = false; $rootScope.authenticationChecked = true; if (FLOWABLE.CONFIG.loginUrl) { $window.location.href = FLOWABLE.CONFIG.loginUrl.replace("{url}", $location.absUrl()); $window.reload(); } else { $location.path('/login').replace(); } }); // Call when the user is authenticated $rootScope.$on('event:auth-authConfirmed', function(event, data) { $rootScope.authenticated = true; $rootScope.authenticationChecked = true; var redirectUrl = $location.search().redirectUrl; if (redirectUrl !== null && redirectUrl !== undefined && redirectUrl.length > 0) { $window.location.href = redirectUrl; } else { var locationPath = $location.path(); if (locationPath === '' || locationPath === '#' || locationPath === '/login') { if (FLOWABLE.CONFIG.contextRoot === '') { // When running on root (no context root) $window.location.href = "/"; } else { $window.location.href = FLOWABLE.CONFIG.contextRoot; } } else if (locationPath.indexOf('/account/activate/') >= 0 || locationPath.indexOf('/account/reset-password/') >= 0) { $location.path('/'); } } }); // Call when the user logs in $rootScope.$on('event:auth-loginConfirmed', function() { AuthenticationSharedService.authenticate(); }); // Call when the user logs out $rootScope.$on('event:auth-loginCancelled', function() { $rootScope.authenticated = false; // Changing the href causes a reload, so no need to do a new reload again $window.location.href = FLOWABLE.CONFIG.contextRoot; }); // Call when login fails $rootScope.$on('event:auth-loginFailed', function() { $rootScope.addAlertPromise($translate('LOGIN.MESSAGES.ERROR.AUTHENTICATION'), 'error'); }); $rootScope.backToLanding = function() { $window.location.href = FLOWABLE.CONFIG.contextRoot; }; }]) // Moment-JS date-formatting filter .filter('dateformat', function() { return function(date, format) { if (date) { if (format) { return moment(date).format(format); } else { return moment(date).calendar(); } } return ''; }; });