package com.evolveum.midpoint.web.page.admin.reports.component; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.apache.wicket.Component; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior; import org.apache.wicket.behavior.AttributeAppender; import org.apache.wicket.extensions.markup.html.repeater.data.grid.ICellPopulator; import org.apache.wicket.extensions.markup.html.repeater.data.table.DataTable; import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn; import org.apache.wicket.extensions.markup.html.repeater.data.table.ISortableDataProvider; import org.apache.wicket.markup.html.form.FormComponent; 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.validation.IValidatable; import org.apache.wicket.validation.IValidator; import org.apache.wicket.validation.ValidationError; import com.evolveum.midpoint.gui.api.component.BasePanel; import com.evolveum.midpoint.web.component.AjaxButton; import com.evolveum.midpoint.web.component.data.BoxedTablePanel; import com.evolveum.midpoint.web.component.data.column.CheckBoxColumn; import com.evolveum.midpoint.web.component.data.column.CheckBoxHeaderColumn; import com.evolveum.midpoint.web.component.data.column.CheckBoxPanel; import com.evolveum.midpoint.web.component.data.column.EditableLinkColumn; import com.evolveum.midpoint.web.component.data.column.LinkColumn; import com.evolveum.midpoint.web.component.input.TextPanel; import com.evolveum.midpoint.web.component.util.ListDataProvider; import com.evolveum.midpoint.web.page.admin.reports.dto.JasperReportFieldDto; import com.evolveum.midpoint.web.page.admin.reports.dto.JasperReportParameterDto; import com.evolveum.midpoint.web.page.admin.reports.dto.ReportDto; import com.evolveum.midpoint.web.util.Base64Model; public class JasperReportConfigurationPanel extends BasePanel<ReportDto> { private static final long serialVersionUID = 1L; private static final String ID_PARAMETERS_TABLE = "parametersTable"; private static final String ID_FIELDS_TABLE = "fieldsTable"; private static final String ID_BUTTON_ADD_PARAMETER = "addParameter"; private static final String ID_BUTTON_ADD_FIELD = "addField"; private static final String ID_QUERY = "query"; private static final String ID_TEMPLATE = "template"; private static final String ID_DELETE_PARAMETER = "deleteParameter"; private static final String ID_DELETE_FIELD = "deleteField"; public JasperReportConfigurationPanel(String id, IModel<ReportDto> model) { super(id, model); initLayout(); } protected void initLayout() { AceEditorPanel queryPanel = new AceEditorPanel(ID_QUERY, createStringResource("JasperReportConfigurationPanel.reportQuery"), new PropertyModel<String>(getModel(), "jasperReportDto.query")); add(queryPanel); initParametersTable(); initFiledsTable(); IModel<String> data = new Base64Model(new PropertyModel<byte[]>(getModel(), "jasperReportDto.jasperReportXml")); AceEditorPanel templateEditor = new AceEditorPanel(ID_TEMPLATE, createStringResource("PageReport.jasperTemplate"), data, 300); add(templateEditor); } private void initParametersTable() { ISortableDataProvider<JasperReportParameterDto, String> provider = new ListDataProvider<JasperReportParameterDto>(this, new PropertyModel<List<JasperReportParameterDto>>(getModel(), "jasperReportDto.parameters")); BoxedTablePanel<JasperReportParameterDto> table = new BoxedTablePanel<>(ID_PARAMETERS_TABLE, provider, initParameterColumns(), null, 10); // table.setShowPaging(false); table.setOutputMarkupId(true); add(table); AjaxButton addParameter = new AjaxButton(ID_BUTTON_ADD_PARAMETER, createStringResource("JasperReportConfigurationPanel.addParameter")) { private static final long serialVersionUID = 1L; @Override public void onClick(AjaxRequestTarget target) { addParameterPerformed(target); } }; add(addParameter); AjaxButton deleteParameter = new AjaxButton(ID_DELETE_PARAMETER, createStringResource("JasperReportConfigurationPanel.deleteParameter")) { private static final long serialVersionUID = 1L; @Override public void onClick(AjaxRequestTarget target) { deleteParameterPerformed(target); } }; add(deleteParameter); } private void initFiledsTable() { ISortableDataProvider<JasperReportFieldDto, String> provider = new ListDataProvider<JasperReportFieldDto>(this, new PropertyModel<List<JasperReportFieldDto>>(getModel(), "jasperReportDto.fields")); BoxedTablePanel<JasperReportFieldDto> table = new BoxedTablePanel<JasperReportFieldDto>(ID_FIELDS_TABLE, provider, initFieldColumns(), null, 10); // table.setShowPaging(false); table.setOutputMarkupId(true); add(table); AjaxButton addParameter = new AjaxButton(ID_BUTTON_ADD_FIELD, createStringResource("JasperReportConfigurationPanel.addField")) { private static final long serialVersionUID = 1L; @Override public void onClick(AjaxRequestTarget target) { addFieldPerformed(target); } }; add(addParameter); AjaxButton deleteParameter = new AjaxButton(ID_DELETE_FIELD, createStringResource("JasperReportConfigurationPanel.deleteField")) { private static final long serialVersionUID = 1L; @Override public void onClick(AjaxRequestTarget target) { deleteFieldPerformed(target); } }; add(deleteParameter); } private void addParameterPerformed(AjaxRequestTarget target) { ReportDto dto = getModel().getObject(); JasperReportParameterDto parameter = new JasperReportParameterDto(); parameter.setEditing(true); dto.getJasperReportDto().getParameters().add(parameter); BoxedTablePanel<JasperReportParameterDto> parametersTable = getParametersTable(); adjustParametersTablePage(parametersTable, dto); target.add(getParametersTable()); } private void deleteParameterPerformed(AjaxRequestTarget target) { Iterator<JasperReportParameterDto> iterator = getModelObject().getJasperReportDto().getParameters().iterator(); while (iterator.hasNext()) { JasperReportParameterDto item = iterator.next(); if (item.isSelected()) { iterator.remove(); } } target.add(getParametersTable()); } private void addFieldPerformed(AjaxRequestTarget target) { ReportDto dto = getModel().getObject(); JasperReportFieldDto parameter = new JasperReportFieldDto(); parameter.setEditing(true); dto.getJasperReportDto().getFields().add(parameter); BoxedTablePanel<JasperReportFieldDto> fieldsTable = getFieldsTable(); adjustFieldsTablePage(fieldsTable, dto); target.add(getFieldsTable()); } private void deleteFieldPerformed(AjaxRequestTarget target) { Iterator<JasperReportFieldDto> iterator = getModelObject().getJasperReportDto().getFields().iterator(); while (iterator.hasNext()) { JasperReportFieldDto item = iterator.next(); if (item.isSelected()) { iterator.remove(); } } target.add(getFieldsTable()); } @SuppressWarnings("unchecked") private void adjustParametersTablePage(BoxedTablePanel<JasperReportParameterDto> parametersTable, ReportDto dto) { if (parametersTable != null && dto.getJasperReportDto().getParameters().size() % 10 == 1 && dto.getJasperReportDto().getParameters().size() != 1) { DataTable<JasperReportParameterDto, String> table = parametersTable.getDataTable(); if (table != null) { table.setCurrentPage((long) (dto.getJasperReportDto().getParameters().size() / 10)); } } } @SuppressWarnings("unchecked") private void adjustFieldsTablePage(BoxedTablePanel<JasperReportFieldDto> parametersTable, ReportDto dto) { if (parametersTable != null && dto.getJasperReportDto().getFields().size() % 10 == 1 && dto.getJasperReportDto().getFields().size() != 1) { DataTable<JasperReportFieldDto, String> table = parametersTable.getDataTable(); if (table != null) { table.setCurrentPage((long) (dto.getJasperReportDto().getFields().size() / 10)); } } } private List<IColumn<JasperReportParameterDto, String>> initParameterColumns() { List<IColumn<JasperReportParameterDto, String>> columns = new ArrayList<>(); IColumn<JasperReportParameterDto, String> column = new CheckBoxHeaderColumn<>(); columns.add(column); // name editing column columns.add(buildEditableLinkColumn("JasperReportConfigurationPanel.parameterName", null, "name", true)); // class editing column columns.add( buildEditableLinkColumn("JasperReportConfigurationPanel.parameterClass", null, "typeAsString", true)); columns.add( buildEditableLinkColumn("JasperReportConfigurationPanel.nestedClass", null, "nestedTypeAsString", true)); columns.add(new LinkColumn<JasperReportParameterDto>(createStringResource("JasperReportConfigurationPanel.properties")) { private static final long serialVersionUID = 1L; @Override public void onClick(AjaxRequestTarget target, IModel<JasperReportParameterDto> rowModel) { showPropertiesPopup(target, rowModel); } @Override protected IModel createLinkModel(IModel<JasperReportParameterDto> rowModel) { return createStringResource("JasperReportConfigurationPanel.configure"); } }); CheckBoxColumn<JasperReportParameterDto> forPrompting = new CheckBoxColumn<JasperReportParameterDto>( createStringResource("JasperReportConfigurationPanel.forPrompting"), "forPrompting") { private static final long serialVersionUID = 1L; @Override public void populateItem(Item<ICellPopulator<JasperReportParameterDto>> cellItem, String componentId, IModel<JasperReportParameterDto> rowModel) { CheckBoxPanel checkBox = new CheckBoxPanel(componentId, new PropertyModel<Boolean>(rowModel, getPropertyExpression()), new Model<>(true)); cellItem.add(checkBox); } }; columns.add(forPrompting); return columns; } private void showPropertiesPopup(AjaxRequestTarget target, IModel<JasperReportParameterDto> rowModel) { ParameterPropertiesPopupPanel propertiesPopup = new ParameterPropertiesPopupPanel(getPageBase().getMainPopupBodyId(), new PropertyModel<>(rowModel, "properties")); getPageBase().showMainPopup(propertiesPopup, target); } private EditableLinkColumn<JasperReportParameterDto> buildEditableLinkColumn(String resource, String resourceParam, String property, final Boolean mandatory) { return new EditableLinkColumn<JasperReportParameterDto>(createStringResource(resource, resourceParam), property) { private static final long serialVersionUID = 1L; @Override protected Component createInputPanel(String componentId, final IModel<JasperReportParameterDto> model) { return createTextPanel(componentId, model, getPropertyExpression(), mandatory); } @Override public void onClick(AjaxRequestTarget target, IModel<JasperReportParameterDto> rowModel) { parameterEditPerformed(target, rowModel); } }; } private void parameterEditPerformed(AjaxRequestTarget target, IModel<JasperReportParameterDto> rowModel) { JasperReportParameterDto parameter = rowModel.getObject(); parameter.setEditing(true); target.add(getParametersTable()); } @SuppressWarnings("unchecked") private BoxedTablePanel<JasperReportParameterDto> getParametersTable() { return (BoxedTablePanel<JasperReportParameterDto>) get(ID_PARAMETERS_TABLE); } private List<IColumn<JasperReportFieldDto, String>> initFieldColumns() { List<IColumn<JasperReportFieldDto, String>> columns = new ArrayList<>(); IColumn<JasperReportFieldDto, String> column = new CheckBoxHeaderColumn<>(); columns.add(column); // name editing column columns.add(new EditableLinkColumn<JasperReportFieldDto>( createStringResource("JasperReportConfigurationPanel.fieldName"), "name") { private static final long serialVersionUID = 1L; @Override protected Component createInputPanel(String componentId, final IModel<JasperReportFieldDto> model) { return createTextPanel(componentId, model, getPropertyExpression(), true); } @Override public void onClick(AjaxRequestTarget target, IModel<JasperReportFieldDto> rowModel) { fieldEditPerformed(target, rowModel); } }); // class editing column columns.add(new EditableLinkColumn<JasperReportFieldDto>( createStringResource("JasperReportConfigurationPanel.fieldClass"), "typeAsString") { private static final long serialVersionUID = 1L; @Override protected Component createInputPanel(String componentId, IModel<JasperReportFieldDto> model) { return createTextPanel(componentId, model, getPropertyExpression(), true); } @Override public void onClick(AjaxRequestTarget target, IModel<JasperReportFieldDto> rowModel) { fieldEditPerformed(target, rowModel); } }); return columns; } private void fieldEditPerformed(AjaxRequestTarget target, IModel<JasperReportFieldDto> rowModel) { JasperReportFieldDto parameter = rowModel.getObject(); parameter.setEditing(true); target.add(getFieldsTable()); } @SuppressWarnings("unchecked") private BoxedTablePanel<JasperReportFieldDto> getFieldsTable() { return (BoxedTablePanel<JasperReportFieldDto>) get(ID_FIELDS_TABLE); } @SuppressWarnings({ "rawtypes", "unchecked" }) private <J> Component createTextPanel(String componentId, final IModel<J> model, String expression, final Boolean mandatory) { TextPanel<String> textPanel = new TextPanel<String>(componentId, new PropertyModel<String>(model, expression)); FormComponent input = textPanel.getBaseFormComponent(); input.add(new AttributeAppender("style", "width: 100%")); input.add(new EmptyOnBlurAjaxFormUpdatingBehaviour()); input.add(new IValidator() { private static final long serialVersionUID = 1L; @Override public void validate(IValidatable validatable) { if (!mandatory) { return; } if (validatable.getValue() == null) { validatable.error(new ValidationError("JasperReportConfigurationPanel.errormsg")); } } }); return textPanel; } private static class EmptyOnBlurAjaxFormUpdatingBehaviour extends AjaxFormComponentUpdatingBehavior { private static final long serialVersionUID = 1L; public EmptyOnBlurAjaxFormUpdatingBehaviour() { super("blur"); } @Override protected void onUpdate(AjaxRequestTarget target) { } } }