syncope-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From fmarte...@apache.org
Subject [2/2] syncope git commit: [SYNCOPE-156] provides any object create/update result page + several refactorings
Date Tue, 12 Jan 2016 15:32:18 GMT
[SYNCOPE-156] provides any object create/update result page + several refactorings


Project: http://git-wip-us.apache.org/repos/asf/syncope/repo
Commit: http://git-wip-us.apache.org/repos/asf/syncope/commit/03d7de33
Tree: http://git-wip-us.apache.org/repos/asf/syncope/tree/03d7de33
Diff: http://git-wip-us.apache.org/repos/asf/syncope/diff/03d7de33

Branch: refs/heads/master
Commit: 03d7de338dfee8ba16608f07df4e89995641d76f
Parents: d5296ca
Author: fmartelli <fabio.martelli@gmail.com>
Authored: Tue Jan 12 16:31:53 2016 +0100
Committer: fmartelli <fabio.martelli@gmail.com>
Committed: Tue Jan 12 16:31:53 2016 +0100

----------------------------------------------------------------------
 .../client/console/commons/Constants.java       |  10 +
 .../console/commons/status/StatusUtils.java     |  14 -
 .../console/pages/BulkActionModalPage.java      |   5 +-
 .../client/console/pages/ResultStatusModal.java | 428 -------------------
 .../panels/AbstractSearchResultPanel.java       |   4 +-
 .../console/panels/AjaxDataTablePanel.java      |   8 +-
 .../panels/AnyObjectSearchResultPanel.java      | 169 ++------
 .../console/panels/AnySearchResultPanel.java    | 195 +++++++++
 .../console/panels/AnyTypeClassesPanel.java     |  14 +-
 .../client/console/panels/AnyTypePanel.java     |  11 +-
 .../console/panels/FailureMessageModal.java     |  24 +-
 .../console/panels/GroupSearchResultPanel.java  |  25 +-
 .../syncope/client/console/panels/Realm.java    |   6 +-
 .../console/panels/RelationshipTypePanel.java   |  11 +-
 .../console/panels/RoleSearchResultPanel.java   |   8 +-
 .../client/console/panels/SchemaTypePanel.java  |  14 +-
 .../console/panels/SecurityQuestionsPanel.java  |  11 +-
 .../console/panels/UserSearchResultPanel.java   |  25 +-
 .../AnyObjectSelectionSearchResultPanel.java    |   5 +
 .../search/AnySelectionSearchResultPanel.java   |   9 +-
 .../search/GroupSelectionSearchResultPanel.java |   5 +
 .../search/UserSelectionSearchResultPanel.java  |   5 +
 .../markup/html/bootstrap/dialog/BaseModal.java |   1 +
 .../wicket/markup/html/form/ActionLink.java     |   3 +-
 .../markup/html/form/ActionLinksPanel.java      |  32 +-
 .../wizards/AbstractModalPanelBuilder.java      |   2 +-
 .../client/console/wizards/AjaxWizard.java      |  25 +-
 .../console/wizards/AjaxWizardBuilder.java      |   4 +-
 .../console/wizards/AjaxWizardButtonBar.java    |   6 +
 .../client/console/wizards/WizardMgtPanel.java  |  78 +++-
 .../wizards/any/AnyObjectWizardBuilder.java     | 141 ++----
 .../console/wizards/any/AnyWizardBuilder.java   |  33 +-
 .../console/wizards/any/ConnObjectPanel.java    |  97 ++++-
 .../console/wizards/any/GroupWizardBuilder.java |   7 +-
 .../client/console/wizards/any/ResultPage.java  |  77 ++++
 .../client/console/wizards/any/StatusPanel.java |  98 ++++-
 .../console/wizards/any/UserWizardBuilder.java  |   7 +-
 .../provision/ProvisionWizardBuilder.java       |   3 +-
 .../console/wizards/role/RoleWizardBuilder.java |   4 +-
 .../META-INF/resources/css/syncopeConsole.css   |  26 ++
 .../client/console/pages/ResultStatusModal.html | 226 ----------
 .../console/pages/ResultStatusModal.properties  |  26 --
 .../pages/ResultStatusModal_it.properties       |  26 --
 .../pages/ResultStatusModal_pt_BR.properties    |  26 --
 .../panels/AbstractSearchResultPanel.properties |   2 +
 .../AbstractSearchResultPanel_it.properties     |   2 +
 .../AbstractSearchResultPanel_pt_BR.properties  |   2 +
 .../markup/html/form/ActionLinksPanel.html      |   7 +-
 .../console/wizards/any/ConnObjectPanel.html    |  13 +-
 .../client/console/wizards/any/Details.html     |  10 +-
 .../client/console/wizards/any/ResultPage.html  |  29 ++
 .../console/wizards/any/ResultPage.properties   |  17 +
 .../wizards/any/ResultPage_it.properties        |  17 +
 .../wizards/any/ResultPage_pt_BR.properties     |  17 +
 .../client/console/wizards/any/StatusPanel.html |   4 +-
 55 files changed, 866 insertions(+), 1208 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/syncope/blob/03d7de33/client/console/src/main/java/org/apache/syncope/client/console/commons/Constants.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/commons/Constants.java b/client/console/src/main/java/org/apache/syncope/client/console/commons/Constants.java
index ac38364..e172bd4 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/commons/Constants.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/commons/Constants.java
@@ -118,6 +118,16 @@ public final class Constants {
 
     public static final String PREF_ANY_DERIVED_ATTRIBUTES_VIEW = "any.%s.derived.attributes.view";
 
+    public static final String SUSPENDED_ICON = "glyphicon glyphicon-ban-circle";
+
+    public static final String ACTIVE_ICON = "glyphicon glyphicon-ok-circle";
+
+    public static final String UNDEFINED_ICON = "glyphicon glyphicon-question-sign";
+
+    public static final String NOT_FOUND_ICON = "glyphicon glyphicon-remove-circle";
+
+    ;
+
     /**
      * ConnId's GuardedString is not in the classpath.
      */

http://git-wip-us.apache.org/repos/asf/syncope/blob/03d7de33/client/console/src/main/java/org/apache/syncope/client/console/commons/status/StatusUtils.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/commons/status/StatusUtils.java b/client/console/src/main/java/org/apache/syncope/client/console/commons/status/StatusUtils.java
index 0e5c02f..5a25bed 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/commons/status/StatusUtils.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/commons/status/StatusUtils.java
@@ -178,20 +178,6 @@ public class StatusUtils implements Serializable {
         return statusPatch;
     }
 
-    public ConnObjectTO getConnObjectTO(
-            final Long anyKey, final String resourceName, final List<ConnObjectWrapper> objects) {
-
-        for (ConnObjectWrapper object : objects) {
-            if (anyKey.equals(object.getAny().getKey())
-                    && resourceName.equalsIgnoreCase(object.getResourceName())) {
-
-                return object.getConnObjectTO();
-            }
-        }
-
-        return null;
-    }
-
     public Image getStatusImage(final String componentId, final Status status) {
         final String alt, title, statusName;
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/03d7de33/client/console/src/main/java/org/apache/syncope/client/console/pages/BulkActionModalPage.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/pages/BulkActionModalPage.java b/client/console/src/main/java/org/apache/syncope/client/console/pages/BulkActionModalPage.java
index da5aac2..a376bf4 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/pages/BulkActionModalPage.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/pages/BulkActionModalPage.java
@@ -49,6 +49,8 @@ public class BulkActionModalPage<T extends Serializable, S> extends AbstractModa
 
     private static final long serialVersionUID = 4114026480146090962L;
 
+    private final String pageId = "Any";
+
     public BulkActionModalPage(
             final BaseModal<T> modal,
             final PageReference pageRef,
@@ -56,8 +58,7 @@ public class BulkActionModalPage<T extends Serializable, S> extends AbstractModa
             final List<IColumn<T, S>> columns,
             final Collection<ActionLink.ActionType> actions,
             final BaseRestClient bulkActionExecutor,
-            final String keyFieldName,
-            final String pageId) {
+            final String keyFieldName) {
 
         super(modal, pageRef);
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/03d7de33/client/console/src/main/java/org/apache/syncope/client/console/pages/ResultStatusModal.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/pages/ResultStatusModal.java b/client/console/src/main/java/org/apache/syncope/client/console/pages/ResultStatusModal.java
deleted file mode 100644
index 9507941..0000000
--- a/client/console/src/main/java/org/apache/syncope/client/console/pages/ResultStatusModal.java
+++ /dev/null
@@ -1,428 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.syncope.client.console.pages;
-
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import org.apache.commons.lang3.StringUtils;
-import org.apache.syncope.client.console.commons.ConnIdSpecialAttributeName;
-import org.apache.syncope.client.console.commons.Constants;
-import org.apache.syncope.client.console.commons.Mode;
-import org.apache.syncope.client.console.commons.status.Status;
-import org.apache.syncope.client.console.commons.status.StatusUtils;
-import org.apache.syncope.client.console.panels.AbstractModalPanel;
-import org.apache.syncope.client.console.panels.FailureMessageModal;
-import org.apache.syncope.client.console.rest.UserRestClient;
-import org.apache.syncope.client.console.wicket.markup.html.bootstrap.dialog.BaseModal;
-import org.apache.syncope.common.lib.to.AnyTO;
-import org.apache.syncope.common.lib.to.AttrTO;
-import org.apache.syncope.common.lib.to.ConnObjectTO;
-import org.apache.syncope.common.lib.to.PropagationStatus;
-import org.apache.syncope.common.lib.to.GroupTO;
-import org.apache.syncope.common.lib.to.ProvisioningResult;
-import org.apache.syncope.common.lib.to.UserTO;
-import org.apache.syncope.common.lib.types.PropagationTaskExecStatus;
-import org.apache.wicket.Component;
-import org.apache.wicket.PageReference;
-import org.apache.wicket.ajax.AjaxRequestTarget;
-import org.apache.wicket.ajax.markup.html.AjaxLink;
-import org.apache.wicket.behavior.Behavior;
-import org.apache.wicket.extensions.ajax.markup.html.IndicatingAjaxLink;
-import org.apache.wicket.markup.ComponentTag;
-import org.apache.wicket.markup.html.WebMarkupContainer;
-import org.apache.wicket.markup.html.basic.Label;
-import org.apache.wicket.markup.html.image.Image;
-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.ResourceModel;
-import org.apache.wicket.request.resource.ContextRelativeResource;
-
-/**
- * Show user or group status after performing a successful operation.
- *
- * @param <T> anyTO
- */
-public final class ResultStatusModal<T extends AnyTO> extends AbstractModalPanel<T> {
-
-    private static final long serialVersionUID = 2646115294319713723L;
-
-    private static final String IMG_PREFIX = "/img/statuses/";
-
-    private final ProvisioningResult<AnyTO> provResult;
-
-    private final Mode mode;
-
-    /**
-     * Status management utilities.
-     */
-    private final StatusUtils statusUtils;
-
-    public static class Builder<T extends AnyTO> implements Serializable {
-
-        private static final long serialVersionUID = 220361441802274899L;
-
-        private Mode mode;
-
-        private ProvisioningResult<AnyTO> provResult;
-
-        private final BaseModal<T> modal;
-
-        private final PageReference pageRef;
-
-        public Builder(
-                final BaseModal<T> modal,
-                final PageReference pageRef,
-                final ProvisioningResult<AnyTO> provResult) {
-            this.provResult = provResult;
-            this.modal = modal;
-            this.pageRef = pageRef;
-        }
-
-        public ResultStatusModal.Builder<T> mode(final Mode mode) {
-            this.mode = mode;
-            return this;
-        }
-
-        public ResultStatusModal<T> build() {
-            return new ResultStatusModal<>(modal, pageRef, this);
-        }
-    }
-
-    private ResultStatusModal(
-            final BaseModal<T> modal,
-            final PageReference pageRef,
-            final Builder<T> builder) {
-
-        super(modal, pageRef);
-
-        this.provResult = builder.provResult;
-        statusUtils = new StatusUtils(new UserRestClient());
-        if (builder.mode == null) {
-            this.mode = Mode.ADMIN;
-        } else {
-            this.mode = builder.mode;
-        }
-
-        final WebMarkupContainer container = new WebMarkupContainer("container");
-        container.setOutputMarkupId(true);
-        add(container);
-
-        final Fragment fragment = new Fragment("resultFrag", mode == Mode.SELF
-                ? "userSelfResultFrag"
-                : "propagationResultFrag", this);
-        fragment.setOutputMarkupId(true);
-        container.add(fragment);
-
-        if (mode == Mode.ADMIN) {
-            // add Syncope propagation status
-            PropagationStatus syncope = new PropagationStatus();
-            syncope.setResource("Syncope");
-            syncope.setStatus(PropagationTaskExecStatus.SUCCESS);
-
-            List<PropagationStatus> propagations = new ArrayList<PropagationStatus>();
-            propagations.add(syncope);
-            propagations.addAll(provResult.getPropagationStatuses());
-
-            AnyTO any = provResult.getAny();
-
-            fragment.add(new Label("info",
-                    ((any instanceof UserTO) && ((UserTO) any).getUsername() != null)
-                            ? ((UserTO) any).getUsername()
-                            : ((any instanceof GroupTO) && ((GroupTO) any).getName() != null)
-                                    ? ((GroupTO) any).getName()
-                                    : String.valueOf(any.getKey())));
-
-            final ListView<PropagationStatus> propRes = new ListView<PropagationStatus>("resources",
-                    propagations) {
-
-                private static final long serialVersionUID = -1020475259727720708L;
-
-                @Override
-                protected void populateItem(final ListItem<PropagationStatus> item) {
-                    final PropagationStatus propTO = (PropagationStatus) item.getDefaultModelObject();
-
-                    final ListView<String> attributes = getConnObjectView(propTO);
-
-                    final Fragment attrhead;
-                    if (attributes.getModelObject() == null || attributes.getModelObject().isEmpty()) {
-                        attrhead = new Fragment("attrhead", "emptyAttrHeadFrag", this);
-                    } else {
-                        attrhead = new Fragment("attrhead", "attrHeadFrag", this);
-                    }
-
-                    item.add(attrhead);
-                    item.add(attributes);
-
-                    attrhead.add(new Label("resource", propTO.getResource()));
-
-                    attrhead.add(new Label("propagation", propTO.getStatus() == null
-                            ? "UNDEFINED" : propTO.getStatus().toString()));
-
-                    final Image image;
-                    final String alt, title;
-
-                    final BaseModal<T> failureWindow = new BaseModal<>("failureWindow");
-
-                    final AjaxLink<?> failureWindowLink = new AjaxLink<Void>("showFailureWindow") {
-
-                        private static final long serialVersionUID = -7978723352517770644L;
-
-                        @Override
-                        public void onClick(final AjaxRequestTarget target) {
-                            failureWindow.show(target);
-                        }
-                    };
-
-                    switch (propTO.getStatus()) {
-
-                        case SUCCESS:
-                        case CREATED:
-                            image = new Image("icon",
-                                    new ContextRelativeResource(IMG_PREFIX + Status.ACTIVE.toString()
-                                            + Constants.PNG_EXT));
-                            alt = "success icon";
-                            title = "success";
-                            failureWindow.setVisible(false);
-                            failureWindowLink.setEnabled(false);
-                            break;
-
-                        default:
-                            image = new Image("icon",
-                                    new ContextRelativeResource(IMG_PREFIX + Status.SUSPENDED.toString()
-                                            + Constants.PNG_EXT));
-                            alt = "failure icon";
-                            title = "failure";
-                    }
-
-                    image.add(new Behavior() {
-
-                        private static final long serialVersionUID = 1469628524240283489L;
-
-                        @Override
-                        public void onComponentTag(final Component component, final ComponentTag tag) {
-                            tag.put("alt", alt);
-                            tag.put("title", title);
-                        }
-                    });
-                    final FailureMessageModal<T> executionFailureMessagePage;
-                    if (propTO.getFailureReason() == null) {
-                        executionFailureMessagePage = new FailureMessageModal<>(
-                                modal, pageRef, StringUtils.EMPTY);
-                    } else {
-                        executionFailureMessagePage = new FailureMessageModal<>(
-                                modal, pageRef, propTO.getFailureReason());
-                    }
-
-                    failureWindow.setContent(executionFailureMessagePage);
-                }
-            };
-            fragment.add(propRes);
-        }
-
-        final AjaxLink<Void> close = new IndicatingAjaxLink<Void>("close") {
-
-            private static final long serialVersionUID = -7978723352517770644L;
-
-            @Override
-            public void onClick(final AjaxRequestTarget target) {
-                builder.modal.close(target);
-            }
-        };
-        container.add(close);
-
-        setOutputMarkupId(true);
-    }
-
-    /**
-     * Get remote attributes list view.
-     *
-     * @param propTO propagation TO.
-     * @return list view.
-     */
-    private ListView<String> getConnObjectView(final PropagationStatus propTO) {
-        final ConnObjectTO before = propTO.getBeforeObj();
-        final ConnObjectTO after = propTO.getAfterObj();
-
-        // sorted in reversed presentation order
-        final List<String> head = new ArrayList<String>();
-        if (provResult.getAny() instanceof UserTO) {
-            head.add(ConnIdSpecialAttributeName.PASSWORD);
-            head.add(ConnIdSpecialAttributeName.ENABLE);
-        }
-        head.add(ConnIdSpecialAttributeName.UID);
-        head.add(ConnIdSpecialAttributeName.NAME);
-
-        final Map<String, AttrTO> beforeAttrMap = before == null
-                ? Collections.<String, AttrTO>emptyMap()
-                : before.getPlainAttrMap();
-
-        final Map<String, AttrTO> afterAttrMap = after == null
-                ? Collections.<String, AttrTO>emptyMap()
-                : after.getPlainAttrMap();
-
-        final Set<String> attributes = new HashSet<String>();
-        attributes.addAll(beforeAttrMap.keySet());
-        attributes.addAll(afterAttrMap.keySet());
-
-        if (!(provResult.getAny() instanceof UserTO)) {
-            attributes.remove(ConnIdSpecialAttributeName.PASSWORD);
-            attributes.remove(ConnIdSpecialAttributeName.ENABLE);
-        }
-
-        final List<String> profile = new ArrayList<String>();
-        profile.addAll(attributes);
-        profile.removeAll(head);
-        Collections.sort(profile);
-
-        for (String attr : head) {
-            if (attributes.contains(attr)) {
-                profile.add(0, attr);
-            }
-        }
-
-        return new ListView<String>("attrs", profile) {
-
-            private static final long serialVersionUID = 4949588177564901031L;
-
-            @Override
-            protected void populateItem(final ListItem<String> item) {
-                String name = item.getModelObject();
-
-                final Fragment beforeValue;
-                final Fragment afterValue;
-                if (ConnIdSpecialAttributeName.ENABLE.equals(name)) {
-                    beforeValue = getStatusIcon("beforeValue", propTO.getResource(), before);
-                    afterValue = getStatusIcon("afterValue", propTO.getResource(), after);
-                } else {
-                    beforeValue = getLabelValue("beforeValue", name, beforeAttrMap);
-                    afterValue = getLabelValue("afterValue", name, afterAttrMap);
-                }
-
-                item.add(new Label("attrName", new ResourceModel(name, name)));
-
-                item.add(beforeValue);
-                item.add(afterValue);
-            }
-        };
-    }
-
-    /**
-     * Get fragment for attribute value (not remote status).
-     *
-     * @param id component id to be replaced with the fragment content.
-     * @param attrName remote attribute name
-     * @param attrMap remote attributes map.
-     * @return fragment.
-     */
-    private Fragment getLabelValue(final String id, final String attrName, final Map<String, AttrTO> attrMap) {
-        final String value;
-
-        final AttrTO attr = attrMap.get(attrName);
-
-        if (attr == null || attr.getValues() == null || attr.getValues().isEmpty()) {
-            value = "";
-        } else if (ConnIdSpecialAttributeName.PASSWORD.equals(attrName)) {
-            value = "********";
-        } else {
-            value = attr.getValues().size() > 1
-                    ? attr.getValues().toString()
-                    : attr.getValues().get(0);
-        }
-
-        Component label = new Label("value", value.length() > 50 ? value.substring(0, 50) + "..." : value).
-                add(new Behavior() {
-
-                    private static final long serialVersionUID = 1469628524240283489L;
-
-                    @Override
-                    public void onComponentTag(final Component component, final ComponentTag tag) {
-                        tag.put("title", value);
-                    }
-                });
-
-        final Fragment frag = new Fragment(id, "attrValueFrag", this);
-        frag.add(label);
-
-        return frag;
-    }
-
-    /**
-     * Get fragment for user status icon.
-     *
-     * @param id component id to be replaced with the fragment content
-     * @param resourceName resource name
-     * @param objectTO connector object TO
-     * @return fragment.
-     */
-    private Fragment getStatusIcon(final String id, final String resourceName, final ConnObjectTO objectTO) {
-        final Image image;
-        final String alt, title;
-        switch (statusUtils.getStatusBean(
-                provResult.getAny(), resourceName, objectTO, this.provResult.getAny() instanceof GroupTO).getStatus()) {
-
-            case ACTIVE:
-                image = new Image("status",
-                        new ContextRelativeResource(IMG_PREFIX + Status.ACTIVE.toString() + Constants.PNG_EXT));
-                alt = "active icon";
-                title = "Enabled";
-                break;
-
-            case SUSPENDED:
-                image = new Image("status",
-                        new ContextRelativeResource(IMG_PREFIX + Status.SUSPENDED.toString() + Constants.PNG_EXT));
-                alt = "inactive icon";
-                title = "Disabled";
-                break;
-
-            default:
-                image = null;
-                alt = null;
-                title = null;
-        }
-
-        final Fragment frag;
-        if (image == null) {
-            frag = new Fragment(id, "emptyFrag", this);
-        } else {
-            image.add(new Behavior() {
-
-                private static final long serialVersionUID = 1469628524240283489L;
-
-                @Override
-                public void onComponentTag(final Component component, final ComponentTag tag) {
-                    tag.put("alt", alt);
-                    tag.put("title", title);
-                    tag.put("width", "12px");
-                    tag.put("height", "12px");
-                }
-            });
-
-            frag = new Fragment(id, "remoteStatusFrag", this);
-            frag.add(image);
-        }
-
-        return frag;
-    }
-}

http://git-wip-us.apache.org/repos/asf/syncope/blob/03d7de33/client/console/src/main/java/org/apache/syncope/client/console/panels/AbstractSearchResultPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/AbstractSearchResultPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/AbstractSearchResultPanel.java
index a744d0a..9da22a5 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/AbstractSearchResultPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/AbstractSearchResultPanel.java
@@ -170,7 +170,7 @@ public abstract class AbstractSearchResultPanel<
                 ? (create ? (int) resultTable.getPageCount() - 1 : (int) resultTable.getCurrentPage()) : 0;
 
         AjaxDataTablePanel.Builder<T, String> resultTableBuilder = new AjaxDataTablePanel.Builder<>(
-                dataProvider, getPageId(), page.getPageReference()).
+                dataProvider, page.getPageReference()).
                 setColumns(getColumns()).
                 setRowsPerPage(rows).
                 setBulkActions(getBulkActions(), restClient, "key").
@@ -257,8 +257,6 @@ public abstract class AbstractSearchResultPanel<
 
     protected abstract Collection<ActionLink.ActionType> getBulkActions();
 
-    protected abstract String getPageId();
-
     public abstract static class Builder<T extends Serializable, W extends Serializable, E extends BaseRestClient>
             extends WizardMgtPanel.Builder<W> {
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/03d7de33/client/console/src/main/java/org/apache/syncope/client/console/panels/AjaxDataTablePanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/AjaxDataTablePanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/AjaxDataTablePanel.java
index 6a5b596..3cd283d 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/AjaxDataTablePanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/AjaxDataTablePanel.java
@@ -67,15 +67,12 @@ public final class AjaxDataTablePanel<T extends Serializable, S> extends DataTab
 
         private String itemKeyField;
 
-        private final String pageId;
-
         private final PageReference pageRef;
 
         private WebMarkupContainer container;
 
-        public Builder(final ISortableDataProvider<T, S> provider, final String pageId, final PageReference pageRef) {
+        public Builder(final ISortableDataProvider<T, S> provider, final PageReference pageRef) {
             this.dataProvider = provider;
-            this.pageId = pageId;
             this.pageRef = pageRef;
         }
 
@@ -208,8 +205,7 @@ public final class AjaxDataTablePanel<T extends Serializable, S> extends DataTab
                         builder.columns,
                         builder.bulkActions,
                         builder.bulkActionExecutor,
-                        builder.itemKeyField,
-                        builder.pageId));
+                        builder.itemKeyField));
 
                 bulkModalWin.show(target);
             }

http://git-wip-us.apache.org/repos/asf/syncope/blob/03d7de33/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyObjectSearchResultPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyObjectSearchResultPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyObjectSearchResultPanel.java
index fa0b7d7..a7e5d31 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyObjectSearchResultPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyObjectSearchResultPanel.java
@@ -18,21 +18,17 @@
  */
 package org.apache.syncope.client.console.panels;
 
-import de.agilecoders.wicket.core.markup.html.bootstrap.dialog.Modal;
 import java.io.Serializable;
 import java.lang.reflect.Field;
 import java.util.ArrayList;
-import java.util.Collection;
 import java.util.Date;
 import java.util.List;
 import org.apache.commons.lang3.SerializationUtils;
-import org.apache.syncope.client.console.commons.AnyDataProvider;
 import org.apache.syncope.client.console.commons.Constants;
 import org.apache.syncope.client.console.pages.AnyDisplayAttributesModalPage;
 import org.apache.syncope.client.console.pages.BasePage;
 import org.apache.syncope.client.console.rest.AbstractAnyRestClient;
 import org.apache.syncope.client.console.rest.AnyObjectRestClient;
-import org.apache.syncope.client.console.rest.SchemaRestClient;
 import org.apache.syncope.client.console.wicket.extensions.markup.html.repeater.data.table.ActionColumn;
 import org.apache.syncope.client.console.wicket.extensions.markup.html.repeater.data.table.AttrColumn;
 import org.apache.syncope.client.console.wicket.markup.html.form.ActionLink;
@@ -41,7 +37,6 @@ import org.apache.syncope.client.console.wizards.AjaxWizard;
 import org.apache.syncope.client.console.wizards.WizardMgtPanel;
 import org.apache.syncope.client.console.wizards.any.AnyHandler;
 import org.apache.syncope.common.lib.SyncopeClientException;
-import org.apache.syncope.common.lib.to.AnyTO;
 import org.apache.syncope.common.lib.to.AnyTypeClassTO;
 import org.apache.syncope.common.lib.to.AnyObjectTO;
 import org.apache.syncope.common.lib.types.AnyEntitlement;
@@ -52,65 +47,16 @@ import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.event.Broadcast;
 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.markup.html.basic.Label;
 import org.apache.wicket.model.IModel;
 import org.apache.wicket.model.ResourceModel;
 import org.springframework.util.ReflectionUtils;
 
-public class AnyObjectSearchResultPanel<T extends AnyTO>
-        extends AbstractSearchResultPanel<T, AnyHandler<T>, AnyDataProvider<T>, AbstractAnyRestClient<T>> {
+public class AnyObjectSearchResultPanel extends AnySearchResultPanel<AnyObjectTO> {
 
     private static final long serialVersionUID = -1100228004207271270L;
 
-    protected final SchemaRestClient schemaRestClient = new SchemaRestClient();
-
-    protected final List<String> schemaNames;
-
-    protected final List<String> dSchemaNames;
-
-    private final String pageID = "Any";
-
-    /**
-     * Filter used in case of filtered search.
-     */
-    private String fiql;
-
-    /**
-     * Realm related to current panel.
-     */
-    protected final String realm;
-
-    /**
-     * Any type related to current panel.
-     */
-    protected final String type;
-
-    protected AnyObjectSearchResultPanel(final String id, final Builder<T> builder) {
+    protected AnyObjectSearchResultPanel(final String id, final Builder builder) {
         super(id, builder);
-        this.realm = builder.realm;
-        this.type = builder.type;
-        this.fiql = builder.fiql;
-
-        modal.size(Modal.Size.Large);
-
-        add(new Label("name", builder.type));
-
-        this.schemaNames = new ArrayList<>();
-        for (AnyTypeClassTO anyTypeClassTO : AnySearchResultPanelBuilder.class.cast(builder).getAnyTypeClassTOs()) {
-            this.schemaNames.addAll(anyTypeClassTO.getPlainSchemas());
-        }
-        this.dSchemaNames = new ArrayList<>();
-        for (AnyTypeClassTO anyTypeClassTO : AnySearchResultPanelBuilder.class.cast(builder).getAnyTypeClassTOs()) {
-            this.dSchemaNames.addAll(anyTypeClassTO.getDerSchemas());
-        }
-
-        initResultTable();
-    }
-
-    @Override
-    protected AnyDataProvider<T> dataProvider() {
-        final AnyDataProvider<T> dp = new AnyDataProvider<>(restClient, rows, filtered, realm, type);
-        return dp.setFIQL(this.fiql);
     }
 
     @Override
@@ -119,80 +65,81 @@ public class AnyObjectSearchResultPanel<T extends AnyTO>
     }
 
     @Override
-    protected List<IColumn<T, String>> getColumns() {
-        final List<IColumn<T, String>> columns = new ArrayList<>();
+    protected List<IColumn<AnyObjectTO, String>> getColumns() {
+        final List<IColumn<AnyObjectTO, String>> columns = new ArrayList<>();
 
         for (String name : prefMan.getList(getRequest(), String.format(Constants.PREF_ANY_DETAILS_VIEW, type))) {
             final Field field = ReflectionUtils.findField(AnyObjectTO.class, name);
 
             if ("token".equalsIgnoreCase(name)) {
-                columns.add(new PropertyColumn<T, String>(new ResourceModel(name, name), name, name));
+                columns.add(new PropertyColumn<AnyObjectTO, String>(new ResourceModel(name, name), name, name));
             } else if (field != null && field.getType().equals(Date.class)) {
-                columns.add(new PropertyColumn<T, String>(new ResourceModel(name, name), name, name));
+                columns.add(new PropertyColumn<AnyObjectTO, String>(new ResourceModel(name, name), name, name));
             } else {
-                columns.add(new PropertyColumn<T, String>(new ResourceModel(name, name), name, name));
+                columns.add(new PropertyColumn<AnyObjectTO, String>(new ResourceModel(name, name), name, name));
             }
         }
 
         for (String name : prefMan.getList(getRequest(), String.format(Constants.PREF_ANY_ATTRIBUTES_VIEW, type))) {
             if (schemaNames.contains(name)) {
-                columns.add(new AttrColumn<T>(name, SchemaType.PLAIN));
+                columns.add(new AttrColumn<AnyObjectTO>(name, SchemaType.PLAIN));
             }
         }
 
         for (String name
                 : prefMan.getList(getRequest(), String.format(Constants.PREF_ANY_DERIVED_ATTRIBUTES_VIEW, type))) {
             if (dSchemaNames.contains(name)) {
-                columns.add(new AttrColumn<T>(name, SchemaType.DERIVED));
+                columns.add(new AttrColumn<AnyObjectTO>(name, SchemaType.DERIVED));
             }
         }
 
         // Add defaults in case of no selection
         if (columns.isEmpty()) {
             for (String name : AnyDisplayAttributesModalPage.ANY_DEFAULT_SELECTION) {
-                columns.add(new PropertyColumn<T, String>(new ResourceModel(name, name), name, name));
+                columns.add(new PropertyColumn<AnyObjectTO, String>(new ResourceModel(name, name), name, name));
             }
 
         }
 
-        columns.add(new ActionColumn<T, String>(new ResourceModel("actions", "")) {
+        columns.add(new ActionColumn<AnyObjectTO, String>(new ResourceModel("actions", "")) {
 
             private static final long serialVersionUID = -3503023501954863131L;
 
             @Override
-            public ActionLinksPanel<T> getActions(final String componentId, final IModel<T> model) {
-                final ActionLinksPanel.Builder<T> panel = ActionLinksPanel.builder(page.getPageReference());
+            public ActionLinksPanel<AnyObjectTO> getActions(final String componentId, final IModel<AnyObjectTO> model) {
+                final ActionLinksPanel.Builder<AnyObjectTO> panel = ActionLinksPanel.builder(page.getPageReference());
 
-                panel.add(new ActionLink<T>() {
+                panel.add(new ActionLink<AnyObjectTO>() {
 
                     private static final long serialVersionUID = -7978723352517770644L;
 
                     @Override
-                    public void onClick(final AjaxRequestTarget target, final T ignore) {
+                    public void onClick(final AjaxRequestTarget target, final AnyObjectTO ignore) {
                         send(AnyObjectSearchResultPanel.this, Broadcast.EXACT,
-                                new AjaxWizard.EditItemActionEvent<AnyHandler<T>>(
-                                        new AnyHandler<T>(
-                                                new AnyObjectRestClient().<T>read(model.getObject().getKey())),
+                                new AjaxWizard.EditItemActionEvent<AnyHandler<AnyObjectTO>>(
+                                        new AnyHandler<AnyObjectTO>(new AnyObjectRestClient().<AnyObjectTO>read(
+                                                model.getObject().getKey())),
                                         target));
                     }
                 }, ActionLink.ActionType.EDIT, String.format("%s_%s", type, AnyEntitlement.READ)).add(
-                        new ActionLink<T>() {
+                        new ActionLink<AnyObjectTO>() {
 
                     private static final long serialVersionUID = -7978723352517770645L;
 
                     @Override
-                    public void onClick(final AjaxRequestTarget target, final T ignore) {
-                        final T clone = SerializationUtils.clone(model.getObject());
+                    public void onClick(final AjaxRequestTarget target, final AnyObjectTO ignore) {
+                        final AnyObjectTO clone = SerializationUtils.clone(model.getObject());
                         clone.setKey(0L);
                         send(AnyObjectSearchResultPanel.this, Broadcast.EXACT,
-                                new AjaxWizard.NewItemActionEvent<AnyHandler<T>>(new AnyHandler<T>(clone), target));
+                                new AjaxWizard.NewItemActionEvent<AnyHandler<AnyObjectTO>>(new AnyHandler<AnyObjectTO>(
+                                        clone), target));
                     }
-                }, ActionLink.ActionType.CLONE, StandardEntitlement.USER_CREATE).add(new ActionLink<T>() {
+                }, ActionLink.ActionType.CLONE, StandardEntitlement.USER_CREATE).add(new ActionLink<AnyObjectTO>() {
 
                             private static final long serialVersionUID = -7978723352517770646L;
 
                             @Override
-                            public void onClick(final AjaxRequestTarget target, final T ignore) {
+                            public void onClick(final AjaxRequestTarget target, final AnyObjectTO ignore) {
                                 try {
                                     restClient.delete(model.getObject().getETagValue(), model.getObject().getKey());
                                     info(getString(Constants.OPERATION_SUCCEEDED));
@@ -245,75 +192,23 @@ public class AnyObjectSearchResultPanel<T extends AnyTO>
         return columns;
     }
 
-    public void search(final String fiql, final AjaxRequestTarget target) {
-        this.fiql = fiql;
-        dataProvider.setFIQL(fiql);
-        super.search(target);
-    }
-
-    @Override
-    protected Collection<ActionLink.ActionType> getBulkActions() {
-        final List<ActionLink.ActionType> bulkActions = new ArrayList<>();
+    public static class Builder extends AnySearchResultPanel.Builder<AnyObjectTO> {
 
-        bulkActions.add(ActionLink.ActionType.DELETE);
-        bulkActions.add(ActionLink.ActionType.SUSPEND);
-        bulkActions.add(ActionLink.ActionType.REACTIVATE);
-
-        return bulkActions;
-    }
-
-    @Override
-    protected String getPageId() {
-        return pageID;
-    }
-
-    public interface AnySearchResultPanelBuilder extends Serializable {
-
-        List<AnyTypeClassTO> getAnyTypeClassTOs();
-    }
-
-    public static class Builder<T extends AnyTO>
-            extends AbstractSearchResultPanel.Builder<T, AnyHandler<T>, AbstractAnyRestClient<T>>
-            implements AnySearchResultPanelBuilder {
-
-        private static final long serialVersionUID = -6828423611982275640L;
-
-        /**
-         * Realm related to current panel.
-         */
-        protected String realm = "/";
-
-        /**
-         * Any type related to current panel.
-         */
-        protected final String type;
-
-        private final List<AnyTypeClassTO> anyTypeClassTOs;
+        private static final long serialVersionUID = -6828423611982275641L;
 
         public Builder(
                 final List<AnyTypeClassTO> anyTypeClassTOs,
-                final AbstractAnyRestClient<T> restClient,
+                final AbstractAnyRestClient<AnyObjectTO> restClient,
                 final String type,
                 final PageReference pageRef) {
 
-            super(restClient, pageRef);
-            this.anyTypeClassTOs = anyTypeClassTOs;
-            this.type = type;
-        }
-
-        @Override
-        protected WizardMgtPanel<AnyHandler<T>> newInstance(final String id) {
-            return new AnyObjectSearchResultPanel<T>(id, this);
-        }
-
-        public Builder<T> setRealm(final String realm) {
-            this.realm = realm;
-            return this;
+            super(anyTypeClassTOs, restClient, type, pageRef);
+            setShowResultPage(true);
         }
 
         @Override
-        public List<AnyTypeClassTO> getAnyTypeClassTOs() {
-            return this.anyTypeClassTOs;
+        protected WizardMgtPanel<AnyHandler<AnyObjectTO>> newInstance(final String id) {
+            return new AnyObjectSearchResultPanel(id, this);
         }
     }
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/03d7de33/client/console/src/main/java/org/apache/syncope/client/console/panels/AnySearchResultPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/AnySearchResultPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/AnySearchResultPanel.java
new file mode 100644
index 0000000..6021d8e
--- /dev/null
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/AnySearchResultPanel.java
@@ -0,0 +1,195 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.syncope.client.console.panels;
+
+import de.agilecoders.wicket.core.markup.html.bootstrap.dialog.Modal;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.tuple.Pair;
+import org.apache.syncope.client.console.commons.AnyDataProvider;
+import org.apache.syncope.client.console.commons.SerializableTransformer;
+import org.apache.syncope.client.console.commons.status.ConnObjectWrapper;
+import org.apache.syncope.client.console.commons.status.StatusBean;
+import org.apache.syncope.client.console.rest.AbstractAnyRestClient;
+import org.apache.syncope.client.console.rest.SchemaRestClient;
+import org.apache.syncope.client.console.wicket.markup.html.form.ActionLink;
+import org.apache.syncope.client.console.wizards.any.AnyHandler;
+import org.apache.syncope.client.console.wizards.any.StatusPanel;
+import org.apache.syncope.common.lib.to.AnyTO;
+import org.apache.syncope.common.lib.to.AnyTypeClassTO;
+import org.apache.syncope.common.lib.to.ConnObjectTO;
+import org.apache.syncope.common.lib.to.PropagationStatus;
+import org.apache.syncope.common.lib.to.ProvisioningResult;
+import org.apache.wicket.PageReference;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.markup.html.basic.Label;
+import org.apache.wicket.markup.html.panel.Panel;
+import org.apache.wicket.model.util.ListModel;
+
+public abstract class AnySearchResultPanel<T extends AnyTO>
+        extends AbstractSearchResultPanel<T, AnyHandler<T>, AnyDataProvider<T>, AbstractAnyRestClient<T>> {
+
+    private static final long serialVersionUID = -1100228004207271270L;
+
+    protected final SchemaRestClient schemaRestClient = new SchemaRestClient();
+
+    protected final List<String> schemaNames;
+
+    protected final List<String> dSchemaNames;
+
+    /**
+     * Filter used in case of filtered search.
+     */
+    protected String fiql;
+
+    /**
+     * Realm related to current panel.
+     */
+    protected final String realm;
+
+    /**
+     * Any type related to current panel.
+     */
+    protected final String type;
+
+    protected AnySearchResultPanel(final String id, final Builder<T> builder) {
+        super(id, builder);
+        this.realm = builder.realm;
+        this.type = builder.type;
+        this.fiql = builder.fiql;
+
+        modal.size(Modal.Size.Large);
+
+        add(new Label("name", builder.type));
+
+        this.schemaNames = new ArrayList<>();
+        for (AnyTypeClassTO anyTypeClassTO : AnySearchResultPanelBuilder.class.cast(builder).getAnyTypeClassTOs()) {
+            this.schemaNames.addAll(anyTypeClassTO.getPlainSchemas());
+        }
+        this.dSchemaNames = new ArrayList<>();
+        for (AnyTypeClassTO anyTypeClassTO : AnySearchResultPanelBuilder.class.cast(builder).getAnyTypeClassTOs()) {
+            this.dSchemaNames.addAll(anyTypeClassTO.getDerSchemas());
+        }
+
+        initResultTable();
+    }
+
+    @Override
+    protected AnyDataProvider<T> dataProvider() {
+        final AnyDataProvider<T> dp = new AnyDataProvider<>(restClient, rows, filtered, realm, type);
+        return dp.setFIQL(this.fiql);
+    }
+
+    public void search(final String fiql, final AjaxRequestTarget target) {
+        this.fiql = fiql;
+        dataProvider.setFIQL(fiql);
+        super.search(target);
+    }
+
+    @Override
+    protected Collection<ActionLink.ActionType> getBulkActions() {
+        final List<ActionLink.ActionType> bulkActions = new ArrayList<>();
+
+        bulkActions.add(ActionLink.ActionType.DELETE);
+        bulkActions.add(ActionLink.ActionType.SUSPEND);
+        bulkActions.add(ActionLink.ActionType.REACTIVATE);
+
+        return bulkActions;
+    }
+
+    public interface AnySearchResultPanelBuilder extends Serializable {
+
+        List<AnyTypeClassTO> getAnyTypeClassTOs();
+    }
+
+    public abstract static class Builder<T extends AnyTO>
+            extends AbstractSearchResultPanel.Builder<T, AnyHandler<T>, AbstractAnyRestClient<T>>
+            implements AnySearchResultPanelBuilder {
+
+        private static final long serialVersionUID = -6828423611982275640L;
+
+        /**
+         * Realm related to current panel.
+         */
+        protected String realm = "/";
+
+        /**
+         * Any type related to current panel.
+         */
+        protected final String type;
+
+        private final List<AnyTypeClassTO> anyTypeClassTOs;
+
+        public Builder(
+                final List<AnyTypeClassTO> anyTypeClassTOs,
+                final AbstractAnyRestClient<T> restClient,
+                final String type,
+                final PageReference pageRef) {
+
+            super(restClient, pageRef);
+            this.anyTypeClassTOs = anyTypeClassTOs;
+            this.type = type;
+        }
+
+        public Builder<T> setRealm(final String realm) {
+            this.realm = realm;
+            return this;
+        }
+
+        @Override
+        public List<AnyTypeClassTO> getAnyTypeClassTOs() {
+            return this.anyTypeClassTOs;
+        }
+    }
+
+    @Override
+    @SuppressWarnings("unchecked")
+    protected Panel customResultBody(
+            final String panelId, final AnyHandler<T> item, final Serializable result) {
+        if (!(result instanceof ProvisioningResult)) {
+            throw new IllegalStateException("Unsupported result type");
+        }
+
+        return new StatusPanel(
+                panelId,
+                ((ProvisioningResult<T>) result).getAny(),
+                new ListModel<StatusBean>(new ArrayList<StatusBean>()),
+                CollectionUtils.collect(
+                        ((ProvisioningResult<T>) result).getPropagationStatuses(),
+                        new SerializableTransformer<PropagationStatus, Pair<ConnObjectTO, ConnObjectWrapper>>() {
+
+                    private static final long serialVersionUID = -4931455531906427515L;
+
+                    @Override
+                    public Pair<ConnObjectTO, ConnObjectWrapper> transform(final PropagationStatus input) {
+                        ConnObjectTO before = input.getBeforeObj();
+                        ConnObjectWrapper afterObjWrapper = new ConnObjectWrapper(
+                                ((ProvisioningResult<T>) result).getAny(),
+                                input.getResource(),
+                                input.getAfterObj());
+                        return Pair.of(before, afterObjWrapper);
+                    }
+
+                }, new ArrayList<Pair<ConnObjectTO, ConnObjectWrapper>>()),
+                pageRef);
+    }
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/03d7de33/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyTypeClassesPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyTypeClassesPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyTypeClassesPanel.java
index 4ece79e..be9d3c0 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyTypeClassesPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyTypeClassesPanel.java
@@ -60,8 +60,6 @@ public class AnyTypeClassesPanel extends AbstractTypesPanel<AnyTypeClassTO, AnyT
 
     private static final long serialVersionUID = -2356760296223908382L;
 
-    private final String pageID = "AnyTypesClasses";
-
     public AnyTypeClassesPanel(final String id,
             final AbstractSearchResultPanel.Builder<AnyTypeClassTO, AnyTypeClassTO, BaseRestClient> builder) {
         super(id, builder);
@@ -114,7 +112,8 @@ public class AnyTypeClassesPanel extends AbstractTypesPanel<AnyTypeClassTO, AnyT
             }
 
             @Override
-            protected void onApplyInternal(final AnyTypeClassTO modelObject) {
+            protected Serializable onApplyInternal(final AnyTypeClassTO modelObject) {
+                return null;
             }
         }, true);
 
@@ -138,11 +137,6 @@ public class AnyTypeClassesPanel extends AbstractTypesPanel<AnyTypeClassTO, AnyT
     }
 
     @Override
-    protected String getPageId() {
-        return pageID;
-    }
-
-    @Override
     protected List<IColumn<AnyTypeClassTO, String>> getColumns() {
 
         final List<IColumn<AnyTypeClassTO, String>> columns = new ArrayList<>();
@@ -205,8 +199,8 @@ public class AnyTypeClassesPanel extends AbstractTypesPanel<AnyTypeClassTO, AnyT
             public void populateItem(final Item<ICellPopulator<AnyTypeClassTO>> item, final String componentId,
                     final IModel<AnyTypeClassTO> model) {
 
-                final ActionLinksPanel.Builder<Serializable> actionLinks =
-                        ActionLinksPanel.builder(page.getPageReference());
+                final ActionLinksPanel.Builder<Serializable> actionLinks = ActionLinksPanel.builder(page.
+                        getPageReference());
                 actionLinks.setDisableIndicator(true);
                 actionLinks.addWithRoles(new ActionLink<Serializable>() {
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/03d7de33/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyTypePanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyTypePanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyTypePanel.java
index e445746..3bea20a 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyTypePanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyTypePanel.java
@@ -64,8 +64,6 @@ public class AnyTypePanel extends AbstractTypesPanel<AnyTypeTO, AnyTypeProvider>
 
     private static final long serialVersionUID = 3905038169553185171L;
 
-    private final String pageID = "AnyTypes";
-
     public AnyTypePanel(final String id, final Builder<AnyTypeTO, AnyTypeTO, BaseRestClient> builder) {
         super(id, builder);
     }
@@ -117,7 +115,9 @@ public class AnyTypePanel extends AbstractTypesPanel<AnyTypeTO, AnyTypeProvider>
             }
 
             @Override
-            protected void onApplyInternal(final AnyTypeTO modelObject) {
+            protected Serializable onApplyInternal(final AnyTypeTO modelObject) {
+                // do nothing
+                return null;
             }
         }, true);
 
@@ -141,11 +141,6 @@ public class AnyTypePanel extends AbstractTypesPanel<AnyTypeTO, AnyTypeProvider>
     }
 
     @Override
-    protected String getPageId() {
-        return pageID;
-    }
-
-    @Override
     protected List<IColumn<AnyTypeTO, String>> getColumns() {
 
         final List<IColumn<AnyTypeTO, String>> columns = new ArrayList<>();

http://git-wip-us.apache.org/repos/asf/syncope/blob/03d7de33/client/console/src/main/java/org/apache/syncope/client/console/panels/FailureMessageModal.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/FailureMessageModal.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/FailureMessageModal.java
index bee0c05..ecf64c9 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/FailureMessageModal.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/FailureMessageModal.java
@@ -21,15 +21,18 @@ package org.apache.syncope.client.console.panels;
 import java.io.Serializable;
 import org.apache.syncope.client.console.wicket.markup.html.bootstrap.dialog.BaseModal;
 import org.apache.wicket.PageReference;
+import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.markup.html.basic.Label;
+import org.apache.wicket.markup.html.form.Form;
+import org.apache.wicket.markup.html.panel.Panel;
 import org.apache.wicket.model.Model;
 
-public class FailureMessageModal<T extends Serializable> extends AbstractModalPanel<T> {
+public class FailureMessageModal<T extends Serializable> extends Panel implements ModalPanel<T> {
 
     private static final long serialVersionUID = 9216117990503199258L;
 
-    public FailureMessageModal(final BaseModal<T> modal, final PageReference pageRef, final String failureMessage) {
-        super(modal, pageRef);
+    public FailureMessageModal(final PageReference pageRef, final String failureMessage) {
+        super(BaseModal.CONTENT_ID);
         final Label executionFailureMessage;
         if (!failureMessage.isEmpty()) {
             executionFailureMessage = new Label("failureMessage", new Model<String>(failureMessage));
@@ -38,4 +41,19 @@ public class FailureMessageModal<T extends Serializable> extends AbstractModalPa
         }
         add(executionFailureMessage.setOutputMarkupId(true));
     }
+
+    @Override
+    public void onSubmit(final AjaxRequestTarget target, final Form<?> form) {
+        throw new UnsupportedOperationException("Not supported yet.");
+    }
+
+    @Override
+    public void onError(final AjaxRequestTarget target, final Form<?> form) {
+        throw new UnsupportedOperationException("Not supported yet.");
+    }
+
+    @Override
+    public T getItem() {
+        throw new UnsupportedOperationException("Not supported yet.");
+    }
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/03d7de33/client/console/src/main/java/org/apache/syncope/client/console/panels/GroupSearchResultPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/GroupSearchResultPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/GroupSearchResultPanel.java
index 27d27b6..762878b 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/GroupSearchResultPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/GroupSearchResultPanel.java
@@ -22,7 +22,6 @@ import java.io.Serializable;
 import java.lang.reflect.Field;
 import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.Collection;
 import java.util.Date;
 import java.util.List;
 import org.apache.commons.lang3.SerializationUtils;
@@ -34,7 +33,6 @@ import org.apache.syncope.client.console.rest.GroupRestClient;
 import org.apache.syncope.client.console.wicket.extensions.markup.html.repeater.data.table.ActionColumn;
 import org.apache.syncope.client.console.wicket.extensions.markup.html.repeater.data.table.AttrColumn;
 import org.apache.syncope.client.console.wicket.markup.html.form.ActionLink;
-import org.apache.syncope.client.console.wicket.markup.html.form.ActionLink.ActionType;
 import org.apache.syncope.client.console.wicket.markup.html.form.ActionLinksPanel;
 import org.apache.syncope.client.console.wizards.AjaxWizard;
 import org.apache.syncope.client.console.wizards.WizardMgtPanel;
@@ -54,12 +52,10 @@ import org.apache.wicket.model.IModel;
 import org.apache.wicket.model.ResourceModel;
 import org.springframework.util.ReflectionUtils;
 
-public class GroupSearchResultPanel extends AnyObjectSearchResultPanel<GroupTO> {
+public class GroupSearchResultPanel extends AnySearchResultPanel<GroupTO> {
 
     private static final long serialVersionUID = -1100228004207271270L;
 
-    private final String pageID = "Groups";
-
     protected GroupSearchResultPanel(final String id, final Builder builder) {
         super(id, builder);
     }
@@ -192,23 +188,7 @@ public class GroupSearchResultPanel extends AnyObjectSearchResultPanel<GroupTO>
         return columns;
     }
 
-    @Override
-    protected Collection<ActionLink.ActionType> getBulkActions() {
-        final List<ActionType> bulkActions = new ArrayList<>();
-
-        bulkActions.add(ActionType.DELETE);
-        bulkActions.add(ActionType.SUSPEND);
-        bulkActions.add(ActionType.REACTIVATE);
-
-        return bulkActions;
-    }
-
-    @Override
-    protected String getPageId() {
-        return pageID;
-    }
-
-    public static class Builder extends AnyObjectSearchResultPanel.Builder<GroupTO>
+    public static class Builder extends AnySearchResultPanel.Builder<GroupTO>
             implements AnySearchResultPanelBuilder {
 
         private static final long serialVersionUID = 1L;
@@ -220,6 +200,7 @@ public class GroupSearchResultPanel extends AnyObjectSearchResultPanel<GroupTO>
                 final PageReference pageRef) {
 
             super(anyTypeClassTOs, restClient, type, pageRef);
+            setShowResultPage(true);
         }
 
         @Override

http://git-wip-us.apache.org/repos/asf/syncope/blob/03d7de33/client/console/src/main/java/org/apache/syncope/client/console/panels/Realm.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/Realm.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/Realm.java
index 1755341..c07789c 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/Realm.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/Realm.java
@@ -30,7 +30,7 @@ import org.apache.syncope.client.console.rest.UserRestClient;
 import org.apache.syncope.client.console.wicket.markup.html.bootstrap.dialog.BaseModal;
 import org.apache.syncope.client.console.wicket.markup.html.form.ActionLink;
 import org.apache.syncope.client.console.wicket.markup.html.form.ActionLinksPanel;
-import org.apache.syncope.client.console.wizards.any.AnyWizardBuilder;
+import org.apache.syncope.client.console.wizards.any.AnyObjectWizardBuilder;
 import org.apache.syncope.client.console.wizards.any.GroupWizardBuilder;
 import org.apache.syncope.client.console.wizards.any.UserWizardBuilder;
 import org.apache.syncope.common.lib.to.AnyObjectTO;
@@ -183,12 +183,12 @@ public abstract class Realm extends Panel {
                 final AnyObjectTO anyObjectTO = new AnyObjectTO();
                 anyObjectTO.setRealm(realmTO.getFullPath());
                 anyObjectTO.setType(anyTypeTO.getKey());
-                panel = new AnyObjectSearchResultPanel.Builder<AnyObjectTO>(
+                panel = new AnyObjectSearchResultPanel.Builder(
                         anyTypeRestClient.getAnyTypeClass(anyTypeTO.getClasses().toArray(new String[] {})),
                         anyObjectRestClient,
                         anyTypeTO.getKey(),
                         pageReference).setRealm(realmTO.getFullPath()).
-                        addNewItemPanelBuilder(new AnyWizardBuilder<AnyObjectTO>(
+                        addNewItemPanelBuilder(new AnyObjectWizardBuilder(
                                 BaseModal.CONTENT_ID, anyObjectTO, anyTypeTO.getClasses(), pageRef)).
                         addNotificationPanel(BasePage.class.cast(this.pageRef.getPage()).getNotificationPanel()).
                         build(id);

http://git-wip-us.apache.org/repos/asf/syncope/blob/03d7de33/client/console/src/main/java/org/apache/syncope/client/console/panels/RelationshipTypePanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/RelationshipTypePanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/RelationshipTypePanel.java
index f4c64e4..0bafa60 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/RelationshipTypePanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/RelationshipTypePanel.java
@@ -62,8 +62,6 @@ public class RelationshipTypePanel extends AbstractTypesPanel<RelationshipTypeTO
 
     private static final long serialVersionUID = -3731778000138547357L;
 
-    private final String pageID = "RelationshipTypes";
-
     public RelationshipTypePanel(
             final String id, final Builder<RelationshipTypeTO, RelationshipTypeTO, BaseRestClient> builder) {
         super(id, builder);
@@ -119,7 +117,9 @@ public class RelationshipTypePanel extends AbstractTypesPanel<RelationshipTypeTO
             }
 
             @Override
-            protected void onApplyInternal(final RelationshipTypeTO modelObject) {
+            protected Serializable onApplyInternal(final RelationshipTypeTO modelObject) {
+                // do nothing
+                return null;
             }
         }, true);
 
@@ -143,11 +143,6 @@ public class RelationshipTypePanel extends AbstractTypesPanel<RelationshipTypeTO
     }
 
     @Override
-    protected String getPageId() {
-        return pageID;
-    }
-
-    @Override
     protected List<IColumn<RelationshipTypeTO, String>> getColumns() {
 
         final List<IColumn<RelationshipTypeTO, String>> columns = new ArrayList<>();

http://git-wip-us.apache.org/repos/asf/syncope/blob/03d7de33/client/console/src/main/java/org/apache/syncope/client/console/panels/RoleSearchResultPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/RoleSearchResultPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/RoleSearchResultPanel.java
index 6e2492c..b091a4b 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/RoleSearchResultPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/RoleSearchResultPanel.java
@@ -51,10 +51,9 @@ public class RoleSearchResultPanel
 
     private static final long serialVersionUID = -1100228004207271270L;
 
-    private final String pageID = "Roles";
-
     protected RoleSearchResultPanel(final String id, final Builder builder) {
         super(id, builder);
+        setShowResultPage(true);
 
         modal.size(Modal.Size.Large);
         initResultTable();
@@ -161,11 +160,6 @@ public class RoleSearchResultPanel
         return bulkActions;
     }
 
-    @Override
-    protected String getPageId() {
-        return pageID;
-    }
-
     public abstract static class Builder
             extends AbstractSearchResultPanel.Builder<RoleTO, RoleHandler, RoleRestClient> {
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/03d7de33/client/console/src/main/java/org/apache/syncope/client/console/panels/SchemaTypePanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/SchemaTypePanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/SchemaTypePanel.java
index d8809f2..dba3087 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/SchemaTypePanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/SchemaTypePanel.java
@@ -86,8 +86,6 @@ public class SchemaTypePanel extends AbstractTypesPanel<AbstractSchemaTO, Schema
         }
     };
 
-    private final String pageID = "Schema";
-
     private final SchemaRestClient schemaRestClient = new SchemaRestClient();
 
     private final SchemaType schemaType;
@@ -152,7 +150,8 @@ public class SchemaTypePanel extends AbstractTypesPanel<AbstractSchemaTO, Schema
                 }
 
                 @Override
-                protected void onApplyInternal(final AbstractSchemaTO modelObject) {
+                protected Serializable onApplyInternal(final AbstractSchemaTO modelObject) {
+                    return null;
                 }
             }, true);
 
@@ -179,11 +178,6 @@ public class SchemaTypePanel extends AbstractTypesPanel<AbstractSchemaTO, Schema
     }
 
     @Override
-    protected String getPageId() {
-        return pageID;
-    }
-
-    @Override
     protected List<IColumn<AbstractSchemaTO, String>> getColumns() {
 
         final List<IColumn<AbstractSchemaTO, String>> columns = new ArrayList<>();
@@ -255,8 +249,8 @@ public class SchemaTypePanel extends AbstractTypesPanel<AbstractSchemaTO, Schema
 
                 final AbstractSchemaTO schemaTO = model.getObject();
 
-                final ActionLinksPanel.Builder<Serializable> actionLinks =
-                        ActionLinksPanel.builder(page.getPageReference());
+                final ActionLinksPanel.Builder<Serializable> actionLinks = ActionLinksPanel.builder(page.
+                        getPageReference());
                 actionLinks.setDisableIndicator(true);
                 actionLinks.setDisableIndicator(true);
                 actionLinks.addWithRoles(new ActionLink<Serializable>() {

http://git-wip-us.apache.org/repos/asf/syncope/blob/03d7de33/client/console/src/main/java/org/apache/syncope/client/console/panels/SecurityQuestionsPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/SecurityQuestionsPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/SecurityQuestionsPanel.java
index bc83d03..e4ec8dd 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/SecurityQuestionsPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/SecurityQuestionsPanel.java
@@ -64,8 +64,6 @@ public class SecurityQuestionsPanel extends AbstractSearchResultPanel<
 
     private static final long serialVersionUID = 3323019773236588850L;
 
-    private final String pageID = "SecurityQuestions";
-
     public SecurityQuestionsPanel(final String id, final PageReference pageRef) {
         super(id, new Builder<SecurityQuestionTO, SecurityQuestionTO, BaseRestClient>(null, pageRef) {
 
@@ -93,7 +91,9 @@ public class SecurityQuestionsPanel extends AbstractSearchResultPanel<
             }
 
             @Override
-            protected void onApplyInternal(final SecurityQuestionTO modelObject) {
+            protected Serializable onApplyInternal(final SecurityQuestionTO modelObject) {
+                // do nothing
+                return null;
             }
         }, true);
 
@@ -126,11 +126,6 @@ public class SecurityQuestionsPanel extends AbstractSearchResultPanel<
     }
 
     @Override
-    protected String getPageId() {
-        return pageID;
-    }
-
-    @Override
     protected List<IColumn<SecurityQuestionTO, String>> getColumns() {
 
         final List<IColumn<SecurityQuestionTO, String>> columns = new ArrayList<>();

http://git-wip-us.apache.org/repos/asf/syncope/blob/03d7de33/client/console/src/main/java/org/apache/syncope/client/console/panels/UserSearchResultPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/UserSearchResultPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/UserSearchResultPanel.java
index c7501c6..e1625f5 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/UserSearchResultPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/UserSearchResultPanel.java
@@ -22,7 +22,6 @@ import java.io.Serializable;
 import java.lang.reflect.Field;
 import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.Collection;
 import java.util.Date;
 import java.util.List;
 import org.apache.commons.lang3.SerializationUtils;
@@ -35,7 +34,6 @@ import org.apache.syncope.client.console.rest.UserRestClient;
 import org.apache.syncope.client.console.wicket.extensions.markup.html.repeater.data.table.ActionColumn;
 import org.apache.syncope.client.console.wicket.extensions.markup.html.repeater.data.table.AttrColumn;
 import org.apache.syncope.client.console.wicket.markup.html.form.ActionLink;
-import org.apache.syncope.client.console.wicket.markup.html.form.ActionLink.ActionType;
 import org.apache.syncope.client.console.wicket.markup.html.form.ActionLinksPanel;
 import org.apache.syncope.client.console.wizards.AjaxWizard;
 import org.apache.syncope.client.console.wizards.WizardMgtPanel;
@@ -56,12 +54,10 @@ import org.apache.wicket.model.Model;
 import org.apache.wicket.model.ResourceModel;
 import org.springframework.util.ReflectionUtils;
 
-public class UserSearchResultPanel extends AnyObjectSearchResultPanel<UserTO> {
+public class UserSearchResultPanel extends AnySearchResultPanel<UserTO> {
 
     private static final long serialVersionUID = -1100228004207271270L;
 
-    private final String pageID = "Users";
-
     protected UserSearchResultPanel(final String id, final Builder builder) {
         super(id, builder);
     }
@@ -234,23 +230,7 @@ public class UserSearchResultPanel extends AnyObjectSearchResultPanel<UserTO> {
         return columns;
     }
 
-    @Override
-    protected Collection<ActionLink.ActionType> getBulkActions() {
-        final List<ActionType> bulkActions = new ArrayList<>();
-
-        bulkActions.add(ActionType.DELETE);
-        bulkActions.add(ActionType.SUSPEND);
-        bulkActions.add(ActionType.REACTIVATE);
-
-        return bulkActions;
-    }
-
-    @Override
-    protected String getPageId() {
-        return pageID;
-    }
-
-    public static class Builder extends AnyObjectSearchResultPanel.Builder<UserTO> {
+    public static class Builder extends AnySearchResultPanel.Builder<UserTO> {
 
         private static final long serialVersionUID = 1L;
 
@@ -261,6 +241,7 @@ public class UserSearchResultPanel extends AnyObjectSearchResultPanel<UserTO> {
                 final PageReference pageRef) {
 
             super(anyTypeClassTOs, restClient, type, pageRef);
+            setShowResultPage(true);
         }
 
         @Override

http://git-wip-us.apache.org/repos/asf/syncope/blob/03d7de33/client/console/src/main/java/org/apache/syncope/client/console/panels/search/AnyObjectSelectionSearchResultPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/search/AnyObjectSelectionSearchResultPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/search/AnyObjectSelectionSearchResultPanel.java
index 5a31adb..2039937 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/search/AnyObjectSelectionSearchResultPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/search/AnyObjectSelectionSearchResultPanel.java
@@ -39,6 +39,11 @@ public final class AnyObjectSelectionSearchResultPanel extends AnySelectionSearc
     }
 
     @Override
+    protected String paginatorRowsKey() {
+        return Constants.PREF_ANYOBJECT_PAGINATOR_ROWS;
+    }
+
+    @Override
     protected String[] getDislayAttributes() {
         return USER_DEFAULT_SELECTION;
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/03d7de33/client/console/src/main/java/org/apache/syncope/client/console/panels/search/AnySelectionSearchResultPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/search/AnySelectionSearchResultPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/search/AnySelectionSearchResultPanel.java
index 82b277b..d013179 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/search/AnySelectionSearchResultPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/search/AnySelectionSearchResultPanel.java
@@ -27,7 +27,7 @@ import java.util.Collections;
 import java.util.Date;
 import java.util.List;
 import org.apache.syncope.client.console.pages.AnyDisplayAttributesModalPage;
-import org.apache.syncope.client.console.panels.AnyObjectSearchResultPanel;
+import org.apache.syncope.client.console.panels.AnySearchResultPanel;
 import org.apache.syncope.client.console.rest.AbstractAnyRestClient;
 import org.apache.syncope.client.console.wicket.extensions.markup.html.repeater.data.table.ActionColumn;
 import org.apache.syncope.client.console.wicket.extensions.markup.html.repeater.data.table.AttrColumn;
@@ -47,12 +47,11 @@ import org.apache.wicket.model.IModel;
 import org.apache.wicket.model.ResourceModel;
 import org.springframework.util.ReflectionUtils;
 
-public abstract class AnySelectionSearchResultPanel<T extends AnyTO> extends AnyObjectSearchResultPanel<T> {
+public abstract class AnySelectionSearchResultPanel<T extends AnyTO> extends AnySearchResultPanel<T> {
 
     private static final long serialVersionUID = -1100228004207271272L;
 
-    protected AnySelectionSearchResultPanel(
-            final String id, final AnySelectionSearchResultPanel.Builder<T> builder) {
+    protected AnySelectionSearchResultPanel(final String id, final AnySearchResultPanel.Builder<T> builder) {
         super(id, builder);
     }
 
@@ -168,7 +167,7 @@ public abstract class AnySelectionSearchResultPanel<T extends AnyTO> extends Any
 
     protected abstract String getPrefDerivedAttributesView();
 
-    public static class Builder<T extends AnyTO> extends AnyObjectSearchResultPanel.Builder<T> {
+    public abstract static class Builder<T extends AnyTO> extends AnySearchResultPanel.Builder<T> {
 
         private static final long serialVersionUID = 1L;
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/03d7de33/client/console/src/main/java/org/apache/syncope/client/console/panels/search/GroupSelectionSearchResultPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/search/GroupSelectionSearchResultPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/search/GroupSelectionSearchResultPanel.java
index 8ba4593..e3a734c 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/search/GroupSelectionSearchResultPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/search/GroupSelectionSearchResultPanel.java
@@ -38,6 +38,11 @@ public final class GroupSelectionSearchResultPanel extends AnySelectionSearchRes
     }
 
     @Override
+    protected String paginatorRowsKey() {
+        return Constants.PREF_GROUP_PAGINATOR_ROWS;
+    }
+
+    @Override
     protected String[] getDislayAttributes() {
         return GROUP_DEFAULT_SELECTION;
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/03d7de33/client/console/src/main/java/org/apache/syncope/client/console/panels/search/UserSelectionSearchResultPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/search/UserSelectionSearchResultPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/search/UserSelectionSearchResultPanel.java
index e43c737..8ae41f4 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/search/UserSelectionSearchResultPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/search/UserSelectionSearchResultPanel.java
@@ -38,6 +38,11 @@ public final class UserSelectionSearchResultPanel extends AnySelectionSearchResu
     }
 
     @Override
+    protected String paginatorRowsKey() {
+        return Constants.PREF_USERS_PAGINATOR_ROWS;
+    }
+
+    @Override
     protected String[] getDislayAttributes() {
         return USER_DEFAULT_SELECTION;
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/03d7de33/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/bootstrap/dialog/BaseModal.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/bootstrap/dialog/BaseModal.java b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/bootstrap/dialog/BaseModal.java
index 774d143..4437adb 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/bootstrap/dialog/BaseModal.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/bootstrap/dialog/BaseModal.java
@@ -78,6 +78,7 @@ public class BaseModal<T extends Serializable> extends Modal<T> implements Notif
         super(id);
 
         form = new Form<>(FORM);
+        form.setOutputMarkupId(true);
         add(form);
 
         content = new AbstractModalPanel<T>(this, null) {

http://git-wip-us.apache.org/repos/asf/syncope/blob/03d7de33/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionLink.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionLink.java b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionLink.java
index 6508ab3..708fd92 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionLink.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionLink.java
@@ -21,7 +21,7 @@ package org.apache.syncope.client.console.wicket.markup.html.form;
 import java.io.Serializable;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 
-public abstract class ActionLink<T> implements Serializable {
+public abstract class ActionLink<T extends Serializable> implements Serializable {
 
     private static final long serialVersionUID = 7031329706998320639L;
 
@@ -56,6 +56,7 @@ public abstract class ActionLink<T> implements Serializable {
         DRYRUN("execute"),
         CLAIM("claim"),
         SELECT("read"),
+        CLOSE("read"),
         EXPORT("read"),
         SUSPEND("update"),
         REACTIVATE("update"),

http://git-wip-us.apache.org/repos/asf/syncope/blob/03d7de33/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionLinksPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionLinksPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionLinksPanel.java
index 2b2dfd3..b3e989d 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionLinksPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionLinksPanel.java
@@ -75,6 +75,7 @@ public final class ActionLinksPanel<T extends Serializable> extends Panel {
         super.add(new Fragment("panelExecute", "emptyFragment", this));
         super.add(new Fragment("panelDryRun", "emptyFragment", this));
         super.add(new Fragment("panelSelect", "emptyFragment", this));
+        super.add(new Fragment("panelClose", "emptyFragment", this));
         super.add(new Fragment("panelExport", "emptyFragment", this));
         super.add(new Fragment("panelSuspend", "emptyFragment", this));
         super.add(new Fragment("panelReactivate", "emptyFragment", this));
@@ -478,6 +479,25 @@ public final class ActionLinksPanel<T extends Serializable> extends Panel {
                 }).setVisible(link.isEnabled(model.getObject()));
 
                 break;
+            case CLOSE:
+                fragment = new Fragment("panelClose", "fragmentClose", this);
+
+                fragment.addOrReplace(new ClearIndicatingAjaxLink<Void>("closeLink", pageRef) {
+
+                    private static final long serialVersionUID = -7978723352517770644L;
+
+                    @Override
+                    protected void onClickInternal(final AjaxRequestTarget target) {
+                        link.onClick(target, model.getObject());
+                    }
+
+                    @Override
+                    public String getAjaxIndicatorMarkupId() {
+                        return disableIndicator ? StringUtils.EMPTY : super.getAjaxIndicatorMarkupId();
+                    }
+                }).setVisible(link.isEnabled(model.getObject()));
+
+                break;
 
             case EXPORT:
                 fragment = new Fragment("panelExport", "fragmentExport", this);
@@ -739,7 +759,9 @@ public final class ActionLinksPanel<T extends Serializable> extends Panel {
 
         if (fragment != null) {
             fragment.setEnabled(enabled);
-            MetaDataRoleAuthorizationStrategy.authorize(fragment, ENABLE, entitlements);
+            if (StringUtils.isNotBlank(entitlements)) {
+                MetaDataRoleAuthorizationStrategy.authorize(fragment, ENABLE, entitlements);
+            }
             super.addOrReplace(fragment);
         }
 
@@ -812,6 +834,10 @@ public final class ActionLinksPanel<T extends Serializable> extends Panel {
                 super.addOrReplace(new Fragment("panelSelect", "emptyFragment", this));
                 break;
 
+            case CLOSE:
+                super.addOrReplace(new Fragment("panelClose", "emptyFragment", this));
+                break;
+
             case EXPORT:
                 super.addOrReplace(new Fragment("panelExport", "emptyFragment", this));
                 break;
@@ -899,6 +925,10 @@ public final class ActionLinksPanel<T extends Serializable> extends Panel {
             return this;
         }
 
+        public Builder<T> add(final ActionLink<T> link, final ActionLink.ActionType type) {
+            return addWithRoles(link, type, null, true);
+        }
+
         public Builder<T> add(
                 final ActionLink<T> link,
                 final ActionLink.ActionType type,

http://git-wip-us.apache.org/repos/asf/syncope/blob/03d7de33/client/console/src/main/java/org/apache/syncope/client/console/wizards/AbstractModalPanelBuilder.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wizards/AbstractModalPanelBuilder.java b/client/console/src/main/java/org/apache/syncope/client/console/wizards/AbstractModalPanelBuilder.java
index 88b79c5..dc418a7 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wizards/AbstractModalPanelBuilder.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wizards/AbstractModalPanelBuilder.java
@@ -49,7 +49,7 @@ public abstract class AbstractModalPanelBuilder<T extends Serializable> implemen
 
     protected abstract void onCancelInternal(T modelObject);
 
-    protected abstract void onApplyInternal(T modelObject);
+    protected abstract Serializable onApplyInternal(T modelObject);
 
     protected T getOriginalItem() {
         return item;


Mime
View raw message