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 @@ +]> + + + + + + + + + + + + + +
+
+
#{AdminMessages['usersgroupsroles.groups.group_details.id']}
+
#{GroupDetailsModel.groupId}
+
+
+
#{AdminMessages['usersgroupsroles.groups.group_details.uuid']}
+
#{GroupDetailsModel.uuid}
+
+
+
#{AdminMessages['usersgroupsroles.groups.group_details.name']}
+
#{GroupDetailsModel.name}
+
+
+ + + + + + #{AdminMessages['usersgroupsroles.groups.group_details.edit_group']} + + + +
+

+ #{AdminMessages['usersgroupsroles.groups.group_details.members.heading']} +

+ + + + + diff --git a/ccm-core/src/main/resources/WEB-INF/views/org/libreccm/ui/admin/users-groups-roles/group-form.xhtml b/ccm-core/src/main/resources/WEB-INF/views/org/libreccm/ui/admin/users-groups-roles/group-form.xhtml new file mode 100644 index 000000000..0e08a2cc2 --- /dev/null +++ b/ccm-core/src/main/resources/WEB-INF/views/org/libreccm/ui/admin/users-groups-roles/group-form.xhtml @@ -0,0 +1,76 @@ + + + + + + + + + + + +
  • + + #{GroupDetailsModel.newGroup ? AdminMessages['usersgroupsroles.groups.breadcrumb.new'] : AdminMessages['usersgroupsroles.groups.breadcrumb.edit']} +
  • +
    + + + + + + +
    +
    + + + + #{AdminMessages['usersgroupsroles.groups.form.username.help']} + +
    + + #{AdminMessages['usersgroupsroles.groups.form.buttons.cancel']} + + +
    +
    + +
    + diff --git a/ccm-core/src/main/resources/WEB-INF/views/org/libreccm/ui/admin/users-groups-roles/user-details.xhtml b/ccm-core/src/main/resources/WEB-INF/views/org/libreccm/ui/admin/users-groups-roles/user-details.xhtml index 8efee7a7f..68bcf5610 100644 --- a/ccm-core/src/main/resources/WEB-INF/views/org/libreccm/ui/admin/users-groups-roles/user-details.xhtml +++ b/ccm-core/src/main/resources/WEB-INF/views/org/libreccm/ui/admin/users-groups-roles/user-details.xhtml @@ -29,58 +29,58 @@
    -
    #{AdminMessages['usergroupsroles.users.user_details.id']}
    +
    #{AdminMessages['usersgroupsroles.users.user_details.id']}
    #{UserDetailsModel.userId}
    -
    #{AdminMessages['usergroupsroles.users.user_details.uuid']}
    +
    #{AdminMessages['usersgroupsroles.users.user_details.uuid']}
    #{UserDetailsModel.uuid}
    -
    #{AdminMessages['usergroupsroles.users.user_details.name']}
    +
    #{AdminMessages['usersgroupsroles.users.user_details.name']}
    #{UserDetailsModel.name}
    -
    #{AdminMessages['usergroupsroles.users.user_details.given_name']}
    +
    #{AdminMessages['usersgroupsroles.users.user_details.given_name']}
    #{UserDetailsModel.givenName}
    -
    #{AdminMessages['usergroupsroles.users.user_details.family_name']}
    +
    #{AdminMessages['usersgroupsroles.users.user_details.family_name']}
    #{UserDetailsModel.familyName}
    - #{AdminMessages['usergroupsroles.users.user_details.primary_email_address']} + #{AdminMessages['usersgroupsroles.users.user_details.primary_email_address']}
    -
    #{AdminMessages['usergroupsroles.users.user_details.additional_email_addresses.cols.address']}
    +
    #{AdminMessages['usersgroupsroles.users.user_details.additional_email_addresses.cols.address']}
    #{UserDetailsModel.primaryEmailAddress.address}
    - #{AdminMessages['usergroupsroles.users.user_details.additional_email_addresses.cols.boucing']} + #{AdminMessages['usersgroupsroles.users.user_details.additional_email_addresses.cols.boucing']}
    - #{AdminMessages['usergroupsroles.users.user_details.email_address.bouncing.yes']} + #{AdminMessages['usersgroupsroles.users.user_details.email_address.bouncing.yes']} - #{AdminMessages['usergroupsroles.users.user_details.email_address.bouncing.no']} + #{AdminMessages['usersgroupsroles.users.user_details.email_address.bouncing.no']}
    - #{AdminMessages['usergroupsroles.users.user_details.additional_email_addresses.cols.verified']} + #{AdminMessages['usersgroupsroles.users.user_details.additional_email_addresses.cols.verified']}
    - #{AdminMessages['usergroupsroles.users.user_details.email_address.verified.yes']} + #{AdminMessages['usersgroupsroles.users.user_details.email_address.verified.yes']} - #{AdminMessages['usergroupsroles.users.user_details.email_address.verified.no']} + #{AdminMessages['usersgroupsroles.users.user_details.email_address.verified.no']}
    @@ -89,30 +89,30 @@
    - #{AdminMessages['usergroupsroles.users.user_details.disabled']} + #{AdminMessages['usersgroupsroles.users.user_details.disabled']}
    - #{AdminMessages['usergroupsroles.users.user_details.disabled.yes']} + #{AdminMessages['usersgroupsroles.users.user_details.disabled.yes']} - #{AdminMessages['usergroupsroles.users.user_details.disabled.no']} + #{AdminMessages['usersgroupsroles.users.user_details.disabled.no']}
    - #{AdminMessages['usergroupsroles.users.user_details.password_reset_required']} + #{AdminMessages['usersgroupsroles.users.user_details.password_reset_required']}
    - #{AdminMessages['usergroupsroles.users.user_details.password_reset_required.yes']} + #{AdminMessages['usersgroupsroles.users.user_details.password_reset_required.yes']} - #{AdminMessages['usergroupsroles.users.user_details.password_reset_required.no']} + #{AdminMessages['usersgroupsroles.users.user_details.password_reset_required.no']}
    @@ -127,13 +127,13 @@ - #{AdminMessages['usergroupsroles.users.user_details.edit_user']} + #{AdminMessages['usersgroupsroles.users.user_details.edit_user']}

    - #{AdminMessages['usergroupsroles.users.user_details.additional_email_addresses.heading']} + #{AdminMessages['usersgroupsroles.users.user_details.additional_email_addresses.heading']}

    @@ -154,16 +154,16 @@ - #{AdminMessages['usergroupsroles.users.user_details.additional_email_addresses.cols.address']} + #{AdminMessages['usersgroupsroles.users.user_details.additional_email_addresses.cols.address']} - #{AdminMessages['usergroupsroles.users.user_details.additional_email_addresses.cols.boucing']} + #{AdminMessages['usersgroupsroles.users.user_details.additional_email_addresses.cols.boucing']} - #{AdminMessages['usergroupsroles.users.user_details.additional_email_addresses.cols.verified']} + #{AdminMessages['usersgroupsroles.users.user_details.additional_email_addresses.cols.verified']} - #{AdminMessages['usergroupsroles.users.user_details.additional_email_addresses.cols.actions']} + #{AdminMessages['usersgroupsroles.users.user_details.additional_email_addresses.cols.actions']} - #{AdminMessages['usergroupsroles.users.user_details.email_address.bouncing.yes']} + #{AdminMessages['usersgroupsroles.users.user_details.email_address.bouncing.yes']} - #{AdminMessages['usergroupsroles.users.user_details.email_address.bouncing.no']} + #{AdminMessages['usersgroupsroles.users.user_details.email_address.bouncing.no']} - #{AdminMessages['usergroupsroles.users.user_details.email_address.verified.yes']} + #{AdminMessages['usersgroupsroles.users.user_details.email_address.verified.yes']} - #{AdminMessages['usergroupsroles.users.user_details.email_address.verified.no']} + #{AdminMessages['usersgroupsroles.users.user_details.email_address.verified.no']} @@ -203,7 +203,7 @@ - #{AdminMessages['usergroupsroles.users.user_details.email_addresses.edit']} + #{AdminMessages['usersgroupsroles.users.user_details.email_addresses.edit']} @@ -218,7 +218,7 @@ - #{AdminMessages['usergroupsroles.users.user_details.email_addresses.remove']} + #{AdminMessages['usersgroupsroles.users.user_details.email_addresses.remove']}