Skip to content

Commit

Permalink
More support for configurable GUI
Browse files Browse the repository at this point in the history
  • Loading branch information
katkav committed Jul 28, 2021
1 parent acf0229 commit e6809c0
Show file tree
Hide file tree
Showing 26 changed files with 388 additions and 50 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
import com.evolveum.midpoint.schema.util.task.*;

import com.evolveum.midpoint.util.annotation.Experimental;
import com.evolveum.midpoint.web.application.PanelLoader;
import com.evolveum.midpoint.web.component.util.SelectableBean;

import com.evolveum.midpoint.web.page.admin.objectTemplate.PageObjectTemplate;
Expand Down Expand Up @@ -54,6 +55,7 @@
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.form.FormComponent;
import org.apache.wicket.markup.html.form.IChoiceRenderer;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.markup.repeater.data.IDataProvider;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
Expand Down Expand Up @@ -5015,4 +5017,28 @@ public static IModel<String> createMappingDescription(IModel<PrismContainerValue
return target + "(" + strength + ")";
});
}

public static <T> Panel createPanel(String panelIdentifier, String markupId, IModel<T> model, ContainerPanelConfigurationType panelConfig) {
Class<?> panelClass = PanelLoader.findPanel(panelIdentifier);

try {
Constructor constructor = panelClass.getConstructor(String.class, LoadableModel.class, ContainerPanelConfigurationType.class);
Panel panel = (Panel) constructor.newInstance(markupId, model, panelConfig);
panel.setOutputMarkupId(true);
return panel;
} catch (NoSuchMethodException | InstantiationException | IllegalAccessException | InvocationTargetException e) {
e.printStackTrace();
}

try {
Constructor constructor = panelClass.getConstructor(String.class, IModel.class, ContainerPanelConfigurationType.class);
Panel panel = (Panel) constructor.newInstance(markupId, model, panelConfig);
panel.setOutputMarkupId(true);
return panel;
} catch (NoSuchMethodException | InstantiationException | IllegalAccessException | InvocationTargetException e) {
e.printStackTrace();
}

return null;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,17 @@

import com.evolveum.midpoint.gui.api.model.LoadableModel;

import com.evolveum.midpoint.gui.api.prism.ItemStatus;
import com.evolveum.midpoint.gui.api.util.WebComponentUtil;
import com.evolveum.midpoint.web.application.PanelDisplay;
import com.evolveum.midpoint.web.application.PanelLoader;
import com.evolveum.midpoint.web.component.assignment.TabbedAssignmentTypePanel;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ContainerPanelConfigurationType;

import org.apache.wicket.extensions.markup.html.tabs.AbstractTab;
import org.apache.wicket.extensions.markup.html.tabs.ITab;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;

Expand All @@ -23,7 +31,15 @@
import com.evolveum.midpoint.xml.ns._public.common.common_3.AssignmentHolderType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.AssignmentType;

@PanelDescription(identifier = "assignments", applicableFor = AssignmentHolderType.class, label = "Assignments", icon = GuiStyleConstants.EVO_ASSIGNMENT_ICON)
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@PanelDescription(identifier = "assignments",
panelIdentifier = "assignments",
applicableFor = AssignmentHolderType.class)
@PanelDisplay(label = "Assignments", icon = GuiStyleConstants.EVO_ASSIGNMENT_ICON)
public class AssignmentHolderAssignmentPanel<AH extends AssignmentHolderType> extends AbstractObjectMainPanel<PrismObjectWrapper<AH>> {

private static final String ID_ASSIGNMENTS = "assignmentsContainer";
Expand All @@ -42,11 +58,50 @@ protected void initLayout() {
assignments.setOutputMarkupId(true);
add(assignments);
PrismContainerWrapperModel<AH, AssignmentType> assignmentModel = PrismContainerWrapperModel.fromContainerWrapper(getModel(), AssignmentHolderType.F_ASSIGNMENT);
SwitchAssignmentTypePanel panel = createPanel(ID_ASSIGNMENTS_PANEL, assignmentModel);
List<ITab> tabs = createAssignmentTabs(assignmentModel);
TabbedAssignmentTypePanel panel = new TabbedAssignmentTypePanel(ID_ASSIGNMENTS_PANEL, tabs, assignmentModel, config);

// SwitchAssignmentTypePanel panel = createPanel(ID_ASSIGNMENTS_PANEL, assignmentModel);

assignments.add(panel);
}

private List<ITab> createAssignmentTabs(PrismContainerWrapperModel<AH, AssignmentType> assignmentModel) {
List<ITab> tabs = new ArrayList<>();
for (ContainerPanelConfigurationType panelConfig : getAssignmentPanels()) {
tabs.add(new AbstractTab(createStringResource(getLabel(panelConfig))) {
@Override
public WebMarkupContainer getPanel(String s) {

String panelIdentifier = panelConfig.getPanelIdentifier();
Panel panel = WebComponentUtil.createPanel(panelIdentifier, s, assignmentModel, panelConfig);
return panel;
}
});
}
return tabs;
}

private String getLabel(ContainerPanelConfigurationType panelConfig) {
if (panelConfig == null) {
return "N/A";
}
if (panelConfig.getDisplay() == null) {
return "N/A";
}
return WebComponentUtil.getOrigStringFromPoly(panelConfig.getDisplay().getLabel());
}

private List<ContainerPanelConfigurationType> getAssignmentPanels() {
// List<ContainerPanelConfigurationType> panels = PanelLoader.getAssignmentPanelsFor(UserType.class);
List<ContainerPanelConfigurationType> subPanels = config.getPanel();
Map<String, ContainerPanelConfigurationType> panelsMap = new HashMap<>();
for (ContainerPanelConfigurationType subPanel : subPanels) {
panelsMap.put(subPanel.getIdentifier(), subPanel);
}
return subPanels;
}

protected SwitchAssignmentTypePanel createPanel(String panelId, PrismContainerWrapperModel<AH, AssignmentType> model) {
return new SwitchAssignmentTypePanel(panelId, model != null ? model : Model.of(), config){
private static final long serialVersionUID = 1L;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,14 +16,18 @@
import com.evolveum.midpoint.util.logging.Trace;
import com.evolveum.midpoint.util.logging.TraceManager;
import com.evolveum.midpoint.web.application.PanelDescription;
import com.evolveum.midpoint.web.application.PanelDisplay;
import com.evolveum.midpoint.web.component.prism.ItemVisibility;
import com.evolveum.midpoint.web.model.PrismContainerWrapperModel;
import com.evolveum.midpoint.xml.ns._public.common.common_3.*;

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

@PanelDescription(identifier = "basic", applicableFor = AssignmentHolderType.class, label = "Basic", icon = GuiStyleConstants.CLASS_CIRCLE_FULL)
@PanelDescription(identifier = "basic",
panelIdentifier = "basic",
applicableFor = AssignmentHolderType.class)
@PanelDisplay(label = "Basic", icon = GuiStyleConstants.CLASS_CIRCLE_FULL)
public class AssignmentHolderBasicPanel<AH extends AssignmentHolderType> extends AbstractObjectMainPanel<PrismObjectWrapper<AH>> {

private static final String ID_MAIN_PANEL = "properties";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@
import com.evolveum.midpoint.schema.GetOperationOptions;
import com.evolveum.midpoint.schema.SelectorOptions;

import com.evolveum.midpoint.web.application.PanelDisplay;

import org.apache.commons.lang3.BooleanUtils;
import org.apache.wicket.Component;
import org.apache.wicket.ajax.AjaxRequestTarget;
Expand Down Expand Up @@ -93,7 +95,10 @@
* @author semancik
* @author skublik
*/
@PanelDescription(identifier = "projections", applicableFor = FocusType.class, label = "Projections", icon = GuiStyleConstants.CLASS_SHADOW_ICON_ACCOUNT)
@PanelDescription(identifier = "projections",
panelIdentifier = "projections",
applicableFor = FocusType.class)
@PanelDisplay(label = "Projections", icon = GuiStyleConstants.CLASS_SHADOW_ICON_ACCOUNT)
public class FocusProjectionsPanel<F extends FocusType> extends AbstractObjectMainPanel<PrismObjectWrapper<F>> {
private static final long serialVersionUID = 1L;

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

@PanelDescription(identifier = "genericMultiValue")
@PanelDescription(panelIdentifier = "genericMultiValue")
public class GenericMultivalueContainerPanel<C extends Containerable, O extends ObjectType> extends AbstractObjectMainPanel<PrismObjectWrapper<O>> {

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

import javax.xml.namespace.QName;

@PanelDescription(identifier = "genericSingleValue")
@PanelDescription(panelIdentifier = "genericSingleValue")
public class GenericSingleContainerPanel<C extends Containerable, O extends ObjectType> extends AbstractObjectMainPanel<PrismObjectWrapper<O>> {

private static final String ID_DETAILS = "details";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
import java.util.List;

import com.evolveum.midpoint.gui.api.GuiStyleConstants;
import com.evolveum.midpoint.gui.api.util.WebComponentUtil;
import com.evolveum.midpoint.gui.api.util.WebModelServiceUtils;
import com.evolveum.midpoint.gui.impl.page.admin.DetailsNavigationPanel;
import com.evolveum.midpoint.prism.path.ItemPath;
Expand Down Expand Up @@ -193,6 +194,7 @@ private void initButtons() {

}


private void initMainPanel(String identifier, ContainerPanelConfigurationType panelConfig) {
//TODO load default panel?
Class<?> panelClass = PanelLoader.findPanel(identifier);
Expand All @@ -212,29 +214,8 @@ private void initMainPanel(String identifier, ContainerPanelConfigurationType pa
}
}

delta = midpoint.getPrismContext().deltaFor(UserType.class)
.item(ItemPath.create(UserType.F_EXTENSION, "uwoActivationTimestamp"))
.replace(new Date(System.currentTimeMillis()))
.item(ItemPath.create(UserType.F_EXTENSION, "uwoLifeCycleStage"))
.replace("active")
.asObjectDeltas(userOid);
midpoint.executeChanges(delta);

if (constructor == null) {
try {
constructor = panelClass.getConstructor(String.class, LoadableModel.class, ContainerPanelConfigurationType.class);
} catch (NoSuchMethodException e) {
e.printStackTrace();
}

try {
Panel panel = (Panel) constructor.newInstance(ID_MAIN_PANEL, model, panelConfig);
panel.setOutputMarkupId(true);
addOrReplace(panel);
} catch (InstantiationException | IllegalAccessException | InvocationTargetException e) {
e.printStackTrace();
}
}
Panel panel = WebComponentUtil.createPanel(identifier, ID_MAIN_PANEL, model, panelConfig);
addOrReplace(panel);

}

Expand All @@ -252,7 +233,7 @@ private DetailsNavigationPanel createNavigationPanel(String id, List<ContainerPa
DetailsNavigationPanel panel = new DetailsNavigationPanel(ID_NAVIGATION, Model.ofList(panels)) {
@Override
protected void onClickPerformed(ContainerPanelConfigurationType config, AjaxRequestTarget target) {
initMainPanel(config.getIdentifier(), config);
initMainPanel(config.getPanelIdentifier(), config);
target.add(getMainPanel());
}
};
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.evolveum.midpoint.web.application;

import com.evolveum.midpoint.gui.api.prism.ItemStatus;
import com.evolveum.midpoint.schema.constants.ObjectTypes;
import com.evolveum.midpoint.web.component.util.SerializableFunction;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType;
Expand All @@ -8,15 +9,15 @@
import javax.xml.namespace.QName;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.Arrays;
import java.util.List;

@Retention(RetentionPolicy.RUNTIME)
public @interface PanelDescription {

String identifier() default "";

String panelIdentifier() default "";
Class<? extends ObjectType> applicableFor() default ObjectType.class;

String label() default "";
String icon() default "";
ItemStatus[] status() default {ItemStatus.ADDED, ItemStatus.NOT_CHANGED};

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
/*
* 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.application;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

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

@Retention(RetentionPolicy.RUNTIME)
public @interface PanelDisplay {

String label() default "";
String icon() default "";

}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.evolveum.midpoint.web.application;

import com.evolveum.midpoint.gui.api.GuiStyleConstants;
import com.evolveum.midpoint.gui.api.util.WebComponentUtil;
import com.evolveum.midpoint.util.ClassPathUtil;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ContainerPanelConfigurationType;
Expand Down Expand Up @@ -44,18 +45,48 @@ public static List<ContainerPanelConfigurationType> getPanelsFor(Class<? extends
if (applicableFor.isAssignableFrom(objectType)) {
ContainerPanelConfigurationType config = new ContainerPanelConfigurationType();
config.setIdentifier(desc.identifier());
config.setDisplay(createDisplayType(desc));
config.setPanelIdentifier(desc.panelIdentifier());
PanelDisplay display = clazz.getAnnotation(PanelDisplay.class);
if (display != null) {
config.setDisplay(createDisplayType(display));
}
panels.add(config);
}
}
}
return panels;
}

private static DisplayType createDisplayType(PanelDescription desc) {
private static DisplayType createDisplayType(PanelDisplay display) {
DisplayType displayType = new DisplayType();
displayType.setLabel(WebComponentUtil.createPolyFromOrigString(desc.label()));
displayType.setCssClass(desc.icon());
displayType.setLabel(WebComponentUtil.createPolyFromOrigString(display.label()));
displayType.setCssClass(display.icon());
return displayType;
}

private static DisplayType createDisplayType(String display) {
DisplayType displayType = new DisplayType();
displayType.setLabel(WebComponentUtil.createPolyFromOrigString(display));
displayType.setCssClass(GuiStyleConstants.EVO_ASSIGNMENT_ICON);
return displayType;
}

public static <O extends ObjectType> List<ContainerPanelConfigurationType> getAssignmentPanelsFor(Class<O> clazz) {
List<ContainerPanelConfigurationType> panels = new ArrayList<>();
panels.add(createAssignmentPanelConfiguration("allAssignments", "All"));
panels.add(createAssignmentPanelConfiguration("roleAssignments", "Role"));
panels.add(createAssignmentPanelConfiguration("resourceAssignments", "Resource"));
panels.add(createAssignmentPanelConfiguration("orgAssignments", "Organization"));
panels.add(createAssignmentPanelConfiguration("serviceAssignments", "Service"));
panels.add(createAssignmentPanelConfiguration("indirectAssignments", "Direct + Indirect"));
return panels;
}

private static ContainerPanelConfigurationType createAssignmentPanelConfiguration(String identifier, String display) {
ContainerPanelConfigurationType config = new ContainerPanelConfigurationType();
config.setPanelIdentifier(identifier);
config.setIdentifier(identifier);
config.setDisplay(createDisplayType(display));
return config;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -130,7 +130,6 @@ private <O extends ObjectType> IModel<String> getIdentifierLabelModel(PrismConta
if (assignment.getTargetRef() == null) {
return Model.of("");
}

PrismObject<O> object = WebModelServiceUtils.loadObject(assignment.getTargetRef(), getPageBase(),
getPageBase().createSimpleTask(OPERATION_LOAD_TARGET_REF_OBJECT), new OperationResult(OPERATION_LOAD_TARGET_REF_OBJECT));
if (object == null || !(object.asObjectable() instanceof AbstractRoleType)) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@
import com.evolveum.midpoint.gui.api.util.WebDisplayTypeUtil;
import com.evolveum.midpoint.gui.impl.component.AssignmentsDetailsPanel;
import com.evolveum.midpoint.model.api.authentication.CompiledObjectCollectionView;
import com.evolveum.midpoint.web.application.PanelDescription;
import com.evolveum.midpoint.web.application.PanelDisplay;
import com.evolveum.midpoint.web.component.AjaxIconButton;
import com.evolveum.midpoint.web.component.search.Search;

Expand Down Expand Up @@ -89,6 +91,8 @@
import org.apache.wicket.model.PropertyModel;
import org.jetbrains.annotations.NotNull;

@PanelDescription(identifier = "allAssignments", panelIdentifier = "allAssignments", applicableFor = AssignmentHolderType.class)
@PanelDisplay(label = "All")
public class AssignmentPanel extends BasePanel<PrismContainerWrapper<AssignmentType>> {

private static final long serialVersionUID = 1L;
Expand Down

0 comments on commit e6809c0

Please sign in to comment.