CCM NG: UserDetails view

git-svn-id: https://svn.libreccm.org/ccm/ccm_ng@3904 8810af33-2d31-482b-a856-94f89814c4df
pull/2/head
jensp 2016-03-03 14:37:38 +00:00
parent beb702efd9
commit 326707f1a7
10 changed files with 361 additions and 54 deletions

View File

@ -100,9 +100,9 @@ public class AdminServlet
// addPage("/index.jsp", buildIndexPage()); // index page at address ~/ds
adminPage = PageFactory.buildPage("admin", "LibreCCM NG Admin");
adminPage.addGlobalStateParam(USER_ID_PARAM);
adminPage.addGlobalStateParam(GROUP_ID_PARAM);
adminPage.addGlobalStateParam(APPLICATIONS_ID_PARAM);
// adminPage.addGlobalStateParam(USER_ID_PARAM);
// adminPage.addGlobalStateParam(GROUP_ID_PARAM);
// adminPage.addGlobalStateParam(APPLICATIONS_ID_PARAM);
adminPage.add(new UserBanner());
adminPage.add(new SiteBanner());

View File

@ -21,6 +21,7 @@ package com.arsdigita.ui.admin.usersgroupsroles;
import com.arsdigita.bebop.ActionLink;
import com.arsdigita.bebop.BoxPanel;
import com.arsdigita.bebop.Form;
import com.arsdigita.bebop.Page;
import com.arsdigita.bebop.PageState;
import com.arsdigita.bebop.ParameterSingleSelectionModel;
import com.arsdigita.bebop.Text;
@ -38,44 +39,76 @@ import static com.arsdigita.ui.admin.AdminUiConstants.*;
*/
public class UserAdmin extends BoxPanel {
private final LongParameter userIdParameter;
private final ParameterSingleSelectionModel<String> selectedUserId;
private final TextField usersTableFilter;
final BoxPanel usersTablePanel;
private final UsersTable usersTable;
private final UserDetails userDetails;
public UserAdmin() {
super();
//add(new Label("User Admin class"));
usersTablePanel = new BoxPanel();
final Form filterForm = new Form("usersTableFilterForm");
usersTableFilter = new TextField("usersTableFilter");
usersTableFilter.setLabel(new GlobalizedMessage(
"ui.admin.users.table.filter.term", ADMIN_BUNDLE));
"ui.admin.users.table.filter.term", ADMIN_BUNDLE));
filterForm.add(usersTableFilter);
filterForm.add(new Submit(new GlobalizedMessage(
"ui.admin.users.table.filter.submit", ADMIN_BUNDLE)));
"ui.admin.users.table.filter.submit", ADMIN_BUNDLE)));
final ActionLink clearLink = new ActionLink(new GlobalizedMessage(
"ui.admin.users.table.filter.clear", ADMIN_BUNDLE));
"ui.admin.users.table.filter.clear", ADMIN_BUNDLE));
clearLink.addActionListener((e) -> {
final PageState state = e.getPageState();
usersTableFilter.setValue(state, null);
});
filterForm.add(clearLink);
add(filterForm);
usersTablePanel.add(filterForm);
selectedUserId = new ParameterSingleSelectionModel<>(USER_ID_PARAM);
userIdParameter = new LongParameter("selected_user_id");
selectedUserId = new ParameterSingleSelectionModel<>(userIdParameter);
//selectedUserId = new ParameterSingleSelectionModel<>(USER_ID_PARAM);
final UsersTable usersTable = new UsersTable(usersTableFilter,
selectedUserId);
add(usersTable);
usersTable = new UsersTable(this, usersTableFilter, selectedUserId);
usersTablePanel.add(usersTable);
final Text text = new Text();
text.setPrintListener((final PrintEvent e) -> {
final Text target = (Text) e.getTarget();
final PageState state = e.getPageState();
if (selectedUserId.isSelected(state)) {
target.setText(selectedUserId.getSelectedKey(state));
}
});
add(text);
add(usersTablePanel);
// final Text text = new Text();
// text.setPrintListener((final PrintEvent e) -> {
// final Text target = (Text) e.getTarget();
// final PageState state = e.getPageState();
// if (selectedUserId.isSelected(state)) {
// target.setText(selectedUserId.getSelectedKey(state));
// }
// });
// add(text);
userDetails = new UserDetails(this, selectedUserId);
add(new UserDetails(this, selectedUserId));
}
@Override
public void register(final Page page) {
super.register(page);
page.addGlobalStateParam(userIdParameter);
page.setVisibleDefault(usersTablePanel, true);
page.setVisibleDefault(userDetails, false);
}
protected void showUserDetails(final PageState state) {
usersTablePanel.setVisible(state, false);
userDetails.setVisible(state, true);
}
protected void closeUserDetails(final PageState state) {
selectedUserId.clearSelection(state);
usersTablePanel.setVisible(state, true);
userDetails.setVisible(state, false);
}
}

View File

@ -0,0 +1,60 @@
/*
* 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;
import com.arsdigita.bebop.ActionLink;
import com.arsdigita.bebop.BoxPanel;
import com.arsdigita.bebop.ParameterSingleSelectionModel;
import com.arsdigita.bebop.PropertySheet;
import com.arsdigita.globalization.GlobalizedMessage;
import static com.arsdigita.ui.admin.AdminUiConstants.*;
/**
*
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
*/
public class UserDetails extends BoxPanel {
// private final UserAdmin parent;
// private final ParameterSingleSelectionModel<String> selectedUserId;
private final ActionLink backLink;
// private final PropertySheet userProperties;
public UserDetails(
final UserAdmin parent,
final ParameterSingleSelectionModel<String> selectedUserId) {
super();
// this.parent = parent;
// this.selectedUserId = selectedUserId;
backLink = new ActionLink(new GlobalizedMessage(
"ui.admin.user_details.back", ADMIN_BUNDLE));
backLink.addActionListener(e -> {
parent.closeUserDetails(e.getPageState());
});
add(backLink);
final PropertySheet userProperties = new PropertySheet(new UserPropertySheetModelBuilder(
parent, selectedUserId));
add(userProperties);
}
}

View File

@ -0,0 +1,102 @@
/*
* 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;
import com.arsdigita.bebop.PropertySheetModel;
import com.arsdigita.globalization.GlobalizedMessage;
import java.util.Arrays;
import java.util.Iterator;
import org.libreccm.security.User;
import static com.arsdigita.ui.admin.AdminUiConstants.*;
/**
*
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
*/
public class UserPropertySheetModel implements PropertySheetModel {
private static enum UserProperty {
USER_NAME,
FAMILY_NAME,
GIVEN_NAME,
BANNED,
PASSWORD_RESET_REQUIRED,
}
private final User selectedUser;
private final Iterator<UserProperty> propertyIterator;
private UserProperty currentProperty;
public UserPropertySheetModel(final User selectedUser) {
this.selectedUser = selectedUser;
propertyIterator = Arrays.asList(UserProperty.values()).iterator();
}
@Override
public boolean nextRow() {
if (selectedUser == null) {
return false;
}
if (propertyIterator.hasNext()) {
currentProperty = propertyIterator.next();
return true;
} else {
return false;
}
}
@Override
public String getLabel() {
return currentProperty.toString();
}
@Override
public GlobalizedMessage getGlobalizedLabel() {
return generateGlobalizedLabel(currentProperty);
}
private GlobalizedMessage generateGlobalizedLabel(
final UserProperty property) {
return new GlobalizedMessage(
String.join("ui.admin.user.property_sheet.",
property.toString().toLowerCase()),
ADMIN_BUNDLE);
}
@Override
public String getValue() {
switch (currentProperty) {
case USER_NAME:
return selectedUser.getName();
case FAMILY_NAME:
return selectedUser.getFamilyName();
case GIVEN_NAME:
return selectedUser.getGivenName();
case BANNED:
return Boolean.toString(selectedUser.isBanned());
case PASSWORD_RESET_REQUIRED:
return Boolean.toString(selectedUser.isPasswordResetRequired());
default:
return "";
}
}
}

View File

@ -0,0 +1,63 @@
/*
* 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;
import com.arsdigita.bebop.PageState;
import com.arsdigita.bebop.ParameterSingleSelectionModel;
import com.arsdigita.bebop.PropertySheet;
import com.arsdigita.bebop.PropertySheetModel;
import com.arsdigita.bebop.PropertySheetModelBuilder;
import com.arsdigita.util.LockableImpl;
import org.libreccm.cdi.utils.CdiUtil;
import org.libreccm.security.User;
import org.libreccm.security.UserRepository;
/**
*
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
*/
public class UserPropertySheetModelBuilder
extends LockableImpl implements PropertySheetModelBuilder {
private final ParameterSingleSelectionModel<String> selectedUserId;
public UserPropertySheetModelBuilder(
final UserAdmin parent,
final ParameterSingleSelectionModel<String> selectedUserId) {
this.selectedUserId = selectedUserId;
}
@Override
public PropertySheetModel makeModel(final PropertySheet sheet,
final PageState state) {
final String userIdStr = selectedUserId.getSelectedKey(state);
final User selectedUser;
if (userIdStr == null || userIdStr.isEmpty()) {
selectedUser = null;
} else {
final UserRepository userRepository = CdiUtil.createCdiUtil().
findBean(
UserRepository.class);
final long userId = Long.parseLong(userIdStr);
selectedUser = userRepository.findById(userId);
}
return new UserPropertySheetModel(selectedUser);
}
}

View File

@ -24,7 +24,6 @@ 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.TableActionAdapter;
import com.arsdigita.bebop.event.TableActionEvent;
import com.arsdigita.bebop.event.TableActionListener;
import com.arsdigita.bebop.form.TextField;
@ -63,7 +62,8 @@ public class UsersTable extends Table {
private final TextField usersTableFilter;
private final ParameterSingleSelectionModel<String> selectedUserId;
public UsersTable(final TextField usersTableFilter,
public UsersTable(final UserAdmin parent,
final TextField usersTableFilter,
final ParameterSingleSelectionModel<String> selectedUserId) {
super();
@ -71,51 +71,56 @@ public class UsersTable extends Table {
this.selectedUserId = selectedUserId;
setEmptyView(new Label(new GlobalizedMessage(
"ui.admin.users.table.no_users", ADMIN_BUNDLE)));
"ui.admin.users.table.no_users", ADMIN_BUNDLE)));
final TableColumnModel columnModel = getColumnModel();
columnModel.add(new TableColumn(
COL_SCREEN_NAME,
new Label(new GlobalizedMessage("ui.admin.users.table.screenname",
ADMIN_BUNDLE))));
COL_SCREEN_NAME,
new Label(new GlobalizedMessage(
"ui.admin.users.table.screenname",
ADMIN_BUNDLE))));
columnModel.add(new TableColumn(
COL_GIVEN_NAME,
new Label(new GlobalizedMessage("ui.admin.users.table.givenname",
ADMIN_BUNDLE))));
COL_GIVEN_NAME,
new Label(
new GlobalizedMessage("ui.admin.users.table.givenname",
ADMIN_BUNDLE))));
columnModel.add(new TableColumn(
COL_FAMILY_NAME,
new Label(new GlobalizedMessage("ui.admin.users.table.familyname",
ADMIN_BUNDLE))));
COL_FAMILY_NAME,
new Label(new GlobalizedMessage(
"ui.admin.users.table.familyname",
ADMIN_BUNDLE))));
columnModel.add(new TableColumn(
COL_PRIMARY_EMAIL,
new Label(new GlobalizedMessage(
"ui.admin.users.table.primary_email", ADMIN_BUNDLE))));
COL_PRIMARY_EMAIL,
new Label(new GlobalizedMessage(
"ui.admin.users.table.primary_email", ADMIN_BUNDLE))));
columnModel.add(new TableColumn(
COL_BANNED,
new Label(new GlobalizedMessage(
"ui.admin.users.table.banned", ADMIN_BUNDLE))));
columnModel.get(COL_SCREEN_NAME).setCellRenderer(new TableCellRenderer() {
COL_BANNED,
new Label(new GlobalizedMessage(
"ui.admin.users.table.banned", ADMIN_BUNDLE))));
columnModel.get(COL_SCREEN_NAME).setCellRenderer(
new TableCellRenderer() {
@Override
public Component getComponent(final Table table,
public Component getComponent(final Table table,
final PageState state,
final Object value,
final Object value,
final boolean isSelected,
final Object key,
final int row,
final Object key,
final int row,
final int column) {
return new ControlLink((String) value);
}
});
addTableActionListener(new TableActionListener() {
@Override
public void cellSelected(final TableActionEvent event) {
final PageState state = event.getPageState();
final String key = (String) event.getRowKey();
selectedUserId.setSelectedKey(event.getPageState(), key);
selectedUserId.setSelectedKey(state, key);
parent.showUserDetails(state);
}
@Override
@ -123,12 +128,12 @@ public class UsersTable extends Table {
//Nothing
}
});
setModelBuilder(new UsersTableModelBuilder());
}
private class UsersTableModelBuilder extends LockableImpl
implements TableModelBuilder {
implements TableModelBuilder {
@Override
public TableModel makeModel(final Table table, final PageState state) {
@ -147,17 +152,17 @@ public class UsersTable extends Table {
public UsersTableModel(final PageState state) {
LOGGER.debug("Creating UsersTableModel...");
final String filterTerm = (String) usersTableFilter
.getValue(state);
.getValue(state);
LOGGER.debug("Value of filter is: \"{}\"", filterTerm);
final UserRepository userRepository = CdiUtil.createCdiUtil()
.findBean(UserRepository.class);
.findBean(UserRepository.class);
if (filterTerm == null || filterTerm.isEmpty()) {
users = userRepository.findAll();
LOGGER.debug("Found {} users in database.", users.size());
} else {
users = userRepository.filtered(filterTerm);
LOGGER.debug("Found {} users in database which match the "
+ "filter \"{}\".",
+ "filter \"{}\".",
users.size(),
filterTerm);
}
@ -198,7 +203,7 @@ public class UsersTable extends Table {
return user.getName();
default:
throw new IllegalArgumentException(
"No a valid column index.");
"No a valid column index.");
}
}

View File

@ -169,3 +169,14 @@ ui.admin.users.table.filter.term=Filter users
ui.admin.users.table.filter.submit=Apply
ui.admin.users.table.no_users=No users matching users found.
ui.admin.users.table.filter.clear=Clear filter
ui.admin.user.property_sheet.username=User name
ui.admin.user.property_sheet.primary_email=Primary email address
ui.admin.user.property_sheet.additional_emails=Additional email addresses
ui.admin.user.property_sheet.banned=Banned?
ui.admin.user.property_sheet.password_reset_required=Password reset required?
ui.admin.user.property_sheet.groups=Groups
ui.admin.user.property_sheet.direct_roles=Assigned roles
ui.admin.user.property_sheet.all_roles=Roles
ui.admin.user.property_sheet.family_name=Family name
ui.admin.user.property_sheet.given_name=Given name
ui.admin.user_details.back=Back to users table

View File

@ -169,3 +169,14 @@ ui.admin.users.table.filter.term=Benutzer filtern
ui.admin.users.table.filter.submit=Anwenden
ui.admin.users.table.no_users=Keine auf den aktuellen Filter passenden Benutzer gefunden.
ui.admin.users.table.filter.clear=Filter zur\u00fccksetzen
ui.admin.user.property_sheet.username=Benutzername
ui.admin.user.property_sheet.primary_email=Prim\u00e4re E-Mail-Adresse
ui.admin.user.property_sheet.additional_emails=Weitere E-Mail-Adressen
ui.admin.user.property_sheet.banned=Gesperrt?
ui.admin.user.property_sheet.password_reset_required=Neues Passwort erforderlich?
ui.admin.user.property_sheet.groups=Gruppen
ui.admin.user.property_sheet.direct_roles=Zugewiesene Rollen
ui.admin.user.property_sheet.all_roles=Rollen
ui.admin.user.property_sheet.family_name=Familienname
ui.admin.user.property_sheet.given_name=Vorname
ui.admin.user_details.back=Zur\u00fcck zur Benutzer\u00fcbersicht

View File

@ -142,3 +142,14 @@ ui.admin.users.table.filter.term=Filter users
ui.admin.users.table.filter.submit=Apply
ui.admin.users.table.no_users=No users matching users found.
ui.admin.users.table.filter.clear=Clear filter
ui.admin.user.property_sheet.username=User name
ui.admin.user.property_sheet.primary_email=Primary email address
ui.admin.user.property_sheet.additional_emails=Additional emails addresses
ui.admin.user.property_sheet.banned=Banned?
ui.admin.user.property_sheet.password_reset_required=Password reset required
ui.admin.user.property_sheet.groups=Groups
ui.admin.user.property_sheet.direct_roles=Assigned roles
ui.admin.user.property_sheet.all_roles=Roles
ui.admin.user.property_sheet.family_name=Family name
ui.admin.user.property_sheet.given_name=Given name
ui.admin.user_details.back=Back to users table

View File

@ -133,3 +133,14 @@ ui.admin.users.table.filter.term=Filter users
ui.admin.users.table.filter.submit=Apply
ui.admin.users.table.no_users=No users matching users found.
ui.admin.users.table.filter.clear=Clear filter
ui.admin.user.property_sheet.username=User name
ui.admin.user.property_sheet.primary_email=Primary email address
ui.admin.user.property_sheet.additional_emails=Additional email addresses
ui.admin.user.property_sheet.banned=Banned?
ui.admin.user.property_sheet.password_reset_required=Password reset required?
ui.admin.user.property_sheet.groups=Groups
ui.admin.user.property_sheet.direct_roles=Assigned roles
ui.admin.user.property_sheet.all_roles=Roles
ui.admin.user.property_sheet.family_name=Family name
ui.admin.user.property_sheet.given_name=Given name
ui.admin.user_details.back=Back to users table