Skip to content

Commit

Permalink
Merge branch 'master' of https://github.com/Evolveum/midpoint
Browse files Browse the repository at this point in the history
  • Loading branch information
martin-lizner committed Sep 2, 2020
2 parents 4c3dab4 + d12148b commit 9f9d3d3
Show file tree
Hide file tree
Showing 7 changed files with 101 additions and 21 deletions.
Expand Up @@ -46,7 +46,7 @@ public <IW extends ItemWrapper> boolean match(IW wrapper) {

@Override
public org.apache.wicket.Component createPanel(PrismContainerPanelContext<C> panelCtx) {
return new MetadataContainerValuePanel<>(panelCtx.getComponentId(), panelCtx.getValueWrapper(), new ItemPanelSettingsBuilder().build());
return new MetadataContainerValuePanel<>(panelCtx.getComponentId(), panelCtx.getValueWrapper(), panelCtx.getSettings());
}

@Override
Expand Down
Expand Up @@ -10,6 +10,9 @@
import java.util.List;
import java.util.stream.Collectors;

import com.evolveum.midpoint.gui.api.prism.wrapper.ItemWrapper;
import com.evolveum.midpoint.prism.ItemDefinition;

import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.behavior.AttributeAppender;
import org.apache.wicket.markup.html.WebMarkupContainer;
Expand Down Expand Up @@ -65,7 +68,7 @@ private void initLayout() {
provenanceMetadataPanel.setOutputMarkupId(true);
add(provenanceMetadataPanel);

MetadataContainerPanel<Containerable> valueMetadataPanel =
MetadataContainerPanel<? extends Containerable> valueMetadataPanel =
new MetadataContainerPanel<>(ID_METADATA, createMetadataNoProvenanceModel(),createItemPanelSettings());
valueMetadataPanel.add(new VisibleBehaviour(this::shouldShowMetadataDetails));
valueMetadataPanel.setOutputMarkupId(true);
Expand All @@ -76,10 +79,17 @@ private ItemPanelSettings createItemPanelSettings() {
return new ItemPanelSettingsBuilder()
.editabilityHandler(wrapper -> true)
.headerVisibility(false)
.visibilityHandler(w -> w.isShowMetadataDetails() ? ItemVisibility.AUTO : ItemVisibility.HIDDEN)
.visibilityHandler(w -> createItemVisibilityBehavior(w))
.build();
}

private ItemVisibility createItemVisibilityBehavior(ItemWrapper<?, ?> w) {
if (getModelObject().isShowMetadataDetails()) {
return w instanceof PrismContainerWrapper ? ItemVisibility.HIDDEN : ItemVisibility.AUTO;
}
return w.isShowMetadataDetails() ? ItemVisibility.AUTO : ItemVisibility.HIDDEN;
}

private IModel<PrismContainerWrapper<Containerable>> createMetadataNoProvenanceModel() {
return new ReadOnlyModel<>(() -> getModelObject() != null ? getModelObject().getSelectedChild() : null);
}
Expand Down Expand Up @@ -123,6 +133,9 @@ private boolean shouldShowProvenanceMetadataDetails() {
}

private boolean isAnyMetadataSelected() {
if (getModelObject().isShowMetadataDetails()) {
return true;
}
for (PrismContainerValueWrapper<ValueMetadataType> value : getValueMetadata().getValues()) {
for (PrismContainerWrapper<Containerable> metadataContainer : value.getContainers()) {
if (metadataContainer.isShowMetadataDetails()) {
Expand Down Expand Up @@ -162,6 +175,10 @@ private IModel<?> createButtonClassModel(ListItem<ContainersPopupDto> selectedCo
}

private String getPrimaryButton(PrismContainerWrapper<ValueMetadataType> valueMetadata, ContainersPopupDto containersPopupDto) {
if (QNameUtil.match(ValueMetadataType.COMPLEX_TYPE, containersPopupDto.getTypeName()) && valueMetadata.isShowMetadataDetails()) {
return "metadata-tab metadata-tab-active";
}

for (PrismContainerValueWrapper<ValueMetadataType> value : valueMetadata.getValues()) {
for (PrismContainerWrapper<Containerable> container : value.getContainers()) {
if (!QNameUtil.match(containersPopupDto.getTypeName(), container.getTypeName())) {
Expand All @@ -178,6 +195,12 @@ private String getPrimaryButton(PrismContainerWrapper<ValueMetadataType> valueMe
}

private void setContainersToShow(ContainersPopupDto containersToShow, AjaxRequestTarget ajaxRequestTarget) {
if (QNameUtil.match(ValueMetadataType.COMPLEX_TYPE, containersToShow.getDef().getTypeName())) {
getValueMetadata().setShowMetadataDetails(true);
} else {
getValueMetadata().setShowMetadataDetails(false);
}

for (PrismContainerValueWrapper<ValueMetadataType> values : getValueMetadata().getValues()) {
for (PrismContainerWrapper<Containerable> container : values.getContainers()) {
if (QNameUtil.match(container.getTypeName(), containersToShow.getDef().getTypeName())) {
Expand All @@ -204,8 +227,14 @@ private ReadOnlyModel<List<ContainersPopupDto>> createMetadataListModel() {
childContainers = Collections.EMPTY_LIST;
}

return childContainers.stream().map(c -> new ContainersPopupDto(false, c)).collect(Collectors.toList());
List<ContainersPopupDto> navigation = childContainers.stream().map(c -> new ContainersPopupDto(false, c)).collect(Collectors.toList());

List<? extends ItemDefinition> childNonContainers = metadataWrapper.getChildNonContainers();
if (!childNonContainers.isEmpty()) {
navigation.add(new ContainersPopupDto(false, metadataWrapper));
}

return navigation;
});
}

Expand Down
Expand Up @@ -34,6 +34,7 @@
</div>
<h6 class="yield-description" wicket:id="yieldHeader"></h6>
<div wicket:id="defaultPanel"/>
<div wicket:id="valueMetadataDetails"/>
</div>
</div>

Expand Down
Expand Up @@ -9,14 +9,7 @@
import java.util.Collections;
import java.util.List;

import com.evolveum.midpoint.gui.api.prism.wrapper.ItemWrapper;
import com.evolveum.midpoint.gui.impl.prism.wrapper.ValueMetadataWrapperImpl;

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.util.QNameUtil;

import org.apache.wicket.Component;
import org.apache.wicket.ajax.AjaxRequestTarget;
Expand All @@ -31,10 +24,15 @@
import com.evolveum.midpoint.gui.api.component.DisplayNamePanel;
import com.evolveum.midpoint.gui.api.component.togglebutton.ToggleIconButton;
import com.evolveum.midpoint.gui.api.model.ReadOnlyModel;
import com.evolveum.midpoint.gui.api.prism.wrapper.ItemWrapper;
import com.evolveum.midpoint.gui.api.prism.wrapper.PrismContainerValueWrapper;
import com.evolveum.midpoint.gui.api.prism.wrapper.PrismContainerWrapper;
import com.evolveum.midpoint.gui.impl.factory.panel.ItemRealValueModel;
import com.evolveum.midpoint.gui.impl.prism.wrapper.ValueMetadataWrapperImpl;
import com.evolveum.midpoint.prism.Containerable;
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.prism.ItemVisibility;
import com.evolveum.midpoint.web.component.util.VisibleBehaviour;
import com.evolveum.midpoint.web.model.PrismContainerWrapperModel;
Expand All @@ -55,6 +53,7 @@ public class ProvenanceMetadataPanel extends PrismContainerPanel<ValueMetadataTy
private static final String ID_SHOW_MORE = "showMore";
private static final String ID_DEFAULT_PANEL = "defaultPanel";
private static final String ID_PROVENANCE_DISPLAY = "provenanceDisplayName";
private static final String ID_VALUE_METADATA_DETAILS = "valueMetadataDetails";


public ProvenanceMetadataPanel(String id, IModel<ValueMetadataWrapperImpl> model, ItemPanelSettings settings) {
Expand Down Expand Up @@ -138,7 +137,16 @@ private void createMetadataDetailsPanel(ListItem<PrismContainerValueWrapper<Prov
label.add(new VisibleBehaviour(() -> provenanceListItem.getModelObject().isShowEmpty()));

MetadataContainerPanel<Containerable> defaultPanel = createDefaultPanel(detailsModel, provenanceListItem.getModel());
defaultPanel.add(new VisibleBehaviour(() -> !getModelObject().isShowMetadataDetails() && provenanceListItem.getModelObject().isShowEmpty()));
provenanceListItem.add(defaultPanel);

ItemPanelSettings settings = getSettings().copy();
settings.setVisibilityHandler(w -> createItemVisibilityBehavior(w));
ValueMetadataPanel<ValueMetadataType, PrismContainerValueWrapper<ValueMetadataType>> valueMetadataPanel =
new ValueMetadataPanel<>(ID_VALUE_METADATA_DETAILS, valueMetadataListItem.getModel(), settings);
valueMetadataPanel.add(new VisibleBehaviour(() -> getModelObject().isShowMetadataDetails() && provenanceListItem.getModelObject().isShowEmpty()));
provenanceListItem.add(valueMetadataPanel);

}

private ToggleIconButton<Void> createShowMoreButton(IModel<PrismContainerValueWrapper<ProvenanceMetadataType>> provenanceModel) {
Expand Down Expand Up @@ -170,27 +178,42 @@ private MetadataContainerPanel<Containerable> createDefaultPanel(IModel<PrismCon
MetadataContainerPanel<Containerable> defaultPanel = new MetadataContainerPanel<>(ID_DEFAULT_PANEL, detailsModel, settings);
defaultPanel.setOutputMarkupPlaceholderTag(true);
defaultPanel.setOutputMarkupId(true);
defaultPanel.add(new VisibleBehaviour(() -> provenanceModel.getObject().isShowEmpty()));
// defaultPanel.add(new VisibleBehaviour(() -> provenanceModel.getObject().isShowEmpty()));
return defaultPanel;
}

private ItemVisibility createItemVisibilityBehavior(ItemWrapper<?, ?> wrapper) {
if (getModelObject().isShowMetadataDetails()) {
if (wrapper instanceof PrismContainerWrapper) {
return ItemVisibility.HIDDEN;
}
}
return ItemVisibility.AUTO;
}

private IModel<String> createDetailsDescriptionModel(IModel<PrismContainerWrapper<Containerable>> detailsModel) {
return new ReadOnlyModel<>(() -> {
PrismContainerWrapper<Containerable> details = detailsModel.getObject();
if (details == null || details.isRuntimeSchema()) {
if (details == null || details.isRuntimeSchema() || QNameUtil.match(ValueMetadataType.COMPLEX_TYPE, details.getTypeName())) {
return "";
}

if (hasMoreThenOneItem(details)) {
return getString(details.getTypeName().getLocalPart() + "." + "description");
return getString(details.getTypeName().getLocalPart() + ".description");
}

return getString(details.getTypeName().getLocalPart() + "." + "description.single");
return getString(details.getTypeName().getLocalPart() + ".description.single");
});
}

private IModel<PrismContainerWrapper<Containerable>> createDetailsModel(IModel<PrismContainerValueWrapper<ValueMetadataType>> valueMetadataModel) {
return new ReadOnlyModel<>( () -> valueMetadataModel.getObject().getSelectedChild());
private <PCW extends PrismContainerWrapper> IModel<PCW> createDetailsModel(IModel<PrismContainerValueWrapper<ValueMetadataType>> valueMetadataModel) {
return new ReadOnlyModel<>(() -> {
ValueMetadataWrapperImpl valueMetadataWrapper = getModelObject();
if (valueMetadataWrapper.isShowMetadataDetails()) {
return (PCW) valueMetadataWrapper;
}
return (PCW) valueMetadataModel.getObject().getSelectedChild();
});
}

private IModel<String> getHeaderModel() {
Expand All @@ -202,10 +225,14 @@ private String getDescriptionLabel() {
return "";
}

if (getModelObject().isShowMetadataDetails()) {
return getString(ValueMetadataType.COMPLEX_TYPE.getLocalPart() + ".displayType");
}

PrismContainerWrapper<Containerable> child = getModelObject().getSelectedChild();
//TODO only for provenance?
if (!child.isRuntimeSchema()) {
return getString(child.getTypeName().getLocalPart() + "." + "displayType");
return getString(child.getTypeName().getLocalPart() + ".displayType");
}
return "";
}
Expand Down
Expand Up @@ -64,7 +64,7 @@ private boolean notEmptyAndNotDirectChildOfValueMetadataType() {

PrismContainerValueWrapper<?> parentContainerValue = parent.getParent();
if (parentContainerValue == null) {
return false;
return true;
}

if (parentContainerValue.getDefinition() == null) {
Expand Down
Expand Up @@ -332,6 +332,9 @@ protected PrismContainerValue<C> createNewEmptyValue(ModelServiceLocator locator

@Override
public PrismContainerWrapper<Containerable> getSelectedChild() {
if (isShowMetadataDetails()) {
return (PrismContainerWrapper<Containerable>) this;
}
List<PrismContainerValueWrapper<C>> values = getValues();
if (CollectionUtils.isEmpty(values)) {
return null;
Expand Down
Expand Up @@ -647,9 +647,29 @@ public List<PrismContainerDefinition<Containerable>> getChildContainers() throws
return childContainers;
}

public List<? extends ItemDefinition> getChildNonContainers() {
List<PrismContainerValueWrapper<ValueMetadataType>> metadataValues = getValues();
if (CollectionUtils.isEmpty(metadataValues)) {
return Collections.EMPTY_LIST;
}

List<ItemDefinition<?>> childItems = new ArrayList<>();
for (PrismContainerValueWrapper<ValueMetadataType> metadataValue : metadataValues) {
for (ItemWrapper<?, ?> child : metadataValue.getNonContainers()) {
if (child.isEmpty()) {
continue;
}
if (!containainChild(childItems, child)) {
childItems.add(child);
}
}
}
return childItems;
}



private boolean containainChild(List<PrismContainerDefinition<Containerable>> containers, PrismContainerWrapper<Containerable> child) {
private boolean containainChild(List<? extends ItemDefinition<?>> containers, ItemWrapper<?, ?> child) {
return containers.stream().anyMatch(ch -> QNameUtil.match(ch.getTypeName(), child.getTypeName()));
}

Expand Down

0 comments on commit 9f9d3d3

Please sign in to comment.