You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@syncope.apache.org by fm...@apache.org on 2017/05/05 22:22:56 UTC

[10/10] syncope git commit: [SYNCOPE-1047] Replaces ActionLinksPanel with TogglePanel

[SYNCOPE-1047] Replaces ActionLinksPanel with TogglePanel


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

Branch: refs/heads/master
Commit: 2e7e2ceef339fe243de2c688200e4010d46b8776
Parents: 018fa97
Author: fmartelli <fa...@gmail.com>
Authored: Fri May 5 23:56:29 2017 +0200
Committer: fmartelli <fa...@gmail.com>
Committed: Fri May 5 23:59:18 2017 +0200

----------------------------------------------------------------------
 .../approvals/ApprovalDirectoryPanel.java       |   93 +-
 .../client/console/bulk/BulkContent.java        |    9 +-
 .../client/console/commons/Constants.java       |   12 +
 .../console/events/EventCategoryPanel.java      |  174 +--
 .../MailTemplateDirectoryPanel.java             |  129 +-
 .../NotificationDirectoryPanel.java             |  112 +-
 .../client/console/pages/Parameters.java        |    6 +-
 .../syncope/client/console/pages/Roles.java     |    2 +-
 .../panels/AccessTokenDirectoryPanel.java       |   75 +-
 .../console/panels/ActionDataTablePanel.java    |   13 +-
 .../console/panels/AjaxDataTablePanel.java      |   32 +-
 .../console/panels/AnyDirectoryPanel.java       |    5 +-
 .../console/panels/AnyObjectDirectoryPanel.java |  289 ++--
 .../AnyObjectDisplayAttributesModalPanel.java   |    2 +-
 .../console/panels/AnyTypeClassesPanel.java     |   82 +-
 .../client/console/panels/AnyTypesPanel.java    |   90 +-
 .../client/console/panels/DirectoryPanel.java   |   69 +-
 .../console/panels/GroupDirectoryPanel.java     |  333 ++--
 .../GroupDisplayAttributesModalPanel.java       |    2 +-
 .../client/console/panels/ListViewPanel.java    |   29 +-
 .../panels/ParametersDirectoryPanel.java        |  212 +++
 .../client/console/panels/ParametersPanel.java  |  234 ---
 .../syncope/client/console/panels/Realm.java    |   99 +-
 .../client/console/panels/RealmDetails.java     |    4 +-
 .../console/panels/RelationshipTypesPanel.java  |   83 +-
 .../console/panels/RoleDirectoryPanel.java      |  244 ++-
 .../client/console/panels/SchemaTypePanel.java  |  108 +-
 .../console/panels/SecurityQuestionsPanel.java  |   89 +-
 .../client/console/panels/TogglePanel.java      |    7 +-
 .../panels/TypeExtensionDirectoryPanel.java     |   55 +-
 .../console/panels/UserDirectoryPanel.java      |  423 ++---
 .../panels/UserDisplayAttributesModalPanel.java |    2 +-
 .../console/panels/WorkflowDirectoryPanel.java  |  203 ++-
 .../AnyObjectSelectionDirectoryPanel.java       |    6 -
 .../search/AnySelectionDirectoryPanel.java      |   77 +-
 .../search/GroupSelectionDirectoryPanel.java    |    6 -
 .../search/UserSelectionDirectoryPanel.java     |    6 -
 .../policies/AccountPolicyDirectoryPanel.java   |    7 +-
 .../policies/PasswordPolicyDirectoryPanel.java  |    5 +-
 .../console/policies/PolicyDirectoryPanel.java  |  134 +-
 .../policies/PolicyRuleDirectoryPanel.java      |  144 +-
 .../policies/PullPolicyDirectoryPanel.java      |    5 +-
 .../console/reports/ReportDirectoryPanel.java   |  191 +--
 .../console/reports/ReportExecutionDetails.java |    4 +-
 .../reports/ReportTemplateDirectoryPanel.java   |  166 +-
 .../reports/ReportletDirectoryPanel.java        |  147 +-
 .../console/status/AnyStatusDirectoryPanel.java |   54 +-
 .../console/tasks/ExecutionsDirectoryPanel.java |   90 +-
 .../tasks/NotificationTaskDirectoryPanel.java   |  159 +-
 .../tasks/PropagationTaskDirectoryPanel.java    |  121 +-
 .../tasks/ProvisioningTaskDirectoryPanel.java   |    2 +-
 .../console/tasks/PullTaskDirectoryPanel.java   |   12 +-
 .../console/tasks/SchedTaskDirectoryPanel.java  |  187 ++-
 .../client/console/topology/Topology.java       |   20 +-
 .../console/topology/TopologyTogglePanel.java   |    2 +-
 .../html/repeater/data/table/ActionColumn.java  |   50 -
 .../data/table/AjaxFallbackDataTable.java       |   51 +-
 .../data/table/CollectionPropertyColumn.java    |    3 +-
 .../repeater/data/table/KeyPropertyColumn.java  |   14 +-
 .../console/wicket/markup/html/form/Action.java |  176 +++
 .../wicket/markup/html/form/ActionLink.java     |    2 +-
 .../markup/html/form/ActionLinksPanel.java      | 1459 ------------------
 .../html/form/ActionLinksTogglePanel.java       |  129 ++
 .../wicket/markup/html/form/ActionPanel.java    |  160 ++
 .../wicket/markup/html/form/ActionsPanel.java   |   88 ++
 .../client/console/widgets/JobWidget.java       |  106 +-
 .../console/widgets/ReconciliationWidget.java   |   27 +-
 .../console/wizards/AbstractMappingPanel.java   |    8 +-
 .../console/wizards/any/Relationships.java      |    9 +-
 .../client/console/wizards/any/ResultPage.java  |   12 +-
 .../META-INF/resources/css/syncopeConsole.css   |   37 +
 .../META-INF/resources/css/topology.css         |   17 +
 .../client/console/bulk/BulkContent.html        |    4 +-
 .../console/panels/AjaxDataTablePanel.html      |    2 +-
 .../client/console/panels/DirectoryPanel.html   |   25 +-
 .../panels/ParametersDirectoryPanel.html        |   23 +
 .../panels/ParametersDirectoryPanel.properties  |   21 +
 .../ParametersDirectoryPanel_it.properties      |   21 +
 .../ParametersDirectoryPanel_pt_BR.properties   |   21 +
 .../ParametersDirectoryPanel_ru.properties      |   27 +
 .../client/console/panels/ParametersPanel.html  |   23 -
 .../console/panels/ParametersPanel.properties   |   21 -
 .../panels/ParametersPanel_it.properties        |   21 -
 .../panels/ParametersPanel_pt_BR.properties     |   21 -
 .../panels/ParametersPanel_ru.properties        |   27 -
 .../client/console/panels/RealmDetails.html     |    4 +-
 .../client/console/panels/TogglePanel.html      |   38 +-
 .../console/topology/TopologyTogglePanel.html   |    9 +-
 .../markup/html/form/ActionLinksPanel.html      |  298 ----
 .../html/form/ActionLinksTogglePanel.html       |   30 +
 .../wicket/markup/html/form/ActionPanel.html    |   30 +
 .../markup/html/form/ActionPanel.properties     |  227 +++
 .../markup/html/form/ActionPanel_it.properties  |  226 +++
 .../html/form/ActionPanel_pt_BR.properties      |  226 +++
 .../markup/html/form/ActionPanel_ru.properties  |  226 +++
 .../wicket/markup/html/form/ActionsPanel.html   |   34 +
 .../markup/html/form/ActionsPanel.properties    |  223 +++
 .../markup/html/form/ActionsPanel_it.properties |  223 +++
 .../html/form/ActionsPanel_pt_BR.properties     |  223 +++
 .../markup/html/form/ActionsPanel_ru.properties |  223 +++
 .../console/wizards/AbstractMappingPanel.html   |    2 +-
 .../client/console/wizards/any/ResultPage.html  |    2 +-
 .../org/apache/syncope/common/lib/to/JobTO.java |    2 -
 .../panels/CamelRoutesDirectoryPanel.java       |   87 +-
 .../console/panels/SAML2IdPsDirectoryPanel.java |  118 +-
 .../syncope/fit/console/AnyObjectsITCase.java   |   18 +-
 .../fit/console/AnyTypeClassesITCase.java       |   89 +-
 .../syncope/fit/console/AnyTypesITCase.java     |   55 +-
 .../syncope/fit/console/BulkActionITCase.java   |  132 +-
 .../fit/console/DisplayAttributesITCase.java    |   12 +-
 .../syncope/fit/console/GroupsITCase.java       |  104 +-
 .../fit/console/NotificationsITCase.java        |   51 +-
 .../syncope/fit/console/ParametersITCase.java   |   11 +-
 .../syncope/fit/console/PoliciesITCase.java     |  182 ++-
 .../syncope/fit/console/RealmsITCase.java       |   39 +-
 .../fit/console/RelationshipTypesITCase.java    |   40 +-
 .../syncope/fit/console/ReportsITCase.java      |   50 +-
 .../apache/syncope/fit/console/RolesITCase.java |   35 +-
 .../syncope/fit/console/SchemasITCase.java      |   61 +-
 .../fit/console/SecurityQuestionsITCase.java    |   32 +-
 .../syncope/fit/console/TopologyITCase.java     |   85 +-
 .../apache/syncope/fit/console/UsersITCase.java |   68 +-
 122 files changed, 5779 insertions(+), 5207 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/syncope/blob/2e7e2cee/client/console/src/main/java/org/apache/syncope/client/console/approvals/ApprovalDirectoryPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/approvals/ApprovalDirectoryPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/approvals/ApprovalDirectoryPanel.java
index ffcb7ed..a3249cd 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/approvals/ApprovalDirectoryPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/approvals/ApprovalDirectoryPanel.java
@@ -32,10 +32,9 @@ import org.apache.syncope.client.console.panels.DirectoryPanel;
 import org.apache.syncope.client.console.rest.UserWorkflowRestClient;
 import org.apache.syncope.client.console.approvals.ApprovalDirectoryPanel.ApprovalProvider;
 import org.apache.syncope.client.console.pages.BasePage;
-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.DatePropertyColumn;
 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.wicket.markup.html.form.ActionsPanel;
 import org.apache.syncope.common.lib.SyncopeClientException;
 import org.apache.syncope.common.lib.to.WorkflowFormTO;
 import org.apache.syncope.common.lib.types.StandardEntitlement;
@@ -99,77 +98,55 @@ public class ApprovalDirectoryPanel
         columns.add(new DatePropertyColumn<WorkflowFormTO>(
                 new ResourceModel("dueDate"), "dueDate", "dueDate"));
         columns.add(new PropertyColumn<WorkflowFormTO, String>(new ResourceModel("owner"), "owner", "owner"));
-        columns.add(new ActionColumn<WorkflowFormTO, String>(new ResourceModel("actions")) {
 
-            private static final long serialVersionUID = -3503023501954863133L;
-
-            @Override
-            public ActionLinksPanel<WorkflowFormTO> getActions(
-                    final String componentId, final IModel<WorkflowFormTO> model) {
-                final ActionLinksPanel.Builder<WorkflowFormTO> panel = ActionLinksPanel.builder();
-
-                panel.add(new ActionLink<WorkflowFormTO>() {
-
-                    private static final long serialVersionUID = -3722207913631435501L;
+        return columns;
+    }
 
-                    @Override
-                    public void onClick(final AjaxRequestTarget target, final WorkflowFormTO ignore) {
-                        try {
-                            restClient.claimForm(model.getObject().getTaskId());
-                            SyncopeConsoleSession.get().info(getString(Constants.OPERATION_SUCCEEDED));
-                        } catch (SyncopeClientException scee) {
-                            SyncopeConsoleSession.get().error(getString(Constants.ERROR) + ": " + scee.getMessage());
-                        }
-                        ((BasePage) pageRef.getPage()).getNotificationPanel().refresh(target);
-                        target.add(container);
-                    }
-                }, ActionLink.ActionType.CLAIM, StandardEntitlement.WORKFLOW_FORM_CLAIM);
+    @Override
+    public ActionsPanel<WorkflowFormTO> getActions(final IModel<WorkflowFormTO> model) {
+        final ActionsPanel<WorkflowFormTO> panel = super.getActions(model);
 
-                panel.add(new ActionLink<WorkflowFormTO>() {
+        panel.add(new ActionLink<WorkflowFormTO>() {
 
-                    private static final long serialVersionUID = -3722207913631435501L;
+            private static final long serialVersionUID = -3722207913631435501L;
 
-                    @Override
-                    public void onClick(final AjaxRequestTarget target, final WorkflowFormTO ignore) {
-                        final IModel<WorkflowFormTO> formModel = new CompoundPropertyModel<>(model.getObject());
-                        modal.setFormModel(formModel);
+            @Override
+            public void onClick(final AjaxRequestTarget target, final WorkflowFormTO ignore) {
+                try {
+                    restClient.claimForm(model.getObject().getTaskId());
+                    SyncopeConsoleSession.get().info(getString(Constants.OPERATION_SUCCEEDED));
+                } catch (SyncopeClientException scee) {
+                    SyncopeConsoleSession.get().error(getString(Constants.ERROR) + ": " + scee.getMessage());
+                }
+                ((BasePage) pageRef.getPage()).getNotificationPanel().refresh(target);
+                target.add(container);
+            }
+        }, ActionLink.ActionType.CLAIM, StandardEntitlement.WORKFLOW_FORM_CLAIM);
 
-                        target.add(modal.setContent(new ApprovalModal(modal, pageRef, model.getObject())));
-                        modal.header(new Model<>(getString("approval.edit", new Model<>(model.getObject()))));
+        panel.add(new ActionLink<WorkflowFormTO>() {
 
-                        modal.show(true);
-                    }
+            private static final long serialVersionUID = -3722207913631435501L;
 
-                    @Override
-                    protected boolean statusCondition(final WorkflowFormTO modelObject) {
-                        return SyncopeConsoleSession.get().getSelfTO().getUsername().
-                                equals(model.getObject().getOwner());
-                    }
+            @Override
+            public void onClick(final AjaxRequestTarget target, final WorkflowFormTO ignore) {
+                final IModel<WorkflowFormTO> formModel = new CompoundPropertyModel<>(model.getObject());
+                modal.setFormModel(formModel);
 
-                }, ActionLink.ActionType.EDIT, StandardEntitlement.WORKFLOW_FORM_READ);
+                target.add(modal.setContent(new ApprovalModal(modal, pageRef, model.getObject())));
+                modal.header(new Model<>(getString("approval.edit", new Model<>(model.getObject()))));
 
-                return panel.build(componentId);
+                modal.show(true);
             }
 
             @Override
-            public ActionLinksPanel<WorkflowFormTO> getHeader(final String componentId) {
-                final ActionLinksPanel.Builder<WorkflowFormTO> panel = ActionLinksPanel.builder();
-
-                return panel.add(new ActionLink<WorkflowFormTO>() {
-
-                    private static final long serialVersionUID = -7978723352517770644L;
-
-                    @Override
-                    public void onClick(final AjaxRequestTarget target, final WorkflowFormTO ignore) {
-                        if (target != null) {
-                            target.add(container);
-                        }
-                    }
-                }, ActionLink.ActionType.RELOAD, StandardEntitlement.WORKFLOW_FORM_LIST).build(componentId);
+            protected boolean statusCondition(final WorkflowFormTO modelObject) {
+                return SyncopeConsoleSession.get().getSelfTO().getUsername().
+                        equals(model.getObject().getOwner());
             }
-        });
 
-        return columns;
+        }, ActionLink.ActionType.EDIT, StandardEntitlement.WORKFLOW_FORM_READ);
+
+        return panel;
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/syncope/blob/2e7e2cee/client/console/src/main/java/org/apache/syncope/client/console/bulk/BulkContent.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/bulk/BulkContent.java b/client/console/src/main/java/org/apache/syncope/client/console/bulk/BulkContent.java
index bdfe2d5..2a46141 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/bulk/BulkContent.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/bulk/BulkContent.java
@@ -39,7 +39,7 @@ import org.apache.syncope.client.console.wicket.extensions.markup.html.repeater.
 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.ActionLink.ActionType;
-import org.apache.syncope.client.console.wicket.markup.html.form.ActionLinksPanel;
+import org.apache.syncope.client.console.wicket.markup.html.form.ActionsPanel;
 import org.apache.syncope.common.lib.to.BulkAction;
 import org.apache.syncope.common.lib.to.BulkActionResult;
 import org.apache.syncope.common.lib.types.StandardEntitlement;
@@ -112,7 +112,7 @@ public class BulkContent<T extends Serializable, S> extends MultilevelPanel.Seco
                 dataProvider,
                 Integer.MAX_VALUE).setMarkupId("selectedObjects").setVisible(items != null && !items.isEmpty()));
 
-        final ActionLinksPanel<Serializable> actionPanel = ActionLinksPanel.builder().build("actions");
+        final ActionsPanel<Serializable> actionPanel = new ActionsPanel<>("actions", null);
         container.add(actionPanel);
 
         for (ActionLink.ActionType action : actions) {
@@ -236,14 +236,15 @@ public class BulkContent<T extends Serializable, S> extends MultilevelPanel.Seco
                         target.add(actionPanel);
 
                         SyncopeConsoleSession.get().info(getString(Constants.OPERATION_SUCCEEDED));
-                    } catch (Exception e) {
+                    } catch (IllegalArgumentException | NoSuchMethodException | SecurityException 
+                            | IllegalAccessException | InvocationTargetException e) {
                         LOG.error("Bulk action failure", e);
                         SyncopeConsoleSession.get().error("Operation " + actionToBeAddresed.getActionId()
                                 + " not supported");
                     }
                     ((BasePage) getPage()).getNotificationPanel().refresh(target);
                 }
-            }, action, StandardEntitlement.CONFIGURATION_LIST, !items.isEmpty());
+            }, action, StandardEntitlement.CONFIGURATION_LIST).hideLabel();
         }
     }
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/2e7e2cee/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 affe16e..11bdc72 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
@@ -37,6 +37,18 @@ public final class Constants {
 
     public static final String MODEL_ID_PARAM = "modelId";
 
+    public static final String KEY_FIELD_NAME = "key";
+
+    public static final String SCHEMA_FIELD_NAME = "schema";
+
+    public static final String DESCRIPTION_FIELD_NAME = "description";
+
+    public static final String USERNAME_FIELD_NAME = "username";
+
+    public static final String OBJNAME_FIELD_NAME = "name";
+
+    public static final String DEFAULT_TOKEN_FIELD_NAME = "token";
+
     public static final String ON_CLICK = "click";
 
     public static final String ON_CHANGE = "change";

http://git-wip-us.apache.org/repos/asf/syncope/blob/2e7e2cee/client/console/src/main/java/org/apache/syncope/client/console/events/EventCategoryPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/events/EventCategoryPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/events/EventCategoryPanel.java
index 6796fc3..5579d29 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/events/EventCategoryPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/events/EventCategoryPanel.java
@@ -34,7 +34,7 @@ import org.apache.syncope.client.console.commons.Constants;
 import org.apache.syncope.client.console.events.SelectedEventsPanel.EventSelectionChanged;
 import org.apache.syncope.client.console.events.SelectedEventsPanel.InspectSelectedEvent;
 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.wicket.markup.html.form.ActionsPanel;
 import org.apache.syncope.client.console.wicket.markup.html.form.AjaxDropDownChoicePanel;
 import org.apache.syncope.client.console.wicket.markup.html.form.AjaxTextFieldPanel;
 import org.apache.syncope.common.lib.log.EventCategoryTO;
@@ -77,7 +77,7 @@ public abstract class EventCategoryPanel extends Panel {
 
     private final AjaxTextFieldPanel custom;
 
-    private final ActionLinksPanel<EventCategoryTO> actionLinksPanel;
+    private final ActionsPanel<EventCategoryTO> actionsPanel;
 
     private final IModel<List<String>> model;
 
@@ -194,93 +194,93 @@ public abstract class EventCategoryPanel extends Panel {
 
         categoryContainer.add(custom.hideLabel());
 
-        actionLinksPanel = ActionLinksPanel.<EventCategoryTO>builder().
-                add(new ActionLink<EventCategoryTO>() {
+        actionsPanel = new ActionsPanel<EventCategoryTO>("customActions", null);
+        actionsPanel.add(new ActionLink<EventCategoryTO>() {
 
-                    private static final long serialVersionUID = -3722207913631435501L;
+            private static final long serialVersionUID = -3722207913631435501L;
 
-                    @Override
-                    public void onClick(final AjaxRequestTarget target, final EventCategoryTO modelObject) {
-                        if (StringUtils.isNotBlank(custom.getModelObject())) {
-                            Map.Entry<EventCategoryTO, AuditElements.Result> parsed =
-                                    AuditLoggerName.parseEventCategory(custom.getModelObject());
-
-                            String eventString = AuditLoggerName.buildEvent(
-                                    parsed.getKey().getType(),
-                                    null,
-                                    null,
-                                    parsed.getKey().getEvents().isEmpty()
+            @Override
+            public void onClick(final AjaxRequestTarget target, final EventCategoryTO ignore) {
+                if (StringUtils.isNotBlank(custom.getModelObject())) {
+                    Map.Entry<EventCategoryTO, AuditElements.Result> parsed = AuditLoggerName.parseEventCategory(custom.
+                            getModelObject());
+
+                    String eventString = AuditLoggerName.buildEvent(
+                            parsed.getKey().getType(),
+                            null,
+                            null,
+                            parsed.getKey().getEvents().isEmpty()
                                     ? StringUtils.EMPTY : parsed.getKey().getEvents().iterator().next(),
-                                    parsed.getValue());
-
-                            custom.setModelObject(StringUtils.EMPTY);
-                            send(EventCategoryPanel.this.getPage(), Broadcast.BREADTH, new EventSelectionChanged(
-                                    target,
-                                    Collections.<String>singleton(eventString),
-                                    Collections.<String>emptySet()));
-                            target.add(categoryContainer);
-                        }
-                    }
-                }, ActionLink.ActionType.CREATE).
-                add(new ActionLink<EventCategoryTO>() {
+                            parsed.getValue());
+
+                    custom.setModelObject(StringUtils.EMPTY);
+                    send(EventCategoryPanel.this.getPage(), Broadcast.BREADTH, new EventSelectionChanged(
+                            target,
+                            Collections.<String>singleton(eventString),
+                            Collections.<String>emptySet()));
+                    target.add(categoryContainer);
+                }
+            }
+        }, ActionLink.ActionType.CREATE, StringUtils.EMPTY);
+        actionsPanel.add(new ActionLink<EventCategoryTO>() {
 
-                    private static final long serialVersionUID = -3722207913631435501L;
+            private static final long serialVersionUID = -3722207913631435501L;
 
-                    @Override
-                    public void onClick(final AjaxRequestTarget target, final EventCategoryTO modelObject) {
-                        if (StringUtils.isNotBlank(custom.getModelObject())) {
-                            Pair<EventCategoryTO, AuditElements.Result> parsed =
-                                    AuditLoggerName.parseEventCategory(custom.getModelObject());
-
-                            String eventString = AuditLoggerName.buildEvent(
-                                    parsed.getKey().getType(),
-                                    null,
-                                    null,
-                                    parsed.getKey().getEvents().isEmpty()
+            @Override
+            public void onClick(final AjaxRequestTarget target, final EventCategoryTO ignore) {
+                if (StringUtils.isNotBlank(custom.getModelObject())) {
+                    Pair<EventCategoryTO, AuditElements.Result> parsed = AuditLoggerName.parseEventCategory(custom.
+                            getModelObject());
+
+                    String eventString = AuditLoggerName.buildEvent(
+                            parsed.getKey().getType(),
+                            null,
+                            null,
+                            parsed.getKey().getEvents().isEmpty()
                                     ? StringUtils.EMPTY : parsed.getKey().getEvents().iterator().next(),
-                                    parsed.getValue());
-
-                            custom.setModelObject(StringUtils.EMPTY);
-                            send(EventCategoryPanel.this.getPage(), Broadcast.BREADTH, new EventSelectionChanged(
-                                    target,
-                                    Collections.<String>singleton(eventString),
-                                    Collections.<String>emptySet()));
-                            target.add(categoryContainer);
-                        }
-                    }
-                }, ActionLink.ActionType.CREATE).
-                add(new ActionLink<EventCategoryTO>() {
+                            parsed.getValue());
+
+                    custom.setModelObject(StringUtils.EMPTY);
+                    send(EventCategoryPanel.this.getPage(), Broadcast.BREADTH, new EventSelectionChanged(
+                            target,
+                            Collections.<String>singleton(eventString),
+                            Collections.<String>emptySet()));
+                    target.add(categoryContainer);
+                }
+            }
+        }, ActionLink.ActionType.CREATE, StringUtils.EMPTY);
+        actionsPanel.add(new ActionLink<EventCategoryTO>() {
 
-                    private static final long serialVersionUID = -3722207913631435521L;
+            private static final long serialVersionUID = -3722207913631435521L;
 
-                    @Override
-                    public void onClick(final AjaxRequestTarget target, final EventCategoryTO modelObject) {
-                        if (StringUtils.isNotBlank(custom.getModelObject())) {
-                            Pair<EventCategoryTO, AuditElements.Result> parsed =
-                                    AuditLoggerName.parseEventCategory(custom.getModelObject());
-
-                            String eventString = AuditLoggerName.buildEvent(
-                                    parsed.getKey().getType(),
-                                    null,
-                                    null,
-                                    parsed.getKey().getEvents().isEmpty()
+            @Override
+            public void onClick(final AjaxRequestTarget target, final EventCategoryTO ignore) {
+                if (StringUtils.isNotBlank(custom.getModelObject())) {
+                    Pair<EventCategoryTO, AuditElements.Result> parsed = AuditLoggerName.parseEventCategory(custom.
+                            getModelObject());
+
+                    String eventString = AuditLoggerName.buildEvent(
+                            parsed.getKey().getType(),
+                            null,
+                            null,
+                            parsed.getKey().getEvents().isEmpty()
                                     ? StringUtils.EMPTY : parsed.getKey().getEvents().iterator().next(),
-                                    parsed.getValue());
-
-                            custom.setModelObject(StringUtils.EMPTY);
-                            send(EventCategoryPanel.this.getPage(), Broadcast.BREADTH, new EventSelectionChanged(
-                                    target,
-                                    Collections.<String>emptySet(),
-                                    Collections.<String>singleton(eventString)));
-                            target.add(categoryContainer);
-                        }
-                    }
-                }, ActionLink.ActionType.DELETE).build("customActions");
+                            parsed.getValue());
+
+                    custom.setModelObject(StringUtils.EMPTY);
+                    send(EventCategoryPanel.this.getPage(), Broadcast.BREADTH, new EventSelectionChanged(
+                            target,
+                            Collections.<String>emptySet(),
+                            Collections.<String>singleton(eventString)));
+                    target.add(categoryContainer);
+                }
+            }
+        }, ActionLink.ActionType.DELETE, StringUtils.EMPTY, true);
 
-        categoryContainer.add(actionLinksPanel);
+        categoryContainer.add(actionsPanel);
 
-        actionLinksPanel.setVisible(false);
-        actionLinksPanel.setEnabled(false);
+        actionsPanel.setVisible(false);
+        actionsPanel.setEnabled(false);
 
         eventsContainer.add(new EventSelectionPanel("eventsPanel", eventCategoryTO, model) {
 
@@ -346,8 +346,8 @@ public abstract class EventCategoryPanel extends Panel {
                             subcategory.setEnabled(false);
                             custom.setVisible(true);
                             custom.setEnabled(true);
-                            actionLinksPanel.setVisible(true);
-                            actionLinksPanel.setEnabled(true);
+                            actionsPanel.setVisible(true);
+                            actionsPanel.setEnabled(true);
                         } else {
                             category.setChoices(filter(eventCategoryTOs, type.getModelObject()));
                             subcategory.setChoices(Collections.<String>emptyList());
@@ -355,8 +355,8 @@ public abstract class EventCategoryPanel extends Panel {
                             subcategory.setEnabled(true);
                             custom.setVisible(false);
                             custom.setEnabled(false);
-                            actionLinksPanel.setVisible(false);
-                            actionLinksPanel.setEnabled(false);
+                            actionsPanel.setVisible(false);
+                            actionsPanel.setEnabled(false);
                         }
                         change.getTarget().add(categoryContainer);
                         break;
@@ -399,22 +399,22 @@ public abstract class EventCategoryPanel extends Panel {
                         categoryEvent.getKey().getCategory(),
                         categoryEvent.getKey().getSubcategory(),
                         categoryEvent.getKey().getEvents().isEmpty()
-                        ? StringUtils.EMPTY : categoryEvent.getKey().getEvents().iterator().next(),
+                                ? StringUtils.EMPTY : categoryEvent.getKey().getEvents().iterator().next(),
                         categoryEvent.getValue()));
 
                 category.setEnabled(false);
                 subcategory.setEnabled(false);
                 custom.setVisible(true);
                 custom.setEnabled(true);
-                actionLinksPanel.setVisible(true);
-                actionLinksPanel.setEnabled(true);
+                actionsPanel.setVisible(true);
+                actionsPanel.setEnabled(true);
             } else {
                 category.setEnabled(true);
                 subcategory.setEnabled(true);
                 custom.setVisible(false);
                 custom.setEnabled(false);
-                actionLinksPanel.setVisible(false);
-                actionLinksPanel.setEnabled(false);
+                actionsPanel.setVisible(false);
+                actionsPanel.setEnabled(false);
             }
 
             inspectSelectedEvent.getTarget().add(categoryContainer);

http://git-wip-us.apache.org/repos/asf/syncope/blob/2e7e2cee/client/console/src/main/java/org/apache/syncope/client/console/notifications/MailTemplateDirectoryPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/notifications/MailTemplateDirectoryPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/notifications/MailTemplateDirectoryPanel.java
index a9b16f1..55c4bd0 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/notifications/MailTemplateDirectoryPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/notifications/MailTemplateDirectoryPanel.java
@@ -34,10 +34,8 @@ import org.apache.syncope.client.console.notifications.MailTemplateDirectoryPane
 import org.apache.syncope.client.console.pages.BasePage;
 import org.apache.syncope.client.console.panels.DirectoryPanel;
 import org.apache.syncope.client.console.rest.NotificationRestClient;
-import org.apache.syncope.client.console.wicket.extensions.markup.html.repeater.data.table.ActionColumn;
 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.AbstractModalPanelBuilder;
 import org.apache.syncope.client.console.wizards.AjaxWizard;
 import org.apache.syncope.common.lib.SyncopeClientException;
@@ -55,6 +53,7 @@ import org.apache.wicket.model.IModel;
 import org.apache.wicket.model.ResourceModel;
 import org.apache.wicket.model.StringResourceModel;
 import org.apache.syncope.client.console.panels.WizardModalPanel;
+import org.apache.syncope.client.console.wicket.markup.html.form.ActionsPanel;
 import org.apache.syncope.client.console.wicket.markup.html.form.XMLEditorPanel;
 import org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow;
 import org.apache.wicket.markup.html.form.Form;
@@ -112,78 +111,70 @@ public class MailTemplateDirectoryPanel
     @Override
     protected List<IColumn<MailTemplateTO, String>> getColumns() {
         List<IColumn<MailTemplateTO, String>> columns = new ArrayList<>();
-        columns.add(new PropertyColumn<MailTemplateTO, String>(
-                new StringResourceModel("key", this), "key", "key"));
+        columns.add(new PropertyColumn<MailTemplateTO, String>(new StringResourceModel("key", this), "key", "key"));
+        return columns;
+    }
 
-        columns.add(new ActionColumn<MailTemplateTO, String>(new ResourceModel("actions", "")) {
+    @Override
+    public ActionsPanel<MailTemplateTO> getActions(final IModel<MailTemplateTO> model) {
+        final ActionsPanel<MailTemplateTO> panel = super.getActions(model);
 
-            private static final long serialVersionUID = -3503023501954863131L;
+        panel.add(new ActionLink<MailTemplateTO>() {
+
+            private static final long serialVersionUID = -7978723352517770645L;
 
             @Override
-            public ActionLinksPanel<MailTemplateTO> getActions(
-                    final String componentId, final IModel<MailTemplateTO> model) {
-
-                final ActionLinksPanel.Builder<MailTemplateTO> panel = ActionLinksPanel.builder();
-
-                panel.add(new ActionLink<MailTemplateTO>() {
-
-                    private static final long serialVersionUID = -7978723352517770645L;
-
-                    @Override
-                    public void onClick(final AjaxRequestTarget target, final MailTemplateTO ignore) {
-                        TemplateContent<MailTemplateFormat> content =
-                                new TemplateContent<>(model.getObject().getKey(), MailTemplateFormat.HTML);
-                        content.setContent(
-                                restClient.readTemplateFormat(model.getObject().getKey(), MailTemplateFormat.HTML));
-
-                        utilityModal.header(new ResourceModel("mail.template.html", "HTML Content"));
-                        utilityModal.setContent(new TemplateContentEditorPanel(content, pageRef));
-                        utilityModal.show(true);
-                        target.add(utilityModal);
-                    }
-                }, ActionLink.ActionType.HTML, StandardEntitlement.MAIL_TEMPLATE_UPDATE);
-
-                panel.add(new ActionLink<MailTemplateTO>() {
-
-                    private static final long serialVersionUID = -7978723352517770645L;
-
-                    @Override
-                    public void onClick(final AjaxRequestTarget target, final MailTemplateTO ignore) {
-                        TemplateContent<MailTemplateFormat> content =
-                                new TemplateContent<>(model.getObject().getKey(), MailTemplateFormat.TEXT);
-                        content.setContent(
-                                restClient.readTemplateFormat(model.getObject().getKey(), MailTemplateFormat.TEXT));
-
-                        utilityModal.header(new ResourceModel("mail.template.text", "TEXT Content"));
-                        utilityModal.setContent(new TemplateContentEditorPanel(content, pageRef));
-                        utilityModal.show(true);
-                        target.add(utilityModal);
-                    }
-                }, ActionLink.ActionType.TEXT, StandardEntitlement.MAIL_TEMPLATE_UPDATE);
-
-                panel.add(new ActionLink<MailTemplateTO>() {
-
-                    private static final long serialVersionUID = -3722207913631435501L;
-
-                    @Override
-                    public void onClick(final AjaxRequestTarget target, final MailTemplateTO ignore) {
-                        try {
-                            restClient.deleteTemplate(model.getObject().getKey());
-                            SyncopeConsoleSession.get().info(getString(Constants.OPERATION_SUCCEEDED));
-                            target.add(container);
-                        } catch (SyncopeClientException e) {
-                            LOG.error("While deleting object {}", model.getObject().getKey(), e);
-                            SyncopeConsoleSession.get().error(StringUtils.isBlank(e.getMessage()) ? e.getClass().
-                                    getName() : e.getMessage());
-                        }
-                        ((BasePage) pageRef.getPage()).getNotificationPanel().refresh(target);
-                    }
-                }, ActionLink.ActionType.DELETE, StandardEntitlement.MAIL_TEMPLATE_DELETE);
-
-                return panel.build(componentId);
+            public void onClick(final AjaxRequestTarget target, final MailTemplateTO ignore) {
+                TemplateContent<MailTemplateFormat> content = new TemplateContent<>(model.getObject().getKey(),
+                        MailTemplateFormat.HTML);
+                content.setContent(
+                        restClient.readTemplateFormat(model.getObject().getKey(), MailTemplateFormat.HTML));
+
+                utilityModal.header(new ResourceModel("mail.template.html", "HTML Content"));
+                utilityModal.setContent(new TemplateContentEditorPanel(content, pageRef));
+                utilityModal.show(true);
+                target.add(utilityModal);
             }
-        });
-        return columns;
+        }, ActionLink.ActionType.HTML, StandardEntitlement.MAIL_TEMPLATE_UPDATE);
+
+        panel.add(new ActionLink<MailTemplateTO>() {
+
+            private static final long serialVersionUID = -7978723352517770645L;
+
+            @Override
+            public void onClick(final AjaxRequestTarget target, final MailTemplateTO ignore) {
+                TemplateContent<MailTemplateFormat> content = new TemplateContent<>(model.getObject().getKey(),
+                        MailTemplateFormat.TEXT);
+                content.setContent(
+                        restClient.readTemplateFormat(model.getObject().getKey(), MailTemplateFormat.TEXT));
+
+                utilityModal.header(new ResourceModel("mail.template.text", "TEXT Content"));
+                utilityModal.setContent(new TemplateContentEditorPanel(content, pageRef));
+                utilityModal.show(true);
+                target.add(utilityModal);
+            }
+        }, ActionLink.ActionType.TEXT, StandardEntitlement.MAIL_TEMPLATE_UPDATE);
+
+        panel.add(new ActionLink<MailTemplateTO>() {
+
+            private static final long serialVersionUID = -3722207913631435501L;
+
+            @Override
+            public void onClick(final AjaxRequestTarget target, final MailTemplateTO ignore) {
+                try {
+                    restClient.deleteTemplate(model.getObject().getKey());
+                    SyncopeConsoleSession.get().info(getString(Constants.OPERATION_SUCCEEDED));
+                    target.add(container);
+                } catch (SyncopeClientException e) {
+                    LOG.error("While deleting object {}", model.getObject().getKey(), e);
+                    SyncopeConsoleSession.get().error(StringUtils.isBlank(e.getMessage()) ? e.getClass().
+                            getName() : e.getMessage());
+                }
+                ((BasePage) pageRef.getPage()).getNotificationPanel().refresh(target);
+            }
+        }, ActionLink.ActionType.DELETE, StandardEntitlement.MAIL_TEMPLATE_DELETE, true);
+
+        return panel;
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/syncope/blob/2e7e2cee/client/console/src/main/java/org/apache/syncope/client/console/notifications/NotificationDirectoryPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/notifications/NotificationDirectoryPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/notifications/NotificationDirectoryPanel.java
index c6de77f..740a36d 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/notifications/NotificationDirectoryPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/notifications/NotificationDirectoryPanel.java
@@ -34,13 +34,12 @@ import org.apache.syncope.client.console.notifications.NotificationDirectoryPane
 import org.apache.syncope.client.console.pages.BasePage;
 import org.apache.syncope.client.console.panels.DirectoryPanel;
 import org.apache.syncope.client.console.rest.NotificationRestClient;
-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.BooleanPropertyColumn;
 import org.apache.syncope.client.console.wicket.extensions.markup.html.repeater.data.table.CollectionPropertyColumn;
 import org.apache.syncope.client.console.wicket.extensions.markup.html.repeater.data.table.KeyPropertyColumn;
 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.wicket.markup.html.form.ActionsPanel;
 import org.apache.syncope.client.console.wizards.AjaxWizard;
 import org.apache.syncope.common.lib.SyncopeClientException;
 import org.apache.syncope.common.lib.to.NotificationTO;
@@ -54,7 +53,6 @@ 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.model.AbstractReadOnlyModel;
 import org.apache.wicket.model.IModel;
-import org.apache.wicket.model.ResourceModel;
 import org.apache.wicket.model.StringResourceModel;
 
 public class NotificationDirectoryPanel
@@ -87,8 +85,7 @@ public class NotificationDirectoryPanel
     @Override
     protected List<IColumn<NotificationTO, String>> getColumns() {
         List<IColumn<NotificationTO, String>> columns = new ArrayList<>();
-        columns.add(new KeyPropertyColumn<NotificationTO>(
-                new StringResourceModel("key", this), "key", "key"));
+        columns.add(new KeyPropertyColumn<NotificationTO>(new StringResourceModel("key", this), "key"));
         columns.add(new PropertyColumn<NotificationTO, String>(
                 new StringResourceModel("sender", this), "sender", "sender"));
         columns.add(new PropertyColumn<NotificationTO, String>(
@@ -96,69 +93,62 @@ public class NotificationDirectoryPanel
         columns.add(new PropertyColumn<NotificationTO, String>(
                 new StringResourceModel("template", this), "template", "template"));
         columns.add(new CollectionPropertyColumn<NotificationTO>(
-                new StringResourceModel("events", this), "events", "events"));
+                new StringResourceModel("events", this), "events"));
         columns.add(new BooleanPropertyColumn<NotificationTO>(
                 new StringResourceModel("active", this), "active", "active"));
+        return columns;
+    }
 
-        columns.add(new ActionColumn<NotificationTO, String>(new ResourceModel("actions", "")) {
+    @Override
+    public ActionsPanel<NotificationTO> getActions(final IModel<NotificationTO> model) {
+        final ActionsPanel<NotificationTO> panel = super.getActions(model);
 
-            private static final long serialVersionUID = -3503023501954863131L;
+        panel.add(new ActionLink<NotificationTO>() {
+
+            private static final long serialVersionUID = -7978723352517770645L;
 
             @Override
-            public ActionLinksPanel<NotificationTO> getActions(
-                    final String componentId, final IModel<NotificationTO> model) {
-
-                final ActionLinksPanel.Builder<NotificationTO> panel = ActionLinksPanel.builder();
-
-                panel.add(new ActionLink<NotificationTO>() {
-
-                    private static final long serialVersionUID = -7978723352517770645L;
-
-                    @Override
-                    public void onClick(final AjaxRequestTarget target, final NotificationTO ignore) {
-                        target.add(utilityModal.setContent(
-                                new NotificationTasks(model.getObject().getKey(), pageRef)));
-                        utilityModal.header(new StringResourceModel("notification.tasks", model));
-                        utilityModal.show(true);
-                        target.add(utilityModal);
-                    }
-                }, ActionLink.ActionType.NOTIFICATION_TASKS, StandardEntitlement.TASK_LIST);
-
-                panel.add(new ActionLink<NotificationTO>() {
-
-                    private static final long serialVersionUID = -7978723352517770645L;
-
-                    @Override
-                    public void onClick(final AjaxRequestTarget target, final NotificationTO ignore) {
-                        send(NotificationDirectoryPanel.this, Broadcast.EXACT,
-                                new AjaxWizard.EditItemActionEvent<>(
-                                        new NotificationWrapper(restClient.read(model.getObject().getKey())), target));
-                    }
-                }, ActionLink.ActionType.EDIT, StandardEntitlement.NOTIFICATION_UPDATE);
-
-                panel.add(new ActionLink<NotificationTO>() {
-
-                    private static final long serialVersionUID = -3722207913631435501L;
-
-                    @Override
-                    public void onClick(final AjaxRequestTarget target, final NotificationTO ignore) {
-                        try {
-                            restClient.delete(model.getObject().getKey());
-                            SyncopeConsoleSession.get().info(getString(Constants.OPERATION_SUCCEEDED));
-                            target.add(container);
-                        } catch (SyncopeClientException e) {
-                            LOG.error("While deleting object {}", model.getObject().getKey(), e);
-                            SyncopeConsoleSession.get().error(StringUtils.isBlank(e.getMessage()) ? e.getClass().
-                                    getName() : e.getMessage());
-                        }
-                        ((BasePage) pageRef.getPage()).getNotificationPanel().refresh(target);
-                    }
-                }, ActionLink.ActionType.DELETE, StandardEntitlement.NOTIFICATION_DELETE);
-
-                return panel.build(componentId);
+            public void onClick(final AjaxRequestTarget target, final NotificationTO ignore) {
+                send(NotificationDirectoryPanel.this, Broadcast.EXACT,
+                        new AjaxWizard.EditItemActionEvent<>(
+                                new NotificationWrapper(restClient.read(model.getObject().getKey())), target));
             }
-        });
-        return columns;
+        }, ActionLink.ActionType.EDIT, StandardEntitlement.NOTIFICATION_UPDATE);
+
+        panel.add(new ActionLink<NotificationTO>() {
+
+            private static final long serialVersionUID = -7978723352517770645L;
+
+            @Override
+            public void onClick(final AjaxRequestTarget target, final NotificationTO ignore) {
+                target.add(utilityModal.setContent(
+                        new NotificationTasks(model.getObject().getKey(), pageRef)));
+                utilityModal.header(new StringResourceModel("notification.tasks", model));
+                utilityModal.show(true);
+                target.add(utilityModal);
+            }
+        }, ActionLink.ActionType.NOTIFICATION_TASKS, StandardEntitlement.TASK_LIST);
+
+        panel.add(new ActionLink<NotificationTO>() {
+
+            private static final long serialVersionUID = -3722207913631435501L;
+
+            @Override
+            public void onClick(final AjaxRequestTarget target, final NotificationTO ignore) {
+                try {
+                    restClient.delete(model.getObject().getKey());
+                    SyncopeConsoleSession.get().info(getString(Constants.OPERATION_SUCCEEDED));
+                    target.add(container);
+                } catch (SyncopeClientException e) {
+                    LOG.error("While deleting object {}", model.getObject().getKey(), e);
+                    SyncopeConsoleSession.get().error(StringUtils.isBlank(e.getMessage()) ? e.getClass().
+                            getName() : e.getMessage());
+                }
+                ((BasePage) pageRef.getPage()).getNotificationPanel().refresh(target);
+            }
+        }, ActionLink.ActionType.DELETE, StandardEntitlement.NOTIFICATION_DELETE, true);
+
+        return panel;
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/syncope/blob/2e7e2cee/client/console/src/main/java/org/apache/syncope/client/console/pages/Parameters.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/pages/Parameters.java b/client/console/src/main/java/org/apache/syncope/client/console/pages/Parameters.java
index e03c5b6..856db28 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/pages/Parameters.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/pages/Parameters.java
@@ -19,7 +19,7 @@
 package org.apache.syncope.client.console.pages;
 
 import org.apache.syncope.client.console.BookmarkablePageLinkBuilder;
-import org.apache.syncope.client.console.panels.ParametersPanel;
+import org.apache.syncope.client.console.panels.ParametersDirectoryPanel;
 import org.apache.wicket.markup.html.WebMarkupContainer;
 import org.apache.wicket.request.mapper.parameter.PageParameters;
 
@@ -27,7 +27,7 @@ public class Parameters extends BasePage {
 
     private static final long serialVersionUID = 4116733316105009166L;
 
-    private final ParametersPanel parametersPanel;
+    private final ParametersDirectoryPanel parametersPanel;
 
     public Parameters(final PageParameters parameters) {
         super(parameters);
@@ -38,7 +38,7 @@ public class Parameters extends BasePage {
         content.setOutputMarkupId(true);
         body.add(content);
 
-        parametersPanel = new ParametersPanel("parametersPanel", getPageReference());
+        parametersPanel = new ParametersDirectoryPanel("parametersPanel", getPageReference());
         parametersPanel.setOutputMarkupId(true);
 
         content.add(parametersPanel);

http://git-wip-us.apache.org/repos/asf/syncope/blob/2e7e2cee/client/console/src/main/java/org/apache/syncope/client/console/pages/Roles.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/pages/Roles.java b/client/console/src/main/java/org/apache/syncope/client/console/pages/Roles.java
index 0f4295c..d02345c 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/pages/Roles.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/pages/Roles.java
@@ -44,7 +44,7 @@ public class Roles extends BasePage {
 
             private static final long serialVersionUID = -5960765294082359003L;
 
-        }.disableCheckBoxes().addNewItemPanelBuilder(
+        }.addNewItemPanelBuilder(
                 new RoleWizardBuilder(new RoleTO(), getPageReference()), true).build("rolesPanel");
 
         content.add(rolesPanel);

http://git-wip-us.apache.org/repos/asf/syncope/blob/2e7e2cee/client/console/src/main/java/org/apache/syncope/client/console/panels/AccessTokenDirectoryPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/AccessTokenDirectoryPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/AccessTokenDirectoryPanel.java
index d5489ac..86714ee 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/AccessTokenDirectoryPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/AccessTokenDirectoryPanel.java
@@ -34,11 +34,10 @@ import org.apache.syncope.client.console.commons.SortableDataProviderComparator;
 import org.apache.syncope.client.console.pages.BasePage;
 import org.apache.syncope.client.console.panels.AccessTokenDirectoryPanel.AccessTokenDataProvider;
 import org.apache.syncope.client.console.rest.AccessTokenRestClient;
-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.DatePropertyColumn;
 import org.apache.syncope.client.console.wicket.extensions.markup.html.repeater.data.table.KeyPropertyColumn;
 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.wicket.markup.html.form.ActionsPanel;
 import org.apache.syncope.client.console.wizards.WizardMgtPanel;
 import org.apache.syncope.common.lib.SyncopeClientException;
 import org.apache.syncope.common.lib.to.AccessTokenTO;
@@ -55,6 +54,7 @@ import org.apache.wicket.markup.repeater.Item;
 import org.apache.wicket.model.CompoundPropertyModel;
 import org.apache.wicket.model.IModel;
 import org.apache.wicket.model.ResourceModel;
+import org.apache.wicket.model.StringResourceModel;
 
 public class AccessTokenDirectoryPanel
         extends DirectoryPanel<AccessTokenTO, AccessTokenTO, AccessTokenDataProvider, AccessTokenRestClient> {
@@ -83,8 +83,10 @@ public class AccessTokenDirectoryPanel
     @Override
     protected List<IColumn<AccessTokenTO, String>> getColumns() {
         List<IColumn<AccessTokenTO, String>> columns = new ArrayList<>();
-
-        columns.add(new KeyPropertyColumn<AccessTokenTO>(new ResourceModel("key"), "key", "key"));
+        columns.add(new KeyPropertyColumn<AccessTokenTO>(
+                new StringResourceModel(Constants.KEY_FIELD_NAME, this),
+                Constants.KEY_FIELD_NAME,
+                Constants.KEY_FIELD_NAME));
 
         columns.add(new PropertyColumn<AccessTokenTO, String>(new ResourceModel("owner"), "owner", "owner"));
 
@@ -107,58 +109,33 @@ public class AccessTokenDirectoryPanel
 
         columns.add(new DatePropertyColumn<AccessTokenTO>(new ResourceModel("expiryTime"), "expiryTime", "expiryTime"));
 
+        return columns;
+    }
 
-        columns.add(new ActionColumn<AccessTokenTO, String>(new ResourceModel("actions", "")) {
+    @Override
+    public ActionsPanel<AccessTokenTO> getActions(final IModel<AccessTokenTO> model) {
+        final ActionsPanel<AccessTokenTO> panel = super.getActions(model);
 
-            private static final long serialVersionUID = 6532399418012695495L;
+        panel.add(new ActionLink<AccessTokenTO>() {
 
-            @Override
-            public ActionLinksPanel<AccessTokenTO> getActions(
-                    final String componentId, final IModel<AccessTokenTO> model) {
-
-                final ActionLinksPanel.Builder<AccessTokenTO> panel = ActionLinksPanel.builder();
-
-                panel.add(new ActionLink<AccessTokenTO>() {
-
-                    private static final long serialVersionUID = -7978723352517770644L;
-
-                    @Override
-                    public void onClick(final AjaxRequestTarget target, final AccessTokenTO ignore) {
-                        try {
-                            restClient.delete(model.getObject().getKey());
-                            SyncopeConsoleSession.get().info(getString(Constants.OPERATION_SUCCEEDED));
-                            target.add(container);
-                        } catch (SyncopeClientException e) {
-                            LOG.error("While deleting object {}", model.getObject().getKey(), e);
-                            SyncopeConsoleSession.get().error(StringUtils.isBlank(e.getMessage()) ? e.getClass().
-                                    getName() : e.getMessage());
-                        }
-                        ((BasePage) pageRef.getPage()).getNotificationPanel().refresh(target);
-                    }
-                }, ActionLink.ActionType.DELETE, StandardEntitlement.ACCESS_TOKEN_DELETE);
-
-                return panel.build(componentId);
-            }
+            private static final long serialVersionUID = -7978723352517770644L;
 
             @Override
-            public ActionLinksPanel<AccessTokenTO> getHeader(final String componentId) {
-                final ActionLinksPanel.Builder<AccessTokenTO> panel = ActionLinksPanel.builder();
-
-                return panel.add(new ActionLink<AccessTokenTO>() {
-
-                    private static final long serialVersionUID = -8766205612892810375L;
-
-                    @Override
-                    public void onClick(final AjaxRequestTarget target, final AccessTokenTO ignore) {
-                        if (target != null) {
-                            target.add(container);
-                        }
-                    }
-                }, ActionLink.ActionType.RELOAD, StandardEntitlement.ACCESS_TOKEN_LIST).build(componentId);
+            public void onClick(final AjaxRequestTarget target, final AccessTokenTO ignore) {
+                try {
+                    restClient.delete(model.getObject().getKey());
+                    SyncopeConsoleSession.get().info(getString(Constants.OPERATION_SUCCEEDED));
+                    target.add(container);
+                } catch (SyncopeClientException e) {
+                    LOG.error("While deleting object {}", model.getObject().getKey(), e);
+                    SyncopeConsoleSession.get().error(StringUtils.isBlank(e.getMessage()) ? e.getClass().
+                            getName() : e.getMessage());
+                }
+                ((BasePage) pageRef.getPage()).getNotificationPanel().refresh(target);
             }
-        });
+        }, ActionLink.ActionType.DELETE, StandardEntitlement.ACCESS_TOKEN_DELETE, true);
 
-        return columns;
+        return panel;
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/syncope/blob/2e7e2cee/client/console/src/main/java/org/apache/syncope/client/console/panels/ActionDataTablePanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/ActionDataTablePanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/ActionDataTablePanel.java
index 8c465f3..9aa2a69 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/ActionDataTablePanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/ActionDataTablePanel.java
@@ -28,7 +28,7 @@ import org.apache.syncope.client.console.wicket.extensions.markup.html.repeater.
 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.ActionLink.ActionType;
-import org.apache.syncope.client.console.wicket.markup.html.form.ActionLinksPanel;
+import org.apache.syncope.client.console.wicket.markup.html.form.ActionsPanel;
 import org.apache.wicket.AttributeModifier;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.ajax.markup.html.form.AjaxButton;
@@ -47,7 +47,7 @@ public class ActionDataTablePanel<T extends Serializable, S> extends DataTablePa
 
     private final Form<T> bulkActionForm;
 
-    private final ActionLinksPanel<Serializable> actionPanel;
+    private final ActionsPanel<Serializable> actionPanel;
 
     public ActionDataTablePanel(
             final String id,
@@ -87,7 +87,7 @@ public class ActionDataTablePanel<T extends Serializable, S> extends DataTablePa
         final WebMarkupContainer actionPanelContainer = new WebMarkupContainer("actionPanelContainer");
         bulkActionForm.add(actionPanelContainer);
 
-        actionPanel = ActionLinksPanel.builder().build("actions");
+        actionPanel = new ActionsPanel<>("actions", null);
         actionPanelContainer.add(actionPanel);
 
         if (dataTable.getRowCount() == 0) {
@@ -107,12 +107,7 @@ public class ActionDataTablePanel<T extends Serializable, S> extends DataTablePa
 
     public void addAction(
             final ActionLink<Serializable> action, final ActionType type, final String entitlements) {
-        actionPanel.add(action, type, entitlements, true);
-    }
-
-    public void addAction(
-            final ActionLink<Serializable> action, final ActionType type, final String pageId, final boolean enabled) {
-        actionPanel.add(action, type, pageId, enabled);
+        actionPanel.add(action, type, entitlements);
     }
 
     public void addCancelButton(final BaseModal<?> modal) {

http://git-wip-us.apache.org/repos/asf/syncope/blob/2e7e2cee/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 0736e86..fc2cb45 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
@@ -34,6 +34,8 @@ import org.apache.syncope.client.console.rest.RestClient;
 import org.apache.syncope.client.console.wicket.extensions.markup.html.repeater.data.table.CheckGroupColumn;
 import org.apache.syncope.client.console.wicket.extensions.markup.html.repeater.data.table.AjaxFallbackDataTable;
 import org.apache.syncope.client.console.wicket.markup.html.bootstrap.dialog.BaseModal;
+import org.apache.syncope.client.console.wicket.markup.html.form.ActionLinksTogglePanel;
+import org.apache.syncope.client.console.wicket.markup.html.form.ActionsPanel;
 import org.apache.wicket.AttributeModifier;
 import org.apache.wicket.PageReference;
 import org.apache.wicket.ajax.AjaxRequestTarget;
@@ -46,6 +48,7 @@ import org.apache.wicket.markup.html.WebMarkupContainer;
 import org.apache.wicket.markup.html.form.CheckGroup;
 import org.apache.wicket.markup.html.form.Form;
 import org.apache.wicket.markup.html.panel.Fragment;
+import org.apache.wicket.model.IModel;
 import org.apache.wicket.model.ResourceModel;
 
 public final class AjaxDataTablePanel<T extends Serializable, S> extends DataTablePanel<T, S> {
@@ -151,6 +154,14 @@ public final class AjaxDataTablePanel<T extends Serializable, S> extends DataTab
             this.multiLevelPanel = multiLevelPanel;
             this.baseModal = baseModal;
         }
+
+        protected ActionsPanel<T> getActions(final IModel<T> model) {
+            return null;
+        }
+
+        protected ActionLinksTogglePanel<T> getTogglePanel() {
+            return null;
+        }
     }
 
     private AjaxDataTablePanel(final String id, final Builder<T, S> builder) {
@@ -200,8 +211,23 @@ public final class AjaxDataTablePanel<T extends Serializable, S> extends DataTab
             builder.columns.add(0, new CheckGroupColumn<T, S>(group));
         }
 
-        dataTable = new AjaxFallbackDataTable<>(
-                "dataTable", builder.columns, builder.dataProvider, builder.rowsPerPage, builder.container);
+        dataTable = new AjaxFallbackDataTable<T, S>(
+                "dataTable", builder.columns, builder.dataProvider, builder.rowsPerPage, builder.container) {
+
+            private static final long serialVersionUID = -7370603907251344224L;
+
+            @Override
+            protected ActionsPanel<T> getActions(final IModel<T> model) {
+                return builder.getActions(model);
+            }
+
+            @Override
+            protected ActionLinksTogglePanel<T> getTogglePanel() {
+                return builder.getTogglePanel();
+            }
+
+        };
+
         dataTable.add(new AttributeModifier("class", "table table-bordered table-hover dataTable"));
 
         group.add(dataTable);
@@ -221,7 +247,7 @@ public final class AjaxDataTablePanel<T extends Serializable, S> extends DataTab
                             builder.pageRef,
                             new ArrayList<>(group.getModelObject()),
                             // serialization problem with sublist only
-                            new ArrayList<>(builder.columns.subList(1, builder.columns.size() - 1)),
+                            new ArrayList<>(builder.columns.subList(1, builder.columns.size())),
                             builder.bulkActions,
                             builder.bulkActionExecutor,
                             builder.itemKeyField)));

http://git-wip-us.apache.org/repos/asf/syncope/blob/2e7e2cee/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyDirectoryPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyDirectoryPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyDirectoryPanel.java
index e4a48dc..0bbaf55 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyDirectoryPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyDirectoryPanel.java
@@ -29,6 +29,7 @@ import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.lang3.tuple.Pair;
 import org.apache.syncope.client.console.SyncopeConsoleSession;
 import org.apache.syncope.client.console.commons.AnyDataProvider;
+import org.apache.syncope.client.console.commons.Constants;
 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;
@@ -121,9 +122,9 @@ public abstract class AnyDirectoryPanel<A extends AnyTO, E extends AbstractAnyRe
             final Field field,
             final List<IColumn<A, String>> columns) {
 
-        if ("key".equalsIgnoreCase(name)) {
+        if (Constants.KEY_FIELD_NAME.equalsIgnoreCase(name)) {
             columns.add(new KeyPropertyColumn<A>(new ResourceModel(name, name), name, name));
-        } else if ("token".equalsIgnoreCase(name)) {
+        } else if (Constants.DEFAULT_TOKEN_FIELD_NAME.equalsIgnoreCase(name)) {
             columns.add(new TokenColumn<A>(new ResourceModel(name, name), name));
         } else if (field != null
                 && (field.getType().equals(Boolean.class) || field.getType().equals(boolean.class))) {

http://git-wip-us.apache.org/repos/asf/syncope/blob/2e7e2cee/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyObjectDirectoryPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyObjectDirectoryPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyObjectDirectoryPanel.java
index ff4d622..8ea0cea 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyObjectDirectoryPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyObjectDirectoryPanel.java
@@ -31,11 +31,11 @@ import org.apache.syncope.client.console.pages.BasePage;
 import org.apache.syncope.client.console.rest.AnyObjectRestClient;
 import org.apache.syncope.client.console.status.AnyStatusModal;
 import org.apache.syncope.client.console.tasks.AnyPropagationTasks;
-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.extensions.markup.html.repeater.data.table.KeyPropertyColumn;
 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.wicket.markup.html.form.ActionsPanel;
 import org.apache.syncope.client.console.wizards.AjaxWizard;
 import org.apache.syncope.client.console.wizards.WizardMgtPanel;
 import org.apache.syncope.client.console.wizards.any.AnyWrapper;
@@ -71,20 +71,50 @@ public class AnyObjectDirectoryPanel extends AnyDirectoryPanel<AnyObjectTO, AnyO
     }
 
     @Override
+    public ActionsPanel<Serializable> getHeader(final String componentId) {
+        final ActionsPanel<Serializable> panel = super.getHeader(componentId);
+
+        panel.add(new ActionLink<Serializable>() {
+
+            private static final long serialVersionUID = -7978723352517770644L;
+
+            @Override
+            public void onClick(final AjaxRequestTarget target, final Serializable ignore) {
+                target.add(displayAttributeModal.setContent(new AnyObjectDisplayAttributesModalPanel<>(
+                        displayAttributeModal, page.getPageReference(), pSchemaNames, dSchemaNames, type)));
+                displayAttributeModal.addSubmitButton();
+                displayAttributeModal.header(new ResourceModel("any.attr.display"));
+                displayAttributeModal.show(true);
+            }
+
+            @Override
+            protected boolean statusCondition(final Serializable modelObject) {
+                return wizardInModal;
+            }
+        }, ActionType.CHANGE_VIEW, AnyEntitlement.READ.getFor(type)).hideLabel();
+        return panel;
+    }
+
+    @Override
     protected List<IColumn<AnyObjectTO, String>> getColumns() {
         final List<IColumn<AnyObjectTO, String>> columns = new ArrayList<>();
+        final List<IColumn<AnyObjectTO, String>> prefcolumns = new ArrayList<>();
+
+        columns.add(new KeyPropertyColumn<AnyObjectTO>(
+                new ResourceModel(Constants.KEY_FIELD_NAME, Constants.KEY_FIELD_NAME), Constants.KEY_FIELD_NAME));
 
         for (String name : prefMan.getList(
                 getRequest(), String.format(Constants.PREF_ANY_OBJECT_DETAILS_VIEW, type))) {
-
-            addPropertyColumn(name, ReflectionUtils.findField(AnyObjectTO.class, name), columns);
+            if (!Constants.KEY_FIELD_NAME.equalsIgnoreCase(name)) {
+                addPropertyColumn(name, ReflectionUtils.findField(AnyObjectTO.class, name), prefcolumns);
+            }
         }
 
         for (String name : prefMan.getList(
                 getRequest(), String.format(Constants.PREF_ANY_OBJECT_PLAIN_ATTRS_VIEW, type))) {
 
             if (pSchemaNames.contains(name)) {
-                columns.add(new AttrColumn<AnyObjectTO>(name, SchemaType.PLAIN));
+                prefcolumns.add(new AttrColumn<AnyObjectTO>(name, SchemaType.PLAIN));
             }
         }
 
@@ -92,171 +122,132 @@ public class AnyObjectDirectoryPanel extends AnyDirectoryPanel<AnyObjectTO, AnyO
                 getRequest(), String.format(Constants.PREF_ANY_OBJECT_DER_ATTRS_VIEW, type))) {
 
             if (dSchemaNames.contains(name)) {
-                columns.add(new AttrColumn<AnyObjectTO>(name, SchemaType.DERIVED));
+                prefcolumns.add(new AttrColumn<AnyObjectTO>(name, SchemaType.DERIVED));
             }
         }
 
         // Add defaults in case of no selection
-        if (columns.isEmpty()) {
+        if (prefcolumns.isEmpty()) {
             for (String name : AnyObjectDisplayAttributesModalPanel.DEFAULT_SELECTION) {
-                addPropertyColumn(name, ReflectionUtils.findField(AnyObjectTO.class, name), columns);
+                addPropertyColumn(name, ReflectionUtils.findField(AnyObjectTO.class, name), prefcolumns);
             }
 
-            prefMan.setList(getRequest(), getResponse(),
-                    String.format(Constants.PREF_ANY_OBJECT_DETAILS_VIEW, type),
+            prefMan.setList(getRequest(), getResponse(), Constants.PREF_ANY_OBJECT_DETAILS_VIEW,
                     Arrays.asList(AnyObjectDisplayAttributesModalPanel.DEFAULT_SELECTION));
         }
 
-        columns.add(new ActionColumn<AnyObjectTO, String>(new ResourceModel("actions")) {
+        columns.addAll(prefcolumns);
+        return columns;
+    }
+
+    @Override
+    public ActionsPanel<AnyObjectTO> getActions(final IModel<AnyObjectTO> model) {
+        final ActionsPanel<AnyObjectTO> panel = super.getActions(model);
+
+        panel.add(new ActionLink<AnyObjectTO>() {
 
-            private static final long serialVersionUID = -3503023501954863131L;
+            private static final long serialVersionUID = -7978723352517770644L;
 
             @Override
-            public ActionLinksPanel<AnyObjectTO> getActions(final String componentId, final IModel<AnyObjectTO> model) {
-                final ActionLinksPanel.Builder<AnyObjectTO> panel = ActionLinksPanel.builder();
-
-                panel.add(new ActionLink<AnyObjectTO>() {
-
-                    private static final long serialVersionUID = -7978723352517770644L;
-
-                    @Override
-                    public void onClick(final AjaxRequestTarget target, final AnyObjectTO ignore) {
-                        send(AnyObjectDirectoryPanel.this, Broadcast.EXACT,
-                                new AjaxWizard.EditItemActionEvent<>(
-                                        new AnyWrapper<>(new AnyObjectRestClient().read(model.getObject().getKey())),
-                                        target));
-                    }
-                }, ActionType.EDIT, AnyEntitlement.READ.getFor(type)).add(new ActionLink<AnyObjectTO>() {
-
-                    private static final long serialVersionUID = -7978723352517770645L;
-
-                    @Override
-                    public void onClick(final AjaxRequestTarget target, final AnyObjectTO ignore) {
-                        final AnyObjectTO clone = SerializationUtils.clone(model.getObject());
-                        clone.setKey(null);
-                        send(AnyObjectDirectoryPanel.this, Broadcast.EXACT,
-                                new AjaxWizard.NewItemActionEvent<>(new AnyWrapper<>(clone), target));
-                    }
-
-                    @Override
-                    protected boolean statusCondition(final AnyObjectTO modelObject) {
-                        return addAjaxLink.isVisibleInHierarchy();
-                    }
-                }, ActionType.CLONE, AnyEntitlement.CREATE.getFor(type)).add(new ActionLink<AnyObjectTO>() {
-
-                    private static final long serialVersionUID = -7978723352517770646L;
-
-                    @Override
-                    public void onClick(final AjaxRequestTarget target, final AnyObjectTO ignore) {
-                        try {
-                            restClient.delete(model.getObject().getETagValue(), model.getObject().getKey());
-                            SyncopeConsoleSession.get().info(getString(Constants.OPERATION_SUCCEEDED));
-                            target.add(container);
-                        } catch (SyncopeClientException e) {
-                            LOG.error("While deleting object {}", model.getObject().getKey(), e);
-                            SyncopeConsoleSession.get().error(StringUtils.isBlank(e.getMessage())
-                                    ? e.getClass().getName() : e.getMessage());
-                        }
-                        ((BasePage) pageRef.getPage()).getNotificationPanel().refresh(target);
-                    }
-                }, ActionType.DELETE, AnyEntitlement.DELETE.getFor(type));
-
-                if (wizardInModal) {
-                    panel.add(new ActionLink<AnyObjectTO>() {
-
-                        private static final long serialVersionUID = -7978723352517770645L;
-
-                        @Override
-                        public void onClick(final AjaxRequestTarget target, final AnyObjectTO ignore) {
-                            final IModel<AnyWrapper<AnyObjectTO>> formModel = new CompoundPropertyModel<>(
-                                    new AnyWrapper<>(model.getObject()));
-                            altDefaultModal.setFormModel(formModel);
-
-                            target.add(altDefaultModal.setContent(new AnyStatusModal<>(
-                                    altDefaultModal,
-                                    pageRef,
-                                    formModel.getObject().getInnerObject(),
-                                    "resourceName",
-                                    false)));
-
-                            altDefaultModal.header(new Model<>(
-                                    getString("any.edit", new Model<>(new AnyWrapper<>(model.getObject())))));
-
-                            altDefaultModal.show(true);
-                        }
-                    }, ActionType.MANAGE_RESOURCES, AnyEntitlement.READ.getFor(type)).add(
-                            new ActionLink<AnyObjectTO>() {
-
-                        private static final long serialVersionUID = -7978723352517770644L;
-
-                        @Override
-                        public void onClick(final AjaxRequestTarget target, final AnyObjectTO ignore) {
-                            target.add(utilityModal.setContent(new AnyPropagationTasks(
-                                    utilityModal, AnyTypeKind.ANY_OBJECT, model.getObject().getKey(), pageRef)));
-
-                            utilityModal.header(new StringResourceModel("any.propagation.tasks", model));
-                            utilityModal.show(true);
-                        }
-                    }, ActionType.PROPAGATION_TASKS, StandardEntitlement.TASK_LIST).add(new ActionLink<AnyObjectTO>() {
-
-                                private static final long serialVersionUID = -7978723352517770644L;
-
-                                @Override
-                                public void onClick(final AjaxRequestTarget target, final AnyObjectTO ignore) {
-                                    target.add(utilityModal.setContent(
-                                            new NotificationTasks(AnyTypeKind.ANY_OBJECT, model.getObject().getKey(),
-                                                    pageRef)));
-                                    utilityModal.header(new StringResourceModel("any.notification.tasks", model));
-                                    utilityModal.show(true);
-                                    target.add(utilityModal);
-                                }
-                            }, ActionType.NOTIFICATION_TASKS, StandardEntitlement.TASK_LIST);
-                }
+            public void onClick(final AjaxRequestTarget target, final AnyObjectTO ignore) {
+                send(AnyObjectDirectoryPanel.this, Broadcast.EXACT,
+                        new AjaxWizard.EditItemActionEvent<>(
+                                new AnyWrapper<>(new AnyObjectRestClient().read(model.getObject().getKey())),
+                                target));
+            }
+        }, ActionType.EDIT, AnyEntitlement.READ.getFor(type));
+        panel.add(new ActionLink<AnyObjectTO>() {
 
-                return panel.build(componentId, model.getObject());
+            private static final long serialVersionUID = -7978723352517770645L;
+
+            @Override
+            public void onClick(final AjaxRequestTarget target, final AnyObjectTO ignore) {
+                final AnyObjectTO clone = SerializationUtils.clone(model.getObject());
+                clone.setKey(null);
+                send(AnyObjectDirectoryPanel.this, Broadcast.EXACT,
+                        new AjaxWizard.NewItemActionEvent<>(new AnyWrapper<>(clone), target));
             }
 
             @Override
-            public ActionLinksPanel<Serializable> getHeader(final String componentId) {
-                final ActionLinksPanel.Builder<Serializable> panel = ActionLinksPanel.builder();
-
-                panel.add(new ActionLink<Serializable>() {
-
-                    private static final long serialVersionUID = -7978723352517770644L;
-
-                    @Override
-                    public void onClick(final AjaxRequestTarget target, final Serializable ignore) {
-                        target.add(displayAttributeModal.setContent(new AnyObjectDisplayAttributesModalPanel<>(
-                                displayAttributeModal, page.getPageReference(), pSchemaNames, dSchemaNames, type)));
-                        displayAttributeModal.addSubmitButton();
-                        displayAttributeModal.header(new ResourceModel("any.attr.display"));
-                        displayAttributeModal.show(true);
-                    }
-
-                    @Override
-                    protected boolean statusCondition(final Serializable modelObject) {
-                        return wizardInModal;
-                    }
-                }, ActionType.CHANGE_VIEW, AnyEntitlement.READ.getFor(type)).add(
-                        new ActionLink<Serializable>() {
-
-                    private static final long serialVersionUID = -7978723352517770644L;
-
-                    @Override
-                    public void onClick(final AjaxRequestTarget target, final Serializable ignore) {
-                        if (target != null) {
-                            target.add(container);
-                        }
-                    }
-                }, ActionType.RELOAD, AnyEntitlement.SEARCH.getFor(type));
-
-                return panel.build(componentId);
+            protected boolean statusCondition(final AnyObjectTO modelObject) {
+                return addAjaxLink.isVisibleInHierarchy();
             }
+        }, ActionType.CLONE, AnyEntitlement.CREATE.getFor(type));
+
+        if (wizardInModal) {
+            panel.add(new ActionLink<AnyObjectTO>() {
+
+                private static final long serialVersionUID = -7978723352517770645L;
+
+                @Override
+                public void onClick(final AjaxRequestTarget target, final AnyObjectTO ignore) {
+                    final IModel<AnyWrapper<AnyObjectTO>> formModel = new CompoundPropertyModel<>(
+                            new AnyWrapper<>(model.getObject()));
+                    altDefaultModal.setFormModel(formModel);
+
+                    target.add(altDefaultModal.setContent(new AnyStatusModal<>(
+                            altDefaultModal,
+                            pageRef,
+                            formModel.getObject().getInnerObject(),
+                            "resourceName",
+                            false)));
+
+                    altDefaultModal.header(new Model<>(
+                            getString("any.edit", new Model<>(new AnyWrapper<>(model.getObject())))));
+
+                    altDefaultModal.show(true);
+                }
+            }, ActionType.MANAGE_RESOURCES, AnyEntitlement.READ.getFor(type));
+            panel.add(
+                    new ActionLink<AnyObjectTO>() {
+
+                private static final long serialVersionUID = -7978723352517770644L;
+
+                @Override
+                public void onClick(final AjaxRequestTarget target, final AnyObjectTO ignore) {
+                    target.add(utilityModal.setContent(new AnyPropagationTasks(
+                            utilityModal, AnyTypeKind.ANY_OBJECT, model.getObject().getKey(), pageRef)));
+
+                    utilityModal.header(new StringResourceModel("any.propagation.tasks", model));
+                    utilityModal.show(true);
+                }
+            }, ActionType.PROPAGATION_TASKS, StandardEntitlement.TASK_LIST);
+            panel.add(new ActionLink<AnyObjectTO>() {
+
+                private static final long serialVersionUID = -7978723352517770644L;
+
+                @Override
+                public void onClick(final AjaxRequestTarget target, final AnyObjectTO ignore) {
+                    target.add(utilityModal.setContent(
+                            new NotificationTasks(AnyTypeKind.ANY_OBJECT, model.getObject().getKey(),
+                                    pageRef)));
+                    utilityModal.header(new StringResourceModel("any.notification.tasks", model));
+                    utilityModal.show(true);
+                    target.add(utilityModal);
+                }
+            }, ActionType.NOTIFICATION_TASKS, StandardEntitlement.TASK_LIST);
         }
-        );
 
-        return columns;
+        panel.add(new ActionLink<AnyObjectTO>() {
+
+            private static final long serialVersionUID = -7978723352517770646L;
+
+            @Override
+            public void onClick(final AjaxRequestTarget target, final AnyObjectTO ignore) {
+                try {
+                    restClient.delete(model.getObject().getETagValue(), model.getObject().getKey());
+                    SyncopeConsoleSession.get().info(getString(Constants.OPERATION_SUCCEEDED));
+                    target.add(container);
+                } catch (SyncopeClientException e) {
+                    LOG.error("While deleting object {}", model.getObject().getKey(), e);
+                    SyncopeConsoleSession.get().error(StringUtils.isBlank(e.getMessage())
+                            ? e.getClass().getName() : e.getMessage());
+                }
+                ((BasePage) pageRef.getPage()).getNotificationPanel().refresh(target);
+            }
+        }, ActionType.DELETE, AnyEntitlement.DELETE.getFor(type), true);
 
+        return panel;
     }
 
     public static class Builder extends AnyDirectoryPanel.Builder<AnyObjectTO, AnyObjectRestClient> {