Skip to content

Commit

Permalink
unified redirect method for statistic and obj collection widgets, upd…
Browse files Browse the repository at this point in the history
…ated initial system config
  • Loading branch information
Kateryna Honchar committed Aug 17, 2022
1 parent b4f3e5e commit 9954fc2
Show file tree
Hide file tree
Showing 5 changed files with 132 additions and 100 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,9 @@

import com.evolveum.midpoint.gui.impl.component.ContainerableListPanel;
import com.evolveum.midpoint.gui.impl.component.menu.PageTypes;
import com.evolveum.midpoint.gui.impl.page.admin.AbstractPageObjectDetails;
import com.evolveum.midpoint.schema.internals.InternalsConfig;
import com.evolveum.midpoint.web.session.ObjectDetailsStorage;
import com.evolveum.midpoint.xml.ns._public.resource.capabilities_3.CapabilityCollectionType;

import org.apache.commons.collections4.CollectionUtils;
Expand All @@ -42,6 +44,7 @@
import org.apache.commons.lang3.math.NumberUtils;
import org.apache.commons.lang3.reflect.ConstructorUtils;
import org.apache.commons.lang3.time.DurationFormatUtils;
import org.apache.commons.validator.routines.UrlValidator;
import org.apache.commons.validator.routines.checkdigit.VerhoeffCheckDigit;
import org.apache.wicket.*;
import org.apache.wicket.ajax.AjaxRequestTarget;
Expand All @@ -57,6 +60,7 @@
import org.apache.wicket.extensions.markup.html.tabs.ITab;
import org.apache.wicket.feedback.IFeedback;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.WebPage;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.DropDownChoice;
import org.apache.wicket.markup.html.form.Form;
Expand All @@ -69,6 +73,7 @@
import org.apache.wicket.model.StringResourceModel;
import org.apache.wicket.request.IRequestHandler;
import org.apache.wicket.request.cycle.RequestCycle;
import org.apache.wicket.request.flow.RedirectToUrlException;
import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.apache.wicket.util.string.StringValue;
import org.apache.wicket.util.visit.IVisit;
Expand Down Expand Up @@ -2667,6 +2672,59 @@ public static void dispatchToListPage(Class<? extends Containerable> objectClass
}
}

public static void redirectFromDashboardWidget(ContainerPanelConfigurationType widgetConfig, PageBase pageBase, Component component) {
if (widgetConfig == null) {
return;
}
List<GuiActionType> actionList = widgetConfig.getAction();
if (CollectionUtils.isEmpty(actionList)) {
return;
}
Optional<GuiActionType> actionWithRedirection = actionList.stream().filter(WebComponentUtil::isRedirectionTargetNotEmpty).findFirst();
if (actionWithRedirection.isEmpty()) {
return;
}
RedirectionTargetType redirectionTarget = actionWithRedirection.get().getTarget();
String url = redirectionTarget.getTargetUrl();
String pageClass = redirectionTarget.getPageClass();
String panelType = redirectionTarget.getPanelType();
if (StringUtils.isNotEmpty(url) && new UrlValidator().isValid(url)) {
throw new RedirectToUrlException(url);
} else if (StringUtils.isNotEmpty(pageClass)) {
try {
Class<?> clazz = Class.forName(pageClass);
ContainerPanelConfigurationType config = new ContainerPanelConfigurationType();
config.setPanelType(panelType);

Constructor<?> constructor = clazz.getConstructor();
Object pageInstance = constructor.newInstance();
if (pageInstance instanceof AbstractPageObjectDetails && StringUtils.isNotEmpty(panelType)) {
String storageKey = "details" + ((AbstractPageObjectDetails<?, ?>) pageInstance).getType().getSimpleName();
FocusType principal = pageBase.getPrincipalFocus();
ObjectDetailsStorage pageStorage = pageBase.getSessionStorage().getObjectDetailsStorage(storageKey);
if (pageStorage == null) {
pageBase.getSessionStorage().setObjectDetailsStorage(storageKey, config);
} else {
pageStorage.setDefaultConfiguration(config);
}
WebComponentUtil.dispatchToObjectDetailsPage(principal.asPrismObject(), component);
} else if (pageInstance instanceof WebPage) {
pageBase.navigateToNext((WebPage) pageInstance);
}
} catch (Throwable e) {
e.printStackTrace();
LOGGER.trace("No constructor found for (String, LoadableModel, ContainerPanelConfigurationType). Continue with lookup.", e);
}
}
}

public static boolean isRedirectionTargetNotEmpty(GuiActionType action) {
if (action == null || action.getTarget() == null) {
return false;
}
return !StringUtils.isAllEmpty(action.getTarget().getTargetUrl(), action.getTarget().getPageClass(), action.getTarget().getPanelType());
}

public static boolean hasDetailsPage(PrismObject<?> object) {
Class<?> clazz = object.getCompileTimeClass();
return hasDetailsPage(clazz);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -972,28 +972,29 @@ public void onClick(AjaxRequestTarget target) {
}

protected void viewAllActionPerformed(AjaxRequestTarget target) {
FocusType principal = getPageBase().getPrincipalFocus();
String widgetPanelType = config != null ? config.getPanelType() : null;
QName principalFocusType = WebComponentUtil.classToQName(PrismContext.get(), principal.getClass());
if (widgetPanelType != null) {
ContainerPanelConfigurationType panelConfig = getPageBase().getCompiledGuiProfile().findPrincipalFocusDetailsPanel(
principalFocusType, widgetPanelType);
if (panelConfig != null) {
ObjectDetailsStorage pageStorage = getPageBase().getSessionStorage().getObjectDetailsStorage(getStorageKey());
if (pageStorage == null) {
getPageBase().getSessionStorage().setObjectDetailsStorage(getStorageKey(), panelConfig);
} else {
pageStorage.setDefaultConfiguration(panelConfig);
}
WebComponentUtil.dispatchToObjectDetailsPage(principal.asPrismObject(), ContainerableListPanel.this);
return;
}
}

CompiledObjectCollectionView view = getObjectCollectionView();
if (view != null) {
WebComponentUtil.dispatchToListPage(getType(), view.getViewIdentifier(), ContainerableListPanel.this, false);
}
WebComponentUtil.redirectFromDashboardWidget(config, getPageBase(), ContainerableListPanel.this);
// FocusType principal = getPageBase().getPrincipalFocus();
// String widgetPanelType = config != null ? config.getPanelType() : null;
// QName principalFocusType = WebComponentUtil.classToQName(PrismContext.get(), principal.getClass());
// if (widgetPanelType != null) {
// ContainerPanelConfigurationType panelConfig = getPageBase().getCompiledGuiProfile().findPrincipalFocusDetailsPanel(
// principalFocusType, widgetPanelType);
// if (panelConfig != null) {
// ObjectDetailsStorage pageStorage = getPageBase().getSessionStorage().getObjectDetailsStorage(getStorageKey());
// if (pageStorage == null) {
// getPageBase().getSessionStorage().setObjectDetailsStorage(getStorageKey(), panelConfig);
// } else {
// pageStorage.setDefaultConfiguration(panelConfig);
// }
// WebComponentUtil.dispatchToObjectDetailsPage(principal.asPrismObject(), ContainerableListPanel.this);
// return;
// }
// }
//
// CompiledObjectCollectionView view = getObjectCollectionView();
// if (view != null) {
// WebComponentUtil.dispatchToListPage(getType(), view.getViewIdentifier(), ContainerableListPanel.this, false);
// }
}

protected String getStorageKey() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -85,26 +85,29 @@ private void initLayout() {
}));
add(dashboardSearchPanel);

ListView<ContainerPanelConfigurationType> linksPanel = new ListView<>(ID_STATISTIC_WIDGETS_PANEL, this::getStatisticWidgetList) {
initStatisticWidgets();

private static final long serialVersionUID = 1L;
initPreviewWidgets();
}

@Override
protected void populateItem(ListItem<ContainerPanelConfigurationType> item) {
StatisticDashboardWidget widget = new StatisticDashboardWidget(ID_STATISTIC_WIDGET, item.getModel());
widget.add(new VisibleBehaviour(() -> WebComponentUtil.getElementVisibility(item.getModelObject().getVisibility())));
item.add(widget);
}
};
linksPanel.setOutputMarkupId(true);
linksPanel.add(new VisibleBehaviour(() -> {
UserInterfaceElementVisibilityType visibility = getComponentVisibility(PredefinedDashboardWidgetId.SHORTCUTS);
return WebComponentUtil.getElementVisibility(visibility);
}));
add(linksPanel);
private void initStatisticWidgets() {
ListView<ContainerPanelConfigurationType> linksPanel = new ListView<>(ID_STATISTIC_WIDGETS_PANEL, this::getStatisticWidgetList) {

private static final long serialVersionUID = 1L;

initPreviewWidgets();
@Override
protected void populateItem(ListItem<ContainerPanelConfigurationType> item) {
StatisticDashboardWidget widget = new StatisticDashboardWidget(ID_STATISTIC_WIDGET, item.getModel());
widget.add(new VisibleBehaviour(() -> WebComponentUtil.getElementVisibility(item.getModelObject().getVisibility())));
item.add(widget);
}
};
linksPanel.setOutputMarkupId(true);
linksPanel.add(new VisibleBehaviour(() -> {
UserInterfaceElementVisibilityType visibility = getComponentVisibility(PredefinedDashboardWidgetId.SHORTCUTS);
return WebComponentUtil.getElementVisibility(visibility);
}));
add(linksPanel);
}

private void initPreviewWidgets() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,8 @@ private void initLayout() {

@Override
public void onClick() {
redirectActionPerformed();
WebComponentUtil.redirectFromDashboardWidget(StatisticDashboardWidget.this.getModelObject(),
StatisticDashboardWidget.this.getPageBase(), StatisticDashboardWidget.this);
}

};
Expand All @@ -92,66 +93,6 @@ public void onClick() {
linkItem.add(statisticData);
}

private void redirectActionPerformed() {
List<GuiActionType> actionList = getModelObject().getAction();
if (CollectionUtils.isEmpty(actionList)) {
return;
}
Optional<GuiActionType> actionWithRedirection = actionList.stream().filter(this::isRedirectionTargetNotEmpty).findFirst();
if (actionWithRedirection.isEmpty()) {
return;
}
RedirectionTargetType redirectionTarget = actionWithRedirection.get().getTarget();
String url = redirectionTarget.getTargetUrl();
String pageClass = redirectionTarget.getPageClass();
String panelType = redirectionTarget.getPanelType();
if (StringUtils.isNotEmpty(url) && new UrlValidator().isValid(url)) {
throw new RedirectToUrlException(url);
} else if (!StringUtils.isAllEmpty(pageClass, panelType)) {
redirectToPanel(pageClass, panelType);
}
}

private boolean isRedirectionTargetNotEmpty(GuiActionType action) {
if (action == null || action.getTarget() == null) {
return false;
}
return !StringUtils.isAllEmpty(action.getTarget().getTargetUrl(), action.getTarget().getPageClass(), action.getTarget().getPanelType());
}

private void redirectToPanel(String pageClass, String panelType) {
if (StringUtils.isNotEmpty(pageClass)) {
try {
Class<?> clazz = Class.forName(pageClass);
ContainerPanelConfigurationType config = null;
if (hasContainerPanelConfigurationField(clazz)) {
Class<? extends Panel> panel = getPageBase().findObjectPanel(panelType);
//todo get subPanels from ContainerPanelConfigurationType? or get details page panels? and redirect exactly on panelType
}
if (config == null) {
config = new ContainerPanelConfigurationType();
config.setPanelType(panelType);
}
Constructor<?> constructor = clazz.getConstructor();
Object pageInstance = constructor.newInstance();
if (pageInstance instanceof AbstractPageObjectDetails && StringUtils.isNotEmpty(panelType)) {
String storageKey = "details" + ((AbstractPageObjectDetails<?, ?>) pageInstance).getType().getSimpleName();
ObjectDetailsStorage pageStorage = getPageBase().getSessionStorage().getObjectDetailsStorage(storageKey);
if (pageStorage == null) {
getPageBase().getSessionStorage().setObjectDetailsStorage(storageKey, config);
} else {
pageStorage.setDefaultConfiguration(config);
}
} else if (pageInstance instanceof WebPage) {
getPageBase().navigateToNext((WebPage) pageInstance);
}
} catch (Throwable e) {
e.printStackTrace();
LOGGER.trace("No constructor found for (String, LoadableModel, ContainerPanelConfigurationType). Continue with lookup.", e);
}
}
}

private boolean hasContainerPanelConfigurationField(Class<?> clazz) {
return Arrays.stream(clazz.getFields()).anyMatch(this::isContainerPanelConfigurationField);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -183,6 +183,12 @@
<cssClass>fa fa-history</cssClass>
</icon>
</display>
<action>
<target>
<pageClass>com.evolveum.midpoint.gui.impl.page.self.PageUserSelfProfile</pageClass>
<panelType>history</panelType>
</target>
</action>
<panelType>history</panelType>
<preview>true</preview>
</widget>
Expand All @@ -200,6 +206,12 @@
<cssClass>fe fe-assignment</cssClass>
</icon>
</display>
<action>
<target>
<pageClass>com.evolveum.midpoint.gui.impl.page.self.PageUserSelfProfile</pageClass>
<panelType>allAssignments</panelType>
</target>
</action>
<panelType>allAssignments</panelType>
<preview>true</preview>
</widget>
Expand All @@ -217,6 +229,12 @@
<cssClass>fe fe-case</cssClass>
</icon>
</display>
<action>
<target>
<pageClass>com.evolveum.midpoint.gui.impl.page.self.PageUserSelfProfile</pageClass>
<panelType>focusCases</panelType>
</target>
</action>
<panelType>focusCases</panelType>
<preview>true</preview>
</widget>
Expand All @@ -234,6 +252,11 @@
<cssClass>fa fa-inbox</cssClass>
</icon>
</display>
<action>
<target>
<pageClass>com.evolveum.midpoint.web.page.admin.cases.PageCaseWorkItems</pageClass>
</target>
</action>
<panelType>myWorkItems</panelType>
<preview>true</preview>
</widget>
Expand All @@ -251,6 +274,12 @@
<cssClass>fa fa-male</cssClass>
</icon>
</display>
<action>
<target>
<pageClass>com.evolveum.midpoint.gui.impl.page.self.PageUserSelfProfile</pageClass>
<panelType>projections</panelType>
</target>
</action>
<panelType>projections</panelType>
<preview>true</preview>
</widget>
Expand Down Expand Up @@ -343,7 +372,7 @@
<panelType>statisticWidget</panelType>
<action>
<target>
<pageClass>com.evolveum.midpoint.gui.impl.page.admin.resource.PageResource</pageClass>
<pageClass>com.evolveum.midpoint.web.page.admin.resources.PageResources</pageClass>
</target>
</action>
<preview>true</preview>
Expand Down

0 comments on commit 9954fc2

Please sign in to comment.