/******************************************************************************* * Copyright (c) 2015 Development Gateway, Inc and others. * * All rights reserved. This program and the accompanying materials * are made available under the terms of the MIT License (MIT) * which accompanies this distribution, and is available at * https://opensource.org/licenses/MIT * * Contributors: * Development Gateway - initial API and implementation *******************************************************************************/ package org.devgateway.toolkit.forms.wicket.page.lists; import java.util.ArrayList; import java.util.List; import org.apache.wicket.Component; import org.apache.wicket.extensions.markup.html.repeater.data.grid.ICellPopulator; 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.extensions.markup.html.repeater.data.table.PropertyColumn; import org.apache.wicket.extensions.markup.html.repeater.data.table.filter.FilterToolbar; import org.apache.wicket.extensions.markup.html.repeater.data.table.filter.IFilteredColumn; import org.apache.wicket.markup.html.WebMarkupContainer; import org.apache.wicket.markup.html.panel.Panel; import org.apache.wicket.markup.repeater.Item; import org.apache.wicket.model.IModel; import org.apache.wicket.model.Model; import org.apache.wicket.model.StringResourceModel; import org.apache.wicket.request.mapper.parameter.PageParameters; import org.apache.wicket.util.lang.Classes; import org.devgateway.toolkit.forms.WebConstants; import org.devgateway.toolkit.forms.exceptions.NullEditPageClassException; import org.devgateway.toolkit.forms.exceptions.NullJpaRepositoryException; import org.devgateway.toolkit.forms.wicket.components.table.AjaxFallbackBootstrapDataTable; import org.devgateway.toolkit.forms.wicket.components.table.JpaFilterState; import org.devgateway.toolkit.forms.wicket.components.table.ResettingFilterForm; import org.devgateway.toolkit.forms.wicket.page.BasePage; import org.devgateway.toolkit.forms.wicket.page.RevisionsPage; import org.devgateway.toolkit.forms.wicket.page.edit.AbstractEditPage; import org.devgateway.toolkit.forms.wicket.providers.SortableJpaRepositoryDataProvider; import org.devgateway.toolkit.persistence.dao.GenericPersistable; import org.devgateway.toolkit.persistence.repository.BaseJpaRepository; import de.agilecoders.wicket.core.markup.html.bootstrap.button.BootstrapBookmarkablePageLink; import de.agilecoders.wicket.core.markup.html.bootstrap.button.Buttons; import de.agilecoders.wicket.core.markup.html.bootstrap.button.Buttons.Size; import de.agilecoders.wicket.extensions.markup.html.bootstrap.icon.FontAwesomeIconType; /** * @author mpostelnicu This class can be use to display a list of Categories * * T - entity type Y - filter */ public abstract class AbstractListPage<T extends GenericPersistable> extends BasePage { private static final long serialVersionUID = 1958350868666244087L; protected BootstrapBookmarkablePageLink<T> editPageLink; /** * Get a stub print button that does nothing * * @param pageParameters * @return */ protected Component getPrintButton(final PageParameters pageParameters) { return new WebMarkupContainer("printButton").setVisibilityAllowed(false); } public class ActionPanel extends Panel { private static final long serialVersionUID = 5821419128121941939L; /** * @param id * @param model */ public ActionPanel(final String id, final IModel<T> model) { super(id, model); final PageParameters pageParameters = new PageParameters(); @SuppressWarnings("unchecked") T entity = (T) ActionPanel.this.getDefaultModelObject(); if (entity != null) { pageParameters.set(WebConstants.PARAM_ID, entity.getId()); } BootstrapBookmarkablePageLink<T> editPageLink = new BootstrapBookmarkablePageLink<>("edit", editPageClass, pageParameters, Buttons.Type.Info); editPageLink.setIconType(FontAwesomeIconType.edit).setSize(Size.Small) .setLabel(new StringResourceModel("edit", AbstractListPage.this, null)); add(editPageLink); add(getPrintButton(pageParameters)); PageParameters revisionsPageParameters = new PageParameters(); revisionsPageParameters.set(WebConstants.PARAM_ID, entity.getId()); revisionsPageParameters.set(WebConstants.PARAM_ENTITY_CLASS, entity.getClass().getName()); BootstrapBookmarkablePageLink<Void> revisionsPageLink = new BootstrapBookmarkablePageLink<>("revisions", RevisionsPage.class, revisionsPageParameters, Buttons.Type.Info); revisionsPageLink.setIconType(FontAwesomeIconType.clock_o).setSize(Size.Small) .setLabel(new StringResourceModel("revisions", AbstractListPage.this, null)); add(revisionsPageLink); } } protected Class<? extends AbstractEditPage<T>> editPageClass; protected AjaxFallbackBootstrapDataTable<T, String> dataTable; protected List<IColumn<T, String>> columns; protected BaseJpaRepository<T, Long> jpaRepository; public AbstractListPage(final PageParameters parameters) { super(parameters); columns = new ArrayList<>(); columns.add(new PropertyColumn<T, String>(new Model<>("ID"), "id", "id")); } public ActionPanel getActionPanel(final String id, final IModel<T> model) { return new ActionPanel(id, model); } @Override protected void onInitialize() { super.onInitialize(); if (jpaRepository == null) { throw new NullJpaRepositoryException(); } if (editPageClass == null) { throw new NullEditPageClassException(); } SortableJpaRepositoryDataProvider<T> dataProvider = new SortableJpaRepositoryDataProvider<>(jpaRepository); dataProvider.setFilterState(newFilterState()); // add the 'Edit' button columns.add(new AbstractColumn<T, String>(new StringResourceModel("actionsColumn", this, null)) { private static final long serialVersionUID = -7447601118569862123L; @Override public void populateItem(final Item<ICellPopulator<T>> cellItem, final String componentId, final IModel<T> model) { cellItem.add(getActionPanel(componentId, model)); } }); dataTable = new AjaxFallbackBootstrapDataTable<>("table", columns, dataProvider, WebConstants.PAGE_SIZE); ResettingFilterForm<JpaFilterState<T>> filterForm = new ResettingFilterForm<>("filterForm", dataProvider, dataTable); filterForm.add(dataTable); add(filterForm); if (hasFilteredColumns()) { dataTable.addTopToolbar(new FilterToolbar(dataTable, filterForm)); } PageParameters pageParameters = new PageParameters(); pageParameters.set(WebConstants.PARAM_ID, null); editPageLink = new BootstrapBookmarkablePageLink<T>("new", editPageClass, pageParameters, Buttons.Type.Success); editPageLink.setIconType(FontAwesomeIconType.plus_circle).setSize(Size.Large) .setLabel(new StringResourceModel("new", AbstractListPage.this, null)); add(editPageLink); } private boolean hasFilteredColumns() { for (IColumn<?, ?> column : columns) { if (column instanceof IFilteredColumn) { return true; } } return false; } public JpaFilterState<T> newFilterState() { return new JpaFilterState<>(); } protected String getClassName() { return Classes.simpleName(getClass()); } }