Skip to content

Commit

Permalink
Merge remote-tracking branch 'origin/master'
Browse files Browse the repository at this point in the history
  • Loading branch information
mederly committed Jan 14, 2020
2 parents 8f2bd50 + 1ac73b0 commit 5642b45
Show file tree
Hide file tree
Showing 9 changed files with 434 additions and 67 deletions.
Expand Up @@ -13,6 +13,7 @@

import com.evolveum.midpoint.model.api.AssignmentObjectRelation;
import com.evolveum.midpoint.model.api.authentication.CompiledObjectCollectionView;
import com.evolveum.midpoint.web.component.MultiCompositedButtonPanel;
import com.evolveum.midpoint.web.component.MultiFunctinalButtonDto;
import com.evolveum.midpoint.web.component.objectdetails.AssignmentHolderTypeMainPanel;
import org.apache.wicket.AttributeModifier;
Expand Down Expand Up @@ -275,9 +276,9 @@ protected List<MultiFunctinalButtonDto> createNewButtonDescription() {
}


public MultifunctionalButton getNewItemButton(String id) {
MultifunctionalButton newObjectIcon =
new MultifunctionalButton(id, createNewButtonDescription()) {
public MultiCompositedButtonPanel getNewItemButton(String id) {
MultiCompositedButtonPanel newObjectIcon =
new MultiCompositedButtonPanel(id, createNewButtonDescription()) {
private static final long serialVersionUID = 1L;

@Override
Expand Down
@@ -0,0 +1,19 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!--
~ Copyright (c) 2010-2019 Evolveum
~
~ Licensed 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.
-->
<wicket:panel xmlns:wicket="http://wicket.apache.org">
<div wicket:id="additionalButton" />
</wicket:panel>
@@ -0,0 +1,141 @@
package com.evolveum.midpoint.web.component;

import com.evolveum.midpoint.gui.api.GuiStyleConstants;
import com.evolveum.midpoint.gui.api.component.BasePanel;
import com.evolveum.midpoint.gui.api.util.WebComponentUtil;
import com.evolveum.midpoint.gui.impl.component.AjaxCompositedIconButton;
import com.evolveum.midpoint.gui.impl.component.icon.CompositedIcon;
import com.evolveum.midpoint.gui.impl.component.icon.CompositedIconBuilder;
import com.evolveum.midpoint.gui.impl.component.icon.IconCssStyle;
import com.evolveum.midpoint.model.api.AssignmentObjectRelation;
import com.evolveum.midpoint.model.api.authentication.CompiledObjectCollectionView;
import com.evolveum.midpoint.web.component.util.VisibleBehaviour;
import com.evolveum.midpoint.xml.ns._public.common.common_3.DisplayType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.IconType;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.behavior.AttributeAppender;
import org.apache.wicket.markup.repeater.RepeatingView;
import org.apache.wicket.model.Model;

import java.util.List;

public abstract class MultiCompositedButtonPanel extends BasePanel<List<MultiFunctinalButtonDto>> {

private static final String ID_BUTTON_PANEL = "additionalButton";

private static final String DEFAULT_BUTTON_STYLE = "btn btn-default btn-sm buttons-panel-marging";

private List<MultiFunctinalButtonDto> buttonDtos;

public MultiCompositedButtonPanel(String id, List<MultiFunctinalButtonDto> buttonDtos){
super(id);
this.buttonDtos = buttonDtos;
}

@Override
protected void onInitialize(){
super.onInitialize();
initLayout();
}

private void initLayout(){
DisplayType defaultObjectButtonDisplayType = fixDisplayTypeIfNeeded(getDefaultObjectButtonDisplayType());
DisplayType mainButtonDisplayType = fixDisplayTypeIfNeeded(getMainButtonDisplayType());
RepeatingView buttonsPanel = new RepeatingView(ID_BUTTON_PANEL);
buttonsPanel.add(new VisibleBehaviour(() -> additionalButtonsExist()));
add(buttonsPanel);

if (additionalButtonsExist()){
buttonDtos.forEach(additionalButtonObject -> {
DisplayType additionalButtonDisplayType = fixDisplayTypeIfNeeded(additionalButtonObject.getAdditionalButtonDisplayType()); //getAdditionalButtonDisplayType(additionalButtonObject)
additionalButtonObject.setAdditionalButtonDisplayType(additionalButtonDisplayType);

AjaxCompositedIconButton additionalButton = new AjaxCompositedIconButton(buttonsPanel.newChildId(), getCompositedIcon(additionalButtonObject),
Model.of(WebComponentUtil.getDisplayTypeTitle(additionalButtonDisplayType))) {

private static final long serialVersionUID = 1L;

@Override
public void onClick(AjaxRequestTarget target) {
buttonClickPerformed(target, additionalButtonObject.getAssignmentObjectRelation(), additionalButtonObject.getCollectionView());
}
};
additionalButton.add(AttributeAppender.append("class", DEFAULT_BUTTON_STYLE));
buttonsPanel.add(additionalButton);
});

//we set main button icon class if no other is defined
if (StringUtils.isEmpty(defaultObjectButtonDisplayType.getIcon().getCssClass())){
defaultObjectButtonDisplayType.getIcon().setCssClass(mainButtonDisplayType.getIcon().getCssClass());
}

AjaxCompositedIconButton defaultButton = new AjaxCompositedIconButton(buttonsPanel.newChildId(),
getAdditionalIconBuilder(defaultObjectButtonDisplayType).build(),
Model.of(WebComponentUtil.getDisplayTypeTitle(defaultObjectButtonDisplayType))){

private static final long serialVersionUID = 1L;

@Override
public void onClick(AjaxRequestTarget target) {
buttonClickPerformed(target, null, null);
}
};
defaultButton.add(AttributeAppender.append("class", DEFAULT_BUTTON_STYLE));
defaultButton.add(new VisibleBehaviour(this::isMainButtonVisible));
buttonsPanel.add(defaultButton);
}
}

private CompositedIcon getCompositedIcon(MultiFunctinalButtonDto additionalButtonObject) {
CompositedIcon icon = additionalButtonObject.getCompositedIcon();
if (icon != null) {
return icon;
}

return getAdditionalIconBuilder(additionalButtonObject.getAdditionalButtonDisplayType()).build();
}

protected abstract DisplayType getMainButtonDisplayType();

/**
* this method should return the display properties for the last button on the dropdown panel with additional buttons.
* The last button is supposed to produce a default action (an action with no additional objects to process)
* @return
*/
protected abstract DisplayType getDefaultObjectButtonDisplayType();

protected CompositedIconBuilder getAdditionalIconBuilder(DisplayType additionalButtonDisplayType){
CompositedIconBuilder builder = new CompositedIconBuilder();
builder.setBasicIcon(WebComponentUtil.getIconCssClass(additionalButtonDisplayType), IconCssStyle.IN_ROW_STYLE)
.appendColorHtmlValue(WebComponentUtil.getIconColor(additionalButtonDisplayType))
.appendLayerIcon(WebComponentUtil.createIconType(GuiStyleConstants.CLASS_PLUS_CIRCLE, "green"), IconCssStyle.BOTTOM_RIGHT_STYLE);
return builder;
}

private DisplayType fixDisplayTypeIfNeeded(DisplayType displayType){
if (displayType == null){
displayType = new DisplayType();
}
if (displayType.getIcon() == null){
displayType.setIcon(new IconType());
}
if (displayType.getIcon().getCssClass() == null){
displayType.getIcon().setCssClass("");
}

return displayType;
}

protected void buttonClickPerformed(AjaxRequestTarget target, AssignmentObjectRelation relationSepc, CompiledObjectCollectionView collectionViews){
}

private boolean additionalButtonsExist() {
return CollectionUtils.isNotEmpty(buttonDtos);
}

protected boolean isMainButtonVisible(){
return true;
}
}
Expand Up @@ -88,49 +88,27 @@ public void onClick(AjaxRequestTarget target) {
}
add(mainButton);

RepeatingView buttonsPanel = new RepeatingView(ID_BUTTON);
buttonsPanel.add(new VisibleBehaviour(() -> additionalButtonsExist()));
add(buttonsPanel);

if (additionalButtonsExist()){
buttonDtos.forEach(additionalButtonObject -> {
DisplayType additionalButtonDisplayType = fixDisplayTypeIfNeeded(additionalButtonObject.getAdditionalButtonDisplayType()); //getAdditionalButtonDisplayType(additionalButtonObject)
additionalButtonObject.setAdditionalButtonDisplayType(additionalButtonDisplayType);

AjaxCompositedIconButton additionalButton = new AjaxCompositedIconButton(buttonsPanel.newChildId(), getCompositedIcon(additionalButtonObject),
Model.of(WebComponentUtil.getDisplayTypeTitle(additionalButtonDisplayType))) {

private static final long serialVersionUID = 1L;

@Override
public void onClick(AjaxRequestTarget target) {
buttonClickPerformed(target, additionalButtonObject.getAssignmentObjectRelation(), additionalButtonObject.getCollectionView());
}
};
additionalButton.add(AttributeAppender.append("class", DEFAULT_BUTTON_STYLE));
buttonsPanel.add(additionalButton);
});
MultiCompositedButtonPanel buttonsPanel = new MultiCompositedButtonPanel(ID_BUTTON, buttonDtos) {
private static final long serialVersionUID = 1L;

//we set main button icon class if no other is defined
if (StringUtils.isEmpty(defaultObjectButtonDisplayType.getIcon().getCssClass())){
defaultObjectButtonDisplayType.getIcon().setCssClass(mainButtonDisplayType.getIcon().getCssClass());
@Override
protected DisplayType getMainButtonDisplayType() {
return MultifunctionalButton.this.getMainButtonDisplayType();
}

AjaxCompositedIconButton defaultButton = new AjaxCompositedIconButton(buttonsPanel.newChildId(),
getAdditionalIconBuilder(defaultObjectButtonDisplayType).build(),
Model.of(WebComponentUtil.getDisplayTypeTitle(defaultObjectButtonDisplayType))){

private static final long serialVersionUID = 1L;
@Override
protected DisplayType getDefaultObjectButtonDisplayType() {
return MultifunctionalButton.this.getMainButtonDisplayType();
}

@Override
public void onClick(AjaxRequestTarget target) {
buttonClickPerformed(target, null, null);
}
};
defaultButton.add(AttributeAppender.append("class", DEFAULT_BUTTON_STYLE));
defaultButton.add(new VisibleBehaviour(this::isMainButtonVisible));
buttonsPanel.add(defaultButton);
}
@Override
protected void buttonClickPerformed(AjaxRequestTarget target, AssignmentObjectRelation relationSepc, CompiledObjectCollectionView collectionViews){
MultifunctionalButton.this.buttonClickPerformed(target, relationSepc, collectionViews);
}
};
buttonsPanel.setOutputMarkupId(true);
buttonsPanel.add(new VisibleBehaviour(() -> additionalButtonsExist()));
add(buttonsPanel);
}

private CompositedIcon getCompositedIcon(MultiFunctinalButtonDto additionalButtonObject) {
Expand Down
Expand Up @@ -42,6 +42,7 @@
import com.evolveum.midpoint.util.exception.SchemaException;
import com.evolveum.midpoint.util.logging.Trace;
import com.evolveum.midpoint.util.logging.TraceManager;
import com.evolveum.midpoint.web.component.MultiCompositedButtonPanel;
import com.evolveum.midpoint.web.component.MultiFunctinalButtonDto;
import com.evolveum.midpoint.web.component.MultifunctionalButton;
import com.evolveum.midpoint.web.component.data.column.*;
Expand Down Expand Up @@ -297,7 +298,7 @@ private List<AssignmentObjectRelation> getAssignmentObjectRelationList() {
protected Fragment initCustomButtonToolbar(String contentAreaId){
Fragment searchContainer = new Fragment(contentAreaId, ID_BUTTON_TOOLBAR_FRAGMENT, this);

MultifunctionalButton newObjectIcon = getMultivalueContainerListPanel().getNewItemButton(ID_NEW_ITEM_BUTTON);
MultiCompositedButtonPanel newObjectIcon = getMultivalueContainerListPanel().getNewItemButton(ID_NEW_ITEM_BUTTON);
searchContainer.add(newObjectIcon);

return searchContainer;
Expand Down

0 comments on commit 5642b45

Please sign in to comment.