diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/MainObjectListPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/MainObjectListPanel.java index 60e114e2eb2..70e5964dcce 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/MainObjectListPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/MainObjectListPanel.java @@ -6,20 +6,15 @@ */ package com.evolveum.midpoint.gui.api.component; -import java.io.Serializable; import java.util.*; import org.apache.commons.collections4.CollectionUtils; -import org.apache.commons.lang3.StringUtils; import org.apache.wicket.Component; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.behavior.AttributeAppender; import org.apache.wicket.extensions.markup.html.repeater.data.table.DataTable; import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn; import org.apache.wicket.markup.html.WebMarkupContainer; -import org.apache.wicket.markup.html.list.ListItem; -import org.apache.wicket.markup.html.list.ListView; -import org.apache.wicket.markup.html.panel.Fragment; import org.apache.wicket.model.IModel; import org.apache.wicket.model.Model; @@ -55,7 +50,6 @@ import com.evolveum.midpoint.web.component.MultiFunctinalButtonDto; import com.evolveum.midpoint.web.component.MultifunctionalButton; import com.evolveum.midpoint.web.component.data.column.CheckBoxHeaderColumn; -import com.evolveum.midpoint.web.component.data.column.ObjectNameColumn; import com.evolveum.midpoint.web.component.util.SelectableBean; import com.evolveum.midpoint.web.component.util.VisibleBehaviour; import com.evolveum.midpoint.web.component.util.VisibleEnableBehaviour; @@ -70,9 +64,6 @@ public abstract class MainObjectListPanel extends ObjectListPanel { private static final long serialVersionUID = 1L; - private static final String ID_BUTTON_BAR = "buttonBar"; - private static final String ID_BUTTON_REPEATER = "buttonsRepeater"; - private static final String ID_BUTTON = "button"; private static final Trace LOGGER = TraceManager.getTrace(MainObjectListPanel.class); public MainObjectListPanel(String id, Class type) { @@ -119,11 +110,6 @@ protected List getReferencesList(CompiledObjectCollectionVi return Arrays.asList(ref); } - @Override - protected WebMarkupContainer initButtonToolbar(String id) { - return new ButtonBar(id, ID_BUTTON_BAR, this, createToolbarButtonsList(ID_BUTTON)); - } - protected List loadButtonDescriptions() { List multiFunctinalButtonDtos = new ArrayList<>(); @@ -151,6 +137,7 @@ private CompositedIcon createCompositedIcon(CompiledObjectCollectionView collect return builder.build(); } + @Override protected List createToolbarButtonsList(String buttonId) { List buttonsList = new ArrayList<>(); MultifunctionalButton createNewObjectButton = new MultifunctionalButton(buttonId, loadButtonDescriptions()) { @@ -272,7 +259,7 @@ public void onClick(AjaxRequestTarget target) { } }; createReport.add(AttributeAppender.append("class", "btn btn-default btn-sm btn-margin-right")); - exportDataLink.add(new VisibleEnableBehaviour() { + createReport.add(new VisibleEnableBehaviour() { private static final long serialVersionUID = 1L; @Override @@ -321,80 +308,6 @@ protected boolean getNewObjectGenericButtonVisibility() { return true; } - private void createReportPerformed(AjaxRequestTarget target) { - PrismContext prismContext = getPageBase().getPrismContext(); - PrismObjectDefinition def = prismContext.getSchemaRegistry().findObjectDefinitionByType(ReportType.COMPLEX_TYPE); - PrismObject obj = null; - try { - obj = def.instantiate(); - } catch (SchemaException e) { - LOGGER.error("Couldn't instantiate new report", e); - getPageBase().error(getString("MainObjectListPanel.message.error.instantiateNewReport")); - target.add(getPageBase().getFeedbackPanel()); - return; - } - ReportType report = obj.asObjectable(); - ObjectCollectionReportEngineConfigurationType objectCollection = new ObjectCollectionReportEngineConfigurationType(); - CompiledObjectCollectionView view = getObjectCollectionView(); - CollectionRefSpecificationType collection = new CollectionRefSpecificationType(); - objectCollection.setUseOnlyReportView(true); - if (view != null) { - objectCollection.setView(view.toGuiObjectListViewType()); - if (view.getCollection() != null && view.getCollection().getCollectionRef() != null) { - if (!QNameUtil.match(view.getCollection().getCollectionRef().getType(), ArchetypeType.COMPLEX_TYPE)) { - collection.setBaseCollectionRef(view.getCollection()); - } else { - OperationResult result = new OperationResult(MainObjectListPanel.class.getSimpleName() + "." + "evaluateExpressionsInFilter"); - CollectionRefSpecificationType baseCollection = new CollectionRefSpecificationType(); - try { - baseCollection.setFilter(getPageBase().getQueryConverter().createSearchFilterType( - WebComponentUtil.evaluateExpressionsInFilter(view.getFilter(), result, getPageBase()))); - collection.setBaseCollectionRef(baseCollection); - } catch (SchemaException e) { - LOGGER.error("Couldn't create filter for archetype"); - getPageBase().error(getString("MainObjectListPanel.message.error.createArchetypeFilter")); - target.add(getPageBase().getFeedbackPanel()); - } - } - } - } else { - objectCollection.setView(getDefaultView()); - } - SearchFilterType searchFilter = null; - ObjectQuery query = getSearchModel().getObject().createObjectQuery(getPageBase().getPrismContext()); - if (query != null) { - ObjectFilter filter = query.getFilter(); - try { - searchFilter = getPageBase().getPrismContext().getQueryConverter().createSearchFilterType(filter); - } catch (Exception e) { - LOGGER.error("Couldn't create filter from search panel", e); - getPageBase().error(getString("ExportingFilterTabPanel.message.error.serializeFilterFromSearch")); - } - } - if (searchFilter != null) { - collection.setFilter(searchFilter); - } else { - try { - SearchFilterType allFilter = prismContext.getQueryConverter().createSearchFilterType(prismContext.queryFactory().createAll()); - collection.setFilter(allFilter); - } catch (SchemaException e) { - LOGGER.error("Couldn't create all filter", e); - getPageBase().error(getString("MainObjectListPanel.message.error.createAllFilter")); - target.add(getPageBase().getFeedbackPanel()); - return; - } - } - objectCollection.setCollection(collection); - report.setObjectCollection(objectCollection); - report.getAssignment() - .add(ObjectTypeUtil.createAssignmentTo(SystemObjectsType.ARCHETYPE_COLLECTION_REPORT.value(), ObjectTypes.ARCHETYPE, prismContext)); - report.getArchetypeRef() - .add(ObjectTypeUtil.createObjectRef(SystemObjectsType.ARCHETYPE_COLLECTION_REPORT.value(), ObjectTypes.ARCHETYPE)); - - PageReport pageReport = new PageReport(report.asPrismObject(), true); - getPageBase().navigateToNext(pageReport); - } - private GuiObjectListViewType resolveSelectedColumn(List indexOfColumns, GuiObjectListViewType view) { List newColumns = new ArrayList<>(); List oldColumns; @@ -411,10 +324,6 @@ private GuiObjectListViewType resolveSelectedColumn(List indexOfColumns return view; } - protected GuiObjectListViewType getDefaultView() { - return DefaultColumnUtils.getDefaultView(getType()); - } - private IModel getRefreshPausePlayButtonModel() { return () -> { if (isRefreshEnabled()) { @@ -511,25 +420,4 @@ protected DisplayType getNewObjectButtonSpecialDisplayType() { protected CompositedIconBuilder getNewObjectButtonAdditionalIconBuilder(CompiledObjectCollectionView influencingObject, DisplayType additionalButtonDisplayType) { return null; } - - private static class ButtonBar extends Fragment { - - private static final long serialVersionUID = 1L; - - public ButtonBar(String id, String markupId, MainObjectListPanel markupProvider, List buttonsList) { - super(id, markupId, markupProvider); - - initLayout(buttonsList); - } - - private void initLayout(final List buttonsList) { - ListView buttonsView = new ListView(ID_BUTTON_REPEATER, Model.ofList(buttonsList)) { - @Override - protected void populateItem(ListItem listItem) { - listItem.add(listItem.getModelObject()); - } - }; - add(buttonsView); - } - } } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/MainObjectListPanel.html b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/MainObjectListPanelOld.html similarity index 82% rename from gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/MainObjectListPanel.html rename to gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/MainObjectListPanelOld.html index 32f0f0373bf..678547ab8d8 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/MainObjectListPanel.html +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/MainObjectListPanelOld.html @@ -26,10 +26,5 @@ - -
- -
-
\ No newline at end of file diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/button/CsvDownloadButtonPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/button/CsvDownloadButtonPanel.java index bf1079d003f..c3b4707b6ed 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/button/CsvDownloadButtonPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/button/CsvDownloadButtonPanel.java @@ -10,6 +10,8 @@ import java.util.ArrayList; import java.util.List; +import com.evolveum.midpoint.web.component.data.SelectableBeanContainerDataProvider; + import org.apache.commons.lang3.StringUtils; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.extensions.markup.html.repeater.data.table.DataTable; @@ -62,8 +64,8 @@ private void initLayout() { @Override public void exportData(IDataProvider dataProvider, List> columns, OutputStream outputStream) { - if (dataProvider instanceof SelectableBeanObjectDataProvider) { - ((SelectableBeanObjectDataProvider) dataProvider).setExport(true); // TODO implement more nicely + if (dataProvider instanceof SelectableBeanContainerDataProvider) { + ((SelectableBeanContainerDataProvider) dataProvider).setExport(true); // TODO implement more nicely } try { ((BaseSortableDataProvider) dataProvider).setExportSize(true); @@ -72,8 +74,8 @@ public void exportData(IDataProvider dataProvider, } catch (Exception ex) { LOGGER.error("Unable to export data,", ex); } finally { - if (dataProvider instanceof SelectableBeanObjectDataProvider) { - ((SelectableBeanObjectDataProvider) dataProvider).setExport(false); + if (dataProvider instanceof SelectableBeanContainerDataProvider) { + ((SelectableBeanContainerDataProvider) dataProvider).setExport(false); } } } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/util/WebComponentUtil.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/util/WebComponentUtil.java index 3f8102c0f88..395e9a10abf 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/util/WebComponentUtil.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/util/WebComponentUtil.java @@ -23,6 +23,7 @@ import javax.xml.datatype.XMLGregorianCalendar; import javax.xml.namespace.QName; +import com.evolveum.midpoint.web.component.data.SelectableBeanContainerDataProvider; import com.evolveum.midpoint.xml.ns._public.common.audit_3.AuditEventRecordType; import org.apache.commons.collections4.CollectionUtils; @@ -1701,8 +1702,8 @@ public static void clearProviderCache(IDataProvider provider) { if (provider instanceof BaseSortableDataProvider) { ((BaseSortableDataProvider) provider).clearCache(); } - if (provider instanceof SelectableBeanObjectDataProvider) { - ((SelectableBeanObjectDataProvider) provider).clearSelectedObjects(); + if (provider instanceof SelectableBeanContainerDataProvider) { + ((SelectableBeanContainerDataProvider) provider).clearSelectedObjects(); } } @@ -4693,4 +4694,14 @@ public static Collator getCollator() { collator.setDecomposition(Collator.FULL_DECOMPOSITION); return collator; } + + public static CompositedIcon createCreateReportIcon() { + final CompositedIconBuilder builder = new CompositedIconBuilder(); + builder.setBasicIcon(WebComponentUtil.createReportIcon(), IconCssStyle.IN_ROW_STYLE); + IconType plusIcon = new IconType(); + plusIcon.setCssClass(GuiStyleConstants.CLASS_ADD_NEW_OBJECT); + plusIcon.setColor("green"); + builder.appendLayerIcon(plusIcon, LayeredIconCssStyle.BOTTOM_RIGHT_STYLE); + return builder.build(); + } } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/component/ContainerableListPanel.html b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/component/ContainerableListPanel.html index 57a22c19150..a500c915e33 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/component/ContainerableListPanel.html +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/component/ContainerableListPanel.html @@ -13,6 +13,11 @@
+ +
+ +
+
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/component/ContainerableListPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/component/ContainerableListPanel.java index e5c0f62c145..88deb17c830 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/component/ContainerableListPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/component/ContainerableListPanel.java @@ -8,6 +8,7 @@ import com.evolveum.midpoint.gui.api.GuiStyleConstants; import com.evolveum.midpoint.gui.api.component.BasePanel; +import com.evolveum.midpoint.gui.api.component.MainObjectListPanel; import com.evolveum.midpoint.gui.api.model.LoadableModel; import com.evolveum.midpoint.gui.api.page.PageBase; import com.evolveum.midpoint.gui.api.util.WebComponentUtil; @@ -18,6 +19,7 @@ import com.evolveum.midpoint.prism.*; import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.polystring.PolyString; +import com.evolveum.midpoint.prism.query.ObjectFilter; import com.evolveum.midpoint.prism.query.ObjectOrdering; import com.evolveum.midpoint.prism.query.ObjectPaging; import com.evolveum.midpoint.prism.query.ObjectQuery; @@ -26,8 +28,10 @@ import com.evolveum.midpoint.schema.GetOperationOptions; import com.evolveum.midpoint.schema.SelectorOptions; import com.evolveum.midpoint.schema.constants.ExpressionConstants; +import com.evolveum.midpoint.schema.constants.ObjectTypes; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.schema.util.MiscSchemaUtil; +import com.evolveum.midpoint.schema.util.ObjectTypeUtil; import com.evolveum.midpoint.task.api.Task; import com.evolveum.midpoint.util.QNameUtil; import com.evolveum.midpoint.util.exception.*; @@ -41,11 +45,13 @@ import com.evolveum.midpoint.web.component.menu.cog.InlineMenuItem; import com.evolveum.midpoint.web.component.search.*; import com.evolveum.midpoint.web.component.util.*; +import com.evolveum.midpoint.web.page.admin.reports.PageReport; import com.evolveum.midpoint.web.page.admin.server.dto.OperationResultStatusPresentationProperties; import com.evolveum.midpoint.web.session.PageStorage; import com.evolveum.midpoint.web.session.UserProfileStorage; import com.evolveum.midpoint.xml.ns._public.common.common_3.*; +import com.evolveum.prism.xml.ns._public.query_3.SearchFilterType; import com.evolveum.prism.xml.ns._public.types_3.PolyStringType; import org.apache.commons.lang3.StringUtils; @@ -58,6 +64,9 @@ import org.apache.wicket.extensions.markup.html.repeater.util.SortParam; import org.apache.wicket.markup.html.WebMarkupContainer; import org.apache.wicket.markup.html.basic.Label; +import org.apache.wicket.markup.html.list.ListItem; +import org.apache.wicket.markup.html.list.ListView; +import org.apache.wicket.markup.html.panel.Fragment; import org.apache.wicket.model.IModel; import org.apache.wicket.model.Model; import org.apache.wicket.model.PropertyModel; @@ -89,6 +98,10 @@ public abstract class ContainerableListPanel type; @@ -159,6 +172,7 @@ public Search load() { } } } + search.setCollectionView(getWidgetCollectionView()); return search; } }; @@ -240,8 +254,7 @@ public String getObject() { @Override protected WebMarkupContainer createButtonToolbar(String id) { - WebMarkupContainer bar = initButtonToolbar(id); - return bar != null ? bar : super.createButtonToolbar(id); + return new ButtonBar(id, ID_BUTTON_BAR, ContainerableListPanel.this, createToolbarButtonsList(ID_BUTTON)); } @Override @@ -715,12 +728,9 @@ public void setAdditionalBoxCssClasses(String boxCssClasses) { this.additionalBoxCssClasses = boxCssClasses; } - /** - * there's no way to do it properly... - */ - @Deprecated - protected WebMarkupContainer initButtonToolbar(String id) { - return null; + protected List createToolbarButtonsList(String idButton){ + List components = new ArrayList<>(); + return components; } protected String getStorageKey(){ @@ -765,14 +775,24 @@ protected int getAutoRefreshInterval() { } protected CompiledObjectCollectionView getObjectCollectionView() { - if (dashboardWidgetView != null) { - return dashboardWidgetView; + CompiledObjectCollectionView view = getWidgetCollectionView(); + if (view != null) { + return view; } + String collectionName = getCollectionNameParameterValue().toString(); + return getPageBase().getCompiledGuiProfile().findObjectCollectionView + (WebComponentUtil.containerClassToQName(getPageBase().getPrismContext(), getType()), collectionName); + } + + private CompiledObjectCollectionView getWidgetCollectionView() { PageParameters parameters = getPageBase().getPageParameters(); String dashboardOid = parameters == null ? null : parameters.get(PageBase.PARAMETER_DASHBOARD_TYPE_OID).toString(); String dashboardWidgetName = parameters == null ? null : parameters.get(PageBase.PARAMETER_DASHBOARD_WIDGET_NAME).toString(); if (!StringUtils.isEmpty(dashboardOid) && !StringUtils.isEmpty(dashboardWidgetName)) { + if (dashboardWidgetView != null) { + return dashboardWidgetView; + } Task task = getPageBase().createSimpleTask("Create view from dashboard"); DashboardType dashboard = WebModelServiceUtils.loadObject(DashboardType.class, dashboardOid, getPageBase(), task, task.getResult()).getRealValue(); if (dashboard != null) { @@ -786,7 +806,7 @@ protected CompiledObjectCollectionView getObjectCollectionView() { if (widget.getPresentation() != null && widget.getPresentation().getView() != null) { getPageBase().getModelInteractionService().applyView(compiledView, widget.getPresentation().getView()); } - compiledView.setCollection(widget.getData().getCollection()); + compiledView.setCollection(collectionSpec); dashboardWidgetView = compiledView; return dashboardWidgetView; } catch (SchemaException | CommunicationException | ConfigurationException | SecurityViolationException | ExpressionEvaluationException @@ -798,9 +818,7 @@ protected CompiledObjectCollectionView getObjectCollectionView() { } } } - String collectionName = getCollectionNameParameterValue().toString(); - return getPageBase().getCompiledGuiProfile().findObjectCollectionView - (WebComponentUtil.containerClassToQName(getPageBase().getPrismContext(), getType()), collectionName); + return null; } protected StringValue getCollectionNameParameterValue(){ @@ -913,8 +931,9 @@ protected ObjectQuery createQuery() { ObjectQuery query = getPrismContext().queryFor(getType()).build(); Search search = searchModel.getObject(); if (search != null){ - query = search.createObjectQuery(getPageBase().getPrismContext()); + query = search.createObjectQuery(getPageBase()); } + ObjectQuery archetypeQuery = getArchetypeQuery(); query = mergeQueries(query, archetypeQuery); @@ -949,7 +968,6 @@ private ObjectQuery getArchetypeQuery() { } ObjectQuery query = getPrismContext().queryFor(getType()).build(); - query.addFilter(view.getFilter()); OperationResult result = new OperationResult(DOT_CLASS + "evaluateExpressionsInFilter"); query.addFilter(WebComponentUtil.evaluateExpressionsInFilter(view.getFilter(), result, getPageBase())); return query; @@ -980,6 +998,9 @@ private List getGuiObjectColumnTypeList(){ } private boolean isCustomColumnsListConfigured(){ + if (!isCollectionViewPanel()){ + return false; + } List columnList = getGuiObjectColumnTypeList(); return columnList != null && !columnList.isEmpty(); } @@ -1029,4 +1050,103 @@ protected String getTableIdStringValue() { } return tableId.name() + "." + getCollectionNameParameterValue().toString(); } + + private static class ButtonBar extends Fragment { + + private static final long serialVersionUID = 1L; + + public ButtonBar(String id, String markupId, ContainerableListPanel markupProvider, List buttonsList) { + super(id, markupId, markupProvider); + + initLayout(buttonsList); + } + + private void initLayout(final List buttonsList) { + ListView buttonsView = new ListView(ID_BUTTON_REPEATER, Model.ofList(buttonsList)) { + @Override + protected void populateItem(ListItem listItem) { + listItem.add(listItem.getModelObject()); + } + }; + add(buttonsView); + } + } + + protected void createReportPerformed(AjaxRequestTarget target) { + PrismContext prismContext = getPageBase().getPrismContext(); + PrismObjectDefinition def = prismContext.getSchemaRegistry().findObjectDefinitionByType(ReportType.COMPLEX_TYPE); + PrismObject obj = null; + try { + obj = def.instantiate(); + } catch (SchemaException e) { + LOGGER.error("Couldn't instantiate new report", e); + getPageBase().error(getString("MainObjectListPanel.message.error.instantiateNewReport")); + target.add(getPageBase().getFeedbackPanel()); + return; + } + ReportType report = obj.asObjectable(); + ObjectCollectionReportEngineConfigurationType objectCollection = new ObjectCollectionReportEngineConfigurationType(); + CompiledObjectCollectionView view = getObjectCollectionView(); + CollectionRefSpecificationType collection = new CollectionRefSpecificationType(); + objectCollection.setUseOnlyReportView(true); + if (view != null) { + objectCollection.setView(view.toGuiObjectListViewType()); + if (view.getCollection() != null && view.getCollection().getCollectionRef() != null) { + if (!QNameUtil.match(view.getCollection().getCollectionRef().getType(), ArchetypeType.COMPLEX_TYPE)) { + collection.setBaseCollectionRef(view.getCollection()); + } else { + OperationResult result = new OperationResult(MainObjectListPanel.class.getSimpleName() + "." + "evaluateExpressionsInFilter"); + CollectionRefSpecificationType baseCollection = new CollectionRefSpecificationType(); + try { + baseCollection.setFilter(getPageBase().getQueryConverter().createSearchFilterType( + WebComponentUtil.evaluateExpressionsInFilter(view.getFilter(), result, getPageBase()))); + collection.setBaseCollectionRef(baseCollection); + } catch (SchemaException e) { + LOGGER.error("Couldn't create filter for archetype"); + getPageBase().error(getString("MainObjectListPanel.message.error.createArchetypeFilter")); + target.add(getPageBase().getFeedbackPanel()); + } + } + } + } else { + objectCollection.setView(getDefaultView()); + } + SearchFilterType searchFilter = null; + ObjectQuery query = getSearchModel().getObject().createObjectQuery(getPageBase()); + if (query != null) { + ObjectFilter filter = query.getFilter(); + try { + searchFilter = getPageBase().getPrismContext().getQueryConverter().createSearchFilterType(filter); + } catch (Exception e) { + LOGGER.error("Couldn't create filter from search panel", e); + getPageBase().error(getString("ExportingFilterTabPanel.message.error.serializeFilterFromSearch")); + } + } + if (searchFilter != null) { + collection.setFilter(searchFilter); + } else { + try { + SearchFilterType allFilter = prismContext.getQueryConverter().createSearchFilterType(prismContext.queryFactory().createAll()); + collection.setFilter(allFilter); + } catch (SchemaException e) { + LOGGER.error("Couldn't create all filter", e); + getPageBase().error(getString("MainObjectListPanel.message.error.createAllFilter")); + target.add(getPageBase().getFeedbackPanel()); + return; + } + } + objectCollection.setCollection(collection); + report.setObjectCollection(objectCollection); + report.getAssignment() + .add(ObjectTypeUtil.createAssignmentTo(SystemObjectsType.ARCHETYPE_COLLECTION_REPORT.value(), ObjectTypes.ARCHETYPE, prismContext)); + report.getArchetypeRef() + .add(ObjectTypeUtil.createObjectRef(SystemObjectsType.ARCHETYPE_COLLECTION_REPORT.value(), ObjectTypes.ARCHETYPE)); + + PageReport pageReport = new PageReport(report.asPrismObject(), true); + getPageBase().navigateToNext(pageReport); + } + + protected GuiObjectListViewType getDefaultView() { + return DefaultColumnUtils.getDefaultView(getType()); + } } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/component/MultivalueContainerListPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/component/MultivalueContainerListPanel.java index 770b0e7bf0e..50936e8541e 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/component/MultivalueContainerListPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/component/MultivalueContainerListPanel.java @@ -25,6 +25,7 @@ import com.evolveum.midpoint.xml.ns._public.common.common_3.AssignmentHolderType; import org.apache.wicket.AttributeModifier; +import org.apache.wicket.Component; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn; import org.apache.wicket.markup.html.WebMarkupContainer; @@ -66,8 +67,6 @@ public abstract class MultivalueContainerListPanel private static final long serialVersionUID = 1L; - private static final Trace LOGGER = TraceManager.getTrace(MultivalueContainerListPanel.class); - public MultivalueContainerListPanel(String id, Class type) { super(id, type); } @@ -109,13 +108,11 @@ protected PageStorage getPageStorage() { return containersProvider; } - protected WebMarkupContainer initButtonToolbar(String id) { - return getNewItemButton(id); - } - - public MultiCompositedButtonPanel getNewItemButton(String id) { + @Override + protected List createToolbarButtonsList(String idButton) { + List bar = new ArrayList<>(); MultiCompositedButtonPanel newObjectIcon = - new MultiCompositedButtonPanel(id, createNewButtonDescription()) { + new MultiCompositedButtonPanel(idButton, createNewButtonDescription()) { private static final long serialVersionUID = 1L; @Override @@ -152,7 +149,8 @@ public boolean isEnabled() { return isNewObjectButtonEnabled(); } }); - return newObjectIcon; + bar.add(newObjectIcon); + return bar; } protected List createNewButtonDescription() { @@ -176,7 +174,7 @@ private ObjectQuery getQuery(LoadableModel searchModel) { if (searchModel != null) { Search search = searchModel.getObject(); if (search != null) { - query = search.createObjectQuery(getPageBase().getPrismContext()); + query = search.createObjectQuery(getPageBase()); } } return query; diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/page/admin/configuration/component/LoggingConfigurationTabPanel.html b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/page/admin/configuration/component/LoggingConfigurationTabPanel.html index 637b986e86e..de092caec9e 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/page/admin/configuration/component/LoggingConfigurationTabPanel.html +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/page/admin/configuration/component/LoggingConfigurationTabPanel.html @@ -49,12 +49,12 @@
- -
-
-
- - + + + + + + diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/page/admin/configuration/component/LoggingConfigurationTabPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/page/admin/configuration/component/LoggingConfigurationTabPanel.java index ea2423aae49..374298dbbb0 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/page/admin/configuration/component/LoggingConfigurationTabPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/page/admin/configuration/component/LoggingConfigurationTabPanel.java @@ -18,6 +18,7 @@ import org.apache.commons.lang3.StringUtils; import org.apache.wicket.AttributeModifier; +import org.apache.wicket.Component; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.behavior.AttributeAppender; import org.apache.wicket.extensions.markup.html.repeater.data.grid.ICellPopulator; @@ -80,11 +81,11 @@ public class LoggingConfigurationTabPanel extends BasePanel appenderChoice; + public LoggingConfigurationTabPanel(String id, IModel> model) { super(id, model); } @@ -172,7 +173,7 @@ protected void editItemPerformed(AjaxRequestTarget target, MultivalueContainerListPanelWithDetailsPanel appendersMultivalueContainerListPanel = new MultivalueContainerListPanelWithDetailsPanel(ID_APPENDERS, AppenderConfigurationType.class) { - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = 1L; @Override protected void newItemPerformed(AjaxRequestTarget target, AssignmentObjectRelation relation) { @@ -216,13 +217,11 @@ protected MultivalueContainerDetailsPanel getMultival } @Override - protected WebMarkupContainer initButtonToolbar(String contentAreaId) { - Fragment searchContainer = new Fragment(contentAreaId, ID_BUTTON_TOOLBAR_FRAGMENT, LoggingConfigurationTabPanel.this); - - MidpointForm appenderTypeForm = new MidpointForm(ID_CHOICE_APPENDER_TYPE_FORM); - searchContainer.add(appenderTypeForm); + protected List createToolbarButtonsList(String idButton) { + List bar = new ArrayList<>(); +// MidpointForm appenderTypeForm = new MidpointForm(ID_CHOICE_APPENDER_TYPE_FORM); - AjaxSubmitButton newObjectIcon = new AjaxSubmitButton(ID_NEW_ITEM_BUTTON, new Model<>("")) { + AjaxSubmitButton newObjectIcon = new AjaxSubmitButton(idButton, new Model<>("")) { private static final long serialVersionUID = 1L; @@ -246,18 +245,22 @@ public boolean isEnabled() { } }); newObjectIcon.add(AttributeModifier.append("class", createStyleClassModelForNewObjectIcon())); - appenderTypeForm.add(newObjectIcon); +// appenderTypeForm.add(newObjectIcon); + bar.add(newObjectIcon); List appendersChoicesList = new ArrayList<>(); appendersChoicesList.add(FileAppenderConfigurationType.COMPLEX_TYPE); appendersChoicesList.add(SyslogAppenderConfigurationType.COMPLEX_TYPE); DropDownChoicePanel appenderChoice = new DropDownChoicePanel<>( - ID_APPENDERS_CHOICE, + idButton, new Model<>(FileAppenderConfigurationType.COMPLEX_TYPE), Model.ofList(appendersChoicesList), - new QNameIChoiceRenderer("LoggingConfigurationTabPanel." + ID_APPENDERS_CHOICE)); + new QNameIChoiceRenderer("LoggingConfigurationTabPanel.appendersChoice")); appenderChoice.setOutputMarkupId(true); - appenderTypeForm.addOrReplace(appenderChoice); - return searchContainer; + LoggingConfigurationTabPanel.this.appenderChoice = appenderChoice; + bar.add(appenderChoice); +// appenderTypeForm.addOrReplace(appenderChoice); +// bar.add(appenderTypeForm); + return bar; } }; add(appendersMultivalueContainerListPanel); @@ -345,7 +348,7 @@ private void loggerEditPerformed(AjaxRequestTarget target, IModel appenderModel) { - DropDownChoicePanel appendersChoice = (DropDownChoicePanel) getAppendersMultivalueContainerListPanel().getTable().getFooterButtonToolbar().get(createComponentPath(ID_CHOICE_APPENDER_TYPE_FORM, ID_APPENDERS_CHOICE)); + DropDownChoicePanel appendersChoice = appenderChoice; PrismContainerValue newObjectPolicy = null; if (QNameUtil.match(appendersChoice.getModel().getObject(), FileAppenderConfigurationType.COMPLEX_TYPE)) { newObjectPolicy = new FileAppenderConfigurationType().asPrismContainerValue(); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentPanel.java index 7eb84901d89..22343faf9bc 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentPanel.java @@ -226,15 +226,6 @@ protected List initSearchableItems(PrismContainerDefinitio return createSearchableItems(containerDef); } - @Override - protected WebMarkupContainer initButtonToolbar(String id) { - WebMarkupContainer buttonToolbar = initCustomButtonToolbar(id); - if (buttonToolbar == null) { - return super.initButtonToolbar(id); - } - return buttonToolbar; - } - }; multivalueContainerListPanel.add(new VisibleBehaviour(() -> getModel() != null && getModelObject() != null)); add(multivalueContainerListPanel); @@ -306,15 +297,6 @@ private List getAssignmentObjectRelationList() { } } - protected Fragment initCustomButtonToolbar(String contentAreaId) { - Fragment searchContainer = new Fragment(contentAreaId, ID_BUTTON_TOOLBAR_FRAGMENT, this); - - MultiCompositedButtonPanel newObjectIcon = getMultivalueContainerListPanel().getNewItemButton(ID_NEW_ITEM_BUTTON); - searchContainer.add(newObjectIcon); - - return searchContainer; - } - protected List createSearchableItems(PrismContainerDefinition containerDef) { List defs = new ArrayList<>(); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/data/BoxedTablePanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/data/BoxedTablePanel.java index 9e20c8d6392..6621d271f12 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/data/BoxedTablePanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/data/BoxedTablePanel.java @@ -297,8 +297,8 @@ protected void onPageChanged(AjaxRequestTarget target, long page) { @Override protected boolean isCountingDisabled(){ - if (dataTable.getDataProvider() instanceof SelectableBeanObjectDataProvider){ - return !((SelectableBeanObjectDataProvider)dataTable.getDataProvider()).isUseObjectCounting(); + if (dataTable.getDataProvider() instanceof SelectableBeanContainerDataProvider){ + return !((SelectableBeanContainerDataProvider)dataTable.getDataProvider()).isUseObjectCounting(); } return super.isCountingDisabled(); } 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 8c44d1c33fa..4298fd4ba1f 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 @@ -13,9 +13,12 @@ import javax.xml.namespace.QName; import com.evolveum.midpoint.gui.api.component.path.ItemPathDto; +import com.evolveum.midpoint.gui.api.page.PageBase; +import com.evolveum.midpoint.model.api.authentication.CompiledObjectCollectionView; +import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.util.*; -import com.evolveum.midpoint.xml.ns._public.common.audit_3.AuditEventRecordType; +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; @@ -29,11 +32,12 @@ import com.evolveum.midpoint.prism.query.QueryFactory; import com.evolveum.midpoint.prism.query.RefFilter; import com.evolveum.midpoint.schema.constants.SchemaConstants; -import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; import com.evolveum.prism.xml.ns._public.query_3.SearchFilterType; +import org.jetbrains.annotations.NotNull; + /** * @author Viliam Repan (lazyman) */ @@ -61,6 +65,7 @@ public class Search implements Serializable, DebugDumpable { private final List availableDefinitions = new ArrayList<>(); private final List items = new ArrayList<>(); + private CompiledObjectCollectionView dashboardWidgetView; public Search(Class type, List allDefinitions) { this(type, allDefinitions, false, null); @@ -86,6 +91,14 @@ public List getItems() { return Collections.unmodifiableList(items); } + public void setCollectionView(CompiledObjectCollectionView compiledView) { + dashboardWidgetView = compiledView; + } + + public CompiledObjectCollectionView getCollectionView() { + return dashboardWidgetView; + } + public List getPropertyItems() { List propertyItems = new ArrayList<>(); items.forEach(item -> { @@ -189,18 +202,18 @@ public Class getType() { return type; } - public ObjectQuery createObjectQuery(PrismContext ctx) { + public ObjectQuery createObjectQuery(PageBase pageBase) { LOGGER.debug("Creating query from {}", this); if (SearchBoxModeType.ADVANCED.equals(searchType)) { - return createObjectQueryAdvanced(ctx); + return createObjectQueryAdvanced(pageBase); } else if (SearchBoxModeType.FULLTEXT.equals(searchType)) { - return createObjectQueryFullText(ctx); + return createObjectQueryFullText(pageBase); } else { - return createObjectQuerySimple(ctx); + return createObjectQuerySimple(pageBase); } } - public ObjectQuery createObjectQuerySimple(PrismContext ctx) { + public ObjectQuery createObjectQuerySimple(PageBase pageBase) { List searchItems = getItems(); if (searchItems.isEmpty()) { return null; @@ -208,7 +221,7 @@ public ObjectQuery createObjectQuerySimple(PrismContext ctx) { List conditions = new ArrayList<>(); for (PropertySearchItem item : getPropertyItems()) { - ObjectFilter filter = createFilterForSearchItem(item, ctx); + ObjectFilter filter = createFilterForSearchItem(item, pageBase.getPrismContext()); if (filter != null) { conditions.add(filter); } @@ -218,7 +231,7 @@ public ObjectQuery createObjectQuerySimple(PrismContext ctx) { if (item.isApplyFilter()) { SearchFilterType filter = item.getPredefinedFilter().getFilter(); try { - ObjectFilter convertedFilter = ctx.getQueryConverter().parseFilter(filter, getType()); + ObjectFilter convertedFilter = pageBase.getQueryConverter().parseFilter(filter, getType()); if (convertedFilter != null) { conditions.add(convertedFilter); } @@ -228,15 +241,20 @@ public ObjectQuery createObjectQuerySimple(PrismContext ctx) { } } - QueryFactory queryFactory = ctx.queryFactory(); + QueryFactory queryFactory = pageBase.getPrismContext().queryFactory(); + ObjectQuery query; switch (conditions.size()) { case 0: - return null; + query = null; + break; case 1: - return queryFactory.createQuery(conditions.get(0)); + query = queryFactory.createQuery(conditions.get(0)); + break; default: - return queryFactory.createQuery(queryFactory.createAnd(conditions)); + query = queryFactory.createQuery(queryFactory.createAnd(conditions)); } + query = mergeWithCollectionFilter(query, pageBase); + return query; } private ObjectFilter createFilterForSearchItem(PropertySearchItem item, PrismContext ctx) { @@ -374,16 +392,17 @@ public void setFullText(String fullText) { this.fullText = fullText; } - public ObjectQuery createObjectQueryAdvanced(PrismContext ctx) { + public ObjectQuery createObjectQueryAdvanced(PageBase pageBase) { try { advancedError = null; - ObjectFilter filter = createAdvancedObjectFilter(ctx); + ObjectFilter filter = createAdvancedObjectFilter(pageBase.getPrismContext()); if (filter == null) { return null; } - - return ctx.queryFactory().createQuery(filter); + @NotNull ObjectQuery query = pageBase.getPrismContext().queryFactory().createQuery(filter); + mergeWithCollectionFilter(query, pageBase); + return query; } catch (Exception ex) { advancedError = createErrorMessage(ex); } @@ -391,13 +410,25 @@ public ObjectQuery createObjectQueryAdvanced(PrismContext ctx) { return null; } - public ObjectQuery createObjectQueryFullText(PrismContext ctx) { + private ObjectQuery mergeWithCollectionFilter(ObjectQuery query, PageBase pageBase) { + if (getCollectionView() != null && getCollectionView().getFilter() != null) { + if (query == null) { + query = pageBase.getPrismContext().queryFor(getType()).build(); + } + OperationResult result = new OperationResult("Evaluate_view_filter"); + query.addFilter(WebComponentUtil.evaluateExpressionsInFilter(getCollectionView().getFilter(), result, pageBase)); + } + return query; + } + + public ObjectQuery createObjectQueryFullText(PageBase pageBase) { if (StringUtils.isEmpty(fullText)) { return null; } - ObjectQuery query = ctx.queryFor(type) + ObjectQuery query = pageBase.getPrismContext().queryFor(type) .fullText(fullText) .build(); + mergeWithCollectionFilter(query, pageBase); return query; } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/SearchFormPanel.html b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/SearchFormPanel.html index 212ab1f5562..bd1a83edc90 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/SearchFormPanel.html +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/SearchFormPanel.html @@ -6,7 +6,7 @@ ~ and European Union Public License. See LICENSE file for details. --> -
+
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/SearchPanel.html b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/SearchPanel.html index edcee35285c..e14e431edf9 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/SearchPanel.html +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/SearchPanel.html @@ -6,6 +6,9 @@ ~ and European Union Public License. See LICENSE file for details. --> +
+
+
-
+
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/SpecialPopoverSearchPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/SpecialPopoverSearchPanel.java index 40ef1055283..81f42d3b5e7 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/SpecialPopoverSearchPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/SpecialPopoverSearchPanel.java @@ -68,7 +68,6 @@ public void onClick(AjaxRequestTarget target) { add(popover); WebMarkupContainer searchPopupPanel = createPopupPopoverPanel(ID_POPOVER_PANEL); - searchPopupPanel.setRenderBodyOnly(true); popover.add(searchPopupPanel); } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/cases/ChildCasesTabPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/cases/ChildCasesTabPanel.java index 97acfe10652..a73a01264a4 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/cases/ChildCasesTabPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/cases/ChildCasesTabPanel.java @@ -128,11 +128,6 @@ protected UserProfileStorage.TableId getTableId() { return UserProfileStorage.TableId.PAGE_CASE_CHILD_CASES_TAB; } - @Override - protected WebMarkupContainer initButtonToolbar(String id) { - return null; - } - @Override protected List createInlineMenu(){ return new ArrayList<>(); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageDebugList.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageDebugList.java index f8bca592710..c4f78d332c2 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageDebugList.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageDebugList.java @@ -229,7 +229,7 @@ protected PageStorage getPageStorage() { } }; DebugSearchDto search = searchModel.getObject(); - ObjectQuery query = search.getSearch().createObjectQuery(getPrismContext()); + ObjectQuery query = search.getSearch().createObjectQuery(this); provider.setQuery(createQuery(query)); create(provider); @@ -569,7 +569,7 @@ private void listObjectsPerformed(AjaxRequestTarget target, boolean isOidSearch) setupSearchDto(dto); Search search = dto.getSearch(); - ObjectQuery query = search.createObjectQuery(getPrismContext()); + ObjectQuery query = search.createObjectQuery(this); listObjectsPerformed(query, isOidSearch, target); } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/component/AuditLogViewerPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/component/AuditLogViewerPanel.java index 81167e976fc..6149fb48515 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/component/AuditLogViewerPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/component/AuditLogViewerPanel.java @@ -11,17 +11,29 @@ import java.time.LocalDate; import java.time.ZoneId; import java.util.*; -import javax.xml.datatype.XMLGregorianCalendar; import javax.xml.namespace.QName; +import com.evolveum.midpoint.gui.api.GuiStyleConstants; +import com.evolveum.midpoint.gui.api.component.MainObjectListPanel; +import com.evolveum.midpoint.gui.api.component.button.CsvDownloadButtonPanel; import com.evolveum.midpoint.gui.impl.GuiChannel; +import com.evolveum.midpoint.gui.impl.component.AjaxCompositedIconButton; +import com.evolveum.midpoint.gui.impl.component.icon.CompositedIconBuilder; +import com.evolveum.midpoint.gui.impl.component.icon.IconCssStyle; +import com.evolveum.midpoint.gui.impl.component.icon.LayeredIconCssStyle; +import com.evolveum.midpoint.model.api.authentication.CompiledObjectCollectionView; +import com.evolveum.midpoint.prism.PrismContext; +import com.evolveum.midpoint.prism.PrismObject; +import com.evolveum.midpoint.prism.PrismObjectDefinition; import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.query.*; 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; import com.evolveum.midpoint.util.MiscUtil; +import com.evolveum.midpoint.util.QNameUtil; import com.evolveum.midpoint.util.exception.*; import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; @@ -32,18 +44,27 @@ import com.evolveum.midpoint.web.component.search.SearchFactory; import com.evolveum.midpoint.web.component.util.SelectableBean; +import com.evolveum.midpoint.web.component.util.SelectableBeanImpl; +import com.evolveum.midpoint.web.component.util.VisibleEnableBehaviour; import com.evolveum.midpoint.web.session.AuditLogStorage; import com.evolveum.midpoint.web.session.PageStorage; import com.evolveum.midpoint.web.session.SessionStorage; import com.evolveum.midpoint.web.session.UserProfileStorage; +import com.evolveum.midpoint.xml.ns._public.common.common_3.*; + import org.apache.wicket.AttributeModifier; +import org.apache.wicket.Component; +import org.apache.wicket.ajax.AjaxRequestTarget; +import org.apache.wicket.behavior.AttributeAppender; import org.apache.wicket.extensions.markup.html.repeater.data.grid.ICellPopulator; import org.apache.wicket.extensions.markup.html.repeater.data.sort.SortOrder; +import org.apache.wicket.extensions.markup.html.repeater.data.table.DataTable; import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn; import org.apache.wicket.extensions.markup.html.repeater.data.table.PropertyColumn; import org.apache.wicket.extensions.markup.html.repeater.util.SortParam; +import org.apache.wicket.markup.html.WebMarkupContainer; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.repeater.Item; import org.apache.wicket.model.IModel; @@ -54,13 +75,12 @@ import com.evolveum.midpoint.gui.api.util.WebComponentUtil; import com.evolveum.midpoint.gui.api.util.WebModelServiceUtils; import com.evolveum.midpoint.gui.impl.component.ContainerableListPanel; -import com.evolveum.midpoint.prism.xml.XmlTypeConverter; import com.evolveum.midpoint.web.component.data.column.LinkColumn; import com.evolveum.midpoint.web.component.menu.cog.InlineMenuItem; import com.evolveum.midpoint.web.page.admin.reports.PageAuditLogDetails; import com.evolveum.midpoint.xml.ns._public.common.audit_3.AuditEventRecordType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ExpressionType; +import org.apache.wicket.util.string.StringValue; import org.jetbrains.annotations.NotNull; /** @@ -97,22 +117,6 @@ protected List createInlineMenu() { return null; } - @Override - protected ObjectQuery getCustomizeContentQuery() { - ObjectQuery query = null; - PageStorage pageStorage = getPageStorage(); - if (pageStorage != null && pageStorage.getSearch() == null) { - Date todayDate = Date.from(LocalDate.now().atStartOfDay(ZoneId.systemDefault()).toInstant()); - XMLGregorianCalendar todayStartTimestamp = XmlTypeConverter.createXMLGregorianCalendar(todayDate); - ObjectFilter todayTimestampFilter = getPageBase().getPrismContext().queryFor(AuditEventRecordType.class) - .item(AuditEventRecordType.F_TIMESTAMP) - .gt(todayStartTimestamp) - .buildFilter(); - query = getPageBase().getPrismContext().queryFactory().createQuery(todayTimestampFilter); - } - return query; - } - @Override protected IColumn, String> createNameColumn(IModel columnNameModel, String itemPath, ExpressionType expression) { @@ -134,7 +138,7 @@ protected Search createSearch() { AuditLogStorage storage = (AuditLogStorage) getPageStorage(); Search search = SearchFactory.createContainerSearch(getType(), AuditEventRecordType.F_TIMESTAMP, getPageBase()); DateSearchItem timestampItem = (DateSearchItem) search.findPropertySearchItem(AuditEventRecordType.F_TIMESTAMP); - if (timestampItem.getFromDate() == null && timestampItem.getToDate() == null) { + if (timestampItem.getFromDate() == null && timestampItem.getToDate() == null && !isCollectionViewPanelForWidget()) { Date todayDate = Date.from(LocalDate.now().atStartOfDay(ZoneId.systemDefault()).toInstant()); timestampItem.setFromDate(MiscUtil.asXMLGregorianCalendar(todayDate)); } @@ -148,6 +152,12 @@ protected UserProfileStorage.TableId getTableId() { @Override protected String getStorageKey() { + if (isCollectionViewPanelForCompiledView()) { + StringValue collectionName = getCollectionNameParameterValue(); + String collectionNameValue = collectionName != null ? collectionName.toString() : ""; + return WebComponentUtil.getObjectListPageStorageKey(collectionNameValue); + } + return SessionStorage.KEY_AUDIT_LOG; } @@ -197,16 +207,62 @@ protected List createObjectOrderings(SortParam sortParam return provider; } + @Override + protected List createToolbarButtonsList(String idButton) { + List buttonsList = new ArrayList<>(); + CsvDownloadButtonPanel exportDataLink = new CsvDownloadButtonPanel(idButton) { + + private static final long serialVersionUID = 1L; + + @Override + protected String getFilename() { + return "AuditLogViewer_" + createStringResource("MainObjectListPanel.exportFileName").getString(); + } + + @Override + protected DataTable getDataTable() { + return getTable().getDataTable(); + } + }; + exportDataLink.add(new VisibleEnableBehaviour() { + private static final long serialVersionUID = 1L; + + @Override + public boolean isVisible() { + return WebComponentUtil.isAuthorized(AuthorizationConstants.AUTZ_UI_ADMIN_CSV_EXPORT_ACTION_URI); + } + }); + buttonsList.add(exportDataLink); + + + AjaxCompositedIconButton createReport = new AjaxCompositedIconButton(idButton, WebComponentUtil.createCreateReportIcon(), + getPageBase().createStringResource("MainObjectListPanel.createReport")) { + + private static final long serialVersionUID = 1L; + + @Override + public void onClick(AjaxRequestTarget target) { + createReportPerformed(target); + } + }; + createReport.add(AttributeAppender.append("class", "btn btn-default btn-sm btn-margin-right")); + buttonsList.add(createReport); + return buttonsList; + } }; auditLogViewerTable.setOutputMarkupId(true); add(auditLogViewerTable); } + private ContainerableListPanel getAuditLogViewerTable() { + return (ContainerableListPanel) get(ID_AUDIT_LOG_VIEWER_TABLE); + } + protected List, String>> createColumns() { List, String>> columns = new ArrayList<>(); LinkColumn> initiatorRefColumn = new LinkColumn>(createStringResource("AuditEventRecordType.initiatorRef"), - AuditEventRecordType.F_INITIATOR_REF.getLocalPart()) { + SelectableBeanImpl.F_VALUE + "." + AuditEventRecordType.F_INITIATOR_REF.getLocalPart()) { private static final long serialVersionUID = 1L; @Override @@ -226,8 +282,8 @@ public void onClick(IModel> rowModel) { if (!isObjectHistoryPanel()) { IColumn, String> eventStageColumn = new PropertyColumn, String>( - createStringResource("PageAuditLogViewer.eventStageLabel"), - AuditEventRecordType.F_EVENT_STAGE.getLocalPart(), AuditEventRecordType.F_EVENT_STAGE.getLocalPart()) { + createStringResource("PageAuditLogViewer.eventStageLabel"), AuditEventRecordType.F_EVENT_STAGE.getLocalPart(), + SelectableBeanImpl.F_VALUE + "." + AuditEventRecordType.F_EVENT_STAGE.getLocalPart()) { private static final long serialVersionUID = 1L; @Override @@ -240,8 +296,8 @@ public IModel getDataModel(IModel> } IColumn, String> eventTypeColumn = - new PropertyColumn, String>(createStringResource("PageAuditLogViewer.eventTypeLabel"), - AuditEventRecordType.F_EVENT_TYPE.getLocalPart(), AuditEventRecordType.F_EVENT_TYPE.getLocalPart()) { + new PropertyColumn, String>(createStringResource("PageAuditLogViewer.eventTypeLabel"), AuditEventRecordType.F_EVENT_TYPE.getLocalPart(), + SelectableBeanImpl.F_VALUE + "." + AuditEventRecordType.F_EVENT_TYPE.getLocalPart()) { private static final long serialVersionUID = 1L; @Override @@ -254,7 +310,7 @@ public IModel getDataModel(IModel> if (!isObjectHistoryPanel()) { LinkColumn> targetRefColumn = new LinkColumn>(createStringResource("AuditEventRecordType.targetRef"), - AuditEventRecordType.F_TARGET_REF.getLocalPart()) { + SelectableBeanImpl.F_VALUE + "." + AuditEventRecordType.F_TARGET_REF.getLocalPart()) { private static final long serialVersionUID = 1L; @Override @@ -275,7 +331,7 @@ public void onClick(IModel> rowModel) { if (!isObjectHistoryPanel()) { LinkColumn> targetOwnerRefColumn = new LinkColumn>(createStringResource("AuditEventRecordType.targetOwnerRef"), - AuditEventRecordType.F_TARGET_OWNER_REF.getLocalPart()) { + SelectableBeanImpl.F_VALUE + "." + AuditEventRecordType.F_TARGET_OWNER_REF.getLocalPart()) { private static final long serialVersionUID = 1L; @Override @@ -294,8 +350,8 @@ public void onClick(IModel> rowModel) { } IColumn, String> channelColumn = new PropertyColumn, String>( - createStringResource("AuditEventRecordType.channel"), - AuditEventRecordType.F_CHANNEL.getLocalPart(), AuditEventRecordType.F_CHANNEL.getLocalPart()) { + createStringResource("AuditEventRecordType.channel"), AuditEventRecordType.F_CHANNEL.getLocalPart(), + SelectableBeanImpl.F_VALUE + "." + AuditEventRecordType.F_CHANNEL.getLocalPart()) { private static final long serialVersionUID = 1L; @Override @@ -322,8 +378,8 @@ public void populateItem(Item, String> outcomeColumn = new PropertyColumn, String>( - createStringResource("PageAuditLogViewer.outcomeLabel"), - AuditEventRecordType.F_OUTCOME.getLocalPart(), AuditEventRecordType.F_OUTCOME.getLocalPart()) { + createStringResource("PageAuditLogViewer.outcomeLabel"), AuditEventRecordType.F_OUTCOME.getLocalPart(), + SelectableBeanImpl.F_VALUE + "." + AuditEventRecordType.F_OUTCOME.getLocalPart()) { private static final long serialVersionUID = 1L; @Override @@ -338,7 +394,7 @@ public IModel getDataModel(IModel> private IColumn, String> createNameColumn() { return new LinkColumn>(createStringResource("AuditEventRecordType.timestamp"), AuditEventRecordType.F_TIMESTAMP.getLocalPart(), - AuditEventRecordType.F_TIMESTAMP.getLocalPart()) { + SelectableBeanImpl.F_VALUE + "." + AuditEventRecordType.F_TIMESTAMP.getLocalPart()) { private static final long serialVersionUID = 1L; @Override diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/roles/PageRoles.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/roles/PageRoles.java index ea0f7351c1c..ad3d0ce656a 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/roles/PageRoles.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/roles/PageRoles.java @@ -65,28 +65,10 @@ public PageRoles() { super(); } - private FocusListInlineMenuHelper listInlineMenuHelper; - @Override protected void onInitialize() { super.onInitialize(); initLayout(); - initListInlineMenuHelper(); - } - - private void initListInlineMenuHelper() { - listInlineMenuHelper = new FocusListInlineMenuHelper(RoleType.class, this, getObjectListPanel()){ - private static final long serialVersionUID = 1L; - - protected boolean isShowConfirmationDialog(ColumnMenuAction action){ - return PageRoles.this.isShowConfirmationDialog(action); - } - - protected IModel getConfirmationMessageModel(ColumnMenuAction action, String actionName){ - return PageRoles.this.getConfirmationMessageModel(action, actionName); - } - - }; } protected void initLayout() { @@ -107,6 +89,18 @@ protected UserProfileStorage.TableId getTableId() { @Override protected List createInlineMenu() { + FocusListInlineMenuHelper listInlineMenuHelper = new FocusListInlineMenuHelper(RoleType.class, PageRoles.this, this){ + private static final long serialVersionUID = 1L; + + protected boolean isShowConfirmationDialog(ColumnMenuAction action){ + return PageRoles.this.isShowConfirmationDialog(action); + } + + protected IModel getConfirmationMessageModel(ColumnMenuAction action, String actionName){ + return PageRoles.this.getConfirmationMessageModel(action, actionName); + } + + }; return listInlineMenuHelper.createRowActions(getType()); } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/TaskSubtasksAndThreadsTabPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/TaskSubtasksAndThreadsTabPanel.java index a30e71709ba..24995934fb4 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/TaskSubtasksAndThreadsTabPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/TaskSubtasksAndThreadsTabPanel.java @@ -95,11 +95,6 @@ protected String translate(Enum en) { protected UserProfileStorage.TableId getTableId() { return UserProfileStorage.TableId.TABLE_SUBTASKS; } - - @Override - protected WebMarkupContainer initButtonToolbar(String id) { - return null; - } }; add(subtasksPanel); @@ -119,11 +114,6 @@ protected UserProfileStorage.TableId getTableId() { return UserProfileStorage.TableId.TABLE_WORKERS; } - @Override - protected WebMarkupContainer initButtonToolbar(String id) { - return null; - } - @Override protected boolean isHeaderVisible() { return false; diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/services/PageServices.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/services/PageServices.java index 803c8e6050c..94bfb2714c5 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/services/PageServices.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/services/PageServices.java @@ -23,10 +23,12 @@ import com.evolveum.midpoint.web.component.util.FocusListInlineMenuHelper; import com.evolveum.midpoint.web.component.util.SelectableBean; import com.evolveum.midpoint.web.page.admin.PageAdmin; +import com.evolveum.midpoint.web.page.admin.roles.PageRoles; import com.evolveum.midpoint.web.session.UserProfileStorage; import com.evolveum.midpoint.web.util.OnePageParameterEncoder; import com.evolveum.midpoint.xml.ns._public.common.common_3.AbstractRoleType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.RoleType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ServiceType; import org.apache.wicket.ajax.AjaxRequestTarget; @@ -69,27 +71,10 @@ public PageServices() { super(); } - private FocusListInlineMenuHelper listInlineMenuHelper; - @Override protected void onInitialize() { super.onInitialize(); initLayout(); - initListInlineMenuHelper(); - } - - private void initListInlineMenuHelper() { - listInlineMenuHelper = new FocusListInlineMenuHelper(ServiceType.class, this, getObjectListPanel()) { - private static final long serialVersionUID = 1L; - - protected boolean isShowConfirmationDialog(ColumnMenuAction action) { - return PageServices.this.isShowConfirmationDialog(action); - } - - protected IModel getConfirmationMessageModel(ColumnMenuAction action, String actionName) { - return PageServices.this.getConfirmationMessageModel(action, actionName); - } - }; } protected void initLayout() { @@ -110,6 +95,17 @@ protected UserProfileStorage.TableId getTableId() { @Override protected List createInlineMenu() { + FocusListInlineMenuHelper listInlineMenuHelper = new FocusListInlineMenuHelper(ServiceType.class, PageServices.this, this) { + private static final long serialVersionUID = 1L; + + protected boolean isShowConfirmationDialog(ColumnMenuAction action) { + return PageServices.this.isShowConfirmationDialog(action); + } + + protected IModel getConfirmationMessageModel(ColumnMenuAction action, String actionName) { + return PageServices.this.getConfirmationMessageModel(action, actionName); + } + }; return listInlineMenuHelper.createRowActions(getType()); } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/self/AbstractShoppingCartTabPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/self/AbstractShoppingCartTabPanel.java index e42e5a8914e..6ce3d7eb14c 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/self/AbstractShoppingCartTabPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/self/AbstractShoppingCartTabPanel.java @@ -448,7 +448,7 @@ protected ObjectQuery createContentQuery() { // } SearchPanel searchPanel = getSearchPanel(); - ObjectQuery searchQuery = searchPanel.getModelObject().createObjectQuery(getPageBase().getPrismContext()); + ObjectQuery searchQuery = searchPanel.getModelObject().createObjectQuery(getPageBase()); if (searchQuery != null && searchQuery.getFilter() != null) { memberQuery.addFilter(searchQuery.getFilter()); } 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 5b71c2d1d7f..6437c370363 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 @@ -16620,6 +16620,7 @@ + diff --git a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/util/DefaultColumnUtils.java b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/util/DefaultColumnUtils.java index e6dc542f459..2931dc67c70 100644 --- a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/util/DefaultColumnUtils.java +++ b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/util/DefaultColumnUtils.java @@ -16,7 +16,6 @@ import com.evolveum.midpoint.prism.Containerable; import com.evolveum.midpoint.prism.PrismContainer; -import com.evolveum.midpoint.prism.path.ItemName; import com.evolveum.midpoint.xml.ns._public.common.audit_3.AuditEventRecordCustomColumnPropertyType; import com.google.common.collect.ImmutableMap; @@ -46,26 +45,23 @@ public class DefaultColumnUtils { private static final Trace LOGGER = TraceManager.getTrace(DefaultColumnUtils.class); // Maps need to preserve iteration order (like LinkedHashMap) - private static final Map, List> COLUMNS_DEF; + private static final Map, List> COLUMNS_DEF; private static final List OBJECT_COLUMNS_DEF; - private static final List DEFAULT_AUDIT_COLUMNS_DEF; static { OBJECT_COLUMNS_DEF = Collections.singletonList(new ColumnWrapper(ObjectType.F_NAME)); - DEFAULT_AUDIT_COLUMNS_DEF = Arrays.asList( - AuditEventRecordType.F_TIMESTAMP, - AuditEventRecordType.F_INITIATOR_REF, - AuditEventRecordType.F_EVENT_STAGE, - AuditEventRecordType.F_EVENT_TYPE, - AuditEventRecordType.F_TARGET_REF, - AuditEventRecordType.F_OUTCOME, - AuditEventRecordType.F_MESSAGE, - AuditEventRecordType.F_DELTA - ); - - COLUMNS_DEF = ImmutableMap., List>builder() + COLUMNS_DEF = ImmutableMap., List>builder() + .put(AuditEventRecordType.class, Arrays.asList( + new ColumnWrapper(AuditEventRecordType.F_TIMESTAMP, true), + new ColumnWrapper(AuditEventRecordType.F_INITIATOR_REF), + new ColumnWrapper(AuditEventRecordType.F_EVENT_STAGE), + new ColumnWrapper(AuditEventRecordType.F_EVENT_TYPE), + new ColumnWrapper(AuditEventRecordType.F_TARGET_REF), + new ColumnWrapper(AuditEventRecordType.F_OUTCOME), + new ColumnWrapper(AuditEventRecordType.F_MESSAGE), + new ColumnWrapper(AuditEventRecordType.F_DELTA))) .put(ResourceType.class, Arrays.asList( new ColumnWrapper(ResourceType.F_NAME), new ColumnWrapper(ItemPath.create(ResourceType.F_CONNECTOR_REF, ConnectorType.F_CONNECTOR_TYPE), "ConnectorType.connectorType"), @@ -108,7 +104,7 @@ public class DefaultColumnUtils { .build(); } - private static List getColumnsForType(Class type) { + private static List getColumnsForType(Class type) { if (type.equals(RoleType.class) || type.equals(OrgType.class) || type.equals(ServiceType.class)) { @@ -141,6 +137,8 @@ public static GuiObjectListViewType getDefaultView(Cla return getDefaultShadowView(); } else if (AccessCertificationDefinitionType.class.equals(type)) { return getDefaultAccessCertificationDefinitionView(); + } else if (AuditEventRecordType.class.equals(type)) { + return getDefaultAuditEventsView(); } else if (ObjectType.class.isAssignableFrom(type)){ return getDefaultObjectView(); } @@ -148,24 +146,7 @@ public static GuiObjectListViewType getDefaultView(Cla } public static GuiObjectListViewType getDefaultAuditEventsView() { - GuiObjectListViewType view = new GuiObjectListViewType(); - view.setType(AuditEventRecordType.COMPLEX_TYPE); - view.setIdentifier("default-audit-event"); - view.createColumnList(); - List columns = view.getColumn(); - String previousColumn = null; - for (ItemPath defaultColumn : DEFAULT_AUDIT_COLUMNS_DEF) { - String columnName = defaultColumn.lastName().getLocalPart() + "Column"; - GuiObjectColumnType column = new GuiObjectColumnType(); - column.setName(columnName); - column.setPreviousColumn(previousColumn); - ItemPathType itemPathType = new ItemPathType(); - itemPathType.setItemPath(defaultColumn); - column.setPath(itemPathType); - columns.add(column); - previousColumn = columnName; - } - return view; + return getDefaultView(AuditEventRecordType.COMPLEX_TYPE, "default-audit-event", AuditEventRecordType.class); } private static GuiObjectListViewType getDefaultAccessCertificationDefinitionView() { @@ -204,8 +185,8 @@ public static GuiObjectListViewType getDefaultObjectView() { return getDefaultView(ObjectType.COMPLEX_TYPE, "default-object", ObjectType.class); } - private static GuiObjectListViewType getDefaultView(QName qname, String identifier, Class type) { + private static GuiObjectListViewType getDefaultView(QName qname, String identifier, Class type) { GuiObjectListViewType view = new GuiObjectListViewType(); view.setType(qname); view.setIdentifier(identifier); @@ -213,7 +194,7 @@ private static GuiObjectListViewType getDefaultView(QName return view; } - private static void createColumns(GuiObjectListViewType view, Class type) { + private static void createColumns(GuiObjectListViewType view, Class type) { view.createColumnList(); List columns = view.getColumn(); List defaultColumns = getColumnsForType(type);