blob: b3c40091bcb403ccff3e782d8e419cf7b7a2cc4c [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.console.events;
import java.util.List;
import java.util.Set;
import org.apache.syncope.client.ui.commons.Constants;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior;
import org.apache.wicket.event.Broadcast;
import org.apache.wicket.event.IEvent;
import org.apache.wicket.markup.ComponentTag;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.form.IChoiceRenderer;
import org.apache.wicket.markup.html.form.ListMultipleChoice;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.util.ListModel;
public class SelectedEventsPanel extends Panel {
private static final long serialVersionUID = -4832450230348213500L;
private final WebMarkupContainer selectionContainer;
private final IModel<List<String>> model;
public SelectedEventsPanel(final String id, final IModel<List<String>> model) {
super(id);
this.model = model;
selectionContainer = new WebMarkupContainer("selectionContainer");
selectionContainer.setOutputMarkupId(true);
add(selectionContainer);
ListMultipleChoice<String> selectedEvents =
new ListMultipleChoice<>("selectedEvents", new ListModel<>(), model) {
private static final long serialVersionUID = 1226677544225737338L;
@Override
protected void onComponentTag(final ComponentTag tag) {
super.onComponentTag(tag);
tag.remove("size");
tag.remove("multiple");
tag.put("size", 5);
}
};
selectedEvents.setMaxRows(5);
selectedEvents.setChoiceRenderer(new IChoiceRenderer<>() {
private static final long serialVersionUID = -4288397951948436434L;
@Override
public Object getDisplayValue(final String object) {
return object;
}
@Override
public String getIdValue(final String object, final int index) {
return object;
}
@Override
public String getObject(final String id, final IModel<? extends List<? extends String>> choices) {
return id;
}
});
selectedEvents.add(new AjaxFormComponentUpdatingBehavior(Constants.ON_CHANGE) {
private static final long serialVersionUID = -151291731388673682L;
@Override
protected void onUpdate(final AjaxRequestTarget target) {
send(SelectedEventsPanel.this.getPage(),
Broadcast.BREADTH,
new InspectSelectedEvent(target, selectedEvents.getModelValue()));
}
});
selectionContainer.add(selectedEvents);
}
@Override
public void onEvent(final IEvent<?> event) {
if (event.getPayload() instanceof EventSelectionChanged) {
EventSelectionChanged eventSelectionChanged = (EventSelectionChanged) event.getPayload();
eventSelectionChanged.getToBeRemoved().
forEach(toBeRemoved -> model.getObject().remove(toBeRemoved));
eventSelectionChanged.getToBeAdded().stream().
filter(toBeAdded -> !model.getObject().contains(toBeAdded)).
forEach(toBeAdded -> model.getObject().add(toBeAdded));
eventSelectionChanged.getTarget().add(selectionContainer);
}
}
public static class InspectSelectedEvent {
private final AjaxRequestTarget target;
private final String event;
public InspectSelectedEvent(final AjaxRequestTarget target, final String event) {
this.target = target;
this.event = event;
}
public AjaxRequestTarget getTarget() {
return target;
}
public String getEvent() {
return event;
}
}
public static class EventSelectionChanged {
private final AjaxRequestTarget target;
private final Set<String> toBeRemoved;
private final Set<String> toBeAdded;
public EventSelectionChanged(
final AjaxRequestTarget target,
final Set<String> toBeAdded,
final Set<String> toBeRemoved) {
this.target = target;
this.toBeAdded = toBeAdded;
this.toBeRemoved = toBeRemoved;
}
public AjaxRequestTarget getTarget() {
return target;
}
public Set<String> getToBeRemoved() {
return toBeRemoved;
}
public Set<String> getToBeAdded() {
return toBeAdded;
}
}
}