Groups management UI

Former-commit-id: 39cd08bb28
pull/7/head
Jens Pelzetter 2020-10-20 20:21:28 +02:00
parent c97a0ebe33
commit 89eda23eb8
9 changed files with 76 additions and 33 deletions

View File

@ -29,6 +29,8 @@ import org.libreccm.security.RequiresPrivilege;
import org.libreccm.ui.admin.AdminMessages; import org.libreccm.ui.admin.AdminMessages;
import java.util.Arrays; import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional; import java.util.Optional;
import javax.enterprise.context.RequestScoped; import javax.enterprise.context.RequestScoped;
@ -146,4 +148,43 @@ public class GroupFormController {
} }
} }
@POST
@Path("{groupIdentifier}/groups")
@AuthorizationRequired
@RequiresPrivilege(CoreConstants.PRIVILEGE_ADMIN)
@Transactional(Transactional.TxType.REQUIRED)
public String updateGroupMemberships(
@PathParam("groupIdentifier") final String groupIdentifierParam,
@FormParam("groupMembers") final String[] groupMembers
) {
final Map<String, Object> params = new HashMap<>();
params.put("groupIdentifier", groupIdentifierParam);
return String.format(
"redirect:",
mvc.uri(
"GroupsController#getGroupDetails",
params
)
);
}
@POST
@Path("{groupIdentifier}/roles")
@AuthorizationRequired
@RequiresPrivilege(CoreConstants.PRIVILEGE_ADMIN)
@Transactional(Transactional.TxType.REQUIRED)
public String updateRoleMemberships(
@PathParam("groupIdentifier") final String groupIdentifierParam,
@FormParam("groupRoles") final String[] groupRoles
) {
// ToDo
return String.format(
"redirect:%s",
mvc.uri(
"UsersController#getUserDetails",
Map.of("userIdentifier", groupIdentifierParam)
)
);
}
} }

View File

@ -29,6 +29,7 @@ import org.libreccm.security.UserRepository;
import org.libreccm.ui.admin.AdminMessages; import org.libreccm.ui.admin.AdminMessages;
import java.util.Arrays; import java.util.Arrays;
import java.util.Map;
import java.util.Objects; import java.util.Objects;
import java.util.Optional; import java.util.Optional;
@ -221,11 +222,8 @@ public class UserFormController {
return String.format( return String.format(
"redirect:%s", "redirect:%s",
mvc.uri( mvc.uri(
String.format( "UsersController#getUserDetails",
"UsersController#getUserDetails", Map.of("userIdentifier", userIdentifierParam)
"{userIdentifier: %s}",
userIdentifierParam
)
) )
); );
} }
@ -243,11 +241,8 @@ public class UserFormController {
return String.format( return String.format(
"redirect:%s", "redirect:%s",
mvc.uri( mvc.uri(
String.format( "UsersController#getUserDetails",
"UsersController#getUserDetails", Map.of("userIdentifier", userIdentifierParam)
"{userIdentifier: %s}",
userIdentifierParam
)
) )
); );
} }

View File

@ -38,6 +38,7 @@ public class UsersGroupsRolesPage implements AdminPage {
final Set<Class<?>> classes = new HashSet<>(); final Set<Class<?>> classes = new HashSet<>();
classes.add(UsersGroupsRolesController.class); classes.add(UsersGroupsRolesController.class);
classes.add(GroupsController.class); classes.add(GroupsController.class);
classes.add(GroupFormController.class);
classes.add(RolesController.class); classes.add(RolesController.class);
classes.add(UsersController.class); classes.add(UsersController.class);
classes.add(UserFormController.class); classes.add(UserFormController.class);

View File

@ -6,9 +6,9 @@
xmlns:xlink="http://www.w3.org/1999/xlink"> xmlns:xlink="http://www.w3.org/1999/xlink">
<ui:composition template="/WEB-INF/views/org/libreccm/ui/admin/users-groups-roles.xhtml"> <ui:composition template="/WEB-INF/views/org/libreccm/ui/admin/users-groups-roles.xhtml">
<ui:param name="activePage" value="usersgroupsroles" /> <ui:param name="activePage" value="usersgroupsroles" />
<ui:param name="activePanel" value="users" /> <ui:param name="activePanel" value="groups" />
<ui:param name="title" <ui:param name="title"
value="#{AdminMessages.getMessage('usersgroupsroles.groups.group_details.title', [GroupDetailsModel.name])}" /> value="#{AdminMessages.getMessage('usersgroupsroles.groups.group_details.title', [GroupDetailsModel.groupName])}" />
<ui:define name="breadcrumb"> <ui:define name="breadcrumb">
<li class="breadcrumb-item"> <li class="breadcrumb-item">
@ -17,19 +17,19 @@
</a> </a>
</li> </li>
<li class="breadcrumb-item"> <li class="breadcrumb-item">
<a href="#{mvc.uri('UsersController#getGroups')}"> <a href="#{mvc.uri('GroupsController#getGroups')}">
#{AdminMessages['usersgroupsroles.groups.label']} #{AdminMessages['usersgroupsroles.groups.label']}
</a> </a>
</li> </li>
<li class="breadcrumb-item"> <li class="breadcrumb-item">
#{GroupDetailsModel.name} #{GroupDetailsModel.groupName}
</li> </li>
</ui:define> </ui:define>
<ui:define name="panel"> <ui:define name="panel">
<dl> <dl>
<div> <div>
<dt>#{AdminMessages['usersgroupsroles.groups.group_details.id']}</dt> <dt>#{AdminMessages['usersgroupsroles.groups.group_details.groupId']}</dt>
<dd>#{GroupDetailsModel.groupId}</dd> <dd>#{GroupDetailsModel.groupId}</dd>
</div> </div>
<div> <div>
@ -37,12 +37,12 @@
<dd>#{GroupDetailsModel.uuid}</dd> <dd>#{GroupDetailsModel.uuid}</dd>
</div> </div>
<div> <div>
<dt>#{AdminMessages['usersgroupsroles.groups.group_details.name']}</dt> <dt>#{AdminMessages['usersgroupsroles.groups.group_details.groupName']}</dt>
<dd>#{GroupDetailsModel.name}</dd> <dd>#{GroupDetailsModel.groupName}</dd>
</div> </div>
</dl> </dl>
<a class="btn btn-primary" <a class="btn btn-primary"
href="#{mvc.uri('GroupsController#editGroup', {'groupIdentifier': GroupDetailsModel.name })}"> href="#{mvc.uri('GroupsController#editGroup', {'groupIdentifier': GroupDetailsModel.groupName })}">
<svg class="bi" <svg class="bi"
width="1em" width="1em"
height="1em" height="1em"
@ -54,7 +54,7 @@
</span> </span>
</a> </a>
<div class="d-flex mb-1"> <div class="d-flex mt-3 mb-1">
<h2 class="mr-2"> <h2 class="mr-2">
#{AdminMessages['usersgroupsroles.groups.group_details.members.heading']} #{AdminMessages['usersgroupsroles.groups.group_details.members.heading']}
</h2> </h2>
@ -77,7 +77,7 @@
id="group-members-dialog" id="group-members-dialog"
tabindex="-1"> tabindex="-1">
<div class="modal-dialog"> <div class="modal-dialog">
<form action="#{mvc.uri('GroupFormController#updateGroupMemberships', {'groupIdentifier': GroupDetailsModel.name})}" <form action="#{mvc.uri('GroupFormController#updateGroupMemberships', {'groupIdentifier': GroupDetailsModel.groupName})}"
class="modal-content" class="modal-content"
method="post"> method="post">
<div class="modal-header"> <div class="modal-header">
@ -163,15 +163,15 @@
aria-hidden="true" aria-hidden="true"
class="modal fade" class="modal fade"
data-backdrop="static" data-backdrop="static"
id="user-roles-dialog" id="group-roles-dialog"
tabindex="-1"> tabindex="-1">
<div class="modal-dialog"> <div class="modal-dialog">
<form action="#{mvc.uri('UserFormController#updateRoleMemberships', {'userIdentifier': UserDetailsModel.name })}" <form action="#{mvc.uri('GroupFormController#updateRoleMemberships', {'groupIdentifier': GroupDetailsModel.groupName })}"
class="modal-content" class="modal-content"
method="post"> method="post">
<div class="modal-header"> <div class="modal-header">
<h3 class="modal-title" <h3 class="modal-title"
id="group-roles-dialog.title"> id="group-roles-dialog-title">
#{AdminMessages['usersgroupsroles.groups.group_details.roles.dialog.title']} #{AdminMessages['usersgroupsroles.groups.group_details.roles.dialog.title']}
</h3> </h3>
<button aria-label="#{AdminMessages['usersgroupsroles.groups.group_details.roles.dialog.close']}" <button aria-label="#{AdminMessages['usersgroupsroles.groups.group_details.roles.dialog.close']}"
@ -188,7 +188,7 @@
<input class="form-check-input" <input class="form-check-input"
checked="#{entry.member ? 'checked' : ''}" checked="#{entry.member ? 'checked' : ''}"
id="role-#{entry.roleName}" id="role-#{entry.roleName}"
name="userRoles[]" name="groupRoles[]"
value="#{entry.roleName}" value="#{entry.roleName}"
type="checkbox" /> type="checkbox" />
<label for="role#{entry.roleName}"> <label for="role#{entry.roleName}">

View File

@ -7,7 +7,7 @@
<ui:param name="activePage" value="usersgroupsroles" /> <ui:param name="activePage" value="usersgroupsroles" />
<ui:param name="activePanel" value="users" /> <ui:param name="activePanel" value="users" />
<ui:param name="title" <ui:param name="title"
value="#{GroupDetailsModel.newGroup ? AdminMessages['usersgroupsroles.groups.create.title'] : AdminMessages.getMessage('usersgroupsroles.groups.edit.title', [GroupDetailsModel.name]) }" /> value="#{GroupDetailsModel.newGroup ? AdminMessages['usersgroupsroles.groups.create.title'] : AdminMessages.getMessage('usersgroupsroles.groups.edit.title', [GroupDetailsModel.groupName]) }" />
<ui:define name="breadcrumb"> <ui:define name="breadcrumb">
<li class="breadcrumb-item"> <li class="breadcrumb-item">
@ -16,13 +16,13 @@
</a> </a>
</li> </li>
<li class="breadcrumb-item"> <li class="breadcrumb-item">
<a href="#{mvc.uri('GroupsController#getGroup')}"> <a href="#{mvc.uri('GroupsController#getGroups')}">
#{AdminMessages['usersgroupsroles.groups.label']} #{AdminMessages['usersgroupsroles.groups.label']}
</a> </a>
</li> </li>
<li class="breadcrumb-item"> <li class="breadcrumb-item">
<a href="#{mvn.uri('GroupsController#getGroupDetails', { 'groupIdentfier': group.name })}"> <a href="#{mvn.uri('GroupsController#getGroupDetails', { 'groupIdentfier': group.name })}">
#{UserDetailsModel.name} #{GroupDetailsModel.groupName}
</a> </a>
</li> </li>
<li> <li>
@ -48,7 +48,7 @@
class="form-control" class="form-control"
id="groupname" id="groupname"
name="groupName" name="groupName"
value="#{GroupDetailsModel.name}" value="#{GroupDetailsModel.groupName}"
type="text" /> type="text" />
<small class="form-text text-muted" <small class="form-text text-muted"
id="groupname-help"> id="groupname-help">
@ -56,12 +56,12 @@
</small> </small>
</div> </div>
<a class="btn btn-warning" <a class="btn btn-warning"
href="#{mvc.uri('UsersController#getGroups')}"> href="#{mvc.uri('GroupsController#getGroups')}">
#{AdminMessages['usersgroupsroles.groups.form.buttons.cancel']} #{AdminMessages['usersgroupsroles.groups.form.buttons.cancel']}
</a> </a>
<button class="btn btn-success" type="submit"> <button class="btn btn-success" type="submit">
<c:choose> <c:choose>
<c:when test="#{UserDetailsModel.newGroup}"> <c:when test="#{GroupDetailsModel.newGroup}">
#{AdminMessages['usersgroupsroles.groups.form.buttons.create']} #{AdminMessages['usersgroupsroles.groups.form.buttons.create']}
</c:when> </c:when>
<c:otherwise> <c:otherwise>

View File

@ -28,7 +28,7 @@
</div> </div>
<div class="col-sm-3 text-right"> <div class="col-sm-3 text-right">
<a class="btn btn-secondary" <a class="btn btn-secondary"
href="#{mvc.uri("GroupsController#newGroup")}"> href="#{mvc.uri('GroupsController#newGroup')}">
<svg class="bi" <svg class="bi"
width="1em" width="1em"
height="1em" height="1em"
@ -52,7 +52,7 @@
<td>#{group.name}</td> <td>#{group.name}</td>
<td class="text-center action-col"> <td class="text-center action-col">
<a class="btn btn-info" <a class="btn btn-info"
href="#"> href="#{mvc.uri('GroupsController#getGroupDetails', { 'groupIdentifier': group.name })}">
<svg class="bi" <svg class="bi"
width="1em" width="1em"
height="1em" height="1em"

View File

@ -131,7 +131,7 @@
</span> </span>
</a> </a>
<div class="d-flex"> <div class="d-flex mt-3">
<h2 class="mr-2"> <h2 class="mr-2">
#{AdminMessages['usersgroupsroles.users.user_details.additional_email_addresses.heading']} #{AdminMessages['usersgroupsroles.users.user_details.additional_email_addresses.heading']}
</h2> </h2>

View File

@ -166,3 +166,6 @@ usersgroupsroles.users.user_details.roles.dialog.save=Apply
usersgroupsroles.groups.group_details.roles.dialog.save=Apply usersgroupsroles.groups.group_details.roles.dialog.save=Apply
usersgroupsroles.groups.group_details.roles.none=No roles assigned to this group usersgroupsroles.groups.group_details.roles.none=No roles assigned to this group
usersgroupsroles.groups.not_found.title=Group not found usersgroupsroles.groups.not_found.title=Group not found
usersgroupsroles.groups.group_details.groupId=Group ID
usersgroupsroles.groups.group_details.groupName=Group Name
usersgroupsroles.users.user_details.additional_email_addresses.cols.address=Address

View File

@ -166,3 +166,6 @@ usersgroupsroles.users.user_details.roles.dialog.save=Anwenden
usersgroupsroles.groups.group_details.roles.dialog.save=Anwenden usersgroupsroles.groups.group_details.roles.dialog.save=Anwenden
usersgroupsroles.groups.group_details.roles.none=Dieser Gruppe sind keine Rollen zugeordnet usersgroupsroles.groups.group_details.roles.none=Dieser Gruppe sind keine Rollen zugeordnet
usersgroupsroles.groups.not_found.title=Gruppe nicht gefunden usersgroupsroles.groups.not_found.title=Gruppe nicht gefunden
usersgroupsroles.groups.group_details.groupId=ID der Gruppe
usersgroupsroles.groups.group_details.groupName=Name der Gruppe
usersgroupsroles.users.user_details.additional_email_addresses.cols.address=Adresse