package fr.openwide.core.basicapp.web.application.administration.template;
import static fr.openwide.core.basicapp.web.application.property.BasicApplicationWebappPropertyIds.PORTFOLIO_ITEMS_PER_PAGE;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.wicket.Page;
import org.apache.wicket.Session;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.extensions.markup.html.repeater.data.grid.ICellPopulator;
import org.apache.wicket.markup.ComponentTag;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.repeater.Item;
import org.apache.wicket.markup.repeater.data.IDataProvider;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.ResourceModel;
import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.apache.wicket.spring.injection.annot.SpringBean;
import org.wicketstuff.wiquery.core.events.MouseEvent;
import fr.openwide.core.basicapp.core.business.user.model.User;
import fr.openwide.core.basicapp.core.business.user.service.IUserService;
import fr.openwide.core.basicapp.core.security.model.BasicApplicationPermissionConstants;
import fr.openwide.core.basicapp.core.util.binding.Bindings;
import fr.openwide.core.basicapp.web.application.administration.component.UserSearchPanel;
import fr.openwide.core.basicapp.web.application.administration.export.UserExcelTableExport;
import fr.openwide.core.basicapp.web.application.administration.form.AbstractUserPopup;
import fr.openwide.core.basicapp.web.application.administration.model.AbstractUserDataProvider;
import fr.openwide.core.basicapp.web.application.common.renderer.ActionRenderers;
import fr.openwide.core.basicapp.web.application.common.typedescriptor.user.UserTypeDescriptor;
import fr.openwide.core.commons.util.functional.Predicates2;
import fr.openwide.core.jpa.more.business.sort.ISort;
import fr.openwide.core.spring.property.service.IPropertyService;
import fr.openwide.core.wicket.markup.html.link.EmailLink;
import fr.openwide.core.wicket.more.condition.Condition;
import fr.openwide.core.wicket.more.export.excel.component.AbstractExcelExportAjaxLink;
import fr.openwide.core.wicket.more.export.excel.component.ExcelExportWorkInProgressModalPopupPanel;
import fr.openwide.core.wicket.more.link.model.PageModel;
import fr.openwide.core.wicket.more.markup.html.action.AbstractOneParameterAjaxAction;
import fr.openwide.core.wicket.more.markup.html.factory.ModelFactories;
import fr.openwide.core.wicket.more.markup.html.feedback.FeedbackUtils;
import fr.openwide.core.wicket.more.markup.html.link.BlankLink;
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.builder.DataTableBuilder;
import fr.openwide.core.wicket.more.markup.repeater.table.column.AbstractCoreColumn;
import fr.openwide.core.wicket.more.model.BindingModel;
import fr.openwide.core.wicket.more.rendering.BooleanRenderer;
public abstract class AdministrationUserPortfolioTemplate<U extends User> extends AdministrationTemplate {
private static final long serialVersionUID = 1824247169136460059L;
@SpringBean
private IUserService userService;
@SpringBean
private IPropertyService propertyService;
protected UserTypeDescriptor<U> typeDescriptor;
public AdministrationUserPortfolioTemplate(PageParameters parameters, UserTypeDescriptor<U> typeDescriptor, IModel<String> pageTitleModel) {
super(parameters);
this.typeDescriptor = typeDescriptor;
AbstractUserPopup<U> addPopup = createAddPopup("addPopup");
final AbstractUserDataProvider<U> dataProvider = newDataProvider();
DecoratedCoreDataTablePanel<U, ?> dataTablePanel =
createDataTable("dataTable", dataProvider, propertyService.get(PORTFOLIO_ITEMS_PER_PAGE));
add(
new Label("title", pageTitleModel),
new UserSearchPanel<>("searchPanel", dataTablePanel, typeDescriptor, dataProvider),
dataTablePanel,
addPopup,
new BlankLink("addButton")
.add(
new AjaxModalOpenBehavior(addPopup, MouseEvent.CLICK)
)
);
// Export Excel
ExcelExportWorkInProgressModalPopupPanel loadingPopup = new ExcelExportWorkInProgressModalPopupPanel("loadingPopup");
add(
loadingPopup,
new AbstractExcelExportAjaxLink("exportExcelButton", loadingPopup, "export-users-") {
private static final long serialVersionUID = 1L;
@Override
protected Workbook generateWorkbook() {
UserExcelTableExport export = new UserExcelTableExport(this);
return export.generate(dataProvider);
}
}
);
}
protected abstract AbstractUserDataProvider<U> newDataProvider();
protected abstract AbstractUserPopup<U> createAddPopup(String wicketId);
protected DecoratedCoreDataTablePanel<U, ?> createDataTable(String wicketId, final IDataProvider<U> dataProvider,
int itemsPerPage) {
PageModel<Page> pageModel = new PageModel<Page>(this);
return DataTableBuilder.start(dataProvider)
.addLabelColumn(new ResourceModel("business.user.userName"), Bindings.user().userName())
.withClass("text text-md")
.withLink(AdministrationUserDescriptionTemplate.<U>mapper().setParameter2(pageModel))
.addLabelColumn(new ResourceModel("business.user.lastName"), Bindings.user().lastName())
.withClass("text text-md")
.addLabelColumn(new ResourceModel("business.user.firstName"), Bindings.user().firstName())
.withClass("text text-md")
.addColumn(new AbstractCoreColumn<U, ISort<?>>(new ResourceModel("business.user.email")) {
private static final long serialVersionUID = 1L;
@Override
public void populateItem(Item<ICellPopulator<U>> cellItem, String componentId, IModel<U> rowModel) {
IModel<String> emailModel = BindingModel.of(rowModel, Bindings.user().email());
cellItem.add(
new EmailLink(componentId, emailModel) {
private static final long serialVersionUID = 1L;
@Override
protected void onComponentTag(ComponentTag tag) {
tag.setName("a");
super.onComponentTag(tag);
}
}
.add(Condition.predicate(emailModel, Predicates2.hasText()).thenShow())
);
}
})
.withClass("text text-md")
.addBootstrapBadgeColumn(new ResourceModel("business.user.active"), Bindings.user().active(), BooleanRenderer.get())
.withClass("icon")
.addActionColumn()
.addLink(ActionRenderers.view(), AdministrationUserDescriptionTemplate.<U>mapper().setParameter2(pageModel))
.addConfirmAction(ActionRenderers.delete())
.title(ModelFactories.stringResourceModel(
"administration.user.delete.confirmation.title",
Bindings.user().fullName()
))
.content(ModelFactories.stringResourceModel(
"administration.user.delete.confirmation.text",
Bindings.user().fullName()
))
.confirm()
.onClick(new AbstractOneParameterAjaxAction<IModel<U>>() {
private static final long serialVersionUID = 1L;
@Override
public void execute(AjaxRequestTarget target, IModel<U> parameter) {
try {
userService.delete(parameter.getObject());
Session.get().success(getString("common.delete.success"));
} catch (Exception e) {
Session.get().error(getString("common.delete.error"));
}
target.add(getPage());
dataProvider.detach();
FeedbackUtils.refreshFeedback(target, getPage());
}
})
.whenPermission(BasicApplicationPermissionConstants.DELETE)
.hidePlaceholder()
.withClassOnElements("btn-xs")
.end()
.withClass("actions actions-2x")
.withNoRecordsResourceKey("administration.user.noUsers")
.decorate()
.ajaxPagers()
.build(wicketId, itemsPerPage);
}
@SuppressWarnings("rawtypes")
@Override
protected Class<? extends AdministrationUserPortfolioTemplate> getSecondMenuPage() {
return getClass();
}
}