Skip to content

Commit

Permalink
Add role-mining aggregate statistics chart
Browse files Browse the repository at this point in the history
  • Loading branch information
tchrapovic committed Sep 26, 2023
1 parent e5586bf commit 1d70b72
Show file tree
Hide file tree
Showing 8 changed files with 536 additions and 1 deletion.
4 changes: 3 additions & 1 deletion gui/admin-gui/src/frontend/js/midpoint-theme.js
Original file line number Diff line number Diff line change
Expand Up @@ -579,7 +579,9 @@ export default class MidPointTheme {
component = div.querySelector('table');
} else if (containerId === '#imageScaleContainer') {
component = div.querySelector('img');
}
} else if (containerId === '#chartScaleContainer') {
component = div.querySelector('canvas');
}

if (component) {
div.addEventListener('wheel', handleZoom);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -125,6 +125,8 @@ public class GuiStyleConstants {
public static final String CLASS_ICON_EXPAND = "fa fa-chevron-left";
public static final String CLASS_ICON_COLLAPSE = "fa fa-chevron-down";
public static final String CLASS_ICON_SORT_AMOUNT_ASC = "fa fa-sort-amount-asc";
public static final String CLASS_ICON_SORT_AMOUNT_DSC = "fa fa-sort-amount-desc";

public static final String CLASS_ICON_SORT_ALPHA_ASC = "fa fa-sort-alpha-down";
public static final String CLASS_ICON_SHOW_EMPTY_FIELDS = "fa fa-square-o";
public static final String CLASS_ICON_NOT_SHOW_EMPTY_FIELDS = "fa fa-square";
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
/*
* Copyright (C) 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.
*/

package com.evolveum.midpoint.gui.impl.page.admin.role.mining.model;

import java.util.List;

import org.apache.commons.math3.util.MathArrays;
import org.apache.wicket.model.LoadableDetachableModel;

import com.evolveum.midpoint.gui.api.model.LoadableModel;
import com.evolveum.wicket.chartjs.*;

public class RoleAnalysisAggregateChartModel extends LoadableModel<ChartConfiguration> {

LoadableDetachableModel<List<RoleAnalysisModel>> roleAnalysisModels;

public RoleAnalysisAggregateChartModel(LoadableDetachableModel<List<RoleAnalysisModel>> roleAnalysisModel) {
this.roleAnalysisModels = roleAnalysisModel;

}

@Override
protected ChartConfiguration load() {
return createChartConfiguration();
}

private ChartConfiguration createChartConfiguration() {
BarChartConfiguration chart = new BarChartConfiguration();

ChartData chartData = createDataset();
chart.setData(chartData);
chart.setOptions(createChartOptions());
return chart;
}

private ChartData createDataset() {
ChartData chartData = new ChartData();

ChartDataset datasetUsers = new ChartDataset();
datasetUsers.setLabel("Users");
datasetUsers.addBackgroudColor("Red");

ChartDataset datasetRoles = new ChartDataset();
datasetRoles.setLabel("Roles");
datasetRoles.addBackgroudColor("Green");

List<RoleAnalysisModel> object = roleAnalysisModels.getObject();
for (RoleAnalysisModel roleAnalysisModel : object) {
int rolesCount = roleAnalysisModel.getRolesCount();
datasetUsers.addData(roleAnalysisModel.getUsersCount());
datasetRoles.addData(rolesCount);
chartData.addLabel("Roles: " + rolesCount);
}

chartData.addDataset(datasetRoles);
chartData.addDataset(datasetUsers);

return chartData;
}

private ChartOptions createChartOptions() {
ChartOptions options = new ChartOptions();
options.setLegend(createLegendOptions());
options.setIndexAxis(IndexAxis.AXIS_X.getValue());
return options;
}

private ChartLegendOption createLegendOptions() {
ChartLegendOption legend = new ChartLegendOption();
legend.setDisplay(false);
ChartLegendLabel label = new ChartLegendLabel();
label.setBoxWidth(15);
legend.setLabels(label);
return legend;
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
/*
* Copyright (C) 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.
*/

package com.evolveum.midpoint.gui.impl.page.admin.role.mining.model;

public class RoleAnalysisModel {

int rolesCount;
int usersCount;

public RoleAnalysisModel(int rolesCount, int usersCount) {
this.rolesCount = rolesCount;
this.usersCount = usersCount;
}

public int getRolesCount() {
return rolesCount;
}

public int getUsersCount() {
return usersCount;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@
<body>
<wicket:extend>

<div wicket:id="chartPanel"></div>

<form wicket:id="mainForm" class="clearfix form-horizontal">
<wicket:child/>
<div wicket:id="table"></div>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@
import com.evolveum.midpoint.gui.api.util.WebComponentUtil;
import com.evolveum.midpoint.gui.impl.component.icon.CompositedIconBuilder;
import com.evolveum.midpoint.gui.impl.error.ErrorPanel;
import com.evolveum.midpoint.gui.impl.page.admin.role.mining.page.panel.chart.RoleAnalysisChartPanel;
import com.evolveum.midpoint.gui.impl.prism.panel.PrismPropertyHeaderPanel;
import com.evolveum.midpoint.gui.impl.util.DetailsPageUtil;
import com.evolveum.midpoint.model.api.AssignmentObjectRelation;
Expand Down Expand Up @@ -90,6 +91,10 @@ public PageRoleAnalysis(PageParameters params) {
protected void onInitialize() {
super.onInitialize();
initLayout();

RoleAnalysisChartPanel roleAnalysisChartPanel = new RoleAnalysisChartPanel("chartPanel");
roleAnalysisChartPanel.setOutputMarkupId(true);
add(roleAnalysisChartPanel);
}

private InlineMenuItem createDeleteInlineMenu() {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
<!--
~ 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.
-->

<wicket:panel xmlns:wicket="http://wicket.apache.org">
<div class="card card-light">
<div class="card-header">
<h3 class="card-title" wicket:id="cardTitle"></h3>
<div class="card-tools">
<form wicket:id="toolForm" >

<button wicket:id="scaleButton" type="button" class="btn btn-tool" id="scale">Reset Zoom</button>

<button wicket:id="sortButton" type="button" class="btn btn-tool" id="sort">Swith Sort</button>

<button wicket:id="exportButton" type="button" class="btn btn-tool" id="export">Swith Sort</button>

<button type="button" class="btn btn-tool" data-card-widget="collapse">
<i class="fas fa-minus"></i>
</button>
</form>

</div>
</div>
<div class="card-body">
<div id="chartScaleContainer" wicket:id="container">
<canvas wicket:id="chart"></canvas>
</div>

</div>
</div>
</wicket:panel>

0 comments on commit 1d70b72

Please sign in to comment.