Skip to content

Commit

Permalink
Update role-mining feature
Browse files Browse the repository at this point in the history
1. Different GUI changes.
2. Algorithm bugs fix.
3. Navigation improve.
4. Add new session navigation panel.
5. Add panel for detected pattern.
6. Role mining operation table improvements.
  • Loading branch information
tchrapovic committed Sep 4, 2023
1 parent 987f630 commit 6fb83ef
Show file tree
Hide file tree
Showing 55 changed files with 1,634 additions and 1,103 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
import javax.xml.namespace.QName;

import com.evolveum.midpoint.gui.impl.page.admin.role.mining.page.page.PageRoleAnalysis;
import com.evolveum.midpoint.gui.impl.page.admin.role.mining.page.page.PageRoleAnalysisSession;
import com.evolveum.midpoint.model.api.authentication.GuiProfiledPrincipal;

import com.evolveum.midpoint.web.page.admin.resources.PageResourceTemplates;
Expand Down Expand Up @@ -87,6 +88,8 @@
import com.evolveum.midpoint.xml.ns._public.common.common_3.*;
import com.evolveum.prism.xml.ns._public.types_3.PolyStringType;

import static com.evolveum.midpoint.gui.impl.page.admin.role.mining.page.page.PageRoleAnalysisSession.PARAM_IS_WIZARD;

public class LeftMenuPanel extends BasePanel<Void> {

private static final String ID_MENU = "menu";
Expand Down Expand Up @@ -396,9 +399,14 @@ private MainMenuItem createRolesMenu() {
MainMenuItem roleMenu = createMainMenuItem("PageAdmin.menu.top.roles", GuiStyleConstants.CLASS_OBJECT_ROLE_ICON_COLORED
);
createBasicAssignmentHolderMenuItems(roleMenu, PageTypes.ROLE);
// roleMenu.addMenuItem(new MenuItem("PageAdmin.menu.top.roles.mining", PageRoleMiningSimple.class));
// roleMenu.addMenuItem(new MenuItem("RBAM", PageRoleMiningRBAM.class));
roleMenu.addMenuItem(new MenuItem("Mining", PageRoleAnalysis.class));

roleMenu.addMenuItemAtIndex(new MenuItem("PageRoleAnalysis.menu.title",
GuiStyleConstants.EVO_CASE_OBJECT_ICON,
PageRoleAnalysis.class), 1);
roleMenu.addMenuItem(new MenuItem("PageRoleAnalysisSession.menu.title",
GuiStyleConstants.CLASS_PLUS_CIRCLE,
PageRoleAnalysisSession.class,
new PageParameters().add(PARAM_IS_WIZARD, true)));

return roleMenu;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,24 +7,30 @@

package com.evolveum.midpoint.gui.impl.page.admin.abstractrole.component;

import java.io.Serial;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import org.apache.wicket.Component;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.behavior.AttributeAppender;
import org.apache.wicket.extensions.markup.html.repeater.data.grid.ICellPopulator;
import org.apache.wicket.extensions.markup.html.repeater.data.table.AbstractColumn;
import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn;
import org.apache.wicket.markup.repeater.Item;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.LoadableDetachableModel;
import org.apache.wicket.model.StringResourceModel;

import com.evolveum.midpoint.gui.api.GuiStyleConstants;
import com.evolveum.midpoint.gui.api.component.BasePanel;
import com.evolveum.midpoint.gui.api.component.MainObjectListPanel;
import com.evolveum.midpoint.gui.api.page.PageBase;
import com.evolveum.midpoint.gui.impl.component.icon.CompositedIcon;
import com.evolveum.midpoint.gui.impl.component.icon.CompositedIconBuilder;
import com.evolveum.midpoint.gui.impl.component.icon.LayeredIconCssStyle;
import com.evolveum.midpoint.gui.impl.page.admin.role.mining.model.BusinessRoleDto;
import com.evolveum.midpoint.web.component.AjaxIconButton;
import com.evolveum.midpoint.web.component.AjaxCompositedIconSubmitButton;
import com.evolveum.midpoint.web.component.dialog.Popupable;
import com.evolveum.midpoint.web.component.util.SelectableBean;
import com.evolveum.midpoint.web.session.UserProfileStorage;
Expand Down Expand Up @@ -66,39 +72,59 @@ protected List<Component> createToolbarButtonsList(String buttonId) {
protected List<IColumn<SelectableBean<UserType>, String>> createDefaultColumns() {
List<IColumn<SelectableBean<UserType>, String>> defaultColumns = super.createDefaultColumns();

defaultColumns.add(new AbstractColumn<>(createStringResource("Add as candidate")) {
defaultColumns.add(new AbstractColumn<>(
createStringResource("RoleMining.cluster.table.column.header.display")) {
@Override
public void populateItem(Item<ICellPopulator<SelectableBean<UserType>>> item, String s,
IModel<SelectableBean<UserType>> iModel) {

String oid = iModel.getObject().getValue().getOid();

enable = !existMembersOid.contains(oid);
CompositedIcon icon = resolveIcon(enable);

AjaxCompositedIconSubmitButton addCandidateButton = new AjaxCompositedIconSubmitButton(s,
icon,
createStringResource("RoleMining.button.title.add")) {
@Serial private static final long serialVersionUID = 1L;

AjaxIconButton ajaxButton = new AjaxIconButton(s, new LoadableDetachableModel<>() {
@Override
protected String load() {
if (enable) {
return " fa fa-plus";
} else {
return " fa fa-ban";
}
public CompositedIcon getIcon() {

return resolveIcon(enable);
}
},
createStringResource("idk")) {

@Override
public void onClick(AjaxRequestTarget ajaxRequestTarget) {
protected void onSubmit(AjaxRequestTarget target) {
this.setEnabled(false);
enable = false;
ajaxRequestTarget.add(this);
performAddOperation(ajaxRequestTarget, iModel);
target.add(this);
performAddOperation(target, iModel);
}

@Override
protected void onError(AjaxRequestTarget target) {
target.add(((PageBase) getPage()).getFeedbackPanel());
}
};
ajaxButton.setOutputMarkupId(true);
ajaxButton.setEnabled(enable);
item.add(ajaxButton);
addCandidateButton.titleAsLabel(true);
addCandidateButton.setOutputMarkupId(true);
addCandidateButton.add(AttributeAppender.append("class", "btn btn-default btn-sm"));
addCandidateButton.setEnabled(enable);
item.add(addCandidateButton);

}

private CompositedIcon resolveIcon(boolean enable) {
CompositedIconBuilder iconBuilder;
if (CandidateAssignPanel.this.enable) {
iconBuilder = new CompositedIconBuilder().setBasicIcon(GuiStyleConstants.CLASS_PLUS_CIRCLE,
LayeredIconCssStyle.IN_ROW_STYLE);
} else {
iconBuilder = new CompositedIconBuilder().setBasicIcon(GuiStyleConstants.CLASS_BAN,
LayeredIconCssStyle.IN_ROW_STYLE);
}
return iconBuilder.build();
}
});
return defaultColumns;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,12 @@
import java.util.Collection;
import java.util.List;

import com.evolveum.midpoint.gui.api.page.PageBase;
import com.evolveum.midpoint.gui.impl.page.admin.role.mining.page.page.PageRoleAnalysis;

import com.evolveum.midpoint.gui.impl.util.DetailsPageUtil;
import com.evolveum.midpoint.web.util.OnePageParameterEncoder;

import org.apache.commons.collections4.CollectionUtils;
import org.apache.wicket.ajax.AjaxRequestTarget;

Expand All @@ -41,6 +45,8 @@
import com.evolveum.midpoint.web.component.util.VisibleEnableBehaviour;
import com.evolveum.midpoint.xml.ns._public.common.common_3.*;

import org.apache.wicket.request.mapper.parameter.PageParameters;

/**
* @author lskublik
*/
Expand Down Expand Up @@ -230,6 +236,13 @@ private ActivityDefinitionType createActivity(List<BusinessRoleDto> patternDelta
private void exitToPreview(AjaxRequestTarget target) {
if (isRoleMigration) {
setResponsePage(PageRoleAnalysis.class);
PageParameters parameters = new PageParameters();
String clusterOid = getHelper().getDetailsModel().getPatternDeltas().getCluster().getOid();
parameters.add(OnePageParameterEncoder.PARAMETER, clusterOid);
parameters.add("panelId", "clusterDetails");
Class<? extends PageBase> detailsPageClass = DetailsPageUtil
.getObjectDetailsPage(RoleAnalysisClusterType.class);
getPageBase().navigateToNext(detailsPageClass, parameters);
} else {
showChoiceFragment(
target,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
package com.evolveum.midpoint.gui.impl.page.admin.role.mining.page.page;

import static com.evolveum.midpoint.common.mining.utils.RoleAnalysisUtils.getSessionOptionType;
import static com.evolveum.midpoint.gui.impl.page.admin.role.mining.page.page.PageRoleAnalysisSession.PARAM_IS_WIZARD;
import static com.evolveum.midpoint.gui.impl.page.admin.role.mining.utils.RoleAnalysisObjectUtils.*;
import static com.evolveum.midpoint.gui.impl.page.admin.role.mining.utils.table.Tools.densityBasedColor;

Expand All @@ -20,6 +21,7 @@
import com.evolveum.midpoint.gui.api.util.WebComponentUtil;

import com.evolveum.midpoint.gui.impl.prism.panel.PrismPropertyHeaderPanel;
import com.evolveum.midpoint.gui.impl.util.DetailsPageUtil;
import com.evolveum.midpoint.prism.Containerable;
import com.evolveum.midpoint.prism.PrismContainerDefinition;

Expand Down Expand Up @@ -419,16 +421,12 @@ public IModel<String> getDataModel(IModel<SelectableBean<RoleAnalysisSessionType
protected void newObjectPerformed(AjaxRequestTarget target, AssignmentObjectRelation relation,
CompiledObjectCollectionView collectionView) {

setResponsePage(new PageRoleAnalysisSession(true));
PageParameters parameters = new PageParameters();
parameters.add(PARAM_IS_WIZARD, true);
Class<? extends PageBase> detailsPageClass = DetailsPageUtil
.getObjectDetailsPage(RoleAnalysisSessionType.class);
getPageBase().navigateToNext(detailsPageClass, parameters);

// ExecuteClusteringPanel detailsPanel = new ExecuteClusteringPanel(((PageBase) getPage()).getMainPopupBodyId(),
// Model.of("New cluster")) {
// @Override
// public void onClose(AjaxRequestTarget ajaxRequestTarget) {
// super.onClose(ajaxRequestTarget);
// }
// };
// ((PageBase) getPage()).showMainPopup(detailsPanel, target);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,8 @@
import com.evolveum.midpoint.web.util.OnePageParameterEncoder;
import com.evolveum.midpoint.xml.ns._public.common.common_3.*;

import org.apache.wicket.util.string.StringValue;

//TODO correct authorizations
@PageDescriptor(
urls = {
Expand All @@ -57,19 +59,30 @@
@AuthorizationAction(actionUri = AuthorizationConstants.AUTZ_UI_ROLE_ANALYSIS_SESSION_URL,
label = "PageRoleAnalysis.auth.roleAnalysisSession.label",
description = "PageRoleAnalysis.auth.roleAnalysisSession.description")
})
})

public class PageRoleAnalysisSession extends PageAssignmentHolderDetails<RoleAnalysisSessionType, AssignmentHolderDetailsModel<RoleAnalysisSessionType>> {
boolean isEditPanel = false;
boolean isWizardPanel = false;

public static final String PARAM_IS_WIZARD = "isWizard";

public boolean isWizardPanel() {
StringValue stringValue = getPageParameters().get(PARAM_IS_WIZARD);
if (stringValue != null) {
if ("true".equalsIgnoreCase(stringValue.toString())
|| "false".equalsIgnoreCase(stringValue.toString())) {
this.isWizardPanel = getPageParameters().get(PARAM_IS_WIZARD).toBoolean();
} else {
getPageParameters().remove(PARAM_IS_WIZARD);
}
}
return isWizardPanel;
}

public PageRoleAnalysisSession() {
super();
}

public PageRoleAnalysisSession(boolean isEditPanel) {
this.isEditPanel = true;
}

@Override
public void afterDeletePerformed(AjaxRequestTarget target) {
PageBase pageBase = (PageBase) getPage();
Expand Down Expand Up @@ -192,7 +205,7 @@ protected IModel<String> createPageTitleModel() {
}

private boolean canShowWizard() {
return isEditPanel;
return isWizardPanel();
}

protected DetailsFragment createDetailsFragment() {
Expand All @@ -217,6 +230,10 @@ public IModel<List<ContainerPanelConfigurationType>> getPanelConfigurations() {
IModel<List<ContainerPanelConfigurationType>> panelConfigurations = super.getPanelConfigurations();
RoleAnalysisProcessModeType processMode = getObjectDetailsModels().getObjectWrapper().getObject().asObjectable().getProcessMode();

if (processMode == null) {
return super.getPanelConfigurations();
}

List<ContainerPanelConfigurationType> object = panelConfigurations.getObject();
for (ContainerPanelConfigurationType containerPanelConfigurationType : object) {
if (containerPanelConfigurationType.getIdentifier().equals("sessionOptions")) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,10 +34,12 @@
@PanelType(name = "miningBasic", defaultContainerPath = "empty")
@PanelInstance(identifier = "sessionBasic",
applicableForType = RoleAnalysisSessionType.class,
defaultPanel = true,
display = @PanelDisplay(label = "pageAdminFocus.basic", order = 10))

@PanelInstance(identifier = "clusterBasic",
applicableForType = RoleAnalysisClusterType.class,
defaultPanel = true,
display = @PanelDisplay(label = "pageAdminFocus.basic", order = 10))
public class RoleAnalysisBasicPanel<AH extends AssignmentHolderType> extends AbstractObjectMainPanel<AH, ObjectDetailsModels<AH>> {

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
<!--
~ Copyright (C) 2010-2023 Evolveum and contributors
~
~ This work is dual-licensed under the Apache License 2.0
~ and European Union Public License. See LICENSE file for details.
-->

<!DOCTYPE html>
<html xmlns:wicket="http://wicket.apache.org">
<wicket:panel>

<div class="row">
<div class="col-md-12">
<div wicket:id="container">
<div wicket:id="panelId" />
</div>
</div>
</div>

</wicket:panel>
</html>

0 comments on commit 6fb83ef

Please sign in to comment.