Skip to content

Commit

Permalink
Merge branch 'master' of github.com:Evolveum/midpoint
Browse files Browse the repository at this point in the history
  • Loading branch information
1azyman committed Sep 18, 2023
2 parents 89ba961 + 7132d9a commit 4be9a48
Show file tree
Hide file tree
Showing 32 changed files with 446 additions and 120 deletions.
55 changes: 50 additions & 5 deletions gui/admin-gui/src/frontend/scss/details-menu.scss
Original file line number Diff line number Diff line change
Expand Up @@ -17,11 +17,44 @@
//top: 0;
right: 0;
overflow-x: hidden;
padding-top: 16px;
//padding-top: 16px;
margin: 0;

& a > div > i.fas,
a > div > i.far,
a > div > i.fa,
a > div > i.fe {
min-width: 24px;
text-align: center;
}

& a > div > div {
min-width: 9rem;
max-width: 14rem;
padding-right: 0.75rem;
padding-left: 0.5rem;
}

& a .details-menu-items {
align-items: center;
//min-width: 42px;
justify-content: end;
}

& a .details-menu-items .details-caret {
width: 1.15rem;
line-height:normal;
}

& > li.navigation-details {
list-style: none;
margin: 0px 10px 0px 5px;
border-radius: 0.25rem;
overflow: hidden;
//margin: 0px 10px 0px 5px;

&:not(:last-child){
margin-bottom: 0.2rem;
}

.navigation-details {
display: none;
Expand Down Expand Up @@ -49,12 +82,15 @@
display: block;
}

> a > .fa-angle-left {
& > a .fa-angle-left {
transform: rotate(270deg);
}
}
}

//.details-menu a>i.fa,.details-menu a>i.fe{width:20px}


.details-menu {
padding-top: 0px;
background-color: $sidebar-light-submenu-bg;
Expand Down Expand Up @@ -169,12 +205,13 @@


.details-menu a {
padding: 6px 8px 6px 5px;
text-decoration: none;
font-size: 15px;
color: $sidebar-light-color;
display: block;
cursor: pointer;
padding: 8px 8px 8px 10px;
border-radius: 0.25rem;

& > i {
padding-right: 5px;
Expand All @@ -187,6 +224,10 @@
width: 20px;
}
}
& .details-caret i {
width: 100%;
text-align: center;
}
}

.details-menu a:hover {
Expand All @@ -195,5 +236,9 @@
}

ul.details-menu {
padding-inline-start: 13px;
padding-inline-start: 0px;

& ul {
padding-inline-start: 13px;
}
}
11 changes: 11 additions & 0 deletions gui/admin-gui/src/frontend/scss/midpoint.scss
Original file line number Diff line number Diff line change
Expand Up @@ -1578,6 +1578,8 @@ fieldset.objectButtons {
flex-direction: row;
align-items: stretch;
background-color: $white;
overflow: hidden;
box-shadow: 0 0 1px rgba(0,0,0,.125), 0 1px 3px rgba(0,0,0,.2);
}

.details-panel-navigation {
Expand Down Expand Up @@ -1944,3 +1946,12 @@ th.debug-list-buttons {
.lh-2 {
line-height: 1.5;
}

//Grouped classes with smooth-transition function
.details-menu a,
.details-menu a:hover,
.nav-sidebar .nav-item > .nav-link,
.nav-sidebar .nav-item > .nav-link:hover
{
@include smooth-transition(0.08s);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
/*
* 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.api.util;

import com.evolveum.midpoint.gui.api.component.Badge;

import org.apache.commons.lang3.StringUtils;

public enum DisplayForLifecycleState {

ACTIVE("SimulationModePanel.option.active", "colored-form-success"),
DRAFT("SimulationModePanel.option.draft", "colored-form-secondary"),
SUSPENDED(null, "colored-form-secondary"),
FAILED(null, "colored-form-danger"),
PROPOSED("SimulationModePanel.option.proposed", "colored-form-warning"),
DEFAULT(null, "colored-form-info");

private final String label;
private final String cssClass;

DisplayForLifecycleState(String label, String cssClass) {
this.label = label;
this.cssClass = cssClass;
}

public static DisplayForLifecycleState valueOfOrDefault(String name) {
if (StringUtils.isEmpty(name)) {
return DisplayForLifecycleState.DEFAULT;
}

DisplayForLifecycleState value;
try {
value = valueOf(name.toUpperCase());
} catch (IllegalArgumentException e) {
return DisplayForLifecycleState.DEFAULT;
}

if (value == null) {
return DisplayForLifecycleState.DEFAULT;
}

return value;
}

public String getLabel() {
return label;
}

public String getCssClass() {
return cssClass;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2455,15 +2455,19 @@ public static <O extends ObjectType> CompositedIcon createCompositeIconForObject
}
//TODO trigger

IconType lifecycleStateIcon = IconAndStylesUtil.getIconForLifecycleState(obj);
IconType activationStatusIcon = IconAndStylesUtil.getIconForActivationStatus(obj);

String iconColor = GuiDisplayTypeUtil.getIconColor(basicIconDisplayType);

CompositedIconBuilder builder = iconBuilder.setBasicIcon(
GuiDisplayTypeUtil.getIconCssClass(basicIconDisplayType), IconCssStyle.IN_ROW_STYLE)
.appendColorHtmlValue(StringUtils.isNotEmpty(iconColor) ? iconColor : "");

if (obj instanceof ResourceType) {
return builder.build();
}

IconType lifecycleStateIcon = IconAndStylesUtil.getIconForLifecycleState(obj);
IconType activationStatusIcon = IconAndStylesUtil.getIconForActivationStatus(obj);

StringBuilder title = new StringBuilder(getOrigStringFromPolyOrEmpty(basicIconDisplayType.getTooltip()));
if (lifecycleStateIcon != null) {
builder.appendLayerIcon(lifecycleStateIcon, IconCssStyle.BOTTOM_LEFT_FOR_COLUMN_STYLE); // TODO: do we really want to expect not null icon for layerIcon?
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
/*
* 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.component.data.column;

import com.evolveum.midpoint.gui.api.component.Badge;
import com.evolveum.midpoint.gui.api.component.BadgeListPanel;
import com.evolveum.midpoint.gui.api.component.BadgePanel;
import com.evolveum.midpoint.gui.api.page.PageBase;
import com.evolveum.midpoint.gui.api.util.DisplayForLifecycleState;
import com.evolveum.midpoint.gui.api.util.LocalizationUtil;
import com.evolveum.midpoint.gui.api.util.WebComponentUtil;
import com.evolveum.midpoint.prism.Containerable;
import com.evolveum.midpoint.prism.PrismContainerDefinition;
import com.evolveum.midpoint.prism.PrismProperty;
import com.evolveum.midpoint.schema.constants.SchemaConstants;
import com.evolveum.midpoint.web.component.util.SelectableBean;

import com.evolveum.midpoint.xml.ns._public.common.common_3.LookupTableRowType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.LookupTableType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType;

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

import org.apache.commons.lang3.StringUtils;
import org.apache.wicket.Component;
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.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.repeater.Item;
import org.apache.wicket.model.IModel;

import java.util.List;
import java.util.Optional;

public class LifecycleStateBadgeColumn<C extends Containerable> extends AbstractColumn<SelectableBean<C>, String> {

private final IModel<? extends PrismContainerDefinition<C>> mainModel;
private final PageBase pageBase;

public LifecycleStateBadgeColumn(IModel<? extends PrismContainerDefinition<C>> mainModel, PageBase pageBase) {
super(null);
this.mainModel = mainModel;
this.pageBase = pageBase;
}

@Override
public Component getHeader(String componentId) {
LifecycleStateColumn column = new LifecycleStateColumn<>(mainModel, pageBase);
return column.getHeader(componentId);
}

@Override
public void populateItem(Item<ICellPopulator<SelectableBean<C>>> item, String componentId, IModel<SelectableBean<C>> iModel) {
if (iModel.getObject() == null) {
addEmptyComponent(item, componentId);
return;
}
if (iModel.getObject().getValue() == null) {
addEmptyComponent(item, componentId);
return;
}
C containerValue = iModel.getObject().getValue();
PrismProperty<String> lifecycle = containerValue.asPrismContainerValue().findProperty(ObjectType.F_LIFECYCLE_STATE);

String value;
if (lifecycle == null || StringUtils.isEmpty(lifecycle.getRealValue())) {
value = SchemaConstants.LIFECYCLE_ACTIVE;
} else {
value = lifecycle.getRealValue();
}

LookupTableType lookupTable =
WebComponentUtil.loadLookupTable(SystemObjectsType.LOOKUP_LIFECYCLE_STATES.value(), pageBase);
if (lookupTable == null) {
addEmptyComponent(item, componentId);
return;
}

String finalValue = value;
Optional<LookupTableRowType> rowOp =
lookupTable.getRow().stream().filter(row -> finalValue.equals(row.getKey())).findFirst();
if (rowOp.isEmpty()) {
addEmptyComponent(item, componentId);
return;
}

LookupTableRowType rowBean = rowOp.get();
DisplayForLifecycleState state = DisplayForLifecycleState.valueOfOrDefault(rowBean.getKey());
item.add(
new BadgeListPanel(
componentId,
() -> List.of(new Badge(
state.getCssClass() + " alert px-1 py-0 m-0",
LocalizationUtil.translatePolyString(rowBean.getLabel())))));

item.add(AttributeAppender.remove("class"));
}

private void addEmptyComponent(Item<ICellPopulator<SelectableBean<C>>> item, String componentId) {
item.add(new Label(componentId));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@

package com.evolveum.midpoint.gui.impl.component.input;

import com.evolveum.midpoint.gui.api.component.Badge;
import com.evolveum.midpoint.gui.api.util.DisplayForLifecycleState;
import com.evolveum.midpoint.gui.api.util.DisplayableChoiceRenderer;
import com.evolveum.midpoint.gui.api.util.LocalizationUtil;
import com.evolveum.midpoint.gui.api.util.WebComponentUtil;
Expand Down Expand Up @@ -52,41 +54,6 @@ public class LifecycleStatePanel extends InputPanel {

private final IModel<PrismPropertyWrapper<String>> model;

enum DisplayForOption {

ACTIVE("SimulationModePanel.option.active", "colored-form-success"),
DRAFT("SimulationModePanel.option.draft", "colored-form-secondary"),
PROPOSED("SimulationModePanel.option.proposed", "colored-form-warning"),
DEFAULT(null, "colored-form-info");

private final String label;
private final String cssClass;

DisplayForOption(String label, String cssClass) {
this.label = label;
this.cssClass = cssClass;
}

private static DisplayForOption valueOfOrDefault(String name) {
if (StringUtils.isEmpty(name)) {
return DisplayForOption.DEFAULT;
}

DisplayForOption value;
try {
value = valueOf(name.toUpperCase());
} catch (IllegalArgumentException e) {
return DisplayForOption.DEFAULT;
}

if (value == null) {
return DisplayForOption.DEFAULT;
}

return value;
}
}

public LifecycleStatePanel(String id, IModel<PrismPropertyWrapper<String>> model) {
super(id);
this.model = model;
Expand Down Expand Up @@ -180,9 +147,9 @@ protected CharSequence getDefaultChoice(String selectedValue) {
@Override
protected void appendOptionHtml(AppendingStringBuffer buffer, T choice, int index, String selected) {
DisplayableValue<String> displayValue = (DisplayableValue<String>) choice;
DisplayForOption display = DisplayForOption.valueOfOrDefault(displayValue.getValue());
DisplayForLifecycleState display = DisplayForLifecycleState.valueOfOrDefault(displayValue.getValue());
String label = new DisplayableValueChoiceRenderer<>(null).getDisplayValue(displayValue);
if (display.label == null) {
if (display.getLabel() == null) {
buffer.append("\n<option ");
setOptionAttributes(buffer, choice, index, selected);
buffer.append(">");
Expand All @@ -195,7 +162,7 @@ protected void appendOptionHtml(AppendingStringBuffer buffer, T choice, int inde
buffer.append(label);
buffer.append("</option>");

String advancedLabel = LocalizationUtil.translate(display.label);
String advancedLabel = LocalizationUtil.translate(display.getLabel());
buffer.append("\n<option ");
setOptionAttributes(buffer, choice, index, null);
buffer.append(">");
Expand Down Expand Up @@ -231,8 +198,8 @@ protected void onUpdate(AjaxRequestTarget target) {
} else {
name = value.getValue();
}
DisplayForOption display = DisplayForOption.valueOfOrDefault(name);
return display.cssClass + " form-control form-control-sm resizing-select " + customCssClassForInputField();
DisplayForLifecycleState display = DisplayForLifecycleState.valueOfOrDefault(name);
return display.getCssClass() + " form-control form-control-sm resizing-select " + customCssClassForInputField();
}));

add(input);
Expand Down

0 comments on commit 4be9a48

Please sign in to comment.