Skip to content

Commit

Permalink
Merge branch 'master' into tmp/db-schema-change-in-46rc1
Browse files Browse the repository at this point in the history
  • Loading branch information
virgo47 committed Sep 13, 2022
2 parents 24eed53 + 5106721 commit e75dc84
Show file tree
Hide file tree
Showing 30 changed files with 892 additions and 261 deletions.
9 changes: 9 additions & 0 deletions gui/admin-gui/src/frontend/scss/_tiles.scss
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,15 @@
position: relative;
top: -20px;
left: 32px;
margin-bottom: -20px;

&.rounded-icon-none {
margin-bottom: 0;
}
}

& > .title {
word-break: break-all;
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,6 @@ protected List<IColumn<SelectableBean<O>, String>> createDefaultColumns() {

@Override
protected void onUpdateCheckbox(AjaxRequestTarget target, List<IModel<SelectableBean<O>>> rowModelList, DataTable table) {
updatePreselectedObjects(rowModelList);
onSelectionPerformed(target, rowModelList, table);
}

Expand Down Expand Up @@ -153,21 +152,6 @@ protected <T extends ObjectType> PopupObjectListPanel<T> getObjectListPanel() {
protected void onSelectionPerformed(AjaxRequestTarget target, List<IModel<SelectableBean<O>>> rowModelList, DataTable dataTable) {
}

private void updatePreselectedObjects(List<IModel<SelectableBean<O>>> rowModelList) {
if (CollectionUtils.isEmpty(rowModelList)) {
return;
}
rowModelList.forEach(rowModel -> {
SelectableBean<O> selectableBean = rowModel.getObject();
O selectedObject = selectableBean.getValue();
if (selectableBean.isSelected()) {
preselectedObjects.add(selectedObject);
} else {
preselectedObjects.removeIf(o -> selectedObject.getOid().equals(o.getOid()));
}
});
}

protected IModel<Boolean> getObjectSelectCheckBoxEnableModel(IModel<SelectableBean<O>> rowModel) {
return Model.of(true);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,12 +22,15 @@
import com.evolveum.midpoint.gui.impl.component.search.SearchFactory;
import com.evolveum.midpoint.gui.impl.component.search.AbstractSearchItemWrapper;
import com.evolveum.midpoint.gui.impl.component.search.Search;
import com.evolveum.midpoint.web.component.util.SelectableBean;
import com.evolveum.midpoint.web.component.util.SerializableSupplier;
import com.evolveum.midpoint.web.component.util.VisibleBehaviour;

import org.apache.commons.collections4.CollectionUtils;
import org.apache.wicket.Component;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.form.OnChangeAjaxBehavior;
import org.apache.wicket.extensions.markup.html.repeater.data.table.DataTable;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.form.DropDownChoice;
import org.apache.wicket.markup.html.form.EnumChoiceRenderer;
Expand Down Expand Up @@ -239,6 +242,11 @@ protected List<O> getPreselectedObjectList() {
return selectedObjectsList;
}

@Override
public List<O> getSelectedRealObjects() {
return getPreselectedObjectList();
}

@Override
protected Search createSearch(Class<O> type) {
String collectionName = isCollectionViewPanelForCompiledView() ?
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@

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

import org.apache.commons.collections4.CollectionUtils;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.extensions.markup.html.repeater.data.table.DataTable;
import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn;
Expand Down Expand Up @@ -65,12 +66,14 @@ protected IColumn<SelectableBean<O>, String> createCheckboxColumn() {
@Override
protected void onUpdateRow(AjaxRequestTarget target, DataTable table, IModel<SelectableBean<O>> rowModel, IModel<Boolean> selected) {
super.onUpdateRow(target, table, rowModel, selected);
updatePreselectedObjects(Arrays.asList(rowModel));
onUpdateCheckbox(target, Arrays.asList(rowModel), table);
}

@Override
protected void onUpdateHeader(AjaxRequestTarget target, boolean selected, DataTable table) {
super.onUpdateHeader(target, selected, table);
updatePreselectedObjects(TableUtil.getAvailableData(table));
onUpdateCheckbox(target, TableUtil.getAvailableData(table), table);
}

Expand Down Expand Up @@ -130,6 +133,22 @@ protected String getStorageKey() {
return null;
}

protected void updatePreselectedObjects(List<IModel<SelectableBean<O>>> rowModelList) {
if (CollectionUtils.isEmpty(rowModelList)) {
return;
}
rowModelList.forEach(rowModel -> {
SelectableBean<O> selectableBean = rowModel.getObject();
O selectedObject = selectableBean.getValue();
List<O> preselectedObjects = getPreselectedObjectList();
if (selectableBean.isSelected()) {
preselectedObjects.add(selectedObject);
} else {
preselectedObjects.removeIf(o -> selectedObject.getOid().equals(o.getOid()));
}
});
}

@Override
public PageStorage getPageStorage() {
if (storage == null) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -977,28 +977,6 @@ public void onClick(AjaxRequestTarget target) {

protected void viewAllActionPerformed(AjaxRequestTarget target) {
WebComponentUtil.redirectFromDashboardWidget(config, getPageBase(), ContainerableListPanel.this);
// FocusType principal = getPageBase().getPrincipalFocus();
// String widgetPanelType = config != null ? config.getPanelType() : null;
// QName principalFocusType = WebComponentUtil.classToQName(PrismContext.get(), principal.getClass());
// if (widgetPanelType != null) {
// ContainerPanelConfigurationType panelConfig = getPageBase().getCompiledGuiProfile().findPrincipalFocusDetailsPanel(
// principalFocusType, widgetPanelType);
// if (panelConfig != null) {
// ObjectDetailsStorage pageStorage = getPageBase().getSessionStorage().getObjectDetailsStorage(getStorageKey());
// if (pageStorage == null) {
// getPageBase().getSessionStorage().setObjectDetailsStorage(getStorageKey(), panelConfig);
// } else {
// pageStorage.setDefaultConfiguration(panelConfig);
// }
// WebComponentUtil.dispatchToObjectDetailsPage(principal.asPrismObject(), ContainerableListPanel.this);
// return;
// }
// }
//
// CompiledObjectCollectionView view = getObjectCollectionView();
// if (view != null) {
// WebComponentUtil.dispatchToListPage(getType(), view.getViewIdentifier(), ContainerableListPanel.this, false);
// }
}

protected String getStorageKey() {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
<!--
~ Copyright (c) 2010-2022 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">
<wicket:panel>
<div class="w-100">
<select wicket:id="select" class="form-control form-control-sm" style="width: 101%;"/>
</div>
</wicket:panel>
</html>
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
/*
* Copyright (c) 2010-2022 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.input;

import com.evolveum.midpoint.web.component.prism.InputPanel;

import com.evolveum.midpoint.web.page.admin.configuration.component.EmptyOnChangeAjaxFormUpdatingBehavior;

import org.apache.wicket.markup.html.form.FormComponent;
import org.apache.wicket.model.IModel;
import org.wicketstuff.select2.ChoiceProvider;
import org.wicketstuff.select2.Select2MultiChoice;

import java.util.Collection;

public class Select2MultiChoicePanel<T> extends InputPanel {

private static final long serialVersionUID = 1L;
private static final String ID_SELECT = "select";

private final IModel<Collection<T>> model;
private final ChoiceProvider<T> provider;

public Select2MultiChoicePanel(String id, IModel<Collection<T>> model, ChoiceProvider<T> provider) {
super(id);
this.model = model;
this.provider = provider;
}

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

private void initLayout() {
Select2MultiChoice<T> multiselect = new Select2MultiChoice<>(ID_SELECT, model, provider);
multiselect.getSettings()
.setMinimumInputLength(2);
multiselect.add(new EmptyOnChangeAjaxFormUpdatingBehavior());
add(multiselect);
}

@Override
public FormComponent getBaseFormComponent() {
return (Select2MultiChoice) get(ID_SELECT);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,161 @@
/*
* Copyright (c) 2010-2022 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.input;

import com.evolveum.midpoint.gui.api.prism.wrapper.ItemWrapper;
import com.evolveum.midpoint.gui.api.prism.wrapper.PrismContainerValueWrapper;
import com.evolveum.midpoint.gui.api.prism.wrapper.PrismPropertyWrapper;
import com.evolveum.midpoint.gui.impl.factory.panel.SourceOrTargetOfMappingPanelFactory;
import com.evolveum.midpoint.gui.impl.util.GuiDisplayNameUtil;
import com.evolveum.midpoint.prism.*;
import com.evolveum.midpoint.prism.path.ItemPath;
import com.evolveum.midpoint.schema.constants.ExpressionConstants;
import com.evolveum.midpoint.xml.ns._public.common.common_3.*;

import org.apache.commons.lang3.StringUtils;
import org.apache.wicket.model.IModel;
import org.wicketstuff.select2.ChoiceProvider;
import org.wicketstuff.select2.Response;

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

public class SourceMappingProvider extends ChoiceProvider<VariableBindingDefinitionType> {

private static final long serialVersionUID = 1L;

private final IModel<PrismPropertyWrapper<VariableBindingDefinitionType>> rowModel;

public <IW extends ItemWrapper> SourceMappingProvider(IModel<PrismPropertyWrapper<VariableBindingDefinitionType>> rowModel) {
this.rowModel = rowModel;
}

@Override
public String getDisplayValue(VariableBindingDefinitionType value) {
return getIdValue(value);
}

@Override
public String getIdValue(VariableBindingDefinitionType value) {
return GuiDisplayNameUtil.getDisplayName(value);
}

@Override
public void query(String text, int page, Response<VariableBindingDefinitionType> response) {

List<String> choices = collectAvailableDefinitions(text);

response.addAll(toChoices(choices));
}

@Override
public Collection<VariableBindingDefinitionType> toChoices(Collection<String> values) {
return values.stream()
.map(value -> new VariableBindingDefinitionType()
.path(PrismContext.get().itemPathParser().asItemPathType(
"$" + ExpressionConstants.VAR_FOCUS + "/" + value
)))
.collect(Collectors.toList());
}

public List<String> collectAvailableDefinitions(String input) {

PrismPropertyWrapper<VariableBindingDefinitionType> wrapper = rowModel.getObject();

ResourceObjectTypeDefinitionType resourceObjectType = getResourceObjectType(wrapper);

ComplexTypeDefinition resourceDef =
PrismContext.get().getSchemaRegistry().findComplexTypeDefinitionByType(ResourceType.COMPLEX_TYPE);

PrismPropertyDefinition<QName> typeDef = resourceDef.findPropertyDefinition(ItemPath.create(
ResourceType.F_SCHEMA_HANDLING,
SchemaHandlingType.F_OBJECT_TYPE,
ResourceObjectTypeDefinitionType.F_FOCUS,
ResourceObjectFocusSpecificationType.F_TYPE));

QName type = typeDef.defaultValue();

if (resourceObjectType != null
&& resourceObjectType.getFocus() != null
&& resourceObjectType.getFocus().getType() != null) {
type = resourceObjectType.getFocus().getType();
}

if (type == null) {
type = UserType.COMPLEX_TYPE;
}

PrismObjectDefinition<Objectable> focusDef = PrismContext.get().getSchemaRegistry().findObjectDefinitionByType(type);

List<String> toSelect = new ArrayList<>();
if (StringUtils.isNotBlank(input) && input.lastIndexOf("/") == (input.length() - 1)) {
input = input.substring(0, input.length() - 1);
}
if (StringUtils.isNotBlank(input) && input.contains("/")) {
int lastIndexOfSeparator = input.lastIndexOf("/");
String superPath = input.substring(0, lastIndexOfSeparator);
String suffix = input.substring(lastIndexOfSeparator + 1);
ItemDefinition<?> superDef = focusDef.findItemDefinition(ItemPath.create(superPath.split("/")));
if (superDef != null && superDef instanceof PrismContainerDefinition) {
collectItems(((PrismContainerDefinition) superDef).getDefinitions(), suffix, toSelect, true);
return toSelect.stream().map(subPath -> superPath + "/" + subPath).collect(Collectors.toList());
}
} else {
collectItems(focusDef.getDefinitions(), input, toSelect, true);
}
return toSelect;
}

private static void collectItems(
Collection<? extends ItemDefinition> definitions,
String input,
List<String> toSelect,
boolean showContainers) {
if (definitions == null) {
return;
}

for (ItemDefinition<?> def : definitions) {
if (StringUtils.isNotBlank(input) && !def.getItemName().getLocalPart().startsWith(input)) {
continue;
}

if (def instanceof PrismContainerDefinition) {
if (!showContainers) {
toSelect.add(def.getItemName().getLocalPart());
continue;
}
List<String> subChoices = new ArrayList<>();
collectItems(((PrismContainerDefinition) def).getDefinitions(), "", subChoices, false);
subChoices.forEach(value -> toSelect.add(def.getItemName().getLocalPart() + "/" + value));
continue;
}

toSelect.add(def.getItemName().getLocalPart());
}
}

private static ResourceObjectTypeDefinitionType getResourceObjectType(PrismPropertyWrapper<VariableBindingDefinitionType> propertyWrapper) {

if (propertyWrapper != null
&& propertyWrapper.getParent() != null
&& propertyWrapper.getParent().getParent() != null
&& propertyWrapper.getParent().getParent().getParent() != null
&& propertyWrapper.getParent().getParent().getParent().getParent() != null) {
PrismContainerValueWrapper containerValue = propertyWrapper.getParent().getParent().getParent().getParent().getParent();

if (containerValue != null && containerValue.getRealValue() instanceof ResourceObjectTypeDefinitionType) {
return (ResourceObjectTypeDefinitionType) containerValue.getRealValue();
}
}
return null;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,11 @@ public void setValue(DisplayableValue<T> value) {
}

public boolean isApplyFilter(SearchBoxModeType searchBoxMode) {
return applyFilter && isVisible();
return applyPredefinedFilter() || isVisible();
}

private boolean applyPredefinedFilter() {
return getPredefinedFilter() != null && applyFilter;
}

public void setApplyFilter(boolean applyFilter) {
Expand Down

0 comments on commit e75dc84

Please sign in to comment.