Skip to content

Commit

Permalink
Merge branch 'master' of https://github.com/Evolveum/midpoint
Browse files Browse the repository at this point in the history
  • Loading branch information
katkav committed May 25, 2020
2 parents e7154af + 2b9be13 commit 65a5c5a
Show file tree
Hide file tree
Showing 7 changed files with 192 additions and 31 deletions.
Expand Up @@ -229,7 +229,8 @@ protected String getSearchByNameParameterValue() {
// }

protected Search createSearch() {
return SearchFactory.createSearch(type.getClassDefinition(), getPageBase());
return SearchFactory.createSearch(type.getClassDefinition(), isCollectionViewPanel() ? getCollectionNameParameterValue().toString() : null,
null, getPageBase(), true);
}

private BoxedTablePanel<SelectableBean<O>> createTable() {
Expand Down
Expand Up @@ -57,6 +57,7 @@ public class Search implements Serializable, DebugDumpable {

private boolean showAdvanced = false;
private boolean isFullTextSearchEnabled = false;
private boolean showMoreDialog;

private String advancedQuery;
private String advancedError;
Expand Down Expand Up @@ -376,6 +377,14 @@ public void setFullTextSearchEnabled(boolean fullTextSearchEnabled) {
isFullTextSearchEnabled = fullTextSearchEnabled;
}

public boolean isShowMoreDialog() {
return showMoreDialog;
}

public void setShowMoreDialog(boolean showMoreDialog) {
this.showMoreDialog = showMoreDialog;
}

private String createErrorMessage(Exception ex) {
StringBuilder sb = new StringBuilder();

Expand Down
Expand Up @@ -13,24 +13,23 @@
import com.evolveum.midpoint.gui.api.page.PageBase;
import com.evolveum.midpoint.gui.api.util.ModelServiceLocator;
import com.evolveum.midpoint.gui.api.util.WebComponentUtil;
import com.evolveum.midpoint.model.api.authentication.CompiledObjectCollectionView;
import com.evolveum.midpoint.model.api.authentication.CompiledGuiProfile;
import com.evolveum.midpoint.model.api.authentication.CompiledObjectCollectionView;
import com.evolveum.midpoint.prism.*;
import com.evolveum.midpoint.prism.path.ItemPath;
import com.evolveum.midpoint.prism.schema.SchemaRegistry;
import com.evolveum.midpoint.prism.util.ItemPathTypeUtil;
import com.evolveum.midpoint.schema.ResourceShadowDiscriminator;
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.schema.util.FullTextSearchConfigurationUtil;
import com.evolveum.midpoint.task.api.Task;
import com.evolveum.midpoint.util.exception.CommunicationException;
import com.evolveum.midpoint.util.exception.ConfigurationException;
import com.evolveum.midpoint.util.exception.ExpressionEvaluationException;
import com.evolveum.midpoint.util.exception.ObjectNotFoundException;
import com.evolveum.midpoint.util.exception.SchemaException;
import com.evolveum.midpoint.util.exception.SecurityViolationException;
import com.evolveum.midpoint.util.exception.SystemException;
import com.evolveum.midpoint.util.exception.*;
import com.evolveum.midpoint.xml.ns._public.common.common_3.*;

import com.evolveum.prism.xml.ns._public.types_3.ItemPathType;

import org.apache.cxf.common.util.CollectionUtils;

/**
* @author Viliam Repan (lazyman)
*/
Expand Down Expand Up @@ -172,31 +171,48 @@ public static <C extends Containerable> Search createContainerSearch(Class<C> ty
// return search;
// }

public static <T extends ObjectType> Search createSearch(Class<T> type, ModelServiceLocator modelServiceLocator) {
public static <T extends ObjectType> Search createSearch(Class<T> type, ModelServiceLocator modelServiceLocator) {
return createSearch(type, null, modelServiceLocator, true);
}

public static <T extends ObjectType> Search createSearch(
Class<T> type, ResourceShadowDiscriminator discriminator,
ModelServiceLocator modelServiceLocator, boolean useDefsFromSuperclass) {
return createSearch(type, null, discriminator, modelServiceLocator, useDefsFromSuperclass);
}

PrismObjectDefinition objectDef = findObjectDefinition(type, discriminator, modelServiceLocator);
public static <T extends ObjectType> Search createSearch(
Class<T> type, String collectionViewName, ResourceShadowDiscriminator discriminator,
ModelServiceLocator modelServiceLocator, boolean useDefsFromSuperclass) {

List<SearchItemDefinition> availableDefs = getAvailableDefinitions(objectDef, useDefsFromSuperclass);
PrismObjectDefinition objectDef = findObjectDefinition(type, discriminator, modelServiceLocator);
List<SearchItemDefinition> availableDefs = getAvailableDefinitions(objectDef, useDefsFromSuperclass);
boolean isFullTextSearchEnabled = isFullTextSearchEnabled(modelServiceLocator, type);

Search search = new Search(type, availableDefs, isFullTextSearchEnabled,
getDefaultSearchType(modelServiceLocator, type));
getDefaultSearchType(modelServiceLocator, type, collectionViewName));

SchemaRegistry registry = modelServiceLocator.getPrismContext().getSchemaRegistry();
PrismObjectDefinition objDef = registry.findObjectDefinitionByCompileTimeClass(ObjectType.class);
PrismPropertyDefinition def = objDef.findPropertyDefinition(ObjectType.F_NAME);

SearchItem item = search.addItem(def);
if (item != null) {
item.setFixed(true);
PrismObjectDefinition objDef = registry.findObjectDefinitionByCompileTimeClass(type);
SearchItemsType searchItemsConfig = getConfiguredSearchItems(modelServiceLocator, type, collectionViewName);
List<SearchItemDefinition> configuredSearchItemDefs = getConfiguredSearchItemDefinitions(objectDef, useDefsFromSuperclass, searchItemsConfig);
if (!CollectionUtils.isEmpty(configuredSearchItemDefs)){
configuredSearchItemDefs.forEach(searchItemDef -> {
PrismPropertyDefinition def = objDef.findPropertyDefinition(searchItemDef.getPath());
SearchItem item = search.addItem(def);
if (item != null) {
item.setFixed(true);
}
});
} else {
PrismPropertyDefinition def = objDef.findPropertyDefinition(ObjectType.F_NAME);
SearchItem item = search.addItem(def);
if (item != null) {
item.setFixed(true);
}
}

search.setShowMoreDialog(isAllowToConfigureSearchItems(modelServiceLocator, type, collectionViewName));
return search;
}

Expand Down Expand Up @@ -226,6 +242,25 @@ public static <T extends ObjectType> PrismObjectDefinition findObjectDefinition(
}
}

private static <C extends Containerable> List<SearchItemDefinition> getConfiguredSearchItemDefinitions(PrismContainerDefinition<C> objectDef,
boolean useDefsFromSuperclass, SearchItemsType configuredSearchItems){
List<SearchItemDefinition> availableDefinitions = getAvailableDefinitions(objectDef, useDefsFromSuperclass);
if (configuredSearchItems == null || CollectionUtils.isEmpty(configuredSearchItems.getSearchItem())){
return null;
}
List<SearchItemDefinition> configuredSearchItemList = new ArrayList<>();
configuredSearchItems.getSearchItem().forEach(searchItem -> {
availableDefinitions.forEach(def -> {
ItemPathType searchItemPath = new ItemPathType(def.getPath());
if (searchItem.getPath().equivalent(searchItemPath)){
configuredSearchItemList.add(def);
return;
}
});
});
return configuredSearchItemList;
}

public static <C extends Containerable> List<SearchItemDefinition> getAvailableDefinitions(
PrismContainerDefinition<C> objectDef, boolean useDefsFromSuperclass) {
// Map<ItemPath, ItemDefinition> map = new HashMap<>();
Expand Down Expand Up @@ -270,17 +305,39 @@ private static <T extends ObjectType> boolean isFullTextSearchEnabled(ModelServi
}
}

private static <T extends ObjectType> SearchBoxModeType getDefaultSearchType(ModelServiceLocator modelServiceLocator, Class<T> type) {
private static <T extends ObjectType> SearchBoxModeType getDefaultSearchType(ModelServiceLocator modelServiceLocator, Class<T> type, String collectionViewName) {
SearchBoxConfigurationType searchConfig = getSearchBoxConfiguration(modelServiceLocator, type, collectionViewName);
if (searchConfig == null){
return null;
}
return searchConfig.getDefaultMode();
}

private static <T extends ObjectType> SearchItemsType getConfiguredSearchItems(ModelServiceLocator modelServiceLocator, Class<T> type, String collectionViewName){
SearchBoxConfigurationType searchConfig = getSearchBoxConfiguration(modelServiceLocator, type, collectionViewName);
if (searchConfig == null){
return null;
}
return searchConfig.getSearchItems();
}

private static <T extends ObjectType> boolean isAllowToConfigureSearchItems(ModelServiceLocator modelServiceLocator, Class<T> type, String collectionViewName){
SearchBoxConfigurationType searchConfig = getSearchBoxConfiguration(modelServiceLocator, type, collectionViewName);
if (searchConfig == null || searchConfig.isAllowToConfigureSearchItems() == null){
return false;
}
return searchConfig.isAllowToConfigureSearchItems();
}

private static <T extends ObjectType> SearchBoxConfigurationType getSearchBoxConfiguration(ModelServiceLocator modelServiceLocator,
Class<T> type, String collectionViewName) {
OperationResult result = new OperationResult(LOAD_ADMIN_GUI_CONFIGURATION);
try {
CompiledGuiProfile guiConfig = modelServiceLocator.getModelInteractionService().getCompiledGuiProfile(null, result);
// TODO: improve: use proper view name
List<CompiledObjectCollectionView> objectLists = guiConfig.findAllApplicableObjectCollectionViews(type);
for (CompiledObjectCollectionView objectList : objectLists){
if (objectList.getSearchBoxConfiguration() != null) {
SearchBoxConfigurationType searchBoxConfig = objectList.getSearchBoxConfiguration();
return searchBoxConfig.getDefaultMode();
}
CompiledObjectCollectionView view = guiConfig.findObjectCollectionView(
WebComponentUtil.classToQName(modelServiceLocator.getPrismContext(), type), collectionViewName);
if (view != null) {
return view.getSearchBoxConfiguration();
}
return null;
} catch (SchemaException | ObjectNotFoundException | CommunicationException | ConfigurationException | SecurityViolationException | ExpressionEvaluationException ex) {
Expand Down
Expand Up @@ -10,8 +10,7 @@
<body>
<wicket:panel>
<!-- todo replace style attribute to css class -->
<div class="search-item" style="display: inline-block; border-color: #ddd; border-radius: 3px; background-color: #f4f4f4;
vertical-align: middle; font-size: 12px;" wicket:id="searchItemContainer">
<div class="search-item" wicket:id="searchItemContainer">
<div class="col-sm-3" style="margin-top: 5px; width: fit-content" wicket:id="searchItemLabel" />
<div class="col-sm-7" wicket:id="searchItemField" />
<div class="col-sm-1">
Expand Down
Expand Up @@ -143,7 +143,7 @@ protected void populateItem(ListItem<SearchItem<?>> item) {
form.add(items);

WebMarkupContainer moreGroup = new WebMarkupContainer(ID_MORE_GROUP);
moreGroup.add(createVisibleBehaviour(SearchBoxModeType.BASIC));
moreGroup.add(new VisibleBehaviour(() -> createVisibleBehaviour(SearchBoxModeType.BASIC).isVisible() && getModelObject().isShowMoreDialog()));
form.add(moreGroup);

AjaxLink<Void> more = new AjaxLink<Void>(ID_MORE) {
Expand Down
Expand Up @@ -1630,3 +1630,12 @@ th.composited-icon {
.cog-xs {
width: 38px;
}

.search-item {
display: inline-block;
border-color: #ddd;
border-radius: 3px;
background-color: #f4f4f4;
vertical-align: middle;
font-size: 12px;
}
Expand Up @@ -24000,11 +24000,97 @@
</xsd:appinfo>
</xsd:annotation>
</xsd:element>
<!-- TODO: default items to display for basic search -->
<xsd:element name="searchItems" type="tns:SearchItemsType" minOccurs="0" maxOccurs="1">
<xsd:annotation>
<xsd:documentation>
The list of searchable properties which should be displayed on the search panel.
</xsd:documentation>
<xsd:appinfo>
<a:displayName>SearchBoxConfigurationType.searchItems</a:displayName>
<a:since>4.2</a:since>
</xsd:appinfo>
</xsd:annotation>
</xsd:element>
<xsd:element name="allowToConfigureSearchItems" type="xsd:boolean" minOccurs="0" maxOccurs="1" default="false">
<xsd:annotation>
<xsd:documentation>
The flag to display/hide configuration button on the search panel.
</xsd:documentation>
<xsd:appinfo>
<a:displayName>SearchBoxConfigurationType.allowToConfigureSearchItems</a:displayName>
</xsd:appinfo>
</xsd:annotation>
</xsd:element>
<!-- TODO: default relation (e.g. defalt, manager, all relations) -->
</xsd:sequence>
</xsd:complexType>

<xsd:complexType name="SearchItemsType">
<xsd:annotation>
<xsd:documentation>
The list of the search properties to be configured for the search panel.
</xsd:documentation>
<xsd:appinfo>
<a:container/>
<a:since>4.2</a:since>
</xsd:appinfo>
</xsd:annotation>
<xsd:sequence>
<xsd:element name="searchItem" type="tns:SearchItemType" minOccurs="0" maxOccurs="unbounded">
<xsd:annotation>
<xsd:appinfo>
<a:displayName>SearchItemsType.searchItem</a:displayName>
</xsd:appinfo>
</xsd:annotation>
</xsd:element>
</xsd:sequence>
</xsd:complexType>

<xsd:complexType name="SearchItemType">
<xsd:annotation>
<xsd:documentation>
Search item
</xsd:documentation>
<xsd:appinfo>
<a:container/>
<a:since>4.2</a:since>
</xsd:appinfo>
</xsd:annotation>
<xsd:sequence>
<xsd:element name="path" type="t:ItemPathType" minOccurs="1" maxOccurs="1">
<xsd:annotation>
<xsd:documentation>
Path of the searchable item (property) in the object over which the search is executed.
</xsd:documentation>
<xsd:appinfo>
<a:displayName>SearchItemType.path</a:displayName>
</xsd:appinfo>
</xsd:annotation>
</xsd:element>
<xsd:element name="description" type="xsd:string" minOccurs="0" maxOccurs="1">
<xsd:annotation>
<xsd:documentation>
Free-form description. It is not displayed to the user. It is supposed to be used by system
administrators to explain the purpose of the configuration.
</xsd:documentation>
<xsd:appinfo>
<a:displayName>SearchItemType.description</a:displayName>
</xsd:appinfo>
</xsd:annotation>
</xsd:element>
<xsd:element name="displayName" type="t:PolyStringType" minOccurs="0" maxOccurs="1">
<xsd:annotation>
<xsd:documentation>
User friendly display name of the search item (property)
</xsd:documentation>
<xsd:appinfo>
<a:displayName>SearchItemType.display</a:displayName>
</xsd:appinfo>
</xsd:annotation>
</xsd:element>
</xsd:sequence>
</xsd:complexType>

<xsd:simpleType name="SearchBoxModeType">
<xsd:annotation>
<xsd:documentation>
Expand Down

0 comments on commit 65a5c5a

Please sign in to comment.