From 7d9227e65ec85b3c1c248edeb6b01befb4ba3c32 Mon Sep 17 00:00:00 2001 From: kate Date: Mon, 25 May 2020 10:20:24 +0200 Subject: [PATCH 1/3] search config schema --- .../xml/ns/public/common/common-core-3.xsd | 88 ++++++++++++++++++- 1 file changed, 87 insertions(+), 1 deletion(-) diff --git a/infra/schema/src/main/resources/xml/ns/public/common/common-core-3.xsd b/infra/schema/src/main/resources/xml/ns/public/common/common-core-3.xsd index f4ef4d379c4..0c854ae5b40 100755 --- a/infra/schema/src/main/resources/xml/ns/public/common/common-core-3.xsd +++ b/infra/schema/src/main/resources/xml/ns/public/common/common-core-3.xsd @@ -23991,11 +23991,97 @@ - + + + + The list of searchable properties which should be displayed on the search panel. + + + SearchBoxConfigurationType.searchItems + 4.2 + + + + + + + The flag to display/hide configuration button on the search panel. + + + SearchBoxConfigurationType.allowToConfigureSearchItems + + + + + + + The list of the search properties to be configured for the search panel. + + + + 4.2 + + + + + + + SearchItemsType.searchItem + + + + + + + + + + Search item + + + + 4.2 + + + + + + + Path of the searchable item (property) in the object over which the search is executed. + + + SearchItemType.path + + + + + + + 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. + + + SearchItemType.description + + + + + + + User friendly display name of the search item (property) + + + SearchItemType.display + + + + + + From a1daf5a19b42efc4d5ca202d399ff63dbac08255 Mon Sep 17 00:00:00 2001 From: kate Date: Mon, 25 May 2020 16:00:43 +0200 Subject: [PATCH 2/3] search config schema (search item maxOccurs fix) --- .../src/main/resources/xml/ns/public/common/common-core-3.xsd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/infra/schema/src/main/resources/xml/ns/public/common/common-core-3.xsd b/infra/schema/src/main/resources/xml/ns/public/common/common-core-3.xsd index 0c854ae5b40..c2c6ae20c69 100755 --- a/infra/schema/src/main/resources/xml/ns/public/common/common-core-3.xsd +++ b/infra/schema/src/main/resources/xml/ns/public/common/common-core-3.xsd @@ -24027,7 +24027,7 @@ - + SearchItemsType.searchItem From 97eab8c14dba9e223d8c518311089cfa623df396 Mon Sep 17 00:00:00 2001 From: kate Date: Mon, 25 May 2020 16:37:59 +0200 Subject: [PATCH 3/3] search panel config is taken from adminGuiConfiguration --- .../gui/api/component/ObjectListPanel.java | 3 +- .../midpoint/web/component/search/Search.java | 9 ++ .../web/component/search/SearchFactory.java | 109 +++++++++++++----- .../web/component/search/SearchItemPanel.html | 3 +- .../web/component/search/SearchPanel.java | 2 +- .../resources/static/less/midpoint-theme.less | 9 ++ 6 files changed, 105 insertions(+), 30 deletions(-) diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/ObjectListPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/ObjectListPanel.java index 662b4d105c5..4f9d7e1d95b 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/ObjectListPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/ObjectListPanel.java @@ -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> createTable() { diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/Search.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/Search.java index 0f524affce5..9e1d6daff7e 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/Search.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/Search.java @@ -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; @@ -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(); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/SearchFactory.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/SearchFactory.java index af7876a8dba..62febdbd7a6 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/SearchFactory.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/SearchFactory.java @@ -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) */ @@ -172,31 +171,48 @@ public static Search createContainerSearch(Class ty // return search; // } - public static Search createSearch(Class type, ModelServiceLocator modelServiceLocator) { + public static Search createSearch(Class type, ModelServiceLocator modelServiceLocator) { return createSearch(type, null, modelServiceLocator, true); } public static Search createSearch( Class type, ResourceShadowDiscriminator discriminator, ModelServiceLocator modelServiceLocator, boolean useDefsFromSuperclass) { + return createSearch(type, null, discriminator, modelServiceLocator, useDefsFromSuperclass); + } - PrismObjectDefinition objectDef = findObjectDefinition(type, discriminator, modelServiceLocator); + public static Search createSearch( + Class type, String collectionViewName, ResourceShadowDiscriminator discriminator, + ModelServiceLocator modelServiceLocator, boolean useDefsFromSuperclass) { - List availableDefs = getAvailableDefinitions(objectDef, useDefsFromSuperclass); + PrismObjectDefinition objectDef = findObjectDefinition(type, discriminator, modelServiceLocator); + List 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 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; } @@ -226,6 +242,25 @@ public static PrismObjectDefinition findObjectDefinition( } } + private static List getConfiguredSearchItemDefinitions(PrismContainerDefinition objectDef, + boolean useDefsFromSuperclass, SearchItemsType configuredSearchItems){ + List availableDefinitions = getAvailableDefinitions(objectDef, useDefsFromSuperclass); + if (configuredSearchItems == null || CollectionUtils.isEmpty(configuredSearchItems.getSearchItem())){ + return null; + } + List 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 List getAvailableDefinitions( PrismContainerDefinition objectDef, boolean useDefsFromSuperclass) { // Map map = new HashMap<>(); @@ -270,17 +305,39 @@ private static boolean isFullTextSearchEnabled(ModelServi } } - private static SearchBoxModeType getDefaultSearchType(ModelServiceLocator modelServiceLocator, Class type) { + private static SearchBoxModeType getDefaultSearchType(ModelServiceLocator modelServiceLocator, Class type, String collectionViewName) { + SearchBoxConfigurationType searchConfig = getSearchBoxConfiguration(modelServiceLocator, type, collectionViewName); + if (searchConfig == null){ + return null; + } + return searchConfig.getDefaultMode(); + } + + private static SearchItemsType getConfiguredSearchItems(ModelServiceLocator modelServiceLocator, Class type, String collectionViewName){ + SearchBoxConfigurationType searchConfig = getSearchBoxConfiguration(modelServiceLocator, type, collectionViewName); + if (searchConfig == null){ + return null; + } + return searchConfig.getSearchItems(); + } + + private static boolean isAllowToConfigureSearchItems(ModelServiceLocator modelServiceLocator, Class type, String collectionViewName){ + SearchBoxConfigurationType searchConfig = getSearchBoxConfiguration(modelServiceLocator, type, collectionViewName); + if (searchConfig == null || searchConfig.isAllowToConfigureSearchItems() == null){ + return false; + } + return searchConfig.isAllowToConfigureSearchItems(); + } + + private static SearchBoxConfigurationType getSearchBoxConfiguration(ModelServiceLocator modelServiceLocator, + Class 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 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) { diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/SearchItemPanel.html b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/SearchItemPanel.html index 2595aa9b15a..08e5305f171 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/SearchItemPanel.html +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/SearchItemPanel.html @@ -10,8 +10,7 @@ -
+
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/SearchPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/SearchPanel.java index d53358fa2d5..aea2cad7480 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/SearchPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/SearchPanel.java @@ -143,7 +143,7 @@ protected void populateItem(ListItem> 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 more = new AjaxLink(ID_MORE) { diff --git a/gui/admin-gui/src/main/resources/static/less/midpoint-theme.less b/gui/admin-gui/src/main/resources/static/less/midpoint-theme.less index 5147d5c65ec..17f77d28259 100644 --- a/gui/admin-gui/src/main/resources/static/less/midpoint-theme.less +++ b/gui/admin-gui/src/main/resources/static/less/midpoint-theme.less @@ -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; +}