/* * 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.isis.viewer.wicket.ui.components.actionmenu.entityactions; import java.util.List; import com.google.common.base.Strings; import org.apache.wicket.AttributeModifier; import org.apache.wicket.MarkupContainer; import org.apache.wicket.markup.html.WebMarkupContainer; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.link.AbstractLink; import org.apache.wicket.markup.html.list.ListItem; import org.apache.wicket.markup.html.list.ListView; import org.apache.wicket.model.Model; import org.apache.isis.applib.annotation.SemanticsOf; import org.apache.isis.core.commons.lang.StringExtensions; import org.apache.isis.core.metamodel.facets.members.cssclassfa.CssClassFaPosition; import org.apache.isis.viewer.wicket.ui.components.widgets.linkandlabel.ActionLink; import org.apache.isis.viewer.wicket.model.links.LinkAndLabel; import org.apache.isis.viewer.wicket.model.links.ListOfLinksModel; import org.apache.isis.viewer.wicket.ui.components.actionmenu.CssClassFaBehavior; import org.apache.isis.viewer.wicket.ui.panels.PanelAbstract; import org.apache.isis.viewer.wicket.ui.util.Components; import org.apache.isis.viewer.wicket.ui.util.CssClassAppender; public class AdditionalLinksPanel extends PanelAbstract<ListOfLinksModel> { private static final long serialVersionUID = 1L; private static final String ID_ADDITIONAL_LINK_LIST = "additionalLinkList"; private static final String ID_ADDITIONAL_LINK_ITEM = "additionalLinkItem"; private static final String ID_ADDITIONAL_LINK_TITLE = "additionalLinkTitle"; public static final String ID_ADDITIONAL_LINK = "additionalLink"; public enum Style { INLINE_LIST { @Override AdditionalLinksPanel newPanel(String id, List<LinkAndLabel> links) { return new AdditionalLinksAsListInlinePanel(id, links); } }, DROPDOWN { @Override AdditionalLinksPanel newPanel(String id, List<LinkAndLabel> links) { return new AdditionalLinksAsDropDownPanel(id, links); } }; abstract AdditionalLinksPanel newPanel(String id, List<LinkAndLabel> links); } public static AdditionalLinksPanel addAdditionalLinks( final MarkupContainer markupContainer, final String id, final List<LinkAndLabel> links, final Style style) { if(links.isEmpty()) { Components.permanentlyHide(markupContainer, id); return null; } final AdditionalLinksPanel additionalLinksPanel = style.newPanel(id, links); markupContainer.addOrReplace(additionalLinksPanel); return additionalLinksPanel; } protected AdditionalLinksPanel(final String id, final List<LinkAndLabel> links) { super(id, new ListOfLinksModel(links)); final List<LinkAndLabel> linkAndLabels = getModel().getObject(); final WebMarkupContainer container = new WebMarkupContainer(ID_ADDITIONAL_LINK_LIST); addOrReplace(container); container.setOutputMarkupId(true); setOutputMarkupId(true); final ListView<LinkAndLabel> listView = new ListView<LinkAndLabel>(ID_ADDITIONAL_LINK_ITEM, linkAndLabels) { private static final long serialVersionUID = 1L; @Override protected void populateItem(ListItem<LinkAndLabel> item) { final LinkAndLabel linkAndLabel = item.getModelObject(); final AbstractLink link = linkAndLabel.getLink(); if(link instanceof ActionLink) { final ActionLink actionLink = (ActionLink) link; item.add(new AttributeModifier("title", new Model<String>() { @Override public String getObject() { final String reasonDisabledIfAny = actionLink.getReasonDisabledIfAny(); return first(reasonDisabledIfAny, linkAndLabel.getDescriptionIfAny()); } })); } else { item.add(new AttributeModifier("title", first(linkAndLabel.getReasonDisabledIfAny(), linkAndLabel.getDescriptionIfAny()))); } // ISIS-1615, prevent bootstrap from changing the HTML link's 'title' attribute on client-side; // bootstrap will not touch the 'title' attribute once the HTML link has a 'data-original-title' attribute link.add(new AttributeModifier("data-original-title", "")); final Label viewTitleLabel = new Label(ID_ADDITIONAL_LINK_TITLE, linkAndLabel.getLabel()); if(linkAndLabel.isBlobOrClob()) { link.add(new CssClassAppender("noVeil")); } if(linkAndLabel.isPrototype()) { link.add(new CssClassAppender("prototype")); } link.add(new CssClassAppender(linkAndLabel.getActionIdentifier())); SemanticsOf semantics = linkAndLabel.getSemantics(); if (linkAndLabel.getParameters().isNoParameters() && linkAndLabel.getReasonDisabledIfAny() == null) { addConfirmationDialogIfAreYouSureSemantics(link, semantics); } final String cssClass = linkAndLabel.getCssClass(); CssClassAppender.appendCssClassTo(link, cssClass); viewTitleLabel.add(new CssClassAppender(StringExtensions.asLowerDashed(linkAndLabel.getLabel()))); link.addOrReplace(viewTitleLabel); final String cssClassFa = linkAndLabel.getCssClassFa(); if(!Strings.isNullOrEmpty(cssClassFa)) { final CssClassFaPosition position = linkAndLabel.getCssClassFaPosition(); viewTitleLabel.add(new CssClassFaBehavior(cssClassFa, position)); } item.addOrReplace(link); } }; container.addOrReplace(listView); } private static String first(String... str) { for (String s : str) { if(s != null) return s; } return null; } }