identifierFlags
map. The identifiers
,
+ * identifiersAdded
, and identifiersRemoved
+ * arrays are updated accordingly.
+ *
+ * @param {String} identifier
+ * The identifier which has been added or removed through modifying
+ * its boolean flag within identifierFlags
.
+ */
+ $scope.identifierChanged = function identifierChanged(identifier) {
+
+ // Determine status of modified identifier
+ var present = !!$scope.identifierFlags[identifier];
+
+ // Add/remove identifier from added/removed sets depending on
+ // change in flag state
+ if (present) {
+
+ addIdentifier($scope.identifiers, identifier);
+
+ if (!removeIdentifier($scope.identifiersRemoved, identifier))
+ addIdentifier($scope.identifiersAdded, identifier);
+
+ }
+ else {
+
+ removeIdentifier($scope.identifiers, identifier);
+
+ if (!removeIdentifier($scope.identifiersAdded, identifier))
+ addIdentifier($scope.identifiersRemoved, identifier);
+
+ }
+
+ };
+
+ /**
+ * Removes the given identifier, updating identifierFlags
,
+ * identifiers
, identifiersAdded
, and
+ * identifiersRemoved
accordingly.
+ *
+ * @param {String} identifier
+ * The identifier to remove.
+ */
+ $scope.removeIdentifier = function removeIdentifier(identifier) {
+ $scope.identifierFlags[identifier] = false;
+ $scope.identifierChanged(identifier);
+ };
+
+ /**
+ * Shows the full list of available identifiers. If the full list is
+ * already shown, this function has no effect.
+ */
+ $scope.expand = function expand() {
+ $scope.expanded = true;
+ };
+
+ /**
+ * Hides the full list of available identifiers. If the full list is
+ * already hidden, this function has no effect.
+ */
+ $scope.collapse = function collapse() {
+ $scope.expanded = false;
+ };
+
+ /**
+ * Returns whether there are absolutely no identifiers that can be
+ * managed using this editor. If true, the editor is effectively
+ * useless, as there is nothing whatsoever to display.
+ *
+ * @returns {Boolean}
+ * true if there are no identifiers that can be managed using this
+ * editor, false otherwise.
+ */
+ $scope.isEmpty = function isEmpty() {
+ return _.isEmpty($scope.identifiers)
+ && _.isEmpty($scope.identifiersAvailable);
+ };
+
+ }];
+
+ return directive;
+
+}]);
diff --git a/guacamole/src/main/webapp/app/manage/directives/systemPermissionEditor.js b/guacamole/src/main/webapp/app/manage/directives/systemPermissionEditor.js
index ec4187256..67fd3f4e7 100644
--- a/guacamole/src/main/webapp/app/manage/directives/systemPermissionEditor.js
+++ b/guacamole/src/main/webapp/app/manage/directives/systemPermissionEditor.js
@@ -125,6 +125,10 @@ angular.module('manage').directive('systemPermissionEditor', ['$injector',
label: "MANAGE_USER.FIELD_HEADER_CREATE_NEW_USERS",
value: PermissionSet.SystemPermissionType.CREATE_USER
},
+ {
+ label: "MANAGE_USER.FIELD_HEADER_CREATE_NEW_USER_GROUPS",
+ value: PermissionSet.SystemPermissionType.CREATE_USER_GROUP
+ },
{
label: "MANAGE_USER.FIELD_HEADER_CREATE_NEW_CONNECTIONS",
value: PermissionSet.SystemPermissionType.CREATE_CONNECTION
diff --git a/guacamole/src/main/webapp/app/manage/styles/manage-user-group.css b/guacamole/src/main/webapp/app/manage/styles/manage-user-group.css
new file mode 100644
index 000000000..df9e80df9
--- /dev/null
+++ b/guacamole/src/main/webapp/app/manage/styles/manage-user-group.css
@@ -0,0 +1,71 @@
+/*
+ * 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.
+ */
+
+.manage-user-group .page-tabs .page-list li.read-only a[href],
+.manage-user-group .page-tabs .page-list li.unlinked a[href],
+.manage-user-group .page-tabs .page-list li.linked a[href] {
+ padding-right: 2.5em;
+ position: relative;
+}
+
+.manage-user-group .page-tabs .page-list li.read-only a[href]:before,
+.manage-user-group .page-tabs .page-list li.unlinked a[href]:before,
+.manage-user-group .page-tabs .page-list li.linked a[href]:before {
+ content: ' ';
+ position: absolute;
+ right: 0;
+ bottom: 0;
+ top: 0;
+ width: 2.5em;
+ background-size: 1.25em;
+ background-repeat: no-repeat;
+ background-position: center;
+}
+
+.manage-user-group .page-tabs .page-list li.read-only a[href]:before {
+ background-image: url('images/lock.png');
+}
+
+.manage-user-group .page-tabs .page-list li.unlinked a[href]:before {
+ background-image: url('images/plus.png');
+}
+
+.manage-user-group .page-tabs .page-list li.unlinked a[href] {
+ opacity: 0.5;
+}
+
+.manage-user-group .page-tabs .page-list li.unlinked a[href]:hover,
+.manage-user-group .page-tabs .page-list li.unlinked a[href].current {
+ opacity: 1;
+}
+
+.manage-user-group .page-tabs .page-list li.linked a[href]:before {
+ background-image: url('images/checkmark.png');
+}
+
+.manage-user-group .notice.read-only {
+
+ background: #FDA;
+ border: 1px solid rgba(0, 0, 0, 0.125);
+ border-radius: 0.25em;
+
+ text-align: center;
+ padding: 1em;
+
+}
\ No newline at end of file
diff --git a/guacamole/src/main/webapp/app/manage/styles/related-objects.css b/guacamole/src/main/webapp/app/manage/styles/related-objects.css
new file mode 100644
index 000000000..ddc85b1de
--- /dev/null
+++ b/guacamole/src/main/webapp/app/manage/styles/related-objects.css
@@ -0,0 +1,82 @@
+/*
+ * 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.
+ */
+
+.related-objects .abbreviated-related-objects {
+ display: table;
+ margin: 1em 0;
+}
+
+.related-objects .abbreviated-related-objects ul {
+ display: table-cell;
+ vertical-align: top;
+}
+
+.related-objects .abbreviated-related-objects ul,
+.related-objects .all-related-objects ul {
+ padding: 0;
+ list-style: none;
+}
+
+.related-objects .abbreviated-related-objects ul li {
+
+ display: inline-block;
+ margin: 0.25em;
+ padding: 0.25em;
+
+ border: 1px solid silver;
+ background: #F5F5F5;
+ -moz-border-radius: 0.25em;
+ -webkit-border-radius: 0.25em;
+ -khtml-border-radius: 0.25em;
+ border-radius: 0.25em;
+
+}
+
+.related-objects .abbreviated-related-objects ul li img.remove {
+ max-height: 0.75em;
+ max-width: 0.75em;
+ margin: 0 0.25em;
+}
+
+.related-objects .abbreviated-related-objects ul li .identifier {
+ margin: 0 0.25em;
+}
+
+.related-objects .abbreviated-related-objects img.expand,
+.related-objects .abbreviated-related-objects img.collapse {
+ display: table-cell;
+ max-height: 1.5em;
+ max-width: 1.5em;
+ margin: 0.375em 0;
+}
+
+.related-objects .all-related-objects {
+ border-top: 1px solid silver;
+}
+
+.related-objects .abbreviated-related-objects p.no-related-objects,
+.related-objects .all-related-objects p.no-objects-available {
+ font-style: italic;
+ opacity: 0.5;
+}
+
+.related-objects .abbreviated-related-objects p.no-related-objects {
+ display: table-cell;
+ vertical-align: middle;
+}
diff --git a/guacamole/src/main/webapp/app/manage/templates/identifierSetEditor.html b/guacamole/src/main/webapp/app/manage/templates/identifierSetEditor.html
new file mode 100644
index 000000000..72c235c66
--- /dev/null
+++ b/guacamole/src/main/webapp/app/manage/templates/identifierSetEditor.html
@@ -0,0 +1,47 @@
+
\ No newline at end of file
diff --git a/guacamole/src/main/webapp/app/manage/templates/manageUser.html b/guacamole/src/main/webapp/app/manage/templates/manageUser.html
index bb5cfb388..571f5c874 100644
--- a/guacamole/src/main/webapp/app/manage/templates/manageUser.html
+++ b/guacamole/src/main/webapp/app/manage/templates/manageUser.html
@@ -56,6 +56,17 @@
permissions-removed="permissionsRemoved">
+
+ {{'MANAGE_USER_GROUP.INFO_READ_ONLY' | translate}}
+{{'MANAGE_USER_GROUP.FIELD_HEADER_USER_GROUP_NAME' | translate}} | ++ + {{userGroup.identifier}} + | +
---|