Files
cloudron-box/webadmin/src/views/users.js

391 lines
13 KiB
JavaScript
Raw Normal View History

'use strict';
angular.module('Application').controller('UsersController', ['$scope', '$location', 'Client', function ($scope, $location, Client) {
Client.onReady(function () { if (!Client.getUserInfo().admin) $location.path('/'); });
$scope.ready = false;
$scope.users = [];
2016-02-10 14:26:04 +01:00
$scope.groups = [];
$scope.userInfo = Client.getUserInfo();
$scope.userremove = {
busy: false,
error: {},
userInfo: {},
username: '',
password: ''
};
$scope.useradd = {
busy: false,
alreadyTaken: false,
error: {},
username: '',
email: '',
2016-01-19 23:58:52 -08:00
displayName: '',
sendInvite: true
};
$scope.useredit = {
busy: false,
error: {},
userInfo: {},
email: '',
displayName: '',
superuser: false
};
$scope.showBubble = function ($event) {
$($event.target).tooltip('show');
setTimeout(function () {
$($event.target).tooltip('hide');
}, 2000);
};
2016-02-10 16:43:23 +01:00
$scope.groupAdd = {
2016-02-10 16:24:25 +01:00
busy: false,
error: {},
2016-02-10 16:37:58 +01:00
name: '',
2016-02-10 16:41:32 +01:00
show: function () {
2016-02-10 16:43:23 +01:00
$scope.groupAdd.busy = false;
2016-02-10 16:37:58 +01:00
2016-02-10 16:43:23 +01:00
$scope.groupAdd.error = {};
$scope.groupAdd.name = '';
2016-02-10 16:37:58 +01:00
$scope.groupAddForm.$setUntouched();
$scope.groupAddForm.$setPristine();
$('#groupAddModal').modal('show');
},
submit: function () {
2016-02-10 16:43:23 +01:00
$scope.groupAdd.busy = true;
2016-02-10 16:59:24 +01:00
$scope.groupAdd.error = {};
2016-02-10 16:37:58 +01:00
2016-02-10 16:43:23 +01:00
Client.createGroup($scope.groupAdd.name, function (error) {
$scope.groupAdd.busy = false;
2016-02-10 16:41:32 +01:00
2016-02-10 16:37:58 +01:00
if (error && error.statusCode === 409) {
2016-02-10 16:43:23 +01:00
$scope.groupAdd.error.name = 'Name already taken';
2016-02-10 16:37:58 +01:00
$scope.groupAddForm.name.$setPristine();
$('#groupAddName').focus();
return;
}
if (error && error.statusCode === 400) {
$scope.groupAdd.error.name = error.message;
$scope.groupAddForm.name.$setPristine();
$('#groupAddName').focus();
return;
}
2016-02-10 16:37:58 +01:00
if (error) return console.error('Unable to create group.', error.statusCode, error.message);
refresh();
2016-02-10 16:41:32 +01:00
$('#groupAddModal').modal('hide');
2016-02-10 16:37:58 +01:00
});
}
2016-02-10 16:24:25 +01:00
};
2016-04-04 18:21:45 +02:00
$scope.inviteSent = {
email: '',
setupLink: ''
};
2016-02-10 16:59:24 +01:00
$scope.groupRemove = {
busy: false,
error: {},
group: null,
password: '',
memberCount: 0,
2016-02-10 16:59:24 +01:00
show: function (group) {
$scope.groupRemove.busy = false;
$scope.groupRemove.error = {};
$scope.groupRemove.password = '';
$scope.groupRemove.group = angular.copy(group);
$scope.groupRemoveForm.$setUntouched();
$scope.groupRemoveForm.$setPristine();
Client.getGroup(group.id, function (error, result) {
if (error) return console.error('Unable to fetch group information.', error.statusCode, error.message);
$scope.groupRemove.memberCount = result.userIds.length;
$('#groupRemoveModal').modal('show');
});
2016-02-10 16:59:24 +01:00
},
submit: function () {
$scope.groupRemove.busy = true;
$scope.groupRemove.error = {};
Client.removeGroup($scope.groupRemove.group.id, $scope.groupRemove.password, function (error) {
$scope.groupRemove.busy = false;
if (error && error.statusCode === 403) {
$scope.groupRemove.error.password = 'Wrong password';
$scope.groupRemove.password = '';
$scope.groupRemoveForm.password.$setPristine();
$('#groupRemovePasswordInput').focus();
return;
}
2016-02-10 16:59:24 +01:00
if (error) return console.error('Unable to remove group.', error.statusCode, error.message);
refresh();
2016-02-10 17:16:50 +01:00
$('#groupRemoveModal').modal('hide');
2016-02-10 16:59:24 +01:00
});
}
};
$scope.isMe = function (user) {
return user.username === Client.getUserInfo().username;
};
$scope.isAdmin = function (user) {
return !!user.admin;
};
$scope.toggleAdmin = function (user) {
Client.setAdmin(user.username, !user.admin, function (error) {
if (error) return console.error(error);
user.admin = !user.admin;
});
};
2016-01-18 15:45:54 +01:00
$scope.sendInvite = function (user) {
2016-04-04 18:21:45 +02:00
$scope.inviteSent.email = user.email;
$scope.inviteSent.setupLink = '';
2016-04-04 18:15:24 +02:00
Client.sendInvite(user.username, function (error, resetToken) {
2016-01-18 15:45:54 +01:00
if (error) return console.error(error);
2016-04-04 18:21:45 +02:00
// Client.notify('', 'Invitation was successfully sent to ' + user.email + '.', false, 'success');
2016-04-04 18:15:24 +02:00
2016-04-04 18:21:45 +02:00
$scope.inviteSent.setupLink = location.origin + '/api/v1/session/password/setup.html?reset_token=' + resetToken;
$('#inviteSentModal').modal('show');
2016-01-18 15:45:54 +01:00
});
};
$scope.showUserAdd = function () {
$scope.useradd.error = {};
$scope.useradd.username = '';
$scope.useradd.email = '';
$scope.useradd.displayName = '';
$scope.useradd_form.$setUntouched();
$scope.useradd_form.$setPristine();
$('#userAddModal').modal('show');
};
$scope.doAdd = function () {
$scope.useradd.busy = true;
$scope.useradd.alreadyTaken = false;
$scope.useradd.error.username = null;
$scope.useradd.error.email = null;
2016-01-19 23:58:52 -08:00
$scope.useradd.error.displayName = null;
2016-01-19 23:58:52 -08:00
Client.createUser($scope.useradd.username, $scope.useradd.email, $scope.useradd.displayName, $scope.useradd.sendInvite, function (error) {
$scope.useradd.busy = false;
if (error && error.statusCode === 409) {
$scope.useradd.error.username = 'Username or Email already taken';
$scope.useradd.error.email = 'Username or Email already taken';
$scope.useradd_form.username.$setPristine();
$scope.useradd_form.email.$setPristine();
2016-01-19 23:58:52 -08:00
$scope.useradd_form.displayName.$setPristine();
$('#inputUserAddUsername').focus();
return;
}
if (error && error.statusCode === 400) {
if (error.message.indexOf('email') !== -1) {
$scope.useradd.error.email = 'Invalid Email';
$scope.useradd.error.emailAttempted = $scope.useradd.email;
$scope.useradd_form.email.$setPristine();
$('#inputUserAddEmail').focus();
} else if (error.message.indexOf('username') !== -1) {
$scope.useradd.error.username = 'Invalid Username';
$scope.useradd.error.usernameAttempted = $scope.useradd.username;
$scope.useradd_form.username.$setPristine();
$('#inputUserAddUsername').focus();
2016-01-19 23:58:52 -08:00
} else if (error.message.indexOf('displayName') !== -1) {
$scope.useradd.error.displayName = 'Invalid Name';
$scope.useradd.error.displayNameAttempted = $scope.useradd.displayName;
$scope.useradd_form.displayName.$setPristine();
$('#inputUserAddDisplayName').focus();
} else {
console.error('Unable to create user.', error.statusCode, error.message);
}
return;
}
if (error) return console.error('Unable to create user.', error.statusCode, error.message);
$scope.useradd.error = {};
$scope.useradd.username = '';
$scope.useradd.email = '';
2016-01-19 23:58:52 -08:00
$scope.useradd.displayName = '';
$scope.useradd_form.$setUntouched();
$scope.useradd_form.$setPristine();
refresh();
$('#userAddModal').modal('hide');
});
};
$scope.showUserEdit = function (userInfo) {
$scope.useredit.error.displayName = null;
$scope.useredit.error.email = null;
$scope.useredit.displayName = userInfo.displayName;
$scope.useredit.email = userInfo.email;
$scope.useredit.userInfo = userInfo;
2016-02-10 14:39:49 +01:00
$scope.useredit.groupIds = angular.copy(userInfo.groupIds);
$scope.useredit.superuser = userInfo.groupIds.indexOf('admin') !== -1;
$scope.useredit_form.$setPristine();
$scope.useredit_form.$setUntouched();
$('#userEditModal').modal('show');
};
2016-02-10 14:39:49 +01:00
$scope.userEditToggleGroup = function (group) {
var pos = $scope.useredit.groupIds.indexOf(group.id);
if (pos === -1) {
$scope.useredit.groupIds.push(group.id);
} else {
$scope.useredit.groupIds.splice(pos, 1);
}
};
$scope.doUserEdit = function () {
2016-01-25 14:58:12 +01:00
$scope.useredit.error.displayName = null;
$scope.useredit.error.email = null;
$scope.useredit.busy = true;
var data = {
id: $scope.useredit.userInfo.id,
email: $scope.useredit.email,
displayName: $scope.useredit.displayName
};
Client.updateUser(data, function (error) {
2016-02-11 12:50:02 +01:00
if (error) {
$scope.useredit.busy = false;
return console.error('Unable to update user:', error);
}
2016-01-25 14:58:12 +01:00
2016-02-26 10:56:33 +01:00
if ($scope.useredit.superuser) {
if ($scope.useredit.groupIds.indexOf('admin') === -1) $scope.useredit.groupIds.push('admin');
} else {
$scope.useredit.groupIds = $scope.useredit.groupIds.filter(function (groupId) { return groupId !== 'admin'; });
}
2016-02-10 14:47:49 +01:00
Client.setGroups(data.id, $scope.useredit.groupIds, function (error) {
2016-02-11 12:50:02 +01:00
$scope.useredit.busy = false;
2016-02-10 14:47:49 +01:00
if (error) return console.error('Unable to update groups for user:', error);
2016-02-10 14:47:49 +01:00
$scope.useredit.userInfo = {};
$scope.useredit.email = '';
$scope.useredit.displayName = '';
$scope.useredit.superuser = false;
2016-02-10 14:47:49 +01:00
$scope.useredit.groupIds = [];
2016-01-25 14:58:12 +01:00
2016-02-10 14:47:49 +01:00
$scope.useredit_form.$setPristine();
$scope.useredit_form.$setUntouched();
refresh();
2016-01-25 14:58:12 +01:00
2016-02-10 14:47:49 +01:00
$('#userEditModal').modal('hide');
});
2016-01-25 14:58:12 +01:00
});
};
$scope.showUserRemove = function (userInfo) {
$scope.userremove.error.username = null;
$scope.userremove.error.password = null;
2016-01-18 16:25:42 +01:00
$scope.userremove.username = '';
$scope.userremove.password = '';
$scope.userremove.userInfo = userInfo;
2016-01-18 16:25:42 +01:00
$scope.userremove_form.$setPristine();
$scope.userremove_form.$setUntouched();
$('#userRemoveModal').modal('show');
};
$scope.doUserRemove = function () {
$scope.userremove.error.username = null;
$scope.userremove.error.password = null;
if ($scope.userremove.username !== $scope.userremove.userInfo.username) {
$scope.userremove.error.username = 'Username does not match';
$scope.userremove.username = '';
$('#inputUserRemoveUsername').focus();
return;
}
$scope.userremove.busy = true;
Client.removeUser($scope.userremove.userInfo.id, $scope.userremove.password, function (error) {
$scope.userremove.busy = false;
if (error && error.statusCode === 403) {
2016-01-26 16:09:14 +01:00
$scope.userremove.error.password = 'Wrong password';
$scope.userremove.password = '';
$scope.userremove_form.password.$setPristine();
$('#inputUserRemovePassword').focus();
return;
}
if (error) return console.error('Unable to delete user.', error);
$scope.userremove.userInfo = {};
$scope.userremove.username = '';
$scope.userremove.password = '';
$scope.userremove_form.$setPristine();
$scope.userremove_form.$setUntouched();
refresh();
$('#userRemoveModal').modal('hide');
});
};
function refresh() {
2016-02-10 14:26:04 +01:00
Client.getGroups(function (error, result) {
if (error) return console.error('Unable to get group listing.', error);
2016-02-10 14:26:04 +01:00
$scope.groups = result;
Client.listUsers(function (error, result) {
if (error) return console.error('Unable to get user listing.', error);
$scope.users = result.users;
$scope.ready = true;
});
});
}
refresh();
2016-02-25 16:07:31 +01:00
$scope.initTooltip = function () {
$('[data-toggle="tooltip"]').tooltip();
};
// setup all the dialog focus handling
2016-02-10 16:59:24 +01:00
['userAddModal', 'userRemoveModal', 'userEditModal', 'groupAddModal', 'groupRemoveModal'].forEach(function (id) {
$('#' + id).on('shown.bs.modal', function () {
$(this).find("[autofocus]:first").focus();
});
});
}]);