CCM NG: Group Administration
git-svn-id: https://svn.libreccm.org/ccm/ccm_ng@3998 8810af33-2d31-482b-a856-94f89814c4dfpull/2/head
parent
8bc1368b85
commit
668eb0193d
|
|
@ -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();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -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,24 +48,30 @@ 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");
|
||||||
|
|
||||||
final Form filterForm = new Form("groupsTableFilterForm");
|
final Form filterForm = new Form("groupsTableFilterForm");
|
||||||
groupsTableFilter = new TextField("groupsTableFilter");
|
groupsTableFilter = new TextField("groupsTableFilter");
|
||||||
groupsTableFilter.setLabel(new GlobalizedMessage(
|
groupsTableFilter.setLabel(new GlobalizedMessage(
|
||||||
"ui.admin.groups.table.filter.term", ADMIN_BUNDLE));
|
"ui.admin.groups.table.filter.term", ADMIN_BUNDLE));
|
||||||
filterForm.add(groupsTableFilter);
|
filterForm.add(groupsTableFilter);
|
||||||
filterForm.add(new Submit(new GlobalizedMessage(
|
filterForm.add(new Submit(new GlobalizedMessage(
|
||||||
"ui.admin.groups.filter.submit", ADMIN_BUNDLE)));
|
"ui.admin.groups.filter.submit", ADMIN_BUNDLE)));
|
||||||
final ActionLink clearLink = new ActionLink(new GlobalizedMessage(
|
final ActionLink clearLink = new ActionLink(new GlobalizedMessage(
|
||||||
"ui.admin.groups.table.filter.clear", ADMIN_BUNDLE));
|
"ui.admin.groups.table.filter.clear", ADMIN_BUNDLE));
|
||||||
clearLink.addActionListener(e -> {
|
clearLink.addActionListener(e -> {
|
||||||
final PageState state = e.getPageState();
|
final PageState state = e.getPageState();
|
||||||
groupsTableFilter.setValue(state, null);
|
groupsTableFilter.setValue(state, null);
|
||||||
|
|
@ -76,13 +81,13 @@ public class GroupAdmin extends BoxPanel {
|
||||||
|
|
||||||
groupIdParameter = new StringParameter("selected_group_id");
|
groupIdParameter = new StringParameter("selected_group_id");
|
||||||
selectedGroupId = new ParameterSingleSelectionModel<>(
|
selectedGroupId = new ParameterSingleSelectionModel<>(
|
||||||
groupIdParameter);
|
groupIdParameter);
|
||||||
|
|
||||||
groupsTable = new GroupsTable(this, groupsTableFilter, selectedGroupId);
|
groupsTable = new GroupsTable(this, groupsTableFilter, selectedGroupId);
|
||||||
groupsTablePanel.add(groupsTable);
|
groupsTablePanel.add(groupsTable);
|
||||||
|
|
||||||
final ActionLink addNewGroupLink = new ActionLink(new GlobalizedMessage(
|
final ActionLink addNewGroupLink = new ActionLink(new GlobalizedMessage(
|
||||||
"ui.admin.new_group_link", ADMIN_BUNDLE));
|
"ui.admin.new_group_link", ADMIN_BUNDLE));
|
||||||
addNewGroupLink.addActionListener(e -> {
|
addNewGroupLink.addActionListener(e -> {
|
||||||
showGroupForm(e.getPageState());
|
showGroupForm(e.getPageState());
|
||||||
});
|
});
|
||||||
|
|
@ -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);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -159,7 +159,7 @@ public class GroupForm extends Form {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
groupAdmin.hideGroupDetails(state);
|
groupAdmin.hideGroupForm(state);
|
||||||
});
|
});
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -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()]));
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -65,53 +65,57 @@ import javax.xml.bind.annotation.XmlTransient;
|
||||||
@NamedQueries({
|
@NamedQueries({
|
||||||
@NamedQuery(name = "User.findByName",
|
@NamedQuery(name = "User.findByName",
|
||||||
query = "SELECT u FROM User u WHERE u.name = :name "
|
query = "SELECT u FROM User u WHERE u.name = :name "
|
||||||
+ "ORDER BY u.name, "
|
+ "ORDER BY u.name, "
|
||||||
+ " u.familyName, "
|
+ " u.familyName, "
|
||||||
+ " u.givenName, "
|
+ " u.givenName, "
|
||||||
+ " u.primaryEmailAddress.address"),
|
+ " u.primaryEmailAddress.address"),
|
||||||
@NamedQuery(name = "User.findByEmailAddress",
|
@NamedQuery(name = "User.findByEmailAddress",
|
||||||
query = "SELECT u FROM User u WHERE "
|
query = "SELECT u FROM User u WHERE "
|
||||||
+ "u.primaryEmailAddress.address = :emailAddress "
|
+ "u.primaryEmailAddress.address = :emailAddress "
|
||||||
+ "ORDER BY u.name, "
|
+ "ORDER BY u.name, "
|
||||||
+ " u.familyName, "
|
+ " u.familyName, "
|
||||||
+ " u.givenName, "
|
+ " u.givenName, "
|
||||||
+ " u.primaryEmailAddress.address"),
|
+ " u.primaryEmailAddress.address"),
|
||||||
@NamedQuery(
|
@NamedQuery(
|
||||||
name = "User.filterByNameAndEmail",
|
name = "User.filterByNameAndEmail",
|
||||||
query = "SELECT u FROM User u WHERE "
|
query = "SELECT u FROM User u WHERE "
|
||||||
+ "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, "
|
||||||
+ " u.familyName, "
|
+ " u.familyName, "
|
||||||
+ " u.givenName, "
|
+ " u.givenName, "
|
||||||
+ " u.primaryEmailAddress.address")
|
+ " u.primaryEmailAddress.address")
|
||||||
})
|
})
|
||||||
@NamedEntityGraphs({
|
@NamedEntityGraphs({
|
||||||
@NamedEntityGraph(
|
@NamedEntityGraph(
|
||||||
name = "User.withGroupAndRoleMemberships",
|
name = "User.withGroupAndRoleMemberships",
|
||||||
attributeNodes = {
|
attributeNodes = {
|
||||||
@NamedAttributeNode(
|
@NamedAttributeNode(
|
||||||
value = "groupMemberships"),
|
value = "groupMemberships"),
|
||||||
@NamedAttributeNode(
|
@NamedAttributeNode(
|
||||||
value = "roleMemberships",
|
value = "roleMemberships",
|
||||||
subgraph = "role")},
|
subgraph = "role")},
|
||||||
subgraphs = {
|
subgraphs = {
|
||||||
@NamedSubgraph(
|
@NamedSubgraph(
|
||||||
name = "role",
|
name = "role",
|
||||||
attributeNodes = {
|
attributeNodes = {
|
||||||
@NamedAttributeNode(value = "role",
|
@NamedAttributeNode(value = "role",
|
||||||
subgraph = "permissions")
|
subgraph = "permissions")
|
||||||
}),
|
}),
|
||||||
@NamedSubgraph(
|
@NamedSubgraph(
|
||||||
name = "permissions",
|
name = "permissions",
|
||||||
attributeNodes = {
|
attributeNodes = {
|
||||||
@NamedAttributeNode(value = "permissions")}
|
@NamedAttributeNode(value = "permissions")}
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
@DefaultEntityGraph("User.withGroupAndRoleMemberships")
|
@DefaultEntityGraph("User.withGroupAndRoleMemberships")
|
||||||
@XmlRootElement(name = "user", namespace = CORE_XML_NS)
|
@XmlRootElement(name = "user", namespace = CORE_XML_NS)
|
||||||
|
|
@ -141,12 +145,12 @@ public class User extends Party implements Serializable {
|
||||||
*/
|
*/
|
||||||
@Embedded
|
@Embedded
|
||||||
@AssociationOverride(
|
@AssociationOverride(
|
||||||
name = "USER_PRIMARY_EMAIL_ADDRESSES",
|
name = "USER_PRIMARY_EMAIL_ADDRESSES",
|
||||||
joinTable = @JoinTable(name = "USER_PRIMARY_EMAIL_ADDRESSES",
|
joinTable = @JoinTable(name = "USER_PRIMARY_EMAIL_ADDRESSES",
|
||||||
schema = DB_SCHEMA,
|
schema = DB_SCHEMA,
|
||||||
joinColumns = {
|
joinColumns = {
|
||||||
@JoinColumn(name = "USER_ID")
|
@JoinColumn(name = "USER_ID")
|
||||||
}))
|
}))
|
||||||
@NotNull
|
@NotNull
|
||||||
@XmlElement(name = "primary-email-address", namespace = CORE_XML_NS)
|
@XmlElement(name = "primary-email-address", namespace = CORE_XML_NS)
|
||||||
private EmailAddress primaryEmailAddress;
|
private EmailAddress primaryEmailAddress;
|
||||||
|
|
@ -275,7 +279,7 @@ public class User extends Party implements Serializable {
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void setGroupMemberships(
|
protected void setGroupMemberships(
|
||||||
final Set<GroupMembership> groupMemberships) {
|
final Set<GroupMembership> groupMemberships) {
|
||||||
this.groupMemberships = groupMemberships;
|
this.groupMemberships = groupMemberships;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -284,7 +288,7 @@ public class User extends Party implements Serializable {
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void removeGroupMembership(
|
protected void removeGroupMembership(
|
||||||
final GroupMembership groupMembership) {
|
final GroupMembership groupMembership) {
|
||||||
groupMemberships.remove(groupMembership);
|
groupMemberships.remove(groupMembership);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -332,19 +336,19 @@ public class User extends Party implements Serializable {
|
||||||
@Override
|
@Override
|
||||||
public String toString(final String data) {
|
public String toString(final String data) {
|
||||||
return super.toString(String.format(
|
return super.toString(String.format(
|
||||||
", givenName = \"%s\", "
|
", givenName = \"%s\", "
|
||||||
+ "familyName = \"%s\", "
|
+ "familyName = \"%s\", "
|
||||||
+ "primaryEmailAddress = { %s }, "
|
+ "primaryEmailAddress = { %s }, "
|
||||||
+ "emailAddresses = { %s }, "
|
+ "emailAddresses = { %s }, "
|
||||||
+ "banned = %b, "
|
+ "banned = %b, "
|
||||||
+ "passwordResetRequired = %b%s",
|
+ "passwordResetRequired = %b%s",
|
||||||
givenName,
|
givenName,
|
||||||
familyName,
|
familyName,
|
||||||
Objects.toString(primaryEmailAddress),
|
Objects.toString(primaryEmailAddress),
|
||||||
Objects.toString(emailAddresses),
|
Objects.toString(emailAddresses),
|
||||||
banned,
|
banned,
|
||||||
passwordResetRequired,
|
passwordResetRequired,
|
||||||
data
|
data
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue