/* 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. */ /** * Controller for user mgmt */ flowableApp.controller('IdmUserMgmtController', ['$rootScope', '$scope', '$translate', '$http', '$timeout','$location', '$modal', function ($rootScope, $scope, $translate, $http, $timeout, $location, $modal) { $rootScope.setMainPageById('userMgmt'); $scope.model = { loading: false, sorts: [ {id: 'idAsc', name: $translate.instant('IDM.USER-MGMT.FILTERS.SORT-ID-A')}, {id: 'idDesc', name: $translate.instant('IDM.USER-MGMT.FILTERS.SORT-ID-Z')}, {id: 'emailAsc', name: $translate.instant('IDM.USER-MGMT.FILTERS.SORT-EMAIL-A')}, {id: 'emailDesc', name: $translate.instant('IDM.USER-MGMT.FILTERS.SORT-EMAIL-Z')} ], waiting: false, delayed: false, selectedUsers: {}, selectedUserCount: 0, start: 0 }; $scope.model.activeSort = $scope.model.sorts[0]; $scope.clearSelectedUsers = function() { $scope.model.selectedUsers = {}; $scope.model.selectedUserCount = 0; }; $scope.loadUsers = function() { $scope.clearSelectedUsers(); $scope.model.loading = true; var params = { filter: $scope.model.pendingFilterText, company: $scope.model.pendingCompanyText, sort: $scope.model.activeSort.id, start: $scope.model.start }; $http({method: 'GET', url: FLOWABLE.CONFIG.contextIdmRestRoot + '/rest/admin/users', params: params}). success(function(data, status, headers, config) { data.moreUsers = data.start + data.size < data.total; $scope.model.users = data; $scope.model.loading = false; }). error(function(data, status, headers, config) { $scope.model.loading = false; }); }; $scope.refreshDelayed = function() { // If already waiting, another wait-cycle will be done // after the current wait is over if($scope.model.waiting) { $scope.model.delayed = true; } else { $scope.scheduleDelayedRefresh(); } }; $scope.scheduleDelayedRefresh = function() { $scope.model.waiting = true; $timeout(function() { $scope.model.waiting = false; if( $scope.model.delayed) { $scope.model.delayed = false; // Delay again $scope.scheduleDelayedRefresh(); } else { // Actually do the refresh-call, after resetting start $scope.model.start = 0; $scope.loadUsers(); } }, 100); }; $scope.showNextUsers = function() { if($scope.model.users) { $scope.model.start = $scope.model.users.start + $scope.model.users.size; $scope.loadUsers(); } }; $scope.showPreviousUsers = function() { if($scope.model.users) { $scope.model.start = Math.max(0, $scope.model.users.start - $scope.model.users.size); $scope.loadUsers(); } }; $scope.activateSort = function(sort) { $scope.model.activeSort = sort; $scope.model.start = 0; $scope.loadUsers(); }; $scope.toggleUserSelection = function(user) { if($scope.model.selectedUsers[user.id]) { delete $scope.model.selectedUsers[user.id]; $scope.model.selectedUserCount -= 1; } else { $scope.model.selectedUsers[user.id] = true; $scope.model.selectedUserCount +=1; } }; $scope.addUser = function() { $scope.model.errorMessage = undefined; $scope.model.user = undefined; $scope.model.mode = 'create'; _internalCreateModal({ scope: $scope, template: 'views/popup/idm-user-create.html?version=' + new Date().getTime(), show: true }, $modal, $scope); }; $scope.editUserAccountType = function() { $scope.model.mode = 'type'; _internalCreateModal({ scope: $scope, template: 'views/popup/idm-user-type-edit.html', show: true }, $modal, $scope); }; $scope.editUserDetails = function() { $scope.model.user = undefined; $scope.model.mode = 'edit'; var selectedUsers = $scope.getSelectedUsers(); if (selectedUsers && selectedUsers.length == 1) { $scope.model.user = selectedUsers[0]; } $scope.model.errorMessage = undefined; _internalCreateModal({ scope: $scope, template: 'views/popup/idm-user-create.html?version=' + new Date().getTime(), show: true }, $modal, $scope); }; $scope.editUserPassword = function() { $scope.model.mode = 'password'; _internalCreateModal({ scope: $scope, template: 'views/popup/idm-user-password-change.html', show: true }, $modal, $scope); }; $scope.deleteUsers = function() { $scope.model.loading = true; $scope.getSelectedUsers().forEach(function(selectedUser) { $http({method: 'DELETE', url: FLOWABLE.CONFIG.contextIdmRestRoot + '/rest/admin/users/' + selectedUser.id}). success(function (data, status, headers, config) { $rootScope.addAlert('User deleted', 'info'); $scope.loadUsers(); $scope.model.loading = false; }). error(function (data, status, headers, config) { $scope.model.loading = false; if (data && data.message) { $rootScope.addAlert(data.message, 'error'); } else { $rootScope.addAlert('Error while deleting user', 'error'); } }); }); }; $scope.getSelectedUsers = function() { var selected = []; for(var i = 0; i<$scope.model.users.size; i++) { var user = $scope.model.users.data[i]; if(user) { for(var prop in $scope.model.selectedUsers) { if(user.id == prop) { selected.push(user); break; } } } } return selected; }; $scope.loadUsers(); }]); /** * Controller for the create user dialog */ flowableApp.controller('IdmCreateUserPopupController', ['$rootScope', '$scope', '$http', function ($rootScope, $scope, $http) { if ($scope.model.user === null || $scope.model.user === undefined) { $scope.model.user = {}; } $scope.createNewUser = function () { if (!$scope.model.user.id) { return; } var model = $scope.model; model.loading = true; var data = { id: model.user.id, email: model.user.email, firstName: model.user.firstName, lastName: model.user.lastName, password: model.user.password, tenantId: model.user.tenantId, }; $http({method: 'POST', url: FLOWABLE.CONFIG.contextIdmRestRoot + '/rest/admin/users', data: data}). success(function (data, status, headers, config) { $rootScope.addAlert('New user created', 'info'); $scope.loadUsers(); $scope.model.loading = false; $scope.$hide(); }). error(function (data, status, headers, config) { $scope.model.loading = false; if (data && data.message) { $rootScope.addAlert(data.message, 'error'); } else { $rootScope.addAlert('Error while updating user status', 'error'); } if (status == 403) { $scope.model.errorMessage = "Forbidden"; } else if (status == 409) { $scope.model.errorMessage = "A user with that ID or email address already exists"; } else { $scope.$hide(); } }); }; $scope.editUserDetails = function() { if (!$scope.model.user.id) { return; } var model = $scope.model; model.loading = true; var data = { id: model.user.id, email: model.user.email, firstName: model.user.firstName, lastName: model.user.lastName, tenantId: model.user.tenantId, }; $http({method: 'PUT', url: FLOWABLE.CONFIG.contextIdmRestRoot + '/rest/admin/users/' + $scope.model.user.id, data: data}). success(function (data, status, headers, config) { $scope.loadUsers(); $scope.model.loading = false; $scope.$hide(); }). error(function (data, status, headers, config) { $scope.model.loading = false; if (data && data.message) { $rootScope.addAlert(data.message, 'error'); } else { $rootScope.addAlert('Error while updating user status', 'error'); } if (status == 403) { $scope.model.errorMessage = "Forbidden"; } else if (status == 409) { $scope.model.errorMessage = "A user with that email address already exists"; } else { $scope.$hide(); } }); }; $scope.cancel = function () { if (!$scope.model.loading) { $scope.$hide(); } }; }]); /** * Controller for the bulk update dialog */ flowableApp.controller('IdmUserBulkUpdatePopupController', ['$rootScope', '$scope', '$http', function ($rootScope, $scope, $http) { if ($scope.model.mode == 'password') { $scope.model.updateUsers = { password: '' }; } $scope.updateUsers = function () { $scope.model.loading = true; var users = $scope.getSelectedUsers(); var userIds = []; for(var i=0; i