diff --git a/ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/GroupDetailsModel.java b/ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/GroupDetailsModel.java
new file mode 100644
index 000000000..03d60a62a
--- /dev/null
+++ b/ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/GroupDetailsModel.java
@@ -0,0 +1,116 @@
+/*
+ * Copyright (C) 2020 LibreCCM Foundation.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+ * MA 02110-1301 USA
+ */
+package org.libreccm.ui.admin.usersgroupsroles;
+
+import org.libreccm.security.Group;
+import org.libreccm.security.GroupMembership;
+import org.libreccm.security.RoleMembership;
+import org.libreccm.ui.Message;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+import javax.enterprise.context.RequestScoped;
+import javax.inject.Named;
+import javax.transaction.Transactional;
+
+/**
+ * Model used by the group details form and the group edit form.
+ *
+ * @author Jens Pelzetter
+ */
+@RequestScoped
+@Named("GroupDetailsModel")
+public class GroupDetailsModel {
+
+ private long groupId;
+
+ private String uuid;
+
+ private String groupName;
+
+ private List members;
+
+ private List roles;
+
+ private final List messages;
+
+ public GroupDetailsModel() {
+ messages = new ArrayList<>();
+ }
+
+ public List getMessages() {
+ return Collections.unmodifiableList(messages);
+ }
+
+ public void addMessage(final Message message) {
+ messages.add(message);
+ }
+
+ public long getGroupId() {
+ return groupId;
+ }
+
+ public String getUuid() {
+ return uuid;
+ }
+
+ public String getGroupName() {
+ return groupName;
+ }
+
+ public List getMembers() {
+ return Collections.unmodifiableList(members);
+ }
+
+ public List getRoles() {
+ return Collections.unmodifiableList(roles);
+ }
+
+ @Transactional(Transactional.TxType.REQUIRED)
+ protected void setGroup(final Group group) {
+ Objects.requireNonNull(group);
+
+ groupId = group.getPartyId();
+ uuid = group.getUuid();
+ groupName = group.getName();
+ members = group
+ .getMemberships()
+ .stream()
+ .map(GroupMembership::getMember)
+ .map(GroupUserMembership::new)
+ .sorted()
+ .collect(Collectors.toList());
+ roles = group
+ .getRoleMemberships()
+ .stream()
+ .map(RoleMembership::getRole)
+ .map(PartyRoleMembership::new)
+ .sorted()
+ .collect(Collectors.toList());
+ }
+
+ public boolean isNewGroup() {
+ return groupId == 0;
+ }
+
+}
diff --git a/ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/GroupUserMembership.java b/ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/GroupUserMembership.java
new file mode 100644
index 000000000..277f30bef
--- /dev/null
+++ b/ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/GroupUserMembership.java
@@ -0,0 +1,113 @@
+/*
+ * Copyright (C) 2020 LibreCCM Foundation.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+ * MA 02110-1301 USA
+ */
+package org.libreccm.ui.admin.usersgroupsroles;
+
+import org.libreccm.security.User;
+
+/**
+ * Model friendly representation of a member of a group.
+ *
+ * @author Jens Pelzetter
+ */
+public class GroupUserMembership implements Comparable {
+
+ private long userId;
+
+ private String userUuid;
+
+ private String userName;
+
+ private String primaryEmailAddress;
+
+ private String givenName;
+
+ private String familyName;
+
+ public GroupUserMembership() {
+ // Nothing
+ }
+
+ public GroupUserMembership(final User user) {
+ userId = user.getPartyId();
+ userUuid = user.getUuid();
+ userName = user.getName();
+ primaryEmailAddress = user.getPrimaryEmailAddress().getAddress();
+ givenName = user.getGivenName();
+ familyName = user.getFamilyName();
+ }
+
+ public long getUserId() {
+ return userId;
+ }
+
+ public void setUserId(final long userId) {
+ this.userId = userId;
+ }
+
+ public String getUserUuid() {
+ return userUuid;
+ }
+
+ public void setUserUuid(final String userUuid) {
+ this.userUuid = userUuid;
+ }
+
+ public String getUserName() {
+ return userName;
+ }
+
+ public void setUserName(final String userName) {
+ this.userName = userName;
+ }
+
+ public String getPrimaryEmailAddress() {
+ return primaryEmailAddress;
+ }
+
+ public void setPrimaryEmailAddress(final String primaryEmailAddress) {
+ this.primaryEmailAddress = primaryEmailAddress;
+ }
+
+ public String getGivenName() {
+ return givenName;
+ }
+
+ public void setGivenName(final String givenName) {
+ this.givenName = givenName;
+ }
+
+ public String getFamilyName() {
+ return familyName;
+ }
+
+ public void setFamilyName(final String familyName) {
+ this.familyName = familyName;
+ }
+
+ @Override
+ public int compareTo(final GroupUserMembership other) {
+ int result = userName.compareTo(other.getUserName());
+ if (result == 0) {
+ return primaryEmailAddress.compareTo(other.getPrimaryEmailAddress());
+ } else {
+ return result;
+ }
+ }
+
+}
diff --git a/ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/UserDetailsModel.java b/ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/UserDetailsModel.java
index 206ff5f18..a3a3f2c5c 100644
--- a/ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/UserDetailsModel.java
+++ b/ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/UserDetailsModel.java
@@ -102,6 +102,7 @@ public class UserDetailsModel {
groupMemberships = user
.getGroupMemberships()
.stream()
+ .sorted()
.map(GroupMembership::getGroup)
.map(UserGroupMembership::new)
.collect(Collectors.toList());
@@ -110,6 +111,7 @@ public class UserDetailsModel {
.stream()
.map(RoleMembership::getRole)
.map(PartyRoleMembership::new)
+ .sorted()
.collect(Collectors.toList());
}
diff --git a/ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/UserGroupMembership.java b/ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/UserGroupMembership.java
index 3ab997e7d..a96d41d36 100644
--- a/ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/UserGroupMembership.java
+++ b/ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/UserGroupMembership.java
@@ -38,9 +38,9 @@ public class UserGroupMembership implements Comparable {
}
public UserGroupMembership(final Group group) {
- this.groupId = group.getPartyId();
- this.groupUuid = group.getUuid();
- this.groupName = group.getName();
+ groupId = group.getPartyId();
+ groupUuid = group.getUuid();
+ groupName = group.getName();
}
public long getGroupId() {
diff --git a/ccm-core/src/main/resources/WEB-INF/views/org/libreccm/ui/admin/users-groups-roles/group-details.xhtml b/ccm-core/src/main/resources/WEB-INF/views/org/libreccm/ui/admin/users-groups-roles/group-details.xhtml
new file mode 100644
index 000000000..b9e9605f7
--- /dev/null
+++ b/ccm-core/src/main/resources/WEB-INF/views/org/libreccm/ui/admin/users-groups-roles/group-details.xhtml
@@ -0,0 +1,127 @@
+]>
+
+
+
+
+
+
+
+
diff --git a/ccm-core/src/main/resources/org/libreccm/ui/AdminBundle.properties b/ccm-core/src/main/resources/org/libreccm/ui/AdminBundle.properties
index 86a7ec310..01f32ea41 100644
--- a/ccm-core/src/main/resources/org/libreccm/ui/AdminBundle.properties
+++ b/ccm-core/src/main/resources/org/libreccm/ui/AdminBundle.properties
@@ -40,36 +40,36 @@ usersgroupsroles.users.filter.label=Filter users
usersgroupsroles.users.filter.submit=Submit
usersgroupsroles.users.not_found.title=User not found
usersgroupsroles.users.user_details.title=User {0} Details
-usergroupsroles.users.user_details.id=User ID
-usergroupsroles.users.user_details.uuid=UUID
-usergroupsroles.users.user_details.name=Name
-usergroupsroles.users.user_details.given_name=Given name
-usergroupsroles.users.user_details.familyname=Familyname
-usergroupsroles.users.user_details.primary_email_address=Primary email address
-usergroupsroles.users.user_details.disabled=Disabled?
-usergroupsroles.users.user_details.disabled.yes=Yes
-usergroupsroles.users.user_details.disabled.no=No
-usergroupsroles.users.user_details.password_reset_required=Password reset required?
-usergroupsroles.users.user_details.password_reset_required.yes=Yes
-usergroupsroles.users.user_details.password_reset_required.no=No
-usergroupsroles.users.user_details.additional_email_addresses.heading=Additional email addresses
-'usergroupsroles.users.user_details.additional_email_addresses.cols.address=Address
-usergroupsroles.users.user_details.additional_email_addresses.cols.boucing=Bouncing?
-usergroupsroles.users.user_details.additional_email_addresses.cols.verified=Verified
-usergroupsroles.users.user_details.additional_email_addresses.cols.actions=Actions
-usergroupsroles.users.user_details.email_address.bouncing.yes=Yes
-usergroupsroles.users.user_details.email_address.bouncing.no=No
-usergroupsroles.users.user_details.email_address.verified.yes=Yes
-usergroupsroles.users.user_details.email_address.verified.no=No
-usergroupsroles.users.user_details.email_addresses.remove=Remove
-usergroupsroles.users.user_details.email_addresses.edit=Edit
-usergroupsroles.users.user_details.groups.heading=Groups Memberships
-usergroupsroles.users.user_details.groups.add=Add
-usergroupsroles.users.user_details.groups.remove=Remove
-usergroupsroles.users.user_details.roles.heading=Roles
-usergroupsroles.users.user_details.roles.add=Add
-usergroupsroles.users.user_details.roles.remove=Remove
-usergroupsroles.users.user_details.edit_user=Edit
+usersgroupsroles.users.user_details.id=User ID
+usersgroupsroles.users.user_details.uuid=UUID
+usersgroupsroles.users.user_details.name=Name
+usersgroupsroles.users.user_details.given_name=Given name
+usersgroupsroles.users.user_details.familyname=Familyname
+usersgroupsroles.users.user_details.primary_email_address=Primary email address
+usersgroupsroles.users.user_details.disabled=Disabled?
+usersgroupsroles.users.user_details.disabled.yes=Yes
+usersgroupsroles.users.user_details.disabled.no=No
+usersgroupsroles.users.user_details.password_reset_required=Password reset required?
+usersgroupsroles.users.user_details.password_reset_required.yes=Yes
+usersgroupsroles.users.user_details.password_reset_required.no=No
+usersgroupsroles.users.user_details.additional_email_addresses.heading=Additional email addresses
+'usersgroupsroles.users.user_details.additional_email_addresses.cols.address=Address
+usersgroupsroles.users.user_details.additional_email_addresses.cols.boucing=Bouncing?
+usersgroupsroles.users.user_details.additional_email_addresses.cols.verified=Verified
+usersgroupsroles.users.user_details.additional_email_addresses.cols.actions=Actions
+usersgroupsroles.users.user_details.email_address.bouncing.yes=Yes
+usersgroupsroles.users.user_details.email_address.bouncing.no=No
+usersgroupsroles.users.user_details.email_address.verified.yes=Yes
+usersgroupsroles.users.user_details.email_address.verified.no=No
+usersgroupsroles.users.user_details.email_addresses.remove=Remove
+usersgroupsroles.users.user_details.email_addresses.edit=Edit
+usersgroupsroles.users.user_details.groups.heading=Groups Memberships
+usersgroupsroles.users.user_details.groups.add=Add
+usersgroupsroles.users.user_details.groups.remove=Remove
+usersgroupsroles.users.user_details.roles.heading=Roles
+usersgroupsroles.users.user_details.roles.add=Add
+usersgroupsroles.users.user_details.roles.remove=Remove
+usersgroupsroles.users.user_details.edit_user=Edit
usersgroupsroles.users.new.errors.password.empty=Password of a new user can't be empty
usersgroupsroles.users.new.errors.password.no_match=Password and confirmation do not match
usersgroupsroles.users.edit.title=Edit user {0}
@@ -111,24 +111,24 @@ usersgroupsroles.users.disable.confirm.title=Confirm to disable user
usersgroupsroles.users.disable.confirm.cancel=Cancel
usersgroupsroles.users.disable.confirm.message=Are you sure to disable user {0}
usersgroupsroles.users.disable.confirm.yes=Disable User
-usergroupsroles.users.user_details.email_addresses.remove.confirm.title=Confirm Removal Of Email Address
-usergroupsroles.users.user_details.email_addresses.remove.confirm.cancel=Cancel
-usergroupsroles.users.user_details.email_addresses.remove.confirm.message=Are you sure to remove email address {0}?
-usergroupsroles.users.user_details.email_addresses.remove.confirm.yes=Remove Email Address
-usergroupsroles.users.user_details.groups.none=This user is not a member of any group
-usergroupsroles.users.user_details.groups.edit=Edit
-usergroupsroles.users.user_details.roles.edit=Edit
-usergroupsroles.users.user_details.roles.none=No roles assigned to this user
-usergroupsroles.users.user_details.email_addresses.none=This user has no additional email addresses
-usergroupsroles.users.user_details.additional_email_addresses.add=Add email address
-usergroupsroles.users.user_details.groups.dialog.title=Edit group memberships
-usergroupsroles.users.user_details.groups.dialog.close=Cancel
-usergroupsroles.users.user_details.groups.dialog.save=Save
+usersgroupsroles.users.user_details.email_addresses.remove.confirm.title=Confirm Removal Of Email Address
+usersgroupsroles.users.user_details.email_addresses.remove.confirm.cancel=Cancel
+usersgroupsroles.users.user_details.email_addresses.remove.confirm.message=Are you sure to remove email address {0}?
+usersgroupsroles.users.user_details.email_addresses.remove.confirm.yes=Remove Email Address
+usersgroupsroles.users.user_details.groups.none=This user is not a member of any group
+usersgroupsroles.users.user_details.groups.edit=Edit
+usersgroupsroles.users.user_details.roles.edit=Edit
+usersgroupsroles.users.user_details.roles.none=No roles assigned to this user
+usersgroupsroles.users.user_details.email_addresses.none=This user has no additional email addresses
+usersgroupsroles.users.user_details.additional_email_addresses.add=Add email address
+usersgroupsroles.users.user_details.groups.dialog.title=Edit group memberships
+usersgroupsroles.users.user_details.groups.dialog.close=Cancel
+usersgroupsroles.users.user_details.groups.dialog.save=Save
usersgroupsroles.users.user_details.roles.dialog.title=Edit role memberships
usersgroupsroles.users.user_details.roles.dialog.close=Cancel
usersgroupsroles.users.user_details.groups.dialog.save=Save
-usergroupsroles.users.user_details.family_name=Family Name
-usergroupsroles.users.user_details.email_addresses.errors.address_empty=Address can't be empty
+usersgroupsroles.users.user_details.family_name=Family Name
+usersgroupsroles.users.user_details.email_addresses.errors.address_empty=Address can't be empty
usersgroupsroles.groups.table.headers.groupname=Group
usersgroupsroles.groups.table.headers.actions=Actions
usersgroupsroles.groups.detailslink.label=Details
@@ -138,3 +138,22 @@ usersgroupsroles.groups.delete.confirm.cancel=Cancel
usersgroupsroles.groups.delete.confirm.yes=Delete Group
usersgroupsroles.groups.delete.confirm.message=Are you sure to delete group {0}?
usersgroupsroles.groups.add=Add group
+usersgroupsroles.groups.create.title=Create new group
+usersgroupsroles.groups.edit.title=Edit group {0}
+usersgroupsroles.groups.breadcrumb.new=New Group
+usersgroupsroles.groups.breadcrumb.edit=Edit Group
+usersgroupsroles.groups.form.groupname.label=Group Name
+usersgroupsroles.groups.form.username.help=Unique name of the group
+usersgroupsroles.groups.form.buttons.cancel=Cancel
+usersgroupsroles.groups.form.buttons.create=Create new group
+usersgroupsroles.groups.form.buttons.save=Save
+usersgroupsroles.groups.group_details.title=Details of Group {0}
+usersgroupsroles.groups.group_details.id=Group ID
+usersgroupsroles.groups.group_details.uuid=Group UUID
+usersgroupsroles.groups.group_details.name=Group Name
+usersgroupsroles.groups.group_details.edit_group=Edit group
+usersgroupsroles.groups.group_details.members.heading=Members
+usersgroupsroles.groups.group_details.members.edit=Add/remove members
+usersgroupsroles.groups.group_details.members.dialog.title=Add/remove members
+usersgroupsroles.groups.group_details.members.dialog.close=Cancel
+usersgroupsroles.groups.group_details.members.dialog.save=Apply
diff --git a/ccm-core/src/main/resources/org/libreccm/ui/AdminBundle_de.properties b/ccm-core/src/main/resources/org/libreccm/ui/AdminBundle_de.properties
index 427c3f30c..f424bf9a3 100644
--- a/ccm-core/src/main/resources/org/libreccm/ui/AdminBundle_de.properties
+++ b/ccm-core/src/main/resources/org/libreccm/ui/AdminBundle_de.properties
@@ -40,36 +40,36 @@ usersgroupsroles.users.filter.label=Benutzer*innen filtern
usersgroupsroles.users.filter.submit=Anwenden
usersgroupsroles.users.not_found.title=Benutzer*in nicht gefunden
usersgroupsroles.users.user_details.title=Details Benutzer*in {0}
-usergroupsroles.users.user_details.id=Benutzer*in ID
-usergroupsroles.users.user_details.uuid=UUID
-usergroupsroles.users.user_details.name=Name
-usergroupsroles.users.user_details.given_name=Vorname
-usergroupsroles.users.user_details.familyname=Familienname
-usergroupsroles.users.user_details.primary_email_address=Prim\u00e4re E-Mail-Adresse
-usergroupsroles.users.user_details.disabled=Inaktiv?
-usergroupsroles.users.user_details.disabled.yes=Ja
-usergroupsroles.users.user_details.disabled.no=Nein
-usergroupsroles.users.user_details.password_reset_required=Neues Password erforderlich?
-usergroupsroles.users.user_details.password_reset_required.yes=Ja
-usergroupsroles.users.user_details.password_reset_required.no=Nein
-usergroupsroles.users.user_details.additional_email_addresses.heading=Weitere E-Mail-Adressen
-'usergroupsroles.users.user_details.additional_email_addresses.cols.address=Adresse
-usergroupsroles.users.user_details.additional_email_addresses.cols.boucing=Wird zur\u00fcckgewiesen?
-usergroupsroles.users.user_details.additional_email_addresses.cols.verified=Verifizizert
-usergroupsroles.users.user_details.additional_email_addresses.cols.actions=Aktionen
-usergroupsroles.users.user_details.email_address.bouncing.yes=Ja
-usergroupsroles.users.user_details.email_address.bouncing.no=Nein
-usergroupsroles.users.user_details.email_address.verified.yes=Ja
-usergroupsroles.users.user_details.email_address.verified.no=Nein
-usergroupsroles.users.user_details.email_addresses.remove=Entfernen
-usergroupsroles.users.user_details.email_addresses.edit=Bearbeiten
-usergroupsroles.users.user_details.groups.heading=Gruppenmitgliedschaften
-usergroupsroles.users.user_details.groups.add=Hinzuf\u00fcgen
-usergroupsroles.users.user_details.groups.remove=Entfernen
-usergroupsroles.users.user_details.roles.heading=Rollen
-usergroupsroles.users.user_details.roles.add=Hinzuf\u00fcgen
-usergroupsroles.users.user_details.roles.remove=Entfernen
-usergroupsroles.users.user_details.edit_user=Bearbeiten
+usersgroupsroles.users.user_details.id=Benutzer*in ID
+usersgroupsroles.users.user_details.uuid=UUID
+usersgroupsroles.users.user_details.name=Name
+usersgroupsroles.users.user_details.given_name=Vorname
+usersgroupsroles.users.user_details.familyname=Familienname
+usersgroupsroles.users.user_details.primary_email_address=Prim\u00e4re E-Mail-Adresse
+usersgroupsroles.users.user_details.disabled=Inaktiv?
+usersgroupsroles.users.user_details.disabled.yes=Ja
+usersgroupsroles.users.user_details.disabled.no=Nein
+usersgroupsroles.users.user_details.password_reset_required=Neues Password erforderlich?
+usersgroupsroles.users.user_details.password_reset_required.yes=Ja
+usersgroupsroles.users.user_details.password_reset_required.no=Nein
+usersgroupsroles.users.user_details.additional_email_addresses.heading=Weitere E-Mail-Adressen
+'usersgroupsroles.users.user_details.additional_email_addresses.cols.address=Adresse
+usersgroupsroles.users.user_details.additional_email_addresses.cols.boucing=Wird zur\u00fcckgewiesen?
+usersgroupsroles.users.user_details.additional_email_addresses.cols.verified=Verifizizert
+usersgroupsroles.users.user_details.additional_email_addresses.cols.actions=Aktionen
+usersgroupsroles.users.user_details.email_address.bouncing.yes=Ja
+usersgroupsroles.users.user_details.email_address.bouncing.no=Nein
+usersgroupsroles.users.user_details.email_address.verified.yes=Ja
+usersgroupsroles.users.user_details.email_address.verified.no=Nein
+usersgroupsroles.users.user_details.email_addresses.remove=Entfernen
+usersgroupsroles.users.user_details.email_addresses.edit=Bearbeiten
+usersgroupsroles.users.user_details.groups.heading=Gruppenmitgliedschaften
+usersgroupsroles.users.user_details.groups.add=Hinzuf\u00fcgen
+usersgroupsroles.users.user_details.groups.remove=Entfernen
+usersgroupsroles.users.user_details.roles.heading=Rollen
+usersgroupsroles.users.user_details.roles.add=Hinzuf\u00fcgen
+usersgroupsroles.users.user_details.roles.remove=Entfernen
+usersgroupsroles.users.user_details.edit_user=Bearbeiten
usersgroupsroles.users.new.errors.password.empty=Das Passwort eines neuen Benutzers darf nicht leer sein.
usersgroupsroles.users.new.errors.password.no_match=Password und Best\u00e4tigung stimmen nicht \u00fcberein.
usersgroupsroles.users.edit.title=Benutzer*in {0} bearbeiten
@@ -111,24 +111,24 @@ usersgroupsroles.users.disable.confirm.title=Deaktivierung Benutzer*in best\u00e
usersgroupsroles.users.disable.confirm.cancel=Abbrechen
usersgroupsroles.users.disable.confirm.message=Sind Sie sicher das Sie den/die Benutzer*in {0} deaktivieren wollen?
usersgroupsroles.users.disable.confirm.yes=Benutzer*in deaktivieren
-usergroupsroles.users.user_details.email_addresses.remove.confirm.title=Entfernen E-Mail-Adresse best\u00e4tigen
-usergroupsroles.users.user_details.email_addresses.remove.confirm.cancel=Abbrechen
-usergroupsroles.users.user_details.email_addresses.remove.confirm.message=Sind Sie sicher, dass Sie die E-Mail-Adresse {0} entfernen wollen?
-usergroupsroles.users.user_details.email_addresses.remove.confirm.yes=E-Mail-Adresse entfernen
-usergroupsroles.users.user_details.groups.none=Diese(r) Benutzer*in ist nicht Mitglied einer Gruppe
-usergroupsroles.users.user_details.groups.edit=Bearbeiten
-usergroupsroles.users.user_details.roles.edit=Bearbeiten
-usergroupsroles.users.user_details.roles.none=Dieser(m) Benutzer*in sind keine Rollen zugeordnet
-usergroupsroles.users.user_details.email_addresses.none=Diese(r) Benutzer*in hat keine weiteren E-Mail-Adressen
-usergroupsroles.users.user_details.additional_email_addresses.add=E-Mail-Adresse hinzuf\u00fcgen
-usergroupsroles.users.user_details.groups.dialog.title=Gruppenmitgliedschaften bearbeiten
-usergroupsroles.users.user_details.groups.dialog.close=Abbrechen
-usergroupsroles.users.user_details.groups.dialog.save=Anwenden
+usersgroupsroles.users.user_details.email_addresses.remove.confirm.title=Entfernen E-Mail-Adresse best\u00e4tigen
+usersgroupsroles.users.user_details.email_addresses.remove.confirm.cancel=Abbrechen
+usersgroupsroles.users.user_details.email_addresses.remove.confirm.message=Sind Sie sicher, dass Sie die E-Mail-Adresse {0} entfernen wollen?
+usersgroupsroles.users.user_details.email_addresses.remove.confirm.yes=E-Mail-Adresse entfernen
+usersgroupsroles.users.user_details.groups.none=Diese(r) Benutzer*in ist nicht Mitglied einer Gruppe
+usersgroupsroles.users.user_details.groups.edit=Bearbeiten
+usersgroupsroles.users.user_details.roles.edit=Bearbeiten
+usersgroupsroles.users.user_details.roles.none=Dieser(m) Benutzer*in sind keine Rollen zugeordnet
+usersgroupsroles.users.user_details.email_addresses.none=Diese(r) Benutzer*in hat keine weiteren E-Mail-Adressen
+usersgroupsroles.users.user_details.additional_email_addresses.add=E-Mail-Adresse hinzuf\u00fcgen
+usersgroupsroles.users.user_details.groups.dialog.title=Gruppenmitgliedschaften bearbeiten
+usersgroupsroles.users.user_details.groups.dialog.close=Abbrechen
+usersgroupsroles.users.user_details.groups.dialog.save=Anwenden
usersgroupsroles.users.user_details.roles.dialog.title=Rollenmitgliedschaften bearbeiten
usersgroupsroles.users.user_details.roles.dialog.close=Abbrechen
usersgroupsroles.users.user_details.groups.dialog.save=Anwenden
-usergroupsroles.users.user_details.family_name=Familienname
-usergroupsroles.users.user_details.email_addresses.errors.address_empty=Die Addresse kann nicht leer sein
+usersgroupsroles.users.user_details.family_name=Familienname
+usersgroupsroles.users.user_details.email_addresses.errors.address_empty=Die Addresse kann nicht leer sein
usersgroupsroles.groups.table.headers.groupname=Gruppe
usersgroupsroles.groups.table.headers.actions=Aktionen
usersgroupsroles.groups.detailslink.label=Details
@@ -138,3 +138,22 @@ usersgroupsroles.groups.delete.confirm.cancel=Abbrechen
usersgroupsroles.groups.delete.confirm.yes=Gruppe l\u00f6schen
usersgroupsroles.groups.delete.confirm.message=Sind Sie sicher, dass Sie die Gruppe {0} l\u00f6schen wollen?
usersgroupsroles.groups.add=Gruppe hinzuf\u00fcgen
+usersgroupsroles.groups.create.title=Neue Gruppe anlegen
+usersgroupsroles.groups.edit.title=Gruppe {0} bearbeiten
+usersgroupsroles.groups.breadcrumb.new=Neue Gruppe anlegen
+usersgroupsroles.groups.breadcrumb.edit=Gruppe bearbeiten
+usersgroupsroles.groups.form.groupname.label=Name der Gruppe
+usersgroupsroles.groups.form.username.help=Eindeutiger Name der Gruppe
+usersgroupsroles.groups.form.buttons.cancel=Abbrechen
+usersgroupsroles.groups.form.buttons.create=Neue Gruppe anlegen
+usersgroupsroles.groups.form.buttons.save=Speichern
+usersgroupsroles.groups.group_details.title=Details Gruppe {0}
+usersgroupsroles.groups.group_details.id=ID der Gruppe
+usersgroupsroles.groups.group_details.uuid=UUID der Gruppe
+usersgroupsroles.groups.group_details.name=Name der Gruppe
+usersgroupsroles.groups.group_details.edit_group=Gruppe bearbeiten
+usersgroupsroles.groups.group_details.members.heading=Mitglieder
+usersgroupsroles.groups.group_details.members.edit=Mitglieder hinzuf\u00fcgen/entfernen
+usersgroupsroles.groups.group_details.members.dialog.title=Mitglieder hinzuf\u00fcgen/entfernen
+usersgroupsroles.groups.group_details.members.dialog.close=Abbrechen
+usersgroupsroles.groups.group_details.members.dialog.save=Anwenden