package com.metrink.croquet.examples.crm.pages;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.EntityManager;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.AjaxLink;
import org.apache.wicket.extensions.ajax.markup.html.repeater.data.table.AjaxFallbackDefaultDataTable;
import org.apache.wicket.extensions.markup.html.repeater.data.grid.ICellPopulator;
import org.apache.wicket.extensions.markup.html.repeater.data.table.HeaderlessColumn;
import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn;
import org.apache.wicket.extensions.markup.html.repeater.data.table.PropertyColumn;
import org.apache.wicket.injection.Injector;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.form.TextField;
import org.apache.wicket.markup.html.link.Link;
import org.apache.wicket.markup.html.panel.Fragment;
import org.apache.wicket.markup.repeater.Item;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.model.PropertyModel;
import org.apache.wicket.request.mapper.parameter.PageParameters;
import com.google.inject.Inject;
import com.metrink.croquet.examples.crm.CurrentUser;
import com.metrink.croquet.examples.crm.data.CompanyBean;
import com.metrink.croquet.examples.crm.data.GenericDataProvider;
import com.metrink.croquet.examples.crm.data.GenericDataProvider.GenericDataProviderFactory;
/**
* A page to display all of the companies in the CRM.
*/
public class CompanyPage extends AbstractFormPage<CompanyBean> {
private static final long serialVersionUID = -1529533206724745674L;
private static final int TABLE_ROWS = 20;
// must add @Inject (and make the field transient) because CurrentUser isn't Serializable
@Inject private final transient CurrentUser currentUser;
/**
* Constructor for the {@link CompanyPage}.
* @param entityManager the {@EntityManager} to read/write objects.
* @param dataProviderFactory a data provider factory to fill out the table.
* @param currentUser the "current user" of the site.
*/
@Inject
public CompanyPage(final EntityManager entityManager,
final GenericDataProviderFactory<CompanyBean> dataProviderFactory,
final CurrentUser currentUser) {
super(CompanyBean.class, entityManager);
/*
* This is a VERY contrived example of injecting a non-Serializable dependency.
* We created the "dummy" class CurrentUser to show how to deal with non-Serializable fields.
* Granted, we don't even need to save the CurrentUser object in a field, constructor injection
* in this case is enough.
*
* The steps are as follows:
* 1) Inject the dependency via the constructor
* 2) Call Injector.get().inject(this)
* 3) Ensure the field is marked as transient with @Inject
* 4) Save the reference from the constructor into the field
*/
Injector.get().inject(this);
this.currentUser = currentUser;
add(new Label("username", this.currentUser.getCurrentUser()));
final List<IColumn<CompanyBean, String>> columns = new ArrayList<IColumn<CompanyBean, String>>();
// setup the edit link
columns.add(new HeaderlessColumn<CompanyBean, String>() {
private static final long serialVersionUID = -4881016875048427872L;
@Override
public void populateItem(final Item<ICellPopulator<CompanyBean>> item,
final String componentId,
final IModel<CompanyBean> rowModel) {
final CompanyBean bean = rowModel.getObject();
final Fragment linkFragment = new Fragment(componentId, "edit-fragment", CompanyPage.this);
linkFragment.add(new AjaxLink<CompanyBean>("edit-link", rowModel) {
private static final long serialVersionUID = -1206619334473876487L;
@Override
public void onClick(final AjaxRequestTarget target) {
CompanyPage.this.setForm(bean, target);
}
});
//linkFragment.add();
item.add(linkFragment);
}
});
// setup the name column as a link to the people page
columns.add(new PropertyColumn<CompanyBean, String>(Model.of("Name"), "name", "name") {
private static final long serialVersionUID = -4881016875048427872L;
@Override
public void populateItem(final Item<ICellPopulator<CompanyBean>> item,
final String componentId,
final IModel<CompanyBean> rowModel) {
final CompanyBean bean = rowModel.getObject();
final Fragment linkFragment = new Fragment(componentId, "name-fragment", CompanyPage.this);
linkFragment.add(new Link<CompanyBean>("name-link", rowModel) {
private static final long serialVersionUID = -1206619334473876487L;
@Override
public void onClick() {
final PageParameters params =
new PageParameters().add(PeoplePage.COMPANYID_PARAM, bean.getCompanyId());
// pass any values via params
setResponsePage(PeoplePage.class, params);
}
}.add(new Label("name", bean.getName())));
//linkFragment.add();
item.add(linkFragment);
}
});
columns.add(new PropertyColumn<CompanyBean, String>(Model.of("Street"), "street", "street"));
columns.add(new PropertyColumn<CompanyBean, String>(Model.of("City"), "city", "city"));
columns.add(new PropertyColumn<CompanyBean, String>(Model.of("State"), "state", "state"));
columns.add(new PropertyColumn<CompanyBean, String>(Model.of("Zip"), "zip", "zip"));
// construct an instance of the GenericDataProvider
final GenericDataProvider<CompanyBean> dataProvider = dataProviderFactory.create(CompanyBean.class);
add(new AjaxFallbackDefaultDataTable<CompanyBean, String>("company-table", columns, dataProvider, TABLE_ROWS));
}
@Override
protected void addFormComponents(final Form<CompanyBean> form) {
form.add(new TextField<String>("name", PropertyModel.<String>of(form.getModel(), "name")));
form.add(new TextField<String>("street", PropertyModel.<String>of(form.getModel(), "street")));
form.add(new TextField<String>("city", PropertyModel.<String>of(form.getModel(), "city")));
form.add(new TextField<String>("state", PropertyModel.<String>of(form.getModel(), "state")));
form.add(new TextField<String>("zip", PropertyModel.<String>of(form.getModel(), "zip")));
}
}