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