blob: 4591590ddac9e2064bf92c4136c1f53c3986f390 [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.wicket.markup.html.form;
import java.io.Serializable;
import org.apache.commons.lang3.StringUtils;
import org.apache.syncope.client.console.SyncopeConsoleSession;
import org.apache.syncope.client.console.wicket.markup.html.form.ActionLink.ActionType;
import org.apache.syncope.client.console.wicket.markup.html.link.VeilPopupSettings;
import org.apache.syncope.client.ui.commons.Constants;
import org.apache.wicket.AttributeModifier;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.authroles.authorization.strategies.role.metadata.MetaDataRoleAuthorizationStrategy;
import org.apache.wicket.event.Broadcast;
import org.apache.wicket.extensions.ajax.markup.html.IndicatingAjaxLink;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.link.AbstractLink;
import org.apache.wicket.markup.html.link.BookmarkablePageLink;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.ResourceModel;
/**
* This empty class must exist because there not seems to be alternative to provide specialized HTML for edit links.
*
* @param <T> model object type.
*/
public final class ActionPanel<T extends Serializable> extends Panel {
private static final long serialVersionUID = 322966537010107771L;
private final Label actionIcon;
private final Label actionLabel;
private boolean disableIndicator = false;
private final Action<T> action;
public ActionPanel(final IModel<T> model, final Action<T> action) {
this(Constants.ACTION, model, action);
}
public ActionPanel(final String componentId, final IModel<T> model, final Action<T> action) {
super(componentId);
setOutputMarkupId(true);
this.action = action;
final T obj;
if (model == null) {
obj = null;
} else {
obj = model.getObject();
}
final boolean enabled;
final AbstractLink actionLink;
if (action.getLink() == null || action.getType() == ActionType.NOT_FOUND) {
enabled = true;
actionLink = new IndicatingAjaxLink<Void>(Constants.ACTION) {
private static final long serialVersionUID = -7978723352517770644L;
@Override
public boolean isEnabled() {
return false;
}
@Override
public void onClick(final AjaxRequestTarget target) {
}
};
} else if (action.getType() == ActionType.EXTERNAL_EDITOR) {
enabled = action.getLink().isEnabled(obj);
actionLink = new BookmarkablePageLink<>(
Constants.ACTION, action.getLink().getPageClass(), action.getLink().getPageParameters()).
setPopupSettings(new VeilPopupSettings().setHeight(600).setWidth(800));
} else {
enabled = action.getLink().isEnabled(obj);
actionLink = action.isOnConfirm()
? new IndicatingOnConfirmAjaxLink<Void>(
Constants.ACTION,
StringUtils.isNotBlank(action.getLink().getConfirmMessage())
? action.getLink().getConfirmMessage()
: Constants.CONFIRM_DELETE, enabled) {
private static final long serialVersionUID = -7978723352517770644L;
@Override
public void onClick(final AjaxRequestTarget target) {
beforeOnClick(target);
action.getLink().onClick(target, obj);
}
@Override
public String getAjaxIndicatorMarkupId() {
return disableIndicator || !action.getLink().isIndicatorEnabled()
? StringUtils.EMPTY : Constants.VEIL_INDICATOR_MARKUP_ID;
}
}
: new IndicatingAjaxLink<Void>(Constants.ACTION) {
private static final long serialVersionUID = -7978723352517770644L;
@Override
public void onClick(final AjaxRequestTarget target) {
beforeOnClick(target);
action.getLink().onClick(target, obj);
}
@Override
public String getAjaxIndicatorMarkupId() {
return disableIndicator || !action.getLink().isIndicatorEnabled()
? StringUtils.EMPTY : Constants.VEIL_INDICATOR_MARKUP_ID;
}
};
}
if (SyncopeConsoleSession.get().owns(action.getEntitlements(), action.getRealms())) {
MetaDataRoleAuthorizationStrategy.authorizeAll(actionLink, RENDER);
} else {
MetaDataRoleAuthorizationStrategy.unauthorizeAll(actionLink, RENDER);
}
actionLink.setVisible(enabled);
actionIcon = new Label("actionIcon", "");
actionLink.add(actionIcon);
final String clazz = action.getType().name().toLowerCase() + ".class";
actionIcon.add(new AttributeModifier("class", new ResourceModel(clazz, clazz)));
final String title = action.getType().name().toLowerCase() + ".title";
final IModel<String> titleModel = new ResourceModel(title, title);
actionIcon.add(new AttributeModifier("title", titleModel));
final String alt = action.getType().name().toLowerCase() + ".alt";
actionIcon.add(new AttributeModifier("alt", new ResourceModel(alt, alt)));
actionLabel = new Label("label", titleModel);
actionLink.add(actionLabel);
add(actionLink);
// ---------------------------
// Action configuration
// ---------------------------
actionLabel.setVisible(action.isVisibleLabel());
if (action.getLabel() != null) {
actionLabel.setDefaultModel(action.getLabel());
}
if (action.getTitle() != null) {
actionIcon.add(new AttributeModifier("title", action.getTitle()));
}
if (action.getAlt() != null) {
actionIcon.add(new AttributeModifier("alt", action.getAlt()));
}
if (action.getIcon() != null) {
actionIcon.add(new AttributeModifier("class", action.getIcon()));
}
this.disableIndicator = !action.hasIndicator();
// ---------------------------
}
protected void beforeOnClick(final AjaxRequestTarget target) {
switch (this.action.getType()) {
case DELETE:
case CREATE:
case MEMBERS:
case MAPPING:
case SET_LATEST_SYNC_TOKEN:
case REMOVE_SYNC_TOKEN:
case EDIT_APPROVAL:
case CLAIM:
send(this, Broadcast.BUBBLE, new ActionLinksTogglePanel.ActionLinkToggleCloseEventPayload(target));
break;
default:
break;
}
}
}