Skip to content

Commit

Permalink
support for opening links on new tab (supported for all main object l…
Browse files Browse the repository at this point in the history
…ists, e.g. users, roles, resources,... and supported also for audit log)
  • Loading branch information
katkav committed Aug 7, 2023
1 parent 42c0b63 commit 24bce12
Show file tree
Hide file tree
Showing 23 changed files with 350 additions and 196 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
*/
package com.evolveum.midpoint.gui.api.component;

import java.io.Serial;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
Expand All @@ -25,9 +26,11 @@
import org.jetbrains.annotations.NotNull;

import com.evolveum.midpoint.gui.api.GuiStyleConstants;
import com.evolveum.midpoint.gui.api.component.data.provider.ISelectableDataProvider;
import com.evolveum.midpoint.gui.api.model.LoadableModel;
import com.evolveum.midpoint.gui.api.page.PageBase;
import com.evolveum.midpoint.gui.api.util.GuiDisplayTypeUtil;
import com.evolveum.midpoint.gui.api.util.LocalizationUtil;
import com.evolveum.midpoint.gui.api.util.WebComponentUtil;
import com.evolveum.midpoint.gui.impl.component.AjaxCompositedIconButton;
import com.evolveum.midpoint.gui.impl.component.icon.CompositedIcon;
Expand All @@ -42,8 +45,6 @@
import com.evolveum.midpoint.model.api.authentication.CompiledObjectCollectionView;
import com.evolveum.midpoint.prism.delta.ChangeType;
import com.evolveum.midpoint.prism.delta.ObjectDelta;
import com.evolveum.midpoint.schema.GetOperationOptions;
import com.evolveum.midpoint.schema.SelectorOptions;
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.security.api.AuthorizationConstants;
import com.evolveum.midpoint.task.api.Task;
Expand All @@ -56,9 +57,9 @@
import com.evolveum.midpoint.web.component.AjaxIconButton;
import com.evolveum.midpoint.web.component.CompositedIconButtonDto;
import com.evolveum.midpoint.web.component.MultiFunctinalButtonDto;
import com.evolveum.midpoint.gui.api.component.data.provider.ISelectableDataProvider;
import com.evolveum.midpoint.web.component.data.column.CheckBoxHeaderColumn;
import com.evolveum.midpoint.web.component.data.column.ColumnMenuAction;
import com.evolveum.midpoint.web.component.data.column.ObjectNameColumn;
import com.evolveum.midpoint.web.component.menu.cog.InlineMenuItem;
import com.evolveum.midpoint.web.component.menu.cog.InlineMenuItemAction;
import com.evolveum.midpoint.web.component.util.SelectableBean;
Expand All @@ -72,16 +73,16 @@
* @author katkav
*/
public abstract class MainObjectListPanel<O extends ObjectType> extends ObjectListPanel<O> {
private static final long serialVersionUID = 1L;
@Serial private static final long serialVersionUID = 1L;

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

private static final String DOT_CLASS = MainObjectListPanel.class.getName() + ".";
private static final String OPERATION_DELETE_OBJECTS = DOT_CLASS + "deleteObjects";
private static final String OPERATION_DELETE_OBJECT = DOT_CLASS + "deleteObject";

private LoadableModel<ExecuteChangeOptionsDto> executeOptionsModel;
private final LoadableModel<ExecuteChangeOptionsDto> executeOptionsModel;

public MainObjectListPanel(String id, Class<O> type) {
super(id, type);
executeOptionsModel = new LoadableModel<>(false) {
Expand Down Expand Up @@ -130,6 +131,29 @@ protected void newObjectPerformed(AjaxRequestTarget target, AssignmentObjectRela
}
}

@Override
protected IColumn<SelectableBean<O>, String> createNameColumn(IModel<String> displayModel, GuiObjectColumnType customColumn, ExpressionType expression) {
return new ObjectNameColumn<>(displayModel == null ? createStringResource("ObjectType.name") : displayModel,
customColumn, expression, getPageBase()) {
@Serial private static final long serialVersionUID = 1L;

@Override
public void onClick(IModel<SelectableBean<O>> rowModel) {
O object = rowModel.getObject().getValue();
MainObjectListPanel.this.objectDetailsPerformed(object);
}

@Override
public boolean isClickable(IModel<SelectableBean<O>> rowModel) {
return MainObjectListPanel.this.isObjectDetailsEnabled(rowModel);
}
};
}

protected boolean isObjectDetailsEnabled(IModel<SelectableBean<O>> rowModel) {
return true;
}

protected List<ObjectReferenceType> getNewObjectReferencesList(CompiledObjectCollectionView collectionView, AssignmentObjectRelation relation) {
return ObjectCollectionViewUtil.getArchetypeReferencesList(collectionView);
}
Expand All @@ -142,8 +166,7 @@ private CompositedIcon createCompositedIcon(CompiledObjectCollectionView collect

builder.setBasicIcon(GuiDisplayTypeUtil.getIconCssClass(display), IconCssStyle.IN_ROW_STYLE)
.appendColorHtmlValue(GuiDisplayTypeUtil.getIconColor(display))
.setTitle(WebComponentUtil.getTranslatedPolyString(tooltip));
// .appendLayerIcon(WebComponentUtil.createIconType(GuiStyleConstants.CLASS_PLUS_CIRCLE, "green"), IconCssStyle.BOTTOM_RIGHT_STYLE);
.setTitle(LocalizationUtil.translatePolyString(tooltip));

return builder.build();
}
Expand All @@ -158,7 +181,6 @@ protected List<Component> createToolbarButtonsList(String buttonId) {
List<Component> buttonsList = new ArrayList<>();

buttonsList.add(createNewObjectButton(buttonId));
// buttonsList.add(createCreateNewObjectButton(buttonId));
buttonsList.add(createImportObjectButton(buttonId));
buttonsList.add(createDownloadButton(buttonId));
buttonsList.add(createCreateReportButton(buttonId));
Expand All @@ -185,7 +207,7 @@ private Component createNewObjectButton(String buttonId) {
AjaxCompositedIconButton createNewObjectButton = new AjaxCompositedIconButton(buttonId, builder.build(),
createStringResource(StringUtils.isEmpty(iconTitle) ? "MainObjectListPanel.newObject" : iconTitle)) {

private static final long serialVersionUID = 1L;
@Serial private static final long serialVersionUID = 1L;

@Override
public void onClick(AjaxRequestTarget target) {
Expand All @@ -204,7 +226,7 @@ public void onClick(AjaxRequestTarget target) {
}

NewObjectCreationPopup buttonsPanel = new NewObjectCreationPopup(getPageBase().getMainPopupBodyId(), new PropertyModel<>(loadButtonDescriptions(), MultiFunctinalButtonDto.F_ADDITIONAL_BUTTONS)) {
private static final long serialVersionUID = 1L;
@Serial private static final long serialVersionUID = 1L;

@Override
protected void buttonClickPerformed(AjaxRequestTarget target, AssignmentObjectRelation relationSpec, CompiledObjectCollectionView collectionViews, Class<? extends WebPage> page) {
Expand All @@ -227,7 +249,7 @@ protected boolean isCollectionViewWithoutMorePossibleNewType(CompiledObjectColle
}

protected boolean showNewObjectCreationPopup() {
return getNewObjectInfluencesList() != null && getNewObjectInfluencesList().size() > 1;
return getNewObjectInfluencesList().size() > 1;
}

protected boolean isViewForObjectCollectionType(CompiledObjectCollectionView collectionView, String oid, QName type) {
Expand Down Expand Up @@ -301,7 +323,7 @@ private AjaxIconButton createImportObjectButton(String buttonId) {
AjaxIconButton importObject = new AjaxIconButton(buttonId, new Model<>(GuiStyleConstants.CLASS_UPLOAD),
createStringResource("MainObjectListPanel.import")) {

private static final long serialVersionUID = 1L;
@Serial private static final long serialVersionUID = 1L;

@Override
public void onClick(AjaxRequestTarget target) {
Expand Down Expand Up @@ -335,7 +357,7 @@ private AjaxCompositedIconButton createCreateReportButton(String buttonId) {
AjaxCompositedIconButton createReport = new AjaxCompositedIconButton(buttonId, builder.build(),
getPageBase().createStringResource("MainObjectListPanel.createReport")) {

private static final long serialVersionUID = 1L;
@Serial private static final long serialVersionUID = 1L;

@Override
public void onClick(AjaxRequestTarget target) {
Expand All @@ -351,7 +373,7 @@ private AjaxIconButton createRefreshButton(String buttonId) {
AjaxIconButton refreshIcon = new AjaxIconButton(buttonId, new Model<>(GuiStyleConstants.CLASS_RECONCILE),
createStringResource("MainObjectListPanel.refresh")) {

private static final long serialVersionUID = 1L;
@Serial private static final long serialVersionUID = 1L;

@Override
public void onClick(AjaxRequestTarget target) {
Expand All @@ -369,7 +391,7 @@ private AjaxIconButton createPlayPauseButton(String buttonId) {
AjaxIconButton playPauseIcon = new AjaxIconButton(buttonId, getRefreshPausePlayButtonModel(),
getRefreshPausePlayButtonTitleModel()) {

private static final long serialVersionUID = 1L;
@Serial private static final long serialVersionUID = 1L;

@Override
public void onClick(AjaxRequestTarget target) {
Expand Down Expand Up @@ -413,16 +435,15 @@ protected boolean isCreateNewObjectVisible() {
CollectionUtils.isNotEmpty(getNewObjectInfluencesList());
}

@NotNull
protected List<CompiledObjectCollectionView> getNewObjectInfluencesList() {
@NotNull protected List<CompiledObjectCollectionView> getNewObjectInfluencesList() {
if (isCollectionViewPanelForCompiledView()) {
return new ArrayList<>();
}
return getAllApplicableArchetypeViews();
}

public void deleteConfirmedPerformed(AjaxRequestTarget target, IModel<SelectableBean<O>> objectToDelete) {
List<SelectableBean<O>> objects = isAnythingSelected(target, objectToDelete);
List<SelectableBean<O>> objects = isAnythingSelected(objectToDelete);

if (objects.isEmpty()) {
return;
Expand Down Expand Up @@ -465,10 +486,8 @@ public ExecuteChangeOptionsDto getExecuteOptions() {
/**
* This method check selection in table. If selectedObject != null than it
* returns only this object.
*
* @return
*/
public List<SelectableBean<O>> isAnythingSelected(AjaxRequestTarget target, IModel<SelectableBean<O>> selectedObject) {
public List<SelectableBean<O>> isAnythingSelected(IModel<SelectableBean<O>> selectedObject) {
List<SelectableBean<O>> selectedObjects;
if (selectedObject != null) {
selectedObjects = new ArrayList<>();
Expand Down Expand Up @@ -503,7 +522,7 @@ protected String getConfirmMessageKeyForSingleObject() {

public InlineMenuItem createDeleteInlineMenu() {
return new InlineMenuItem(createStringResource("MainObjectListPanel.menu.delete")) {
private static final long serialVersionUID = 1L;
@Serial private static final long serialVersionUID = 1L;

@Override
public InlineMenuItemAction initAction() {
Expand All @@ -523,8 +542,7 @@ public IModel<String> getConfirmationMessageModel() {
};
}

@Override
protected void objectDetailsPerformed(AjaxRequestTarget target, O object) {
protected void objectDetailsPerformed(O object) {
if (WebComponentUtil.hasDetailsPage(object.getClass())) {
WebComponentUtil.dispatchToObjectDetailsPage(object.getClass(), object.getOid(), this, true);
} else {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,45 +6,45 @@
*/
package com.evolveum.midpoint.gui.api.component;

import java.io.Serial;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.function.Supplier;
import java.util.stream.Collectors;

import com.evolveum.midpoint.schema.GetOperationOptions;
import com.evolveum.midpoint.schema.SelectorOptions;

import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn;
import org.apache.wicket.extensions.markup.html.repeater.util.SortParam;
import org.apache.wicket.model.IModel;
import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.apache.wicket.util.string.StringValue;
import org.jetbrains.annotations.NotNull;

import com.evolveum.midpoint.gui.api.page.PageBase;
import com.evolveum.midpoint.gui.api.util.WebComponentUtil;
import com.evolveum.midpoint.gui.impl.component.ContainerableListPanel;
import com.evolveum.midpoint.gui.impl.component.data.provider.SelectableBeanObjectDataProvider;
import com.evolveum.midpoint.model.api.authentication.CompiledObjectCollectionView;
import com.evolveum.midpoint.prism.query.ObjectOrdering;
import com.evolveum.midpoint.prism.query.ObjectQuery;
import com.evolveum.midpoint.gui.impl.component.data.provider.SelectableBeanObjectDataProvider;
import com.evolveum.midpoint.schema.GetOperationOptions;
import com.evolveum.midpoint.schema.SelectorOptions;
import com.evolveum.midpoint.web.component.data.column.ColumnUtils;
import com.evolveum.midpoint.web.component.data.column.ObjectNameColumn;
import com.evolveum.midpoint.web.component.menu.cog.InlineMenuItem;
import com.evolveum.midpoint.web.component.util.SelectableBean;
import com.evolveum.midpoint.web.component.util.SerializableFunction;
import com.evolveum.midpoint.web.component.util.SerializableSupplier;
import com.evolveum.midpoint.web.session.PageStorage;
import com.evolveum.midpoint.xml.ns._public.common.common_3.*;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ContainerPanelConfigurationType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.OperationTypeType;

/**
* @author katkav
*/
public abstract class ObjectListPanel<O extends ObjectType> extends ContainerableListPanel<O, SelectableBean<O>> {
private static final long serialVersionUID = 1L;
@Serial private static final long serialVersionUID = 1L;

private static final String DOT_CLASS = ObjectListPanel.class.getName() + ".";
private static final String OPERATION_LOAD_CUSTOM_MENU_ITEMS = DOT_CLASS + "loadCustomMenuItems";
Expand Down Expand Up @@ -85,7 +85,7 @@ protected final SelectableBeanObjectDataProvider<O> createSelectableBeanObjectDa
Collection<SelectorOptions<GetOperationOptions>> options) {
SelectableBeanObjectDataProvider<O> provider = new SelectableBeanObjectDataProvider<>(
getPageBase(), getSearchModel(), null) {
private static final long serialVersionUID = 1L;
@Serial private static final long serialVersionUID = 1L;

@Override
protected PageStorage getPageStorage() {
Expand Down Expand Up @@ -123,10 +123,6 @@ protected List<CompiledObjectCollectionView> getAllApplicableArchetypeViews() {
return getPageBase().getCompiledGuiProfile().findAllApplicableArchetypeViews(WebComponentUtil.classToQName(getPageBase().getPrismContext(), getType()), OperationTypeType.ADD);
}

public void clearCache() {
WebComponentUtil.clearProviderCache(getDataProvider());
}

protected void addCustomActions(@NotNull List<InlineMenuItem> actionsList, SerializableSupplier<Collection<? extends O>> objectsSupplier) {
CompiledObjectCollectionView guiObjectListViewType = getObjectCollectionView();
if (guiObjectListViewType != null && !guiObjectListViewType.getActions().isEmpty()) {
Expand All @@ -135,40 +131,11 @@ protected void addCustomActions(@NotNull List<InlineMenuItem> actionsList, Seria
}
}

public void addPerformed(AjaxRequestTarget target, List<O> selected) {
getPageBase().hideMainPopup(target);
}

@Override
protected boolean notContainsNameColumn(@NotNull List<IColumn<SelectableBean<O>, String>> columns) {
return columns.stream().noneMatch(c -> c instanceof ObjectNameColumn);
}

@Override
protected IColumn<SelectableBean<O>, String> createNameColumn(IModel<String> displayModel, GuiObjectColumnType customColumn, ExpressionType expression) {
return new ObjectNameColumn<>(displayModel == null ? createStringResource("ObjectType.name") : displayModel,
customColumn, expression, getPageBase()) {
private static final long serialVersionUID = 1L;

@Override
public void onClick(AjaxRequestTarget target, IModel<SelectableBean<O>> rowModel) {
O object = rowModel.getObject().getValue();
ObjectListPanel.this.objectDetailsPerformed(target, object);
}

@Override
public boolean isClickable(IModel<SelectableBean<O>> rowModel) {
return ObjectListPanel.this.isObjectDetailsEnabled(rowModel);
}
};
}

protected boolean isObjectDetailsEnabled(IModel<SelectableBean<O>> rowModel) {
return true;
}

protected void objectDetailsPerformed(AjaxRequestTarget target, O object) {
}
@Override
protected IColumn<SelectableBean<O>, String> createIconColumn() {
return ColumnUtils.createIconColumn(getPageBase());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,14 @@
import com.evolveum.midpoint.gui.api.component.data.provider.ISelectableDataProvider;

import com.evolveum.midpoint.web.component.data.SelectableDataTable;
import com.evolveum.midpoint.web.component.data.column.SelectableObjectNameColumn;
import com.evolveum.midpoint.web.session.ObjectListStorage;

import com.evolveum.midpoint.web.session.PageStorage;

import com.evolveum.midpoint.xml.ns._public.common.common_3.ExpressionType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.GuiObjectColumnType;

import org.apache.commons.collections4.CollectionUtils;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.extensions.markup.html.repeater.data.grid.ICellPopulator;
Expand Down Expand Up @@ -99,16 +103,24 @@ protected final ISelectableDataProvider<SelectableBean<O>> createProvider() {
protected abstract ObjectQuery getCustomizeContentQuery();

@Override
protected void objectDetailsPerformed(AjaxRequestTarget target, O object) {
onSelectPerformed(target, object);
}
protected IColumn<SelectableBean<O>, String> createNameColumn(IModel<String> displayModel, GuiObjectColumnType customColumn, ExpressionType expression) {
return new SelectableObjectNameColumn<>(displayModel == null ? createStringResource("ObjectType.name") : displayModel,
customColumn, expression, getPageBase()) {
private static final long serialVersionUID = 1L;

@Override
public void onClick(AjaxRequestTarget target, IModel<SelectableBean<O>> rowModel) {
O object = rowModel.getObject().getValue();
PopupObjectListPanel.this.onSelectPerformed(target, object);
}

@Override
protected boolean isObjectDetailsEnabled(IModel<SelectableBean<O>> rowModel) {
return !isMultiselect();
@Override
public boolean isClickable(IModel<SelectableBean<O>> rowModel) {
return !PopupObjectListPanel.this.isMultiselect();
}
};
}


@Override
protected List<IColumn<SelectableBean<O>, String>> createDefaultColumns() {
return new ArrayList<>(ColumnUtils.getDefaultColumns(getType(), getPageBase()));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn;
import org.apache.wicket.model.StringResourceModel;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import com.evolveum.midpoint.gui.api.GuiStyleConstants;
Expand Down Expand Up @@ -124,7 +125,7 @@ protected List<IColumn<SelectableBean<TaskType>, String>> createDefaultColumns()
}

@Override
protected List<CompiledObjectCollectionView> getNewObjectInfluencesList() {
protected @NotNull List<CompiledObjectCollectionView> getNewObjectInfluencesList() {
List<CompiledObjectCollectionView> newObjectInfluencesList = super.getNewObjectInfluencesList();
List<CompiledObjectCollectionView> filteredInfluencesList = new ArrayList<>();
if (newObjectInfluencesList != null) {
Expand Down

0 comments on commit 24bce12

Please sign in to comment.