Skip to content

Commit

Permalink
default details panel, better details navigation (shows where you are)
Browse files Browse the repository at this point in the history
  • Loading branch information
katkav committed Aug 18, 2021
1 parent 39aacd3 commit 7b8ac80
Show file tree
Hide file tree
Showing 12 changed files with 113 additions and 29 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,9 @@

import java.util.*;
import javax.annotation.PostConstruct;
import javax.xml.namespace.QName;

import org.apache.commons.lang.BooleanUtils;
import org.apache.wicket.markup.html.panel.Panel;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
Expand Down Expand Up @@ -68,11 +70,26 @@ public void postProcess(CompiledGuiProfile compiledGuiProfile) {
continue;
}
List<ContainerPanelConfigurationType> mergedPanels = mergeConfigurations(defaultDetailsPage.getPanel(), compiledPageType.getPanel());
setupDefaultPanel(ObjectTypes.getObjectTypeClass(compiledPageType.getType()), mergedPanels);
compiledPageType.getPanel().clear();
compiledPageType.getPanel().addAll(CloneUtil.cloneCollectionMembersWithoutIds(mergedPanels));
}
}

private void setupDefaultPanel(Class<? extends ObjectType> objectType, List<ContainerPanelConfigurationType> mergedPanels) {
long defaultPanelsCount = mergedPanels.stream().filter(p -> BooleanUtils.isTrue(p.isDefault())).count();
if (defaultPanelsCount >= 1) {
return;
}

ContainerPanelConfigurationType systemDefault = defaultContainerPanelConfigurationMap.get(objectType);
for (ContainerPanelConfigurationType mergedPanel : mergedPanels) {
if (systemDefault.getIdentifier().equals(mergedPanel.getIdentifier())) {
mergedPanel.setDefault(true);
}
}
}

private void fillInPanelsMap() {
Set<Class<?>> classes = collectClasses();
for (Class<?> clazz : classes) {
Expand Down Expand Up @@ -124,8 +141,7 @@ private List<ContainerPanelConfigurationType> getPanelsFor(Class<? extends Objec
if (isSubPanel(panelInstance)) {
continue;
}

ContainerPanelConfigurationType config = compileContainerPanelConfiguration(panelInstance.identifier(), clazz, objectType, allClasses);
ContainerPanelConfigurationType config = compileContainerPanelConfiguration(panelInstance.identifier(), panelInstance.defaultPanel(), clazz, objectType, allClasses);
panels.add(config);
}

Expand All @@ -150,14 +166,20 @@ private boolean isNotApplicableFor(Class<? extends ObjectType> objectType, Panel
return true;
}

if (panelInstance.notApplicableFor() != null && !panelInstance.notApplicableFor().equals(SystemConfigurationType.class)) {
return panelInstance.notApplicableFor().isAssignableFrom(objectType);
}

return !panelInstance.applicableFor().isAssignableFrom(objectType);
}

private boolean isSubPanel(PanelInstance panelInstance) {
return !panelInstance.childOf().equals(Panel.class);
}

private ContainerPanelConfigurationType compileContainerPanelConfiguration(String identifier, Class<?> clazz, Class<? extends ObjectType> objectType, Set<Class<?>> classes) {
Map<Class<? extends ObjectType>, ContainerPanelConfigurationType> defaultContainerPanelConfigurationMap = new HashMap<>();

private ContainerPanelConfigurationType compileContainerPanelConfiguration(String identifier, boolean isDefault, Class<?> clazz, Class<? extends ObjectType> objectType, Set<Class<?>> classes) {
ContainerPanelConfigurationType config = new ContainerPanelConfigurationType();
config.setIdentifier(identifier);

Expand All @@ -168,6 +190,11 @@ private ContainerPanelConfigurationType compileContainerPanelConfiguration(Strin

List<ContainerPanelConfigurationType> children = processChildren(classes, objectType, clazz);
config.getPanel().addAll(children);

if (isDefault) {
config.setDefault(true);
// defaultContainerPanelConfigurationMap.put(objectType, config);
}
return config;
}

Expand Down Expand Up @@ -208,7 +235,7 @@ private List<ContainerPanelConfigurationType> processChildren(Set<Class<?>> clas
continue;
}

ContainerPanelConfigurationType config = compileContainerPanelConfiguration(panelInstance.identifier(), clazz, objectType, classes);
ContainerPanelConfigurationType config = compileContainerPanelConfiguration(panelInstance.identifier(), panelInstance.defaultPanel(), clazz, objectType, classes);
configs.add(config);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import java.util.Collection;
import java.util.List;

import org.apache.commons.lang.BooleanUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.markup.html.panel.Panel;
Expand Down Expand Up @@ -68,7 +69,7 @@ private void initLayout() {
MidpointForm form = new MidpointForm(ID_MAIN_FORM);
add(form);
ContainerPanelConfigurationType defaultConfiguration = findDefaultConfiguration();
initMainPanel("basic", defaultConfiguration, form);
initMainPanel(defaultConfiguration, form);
initNavigation();
}

Expand Down Expand Up @@ -97,19 +98,16 @@ private void initButtons() {
}

private ContainerPanelConfigurationType findDefaultConfiguration() {
//TODO possibility to configure default panel in configuration
ContainerPanelConfigurationType basicPanelConfig = getPanelConfigurations().stream().filter(panel -> "basic".equals(panel.getIdentifier())).findFirst().get();
//TODO support for second level panel as a default, e.g. assignment -> role
ContainerPanelConfigurationType basicPanelConfig = getPanelConfigurations().stream().filter(panel -> BooleanUtils.isTrue(panel.isDefault())).findFirst().get();
return basicPanelConfig;
}

private void initMainPanel(String identifier, ContainerPanelConfigurationType panelConfig, MidpointForm form) {
//TODO load default panel?
// IModel<?> panelModel = getPanelModel(panelConfig);

Class<? extends Panel> panelClass = findObjectPanel(identifier);
private void initMainPanel(ContainerPanelConfigurationType panelConfig, MidpointForm form) {
Class<? extends Panel> panelClass = findObjectPanel(panelConfig.getPanelType());
Panel panel = WebComponentUtil.createPanel(panelClass, ID_MAIN_PANEL, model, panelConfig);
form.addOrReplace(panel);

getSessionStorage().setObjectDetailsStorage("details" + getType().getSimpleName(), panelConfig);
}

private void initNavigation() {
Expand All @@ -125,7 +123,7 @@ private DetailsNavigationPanel createNavigationPanel(String id, List<ContainerPa
@Override
protected void onClickPerformed(ContainerPanelConfigurationType config, AjaxRequestTarget target) {
MidpointForm form = getMainForm();
initMainPanel(config.getPanelType(), config, form);
initMainPanel(config, form);
target.add(form);
}
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
import com.evolveum.midpoint.xml.ns._public.common.common_3.*;

@PanelType(name = "basic", defaultContainerPath = "empty")
@PanelInstance(identifier = "basic", applicableFor = AssignmentHolderType.class)
@PanelInstance(identifier = "basic", applicableFor = AssignmentHolderType.class, defaultPanel = true, notApplicableFor = ResourceType.class)
@PanelDisplay(label = "Basic", icon = GuiStyleConstants.CLASS_CIRCLE_FULL, order = 10)
public class AssignmentHolderBasicPanel<AH extends AssignmentHolderType> extends AbstractObjectMainPanel<AH> {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
<wicket:panel>
<ul class="details-menu">
<li wicket:id="menu">
<a class="navigation-details">
<a class="navigation-details" wicket:id="navLinkStyle">
<i wicket:id="navItemIcon"></i>
<span class="details-menu-label" wicket:id="navItem"></span>
<span class="pull-right-container">
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@

import java.util.List;

import com.evolveum.midpoint.web.session.ObjectDetailsStorage;

import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.AjaxLink;
import org.apache.wicket.behavior.AttributeAppender;
Expand Down Expand Up @@ -36,6 +38,7 @@ public class DetailsNavigationPanel<O extends ObjectType> extends BasePanel<List
private static final String ID_NAV_ITEM_ICON = "navItemIcon";
private static final String ID_SUB_NAVIGATION = "subNavigation";
private static final String ID_COUNT = "count";
private static final String ID_NAVIGATION_DETAILS = "navLinkStyle";

private LoadableModel<PrismObjectWrapper<O>> objectModel;

Expand All @@ -48,33 +51,46 @@ public DetailsNavigationPanel(String id, LoadableModel<PrismObjectWrapper<O>> ob
protected void onInitialize() {
super.onInitialize();
initLayout();
setOutputMarkupId(true);
}

private void initLayout() {
ListView<ContainerPanelConfigurationType> listView = new ListView<>(ID_NAV, getModel()) {

@Override
protected void populateItem(ListItem<ContainerPanelConfigurationType> item) {
WebMarkupContainer navigationDetails = new WebMarkupContainer(ID_NAVIGATION_DETAILS);
navigationDetails.add(AttributeAppender.append("style", new ReadOnlyModel<>(() -> {
ObjectDetailsStorage storage = getPageBase().getSessionStorage().getObjectDetailsStorage("details" + objectModel.getObject().getCompileTimeClass().getSimpleName());
ContainerPanelConfigurationType storageConfig = storage.getDefaultConfiguration();
ContainerPanelConfigurationType itemModelObject = item.getModelObject();
if (storageConfig.getIdentifier().equals(itemModelObject.getIdentifier())) {
return "background-color: #eeeeee;";
}
return "";
})));
item.add(navigationDetails);
WebMarkupContainer icon = new WebMarkupContainer(ID_NAV_ITEM_ICON);
icon.setOutputMarkupId(true);
icon.add(AttributeAppender.append("class",
item.getModelObject().getDisplay() != null ? item.getModelObject().getDisplay().getCssClass() :
GuiStyleConstants.CLASS_CIRCLE_FULL));
item.add(icon);
navigationDetails.add(icon);
AjaxLink<Void> link = new AjaxLink<>(ID_NAV_ITEM) {

@Override
public void onClick(AjaxRequestTarget target) {
target.add(DetailsNavigationPanel.this);
onClickPerformed(item.getModelObject(), target);
}
};
link.setBody(Model.of(createButtonLabel(item.getModelObject())));
item.add(link);
navigationDetails.add(link);

IModel<String> countModel = createCountModel(item.getModel());
Label label = new Label(ID_COUNT, countModel);
label.add(new VisibleBehaviour(() -> countModel.getObject() != null));
item.add(label);
navigationDetails.add(label);

DetailsNavigationPanel subPanel = new DetailsNavigationPanel(ID_SUB_NAVIGATION, objectModel, Model.ofList(item.getModelObject().getPanel())) {

Expand All @@ -83,6 +99,7 @@ protected void onClickPerformed(ContainerPanelConfigurationType config, AjaxRequ
if (config.getPath() == null) {
config.setPath(item.getModelObject().getPath());
}
target.add(DetailsNavigationPanel.this);
DetailsNavigationPanel.this.onClickPerformed(config, target);
}
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@
import java.util.Collections;
import java.util.List;

@PanelType(name = "genericMultiValue", generic = true)
@PanelType(name = "genericMultiValue")
public class GenericMultivalueContainerPanel<C extends Containerable, O extends ObjectType> extends AbstractObjectMainPanel<O> {

private static final String ID_DETAILS = "details";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@

import org.apache.wicket.model.IModel;

@PanelType(name = "genericSingleValue", generic = true)
@PanelType(name = "genericSingleValue")
public class GenericSingleContainerPanel<C extends Containerable, O extends ObjectType> extends AbstractObjectMainPanel<O> {

private static final String ID_DETAILS = "details";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@

import com.evolveum.midpoint.gui.api.prism.ItemStatus;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.SystemConfigurationType;

import org.apache.wicket.markup.html.panel.Panel;

import java.lang.annotation.Retention;
Expand All @@ -20,4 +22,7 @@
Class<? extends ObjectType> applicableFor() default ObjectType.class;
ItemStatus[] status() default {ItemStatus.ADDED, ItemStatus.NOT_CHANGED};
Class<? extends Panel> childOf() default Panel.class;
boolean defaultPanel() default false;

Class<? extends ObjectType> notApplicableFor() default SystemConfigurationType.class;
}
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@
import org.opensaml.xacml.policy.ResourcesType;

@PanelType(name = "resourceDetails")
@PanelInstance(identifier = "resourceDetails", applicableFor = ResourceType.class, status = ItemStatus.NOT_CHANGED)
@PanelInstance(identifier = "resourceDetails", applicableFor = ResourceType.class, status = ItemStatus.NOT_CHANGED, defaultPanel = true)
@PanelDisplay(label = "Details", order = 10)
public class ResourceDetailsTabPanel extends AbstractObjectMainPanel<ResourceType> {

Expand All @@ -95,18 +95,12 @@ public ResourceDetailsTabPanel(String id, final LoadableModel<PrismObjectWrapper

@Override
protected CapabilitiesDto load() {
PrismObject<ResourceType> resource = (PrismObject<ResourceType>) model.getObject().getObject();
PrismObject<ResourceType> resource = model.getObject().getObject();
return new CapabilitiesDto(resource.asObjectable());
}
};
}

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

protected void initLayout() {

PrismObject<ResourceType> resourceObject = getModelObject().getObject();
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
/*
* Copyright (c) 2021 Evolveum and contributors
*
* This work is dual-licensed under the Apache License 2.0
* and European Union Public License. See LICENSE file for details.
*/
package com.evolveum.midpoint.web.session;

import com.evolveum.midpoint.xml.ns._public.common.common_3.ContainerPanelConfigurationType;

public class ObjectDetailsStorage {

private ContainerPanelConfigurationType defaultConfiguration;

public void setDefaultConfiguration(ContainerPanelConfigurationType defaultConfiguration) {
this.defaultConfiguration = defaultConfiguration;
}

public ContainerPanelConfigurationType getDefaultConfiguration() {
return defaultConfiguration;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
import com.evolveum.midpoint.util.DebugDumpable;
import com.evolveum.midpoint.util.DebugUtil;
import com.evolveum.midpoint.web.page.admin.roles.SearchBoxConfigurationHelper;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ContainerPanelConfigurationType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.GuiObjectListPanelConfigurationType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowKindType;

Expand Down Expand Up @@ -87,6 +88,7 @@ public class SessionStorage implements Serializable, DebugDumpable {
* place to store information in session for various pages
*/
private Map<String, PageStorage> pageStorageMap = new HashMap<>();
private Map<String, ObjectDetailsStorage> detailsStorageMap = new HashMap<>();

private Map<String, Boolean> mainMenuState = new HashMap<>();

Expand Down Expand Up @@ -120,6 +122,16 @@ public ObjectListStorage getObjectListStorage(String key) {
return (ObjectListStorage) pageStorageMap.get(key);
}

public ObjectDetailsStorage getObjectDetailsStorage(String key) {
return detailsStorageMap.get(key);
}

public void setObjectDetailsStorage(String key, ContainerPanelConfigurationType config) {
ObjectDetailsStorage storage = new ObjectDetailsStorage();
storage.setDefaultConfiguration(config);
detailsStorageMap.put(key, storage);
}

public RoleCatalogStorage getRoleCatalog() {
if (pageStorageMap.get(KEY_ROLE_CATALOG) == null) {
pageStorageMap.put(KEY_ROLE_CATALOG, new RoleCatalogStorage());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3691,6 +3691,15 @@
</xsd:appinfo>
</xsd:annotation>
</xsd:element>
<xsd:element name="default" type="xsd:boolean" minOccurs="0">
<xsd:annotation>
<xsd:documentation>
<p>
If the panel is default.
</p>
</xsd:documentation>
</xsd:annotation>
</xsd:element>
</xsd:sequence>
</xsd:extension>
</xsd:complexContent>
Expand Down

0 comments on commit 7b8ac80

Please sign in to comment.