\ No newline at end of file
diff --git a/guacamole/src/main/webapp/app/index/styles/loading.css b/guacamole/src/main/webapp/app/index/styles/loading.css
index 159cace25..da1d8df9f 100644
--- a/guacamole/src/main/webapp/app/index/styles/loading.css
+++ b/guacamole/src/main/webapp/app/index/styles/loading.css
@@ -25,6 +25,14 @@
min-height: 200px;
}
+.view.loading {
+ position: fixed;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+}
+
.loading * {
visibility: hidden;
}
diff --git a/guacamole/src/main/webapp/app/manage/controllers/manageConnectionController.js b/guacamole/src/main/webapp/app/manage/controllers/manageConnectionController.js
index 16058192b..0f57ff032 100644
--- a/guacamole/src/main/webapp/app/manage/controllers/manageConnectionController.js
+++ b/guacamole/src/main/webapp/app/manage/controllers/manageConnectionController.js
@@ -60,6 +60,59 @@ angular.module('manage').controller('manageConnectionController', ['$scope', '$i
*/
var identifier = $routeParams.id;
+ /**
+ * All known protocols.
+ *
+ * @type Object.
+ */
+ $scope.protocols = null;
+
+ /**
+ * The root connection group of the connection group hierarchy.
+ *
+ * @type ConnectionGroup
+ */
+ $scope.rootGroup = null;
+
+ /**
+ * The connection being modified.
+ *
+ * @type Connection
+ */
+ $scope.connection = null;
+
+ /**
+ * The parameter name/value pairs associated with the connection being
+ * modified.
+ *
+ * @type Object.
+ */
+ $scope.parameters = null;
+
+ /**
+ * The usage history of the connection being modified.
+ *
+ * @type HistoryEntryWrapper[]
+ */
+ $scope.historyEntryWrappers = null;
+
+ /**
+ * Returns whether critical data has completed being loaded.
+ *
+ * @returns {Boolean}
+ * true if enough data has been loaded for the user interface to be
+ * useful, false otherwise.
+ */
+ $scope.isLoaded = function isLoaded() {
+
+ return $scope.protocols !== null
+ && $scope.rootGroup !== null
+ && $scope.connection !== null
+ && $scope.parameters !== null
+ && $scope.historyEntryWrappers !== null;
+
+ };
+
// Pull connection group hierarchy
connectionGroupService.getConnectionGroupTree(ConnectionGroup.ROOT_IDENTIFIER, PermissionSet.ObjectPermissionType.UPDATE)
.success(function connectionGroupReceived(rootGroup) {
diff --git a/guacamole/src/main/webapp/app/manage/controllers/manageConnectionGroupController.js b/guacamole/src/main/webapp/app/manage/controllers/manageConnectionGroupController.js
index 38010b37a..31f751ea0 100644
--- a/guacamole/src/main/webapp/app/manage/controllers/manageConnectionGroupController.js
+++ b/guacamole/src/main/webapp/app/manage/controllers/manageConnectionGroupController.js
@@ -55,6 +55,35 @@ angular.module('manage').controller('manageConnectionGroupController', ['$scope'
*/
var identifier = $routeParams.id;
+ /**
+ * The root connection group of the connection group hierarchy.
+ *
+ * @type ConnectionGroup
+ */
+ $scope.rootGroup = null;
+
+ /**
+ * The connection group being modified.
+ *
+ * @type ConnectionGroup
+ */
+ $scope.connectionGroup = null;
+
+ /**
+ * Returns whether critical data has completed being loaded.
+ *
+ * @returns {Boolean}
+ * true if enough data has been loaded for the user interface to be
+ * useful, false otherwise.
+ */
+ $scope.isLoaded = function isLoaded() {
+
+ return $scope.rootGroup !== null
+ && $scope.connectionGroup !== null;
+
+ };
+
+
// Pull connection group hierarchy
connectionGroupService.getConnectionGroupTree(ConnectionGroup.ROOT_IDENTIFIER, PermissionSet.ObjectPermissionType.UPDATE)
.success(function connectionGroupReceived(rootGroup) {
diff --git a/guacamole/src/main/webapp/app/manage/controllers/manageController.js b/guacamole/src/main/webapp/app/manage/controllers/manageController.js
index b4ae57306..84733fe55 100644
--- a/guacamole/src/main/webapp/app/manage/controllers/manageController.js
+++ b/guacamole/src/main/webapp/app/manage/controllers/manageController.js
@@ -32,7 +32,9 @@ angular.module('manage').controller('manageController', ['$scope', '$injector',
var User = $injector.get('User');
// Required services
+ var authenticationService = $injector.get('authenticationService');
var connectionGroupService = $injector.get('connectionGroupService');
+ var permissionService = $injector.get('permissionService');
var userService = $injector.get('userService');
/**
@@ -47,6 +49,46 @@ angular.module('manage').controller('manageController', ['$scope', '$injector',
}
};
+ /**
+ * Whether the current user can manage users. If the current permissions
+ * have not yet been loaded, this will be null.
+ *
+ * @type Boolean
+ */
+ $scope.canManageUsers = null;
+
+ /**
+ * Whether the current user can manage connections. If the current
+ * permissions have not yet been loaded, this will be null.
+ *
+ * @type Boolean
+ */
+ $scope.canManageConnections = null;
+
+ /**
+ * Whether the current user can create new users. If the current
+ * permissions have not yet been loaded, this will be null.
+ *
+ * @type Boolean
+ */
+ $scope.canCreateUsers = null;
+
+ /**
+ * Whether the current user can create new connections. If the current
+ * permissions have not yet been loaded, this will be null.
+ *
+ * @type Boolean
+ */
+ $scope.canCreateConnections = null;
+
+ /**
+ * Whether the current user can create new connection groups. If the
+ * current permissions have not yet been loaded, this will be null.
+ *
+ * @type Boolean
+ */
+ $scope.canCreateConnectionGroups = null;
+
/**
* The name of the new user to create, if any, when user creation is
* requested via newUser().
@@ -54,6 +96,58 @@ angular.module('manage').controller('manageController', ['$scope', '$injector',
* @type String
*/
$scope.newUsername = "";
+
+ /**
+ * Returns whether critical data has completed being loaded.
+ *
+ * @returns {Boolean}
+ * true if enough data has been loaded for the user interface to be
+ * useful, false otherwise.
+ */
+ $scope.isLoaded = function isLoaded() {
+
+ return $scope.users !== null
+ && $scope.rootGroup !== null
+ && $scope.canManageUsers !== null
+ && $scope.canManageConnections !== null
+ && $scope.canCreateUsers !== null
+ && $scope.canCreateConnections !== null
+ && $scope.canCreateConnectionGroups !== null;
+
+ };
+
+ // Retrieve current permissions
+ permissionService.getPermissions(authenticationService.getCurrentUserID())
+ .success(function permissionsRetrieved(permissions) {
+
+ // Determine whether the current user can create new users
+ $scope.canCreateUsers =
+ PermissionSet.hasSystemPermission(permissions, PermissionSet.SystemPermissionType.ADMINISTER)
+ || PermissionSet.hasSystemPermission(permissions, PermissionSet.SystemPermissionType.CREATE_USER);
+
+ // Determine whether the current user can create new users
+ $scope.canCreateConnections =
+ PermissionSet.hasSystemPermission(permissions, PermissionSet.SystemPermissionType.ADMINISTER)
+ || PermissionSet.hasSystemPermission(permissions, PermissionSet.SystemPermissionType.CREATE_CONNECTION);
+
+ // Determine whether the current user can create new users
+ $scope.canCreateConnectionGroups =
+ PermissionSet.hasSystemPermission(permissions, PermissionSet.SystemPermissionType.ADMINISTER)
+ || PermissionSet.hasSystemPermission(permissions, PermissionSet.SystemPermissionType.CREATE_CONNECTION_GROUP);
+
+ // Determine whether the current user can manage other users
+ $scope.canManageUsers =
+ $scope.canCreateUsers
+ || PermissionSet.hasUserPermission(permissions, PermissionSet.ObjectPermissionType.UPDATE);
+
+ // Determine whether the current user can manage other connections
+ $scope.canManageConnections =
+ $scope.canCreateConnections
+ || $scope.canCreateConnectionGroups
+ || PermissionSet.hasConnectionPermission(permissions, PermissionSet.ObjectPermissionType.UPDATE)
+ || PermissionSet.hasConnectionGroupPermission(permissions, PermissionSet.ObjectPermissionType.UPDATE);
+
+ });
// Retrieve all connections for which we have UPDATE permission
connectionGroupService.getConnectionGroupTree(ConnectionGroup.ROOT_IDENTIFIER, PermissionSet.ObjectPermissionType.UPDATE)
diff --git a/guacamole/src/main/webapp/app/manage/controllers/manageUserController.js b/guacamole/src/main/webapp/app/manage/controllers/manageUserController.js
index bf860a78e..e7642149f 100644
--- a/guacamole/src/main/webapp/app/manage/controllers/manageUserController.js
+++ b/guacamole/src/main/webapp/app/manage/controllers/manageUserController.js
@@ -57,6 +57,42 @@ angular.module('manage').controller('manageUserController', ['$scope', '$injecto
*/
var username = $routeParams.id;
+ /**
+ * The user being modified.
+ *
+ * @type User
+ */
+ $scope.user = null;
+
+ /**
+ * All permissions associated with the user being modified.
+ *
+ * @type PermissionFlagSet
+ */
+ $scope.permissionFlags = null;
+
+ /**
+ * The root connection group of the connection group hierarchy.
+ *
+ * @type ConnectionGroup
+ */
+ $scope.rootGroup = null;
+
+ /**
+ * Returns whether critical data has completed being loaded.
+ *
+ * @returns {Boolean}
+ * true if enough data has been loaded for the user interface to be
+ * useful, false otherwise.
+ */
+ $scope.isLoaded = function isLoaded() {
+
+ return $scope.user !== null
+ && $scope.permissionFlags !== null
+ && $scope.rootGroup !== null;
+
+ };
+
// Pull user data
userService.getUser(username).success(function userReceived(user) {
$scope.user = user;
diff --git a/guacamole/src/main/webapp/app/manage/templates/manage.html b/guacamole/src/main/webapp/app/manage/templates/manage.html
index cfaa1bb52..d079c3fe4 100644
--- a/guacamole/src/main/webapp/app/manage/templates/manage.html
+++ b/guacamole/src/main/webapp/app/manage/templates/manage.html
@@ -20,53 +20,67 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
-->
-
diff --git a/guacamole/src/main/webapp/app/manage/templates/manageConnection.html b/guacamole/src/main/webapp/app/manage/templates/manageConnection.html
index 241dc1e97..4ffe4fe08 100644
--- a/guacamole/src/main/webapp/app/manage/templates/manageConnection.html
+++ b/guacamole/src/main/webapp/app/manage/templates/manageConnection.html
@@ -20,83 +20,87 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
-->
-
diff --git a/guacamole/src/main/webapp/app/manage/templates/manageConnectionGroup.html b/guacamole/src/main/webapp/app/manage/templates/manageConnectionGroup.html
index f853162db..169717dfb 100644
--- a/guacamole/src/main/webapp/app/manage/templates/manageConnectionGroup.html
+++ b/guacamole/src/main/webapp/app/manage/templates/manageConnectionGroup.html
@@ -20,46 +20,50 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
-->
-
diff --git a/guacamole/src/main/webapp/app/manage/templates/manageUser.html b/guacamole/src/main/webapp/app/manage/templates/manageUser.html
index a460077b8..b3dd7f5b7 100644
--- a/guacamole/src/main/webapp/app/manage/templates/manageUser.html
+++ b/guacamole/src/main/webapp/app/manage/templates/manageUser.html
@@ -20,58 +20,62 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
-->
-