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 // addPage("/index.jsp", buildIndexPage()); // index page at address ~/ds
adminPage = PageFactory.buildPage("admin", "LibreCCM NG Admin"); adminPage = PageFactory.buildPage("admin", "LibreCCM NG Admin");
adminPage.addGlobalStateParam(USER_ID_PARAM); // adminPage.addGlobalStateParam(USER_ID_PARAM);
adminPage.addGlobalStateParam(GROUP_ID_PARAM); // adminPage.addGlobalStateParam(GROUP_ID_PARAM);
adminPage.addGlobalStateParam(APPLICATIONS_ID_PARAM); // adminPage.addGlobalStateParam(APPLICATIONS_ID_PARAM);
adminPage.add(new UserBanner()); adminPage.add(new UserBanner());
adminPage.add(new SiteBanner()); 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.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.Page;
import com.arsdigita.bebop.PageState; import com.arsdigita.bebop.PageState;
import com.arsdigita.bebop.ParameterSingleSelectionModel; import com.arsdigita.bebop.ParameterSingleSelectionModel;
import com.arsdigita.bebop.Text; import com.arsdigita.bebop.Text;
@ -38,44 +39,76 @@ import static com.arsdigita.ui.admin.AdminUiConstants.*;
*/ */
public class UserAdmin extends BoxPanel { public class UserAdmin extends BoxPanel {
private final LongParameter userIdParameter;
private final ParameterSingleSelectionModel<String> selectedUserId; private final ParameterSingleSelectionModel<String> selectedUserId;
private final TextField usersTableFilter; private final TextField usersTableFilter;
final BoxPanel usersTablePanel;
private final UsersTable usersTable;
private final UserDetails userDetails;
public UserAdmin() { public UserAdmin() {
super(); super();
//add(new Label("User Admin class")); usersTablePanel = new BoxPanel();
final Form filterForm = new Form("usersTableFilterForm"); final Form filterForm = new Form("usersTableFilterForm");
usersTableFilter = new TextField("usersTableFilter"); usersTableFilter = new TextField("usersTableFilter");
usersTableFilter.setLabel(new GlobalizedMessage( 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(usersTableFilter);
filterForm.add(new Submit(new GlobalizedMessage( 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( 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) -> { clearLink.addActionListener((e) -> {
final PageState state = e.getPageState(); final PageState state = e.getPageState();
usersTableFilter.setValue(state, null); usersTableFilter.setValue(state, null);
}); });
filterForm.add(clearLink); 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, usersTable = new UsersTable(this, usersTableFilter, selectedUserId);
selectedUserId); usersTablePanel.add(usersTable);
add(usersTable);
final Text text = new Text(); add(usersTablePanel);
text.setPrintListener((final PrintEvent e) -> {
final Text target = (Text) e.getTarget(); // final Text text = new Text();
final PageState state = e.getPageState(); // text.setPrintListener((final PrintEvent e) -> {
if (selectedUserId.isSelected(state)) { // final Text target = (Text) e.getTarget();
target.setText(selectedUserId.getSelectedKey(state)); // final PageState state = e.getPageState();
} // if (selectedUserId.isSelected(state)) {
}); // target.setText(selectedUserId.getSelectedKey(state));
add(text); // }
// });
// 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.PageState;
import com.arsdigita.bebop.ParameterSingleSelectionModel; import com.arsdigita.bebop.ParameterSingleSelectionModel;
import com.arsdigita.bebop.Table; import com.arsdigita.bebop.Table;
import com.arsdigita.bebop.event.TableActionAdapter;
import com.arsdigita.bebop.event.TableActionEvent; import com.arsdigita.bebop.event.TableActionEvent;
import com.arsdigita.bebop.event.TableActionListener; import com.arsdigita.bebop.event.TableActionListener;
import com.arsdigita.bebop.form.TextField; import com.arsdigita.bebop.form.TextField;
@ -63,7 +62,8 @@ public class UsersTable extends Table {
private final TextField usersTableFilter; private final TextField usersTableFilter;
private final ParameterSingleSelectionModel<String> selectedUserId; private final ParameterSingleSelectionModel<String> selectedUserId;
public UsersTable(final TextField usersTableFilter, public UsersTable(final UserAdmin parent,
final TextField usersTableFilter,
final ParameterSingleSelectionModel<String> selectedUserId) { final ParameterSingleSelectionModel<String> selectedUserId) {
super(); super();
@ -71,31 +71,35 @@ public class UsersTable extends Table {
this.selectedUserId = selectedUserId; this.selectedUserId = selectedUserId;
setEmptyView(new Label(new GlobalizedMessage( 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(); final TableColumnModel columnModel = getColumnModel();
columnModel.add(new TableColumn( columnModel.add(new TableColumn(
COL_SCREEN_NAME, COL_SCREEN_NAME,
new Label(new GlobalizedMessage("ui.admin.users.table.screenname", new Label(new GlobalizedMessage(
ADMIN_BUNDLE)))); "ui.admin.users.table.screenname",
ADMIN_BUNDLE))));
columnModel.add(new TableColumn( columnModel.add(new TableColumn(
COL_GIVEN_NAME, COL_GIVEN_NAME,
new Label(new GlobalizedMessage("ui.admin.users.table.givenname", new Label(
ADMIN_BUNDLE)))); new GlobalizedMessage("ui.admin.users.table.givenname",
ADMIN_BUNDLE))));
columnModel.add(new TableColumn( columnModel.add(new TableColumn(
COL_FAMILY_NAME, COL_FAMILY_NAME,
new Label(new GlobalizedMessage("ui.admin.users.table.familyname", new Label(new GlobalizedMessage(
ADMIN_BUNDLE)))); "ui.admin.users.table.familyname",
ADMIN_BUNDLE))));
columnModel.add(new TableColumn( columnModel.add(new TableColumn(
COL_PRIMARY_EMAIL, COL_PRIMARY_EMAIL,
new Label(new GlobalizedMessage( new Label(new GlobalizedMessage(
"ui.admin.users.table.primary_email", ADMIN_BUNDLE)))); "ui.admin.users.table.primary_email", ADMIN_BUNDLE))));
columnModel.add(new TableColumn( columnModel.add(new TableColumn(
COL_BANNED, COL_BANNED,
new Label(new GlobalizedMessage( new Label(new GlobalizedMessage(
"ui.admin.users.table.banned", ADMIN_BUNDLE)))); "ui.admin.users.table.banned", ADMIN_BUNDLE))));
columnModel.get(COL_SCREEN_NAME).setCellRenderer(new TableCellRenderer() { columnModel.get(COL_SCREEN_NAME).setCellRenderer(
new TableCellRenderer() {
@Override @Override
public Component getComponent(final Table table, public Component getComponent(final Table table,
@ -113,9 +117,10 @@ public class UsersTable extends Table {
@Override @Override
public void cellSelected(final TableActionEvent event) { public void cellSelected(final TableActionEvent event) {
final PageState state = event.getPageState();
final String key = (String) event.getRowKey(); final String key = (String) event.getRowKey();
selectedUserId.setSelectedKey(state, key);
selectedUserId.setSelectedKey(event.getPageState(), key); parent.showUserDetails(state);
} }
@Override @Override
@ -128,7 +133,7 @@ public class UsersTable extends Table {
} }
private class UsersTableModelBuilder extends LockableImpl private class UsersTableModelBuilder extends LockableImpl
implements TableModelBuilder { implements TableModelBuilder {
@Override @Override
public TableModel makeModel(final Table table, final PageState state) { public TableModel makeModel(final Table table, final PageState state) {
@ -147,17 +152,17 @@ public class UsersTable extends Table {
public UsersTableModel(final PageState state) { public UsersTableModel(final PageState state) {
LOGGER.debug("Creating UsersTableModel..."); LOGGER.debug("Creating UsersTableModel...");
final String filterTerm = (String) usersTableFilter final String filterTerm = (String) usersTableFilter
.getValue(state); .getValue(state);
LOGGER.debug("Value of filter is: \"{}\"", filterTerm); LOGGER.debug("Value of filter is: \"{}\"", filterTerm);
final UserRepository userRepository = CdiUtil.createCdiUtil() final UserRepository userRepository = CdiUtil.createCdiUtil()
.findBean(UserRepository.class); .findBean(UserRepository.class);
if (filterTerm == null || filterTerm.isEmpty()) { if (filterTerm == null || filterTerm.isEmpty()) {
users = userRepository.findAll(); users = userRepository.findAll();
LOGGER.debug("Found {} users in database.", users.size()); LOGGER.debug("Found {} users in database.", users.size());
} else { } else {
users = userRepository.filtered(filterTerm); users = userRepository.filtered(filterTerm);
LOGGER.debug("Found {} users in database which match the " LOGGER.debug("Found {} users in database which match the "
+ "filter \"{}\".", + "filter \"{}\".",
users.size(), users.size(),
filterTerm); filterTerm);
} }
@ -198,7 +203,7 @@ public class UsersTable extends Table {
return user.getName(); return user.getName();
default: default:
throw new IllegalArgumentException( 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.filter.submit=Apply
ui.admin.users.table.no_users=No users matching users found. ui.admin.users.table.no_users=No users matching users found.
ui.admin.users.table.filter.clear=Clear filter 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.filter.submit=Anwenden
ui.admin.users.table.no_users=Keine auf den aktuellen Filter passenden Benutzer gefunden. 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.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.filter.submit=Apply
ui.admin.users.table.no_users=No users matching users found. ui.admin.users.table.no_users=No users matching users found.
ui.admin.users.table.filter.clear=Clear filter 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.filter.submit=Apply
ui.admin.users.table.no_users=No users matching users found. ui.admin.users.table.no_users=No users matching users found.
ui.admin.users.table.filter.clear=Clear filter 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