diff --git a/guacamole/src/main/webapp/app/list/directives/guacUserItem.js b/guacamole/src/main/webapp/app/list/directives/guacUserItem.js new file mode 100644 index 000000000..5c5d26d06 --- /dev/null +++ b/guacamole/src/main/webapp/app/list/directives/guacUserItem.js @@ -0,0 +1,92 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +/** + * A directive which graphically represents an individual user. + */ +angular.module('list').directive('guacUserItem', [function guacUserItem() { + + return { + restrict: 'E', + replace: true, + scope: { + + /** + * The username of the user represented by this guacUserItem. + * + * @type String + */ + username : '=' + + }, + + templateUrl: 'app/list/templates/guacUserItem.html', + controller: ['$scope', '$injector', + function guacUserItemController($scope, $injector) { + + // Required types + var AuthenticationResult = $injector.get('AuthenticationResult'); + + // Required services + var $translate = $injector.get('$translate'); + + /** + * The string to display when listing the user having the provided + * username. Generally, this will be the username itself, but can + * also be an arbitrary human-readable representation of the user, + * or null if the display name is not yet determined. + * + * @type String + */ + $scope.displayName = null; + + /** + * Returns whether the username provided to this directive denotes + * a user that authenticated anonymously. + * + * @returns {Boolean} + * true if the username provided represents an anonymous user, + * false otherwise. + */ + $scope.isAnonymous = function isAnonymous() { + return $scope.username === AuthenticationResult.ANONYMOUS_USERNAME; + }; + + // Update display name whenever provided username changes + $scope.$watch('username', function updateDisplayName(username) { + + // If the user is anonymous, pull the display name for anonymous + // users from the translation service + if ($scope.isAnonymous()) { + $translate('LIST.TEXT_ANONYMOUS_USER') + .then(function retrieveAnonymousDisplayName(anonymousDisplayName) { + $scope.displayName = anonymousDisplayName; + }); + } + + // For all other users, use the username verbatim + else + $scope.displayName = username; + + }); + + }] // end controller + + }; +}]); diff --git a/guacamole/src/main/webapp/app/list/listModule.js b/guacamole/src/main/webapp/app/list/listModule.js index b3e65810e..845c8c968 100644 --- a/guacamole/src/main/webapp/app/list/listModule.js +++ b/guacamole/src/main/webapp/app/list/listModule.js @@ -21,4 +21,6 @@ * Module for displaying, sorting, and filtering the contents of a list, split * into multiple pages. */ -angular.module('list', []); +angular.module('list', [ + 'auth' +]); diff --git a/guacamole/src/main/webapp/app/list/styles/user-item.css b/guacamole/src/main/webapp/app/list/styles/user-item.css new file mode 100644 index 000000000..ffedd3902 --- /dev/null +++ b/guacamole/src/main/webapp/app/list/styles/user-item.css @@ -0,0 +1,23 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +.user-item.anonymous { + font-style: italic; + opacity: 0.5; +} diff --git a/guacamole/src/main/webapp/app/list/templates/guacUserItem.html b/guacamole/src/main/webapp/app/list/templates/guacUserItem.html new file mode 100644 index 000000000..e6ea670a6 --- /dev/null +++ b/guacamole/src/main/webapp/app/list/templates/guacUserItem.html @@ -0,0 +1,3 @@ +
+ {{displayName}} +
diff --git a/guacamole/src/main/webapp/app/manage/templates/manageConnection.html b/guacamole/src/main/webapp/app/manage/templates/manageConnection.html index 336530d87..9df51a0d8 100644 --- a/guacamole/src/main/webapp/app/manage/templates/manageConnection.html +++ b/guacamole/src/main/webapp/app/manage/templates/manageConnection.html @@ -75,7 +75,7 @@ - {{wrapper.entry.username}} + {{wrapper.entry.startDate | date:historyDateFormat}} - {{historyEntryWrapper.username}} + {{historyEntryWrapper.startDate | date : dateFormat}} diff --git a/guacamole/src/main/webapp/app/settings/templates/settingsSessions.html b/guacamole/src/main/webapp/app/settings/templates/settingsSessions.html index 917c7db7c..184ff0b10 100644 --- a/guacamole/src/main/webapp/app/settings/templates/settingsSessions.html +++ b/guacamole/src/main/webapp/app/settings/templates/settingsSessions.html @@ -37,7 +37,7 @@ - {{wrapper.activeConnection.username}} + {{wrapper.startDate}} {{wrapper.activeConnection.remoteHost}} {{wrapper.name}} diff --git a/guacamole/src/main/webapp/translations/en.json b/guacamole/src/main/webapp/translations/en.json index af3d8c576..48dbeab67 100644 --- a/guacamole/src/main/webapp/translations/en.json +++ b/guacamole/src/main/webapp/translations/en.json @@ -42,6 +42,7 @@ "INFO_ACTIVE_USER_COUNT" : "Currently in use by {USERS} {USERS, plural, one{user} other{users}}.", + "TEXT_ANONYMOUS_USER" : "Anonymous", "TEXT_HISTORY_DURATION" : "{VALUE} {UNIT, select, second{{VALUE, plural, one{second} other{seconds}}} minute{{VALUE, plural, one{minute} other{minutes}}} hour{{VALUE, plural, one{hour} other{hours}}} day{{VALUE, plural, one{day} other{days}}} other{}}" }, @@ -166,6 +167,12 @@ }, + "LIST" : { + + "TEXT_ANONYMOUS_USER" : "Anonymous" + + }, + "LOGIN": { "ACTION_ACKNOWLEDGE" : "@:APP.ACTION_ACKNOWLEDGE",