Skip to content

Commit

Permalink
MID-9348: adding support for duplicate of items in table
Browse files Browse the repository at this point in the history
  • Loading branch information
skublik committed Feb 12, 2024
1 parent ac248f9 commit 689d8f1
Show file tree
Hide file tree
Showing 44 changed files with 809 additions and 253 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
import java.util.List;
import javax.xml.namespace.QName;

import com.evolveum.midpoint.gui.impl.duplication.DuplicationProcessHelper;
import com.evolveum.midpoint.gui.impl.util.DetailsPageUtil;
import com.evolveum.midpoint.gui.impl.util.IconAndStylesUtil;
import org.apache.commons.collections4.CollectionUtils;
Expand Down Expand Up @@ -522,6 +523,22 @@ protected String getConfirmMessageKeyForSingleObject() {
throw new UnsupportedOperationException("getConfirmMessageKeyForSingleObject() not implemented for " + getClass());
}

@Override
protected void addBasicActions(List<InlineMenuItem> menuItems) {
if (!isDuplicationSupported()) {
return;
}

DuplicationProcessHelper.addDuplicationActionForObject(menuItems, getPageBase());
}

/**
* Define whether duplication action for item of table will be added to item menu.
*/
protected boolean isDuplicationSupported() {
return isCreateNewObjectVisible();
}

public InlineMenuItem createDeleteInlineMenu() {
return new InlineMenuItem(createStringResource("MainObjectListPanel.menu.delete")) {
@Serial private static final long serialVersionUID = 1L;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,4 @@ default <C extends Containerable> boolean match(ItemDefinition<?> def, PrismCont

int getOrder();

// T createBuilder();
//
// Class<T> getBuilderClass();
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,13 @@
import com.evolveum.midpoint.gui.api.factory.wrapper.PrismObjectWrapperFactory;
import com.evolveum.midpoint.gui.api.prism.wrapper.ItemWrapper;
import com.evolveum.midpoint.gui.api.prism.wrapper.PrismValueWrapper;
import com.evolveum.midpoint.gui.impl.duplication.ContainerableDuplicateResolver;
import com.evolveum.midpoint.gui.impl.factory.panel.ItemPanelContext;
import com.evolveum.midpoint.prism.*;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType;

import org.jetbrains.annotations.Nullable;

public interface GuiComponentRegistry extends Serializable {

void addToRegistry(GuiComponentFactory<?> factory);
Expand All @@ -37,4 +40,20 @@ public interface GuiComponentRegistry extends Serializable {
<O extends ObjectType> PrismObjectWrapperFactory<O> getObjectWrapperFactory(PrismObjectDefinition<O> objectDef);

void addToRegistry(ItemWrapperFactory factory);

/**
* Method for register of resolver for duplication object or container.
*/
void addToRegistry(ContainerableDuplicateResolver<?> resolver);

/**
* Find duplicate resolver by definition of duplicated item and its parent.
*/
<C extends Containerable, P extends Containerable> ContainerableDuplicateResolver<C> findContainerableDuplicateResolver(
PrismContainerDefinition<C> def, @Nullable PrismContainerValue<P> parent);

/**
* Find duplicate resolver by definition of duplicated item.
*/
<C extends Containerable> ContainerableDuplicateResolver<C> findContainerableDuplicateResolver(PrismContainerDefinition<C> def);
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@
package com.evolveum.midpoint.gui.impl.component;

import com.evolveum.midpoint.gui.api.prism.wrapper.PrismContainerValueWrapper;
import com.evolveum.midpoint.gui.api.util.WebComponentUtil;
import com.evolveum.midpoint.gui.api.util.GuiDisplayTypeUtil;
import com.evolveum.midpoint.gui.impl.component.icon.CompositedIconBuilder;
import com.evolveum.midpoint.gui.impl.component.icon.IconCssStyle;
Expand Down Expand Up @@ -90,9 +89,12 @@ protected List<InlineMenuItem> createInlineMenu() {
}

@Override
protected void newItemPerformed(AjaxRequestTarget target, AssignmentObjectRelation relationSepc) {
PrismContainerValue<C> newParameter = getContainerModel().getObject().getItem().createNewValue();
createNewItemContainerValueWrapper(newParameter, getContainerModel().getObject(), target);
protected void newItemPerformed(PrismContainerValue<C> value, AjaxRequestTarget target, AssignmentObjectRelation relationSepc) {
PrismContainerValue<C> newValue = value;
if (newValue == null) {
newValue = getContainerModel().getObject().getItem().createNewValue();
}
createNewItemContainerValueWrapper(newValue, getContainerModel().getObject(), target);
refreshTable(target);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -442,6 +442,7 @@ private List<IColumn<PO, String>> createColumns() {
if (menuItems == null) {
menuItems = new ArrayList<>();
}
addBasicActions(menuItems);
addCustomActions(menuItems, this::getSelectedRealObjects);

if (!menuItems.isEmpty()) {
Expand All @@ -462,6 +463,13 @@ protected boolean isButtonMenuItemEnabled(IModel<PO> rowModel) {
return columns;
}

/**
* Method define basic menu action that is default for all subclasses
* and will be added on end of menu items list.
*/
protected void addBasicActions(List<InlineMenuItem> menuItems) {
}

protected String getInlineMenuCssClass() {
return "inline-menu-column ";
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,12 @@
package com.evolveum.midpoint.gui.impl.component;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

import com.evolveum.midpoint.gui.impl.duplication.DuplicationProcessHelper;

import org.apache.wicket.Component;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.behavior.AttributeAppender;
Expand Down Expand Up @@ -109,7 +112,19 @@ protected String getKeyOfTitleForNewObjectButton() {
return "MainObjectListPanel.newObject";
}

protected void newItemPerformed(AjaxRequestTarget target, AssignmentObjectRelation relationSepc) {
/**
* Basic method for creating new value for multivalue container.
*/
protected final void newItemPerformed(AjaxRequestTarget target, AssignmentObjectRelation relationSepc) {
newItemPerformed(null, target, relationSepc);
}

/**
* This method create new value wrapper for multivalue container wrapper,
* but in new wrapper use prism value in parameter 'value'.
* This method is usefully for duplication.
*/
protected void newItemPerformed(PrismContainerValue<C> value, AjaxRequestTarget target, AssignmentObjectRelation relationSepc) {

}

Expand Down Expand Up @@ -267,4 +282,22 @@ protected IColumn<PrismContainerValueWrapper<C>, String> createCheckboxColumn()
public List<C> getSelectedRealObjects() {
return getSelectedObjects().stream().map(o -> o.getRealValue()).collect(Collectors.toList());
}

@Override
protected void addBasicActions(List<InlineMenuItem> menuItems) {
if (!isDuplicationSupported()) {
return;
}
DuplicationProcessHelper.addDuplicationActionForContainer(
menuItems,
(value, target) -> newItemPerformed((PrismContainerValue<C>) value, target, null),
getPageBase());
}

/**
* Define whether duplication action for item of table will be added to item menu.
*/
protected boolean isDuplicationSupported() {
return isCreateNewObjectVisible();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -189,10 +189,13 @@ protected List<PrismContainerValueWrapper<C>> getDetailsPanelItemsList() {
}

@Override
protected void newItemPerformed(AjaxRequestTarget target, AssignmentObjectRelation relationSepc) {
protected void newItemPerformed(PrismContainerValue<C> value, AjaxRequestTarget target, AssignmentObjectRelation relationSepc) {
PrismContainerWrapper<C> container = getContainerModel().getObject();
PrismContainerValue<C> newObjectPolicy = container.getItem().createNewValue();
PrismContainerValueWrapper<C> newObjectPolicyWrapper = createNewItemContainerValueWrapper(newObjectPolicy, container, target);
PrismContainerValue<C> newValue = value;
if (newValue == null) {
newValue = container.getItem().createNewValue();
}
PrismContainerValueWrapper<C> newObjectPolicyWrapper = createNewItemContainerValueWrapper(newValue, container, target);
itemDetailsPerformed(target, Arrays.asList(newObjectPolicyWrapper));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -86,8 +86,6 @@
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 @@ -403,8 +401,7 @@ private MainMenuItem createRolesMenu() {
PageRoleAnalysis.class), 1);
roleMenu.addMenuItem(new MenuItem("PageRoleAnalysisSession.menu.title",
GuiStyleConstants.CLASS_PLUS_CIRCLE,
PageRoleAnalysisSession.class,
new PageParameters().add(PARAM_IS_WIZARD, true)));
PageRoleAnalysisSession.class));

return roleMenu;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,10 @@

import com.evolveum.midpoint.web.component.form.MidpointForm;

import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ResourceType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.RoleAnalysisSessionType;

import org.apache.wicket.Component;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.markup.html.form.Form;
Expand All @@ -34,12 +38,14 @@ public abstract class AbstractWizardPanel<C extends Containerable, AHD extends A
private static final String ID_WIZARD = "wizard";

private final WizardPanelHelper<C, AHD> helper;
private final boolean startWithChoiceTemplate;

public AbstractWizardPanel(
String id,
WizardPanelHelper<C, AHD> helper) {
super(id);
this.helper = helper;
startWithChoiceTemplate = nameOfObjectIsNotNull();
}

@Override
Expand All @@ -48,6 +54,13 @@ protected void onInitialize() {
initLayout();
}

/**
* Define if will be showed introductory selection some options.
*/
protected final boolean isStartWithChoiceTemplate() {
return startWithChoiceTemplate;
}

protected abstract void initLayout();

protected Fragment createChoiceFragment(Component choicePanel) {
Expand Down Expand Up @@ -109,4 +122,26 @@ protected OperationResult onSavePerformed(AjaxRequestTarget target) {
public WizardPanelHelper<C, AHD> getHelper() {
return helper;
}

private boolean nameOfObjectIsNotNull() {
if (getHelper().getValueModel() == null) {
return true;
}

PrismContainerValueWrapper<C> value = getHelper().getValueModel().getObject();
if (value == null) {
return true;
}

C bean = value.getRealValue();
if (!(bean instanceof ObjectType)) {
return true;
}

if (((ObjectType) bean).getName() == null) {
return true;
}

return false;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.evolveum.midpoint.gui.impl.duplication;

import com.evolveum.midpoint.gui.api.factory.wrapper.WrapperFactory;
import com.evolveum.midpoint.prism.Containerable;

/**
* Execute changes for duplicated containerable object.
* For example name 'Superuser' of original object will be changed to 'Copy of Superuser'.
*/
public interface ContainerableDuplicateResolver<C extends Containerable> extends WrapperFactory {

C duplicateObject(C originalObject);
}

0 comments on commit 689d8f1

Please sign in to comment.