From 385d5ae21cb7ce755fbaf5dd1592cc6840576a0e Mon Sep 17 00:00:00 2001 From: Katarina Valalikova Date: Wed, 2 Sep 2020 14:00:03 +0200 Subject: [PATCH] fix displaying value metadata extension items which are not containers. --- .../factory/panel/MetadataPanelFactory.java | 2 +- .../prism/panel/PrismValueMetadataPanel.java | 35 +++++++++++- .../prism/panel/ProvenanceMetadataPanel.html | 1 + .../prism/panel/ProvenanceMetadataPanel.java | 57 ++++++++++++++----- .../impl/prism/panel/ValueMetadataPanel.java | 2 +- .../wrapper/PrismContainerWrapperImpl.java | 3 + .../wrapper/ValueMetadataWrapperImpl.java | 22 ++++++- 7 files changed, 101 insertions(+), 21 deletions(-) diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/factory/panel/MetadataPanelFactory.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/factory/panel/MetadataPanelFactory.java index e78fa8ab30d..08cdf021e52 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/factory/panel/MetadataPanelFactory.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/factory/panel/MetadataPanelFactory.java @@ -46,7 +46,7 @@ public boolean match(IW wrapper) { @Override public org.apache.wicket.Component createPanel(PrismContainerPanelContext panelCtx) { - return new MetadataContainerValuePanel<>(panelCtx.getComponentId(), panelCtx.getValueWrapper(), new ItemPanelSettingsBuilder().build()); + return new MetadataContainerValuePanel<>(panelCtx.getComponentId(), panelCtx.getValueWrapper(), panelCtx.getSettings()); } @Override diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/panel/PrismValueMetadataPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/panel/PrismValueMetadataPanel.java index 3671fd5cd3a..99f375b0397 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/panel/PrismValueMetadataPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/panel/PrismValueMetadataPanel.java @@ -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; @@ -65,7 +68,7 @@ private void initLayout() { provenanceMetadataPanel.setOutputMarkupId(true); add(provenanceMetadataPanel); - MetadataContainerPanel valueMetadataPanel = + MetadataContainerPanel valueMetadataPanel = new MetadataContainerPanel<>(ID_METADATA, createMetadataNoProvenanceModel(),createItemPanelSettings()); valueMetadataPanel.add(new VisibleBehaviour(this::shouldShowMetadataDetails)); valueMetadataPanel.setOutputMarkupId(true); @@ -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> createMetadataNoProvenanceModel() { return new ReadOnlyModel<>(() -> getModelObject() != null ? getModelObject().getSelectedChild() : null); } @@ -123,6 +133,9 @@ private boolean shouldShowProvenanceMetadataDetails() { } private boolean isAnyMetadataSelected() { + if (getModelObject().isShowMetadataDetails()) { + return true; + } for (PrismContainerValueWrapper value : getValueMetadata().getValues()) { for (PrismContainerWrapper metadataContainer : value.getContainers()) { if (metadataContainer.isShowMetadataDetails()) { @@ -162,6 +175,10 @@ private IModel createButtonClassModel(ListItem selectedCo } private String getPrimaryButton(PrismContainerWrapper valueMetadata, ContainersPopupDto containersPopupDto) { + if (QNameUtil.match(ValueMetadataType.COMPLEX_TYPE, containersPopupDto.getTypeName()) && valueMetadata.isShowMetadataDetails()) { + return "metadata-tab metadata-tab-active"; + } + for (PrismContainerValueWrapper value : valueMetadata.getValues()) { for (PrismContainerWrapper container : value.getContainers()) { if (!QNameUtil.match(containersPopupDto.getTypeName(), container.getTypeName())) { @@ -178,6 +195,12 @@ private String getPrimaryButton(PrismContainerWrapper 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 values : getValueMetadata().getValues()) { for (PrismContainerWrapper container : values.getContainers()) { if (QNameUtil.match(container.getTypeName(), containersToShow.getDef().getTypeName())) { @@ -204,8 +227,14 @@ private ReadOnlyModel> createMetadataListModel() { childContainers = Collections.EMPTY_LIST; } - return childContainers.stream().map(c -> new ContainersPopupDto(false, c)).collect(Collectors.toList()); + List navigation = childContainers.stream().map(c -> new ContainersPopupDto(false, c)).collect(Collectors.toList()); + + List childNonContainers = metadataWrapper.getChildNonContainers(); + if (!childNonContainers.isEmpty()) { + navigation.add(new ContainersPopupDto(false, metadataWrapper)); + } + return navigation; }); } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/panel/ProvenanceMetadataPanel.html b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/panel/ProvenanceMetadataPanel.html index 08a47e0028f..7532afef9d8 100755 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/panel/ProvenanceMetadataPanel.html +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/panel/ProvenanceMetadataPanel.html @@ -34,6 +34,7 @@
+
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/panel/ProvenanceMetadataPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/panel/ProvenanceMetadataPanel.java index 3a669284a40..69c0afa3467 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/panel/ProvenanceMetadataPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/panel/ProvenanceMetadataPanel.java @@ -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; @@ -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; @@ -55,6 +53,7 @@ public class ProvenanceMetadataPanel extends PrismContainerPanel model, ItemPanelSettings settings) { @@ -138,7 +137,16 @@ private void createMetadataDetailsPanel(ListItem provenanceListItem.getModelObject().isShowEmpty())); MetadataContainerPanel 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> valueMetadataPanel = + new ValueMetadataPanel<>(ID_VALUE_METADATA_DETAILS, valueMetadataListItem.getModel(), settings); + valueMetadataPanel.add(new VisibleBehaviour(() -> getModelObject().isShowMetadataDetails() && provenanceListItem.getModelObject().isShowEmpty())); + provenanceListItem.add(valueMetadataPanel); + } private ToggleIconButton createShowMoreButton(IModel> provenanceModel) { @@ -170,27 +178,42 @@ private MetadataContainerPanel createDefaultPanel(IModel 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 createDetailsDescriptionModel(IModel> detailsModel) { return new ReadOnlyModel<>(() -> { PrismContainerWrapper 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> createDetailsModel(IModel> valueMetadataModel) { - return new ReadOnlyModel<>( () -> valueMetadataModel.getObject().getSelectedChild()); + private IModel createDetailsModel(IModel> valueMetadataModel) { + return new ReadOnlyModel<>(() -> { + ValueMetadataWrapperImpl valueMetadataWrapper = getModelObject(); + if (valueMetadataWrapper.isShowMetadataDetails()) { + return (PCW) valueMetadataWrapper; + } + return (PCW) valueMetadataModel.getObject().getSelectedChild(); + }); } private IModel getHeaderModel() { @@ -202,10 +225,14 @@ private String getDescriptionLabel() { return ""; } + if (getModelObject().isShowMetadataDetails()) { + return getString(ValueMetadataType.COMPLEX_TYPE.getLocalPart() + ".displayType"); + } + PrismContainerWrapper child = getModelObject().getSelectedChild(); //TODO only for provenance? if (!child.isRuntimeSchema()) { - return getString(child.getTypeName().getLocalPart() + "." + "displayType"); + return getString(child.getTypeName().getLocalPart() + ".displayType"); } return ""; } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/panel/ValueMetadataPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/panel/ValueMetadataPanel.java index b527972d7bf..685d0651a51 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/panel/ValueMetadataPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/panel/ValueMetadataPanel.java @@ -64,7 +64,7 @@ private boolean notEmptyAndNotDirectChildOfValueMetadataType() { PrismContainerValueWrapper parentContainerValue = parent.getParent(); if (parentContainerValue == null) { - return false; + return true; } if (parentContainerValue.getDefinition() == null) { diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/wrapper/PrismContainerWrapperImpl.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/wrapper/PrismContainerWrapperImpl.java index d418d5191b9..35abb9ef68f 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/wrapper/PrismContainerWrapperImpl.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/wrapper/PrismContainerWrapperImpl.java @@ -332,6 +332,9 @@ protected PrismContainerValue createNewEmptyValue(ModelServiceLocator locator @Override public PrismContainerWrapper getSelectedChild() { + if (isShowMetadataDetails()) { + return (PrismContainerWrapper) this; + } List> values = getValues(); if (CollectionUtils.isEmpty(values)) { return null; diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/wrapper/ValueMetadataWrapperImpl.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/wrapper/ValueMetadataWrapperImpl.java index de73ed8a58f..e88c4b8763f 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/wrapper/ValueMetadataWrapperImpl.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/wrapper/ValueMetadataWrapperImpl.java @@ -647,9 +647,29 @@ public List> getChildContainers() throws return childContainers; } + public List getChildNonContainers() { + List> metadataValues = getValues(); + if (CollectionUtils.isEmpty(metadataValues)) { + return Collections.EMPTY_LIST; + } + + List> childItems = new ArrayList<>(); + for (PrismContainerValueWrapper metadataValue : metadataValues) { + for (ItemWrapper child : metadataValue.getNonContainers()) { + if (child.isEmpty()) { + continue; + } + if (!containainChild(childItems, child)) { + childItems.add(child); + } + } + } + return childItems; + } + - private boolean containainChild(List> containers, PrismContainerWrapper child) { + private boolean containainChild(List> containers, ItemWrapper child) { return containers.stream().anyMatch(ch -> QNameUtil.match(ch.getTypeName(), child.getTypeName())); }