From 8b5c08b05e6f880c2c0650b67fcba263c8c2f897 Mon Sep 17 00:00:00 2001 From: jensp Date: Wed, 17 May 2017 17:58:33 +0000 Subject: [PATCH] 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 Former-commit-id: 7d20a6710dd3f42ddfbd1fa94094091eac0a31c1 --- .../java/org/libreccm/admin/ui/AdminView.java | 39 +-- .../ui/usersgroupsroles/GroupsTable.java | 132 ++++++++ .../GroupsTableDataProvider.java | 104 ++++++ .../admin/ui/usersgroupsroles/UserEditor.java | 6 +- .../ui/usersgroupsroles/UsersGroupsRoles.java | 304 +++++++++--------- .../admin/ui/usersgroupsroles/UsersTable.java | 184 +++++++++++ .../UsersTableDataProvider.java | 17 +- 7 files changed, 591 insertions(+), 195 deletions(-) create mode 100644 ccm-core/src/main/java/org/libreccm/admin/ui/usersgroupsroles/GroupsTable.java create mode 100644 ccm-core/src/main/java/org/libreccm/admin/ui/usersgroupsroles/GroupsTableDataProvider.java create mode 100644 ccm-core/src/main/java/org/libreccm/admin/ui/usersgroupsroles/UsersTable.java diff --git a/ccm-core/src/main/java/org/libreccm/admin/ui/AdminView.java b/ccm-core/src/main/java/org/libreccm/admin/ui/AdminView.java index d78300700..14b0e09fe 100644 --- a/ccm-core/src/main/java/org/libreccm/admin/ui/AdminView.java +++ b/ccm-core/src/main/java/org/libreccm/admin/ui/AdminView.java @@ -34,6 +34,7 @@ import com.vaadin.ui.Label; import com.vaadin.ui.TabSheet; import com.vaadin.ui.VerticalLayout; 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.UsersTableDataProvider; import org.libreccm.l10n.GlobalizationHelper; @@ -82,6 +83,9 @@ public class AdminView extends CustomComponent implements View { @Inject private UsersTableDataProvider usersTableDataProvider; + + @Inject + private GroupsTableDataProvider groupsTableDataProvider; private ResourceBundle bundle; @@ -99,38 +103,6 @@ public class AdminView extends CustomComponent implements View { 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); tabUsersGroupsRoles = tabSheet.addTab(usersGroupsRoles, "Users/Groups/Roles"); @@ -199,7 +171,8 @@ public class AdminView extends CustomComponent implements View { .getBundle(AdminUiConstants.ADMIN_BUNDLE, globalizationHelper.getNegotiatedLocale()); - usersGroupsRoles.setDataProvider(usersTableDataProvider); + usersGroupsRoles.setUsersTableDataProvider(usersTableDataProvider); + usersGroupsRoles.setGroupsTableDataProvider(groupsTableDataProvider); tabUsersGroupsRoles.setCaption(bundle .getString("ui.admin.tab.users_groups_roles.title")); diff --git a/ccm-core/src/main/java/org/libreccm/admin/ui/usersgroupsroles/GroupsTable.java b/ccm-core/src/main/java/org/libreccm/admin/ui/usersgroupsroles/GroupsTable.java new file mode 100644 index 000000000..b219b4ddd --- /dev/null +++ b/ccm-core/src/main/java/org/libreccm/admin/ui/usersgroupsroles/GroupsTable.java @@ -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 Jens Pelzetter + */ +public class GroupsTable extends Grid { + + 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")); + } + +} diff --git a/ccm-core/src/main/java/org/libreccm/admin/ui/usersgroupsroles/GroupsTableDataProvider.java b/ccm-core/src/main/java/org/libreccm/admin/ui/usersgroupsroles/GroupsTableDataProvider.java new file mode 100644 index 000000000..24f8c908b --- /dev/null +++ b/ccm-core/src/main/java/org/libreccm/admin/ui/usersgroupsroles/GroupsTableDataProvider.java @@ -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 Jens Pelzetter + */ +@ViewScoped +public class GroupsTableDataProvider extends AbstractDataProvider { + + 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 query) { + + final CriteriaBuilder builder = entityManager.getCriteriaBuilder(); + CriteriaQuery criteriaQuery = builder.createQuery(Long.class); + final Root 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 fetch(final Query query) { + + final CriteriaBuilder builder = entityManager.getCriteriaBuilder(); + final CriteriaQuery criteriaQuery = builder + .createQuery(Group.class); + final Root 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(); + } + +} diff --git a/ccm-core/src/main/java/org/libreccm/admin/ui/usersgroupsroles/UserEditor.java b/ccm-core/src/main/java/org/libreccm/admin/ui/usersgroupsroles/UserEditor.java index bb57c9cf1..dedad5a02 100644 --- a/ccm-core/src/main/java/org/libreccm/admin/ui/usersgroupsroles/UserEditor.java +++ b/ccm-core/src/main/java/org/libreccm/admin/ui/usersgroupsroles/UserEditor.java @@ -101,7 +101,7 @@ public class UserEditor extends Window { addWidgets(); } - + public UserEditor(final User user, final UsersGroupsRoles usersGroupsRoles, final UserRepository userRepo, @@ -436,7 +436,9 @@ public class UserEditor extends Window { } dataHasChanged = false; - usersGroupsRoles.refreshUsers(); + if (usersGroupsRoles != null) { + usersGroupsRoles.refreshUsers(); + } close(); } diff --git a/ccm-core/src/main/java/org/libreccm/admin/ui/usersgroupsroles/UsersGroupsRoles.java b/ccm-core/src/main/java/org/libreccm/admin/ui/usersgroupsroles/UsersGroupsRoles.java index 76fe06860..bb18e6cb0 100644 --- a/ccm-core/src/main/java/org/libreccm/admin/ui/usersgroupsroles/UsersGroupsRoles.java +++ b/ccm-core/src/main/java/org/libreccm/admin/ui/usersgroupsroles/UsersGroupsRoles.java @@ -20,22 +20,10 @@ 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.CustomComponent; -import com.vaadin.ui.Grid; -import com.vaadin.ui.HorizontalLayout; import com.vaadin.ui.TabSheet; -import com.vaadin.ui.TextField; 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.security.User; -import org.libreccm.security.UserRepository; import java.util.ResourceBundle; @@ -47,26 +35,30 @@ public class UsersGroupsRoles extends CustomComponent { private static final long serialVersionUID = 7280416743018127366L; - 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 static final String COL_DELETE = "delete"; +// 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 static final String COL_DELETE = "delete"; private final AdminView view; private final TabSheet tabSheet; - private final Grid usersTable; - private final TextField userNameFilter; - private final Button clearFiltersButton; - private final Button createUserButton; +// private final Grid usersTable; +// private final TextField userNameFilter; +// private final Button clearFiltersButton; +// private final Button createUserButton; + + private final UsersTable usersTable; + private final GroupsTable groupsTable; private UsersTableDataProvider usersTableDataProvider; + private GroupsTableDataProvider groupsTableDataProvider; public UsersGroupsRoles(final AdminView view) { @@ -77,101 +69,107 @@ public class UsersGroupsRoles extends CustomComponent { UI.getCurrent().getLocale()); 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.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(); - 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); + + groupsTable = new GroupsTable(view, this); + groupsTable.setWidth("100%"); tabSheet.addTab(usersTable, "Users"); + tabSheet.addTab(groupsTable, "Groups"); setCompositionRoot(tabSheet); @@ -179,48 +177,52 @@ public class UsersGroupsRoles extends CustomComponent { public void localize() { - final ResourceBundle bundle = ResourceBundle - .getBundle(AdminUiConstants.ADMIN_BUNDLE, - UI.getCurrent().getLocale()); +// final ResourceBundle bundle = ResourceBundle +// .getBundle(AdminUiConstants.ADMIN_BUNDLE, +// 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 - .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.localize(); } -// public void setUsers(final List users) { -// usersTable.setItems(users); -// } - public void setDataProvider(final UsersTableDataProvider dataProvider) { + public void setUsersTableDataProvider(final UsersTableDataProvider dataProvider) { this.usersTableDataProvider = dataProvider; usersTable.setDataProvider(dataProvider); } + public void setGroupsTableDataProvider(final GroupsTableDataProvider dataProvider) { + this.groupsTableDataProvider = dataProvider; + groupsTable.setDataProvider(dataProvider); + } + protected void refreshUsers() { usersTableDataProvider.refreshAll(); } diff --git a/ccm-core/src/main/java/org/libreccm/admin/ui/usersgroupsroles/UsersTable.java b/ccm-core/src/main/java/org/libreccm/admin/ui/usersgroupsroles/UsersTable.java new file mode 100644 index 000000000..f2739121c --- /dev/null +++ b/ccm-core/src/main/java/org/libreccm/admin/ui/usersgroupsroles/UsersTable.java @@ -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 Jens Pelzetter + */ +public class UsersTable extends Grid { + + 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")); + + } + +} diff --git a/ccm-core/src/main/java/org/libreccm/admin/ui/usersgroupsroles/UsersTableDataProvider.java b/ccm-core/src/main/java/org/libreccm/admin/ui/usersgroupsroles/UsersTableDataProvider.java index f6907783c..dafc37946 100644 --- a/ccm-core/src/main/java/org/libreccm/admin/ui/usersgroupsroles/UsersTableDataProvider.java +++ b/ccm-core/src/main/java/org/libreccm/admin/ui/usersgroupsroles/UsersTableDataProvider.java @@ -55,10 +55,9 @@ public class UsersTableDataProvider extends AbstractDataProvider { @Transactional(Transactional.TxType.REQUIRED) @Override public int size(final Query query) { - final CriteriaBuilder builder = entityManager - .getCriteriaBuilder(); - CriteriaQuery criteriaQuery = builder - .createQuery(Long.class); + + final CriteriaBuilder builder = entityManager.getCriteriaBuilder(); + CriteriaQuery criteriaQuery = builder.createQuery(Long.class); final Root from = criteriaQuery.from(User.class); criteriaQuery = criteriaQuery.select(builder.count(from)); @@ -66,9 +65,9 @@ public class UsersTableDataProvider extends AbstractDataProvider { if (userNameFilter != null && !userNameFilter.trim().isEmpty()) { criteriaQuery .where(builder.like(builder.lower(from.get("name")), - String.format("%s%%", userNameFilter))); + String.format("%s%%", userNameFilter))); } - + return entityManager .createQuery(criteriaQuery) .getSingleResult() @@ -78,8 +77,8 @@ public class UsersTableDataProvider extends AbstractDataProvider { @Transactional(Transactional.TxType.REQUIRED) @Override public Stream fetch(final Query query) { - final CriteriaBuilder builder = entityManager - .getCriteriaBuilder(); + + final CriteriaBuilder builder = entityManager.getCriteriaBuilder(); final CriteriaQuery criteriaQuery = builder .createQuery(User.class); final Root from = criteriaQuery.from(User.class); @@ -87,7 +86,7 @@ public class UsersTableDataProvider extends AbstractDataProvider { if (userNameFilter != null && !userNameFilter.trim().isEmpty()) { criteriaQuery .where(builder.like(builder.lower(from.get("name")), - String.format("%s%%", userNameFilter))); + String.format("%s%%", userNameFilter))); } return entityManager