package fr.openwide.core.basicapp.web.application.referencedata.component; import org.apache.wicket.Component; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.extensions.markup.html.repeater.data.grid.ICellPopulator; import org.apache.wicket.markup.html.WebMarkupContainer; import org.apache.wicket.markup.html.panel.Fragment; 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.LoadableDetachableModel; import org.apache.wicket.model.Model; import org.apache.wicket.spring.injection.annot.SpringBean; import org.wicketstuff.wiquery.core.events.MouseEvent; import fr.openwide.core.basicapp.web.application.property.BasicApplicationWebappPropertyIds; import fr.openwide.core.basicapp.web.application.referencedata.form.AbstractGenericListItemPopup; import fr.openwide.core.jpa.more.business.generic.model.GenericListItem; import fr.openwide.core.jpa.more.business.sort.ISort; import fr.openwide.core.jpa.security.model.CorePermissionConstants; import fr.openwide.core.spring.property.service.IPropertyService; import fr.openwide.core.wicket.behavior.ClassAttributeAppender; import fr.openwide.core.wicket.more.condition.Condition; import fr.openwide.core.wicket.more.markup.html.factory.AbstractParameterizedComponentFactory; import fr.openwide.core.wicket.more.markup.html.sort.model.CompositeSortModel; import fr.openwide.core.wicket.more.markup.html.template.js.jquery.plugins.bootstrap.modal.behavior.AjaxModalOpenBehavior; import fr.openwide.core.wicket.more.markup.repeater.table.DecoratedCoreDataTablePanel; import fr.openwide.core.wicket.more.markup.repeater.table.DecoratedCoreDataTablePanel.AddInPlacement; import fr.openwide.core.wicket.more.markup.repeater.table.builder.DataTableBuilder; import fr.openwide.core.wicket.more.markup.repeater.table.builder.state.IAddedCoreColumnState; import fr.openwide.core.wicket.more.markup.repeater.table.builder.state.IDecoratedBuildState; import fr.openwide.core.wicket.more.markup.repeater.table.column.AbstractCoreColumn; import fr.openwide.core.wicket.more.markup.repeater.table.util.DataTableUtil; import fr.openwide.core.wicket.more.model.AbstractSearchQueryDataProvider; public abstract class AbstractGenericListItemListPanel< T extends GenericListItem<? super T>, S extends ISort<?>, D extends AbstractSearchQueryDataProvider<T,S> > extends Panel { private static final long serialVersionUID = -8240552205613934114L; @SpringBean protected IPropertyService propertyService; protected DecoratedCoreDataTablePanel<T,S> resultats; private AbstractGenericListItemPopup<T> popup; private D dataProvider; public AbstractGenericListItemListPanel(String id, final D dataProvider, CompositeSortModel<S> sortModel) { super(id); setOutputMarkupId(true); this.dataProvider = dataProvider; DataTableBuilder<T, S> builder = DataTableBuilder.start(dataProvider, sortModel); popup = createPopup("popup"); resultats = addInHeadingRight( addIn( addActionColumn( addColumns(builder) ) .bootstrapPanel() .count("listItem.count") .ajaxPagers() ) ) .build("resultats", propertyService.get(BasicApplicationWebappPropertyIds.PORTFOLIO_ITEMS_PER_PAGE)); add( popup, resultats ); } protected D getDataProvider() { return dataProvider; } protected abstract T getNewInstance(); protected abstract AbstractGenericListItemPopup<T> createPopup(String wicketId); protected AbstractGenericListItemPopup<T> getPopup() { return popup; } protected String getPermissionAdd() { return CorePermissionConstants.CREATE; } protected String getPermissionEdit() { return CorePermissionConstants.WRITE; } protected abstract IAddedCoreColumnState<T, S> addColumns(DataTableBuilder<T, S> builder); protected IAddedCoreColumnState<T, S> addActionColumn(IAddedCoreColumnState<T, S> builder) { return builder .addColumn(new AbstractCoreColumn<T, S>(new Model<String>()) { private static final long serialVersionUID = 1L; @Override public void populateItem(Item<ICellPopulator<T>> cellItem, String componentId, final IModel<T> rowModel) { Component rowItem = DataTableUtil.getRowItem(cellItem); rowItem.add(new ClassAttributeAppender(new LoadableDetachableModel<String>() { private static final long serialVersionUID = 1L; @Override protected String load() { return rowModel.getObject().isEnabled() ? "enabled" : "disabled"; } })); cellItem.add(new ItemActionsFragment(componentId, rowModel)); } }) .withClass("actions actions-2x"); } protected IDecoratedBuildState<T, S> addIn(IDecoratedBuildState<T, S> builder) { return builder .addIn(AddInPlacement.HEADING_MAIN, new AbstractParameterizedComponentFactory<Component, Component>() { private static final long serialVersionUID = 1L; @Override public Component create(String wicketId, final Component table ) { return createSearchForm(wicketId, getDataProvider(), table); } }); } protected abstract Component createSearchForm(String wicketId, D dataProvider, Component table); protected IDecoratedBuildState<T, S> addInHeadingRight(IDecoratedBuildState<T, S> builder) { return builder .addIn(AddInPlacement.HEADING_RIGHT, new AbstractParameterizedComponentFactory<Component, Component>() { private static final long serialVersionUID = 1L; @Override public Component create(String wicketId, final Component table) { return new GlobalActionsFragment(wicketId); } }); } private class ItemActionsFragment extends Fragment { private static final long serialVersionUID = 1L; public ItemActionsFragment(String id, final IModel<T> itemModel) { super(id, "itemActionsFragment", AbstractGenericListItemListPanel.this, itemModel); add(Condition.permission(itemModel, getPermissionEdit()).thenShow()); add( new WebMarkupContainer("updateButton") .add(new AjaxModalOpenBehavior(getPopup(), MouseEvent.CLICK) { private static final long serialVersionUID = 1L; @Override protected void onShow(AjaxRequestTarget target) { getPopup().setUpEdit(itemModel.getObject()); } }) ); } } private class GlobalActionsFragment extends Fragment { private static final long serialVersionUID = 1L; public GlobalActionsFragment(String id) { super(id, "globalActionsFragment", AbstractGenericListItemListPanel.this); add( new WebMarkupContainer("addButton") .add(new AjaxModalOpenBehavior(getPopup(), MouseEvent.CLICK) { private static final long serialVersionUID = 1L; @Override protected void onShow(AjaxRequestTarget target) { getPopup().setUpAdd(getNewInstance()); } }) .add(Condition.permission(getPermissionAdd()).thenShow()) ); } } }