Skip to content

Commit 3ae801c

Browse files
Merge branch 'master' of https://github.com/Evolveum/midpoint
2 parents 608b91d + 0b52879 commit 3ae801c

File tree

30 files changed

+589
-255
lines changed

30 files changed

+589
-255
lines changed

gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/togglebutton/ToggleIconButton.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,16 @@
1010
import org.apache.wicket.model.IModel;
1111
import org.apache.wicket.util.string.Strings;
1212

13+
import java.io.Serial;
14+
1315
/**
1416
* Simple button that toggles two states (on-off, alphasort-numericsort, etc).
1517
* The button changes the icon when pressed.
1618
*
1719
* @author semancik
1820
*/
1921
public abstract class ToggleIconButton<T> extends AjaxLink<T> {
20-
private static final long serialVersionUID = 1L;
22+
@Serial private static final long serialVersionUID = 1L;
2123

2224
private String cssClassOff;
2325
private String cssClassOn;

gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/component/tile/MultiSelectContainerActionTileTablePanel.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ protected List<Component> createToolbarButtonsList(String idButton) {
133133

134134
AjaxIconButton newObjectPerformButton = createNewObjectPerformButton(idButton, null);
135135
newObjectPerformButton.add(AttributeModifier.replace("class",
136-
"text-nowrap btn btn-primary rounded text-nowrap mx-3"));
136+
"text-nowrap btn btn-primary rounded"));
137137
newObjectPerformButton.add(new VisibleBehaviour(this::displayNoValuePanel));
138138
buttonsList.add(0, newObjectPerformButton);
139139
return buttonsList;
@@ -559,7 +559,7 @@ public void onClick(AjaxRequestTarget target) {
559559
getPageBase());
560560
}
561561

562-
generateButton.add(new VisibleBehaviour(() -> isSuggestButtonVisible() && displayNoValuePanel()));
562+
generateButton.add(new VisibleBehaviour(() -> isSuggestButtonVisible() && displayNoValuePanel() && !isShowSuggestionsButtonVisible()));
563563
generateButton.setOutputMarkupId(true);
564564
generateButton.showTitleAsLabel(true);
565565

gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/component/tile/column/ColumnTileTable.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -493,11 +493,15 @@ public void onClick(AjaxRequestTarget target) {
493493
};
494494

495495
newObjectButton.showTitleAsLabel(true);
496-
newObjectButton.add(AttributeAppender.replace("class", "btn btn-outline-primary ml-auto"));
496+
newObjectButton.add(AttributeAppender.replace("class", getNewObjectButtonCssClass()));
497497
newObjectButton.add(new VisibleBehaviour(this::isNewObjectCreationEnabled));
498498
return newObjectButton;
499499
}
500500

501+
protected String getNewObjectButtonCssClass() {
502+
return "btn btn-outline-primary ml-auto";
503+
}
504+
501505
protected StringResourceModel getNewObjectButtonTitle() {
502506
return createStringResource("ColumnTileTable.button.newObject");
503507
}

gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/factory/panel/searchfilter/SearchFilterPanelFactory.java

Lines changed: 34 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,17 @@
66

77
package com.evolveum.midpoint.gui.impl.factory.panel.searchfilter;
88

9-
import com.evolveum.midpoint.gui.api.prism.wrapper.PrismValueWrapper;
10-
119
import com.evolveum.midpoint.gui.api.util.WebComponentUtil;
1210
import com.evolveum.midpoint.gui.impl.factory.panel.AbstractInputGuiComponentFactory;
1311
import com.evolveum.midpoint.gui.impl.factory.panel.PrismPropertyPanelContext;
12+
import com.evolveum.midpoint.model.api.authentication.CompiledObjectCollectionView;
13+
import com.evolveum.midpoint.task.api.Task;
14+
import com.evolveum.midpoint.util.logging.Trace;
15+
import com.evolveum.midpoint.util.logging.TraceManager;
1416
import com.evolveum.midpoint.web.component.prism.InputPanel;
1517

1618
import jakarta.annotation.PostConstruct;
19+
import javax.xml.namespace.QName;
1720

1821
import org.apache.commons.lang3.StringUtils;
1922
import org.apache.wicket.feedback.ComponentFeedbackMessageFilter;
@@ -22,14 +25,18 @@
2225
import com.evolveum.midpoint.gui.api.prism.wrapper.ItemWrapper;
2326
import com.evolveum.midpoint.gui.api.prism.wrapper.PrismContainerValueWrapper;
2427
import com.evolveum.midpoint.gui.api.prism.wrapper.PrismPropertyWrapper;
28+
import com.evolveum.midpoint.gui.api.prism.wrapper.PrismValueWrapper;
2529
import com.evolveum.midpoint.web.page.admin.reports.component.AceEditorPanel;
2630
import com.evolveum.midpoint.web.page.admin.reports.component.SearchFilterConfigurationPanel;
2731
import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectCollectionType;
32+
import com.evolveum.midpoint.xml.ns._public.common.common_3.CollectionRefSpecificationType;
2833
import com.evolveum.prism.xml.ns._public.query_3.SearchFilterType;
2934

3035
@Component
3136
public class SearchFilterPanelFactory extends AbstractInputGuiComponentFactory<SearchFilterType> {
3237

38+
private static final Trace LOGGER = TraceManager.getTrace(SearchFilterPanelFactory.class);
39+
3340
@PostConstruct
3441
public void register() {
3542
getRegistry().addToRegistry(this);
@@ -50,13 +57,9 @@ public void configure(PrismPropertyPanelContext<SearchFilterType> panelCtx, org.
5057
//covers #10800
5158
if (component instanceof SearchFilterConfigurationPanel sfcp) {
5259
if (isCollectionObjectParentContainer(panelCtx)) {
53-
PrismPropertyWrapper<SearchFilterType> searchFilterItemWrapper = panelCtx.unwrapWrapperModel();
54-
PrismContainerValueWrapper<ObjectCollectionType> containerWrapper =
55-
(PrismContainerValueWrapper<ObjectCollectionType>) searchFilterItemWrapper.getParent();
56-
ObjectCollectionType col = containerWrapper.getRealValue();
5760
String errorMessage = "";
5861
try {
59-
Class<?> collectionType = WebComponentUtil.qnameToClass(col.getType());
62+
Class<?> collectionType = WebComponentUtil.qnameToClass(getFilterObjectType(panelCtx));
6063
panelCtx.getPageBase().getQueryConverter().createObjectFilter(collectionType, panelCtx.getRealValueModel().getObject());
6164
} catch (Exception ex) {
6265
errorMessage = StringUtils.isNotEmpty(ex.getLocalizedMessage()) ? ex.getLocalizedMessage() : ex.getMessage();
@@ -71,19 +74,36 @@ public void configure(PrismPropertyPanelContext<SearchFilterType> panelCtx, org.
7174

7275
@Override
7376
protected InputPanel getPanel(PrismPropertyPanelContext<SearchFilterType> panelCtx) {
74-
PrismPropertyWrapper<SearchFilterType> searchFilterItemWrapper = panelCtx.unwrapWrapperModel();
75-
PrismContainerValueWrapper<?> containerWrapper = searchFilterItemWrapper.getParent();
76-
if (isCollectionObjectParentContainer(panelCtx)) {
77-
return new SearchFilterConfigurationPanel(
78-
panelCtx.getComponentId(), panelCtx.getItemWrapperModel(), panelCtx.getRealValueModel(), containerWrapper);
79-
}
8077
return new SearchFilterConfigurationPanel(
81-
panelCtx.getComponentId(), panelCtx.getItemWrapperModel(), panelCtx.getRealValueModel(), null);
78+
panelCtx.getComponentId(), panelCtx.getItemWrapperModel(), panelCtx.getRealValueModel(), getFilterObjectType(panelCtx)
79+
);
8280
}
8381

8482
private boolean isCollectionObjectParentContainer(PrismPropertyPanelContext<SearchFilterType> panelCtx) {
8583
PrismPropertyWrapper<SearchFilterType> searchFilterItemWrapper = panelCtx.unwrapWrapperModel();
8684
PrismContainerValueWrapper<?> containerWrapper = searchFilterItemWrapper.getParent();
8785
return containerWrapper != null && containerWrapper.getRealValue() instanceof ObjectCollectionType;
8886
}
87+
88+
private QName getFilterObjectType(PrismPropertyPanelContext<SearchFilterType> panelCtx) {
89+
PrismPropertyWrapper<SearchFilterType> searchFilterItemWrapper = panelCtx.unwrapWrapperModel();
90+
PrismContainerValueWrapper<?> containerWrapper = searchFilterItemWrapper.getParent();
91+
if (containerWrapper == null) {
92+
return null;
93+
}
94+
var parentContainerValue = containerWrapper.getRealValue();
95+
if (parentContainerValue instanceof ObjectCollectionType oct) {
96+
return oct.getType();
97+
} else if (parentContainerValue instanceof CollectionRefSpecificationType collectionRefSpecificationType) {
98+
try {
99+
Task task = panelCtx.getPageBase().createSimpleTask("compileObjectCollectionView");
100+
CompiledObjectCollectionView compiledView = panelCtx.getPageBase().getModelInteractionService()
101+
.compileObjectCollectionView(collectionRefSpecificationType, null, task, task.getResult());
102+
return compiledView.getContainerType();
103+
} catch (Exception e) {
104+
LOGGER.debug("Cannot get filter object type", e);
105+
}
106+
}
107+
return null;
108+
}
89109
}

gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/page/admin/connector/development/component/wizard/scimrest/connection/ResourceTestPanel.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@
88

99
import java.time.Duration;
1010

11-
import com.evolveum.midpoint.gui.impl.page.admin.resource.component.wizard.schemaHandling.objectType.smart.SmartIntegrationUtils;
12-
11+
import com.evolveum.midpoint.gui.impl.page.admin.resource.component.wizard.schemaHandling.objectType.smart.component.TimerProgressPanel;
12+
import com.evolveum.midpoint.prism.xml.XmlTypeConverter;
1313
import com.evolveum.midpoint.util.exception.*;
1414

1515
import org.apache.wicket.AttributeModifier;
@@ -27,6 +27,8 @@
2727
import com.evolveum.midpoint.util.logging.TraceManager;
2828
import com.evolveum.midpoint.web.component.util.VisibleBehaviour;
2929

30+
import javax.xml.datatype.XMLGregorianCalendar;
31+
3032
public class ResourceTestPanel extends BasePanel<String> {
3133

3234
private static final String ID_PANEL_CONTAINER = "panelContainer";
@@ -39,7 +41,7 @@ public class ResourceTestPanel extends BasePanel<String> {
3941

4042
private static final Trace LOGGER = TraceManager.getTrace(ResourceTestPanel.class);
4143

42-
private Long startMillis = System.currentTimeMillis();
44+
private final XMLGregorianCalendar startTimestamp = XmlTypeConverter.createXMLGregorianCalendar(System.currentTimeMillis());
4345
private State state = State.RUNNING;
4446
private AbstractAjaxTimerBehavior timerBehavior;
4547

@@ -123,7 +125,7 @@ protected void onTimer(AjaxRequestTarget target) {
123125
}
124126

125127
private void initCorePart(@NotNull WebMarkupContainer bodyContainer) {
126-
Label elapsedTime = new Label(ID_ELAPSED_TIME, () -> SmartIntegrationUtils.formatElapsedTime(startMillis, null));
128+
TimerProgressPanel elapsedTime = new TimerProgressPanel(ID_ELAPSED_TIME, () -> startTimestamp);
127129
elapsedTime.setOutputMarkupId(true);
128130
elapsedTime.add(new VisibleBehaviour(() -> state == State.RUNNING));
129131
bodyContainer.add(elapsedTime);

gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/page/admin/resource/component/NoValuePanel.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,12 @@
1212
<div class="h5 text-secondary" wicket:id="title"></div>
1313
<p class="text-muted" wicket:id="subtitle"></p>
1414

15-
<div class="d-flex justify-content-center" wicket:id="buttonToolbar"></div>
15+
<div class="d-flex justify-content-center gap-2" wicket:id="buttonToolbar"></div>
1616
</div>
1717

1818
<wicket:fragment wicket:id="buttonBar" id="buttonBar">
1919
<div class="btn-group" wicket:id="buttonsRepeater">
20-
<a wicket:id="button"></a>
20+
<a wicket:id="button" style="margin-left: 0 !important; margin-right: 0 !important;"></a>
2121
</div>
2222
</wicket:fragment>
2323
</wicket:panel>

gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/page/admin/resource/component/wizard/schemaHandling/associationType/subject/mappingContainer/AssociationAttributeMappingsTable.java

Lines changed: 6 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@
3232
import com.evolveum.midpoint.util.logging.TraceManager;
3333
import com.evolveum.midpoint.web.component.data.column.IconColumn;
3434
import com.evolveum.midpoint.web.component.prism.ValueStatus;
35-
import com.evolveum.midpoint.web.component.util.VisibleBehaviour;
3635
import com.evolveum.midpoint.web.session.UserProfileStorage;
3736
import com.evolveum.midpoint.xml.ns._public.common.common_3.*;
3837

@@ -391,20 +390,6 @@ public String getCssClass() {
391390
return "col-2 header-border-right";
392391
}
393392

394-
@Override
395-
protected Component createColumnPanel(String componentId, IModel rowModel) {
396-
Component columnPanel = super.createColumnPanel(componentId, rowModel);
397-
columnPanel.add(new VisibleBehaviour(() -> {
398-
PrismContainerValueWrapper<MappingType> row = ((PrismPropertyWrapper) rowModel.getObject()).getParent();
399-
return isAttributeRefMapping(row);
400-
}));
401-
return columnPanel;
402-
}
403-
404-
@Override
405-
protected Component createHeader(String componentId, IModel mainModel) {
406-
return super.createHeader(componentId, mainModel);
407-
}
408393
});
409394

410395
columns.add(new PrismPropertyWrapperColumn<>(
@@ -557,4 +542,10 @@ protected boolean isSuggestionSwitchSupported() {
557542
protected boolean isSimulationSupported() {
558543
return false;
559544
}
545+
546+
@Override
547+
protected String getNewObjectButtonCssClass() {
548+
return "btn btn-outline-primary";
549+
}
550+
560551
}

gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/page/admin/resource/component/wizard/schemaHandling/associationType/subject/mappingContainer/AssociationMappingsTableWizardPanel.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
xmlns:wicket="http://wicket.apache.org">
1010
<body>
1111
<wicket:extend>
12-
<div class="ml-auto mr-auto col-11 px-0" wicket:id="tabTable"></div>
12+
<div wicket:id="tabTable"></div>
1313
</wicket:extend>
1414
</body>
1515
</html>

gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/page/admin/resource/component/wizard/schemaHandling/objectType/attribute/mapping/SmartMappingTable.java

Lines changed: 24 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -221,21 +221,15 @@ protected List<Component> createNoValueButtonToolbar(String id) {
221221

222222
@Override
223223
protected void initPanelToolbarButtons(@NotNull RepeatingView toolbar) {
224-
var toggleSuggestionVisibilityButton = createToggleSuggestionVisibilityButton(getPageBase(),
225-
toolbar.newChildId(),
226-
suggestionToggleModel,
227-
SmartMappingTable.this::refreshAndDetach,
228-
null);
229-
230-
toggleSuggestionVisibilityButton.add(new VisibleBehaviour(() -> isSuggestionSwitchSupported()));
231-
232-
toolbar.add(toggleSuggestionVisibilityButton);
233-
234-
toolbar.add(createAcceptAllButton(toolbar.newChildId()));
235-
toolbar.add(createDiscardAllButton(toolbar.newChildId()));
224+
SmartMappingTable.this.initPanelToolbarButtons(toolbar);
236225
super.initPanelToolbarButtons(toolbar);
237226
}
238227

228+
@Override
229+
protected String getNewObjectButtonCssClass() {
230+
return SmartMappingTable.this.getNewObjectButtonCssClass();
231+
}
232+
239233
@Override
240234
public @NotNull InlineMenuItem.VisibilityChecker getDefaultMenuVisibilityChecker() {
241235
return bySuggestion(false, this::getStatusInfo);
@@ -290,6 +284,24 @@ protected void deleteItemPerformed(@NotNull PrismContainerValueWrapper<MappingTy
290284
return columnTileTable;
291285
}
292286

287+
protected String getNewObjectButtonCssClass() {
288+
return "btn btn-outline-primary ml-auto";
289+
}
290+
291+
protected void initPanelToolbarButtons(@NotNull RepeatingView toolbar) {
292+
var toggleSuggestionVisibilityButton = createToggleSuggestionVisibilityButton(getPageBase(),
293+
toolbar.newChildId(),
294+
suggestionToggleModel,
295+
SmartMappingTable.this::refreshAndDetach,
296+
null);
297+
298+
toggleSuggestionVisibilityButton.add(new VisibleBehaviour(this::isSuggestionSwitchSupported));
299+
300+
toolbar.add(toggleSuggestionVisibilityButton);
301+
toolbar.add(createAcceptAllButton(toolbar.newChildId()));
302+
toolbar.add(createDiscardAllButton(toolbar.newChildId()));
303+
}
304+
293305
@SuppressWarnings("unchecked")
294306
protected ISortableDataProvider<PrismContainerValueWrapper<MappingType>, String> createDataProvider() {
295307
var dto = StatusAwareDataFactory.createMappingModel(this, resourceOid, suggestionToggleModel,

gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/page/admin/resource/component/wizard/schemaHandling/objectType/smart/SmartIntegrationUtils.java

Lines changed: 0 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -116,65 +116,6 @@ public class SmartIntegrationUtils {
116116
.collect(Collectors.toSet());
117117
}
118118

119-
/**
120-
* Formats the elapsed time between the suggestion's start and finish (or now if still running)
121-
* into a human-readable string with days, hours, minutes, seconds, and milliseconds.
122-
*/
123-
public static @NotNull String formatElapsedTime(StatusInfo<?> s) {
124-
if (s == null || s.getRealizationStartTimestamp() == null) {
125-
return "Elapsed time: unknown";
126-
}
127-
128-
long startMillis = s.getRealizationStartTimestamp().toGregorianCalendar().getTimeInMillis();
129-
long endMillis = (s.getRealizationEndTimestamp() != null
130-
? s.getRealizationEndTimestamp().toGregorianCalendar().getTimeInMillis()
131-
: System.currentTimeMillis());
132-
133-
return formatElapsedTime(startMillis, endMillis);
134-
}
135-
136-
public static @NotNull String formatElapsedTime(Long startMillis, Long endMillis) {
137-
return formatElapsedTime(startMillis, endMillis, null);
138-
}
139-
140-
public static @NotNull String formatElapsedTime(Long startMillis, Long endMillis, String prefix) {
141-
if (endMillis == null) {
142-
endMillis = System.currentTimeMillis();
143-
}
144-
145-
long elapsedMillis = endMillis - startMillis;
146-
if (elapsedMillis < 0) {elapsedMillis = 0;}
147-
148-
long days = elapsedMillis / 86_400_000;
149-
elapsedMillis %= 86_400_000;
150-
long hours = elapsedMillis / 3_600_000;
151-
elapsedMillis %= 3_600_000;
152-
long minutes = elapsedMillis / 60_000;
153-
elapsedMillis %= 60_000;
154-
long seconds = elapsedMillis / 1_000;
155-
elapsedMillis %= 1_000;
156-
long millis = elapsedMillis;
157-
158-
String timeDisplay;
159-
if (days > 0) {
160-
timeDisplay = String.format("%dd %02dh %02dm %02ds %03dms", days, hours, minutes, seconds, millis);
161-
} else if (hours > 0) {
162-
timeDisplay = String.format("%dh %02dm %02ds %03dms", hours, minutes, seconds, millis);
163-
} else if (minutes > 0) {
164-
timeDisplay = String.format("%dm %02ds %03dms", minutes, seconds, millis);
165-
} else if (seconds > 0) {
166-
timeDisplay = String.format("%ds %03dms", seconds, millis);
167-
} else {
168-
timeDisplay = millis + "ms";
169-
}
170-
171-
if (prefix != null && !prefix.isEmpty()) {
172-
return prefix + ": " + timeDisplay;
173-
}
174-
175-
return "Elapsed time: " + timeDisplay;
176-
}
177-
178119
/**
179120
* Executes an object type suggestion operation if no suggestion is currently available.
180121
* If suggestions exist, no background task is started.

0 commit comments

Comments
 (0)