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,51 +71,56 @@ 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,
final PageState state, final PageState state,
final Object value, final Object value,
final boolean isSelected, final boolean isSelected,
final Object key, final Object key,
final int row, final int row,
final int column) { final int column) {
return new ControlLink((String) value); return new ControlLink((String) value);
} }
}); });
addTableActionListener(new TableActionListener() { addTableActionListener(new TableActionListener() {
@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
@ -123,12 +128,12 @@ public class UsersTable extends Table {
//Nothing //Nothing
} }
}); });
setModelBuilder(new UsersTableModelBuilder()); setModelBuilder(new UsersTableModelBuilder());
} }
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