Skip to content

Commit

Permalink
improving flow for object details pages (e.g. choose template -> crea…
Browse files Browse the repository at this point in the history
…te user -> progress panel)
  • Loading branch information
katkav committed Sep 14, 2021
1 parent 7f849aa commit 7340873
Show file tree
Hide file tree
Showing 28 changed files with 1,883 additions and 175 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@

import com.evolveum.midpoint.web.component.util.SerializableFunction;

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

import org.apache.commons.lang3.StringUtils;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn;
Expand Down Expand Up @@ -120,7 +122,7 @@ protected List<ObjectOrdering> createObjectOrderings(SortParam<String> sortParam
}

protected List<CompiledObjectCollectionView> getAllApplicableArchetypeViews() {
return getPageBase().getCompiledGuiProfile().findAllApplicableArchetypeViews(WebComponentUtil.classToQName(getPageBase().getPrismContext(), getType()));
return getPageBase().getCompiledGuiProfile().findAllApplicableArchetypeViews(WebComponentUtil.classToQName(getPageBase().getPrismContext(), getType()), OperationTypeType.ADD);
}

public void clearCache() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,9 @@
<html xmlns:wicket="http://wicket.apache.org">
<body>
<wicket:extend>
<div wicket:id="progressPanel"></div>
<div wicket:id="details">
<div wicket:id="detailsView"></div>

<wicket:fragment wicket:id="details">
<div class="row">
<div class="col-lg-12 col-md-12 col-sm-12 col-xs-12">
<div wicket:id="summary"></div>
Expand All @@ -33,7 +34,37 @@
<div wicket:id="navigation"></div>
</div>
</div>
</div>
</wicket:fragment>

<wicket:fragment wicket:id="progressPanelFragment">
<div wicket:id="progressPanel"></div>
</wicket:fragment>
<!-- <div wicket:id="progressPanel"></div>-->
<!-- <div wicket:id="details">-->
<!-- <div class="row">-->
<!-- <div class="col-lg-12 col-md-12 col-sm-12 col-xs-12">-->
<!-- <div wicket:id="summary"></div>-->
<!-- </div>-->
<!-- <form wicket:id="mainForm">-->
<!-- <div class="col-lg-12 col-md-12 col-sm-12 col-xs-12">-->
<!-- <span wicket:id="buttons"/>-->
<!-- </div>-->

<!-- <div class="col-lg-9 col-md-10 col-sm-10 col-xs-10">-->
<!-- <div class="box">-->
<!-- <div class="box-body">-->

<!-- <div wicket:id="mainPanel"></div>-->

<!-- </div>-->
<!-- </div>-->
<!-- </div>-->
<!-- </form>-->
<!-- <div class="col-lg-3 col-md-2 col-sm-2 col-xs-2">-->
<!-- <div wicket:id="navigation"></div>-->
<!-- </div>-->
<!-- </div>-->
<!-- </div>-->
<wicket:child/>
</wicket:extend>
</body>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
<?xml version="1.0" encoding="UTF-8" ?>

<!--
~ Copyright (c) 2021 Evolveum
~
~ This work is dual-licensed under the Apache License 2.0
~ and European Union Public License. See LICENSE file for details.
-->
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:wicket="http://wicket.apache.org">
<body>
<wicket:panel>
<div wicket:id="template" />
</wicket:panel>
</body>
</html>
Original file line number Diff line number Diff line change
@@ -0,0 +1,156 @@
/*
* Copyright (C) 2021 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;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import javax.xml.namespace.QName;

import org.apache.commons.collections4.CollectionUtils;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.markup.html.WebPage;
import org.apache.wicket.model.PropertyModel;

import com.evolveum.midpoint.gui.api.component.BasePanel;
import com.evolveum.midpoint.gui.api.model.LoadableModel;
import com.evolveum.midpoint.gui.api.util.WebComponentUtil;
import com.evolveum.midpoint.gui.api.util.WebDisplayTypeUtil;
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.IconCssStyle;
import com.evolveum.midpoint.gui.impl.util.ObjectCollectionViewUtil;
import com.evolveum.midpoint.model.api.AssignmentObjectRelation;
import com.evolveum.midpoint.model.api.authentication.CompiledObjectCollectionView;
import com.evolveum.midpoint.prism.PrismObject;
import com.evolveum.midpoint.util.QNameUtil;
import com.evolveum.midpoint.util.exception.SchemaException;
import com.evolveum.midpoint.web.component.CompositedIconButtonDto;
import com.evolveum.midpoint.web.component.MultiCompositedButtonPanel;
import com.evolveum.midpoint.web.component.MultiFunctinalButtonDto;
import com.evolveum.midpoint.xml.ns._public.common.common_3.DisplayType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectReferenceType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ReportType;

public class CreateTemplatePanel<O extends ObjectType> extends BasePanel<PrismObject<O>> {

private static final String ID_TEMPLATE = "template";

public CreateTemplatePanel(String id) {
super(id);
}

@Override
protected void onInitialize() {
super.onInitialize();
initLayout();
}

private void initLayout() {
MultiCompositedButtonPanel buttonsPanel = new MultiCompositedButtonPanel(ID_TEMPLATE, new PropertyModel<>(loadButtonDescriptions(), MultiFunctinalButtonDto.F_ADDITIONAL_BUTTONS)) {
private static final long serialVersionUID = 1L;

@Override
protected void buttonClickPerformed(AjaxRequestTarget target, AssignmentObjectRelation relationSpec, CompiledObjectCollectionView collectionViews, Class<? extends WebPage> page) {
onTemplateChosePerformed(collectionViews, target);
}

};
add(buttonsPanel);
}

protected void onTemplateChosePerformed(CompiledObjectCollectionView collectionViews, AjaxRequestTarget target) {
List<ObjectReferenceType> archetypeRef = ObjectCollectionViewUtil.getArchetypeReferencesList(collectionViews);
try {
WebComponentUtil.initNewObjectWithReference(getPageBase(),
getType(),
archetypeRef);
} catch (SchemaException ex) {
getPageBase().getFeedbackMessages().error(getPageBase(), ex.getUserFriendlyMessage());
target.add(getPageBase().getFeedbackPanel());
}
}

protected LoadableModel<MultiFunctinalButtonDto> loadButtonDescriptions() {
return new LoadableModel<>(false) {

@Override
protected MultiFunctinalButtonDto load() {
List<CompositedIconButtonDto> additionalButtons = new ArrayList<>();

Collection<CompiledObjectCollectionView> compiledObjectCollectionViews = findAllApplicableArchetypeViews();

if (CollectionUtils.isNotEmpty(compiledObjectCollectionViews)) {
compiledObjectCollectionViews.forEach(collection -> {
CompositedIconButtonDto buttonDesc = new CompositedIconButtonDto();
buttonDesc.setCompositedIcon(createCompositedIcon(collection));
buttonDesc.setOrCreateDefaultAdditionalButtonDisplayType(collection.getDisplay());
buttonDesc.setCollectionView(collection);
additionalButtons.add(buttonDesc);
});
}

if (isGenericNewButtonVisible()) {
CompositedIconButtonDto defaultButton = new CompositedIconButtonDto();
DisplayType defaultButtonDisplayType = getDefaultButtonDisplayType();
defaultButton.setAdditionalButtonDisplayType(defaultButtonDisplayType);

CompositedIconBuilder defaultButtonIconBuilder = new CompositedIconBuilder();
defaultButtonIconBuilder.setBasicIcon(WebComponentUtil.getIconCssClass(defaultButtonDisplayType), IconCssStyle.IN_ROW_STYLE)
.appendColorHtmlValue(WebComponentUtil.getIconColor(defaultButtonDisplayType));

defaultButton.setCompositedIcon(defaultButtonIconBuilder.build());
additionalButtons.add(defaultButton);
}

MultiFunctinalButtonDto multifunctionalButton = new MultiFunctinalButtonDto();
multifunctionalButton.setAdditionalButtons(additionalButtons);
return multifunctionalButton;
}
};
}

protected Collection<CompiledObjectCollectionView> findAllApplicableArchetypeViews() {
return null;
}

//TODO copied from MainObjectListPanel
private CompositedIcon createCompositedIcon(CompiledObjectCollectionView collectionView) {
DisplayType additionalButtonDisplayType = WebDisplayTypeUtil.getNewObjectDisplayTypeFromCollectionView(collectionView, getPageBase());
CompositedIconBuilder builder = new CompositedIconBuilder();

builder.setBasicIcon(WebComponentUtil.getIconCssClass(additionalButtonDisplayType), IconCssStyle.IN_ROW_STYLE)
.appendColorHtmlValue(WebComponentUtil.getIconColor(additionalButtonDisplayType));

return builder.build();
}

private DisplayType getDefaultButtonDisplayType() {
String iconCssStyle = WebComponentUtil.createDefaultBlackIcon(getType());

String sb = createStringResource("MainObjectListPanel.newObject").getString()
+ " "
+ createStringResource("ObjectTypeLowercase." + getType().getLocalPart()).getString();
DisplayType display = WebDisplayTypeUtil.createDisplayType(iconCssStyle, "", sb);
display.setLabel(WebComponentUtil.createPolyFromOrigString(
getType().getLocalPart(), "ObjectType." + getType().getLocalPart()));
return display;
}

protected boolean isGenericNewButtonVisible() {
if (QNameUtil.match(ReportType.COMPLEX_TYPE, getType())) {
return false;
}
return true;
}

protected QName getType() {
return null;
}

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

import org.apache.wicket.MarkupContainer;
import org.apache.wicket.markup.html.panel.Fragment;

public class DetailsFragment extends Fragment {

public DetailsFragment(String id, String markupId, MarkupContainer markupProvider) {
super(id, markupId, markupProvider);
setOutputMarkupId(true);
}

@Override
protected void onInitialize() {
super.onInitialize();
initFragmentLayout();
}

protected void initFragmentLayout() {

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

import com.evolveum.midpoint.prism.delta.ObjectDelta;
import com.evolveum.midpoint.schema.ObjectDeltaOperation;
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.task.api.Task;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType;

import org.apache.wicket.ajax.AjaxRequestTarget;

import java.util.Collection;

public interface ObjectChangeExecutor {

Collection<ObjectDeltaOperation<? extends ObjectType>> executeChanges(Collection<ObjectDelta<? extends ObjectType>> deltas, boolean previewOnly, Task task, OperationResult result, AjaxRequestTarget target);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
/*
* Copyright (C) 2021 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;

import java.util.Collection;

import com.evolveum.midpoint.util.logging.Trace;

import com.evolveum.midpoint.util.logging.TraceManager;

import org.apache.wicket.ajax.AjaxRequestTarget;

import com.evolveum.midpoint.model.api.ModelExecuteOptions;
import com.evolveum.midpoint.model.api.ModelService;
import com.evolveum.midpoint.prism.delta.ObjectDelta;
import com.evolveum.midpoint.schema.ObjectDeltaOperation;
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.task.api.Task;
import com.evolveum.midpoint.util.exception.CommonException;
import com.evolveum.midpoint.util.logging.LoggingUtils;
import com.evolveum.midpoint.web.security.MidPointApplication;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType;

public class ObjectChangesExecutorImpl implements ObjectChangeExecutor {

private static final Trace LOGGER = TraceManager.getTrace(ObjectChangesExecutorImpl.class);

@Override
public Collection<ObjectDeltaOperation<? extends ObjectType>> executeChanges(Collection<ObjectDelta<? extends ObjectType>> deltas, boolean previewOnly, Task task, OperationResult result, AjaxRequestTarget target) {
return executeChanges(deltas, task, result, target);
}

public Collection<ObjectDeltaOperation<? extends ObjectType>> executeChanges(Collection<ObjectDelta<? extends ObjectType>> deltas, Task task, OperationResult result, AjaxRequestTarget target) {
return executeChanges(deltas, null, task, result);
}

/**
* Executes changes on behalf of the parent page. By default, changes are executed asynchronously (in
* a separate thread). However, when set in the midpoint configuration, changes are executed synchronously.
*
* @param deltas Deltas to be executed.
* @param options Model execution options.
* @param task Task in context of which the changes have to be executed.
* @param result Operation result.
*/
public Collection<ObjectDeltaOperation<? extends ObjectType>> executeChanges(Collection<ObjectDelta<? extends ObjectType>> deltas,
ModelExecuteOptions options, Task task, OperationResult result) {

return executeChangesSync(deltas, options, task, result);

}

private Collection<ObjectDeltaOperation<? extends ObjectType>> executeChangesSync(Collection<ObjectDelta<? extends ObjectType>> deltas, ModelExecuteOptions options, Task task, OperationResult result) {

try {
MidPointApplication application = MidPointApplication.get();

ModelService service = application.getModel();
Collection<ObjectDeltaOperation<? extends ObjectType>> executedDeltas = service.executeChanges(deltas, options, task, result);
result.computeStatusIfUnknown();
return executedDeltas;
} catch (CommonException | RuntimeException e) {
LoggingUtils.logUnexpectedException(LOGGER, "Error executing changes", e);
if (!result.isFatalError()) { // just to be sure the exception is recorded into the result
result.recordFatalError(e.getMessage(), e);
}
}
return null;
}


}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
<!--
~ Copyright (c) 2021 Evolveum
~
~ 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">
<body>
<wicket:extend>

<wicket:fragment wicket:id="templateView">
<div wicket:id="template"></div>
</wicket:fragment>
<wicket:child/>
</wicket:extend>
</body>
</html>

0 comments on commit 7340873

Please sign in to comment.