CCM NG/ccm-core: GroupsTable for the Vaadin prototype

git-svn-id: https://svn.libreccm.org/ccm/ccm_ng@4741 8810af33-2d31-482b-a856-94f89814c4df
pull/2/head
jensp 2017-05-17 17:58:33 +00:00
parent cf6a8653a0
commit 415a68c7cf
7 changed files with 591 additions and 195 deletions

View File

@ -34,6 +34,7 @@ import com.vaadin.ui.Label;
import com.vaadin.ui.TabSheet; import com.vaadin.ui.TabSheet;
import com.vaadin.ui.VerticalLayout; import com.vaadin.ui.VerticalLayout;
import org.apache.shiro.subject.Subject; import org.apache.shiro.subject.Subject;
import org.libreccm.admin.ui.usersgroupsroles.GroupsTableDataProvider;
import org.libreccm.admin.ui.usersgroupsroles.UsersGroupsRoles; import org.libreccm.admin.ui.usersgroupsroles.UsersGroupsRoles;
import org.libreccm.admin.ui.usersgroupsroles.UsersTableDataProvider; import org.libreccm.admin.ui.usersgroupsroles.UsersTableDataProvider;
import org.libreccm.l10n.GlobalizationHelper; import org.libreccm.l10n.GlobalizationHelper;
@ -83,6 +84,9 @@ public class AdminView extends CustomComponent implements View {
@Inject @Inject
private UsersTableDataProvider usersTableDataProvider; private UsersTableDataProvider usersTableDataProvider;
@Inject
private GroupsTableDataProvider groupsTableDataProvider;
private ResourceBundle bundle; private ResourceBundle bundle;
@Inject @Inject
@ -99,38 +103,6 @@ public class AdminView extends CustomComponent implements View {
tabSheet = new TabSheet(); tabSheet = new TabSheet();
// final TabSheet userGroupsRoles = new TabSheet();
// usersTable = new Grid<>();
// usersTable.setWidth("100%");
//// usersTable.setItems(userRepo.findAll());
// usersTable.addColumn(User::getName)
// .setId(COL_USER_NAME)
// .setCaption("User name");
// usersTable
// .addColumn(User::getGivenName)
// .setId(COL_GIVEN_NAME)
// .setCaption("Given name");
// usersTable
// .addColumn(User::getFamilyName)
// .setId(COL_FAMILY_NAME)
// .setCaption("Family name");
// usersTable
// .addColumn(user -> user.getPrimaryEmailAddress().getAddress())
// .setId(COL_EMAIL)
// .setCaption("E-Mail");
// usersTable
// .addColumn(user -> {
// if (user.isBanned()) {
// return bundle.getString("ui.admin.user.banned_yes");
// } else {
// return bundle.getString("ui.admin.user.banned_no");
// }
// })
// .setId(COL_BANNED)
// .setCaption("Banned?");
// userGroupsRoles.addTab(usersTable, "Users");
//
// tabSheet.addTab(userGroupsRoles, "Users/Groups/Roles");
usersGroupsRoles = new UsersGroupsRoles(this); usersGroupsRoles = new UsersGroupsRoles(this);
tabUsersGroupsRoles = tabSheet.addTab(usersGroupsRoles, tabUsersGroupsRoles = tabSheet.addTab(usersGroupsRoles,
"Users/Groups/Roles"); "Users/Groups/Roles");
@ -199,7 +171,8 @@ public class AdminView extends CustomComponent implements View {
.getBundle(AdminUiConstants.ADMIN_BUNDLE, .getBundle(AdminUiConstants.ADMIN_BUNDLE,
globalizationHelper.getNegotiatedLocale()); globalizationHelper.getNegotiatedLocale());
usersGroupsRoles.setDataProvider(usersTableDataProvider); usersGroupsRoles.setUsersTableDataProvider(usersTableDataProvider);
usersGroupsRoles.setGroupsTableDataProvider(groupsTableDataProvider);
tabUsersGroupsRoles.setCaption(bundle tabUsersGroupsRoles.setCaption(bundle
.getString("ui.admin.tab.users_groups_roles.title")); .getString("ui.admin.tab.users_groups_roles.title"));

View File

@ -0,0 +1,132 @@
/*
* Copyright (C) 2017 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 org.libreccm.admin.ui.usersgroupsroles;
import com.arsdigita.ui.admin.AdminUiConstants;
import com.vaadin.icons.VaadinIcons;
import com.vaadin.ui.Button;
import com.vaadin.ui.Grid;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.TextField;
import com.vaadin.ui.UI;
import com.vaadin.ui.components.grid.HeaderCell;
import com.vaadin.ui.components.grid.HeaderRow;
import com.vaadin.ui.renderers.ButtonRenderer;
import com.vaadin.ui.themes.ValoTheme;
import org.libreccm.admin.ui.AdminView;
import org.libreccm.security.Group;
import java.util.ResourceBundle;
/**
*
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
*/
public class GroupsTable extends Grid<Group> {
private static final long serialVersionUID = 2731047837262813862L;
private final static String COL_NAME = "name";
private final static String COL_EDIT = "edit";
private final static String COL_DELETE = "delete";
private final TextField groupNameFilter;
private final Button clearFiltersButton;
private final Button createGroupButton;
public GroupsTable(final AdminView view,
final UsersGroupsRoles usersGroupsRoles) {
super();
final ResourceBundle bundle = ResourceBundle
.getBundle(AdminUiConstants.ADMIN_BUNDLE,
UI.getCurrent().getLocale());
addColumn(Group::getName)
.setId(COL_NAME)
.setCaption("Name");
addColumn(user -> bundle.getString("ui.admin.groups.table.edit"),
new ButtonRenderer<>(event -> {
//ToDo Open GroupEditor window
}))
.setId(COL_EDIT);
addColumn(user -> bundle.getString("ui.admin.groups.table.delete"),
new ButtonRenderer<>(event -> {
//ToDo Display Confirm dialog
}))
.setId(COL_DELETE);
final HeaderRow filterRow = appendHeaderRow();
final HeaderCell GroupNameFilterCell = filterRow.getCell(COL_NAME);
groupNameFilter = new TextField();
groupNameFilter.setPlaceholder("User name");
groupNameFilter.setDescription("Filter Groups by Groupname");
groupNameFilter.addStyleName(ValoTheme.TEXTFIELD_TINY);
groupNameFilter
.addValueChangeListener(event -> {
((GroupsTableDataProvider) getDataProvider())
.setGroupNameFilter(event.getValue().toLowerCase());
});
GroupNameFilterCell.setComponent(groupNameFilter);
final HeaderRow actionsRow = prependHeaderRow();
final HeaderCell actionsCell = actionsRow.join(COL_NAME,
COL_EDIT,
COL_DELETE);
clearFiltersButton = new Button("Clear filters");
clearFiltersButton.setStyleName(ValoTheme.BUTTON_TINY);
clearFiltersButton.setIcon(VaadinIcons.BACKSPACE);
clearFiltersButton.addClickListener(event -> {
groupNameFilter.setValue("");
});
createGroupButton = new Button("New group");
createGroupButton.setStyleName(ValoTheme.BUTTON_TINY);
createGroupButton.setIcon(VaadinIcons.PLUS);
createGroupButton.addClickListener(event -> {
//ToDo Open GroupEditor
});
final HorizontalLayout actionsLayout = new HorizontalLayout(
clearFiltersButton,
createGroupButton);
actionsCell.setComponent(actionsLayout);
}
public void localize() {
final ResourceBundle bundle = ResourceBundle
.getBundle(AdminUiConstants.ADMIN_BUNDLE,
UI.getCurrent().getLocale());
getColumn(COL_NAME)
.setCaption(bundle.getString("ui.admin.groups.table.name"));
groupNameFilter.setPlaceholder(
bundle
.getString("ui.admin.users.table.filter.groupname.placeholder"));
groupNameFilter.setDescription(bundle
.getString("ui.admin.users.table.filter.groupname.description"));
clearFiltersButton.setCaption(bundle
.getString("ui.admin.users.table.filter.clear"));
}
}

View File

@ -0,0 +1,104 @@
/*
* Copyright (C) 2017 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 org.libreccm.admin.ui.usersgroupsroles;
import com.vaadin.cdi.ViewScoped;
import com.vaadin.data.provider.AbstractDataProvider;
import com.vaadin.data.provider.Query;
import org.libreccm.security.Group;
import java.util.stream.Stream;
import javax.inject.Inject;
import javax.persistence.EntityManager;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;
import javax.transaction.Transactional;
/**
*
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
*/
@ViewScoped
public class GroupsTableDataProvider extends AbstractDataProvider<Group, String> {
private static final long serialVersionUID = 7341726757450723593L;
@Inject
private EntityManager entityManager;
private String groupNameFilter;
@Override
public boolean isInMemory() {
return false;
}
@Transactional(Transactional.TxType.REQUIRED)
@Override
public int size(final Query<Group, String> query) {
final CriteriaBuilder builder = entityManager.getCriteriaBuilder();
CriteriaQuery<Long> criteriaQuery = builder.createQuery(Long.class);
final Root<Group> from = criteriaQuery.from(Group.class);
criteriaQuery = criteriaQuery.select(builder.count(from));
if (groupNameFilter != null && !groupNameFilter.trim().isEmpty()) {
criteriaQuery
.where(builder.like(builder.lower(from.get("name")),
String.format("%s%%", groupNameFilter)));
}
return entityManager
.createQuery(criteriaQuery)
.getSingleResult()
.intValue();
}
@Transactional(Transactional.TxType.REQUIRED)
@Override
public Stream<Group> fetch(final Query<Group, String> query) {
final CriteriaBuilder builder = entityManager.getCriteriaBuilder();
final CriteriaQuery<Group> criteriaQuery = builder
.createQuery(Group.class);
final Root<Group> from = criteriaQuery.from(Group.class);
if (groupNameFilter != null && !groupNameFilter.trim().isEmpty()) {
criteriaQuery
.where(builder.like(builder.lower(from.get("name")),
String.format("%s%%", groupNameFilter)));
}
return entityManager
.createQuery(criteriaQuery)
.setMaxResults(query.getLimit())
.setFirstResult(query.getOffset())
.getResultList()
.stream();
}
public void setGroupNameFilter(final String groupNameFilter) {
this.groupNameFilter = groupNameFilter;
refreshAll();
}
}

View File

@ -436,7 +436,9 @@ public class UserEditor extends Window {
} }
dataHasChanged = false; dataHasChanged = false;
if (usersGroupsRoles != null) {
usersGroupsRoles.refreshUsers(); usersGroupsRoles.refreshUsers();
}
close(); close();
} }

View File

@ -20,22 +20,10 @@ package org.libreccm.admin.ui.usersgroupsroles;
import com.arsdigita.ui.admin.AdminUiConstants; import com.arsdigita.ui.admin.AdminUiConstants;
import com.vaadin.icons.VaadinIcons;
import com.vaadin.ui.Button;
import com.vaadin.ui.CustomComponent; import com.vaadin.ui.CustomComponent;
import com.vaadin.ui.Grid;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.TabSheet; import com.vaadin.ui.TabSheet;
import com.vaadin.ui.TextField;
import com.vaadin.ui.UI; import com.vaadin.ui.UI;
import com.vaadin.ui.Window;
import com.vaadin.ui.components.grid.HeaderCell;
import com.vaadin.ui.components.grid.HeaderRow;
import com.vaadin.ui.renderers.ButtonRenderer;
import com.vaadin.ui.themes.ValoTheme;
import org.libreccm.admin.ui.AdminView; import org.libreccm.admin.ui.AdminView;
import org.libreccm.security.User;
import org.libreccm.security.UserRepository;
import java.util.ResourceBundle; import java.util.ResourceBundle;
@ -47,26 +35,30 @@ public class UsersGroupsRoles extends CustomComponent {
private static final long serialVersionUID = 7280416743018127366L; private static final long serialVersionUID = 7280416743018127366L;
private static final String COL_USER_NAME = "username"; // private static final String COL_USER_NAME = "username";
private static final String COL_GIVEN_NAME = "given_name"; // private static final String COL_GIVEN_NAME = "given_name";
private static final String COL_FAMILY_NAME = "family_name"; // private static final String COL_FAMILY_NAME = "family_name";
private static final String COL_EMAIL = "email"; // private static final String COL_EMAIL = "email";
private static final String COL_BANNED = "banned"; // private static final String COL_BANNED = "banned";
private static final String COL_PASSWORD_RESET_REQUIRED // private static final String COL_PASSWORD_RESET_REQUIRED
= "password_reset_required"; // = "password_reset_required";
private static final String COL_EDIT = "edit"; // private static final String COL_EDIT = "edit";
private static final String COL_DELETE = "delete"; // private static final String COL_DELETE = "delete";
private final AdminView view; private final AdminView view;
private final TabSheet tabSheet; private final TabSheet tabSheet;
private final Grid<User> usersTable; // private final Grid<User> usersTable;
private final TextField userNameFilter; // private final TextField userNameFilter;
private final Button clearFiltersButton; // private final Button clearFiltersButton;
private final Button createUserButton; // private final Button createUserButton;
private final UsersTable usersTable;
private final GroupsTable groupsTable;
private UsersTableDataProvider usersTableDataProvider; private UsersTableDataProvider usersTableDataProvider;
private GroupsTableDataProvider groupsTableDataProvider;
public UsersGroupsRoles(final AdminView view) { public UsersGroupsRoles(final AdminView view) {
@ -77,101 +69,107 @@ public class UsersGroupsRoles extends CustomComponent {
UI.getCurrent().getLocale()); UI.getCurrent().getLocale());
tabSheet = new TabSheet(); tabSheet = new TabSheet();
usersTable = new Grid<>(); // usersTable = new Grid<>();
// usersTable.setWidth("100%");
// usersTable.addColumn(User::getName)
// .setId(COL_USER_NAME)
// .setCaption("User name");
// usersTable
// .addColumn(User::getGivenName)
// .setId(COL_GIVEN_NAME)
// .setCaption("Given name");
// usersTable
// .addColumn(User::getFamilyName)
// .setId(COL_FAMILY_NAME)
// .setCaption("Family name");
// usersTable
// .addColumn(user -> user.getPrimaryEmailAddress().getAddress())
// .setId(COL_EMAIL)
// .setCaption("E-Mail");
// usersTable
// .addColumn(user -> {
// if (user.isBanned()) {
// return bundle.getString("ui.admin.user.banned_yes");
// } else {
// return bundle.getString("ui.admin.user.banned_no");
// }
// })
// .setId(COL_BANNED)
// .setCaption("Banned?");
// usersTable
// .addColumn(user -> {
// if (user.isPasswordResetRequired()) {
// return bundle.getString(
// "ui.admin.user.password_reset_required_yes");
// } else {
// return bundle.getString(
// "ui.admin.user.password_reset_required_no");
// }
// })
// .setId(COL_PASSWORD_RESET_REQUIRED)
// .setCaption("Password reset required");
// usersTable
// .addColumn(user -> bundle.getString("ui.admin.users.table.edit"),
// new ButtonRenderer<>(event -> {
// final UserEditor editor = new UserEditor(
// event.getItem(),
// this,
// view.getUserRepository(),
// view.getUserManager());
// editor.center();
// UI.getCurrent().addWindow(editor);
// }))
// .setId(COL_EDIT);
//
// final HeaderRow filterRow = usersTable.appendHeaderRow();
// final HeaderCell userNameFilterCell = filterRow.getCell(COL_USER_NAME);
// userNameFilter = new TextField();
// userNameFilter.setPlaceholder("User name");
// userNameFilter.setDescription("Filter users by username");
// userNameFilter.addStyleName(ValoTheme.TEXTFIELD_TINY);
// userNameFilter
// .addValueChangeListener(event -> {
// usersTableDataProvider
// .setUserNameFilter(event.getValue().toLowerCase());
// });
// userNameFilterCell.setComponent(userNameFilter);
//
// final HeaderRow actionsRow = usersTable.prependHeaderRow();
// final HeaderCell actionsCell = actionsRow.join(COL_USER_NAME,
// COL_GIVEN_NAME,
// COL_FAMILY_NAME,
// COL_EMAIL,
// COL_BANNED);
// clearFiltersButton = new Button("Clear filters");
// clearFiltersButton.addStyleName(ValoTheme.BUTTON_TINY);
// clearFiltersButton.addClickListener(event -> {
//// usersTableDataProvider.setUserNameFilter(null);
// userNameFilter.setValue("");
// });
// createUserButton = new Button("New User");
// createUserButton.addStyleName(ValoTheme.BUTTON_TINY);
// createUserButton.setIcon(VaadinIcons.PLUS);
// createUserButton.addClickListener(event -> {
// final UserEditor userEditor = new UserEditor(
// this,
// view.getUserRepository(),
// view.getUserManager());
// userEditor.center();
// UI.getCurrent().addWindow(userEditor);
// });
// final HorizontalLayout actionsLayout = new HorizontalLayout(
// clearFiltersButton,
// createUserButton);
// actionsCell.setComponent(actionsLayout);
usersTable = new UsersTable(view, this);
usersTable.setWidth("100%"); usersTable.setWidth("100%");
// usersTable.setItems(userRepo.findAll());
usersTable.addColumn(User::getName)
.setId(COL_USER_NAME)
.setCaption("User name");
usersTable
.addColumn(User::getGivenName)
.setId(COL_GIVEN_NAME)
.setCaption("Given name");
usersTable
.addColumn(User::getFamilyName)
.setId(COL_FAMILY_NAME)
.setCaption("Family name");
usersTable
.addColumn(user -> user.getPrimaryEmailAddress().getAddress())
.setId(COL_EMAIL)
.setCaption("E-Mail");
usersTable
.addColumn(user -> {
if (user.isBanned()) {
return bundle.getString("ui.admin.user.banned_yes");
} else {
return bundle.getString("ui.admin.user.banned_no");
}
})
.setId(COL_BANNED)
.setCaption("Banned?");
usersTable
.addColumn(user -> {
if (user.isPasswordResetRequired()) {
return bundle.getString(
"ui.admin.user.password_reset_required_yes");
} else {
return bundle.getString(
"ui.admin.user.password_reset_required_no");
}
})
.setId(COL_PASSWORD_RESET_REQUIRED)
.setCaption("Password reset required");
usersTable
.addColumn(user -> bundle.getString("ui.admin.users.table.edit"),
new ButtonRenderer<>(event -> {
final UserEditor editor = new UserEditor(
event.getItem(),
this,
view.getUserRepository(),
view.getUserManager());
editor.center();
UI.getCurrent().addWindow(editor);
}))
.setId(COL_EDIT);
final HeaderRow filterRow = usersTable.appendHeaderRow(); groupsTable = new GroupsTable(view, this);
final HeaderCell userNameFilterCell = filterRow.getCell(COL_USER_NAME); groupsTable.setWidth("100%");
userNameFilter = new TextField();
userNameFilter.setPlaceholder("User name");
userNameFilter.setDescription("Filter users by username");
userNameFilter.addStyleName(ValoTheme.TEXTFIELD_TINY);
userNameFilter
.addValueChangeListener(event -> {
usersTableDataProvider
.setUserNameFilter(event.getValue().toLowerCase());
});
userNameFilterCell.setComponent(userNameFilter);
final HeaderRow actionsRow = usersTable.prependHeaderRow();
final HeaderCell actionsCell = actionsRow.join(COL_USER_NAME,
COL_GIVEN_NAME,
COL_FAMILY_NAME,
COL_EMAIL,
COL_BANNED);
clearFiltersButton = new Button("Clear filters");
clearFiltersButton.addStyleName(ValoTheme.BUTTON_TINY);
clearFiltersButton.addClickListener(event -> {
// usersTableDataProvider.setUserNameFilter(null);
userNameFilter.setValue("");
});
createUserButton = new Button("New User");
createUserButton.addStyleName(ValoTheme.BUTTON_TINY);
createUserButton.setIcon(VaadinIcons.PLUS);
createUserButton.addClickListener(event -> {
final UserEditor userEditor = new UserEditor(
this,
view.getUserRepository(),
view.getUserManager());
userEditor.center();
UI.getCurrent().addWindow(userEditor);
});
final HorizontalLayout actionsLayout = new HorizontalLayout(
clearFiltersButton,
createUserButton);
actionsCell.setComponent(actionsLayout);
tabSheet.addTab(usersTable, "Users"); tabSheet.addTab(usersTable, "Users");
tabSheet.addTab(groupsTable, "Groups");
setCompositionRoot(tabSheet); setCompositionRoot(tabSheet);
@ -179,48 +177,52 @@ public class UsersGroupsRoles extends CustomComponent {
public void localize() { public void localize() {
final ResourceBundle bundle = ResourceBundle // final ResourceBundle bundle = ResourceBundle
.getBundle(AdminUiConstants.ADMIN_BUNDLE, // .getBundle(AdminUiConstants.ADMIN_BUNDLE,
UI.getCurrent().getLocale()); // UI.getCurrent().getLocale());
//
// usersTable
// .getColumn(COL_USER_NAME)
// .setCaption(bundle.getString("ui.admin.users.table.screenname"));
// usersTable
// .getColumn(COL_GIVEN_NAME)
// .setCaption(bundle.getString("ui.admin.users.table.givenname"));
// usersTable
// .getColumn(COL_FAMILY_NAME)
// .setCaption(bundle.getString("ui.admin.users.table.familyname"));
// usersTable
// .getColumn(COL_EMAIL)
// .setCaption(bundle.getString("ui.admin.users.table.primary_email"));
// usersTable
// .getColumn(COL_BANNED)
// .setCaption(bundle.getString("ui.admin.users.table.banned"));
// usersTable
// .getColumn(COL_PASSWORD_RESET_REQUIRED)
// .setCaption(bundle.getString(
// "ui.admin.users.table.password_reset_required"));
//
// userNameFilter.setPlaceholder(bundle
// .getString("ui.admin.users.table.filter.screenname.placeholder"));
// userNameFilter.setDescription(bundle
// .getString("ui.admin.users.table.filter.screenname.description"));
//
// clearFiltersButton.setCaption(bundle
// .getString("ui.admin.users.table.filter.clear"));
usersTable usersTable.localize();
.getColumn(COL_USER_NAME)
.setCaption(bundle.getString("ui.admin.users.table.screenname"));
usersTable
.getColumn(COL_GIVEN_NAME)
.setCaption(bundle.getString("ui.admin.users.table.givenname"));
usersTable
.getColumn(COL_FAMILY_NAME)
.setCaption(bundle.getString("ui.admin.users.table.familyname"));
usersTable
.getColumn(COL_EMAIL)
.setCaption(bundle.getString("ui.admin.users.table.primary_email"));
usersTable
.getColumn(COL_BANNED)
.setCaption(bundle.getString("ui.admin.users.table.banned"));
usersTable
.getColumn(COL_PASSWORD_RESET_REQUIRED)
.setCaption(bundle.getString(
"ui.admin.users.table.password_reset_required"));
userNameFilter.setPlaceholder(bundle
.getString("ui.admin.users.table.filter.screenname.placeholder"));
userNameFilter.setDescription(bundle
.getString("ui.admin.users.table.filter.screenname.description"));
clearFiltersButton.setCaption(bundle
.getString("ui.admin.users.table.filter.clear"));
} }
// public void setUsers(final List<User> users) { public void setUsersTableDataProvider(final UsersTableDataProvider dataProvider) {
// usersTable.setItems(users);
// }
public void setDataProvider(final UsersTableDataProvider dataProvider) {
this.usersTableDataProvider = dataProvider; this.usersTableDataProvider = dataProvider;
usersTable.setDataProvider(dataProvider); usersTable.setDataProvider(dataProvider);
} }
public void setGroupsTableDataProvider(final GroupsTableDataProvider dataProvider) {
this.groupsTableDataProvider = dataProvider;
groupsTable.setDataProvider(dataProvider);
}
protected void refreshUsers() { protected void refreshUsers() {
usersTableDataProvider.refreshAll(); usersTableDataProvider.refreshAll();
} }

View File

@ -0,0 +1,184 @@
/*
* Copyright (C) 2017 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 org.libreccm.admin.ui.usersgroupsroles;
import com.arsdigita.ui.admin.AdminUiConstants;
import com.vaadin.icons.VaadinIcons;
import com.vaadin.ui.Button;
import com.vaadin.ui.Grid;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.TextField;
import com.vaadin.ui.UI;
import com.vaadin.ui.components.grid.HeaderCell;
import com.vaadin.ui.components.grid.HeaderRow;
import com.vaadin.ui.renderers.ButtonRenderer;
import com.vaadin.ui.themes.ValoTheme;
import org.libreccm.admin.ui.AdminView;
import org.libreccm.security.User;
import java.util.ResourceBundle;
/**
*
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
*/
public class UsersTable extends Grid<User> {
private static final long serialVersionUID = -6535913368522021496L;
private static final String COL_USER_NAME = "username";
private static final String COL_GIVEN_NAME = "given_name";
private static final String COL_FAMILY_NAME = "family_name";
private static final String COL_EMAIL = "email";
private static final String COL_BANNED = "banned";
private static final String COL_PASSWORD_RESET_REQUIRED
= "password_reset_required";
private static final String COL_EDIT = "edit";
private final TextField userNameFilter;
private final Button clearFiltersButton;
private final Button createUserButton;
public UsersTable(final AdminView view,
final UsersGroupsRoles usersGroupsRoles) {
super();
final ResourceBundle bundle = ResourceBundle
.getBundle(AdminUiConstants.ADMIN_BUNDLE,
UI.getCurrent().getLocale());
addColumn(User::getName)
.setId(COL_USER_NAME)
.setCaption("User Name");
addColumn(User::getGivenName)
.setId(COL_GIVEN_NAME)
.setCaption("Given name");
addColumn(User::getFamilyName)
.setId(COL_FAMILY_NAME)
.setCaption("Family name");
addColumn(user -> user.getPrimaryEmailAddress().getAddress())
.setId(COL_EMAIL)
.setCaption("E-Mail");
addColumn(user -> {
if (user.isBanned()) {
return bundle.getString("ui.admin.user.banned_yes");
} else {
return bundle.getString("ui.admin.user.banned_no");
}
})
.setId(COL_BANNED)
.setCaption("Banned?");
addColumn(user -> {
if (user.isPasswordResetRequired()) {
return bundle.getString(
"ui.admin.user.password_reset_required_yes");
} else {
return bundle.getString(
"ui.admin.user.password_reset_required_no");
}
})
.setId(COL_PASSWORD_RESET_REQUIRED)
.setCaption("Password reset required");
addColumn(user -> bundle.getString("ui.admin.users.table.edit"),
new ButtonRenderer<>(event -> {
final UserEditor editor = new UserEditor(
event.getItem(),
usersGroupsRoles,
view.getUserRepository(),
view.getUserManager());
editor.center();
UI.getCurrent().addWindow(editor);
}))
.setId(COL_EDIT);
final HeaderRow filterRow = appendHeaderRow();
final HeaderCell userNameFilterCell = filterRow.getCell(COL_USER_NAME);
userNameFilter = new TextField();
userNameFilter.setPlaceholder("User name");
userNameFilter.setDescription("Filter users by username");
userNameFilter.addStyleName(ValoTheme.TEXTFIELD_TINY);
userNameFilter
.addValueChangeListener(event -> {
((UsersTableDataProvider) getDataProvider())
.setUserNameFilter(event.getValue().toLowerCase());
});
userNameFilterCell.setComponent(userNameFilter);
final HeaderRow actionsRow = prependHeaderRow();
final HeaderCell actionsCell = actionsRow.join(COL_USER_NAME,
COL_GIVEN_NAME,
COL_FAMILY_NAME,
COL_EMAIL,
COL_BANNED);
clearFiltersButton = new Button("Clear filters");
clearFiltersButton.addStyleName(ValoTheme.BUTTON_TINY);
clearFiltersButton.addClickListener(event -> {
userNameFilter.setValue("");
});
createUserButton = new Button("New User");
createUserButton.addStyleName(ValoTheme.BUTTON_TINY);
createUserButton.setIcon(VaadinIcons.PLUS);
createUserButton.addClickListener(event -> {
final UserEditor userEditor = new UserEditor(
usersGroupsRoles,
view.getUserRepository(),
view.getUserManager());
userEditor.center();
UI.getCurrent().addWindow(userEditor);
});
final HorizontalLayout actionsLayout = new HorizontalLayout(
clearFiltersButton,
createUserButton);
actionsCell.setComponent(actionsLayout);
}
public void localize() {
final ResourceBundle bundle = ResourceBundle
.getBundle(AdminUiConstants.ADMIN_BUNDLE,
UI.getCurrent().getLocale());
getColumn(COL_USER_NAME)
.setCaption(bundle.getString("ui.admin.users.table.screenname"));
getColumn(COL_GIVEN_NAME)
.setCaption(bundle.getString("ui.admin.users.table.givenname"));
getColumn(COL_FAMILY_NAME)
.setCaption(bundle.getString("ui.admin.users.table.familyname"));
getColumn(COL_EMAIL)
.setCaption(bundle.getString("ui.admin.users.table.primary_email"));
getColumn(COL_BANNED)
.setCaption(bundle.getString("ui.admin.users.table.banned"));
getColumn(COL_PASSWORD_RESET_REQUIRED)
.setCaption(bundle.getString(
"ui.admin.users.table.password_reset_required"));
userNameFilter.setPlaceholder(bundle
.getString("ui.admin.users.table.filter.screenname.placeholder"));
userNameFilter.setDescription(bundle
.getString("ui.admin.users.table.filter.screenname.description"));
clearFiltersButton.setCaption(bundle
.getString("ui.admin.users.table.filter.clear"));
}
}

View File

@ -55,10 +55,9 @@ public class UsersTableDataProvider extends AbstractDataProvider<User, String> {
@Transactional(Transactional.TxType.REQUIRED) @Transactional(Transactional.TxType.REQUIRED)
@Override @Override
public int size(final Query<User, String> query) { public int size(final Query<User, String> query) {
final CriteriaBuilder builder = entityManager
.getCriteriaBuilder(); final CriteriaBuilder builder = entityManager.getCriteriaBuilder();
CriteriaQuery<Long> criteriaQuery = builder CriteriaQuery<Long> criteriaQuery = builder.createQuery(Long.class);
.createQuery(Long.class);
final Root<User> from = criteriaQuery.from(User.class); final Root<User> from = criteriaQuery.from(User.class);
criteriaQuery = criteriaQuery.select(builder.count(from)); criteriaQuery = criteriaQuery.select(builder.count(from));
@ -78,8 +77,8 @@ public class UsersTableDataProvider extends AbstractDataProvider<User, String> {
@Transactional(Transactional.TxType.REQUIRED) @Transactional(Transactional.TxType.REQUIRED)
@Override @Override
public Stream<User> fetch(final Query<User, String> query) { public Stream<User> fetch(final Query<User, String> query) {
final CriteriaBuilder builder = entityManager
.getCriteriaBuilder(); final CriteriaBuilder builder = entityManager.getCriteriaBuilder();
final CriteriaQuery<User> criteriaQuery = builder final CriteriaQuery<User> criteriaQuery = builder
.createQuery(User.class); .createQuery(User.class);
final Root<User> from = criteriaQuery.from(User.class); final Root<User> from = criteriaQuery.from(User.class);