CCM NG/ccm-core: GroupsTable for the Vaadin prototype
git-svn-id: https://svn.libreccm.org/ccm/ccm_ng@4741 8810af33-2d31-482b-a856-94f89814c4dfpull/2/head
parent
cf6a8653a0
commit
415a68c7cf
|
|
@ -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"));
|
||||
|
|
|
|||
|
|
@ -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"));
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -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();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -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();
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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<User> usersTable;
|
||||
private final TextField userNameFilter;
|
||||
private final Button clearFiltersButton;
|
||||
private final Button createUserButton;
|
||||
// private final Grid<User> 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<User> 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();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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"));
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -55,10 +55,9 @@ public class UsersTableDataProvider extends AbstractDataProvider<User, String> {
|
|||
@Transactional(Transactional.TxType.REQUIRED)
|
||||
@Override
|
||||
public int size(final Query<User, String> query) {
|
||||
final CriteriaBuilder builder = entityManager
|
||||
.getCriteriaBuilder();
|
||||
CriteriaQuery<Long> criteriaQuery = builder
|
||||
.createQuery(Long.class);
|
||||
|
||||
final CriteriaBuilder builder = entityManager.getCriteriaBuilder();
|
||||
CriteriaQuery<Long> criteriaQuery = builder.createQuery(Long.class);
|
||||
final Root<User> from = criteriaQuery.from(User.class);
|
||||
|
||||
criteriaQuery = criteriaQuery.select(builder.count(from));
|
||||
|
|
@ -66,9 +65,9 @@ public class UsersTableDataProvider extends AbstractDataProvider<User, String> {
|
|||
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<User, String> {
|
|||
@Transactional(Transactional.TxType.REQUIRED)
|
||||
@Override
|
||||
public Stream<User> fetch(final Query<User, String> query) {
|
||||
final CriteriaBuilder builder = entityManager
|
||||
.getCriteriaBuilder();
|
||||
|
||||
final CriteriaBuilder builder = entityManager.getCriteriaBuilder();
|
||||
final CriteriaQuery<User> criteriaQuery = builder
|
||||
.createQuery(User.class);
|
||||
final Root<User> from = criteriaQuery.from(User.class);
|
||||
|
|
@ -87,7 +86,7 @@ public class UsersTableDataProvider extends AbstractDataProvider<User, String> {
|
|||
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
|
||||
|
|
|
|||
Loading…
Reference in New Issue