CCM NG: Group Administration

git-svn-id: https://svn.libreccm.org/ccm/ccm_ng@3998 8810af33-2d31-482b-a856-94f89814c4df
pull/2/head
jensp 2016-04-15 09:58:26 +00:00
parent 8bc1368b85
commit 668eb0193d
13 changed files with 835 additions and 78 deletions

View File

@ -0,0 +1,283 @@
/*
* Copyright (C) 2016 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 com.arsdigita.ui.admin.usersgroupsroles.groups;
import com.arsdigita.bebop.ActionLink;
import com.arsdigita.bebop.Component;
import com.arsdigita.bebop.ControlLink;
import com.arsdigita.bebop.Form;
import com.arsdigita.bebop.FormData;
import com.arsdigita.bebop.Label;
import com.arsdigita.bebop.PageState;
import com.arsdigita.bebop.ParameterSingleSelectionModel;
import com.arsdigita.bebop.Table;
import com.arsdigita.bebop.event.TableActionEvent;
import com.arsdigita.bebop.event.TableActionListener;
import com.arsdigita.bebop.form.Submit;
import com.arsdigita.bebop.form.TextField;
import com.arsdigita.bebop.table.TableCellRenderer;
import com.arsdigita.bebop.table.TableColumn;
import com.arsdigita.bebop.table.TableColumnModel;
import com.arsdigita.bebop.table.TableModel;
import com.arsdigita.bebop.table.TableModelBuilder;
import com.arsdigita.globalization.GlobalizedMessage;
import com.arsdigita.util.LockableImpl;
import org.libreccm.cdi.utils.CdiUtil;
import org.libreccm.security.Group;
import org.libreccm.security.GroupManager;
import org.libreccm.security.GroupRepository;
import org.libreccm.security.User;
import org.libreccm.security.UserRepository;
import java.util.ArrayList;
import java.util.List;
import static com.arsdigita.ui.admin.AdminUiConstants.*;
/**
*
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
*/
public class GroupAddMemberForm extends Form {
private static final String MEMBER_NAME = "membername";
private static final int COL_MEMBER_NAME = 0;
private static final int COL_MEMBER_FAMILY_NAME = 1;
private static final int COL_MEMBER_GIVEN_NAME = 2;
private static final int COL_MEMBER_EMAIL = 3;
private static final int COL_MEMBER_ADD = 4;
private final TextField memberName;
public GroupAddMemberForm(
final GroupAdmin groupAdmin,
final ParameterSingleSelectionModel<String> selectedGroupId) {
super("groupAddMemberForm");
final ActionLink backToGroup = new ActionLink(new GlobalizedMessage(
"ui.admin.group_details.add_member.back", ADMIN_BUNDLE));
backToGroup.addActionListener(e -> {
groupAdmin.hideGroupMemberAddForm(e.getPageState());
});
add(backToGroup);
final Label header = new Label();
header.setClassAttr("heading");
header.addPrintListener(e -> {
final PageState state = e.getPageState();
final Label target = (Label) e.getTarget();
final GroupRepository groupRepository = CdiUtil.createCdiUtil()
.findBean(GroupRepository.class);
final Group group = groupRepository.findById(Long.parseLong(
selectedGroupId.getSelectedKey(state)));
target.setLabel(new GlobalizedMessage(
"ui.admin.group_details.add_member.header",
ADMIN_BUNDLE,
new String[]{group.getName()}));
});
add(header);
memberName = new TextField(MEMBER_NAME);
memberName.setLabel(new GlobalizedMessage(
"ui.admin.group_details.add_member.find", ADMIN_BUNDLE));
add(memberName);
final Submit submit = new Submit(new GlobalizedMessage(
"ui.admin.group_details.add_member.search", ADMIN_BUNDLE));
add(submit);
// addProcessListener(e -> {
// final PageState state = e.getPageState();
// final FormData data = e.getFormData();
// });
add(new UsersToAddTable(groupAdmin, selectedGroupId));
}
private class UsersToAddTable extends Table {
public UsersToAddTable(
final GroupAdmin groupAdmin,
final ParameterSingleSelectionModel<String> selectedGroupId) {
super();
setEmptyView(new Label(new GlobalizedMessage(
"ui.admin.group_details.add_member.table.empty", ADMIN_BUNDLE)));
final TableColumnModel columnModel = getColumnModel();
columnModel.add(new TableColumn(
COL_MEMBER_NAME,
new Label(new GlobalizedMessage(
"ui.admin.group_details.add_member.table.name",
ADMIN_BUNDLE))));
columnModel.add(new TableColumn(
COL_MEMBER_FAMILY_NAME,
new Label(new GlobalizedMessage(
"ui.admin.group_details.add_member.table.family_name",
ADMIN_BUNDLE))));
columnModel.add(new TableColumn(
COL_MEMBER_GIVEN_NAME,
new Label(new GlobalizedMessage(
"ui.admin.group_details.add_member.table.given_name",
ADMIN_BUNDLE))));
columnModel.add(new TableColumn(
COL_MEMBER_EMAIL,
new Label(new GlobalizedMessage(
"ui.admin.group_details.add_member.table.email",
ADMIN_BUNDLE))));
columnModel.add(new TableColumn(
COL_MEMBER_ADD,
new Label(new GlobalizedMessage(
"ui.admin.group_details.add_member.table.add",
ADMIN_BUNDLE))));
columnModel.get(COL_MEMBER_ADD).setCellRenderer(
new TableCellRenderer() {
@Override
public Component getComponent(final Table table,
final PageState state,
final Object value,
final boolean isSelected,
final Object key,
final int row,
final int column) {
final ControlLink link = new ControlLink((Component) value);
return link;
}
});
addTableActionListener(new TableActionListener() {
@Override
public void cellSelected(final TableActionEvent event) {
final PageState state = event.getPageState();
final String key = (String) event.getRowKey();
switch (event.getColumn()) {
case COL_MEMBER_ADD:
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
final UserRepository userRepository = cdiUtil
.findBean(UserRepository.class);
final GroupRepository groupRepository = cdiUtil
.findBean(GroupRepository.class);
final GroupManager groupManager = cdiUtil.findBean(
GroupManager.class);
final User user = userRepository.findById(Long
.parseLong(key));
final Group group = groupRepository.findById(
Long
.parseLong(selectedGroupId.getSelectedKey(state)));
groupManager.addMemberToGroup(user, group);
groupAdmin.hideGroupMemberAddForm(state);
break;
default:
throw new IllegalArgumentException(
"Invalid value for column");
}
}
@Override
public void headSelected(final TableActionEvent event) {
// Nothing
}
});
setModelBuilder(new UsersToAddTableModelBuilder());
}
}
private class UsersToAddTableModelBuilder extends LockableImpl
implements TableModelBuilder {
@Override
public TableModel makeModel(final Table table,
final PageState state) {
return new UsersToAddTableModel(state);
}
}
private class UsersToAddTableModel implements TableModel {
private final List<User> users;
private int index = -1;
public UsersToAddTableModel(final PageState state) {
final String term = (String) memberName.getValue(state);
if (term == null || term.isEmpty()) {
users = new ArrayList<>();
} else {
final UserRepository userRepository = CdiUtil.createCdiUtil()
.findBean(UserRepository.class);
users = userRepository.filtered(term);
}
}
@Override
public int getColumnCount() {
return 5;
}
@Override
public boolean nextRow() {
index++;
return index < users.size();
}
@Override
public Object getElementAt(final int columnIndex) {
final User user = users.get(index);
switch (columnIndex) {
case COL_MEMBER_NAME:
return user.getName();
case COL_MEMBER_FAMILY_NAME:
return user.getFamilyName();
case COL_MEMBER_GIVEN_NAME:
return user.getGivenName();
case COL_MEMBER_EMAIL:
return user.getPrimaryEmailAddress().getAddress();
case COL_MEMBER_ADD:
return new Label(new GlobalizedMessage(
"ui.admin.group_details.add_member.table.add",
ADMIN_BUNDLE));
default:
throw new IllegalArgumentException(
"Not a valid column index");
}
}
@Override
public Object getKeyAt(final int columnIndex) {
return users.get(index).getPartyId();
}
}
}

View File

@ -21,6 +21,7 @@ package com.arsdigita.ui.admin.usersgroupsroles.groups;
import com.arsdigita.bebop.ActionLink; import com.arsdigita.bebop.ActionLink;
import com.arsdigita.bebop.BoxPanel; import com.arsdigita.bebop.BoxPanel;
import com.arsdigita.bebop.Form; import com.arsdigita.bebop.Form;
import com.arsdigita.bebop.Label;
import com.arsdigita.bebop.Page; import com.arsdigita.bebop.Page;
import com.arsdigita.bebop.PageState; import com.arsdigita.bebop.PageState;
import com.arsdigita.bebop.ParameterSingleSelectionModel; import com.arsdigita.bebop.ParameterSingleSelectionModel;
@ -40,8 +41,6 @@ import static com.arsdigita.ui.admin.AdminUiConstants.*;
*/ */
public class GroupAdmin extends BoxPanel { public class GroupAdmin extends BoxPanel {
private final static Logger LOGGER = LogManager.getLogger(GroupAdmin.class);
private final StringParameter groupIdParameter; private final StringParameter groupIdParameter;
private final ParameterSingleSelectionModel<String> selectedGroupId; private final ParameterSingleSelectionModel<String> selectedGroupId;
private final TextField groupsTableFilter; private final TextField groupsTableFilter;
@ -49,12 +48,18 @@ public class GroupAdmin extends BoxPanel {
private final GroupsTable groupsTable; private final GroupsTable groupsTable;
private final GroupForm groupForm; private final GroupForm groupForm;
private final GroupDetails groupDetails; private final GroupDetails groupDetails;
private final GroupAddMemberForm groupAddMemberForm;
public GroupAdmin() { public GroupAdmin() {
super(); super();
setBasicProperties(); setBasicProperties();
final Label heading = new Label(new GlobalizedMessage(
"ui.admin.groups.heading", ADMIN_BUNDLE));
heading.setClassAttr("heading");
add(heading);
groupsTablePanel = new BoxPanel(); groupsTablePanel = new BoxPanel();
groupsTablePanel.setIdAttr("groupsTablePanel"); groupsTablePanel.setIdAttr("groupsTablePanel");
@ -96,6 +101,9 @@ public class GroupAdmin extends BoxPanel {
groupDetails = new GroupDetails(this, selectedGroupId); groupDetails = new GroupDetails(this, selectedGroupId);
add(groupDetails); add(groupDetails);
groupAddMemberForm = new GroupAddMemberForm(this, selectedGroupId);
add(groupAddMemberForm);
} }
@Override @Override
@ -107,6 +115,7 @@ public class GroupAdmin extends BoxPanel {
page.setVisibleDefault(groupsTablePanel, true); page.setVisibleDefault(groupsTablePanel, true);
page.setVisibleDefault(groupForm, false); page.setVisibleDefault(groupForm, false);
page.setVisibleDefault(groupDetails, false); page.setVisibleDefault(groupDetails, false);
page.setVisibleDefault(groupAddMemberForm, false);
} }
private void setBasicProperties() { private void setBasicProperties() {
@ -118,6 +127,7 @@ public class GroupAdmin extends BoxPanel {
groupsTablePanel.setVisible(state, false); groupsTablePanel.setVisible(state, false);
groupForm.setVisible(state, false); groupForm.setVisible(state, false);
groupDetails.setVisible(state, true); groupDetails.setVisible(state, true);
groupAddMemberForm.setVisible(state, false);
} }
protected void hideGroupDetails(final PageState state) { protected void hideGroupDetails(final PageState state) {
@ -125,17 +135,39 @@ public class GroupAdmin extends BoxPanel {
groupsTablePanel.setVisible(state, true); groupsTablePanel.setVisible(state, true);
groupForm.setVisible(state, false); groupForm.setVisible(state, false);
groupDetails.setVisible(state, false); groupDetails.setVisible(state, false);
groupAddMemberForm.setVisible(state, false);
} }
protected void showGroupForm(final PageState state) { protected void showGroupForm(final PageState state) {
groupsTablePanel.setVisible(state, false); groupsTablePanel.setVisible(state, false);
groupForm.setVisible(state, true); groupForm.setVisible(state, true);
groupDetails.setVisible(state, false);
groupAddMemberForm.setVisible(state, false);
} }
protected void hideGroupForm(final PageState state) { protected void hideGroupForm(final PageState state) {
groupsTablePanel.setVisible(state, true); //If we want to show the groups table or the group details depends
//if a group is selected or not.
boolean groupSelected = selectedGroupId.isSelected(state);
groupsTablePanel.setVisible(state, !groupSelected);
groupForm.setVisible(state, false); groupForm.setVisible(state, false);
groupDetails.setVisible(state, groupSelected);
groupAddMemberForm.setVisible(state, false);
} }
protected void showGroupMemberAddForm(final PageState state) {
groupsTablePanel.setVisible(state, false);
groupForm.setVisible(state, false);
groupDetails.setVisible(state, false);
groupAddMemberForm.setVisible(state, true);
}
protected void hideGroupMemberAddForm(final PageState state) {
groupsTablePanel.setVisible(state, false);
groupForm.setVisible(state, false);
groupDetails.setVisible(state, true);
groupAddMemberForm.setVisible(state, false);
}
} }

View File

@ -20,10 +20,16 @@ package com.arsdigita.ui.admin.usersgroupsroles.groups;
import com.arsdigita.bebop.ActionLink; import com.arsdigita.bebop.ActionLink;
import com.arsdigita.bebop.BoxPanel; import com.arsdigita.bebop.BoxPanel;
import com.arsdigita.bebop.Label;
import com.arsdigita.bebop.PageState;
import com.arsdigita.bebop.ParameterSingleSelectionModel; import com.arsdigita.bebop.ParameterSingleSelectionModel;
import com.arsdigita.bebop.PropertySheet; import com.arsdigita.bebop.PropertySheet;
import com.arsdigita.globalization.GlobalizedMessage; import com.arsdigita.globalization.GlobalizedMessage;
import org.libreccm.cdi.utils.CdiUtil;
import org.libreccm.security.Group;
import org.libreccm.security.GroupRepository;
import static com.arsdigita.ui.admin.AdminUiConstants.*; import static com.arsdigita.ui.admin.AdminUiConstants.*;
/** /**
@ -37,18 +43,55 @@ public class GroupDetails extends BoxPanel {
final ParameterSingleSelectionModel<String> selectedGroupId) { final ParameterSingleSelectionModel<String> selectedGroupId) {
super(BoxPanel.VERTICAL); super(BoxPanel.VERTICAL);
final ActionLink backLink = new ActionLink(new GlobalizedMessage( final ActionLink backLink = new ActionLink(new GlobalizedMessage(
"ui.admin.group_details.back", ADMIN_BUNDLE)); "ui.admin.group_details.back", ADMIN_BUNDLE));
backLink.setClassAttr("back-link");
backLink.addActionListener(e -> { backLink.addActionListener(e -> {
groupAdmin.hideGroupDetails(e.getPageState()); groupAdmin.hideGroupDetails(e.getPageState());
}); });
add(backLink); add(backLink);
final Label header = new Label();
header.setClassAttr("heading");
header.addPrintListener(e -> {
final PageState state = e.getPageState();
final Label target = (Label) e.getTarget();
final GroupRepository groupRepository = CdiUtil.createCdiUtil()
.findBean(GroupRepository.class);
final Group group = groupRepository.findById(Long.parseLong(
selectedGroupId.getSelectedKey(state)));
target.setLabel(new GlobalizedMessage(
"ui.admin.group_details.header",
ADMIN_BUNDLE, new String[]{group.getName()}));
});
add(header);
final PropertySheet propertySheet = new PropertySheet( final PropertySheet propertySheet = new PropertySheet(
new GroupPropertySheetModelBuilder(selectedGroupId)); new GroupPropertySheetModelBuilder(selectedGroupId));
add(propertySheet); add(propertySheet);
final BoxPanel links = new BoxPanel(BoxPanel.HORIZONTAL);
final ActionLink editProperties = new ActionLink(new GlobalizedMessage(
"ui.admin.group_details.edit_properties", ADMIN_BUNDLE));
editProperties.addActionListener(e -> {
groupAdmin.showGroupForm(e.getPageState());
});
links.add(editProperties);
add(links);
final GroupMembersTable membersTable = new GroupMembersTable(
selectedGroupId);
add(membersTable);
final ActionLink addMember = new ActionLink(new GlobalizedMessage(
"ui.admin.group_details.add_member", ADMIN_BUNDLE));
addMember.addActionListener(e -> {
groupAdmin.showGroupMemberAddForm(e.getPageState());
});
add(addMember);
} }
} }

View File

@ -159,7 +159,7 @@ public class GroupForm extends Form {
} }
} }
groupAdmin.hideGroupDetails(state); groupAdmin.hideGroupForm(state);
}); });
} }

View File

@ -0,0 +1,241 @@
/*
* Copyright (C) 2016 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 com.arsdigita.ui.admin.usersgroupsroles.groups;
import com.arsdigita.bebop.Component;
import com.arsdigita.bebop.ControlLink;
import com.arsdigita.bebop.Label;
import com.arsdigita.bebop.PageState;
import com.arsdigita.bebop.ParameterSingleSelectionModel;
import com.arsdigita.bebop.Table;
import com.arsdigita.bebop.event.TableActionEvent;
import com.arsdigita.bebop.event.TableActionListener;
import com.arsdigita.bebop.table.TableCellRenderer;
import com.arsdigita.bebop.table.TableColumn;
import com.arsdigita.bebop.table.TableColumnModel;
import com.arsdigita.bebop.table.TableModel;
import com.arsdigita.bebop.table.TableModelBuilder;
import com.arsdigita.globalization.GlobalizedMessage;
import com.arsdigita.util.LockableImpl;
import org.libreccm.cdi.utils.CdiUtil;
import org.libreccm.security.Group;
import org.libreccm.security.GroupManager;
import org.libreccm.security.GroupRepository;
import org.libreccm.security.User;
import org.libreccm.security.UserRepository;
import java.util.ArrayList;
import java.util.List;
import static com.arsdigita.ui.admin.AdminUiConstants.*;
/**
*
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
*/
public class GroupMembersTable extends Table {
private static final int COL_MEMBER_NAME = 0;
private static final int COL_MEMBER_FAMILY_NAME = 1;
private static final int COL_MEMBER_GIVEN_NAME = 2;
private static final int COL_MEMBER_EMAIL = 3;
private static final int COL_MEMBER_REMOVE = 4;
public GroupMembersTable(
final ParameterSingleSelectionModel<String> selectedGroupId) {
super();
setIdAttr("groupMembersTable");
setEmptyView(new Label(new GlobalizedMessage(
"ui.admin.group_details.members.none", ADMIN_BUNDLE)));
final TableColumnModel columnModel = getColumnModel();
columnModel.add(new TableColumn(
COL_MEMBER_NAME,
new Label(new GlobalizedMessage(
"ui.admin.group_details.members_table.cols.name",
ADMIN_BUNDLE))));
columnModel.add(new TableColumn(
COL_MEMBER_FAMILY_NAME,
new Label(new GlobalizedMessage(
"ui.admin.group_details.members_table.cols.family_name",
ADMIN_BUNDLE))));
columnModel.add(new TableColumn(
COL_MEMBER_GIVEN_NAME,
new Label(new GlobalizedMessage(
"ui.admin.group_details.members_table.cols.given_name",
ADMIN_BUNDLE))));
columnModel.add(new TableColumn(
COL_MEMBER_EMAIL,
new Label(new GlobalizedMessage(
"ui.admin.group_details.members_table.cols.email",
ADMIN_BUNDLE))));
columnModel.add(new TableColumn(
COL_MEMBER_REMOVE,
new Label(new GlobalizedMessage(
"ui.admin.group_details.members_table.cols.remove",
ADMIN_BUNDLE))));
columnModel.get(COL_MEMBER_REMOVE).setCellRenderer(
new TableCellRenderer() {
@Override
public Component getComponent(final Table table,
final PageState state,
final Object value,
final boolean isSelected,
final Object key,
final int row,
final int column) {
final ControlLink link = new ControlLink((Component) value);
link.setConfirmation(new GlobalizedMessage(
"ui.admin.group_details.members_table.member.remove",
ADMIN_BUNDLE));
return link;
}
});
addTableActionListener(new TableActionListener() {
@Override
public void cellSelected(final TableActionEvent event) {
final PageState state = event.getPageState();
final String key = (String) event.getRowKey();
switch (event.getColumn()) {
case COL_MEMBER_REMOVE:
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
final UserRepository userRepository = cdiUtil
.findBean(UserRepository.class);
final GroupRepository groupRepository = cdiUtil
.findBean(GroupRepository.class);
final GroupManager groupManager = cdiUtil.findBean(
GroupManager.class);
final User user = userRepository.findById(Long
.parseLong(key));
final Group group = groupRepository.findById(
Long
.parseLong(selectedGroupId.getSelectedKey(state)));
groupManager.removeMemberFromGroup(user, group);
break;
default:
throw new IllegalArgumentException(
"Invalid value for column");
}
}
@Override
public void headSelected(final TableActionEvent event) {
//Nothing
}
});
setModelBuilder(new GroupMembersTableModelBuilder(selectedGroupId));
}
private class GroupMembersTableModelBuilder extends LockableImpl
implements TableModelBuilder {
private final ParameterSingleSelectionModel<String> selectedGroupId;
public GroupMembersTableModelBuilder(
final ParameterSingleSelectionModel<String> selectedGroupId) {
this.selectedGroupId = selectedGroupId;
}
@Override
public TableModel makeModel(final Table table, final PageState state) {
table.getRowSelectionModel().clearSelection(state);
return new GroupMembersTableModel(selectedGroupId, state);
}
}
private class GroupMembersTableModel implements TableModel {
private final List<User> members;
private int index = -1;
public GroupMembersTableModel(
final ParameterSingleSelectionModel<String> selectedGroupId,
final PageState state) {
final GroupRepository groupRepository = CdiUtil.createCdiUtil()
.findBean(GroupRepository.class);
final Group group = groupRepository.findById(Long.parseLong(
selectedGroupId.getSelectedKey(state)));
members = new ArrayList<>();
group.getMemberships().forEach(m -> {
members.add(m.getMember());
});
members.sort((User m1, User m2) -> {
return m1.getName().compareTo(m2.getName());
});
}
@Override
public int getColumnCount() {
return 5;
}
@Override
public boolean nextRow() {
index++;
return index < members.size();
}
@Override
public Object getElementAt(final int columnIndex) {
final User member = members.get(index);
switch (columnIndex) {
case COL_MEMBER_NAME:
return member.getName();
case COL_MEMBER_FAMILY_NAME:
return member.getFamilyName();
case COL_MEMBER_GIVEN_NAME:
return member.getGivenName();
case COL_MEMBER_EMAIL:
return member.getPrimaryEmailAddress().getAddress();
case COL_MEMBER_REMOVE:
return new Label(new GlobalizedMessage(
"ui.admin.group_details.members_table.remove",
ADMIN_BUNDLE));
default:
throw new IllegalArgumentException(
"Not a valid column index");
}
}
@Override
public Object getKeyAt(final int columnIndex) {
return members.get(index).getPartyId();
}
}
}

View File

@ -22,9 +22,15 @@ import com.arsdigita.bebop.PropertySheetModel;
import com.arsdigita.globalization.GlobalizedMessage; import com.arsdigita.globalization.GlobalizedMessage;
import org.libreccm.security.Group; import org.libreccm.security.Group;
import org.libreccm.security.Role;
import org.libreccm.security.RoleMembership;
import java.util.Arrays; import java.util.Arrays;
import java.util.Iterator; import java.util.Iterator;
import java.util.Set;
import java.util.SortedSet;
import java.util.StringJoiner;
import java.util.TreeSet;
import static com.arsdigita.ui.admin.AdminUiConstants.*; import static com.arsdigita.ui.admin.AdminUiConstants.*;
@ -35,7 +41,8 @@ import static com.arsdigita.ui.admin.AdminUiConstants.*;
class GroupPropertySheetModel implements PropertySheetModel { class GroupPropertySheetModel implements PropertySheetModel {
private static enum GroupProperty { private static enum GroupProperty {
GROUP_NAME; GROUP_NAME,
ROLES
} }
private final Group selectedGroup; private final Group selectedGroup;
@ -84,9 +91,26 @@ class GroupPropertySheetModel implements PropertySheetModel {
switch (currentProperty) { switch (currentProperty) {
case GROUP_NAME: case GROUP_NAME:
return selectedGroup.getName(); return selectedGroup.getName();
case ROLES:
return retrieveRoles();
default: default:
return ""; return "";
} }
} }
private String retrieveRoles() {
final Set<RoleMembership> roleMemberships = selectedGroup
.getRoleMemberships();
final SortedSet<String> roles = new TreeSet<>((r1, r2) -> {
return r1.compareTo(r2);
});
roleMemberships.forEach(m -> {
roles.add(m.getRole().getName());
});
return String.join(", ", roles.toArray(new String[roles.size()]));
}
} }

View File

@ -61,9 +61,11 @@ public class GroupsTable extends Table {
final GroupAdmin parent, final GroupAdmin parent,
final TextField groupsTableFilter, final TextField groupsTableFilter,
final ParameterSingleSelectionModel<String> selectedGroupId) { final ParameterSingleSelectionModel<String> selectedGroupId) {
super(); super();
setIdAttr("groupsTable"); setIdAttr("groupsTable");
setStyleAttr("width: 30em");
this.groupsTableFilter = groupsTableFilter; this.groupsTableFilter = groupsTableFilter;
this.selectedGroupId = selectedGroupId; this.selectedGroupId = selectedGroupId;

View File

@ -82,7 +82,11 @@ import javax.xml.bind.annotation.XmlTransient;
+ "LOWER(u.name) LIKE CONCAT(LOWER(:term), '%') " + "LOWER(u.name) LIKE CONCAT(LOWER(:term), '%') "
+ "OR LOWER(u.givenName) LIKE CONCAT(LOWER(:term), '%') " + "OR LOWER(u.givenName) LIKE CONCAT(LOWER(:term), '%') "
+ "OR LOWER(u.familyName) LIKE CONCAT(LOWER(:term), '%') " + "OR LOWER(u.familyName) LIKE CONCAT(LOWER(:term), '%') "
+ "OR LOWER(u.primaryEmailAddress.address) LIKE CONCAT('%', LOWER(:term), '%')"), + "OR LOWER(u.primaryEmailAddress.address) LIKE CONCAT('%', LOWER(:term), '%') "
+ "ORDER BY u.name,"
+ "u.familyName, "
+ "u.givenName, "
+ "u.primaryEmailAddress.address"),
@NamedQuery( @NamedQuery(
name = "User.findAllOrderedByUsername", name = "User.findAllOrderedByUsername",
query = "SELECT u FROM User u ORDER BY u.name, " query = "SELECT u FROM User u ORDER BY u.name, "

View File

@ -255,3 +255,26 @@ ui.admin.group.name=Name of group
ui.admin.group.delete.confirm=Are you sure to delete this group? ui.admin.group.delete.confirm=Are you sure to delete this group?
ui.admin.group.property_sheet.group_name=Name of Group ui.admin.group.property_sheet.group_name=Name of Group
ui.admin.group_details.back=Back to groups table ui.admin.group_details.back=Back to groups table
ui.admin.group.property_sheet.roles=Assigned roles
ui.admin.group_details.edit_properties=Rename group
ui.admin.group_details.members.none=This group has no members
ui.admin.group_details.members_table.cols.name=User name
ui.admin.group_details.members_table.cols.family_name=Family name
ui.admin.group_details.members_table.cols.given_name=Given name
ui.admin.group_details.members_table.cols.email=Email
ui.admin.group_details.members_table.cols.remove=Remove
ui.admin.group_details.members_table.member.remove=Are you sure to remove this member from this group?
ui.admin.group_details.members_table.remove=Remove
ui.admin.group_details.add_member.search=Search
ui.admin.group_details.add_member.find=Find user to add
ui.admin.group_details.add_member.table.empty=No matching users
ui.admin.group_details.add_member.table.name=User name
ui.admin.group_details.add_member.table.family_name=Family name
ui.admin.group_details.add_member.table.given_name=Given name
ui.admin.group_details.add_member.table.email=Email
ui.admin.group_details.add_member.table.add=Add member
ui.admin.group_details.add_member=Add member
ui.admin.group_details.add_member.back=Back to group details
ui.admin.group_details.add_member.header=Add member to group {0}
ui.admin.group_details.header=Details for group {0}
ui.admin.groups.heading=Groups

View File

@ -244,7 +244,7 @@ ui.admin.groups.filter.submit=Anwenden
ui.admin.groups.table.filter.clear=Filter zur\u00fccksetzen ui.admin.groups.table.filter.clear=Filter zur\u00fccksetzen
ui.admin.groups.table.no_groups=Keine Gruppen gefunden ui.admin.groups.table.no_groups=Keine Gruppen gefunden
ui.admin.groups.table.name=Name ui.admin.groups.table.name=Name
ui.admin.groups.table.delete=Delete ui.admin.groups.table.delete=L\u00f6schen
ui.admin.new_group_link=Neue Gruppe anlegen ui.admin.new_group_link=Neue Gruppe anlegen
ui.admin.group.name.error.notempty=Der Name einer Gruppe kann nicht leer sein. ui.admin.group.name.error.notempty=Der Name einer Gruppe kann nicht leer sein.
ui.admin.group.name.error.length=Der Name einer Gruppe darf maximal 256 Zeichen lang sein. ui.admin.group.name.error.length=Der Name einer Gruppe darf maximal 256 Zeichen lang sein.
@ -255,3 +255,27 @@ ui.admin.group.name=Name der Gruppe
ui.admin.group.delete.confirm=Sind Sie sicher das Sie diese Gruppe l\u00f6schen wollen? ui.admin.group.delete.confirm=Sind Sie sicher das Sie diese Gruppe l\u00f6schen wollen?
ui.admin.group.property_sheet.group_name=Name der Gruppe ui.admin.group.property_sheet.group_name=Name der Gruppe
ui.admin.group_details.back=Zur\u00fcck zur Gruppen\u00fcbersicht ui.admin.group_details.back=Zur\u00fcck zur Gruppen\u00fcbersicht
ui.admin.group.property_sheet.roles=Zugewiesene Rollen
ui.admin.group_details.edit_properties=Gruppe umbenennen
ui.admin.group_details.members.none=Diese Gruppe hat keine Mitglieder
ui.admin.group_details.members_table.cols.name=Benutzername
ui.admin.group_details.members_table.cols.family_name=Familienname
ui.admin.group_details.members_table.cols.given_name=Vorname
ui.admin.group_details.members_table.cols.email=E-Mail
ui.admin.group_details.members_table.cols.remove=Remove
ui.admin.group_details.members_table.member.remove=Sind Sie sicher, dass sie dieses Mitglied aus der Gruppe entfernen wollen?
ui.admin.group_details.members_table.remove=Entfernen
ui.admin.group_details.add_member.search=Suchen
ui.admin.group_details.add_member.find=Benutzer suchen
ui.admin.group_details.add_member.table.empty=Keine passenden Benutzer
ui.admin.group_details.add_member.table.name=Benutzername
ui.admin.group_details.add_member.table.family_name=Familienname
ui.admin.group_details.add_member.table.given_name=Vorname
#Email
ui.admin.group_details.add_member.table.email=E-Mail
ui.admin.group_details.add_member.table.add=Hinzuf\u00fcgen
ui.admin.group_details.add_member=Mitglied hinzuf\u00fcgen
ui.admin.group_details.add_member.back=Zur\u00fcck zur Detailansicht der Gruppe
ui.admin.group_details.add_member.header=Mitglieder zur Gruppe {0} hinzuf\u00fcgen
ui.admin.group_details.header=Details Gruppe {0}
ui.admin.groups.heading=Gruppen

View File

@ -228,3 +228,27 @@ ui.admin.group.name=Name of group
ui.admin.group.delete.confirm=Are you sure to delete this group? ui.admin.group.delete.confirm=Are you sure to delete this group?
ui.admin.group.property_sheet.group_name=Name of Group ui.admin.group.property_sheet.group_name=Name of Group
ui.admin.group_details.back=Back to groups table ui.admin.group_details.back=Back to groups table
ui.admin.group.property_sheet.roles=Assigned roles
ui.admin.group_details.edit_properties=Rename group
ui.admin.group_details.members.none=This group has no members
ui.admin.group_details.members_table.cols.name=User name
ui.admin.group_details.members_table.cols.family_name=Family name
ui.admin.group_details.members_table.cols.given_name=Given name
ui.admin.group_details.members_table.cols.email=Email
ui.admin.group_details.members_table.cols.remove=Remove
ui.admin.group_details.members_table.member.remove=Are you sure to remove this member from this group?
ui.admin.group_details.members_table.remove=Remove
ui.admin.group_details.add_member.search=Search
ui.admin.group_details.add_member.find=Find user to add
ui.admin.group_details.add_member.table.empty=No matching users
ui.admin.group_details.add_member.table.name=User name
ui.admin.group_details.add_member.table.family_name=Family name
ui.admin.group_details.add_member.table.given_name=Given name
#Email
ui.admin.group_details.add_member.table.email=Email
ui.admin.group_details.add_member.table.add=Add member
ui.admin.group_details.add_member=Add member
ui.admin.group_details.add_member.back=Back to group details
ui.admin.group_details.add_member.header=Add member to group {0}
ui.admin.group_details.header=Details for group {0}
ui.admin.groups.heading=Groups

View File

@ -219,3 +219,27 @@ ui.admin.group.name=Name of group
ui.admin.group.delete.confirm=Are you sure to delete this group? ui.admin.group.delete.confirm=Are you sure to delete this group?
ui.admin.group.property_sheet.group_name=Name of Group ui.admin.group.property_sheet.group_name=Name of Group
ui.admin.group_details.back=Back to groups table ui.admin.group_details.back=Back to groups table
ui.admin.group.property_sheet.roles=Assigned roles
ui.admin.group_details.edit_properties=Rename group
ui.admin.group_details.members.none=This group has no members
ui.admin.group_details.members_table.cols.name=User name
ui.admin.group_details.members_table.cols.family_name=Family name
ui.admin.group_details.members_table.cols.given_name=Given name
ui.admin.group_details.members_table.cols.email=Email
ui.admin.group_details.members_table.cols.remove=Remove
ui.admin.group_details.members_table.member.remove=Are you sure to remove this member from this group?
ui.admin.group_details.members_table.remove=Remove
ui.admin.group_details.add_member.search=Search
ui.admin.group_details.add_member.find=Find user to add
ui.admin.group_details.add_member.table.empty=No matching users
ui.admin.group_details.add_member.table.name=User name
ui.admin.group_details.add_member.table.family_name=Family name
ui.admin.group_details.add_member.table.given_name=Given name
#Email
ui.admin.group_details.add_member.table.email=Email
ui.admin.group_details.add_member.table.add=Add member
ui.admin.group_details.add_member=Add member
ui.admin.group_details.add_member.back=Back to group details
ui.admin.group_details.add_member.header=Add member to group {0}
ui.admin.group_details.header=Details for group {0}
ui.admin.groups.heading=Groups

View File

@ -660,7 +660,7 @@ table.dataTable{
table * table ,form table { table * table ,form table {
border-style: none; border-style: none;
/*width: auto;*/ width: auto;
margin: 0; margin: 0;
} }
@ -1807,3 +1807,36 @@ span#quickLinksCascade {
.wysiwyg ul { .wysiwyg ul {
list-style: disc inside; list-style: disc inside;
} }
.wysiwyg div.image {
border: 1px solid #999;
margin-bottom: 0.5em;
}
.wysiwyg div.image span.caption {
display: block;
}
.wysiwyg div.image.left {
float: left;
margin-right: 1em;
}
.wysiwyg div.image.right {
float: right;
margin-left: 1em;
}
.wysiwg div.image.center {
text-align: center;
}
.wysiwg div.image.center span.caption {
margin-left: auto;
margin-right: auto;
text-align: left;
}