blob: 2190f809e47c92c9b6a489feabf9e26d3d6fef38 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.syncope.client.ui.commons.markup.html.form;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.lang3.tuple.MutablePair;
import org.apache.commons.lang3.tuple.Pair;
import org.apache.wicket.AttributeModifier;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.AjaxLink;
import org.apache.wicket.event.Broadcast;
import org.apache.wicket.extensions.markup.html.repeater.data.grid.ICellPopulator;
import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.form.IFormSubmitter;
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.wicketstuff.egrid.column.EditableGridActionsColumn;
import org.wicketstuff.egrid.column.EditableGridActionsPanel;
import org.wicketstuff.egrid.component.EditableDataTable;
import org.wicketstuff.egrid.model.GridOperationData;
import org.wicketstuff.egrid.model.OperationType;
import org.wicketstuff.egrid.provider.IEditableDataProvider;
import org.wicketstuff.egrid.toolbar.EditableGridHeadersToolbar;
import org.wicketstuff.egrid.toolbar.EditableGridNavigationToolbar;
public class AjaxGrid<K, V, S> extends Panel {
private static final long serialVersionUID = 1L;
protected static class NonValidatingForm<T> extends Form<T> {
protected static final long serialVersionUID = 1L;
public NonValidatingForm(final String id) {
super(id);
}
@Override
public void process(final IFormSubmitter submittingComponent) {
delegateSubmit(submittingComponent);
}
}
protected EditableDataTable<Pair<K, V>, S> dataTable;
public AjaxGrid(
final String id,
final List<? extends IColumn<Pair<K, V>, S>> columns,
final IEditableDataProvider<Pair<K, V>, S> dataProvider,
final long rowsPerPage) {
super(id);
List<IColumn<Pair<K, V>, S>> newCols = new ArrayList<>();
newCols.addAll(columns);
newCols.add(new AjaxGridActionsColumn<>(new Model<>("Actions")));
dataTable = new EditableDataTable<>("dataTable", newCols, dataProvider, rowsPerPage, null) {
protected static final long serialVersionUID = 1L;
@Override
protected void onError(final AjaxRequestTarget target) {
AjaxGrid.this.onError(target);
}
@Override
protected Item<Pair<K, V>> newRowItem(final String id, final int index, final IModel<Pair<K, V>> model) {
return super.newRowItem(id, index, model);
}
};
dataTable.setOutputMarkupId(true);
dataTable.addTopToolbar(new EditableGridNavigationToolbar(dataTable));
if (displayHeader()) {
dataTable.addTopToolbar(new EditableGridHeadersToolbar<>(dataTable, dataProvider));
}
if (displayAdd()) {
dataTable.addBottomToolbar(newAddBottomToolbar(dataTable, dataProvider));
}
Form<Pair<K, V>> form = new NonValidatingForm<>("form");
form.setOutputMarkupId(true);
form.add(dataTable);
add(form);
}
public AjaxGrid<K, V, S> setTableBodyCss(final String cssStyle) {
dataTable.setTableBodyCss(cssStyle);
return this;
}
public AjaxGrid<K, V, S> setTableCss(final String cssStyle) {
dataTable.add(AttributeModifier.replace("class", cssStyle));
return this;
}
protected EditableDataTable.RowItem<Pair<K, V>> newRowItem(
final String id, final int index, final IModel<Pair<K, V>> model) {
return new EditableDataTable.RowItem<>(id, index, model);
}
protected AjaxGridBottomToolbar<Pair<K, V>, S> newAddBottomToolbar(
final EditableDataTable<Pair<K, V>, S> dataTable,
final IEditableDataProvider<Pair<K, V>, S> dataProvider) {
return new AjaxGridBottomToolbar<>(dataTable) {
protected static final long serialVersionUID = 1L;
@Override
protected Pair<K, V> newRowInstance() {
return new MutablePair<>();
}
@Override
protected void onAdd(final AjaxRequestTarget target, final Pair<K, V> newRow) {
dataProvider.add(newRow);
target.add(dataTable);
AjaxGrid.this.onAdd(target, newRow);
}
@Override
protected void onError(final AjaxRequestTarget target) {
super.onError(target);
AjaxGrid.this.onError(target);
}
};
}
protected boolean allowDelete(final Item<Pair<K, V>> rowItem) {
return true;
}
protected boolean displayHeader() {
return true;
}
protected boolean displayAdd() {
return true;
}
protected void onCancel(final AjaxRequestTarget target) {
}
protected void onDelete(final AjaxRequestTarget target, final IModel<Pair<K, V>> rowModel) {
}
protected void onSave(final AjaxRequestTarget target, final IModel<Pair<K, V>> rowModel) {
}
protected void onError(final AjaxRequestTarget target) {
}
protected void onAdd(final AjaxRequestTarget target, final Pair<K, V> newRow) {
}
protected class AjaxGridActionsColumn<P, S> extends EditableGridActionsColumn<Pair<K, V>, S> {
protected static final long serialVersionUID = 1L;
public AjaxGridActionsColumn(final IModel<String> displayModel) {
super(displayModel);
}
@Override
public void populateItem(
final Item<ICellPopulator<Pair<K, V>>> item,
final String componentId,
final IModel<Pair<K, V>> rowModel) {
item.add(new AjaxGridActionsPanel<>(componentId, item));
}
@Override
protected void onError(final AjaxRequestTarget target, final IModel<Pair<K, V>> rowModel) {
AjaxGrid.this.onError(target);
}
@Override
protected void onSave(final AjaxRequestTarget target, final IModel<Pair<K, V>> rowModel) {
AjaxGrid.this.onSave(target, rowModel);
}
@Override
protected void onDelete(final AjaxRequestTarget target, final IModel<Pair<K, V>> rowModel) {
AjaxGrid.this.onDelete(target, rowModel);
}
@Override
protected void onCancel(final AjaxRequestTarget target) {
AjaxGrid.this.onCancel(target);
}
@Override
protected boolean allowDelete(final Item<Pair<K, V>> rowItem) {
return AjaxGrid.this.allowDelete(rowItem);
}
}
protected class AjaxGridActionsPanel<T> extends EditableGridActionsPanel<Pair<K, V>> {
private final Item<Pair<K, V>> rowItem;
@SuppressWarnings("unchecked")
public AjaxGridActionsPanel(final String id, final Item<ICellPopulator<Pair<K, V>>> item) {
super(id, item);
rowItem = item.findParent(Item.class);
addOrReplace(new AjaxLink<String>("delete") {
@SuppressWarnings("unchecked")
@Override
public void onClick(final AjaxRequestTarget target) {
EditableDataTable eventTarget = rowItem.findParent(EditableDataTable.class);
send(getPage(), Broadcast.BREADTH, new GridOperationData<>(
OperationType.DELETE, (T) rowItem.getDefaultModelObject(), eventTarget));
target.add(eventTarget);
onDelete(target);
}
@Override
public boolean isVisible() {
return AjaxGridActionsPanel.this.allowDelete(rowItem);
}
});
}
@Override
protected void onSave(final AjaxRequestTarget target) {
AjaxGrid.this.onSave(target, rowItem.getModel());
}
@Override
protected void onError(final AjaxRequestTarget target) {
AjaxGrid.this.onError(target);
}
@Override
protected void onCancel(final AjaxRequestTarget target) {
AjaxGrid.this.onCancel(target);
}
@Override
protected void onDelete(final AjaxRequestTarget target) {
AjaxGrid.this.onDelete(target, rowItem.getModel());
}
}
}