///////////////////////////////////////////////////////////////////////////// // // Project ProjectForge Community Edition // www.projectforge.org // // Copyright (C) 2001-2014 Kai Reinhard (k.reinhard@micromata.de) // // ProjectForge is dual-licensed. // // This community edition is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License as published // by the Free Software Foundation; version 3 of the License. // // This community edition 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 General // Public License for more details. // // You should have received a copy of the GNU General Public License along // with this program; if not, see http://www.gnu.org/licenses/. // ///////////////////////////////////////////////////////////////////////////// package org.projectforge.plugins.marketing; import java.io.Serializable; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang.StringUtils; import org.apache.wicket.AttributeModifier; import org.apache.wicket.extensions.markup.html.repeater.data.grid.ICellPopulator; import org.apache.wicket.extensions.markup.html.repeater.data.sort.SortOrder; import org.apache.wicket.extensions.markup.html.repeater.data.table.AbstractColumn; import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn; import org.apache.wicket.markup.html.WebPage; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.form.SubmitLink; import org.apache.wicket.markup.repeater.Item; import org.apache.wicket.model.IModel; import org.apache.wicket.model.Model; import org.apache.wicket.request.mapper.parameter.PageParameters; import org.apache.wicket.spring.injection.annot.SpringBean; import org.projectforge.address.AddressDO; import org.projectforge.address.AddressDao; import org.projectforge.address.AddressStatus; import org.projectforge.address.ContactStatus; import org.projectforge.address.PersonalAddressDO; import org.projectforge.address.PersonalAddressDao; import org.projectforge.common.DateHelper; import org.projectforge.common.StringHelper; import org.projectforge.web.calendar.DateTimeFormatter; import org.projectforge.web.wicket.AbstractListPage; import org.projectforge.web.wicket.CellItemListener; import org.projectforge.web.wicket.CellItemListenerPropertyColumn; import org.projectforge.web.wicket.DownloadUtils; import org.projectforge.web.wicket.IListPageColumnsCreator; import org.projectforge.web.wicket.ListPage; import org.projectforge.web.wicket.ListSelectActionPanel; import org.projectforge.web.wicket.RowCssClass; import org.projectforge.web.wicket.components.ContentMenuEntryPanel; import org.projectforge.web.wicket.flowlayout.CheckBoxPanel; /** * The controller of the list page. Most functionality such as search etc. is done by the super class. * @author Kai Reinhard (k.reinhard@micromata.de) * */ @ListPage(editPage = AddressCampaignValueEditPage.class) public class AddressCampaignValueListPage extends AbstractListPage<AddressCampaignValueListForm, AddressDao, AddressDO> implements IListPageColumnsCreator<AddressDO> { private static final org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger(AddressCampaignValueListPage.class); private static final long serialVersionUID = -2418497742599443358L; @SpringBean(name = "addressDao") private AddressDao addressDao; @SpringBean(name = "addressCampaignValueDao") private AddressCampaignValueDao addressCampaignValueDao; @SpringBean(name = "addressCampaignValueExport") private AddressCampaignValueExport addressCampaignValueExport; @SpringBean(name = "personalAddressDao") private PersonalAddressDao personalAddressDao; Map<Integer, PersonalAddressDO> personalAddressMap; Map<Integer, AddressCampaignValueDO> addressCampaignValueMap; public AddressCampaignValueListPage(final PageParameters parameters) { super(parameters, "plugins.marketing.addressCampaignValue"); newItemMenuEntry.setVisibilityAllowed(false); } public List<IColumn<AddressDO, String>> createColumns(final WebPage returnToPage, final boolean sortable) { return createColumns(returnToPage, sortable, false); } public List<IColumn<AddressDO, String>> createColumns(final WebPage returnToPage, final boolean sortable, final boolean massUpdateMode) { return createColumns(returnToPage, sortable, massUpdateMode, form.getSearchFilter(), personalAddressMap, addressCampaignValueMap); } @SuppressWarnings("serial") protected static final List<IColumn<AddressDO, String>> createColumns(final WebPage page, final boolean sortable, final boolean massUpdateMode, final AddressCampaignValueFilter searchFilter, final Map<Integer, PersonalAddressDO> personalAddressMap, final Map<Integer, AddressCampaignValueDO> addressCampaignValueMap) { final List<IColumn<AddressDO, String>> columns = new ArrayList<IColumn<AddressDO, String>>(); final CellItemListener<AddressDO> cellItemListener = new CellItemListener<AddressDO>() { public void populateItem(final Item<ICellPopulator<AddressDO>> item, final String componentId, final IModel<AddressDO> rowModel) { final AddressDO address = rowModel.getObject(); final Serializable highlightedRowId; if (page instanceof AbstractListPage< ? , ? , ? >) { highlightedRowId = ((AbstractListPage< ? , ? , ? >) page).getHighlightedRowId(); } else { highlightedRowId = null; } final PersonalAddressDO personalAddress = personalAddressMap.get(address.getId()); appendCssClasses(item, address.getId(), highlightedRowId, address.isDeleted()); if (address.isDeleted() == true) { // Do nothing further } else if (personalAddress != null && personalAddress.isFavoriteCard() == true) { appendCssClasses(item, RowCssClass.FAVORITE_ENTRY); } if (address.getAddressStatus().isIn(AddressStatus.LEAVED, AddressStatus.OUTDATED) == true || address.getContactStatus().isIn(ContactStatus.DEPARTED, ContactStatus.NON_ACTIVE, ContactStatus.PERSONA_INGRATA, ContactStatus.UNINTERESTING, ContactStatus.DEPARTED) == true) { appendCssClasses(item, RowCssClass.MARKED_AS_DELETED); } } }; if (page instanceof AddressCampaignValueMassUpdatePage) { columns.add(new CellItemListenerPropertyColumn<AddressDO>(new Model<String>(page.getString("created")), getSortable("created", sortable), "created", cellItemListener)); } else if (massUpdateMode == true && page instanceof AddressCampaignValueListPage) { final AddressCampaignValueListPage addressCampaignValueListPage = (AddressCampaignValueListPage) page; columns.add(new CellItemListenerPropertyColumn<AddressDO>("", null, "selected", cellItemListener) { @Override public void populateItem(final Item<ICellPopulator<AddressDO>> item, final String componentId, final IModel<AddressDO> rowModel) { final AddressDO address = rowModel.getObject(); final CheckBoxPanel checkBoxPanel = new CheckBoxPanel(componentId, addressCampaignValueListPage.new SelectItemModel(address.getId()), null); item.add(checkBoxPanel); cellItemListener.populateItem(item, componentId, rowModel); addRowClick(item, massUpdateMode); } }); } else { columns.add(new CellItemListenerPropertyColumn<AddressDO>(new Model<String>(page.getString("created")), getSortable("created", sortable), "created", cellItemListener) { @Override public void populateItem(final Item<ICellPopulator<AddressDO>> item, final String componentId, final IModel<AddressDO> rowModel) { final AddressDO address = rowModel.getObject(); final AddressCampaignValueDO addressCampaignValue = addressCampaignValueMap.get(address.getId()); final Integer addressCampaignValueId = addressCampaignValue != null ? addressCampaignValue.getId() : null; item.add(new ListSelectActionPanel(componentId, rowModel, AddressCampaignValueEditPage.class, addressCampaignValueId, page, DateTimeFormatter.instance().getFormattedDateTime(address.getCreated()), AddressCampaignValueEditPage.PARAMETER_ADDRESS_ID, String.valueOf(address.getId()), AddressCampaignValueEditPage.PARAMETER_ADDRESS_CAMPAIGN_ID, String.valueOf(searchFilter .getAddressCampaignId()))); addRowClick(item); cellItemListener.populateItem(item, componentId, rowModel); } }); } columns.add(new CellItemListenerPropertyColumn<AddressDO>(new Model<String>(page.getString("name")), getSortable("name", sortable), "name", cellItemListener)); columns.add(new CellItemListenerPropertyColumn<AddressDO>(new Model<String>(page.getString("firstName")), getSortable("firstName", sortable), "firstName", cellItemListener)); columns.add(new CellItemListenerPropertyColumn<AddressDO>(new Model<String>(page.getString("organization")), getSortable( "organization", sortable), "organization", cellItemListener)); columns.add(new CellItemListenerPropertyColumn<AddressDO>(new Model<String>(page.getString("address.contactStatus")), getSortable( "contactStatus", sortable), "contactStatus", cellItemListener)); columns.add(new AbstractColumn<AddressDO, String>(new Model<String>(page.getString("address.addressText"))) { @Override public void populateItem(final Item<ICellPopulator<AddressDO>> item, final String componentId, final IModel<AddressDO> rowModel) { final AddressDO address = rowModel.getObject(); final String addressText = StringHelper.listToString("|", address.getMailingAddressText(), address.getMailingZipCode() + " " + address.getMailingCity(), address.getMailingCountry()); if (massUpdateMode == false) { final AddressEditLinkPanel addressEditLinkPanel = new AddressEditLinkPanel(componentId, page, address, addressText); item.add(addressEditLinkPanel); } else { item.add(new Label(componentId, addressText)); } cellItemListener.populateItem(item, componentId, rowModel); } }); columns.add(new CellItemListenerPropertyColumn<AddressDO>(new Model<String>(page.getString("address.addressStatus")), getSortable( "addressStatus", sortable), "addressStatus", cellItemListener)); columns.add(new AbstractColumn<AddressDO, String>(new Model<String>(page.getString("value"))) { @Override public void populateItem(final Item<ICellPopulator<AddressDO>> item, final String componentId, final IModel<AddressDO> rowModel) { final AddressDO address = rowModel.getObject(); final Integer id = address.getId(); final AddressCampaignValueDO addressCampaignValue = addressCampaignValueMap.get(id); if (addressCampaignValue != null) { item.add(new Label(componentId, addressCampaignValue.getValue())); item.add(AttributeModifier.append("style", new Model<String>("white-space: nowrap;"))); } else { item.add(new Label(componentId, "")); } cellItemListener.populateItem(item, componentId, rowModel); } }); columns.add(new AbstractColumn<AddressDO, String>(new Model<String>(page.getString("comment"))) { @Override public void populateItem(final Item<ICellPopulator<AddressDO>> item, final String componentId, final IModel<AddressDO> rowModel) { final AddressDO address = rowModel.getObject(); final Integer id = address.getId(); final AddressCampaignValueDO addressCampaignValue = addressCampaignValueMap.get(id); if (addressCampaignValue != null) { item.add(new Label(componentId, addressCampaignValue.getComment())); item.add(AttributeModifier.append("style", new Model<String>("white-space: nowrap;"))); } else { item.add(new Label(componentId, "")); } cellItemListener.populateItem(item, componentId, rowModel); } }); return columns; } @Override protected void onNextSubmit() { if (CollectionUtils.isEmpty(this.selectedItems) == true || form.getSearchFilter().getAddressCampaign() == null) { return; } final List<AddressDO> list = addressDao.internalLoad(this.selectedItems); setResponsePage(new AddressCampaignValueMassUpdatePage(this, list, form.getSearchFilter().getAddressCampaign(), personalAddressMap, addressCampaignValueMap)); } @Override public boolean isSupportsMassUpdate() { return true; } @Override protected void onBeforeRender() { addressCampaignValueDao.getAddressCampaignValuesByAddressId(addressCampaignValueMap, form.getSearchFilter()); super.onBeforeRender(); } @SuppressWarnings("serial") @Override protected void init() { personalAddressMap = personalAddressDao.getPersonalAddressByAddressId(); addressCampaignValueMap = new HashMap<Integer, AddressCampaignValueDO>(); { // Excel export final SubmitLink excelExportLink = new SubmitLink(ContentMenuEntryPanel.LINK_ID, form) { @Override public void onSubmit() { log.info("Exporting address list."); final List<AddressDO> list = getList(); final byte[] xls = addressCampaignValueExport.export(list, personalAddressMap, addressCampaignValueMap, form.getSearchFilter() .getAddressCampaign() != null ? form.getSearchFilter().getAddressCampaign().getTitle() : ""); if (xls == null || xls.length == 0) { form.addError("address.book.hasNoVCards"); return; } final String filename = "ProjectForge-AddressCampaignValueExport_" + DateHelper.getDateAsFilenameSuffix(new Date()) + ".xls"; DownloadUtils.setDownloadTarget(xls, filename); } }; final ContentMenuEntryPanel excelExportButton = new ContentMenuEntryPanel(getNewContentMenuChildId(), excelExportLink, getString("address.book.export")).setTooltip(getString("address.book.export.tooltip")); addContentMenuEntry(excelExportButton); } } /** * @see org.projectforge.web.wicket.AbstractListPage#buildList() */ @Override protected List<AddressDO> buildList() { List<AddressDO> list = super.buildList(); final String value = form.getSearchFilter().getAddressCampaignValue(); if (StringUtils.isEmpty(value) == false) { final List<AddressDO> origList = list; list = new ArrayList<AddressDO>(); for (final AddressDO address : origList) { final AddressCampaignValueDO addressCampaignValue = addressCampaignValueMap.get(address.getId()); if (addressCampaignValue != null && addressCampaignValue.getValue() != null) { if (value.equals(addressCampaignValue.getValue()) == true) { list.add(address); } } else { // address campaign value of the given address is not set: if (AddressCampaignValueListForm.ADDRESS_CAMPAIGN_VALUE_UNDEFINED.equals(value) == true) { // Filter all address campaign values without defined value: list.add(address); } } } } return list; } @Override protected void createDataTable() { final List<IColumn<AddressDO, String>> columns = createColumns(this, !isMassUpdateMode(), isMassUpdateMode()); dataTable = createDataTable(columns, "name", SortOrder.ASCENDING); form.add(dataTable); } @Override public void refresh() { super.refresh(); if (form.getSearchFilter().isNewest() == true && StringUtils.isBlank(form.getSearchFilter().getSearchString()) == true) { form.getSearchFilter().setMaxRows(form.getPageSize()); } } @Override protected AddressCampaignValueListForm newListForm(final AbstractListPage< ? , ? , ? > parentPage) { return new AddressCampaignValueListForm(this); } @Override protected AddressDao getBaseDao() { return addressDao; } protected AddressCampaignValueDao getAddressCampaignValueDao() { return addressCampaignValueDao; } }