/* vim: set ts=2 et sw=2 cindent fo=qroca: */
package com.globant.katari.sample.wicket.view;
import java.util.Iterator;
import org.apache.wicket.markup.html.WebPage;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.link.Link;
import org.apache.wicket.markup.html.navigation.paging.PagingNavigator;
import org.apache.wicket.markup.repeater.Item;
import org.apache.wicket.markup.repeater.data.DataView;
import org.apache.wicket.markup.repeater.data.IDataProvider;
import org.apache.wicket.model.CompoundPropertyModel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.LoadableDetachableModel;
import org.apache.wicket.spring.injection.annot.SpringBean;
import com.globant.katari.hibernate.coreuser.SecurityUtils;
import com.globant.katari.user.application.DeleteUserCommand;
import com.globant.katari.user.application.UserFilterCommand;
import com.globant.katari.user.domain.User;
import com.globant.katari.user.domain.filter.ContainsFilter;
/** Paginates through all the users.
*
* This is a wicket page that shows a paginated list of users.
*/
public class UserListPage extends WebPage {
/** The number of elements per page.
*/
private static final int DEFAULT_PAGE_SIZE = 5;
/** The command that provides the list of users.
*
* Injected by spring, never null.
*/
@SpringBean(name = "userFilterCommand")
private UserFilterCommand filterCommand;
/** The command that deletes a user.
*
* Injected by spring, never null.
*/
@SpringBean
private DeleteUserCommand deleteCommand;
/** Constructor.
*/
public UserListPage() {
DataView<User> dataView;
dataView = new DataView<User>("users", new UsersDataProvider()) {
private static final long serialVersionUID = 7992666042888348658L;
@SuppressWarnings("serial")
public void populateItem(final Item<User> listItem) {
final User user = listItem.getModelObject();
listItem.setModel(new CompoundPropertyModel<User>(user));
listItem.add(new Label("name"));
listItem.add(new Label("email"));
listItem.add(new UserPage.Link("edit", user).add(new Label("id")));
listItem.add(new Link<User>("delete") {
@Override
public void onClick() {
deleteCommand.setUserId(user.getId());
deleteCommand.execute();
}
@Override
protected CharSequence getOnClickScript(final CharSequence url) {
return "if (!confirm('Are you sure you want to delete user "
+ user.getName() + "?')) return false;";
}
@Override
public boolean isEnabled() {
return user.getId() != SecurityUtils.getCurrentUser().getId();
}
});
}
};
dataView.setItemsPerPage(DEFAULT_PAGE_SIZE);
add(dataView);
add(new PagingNavigator("pager", dataView));
}
/** Addapts the DataView to the the User list.
*/
private class UsersDataProvider implements IDataProvider<User> {
/** Serialization version.
*/
private static final long serialVersionUID = 1L;
/** Cache for the total number of users to show.
*/
private int size = -1;
/** {@inheritDoc}.
*/
public Iterator<User> iterator(final int first, final int count) {
int currentPage = 0;
if (count != 0) {
currentPage = first / count;
}
filterCommand.getPaging().setPageNumber(currentPage);
filterCommand.getPaging().setPageSize(count);
return filterCommand.execute().iterator();
}
/** {@inheritDoc}.
*/
@SuppressWarnings("serial")
public IModel<User> model(final User user) {
return new LoadableDetachableModel<User>() {
@Override
protected User load() {
return user;
}
};
}
/** {@inheritDoc}.
*/
public int size() {
if (size == -1) {
filterCommand.setContainsFilter(new ContainsFilter());
filterCommand.getPaging().setPageSize(0);
size = filterCommand.execute().size();
}
return size;
}
/** {@inheritDoc}
*/
public void detach() {
}
}
}