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:23:49 UTC

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

http://git-wip-us.apache.org/repos/asf/syncope/blob/f8b61e78/client/console/src/main/java/org/apache/syncope/client/console/panels/UserDirectoryPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/UserDirectoryPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/UserDirectoryPanel.java
index 80c958f..ad8bbec 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/UserDirectoryPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/UserDirectoryPanel.java
@@ -33,11 +33,11 @@ import org.apache.syncope.client.console.rest.UserRestClient;
 import org.apache.syncope.client.console.status.AnyStatusModal;
 import org.apache.syncope.client.console.status.ChangePasswordModal;
 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;
@@ -100,246 +100,251 @@ public class UserDirectoryPanel extends AnyDirectoryPanel<UserTO, UserRestClient
     }
 
     @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 UserDisplayAttributesModalPanel<>(
+                        displayAttributeModal, page.getPageReference(), pSchemaNames, dSchemaNames)));
+
+                displayAttributeModal.header(new ResourceModel("any.attr.display"));
+                displayAttributeModal.addSubmitButton();
+                displayAttributeModal.show(true);
+            }
+
+            @Override
+            protected boolean statusCondition(final Serializable modelObject) {
+                return wizardInModal;
+            }
+        }, ActionType.CHANGE_VIEW, StandardEntitlement.USER_READ).hideLabel();
+        return panel;
+    }
+
+    @Override
     protected List<IColumn<UserTO, String>> getColumns() {
         final List<IColumn<UserTO, String>> columns = new ArrayList<>();
+        final List<IColumn<UserTO, String>> prefcolumns = new ArrayList<IColumn<UserTO, String>>();
+
+        columns.add(new KeyPropertyColumn<UserTO>(
+                new ResourceModel(Constants.KEY_FIELD_NAME, Constants.KEY_FIELD_NAME), Constants.KEY_FIELD_NAME));
 
         for (String name : prefMan.getList(getRequest(), Constants.PREF_USERS_DETAILS_VIEW)) {
-            addPropertyColumn(name, ReflectionUtils.findField(UserTO.class, name), columns);
+            if (!Constants.KEY_FIELD_NAME.equalsIgnoreCase(name)) {
+                addPropertyColumn(name, ReflectionUtils.findField(UserTO.class, name), prefcolumns);
+            }
         }
 
         for (String name : prefMan.getList(getRequest(), Constants.PREF_USERS_PLAIN_ATTRS_VIEW)) {
             if (pSchemaNames.contains(name)) {
-                columns.add(new AttrColumn<UserTO>(name, SchemaType.PLAIN));
+                prefcolumns.add(new AttrColumn<UserTO>(name, SchemaType.PLAIN));
             }
         }
 
         for (String name : prefMan.getList(getRequest(), Constants.PREF_USERS_DER_ATTRS_VIEW)) {
             if (dSchemaNames.contains(name)) {
-                columns.add(new AttrColumn<UserTO>(name, SchemaType.DERIVED));
+                prefcolumns.add(new AttrColumn<UserTO>(name, SchemaType.DERIVED));
             }
         }
 
         // Add defaults in case of no selection
-        if (columns.isEmpty()) {
+        if (prefcolumns.isEmpty()) {
             for (String name : UserDisplayAttributesModalPanel.DEFAULT_SELECTION) {
-                addPropertyColumn(name, ReflectionUtils.findField(UserTO.class, name), columns);
+                addPropertyColumn(name, ReflectionUtils.findField(UserTO.class, name), prefcolumns);
             }
 
             prefMan.setList(getRequest(), getResponse(), Constants.PREF_USERS_DETAILS_VIEW,
                     Arrays.asList(UserDisplayAttributesModalPanel.DEFAULT_SELECTION));
         }
 
-        columns.add(new ActionColumn<UserTO, String>(new ResourceModel("actions")) {
+        columns.addAll(prefcolumns);
+        return columns;
+    }
+
+    @Override
+    public ActionsPanel<UserTO> getActions(final IModel<UserTO> model) {
+        final ActionsPanel<UserTO> panel = super.getActions(model);
+
+        panel.add(new ActionLink<UserTO>() {
 
-            private static final long serialVersionUID = -3503023501954863131L;
+            private static final long serialVersionUID = -7978723352517770644L;
 
             @Override
-            public ActionLinksPanel<UserTO> getActions(final String componentId, final IModel<UserTO> model) {
-                final ActionLinksPanel.Builder<UserTO> panel = ActionLinksPanel.builder();
-
-                panel.add(new ActionLink<UserTO>() {
-
-                    private static final long serialVersionUID = -7978723352517770644L;
-
-                    @Override
-                    public void onClick(final AjaxRequestTarget target, final UserTO ignore) {
-                        try {
-                            UserRestClient.class.cast(restClient).mustChangePassword(
-                                    model.getObject().getETagValue(),
-                                    !model.getObject().isMustChangePassword(),
-                                    model.getObject().getKey());
-                            SyncopeConsoleSession.get().info(getString(Constants.OPERATION_SUCCEEDED));
-                            target.add(container);
-                        } catch (Exception 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.MUSTCHANGEPASSWORD, StandardEntitlement.USER_UPDATE).add(new ActionLink<UserTO>() {
-
-                    private static final long serialVersionUID = -7978723352517770644L;
-
-                    @Override
-                    public void onClick(final AjaxRequestTarget target, final UserTO ignore) {
-                        send(UserDirectoryPanel.this, Broadcast.EXACT,
-                                new AjaxWizard.EditItemActionEvent<>(
-                                        new UserWrapper(new UserRestClient().read(model.getObject().getKey())),
-                                        target));
-                    }
-                }, ActionType.EDIT, new StringBuilder().append(StandardEntitlement.USER_READ).append(",").
-                        append(StandardEntitlement.USER_UPDATE).toString()).add(new ActionLink<UserTO>() {
-
-                    private static final long serialVersionUID = -7978723352517770644L;
-
-                    @Override
-                    public void onClick(final AjaxRequestTarget target, final UserTO ignore) {
-                        UserTO clone = SerializationUtils.clone(model.getObject());
-                        clone.setKey(null);
-                        clone.setUsername(model.getObject().getUsername() + "_clone");
-                        send(UserDirectoryPanel.this, Broadcast.EXACT,
-                                new AjaxWizard.NewItemActionEvent<>(new UserWrapper(clone), target));
-                    }
-
-                    @Override
-                    protected boolean statusCondition(final UserTO modelObject) {
-                        return addAjaxLink.isVisibleInHierarchy();
-                    }
-
-                }, ActionType.CLONE, StandardEntitlement.USER_CREATE).add(new ActionLink<UserTO>() {
-
-                    private static final long serialVersionUID = -7978723352517770644L;
-
-                    @Override
-                    public void onClick(final AjaxRequestTarget target, final UserTO ignore) {
-                        try {
-                            restClient.delete(model.getObject().getETagValue(), model.getObject().getKey());
-                            SyncopeConsoleSession.get().info(getString(Constants.OPERATION_SUCCEEDED));
-                            target.add(container);
-                        } catch (Exception 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, StandardEntitlement.USER_DELETE);
-
-                if (wizardInModal) {
-                    panel.add(new ActionLink<UserTO>() {
-
-                        private static final long serialVersionUID = -7978723352517770644L;
-
-                        @Override
-                        public void onClick(final AjaxRequestTarget target, final UserTO ignore) {
-                            IModel<AnyWrapper<UserTO>> 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, StandardEntitlement.USER_UPDATE).add(new ActionLink<UserTO>() {
-
-                        private static final long serialVersionUID = -7978723352517770644L;
-
-                        @Override
-                        public void onClick(final AjaxRequestTarget target, final UserTO ignore) {
-                            IModel<AnyWrapper<UserTO>> formModel = new CompoundPropertyModel<>(
-                                    new AnyWrapper<>(model.getObject()));
-                            altDefaultModal.setFormModel(formModel);
-
-                            target.add(altDefaultModal.setContent(new AnyStatusModal<>(
-                                    altDefaultModal,
-                                    pageRef,
-                                    formModel.getObject().getInnerObject(),
-                                    "resourceName",
-                                    true)));
-
-                            altDefaultModal.header(new Model<>(
-                                    getString("any.edit", new Model<>(new AnyWrapper<>(model.getObject())))));
-
-                            altDefaultModal.show(true);
-                        }
-                    }, ActionType.ENABLE, StandardEntitlement.USER_UPDATE).add(new ActionLink<UserTO>() {
-
-                        private static final long serialVersionUID = -7978723352517770644L;
-
-                        @Override
-                        public void onClick(final AjaxRequestTarget target, final UserTO ignore) {
-                            target.add(utilityModal.setContent(new AnyPropagationTasks(
-                                    utilityModal, AnyTypeKind.USER, model.getObject().getKey(), pageRef)));
-
-                            utilityModal.header(new StringResourceModel("any.propagation.tasks", model));
-                            utilityModal.show(true);
-                        }
-                    }, ActionType.PROPAGATION_TASKS, StandardEntitlement.TASK_LIST).add(new ActionLink<UserTO>() {
-
-                        private static final long serialVersionUID = -7978723352517770644L;
-
-                        @Override
-                        public void onClick(final AjaxRequestTarget target, final UserTO ignore) {
-                            target.add(utilityModal.setContent(
-                                    new NotificationTasks(AnyTypeKind.USER, model.getObject().getKey(), pageRef)));
-                            utilityModal.header(new StringResourceModel("any.notification.tasks", model));
-                            utilityModal.show(true);
-                            target.add(utilityModal);
-                        }
-                    }, ActionType.NOTIFICATION_TASKS, StandardEntitlement.TASK_LIST).add(new ActionLink<UserTO>() {
-
-                        private static final long serialVersionUID = -4875218360625971340L;
-
-                        @Override
-                        public void onClick(final AjaxRequestTarget target, final UserTO ignore) {
-                            IModel<AnyWrapper<UserTO>> formModel = new CompoundPropertyModel<>(
-                                    new AnyWrapper<>(model.getObject()));
-                            displayAttributeModal.setFormModel(formModel);
-
-                            target.add(displayAttributeModal.setContent(new ChangePasswordModal(
-                                    displayAttributeModal,
-                                    pageRef,
-                                    new UserWrapper(model.getObject()))));
-
-                            displayAttributeModal.header(new Model<>(
-                                    getString("any.edit", new Model<>(new AnyWrapper<>(model.getObject())))));
-
-                            displayAttributeModal.show(true);
-                        }
-                    }, ActionType.PASSWORD_RESET,
-                            new StringBuilder().append(StandardEntitlement.USER_UPDATE).toString());
-                }
+            public void onClick(final AjaxRequestTarget target, final UserTO ignore) {
+                send(UserDirectoryPanel.this, Broadcast.EXACT,
+                        new AjaxWizard.EditItemActionEvent<>(
+                                new UserWrapper(new UserRestClient().read(model.getObject().getKey())),
+                                target));
+            }
+        }, ActionType.EDIT, new StringBuilder().append(StandardEntitlement.USER_READ).append(",").
+                append(StandardEntitlement.USER_UPDATE).toString());
+
+        panel.add(new ActionLink<UserTO>() {
 
-                return panel.build(componentId, model.getObject());
+            private static final long serialVersionUID = -7978723352517770644L;
+
+            @Override
+            public void onClick(final AjaxRequestTarget target, final UserTO ignore) {
+                UserTO clone = SerializationUtils.clone(model.getObject());
+                clone.setKey(null);
+                clone.setUsername(model.getObject().getUsername() + "_clone");
+                send(UserDirectoryPanel.this, Broadcast.EXACT,
+                        new AjaxWizard.NewItemActionEvent<>(new UserWrapper(clone), target));
             }
 
             @Override
-            public ActionLinksPanel<Serializable> getHeader(final String componentId) {
-                final ActionLinksPanel.Builder<Serializable> panel = ActionLinksPanel.builder();
-
-                return 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 UserDisplayAttributesModalPanel<>(
-                                displayAttributeModal, page.getPageReference(), pSchemaNames, dSchemaNames)));
-
-                        displayAttributeModal.header(new ResourceModel("any.attr.display"));
-                        displayAttributeModal.addSubmitButton();
-                        displayAttributeModal.show(true);
-                    }
-
-                    @Override
-                    protected boolean statusCondition(final Serializable modelObject) {
-                        return wizardInModal;
-                    }
-                }, ActionType.CHANGE_VIEW, StandardEntitlement.USER_READ).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, StandardEntitlement.USER_SEARCH).build(componentId);
+            protected boolean statusCondition(final UserTO modelObject) {
+                return addAjaxLink.isVisibleInHierarchy();
             }
-        });
 
-        return columns;
+        }, ActionType.CLONE, StandardEntitlement.USER_CREATE);
+
+        panel.add(new ActionLink<UserTO>() {
+
+            private static final long serialVersionUID = -7978723352517770644L;
+
+            @Override
+            public void onClick(final AjaxRequestTarget target, final UserTO ignore) {
+                try {
+                    UserRestClient.class.cast(restClient).mustChangePassword(
+                            model.getObject().getETagValue(),
+                            !model.getObject().isMustChangePassword(),
+                            model.getObject().getKey());
+                    SyncopeConsoleSession.get().info(getString(Constants.OPERATION_SUCCEEDED));
+                    target.add(container);
+                } catch (Exception 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.MUSTCHANGEPASSWORD, StandardEntitlement.USER_UPDATE);
+
+        if (wizardInModal) {
+            panel.add(new ActionLink<UserTO>() {
+
+                private static final long serialVersionUID = -4875218360625971340L;
+
+                @Override
+                public void onClick(final AjaxRequestTarget target, final UserTO ignore) {
+                    IModel<AnyWrapper<UserTO>> formModel = new CompoundPropertyModel<>(
+                            new AnyWrapper<>(model.getObject()));
+                    displayAttributeModal.setFormModel(formModel);
+
+                    target.add(displayAttributeModal.setContent(new ChangePasswordModal(
+                            displayAttributeModal,
+                            pageRef,
+                            new UserWrapper(model.getObject()))));
+
+                    displayAttributeModal.header(new Model<>(
+                            getString("any.edit", new Model<>(new AnyWrapper<>(model.getObject())))));
+
+                    displayAttributeModal.show(true);
+                }
+            }, ActionType.PASSWORD_RESET,
+                    new StringBuilder().append(StandardEntitlement.USER_UPDATE).toString());
+
+            panel.add(new ActionLink<UserTO>() {
+
+                private static final long serialVersionUID = -7978723352517770644L;
+
+                @Override
+                public void onClick(final AjaxRequestTarget target, final UserTO ignore) {
+                    IModel<AnyWrapper<UserTO>> formModel = new CompoundPropertyModel<>(
+                            new AnyWrapper<>(model.getObject()));
+                    altDefaultModal.setFormModel(formModel);
+
+                    target.add(altDefaultModal.setContent(new AnyStatusModal<>(
+                            altDefaultModal,
+                            pageRef,
+                            formModel.getObject().getInnerObject(),
+                            "resourceName",
+                            true)));
+
+                    altDefaultModal.header(new Model<>(
+                            getString("any.edit", new Model<>(new AnyWrapper<>(model.getObject())))));
+
+                    altDefaultModal.show(true);
+                }
+            }, ActionType.ENABLE, StandardEntitlement.USER_UPDATE);
+
+            panel.add(new ActionLink<UserTO>() {
+
+                private static final long serialVersionUID = -7978723352517770644L;
+
+                @Override
+                public void onClick(final AjaxRequestTarget target, final UserTO ignore) {
+                    IModel<AnyWrapper<UserTO>> 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, StandardEntitlement.USER_UPDATE);
+
+            panel.add(new ActionLink<UserTO>() {
+
+                private static final long serialVersionUID = -7978723352517770644L;
+
+                @Override
+                public void onClick(final AjaxRequestTarget target, final UserTO ignore) {
+                    target.add(utilityModal.setContent(new AnyPropagationTasks(
+                            utilityModal, AnyTypeKind.USER, 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<UserTO>() {
+
+                private static final long serialVersionUID = -7978723352517770644L;
+
+                @Override
+                public void onClick(final AjaxRequestTarget target, final UserTO ignore) {
+                    target.add(utilityModal.setContent(
+                            new NotificationTasks(AnyTypeKind.USER, model.getObject().getKey(), pageRef)));
+                    utilityModal.header(new StringResourceModel("any.notification.tasks", model));
+                    utilityModal.show(true);
+                    target.add(utilityModal);
+                }
+            }, ActionType.NOTIFICATION_TASKS, StandardEntitlement.TASK_LIST);
+        }
+
+        panel.add(new ActionLink<UserTO>() {
+
+            private static final long serialVersionUID = -7978723352517770644L;
+
+            @Override
+            public void onClick(final AjaxRequestTarget target, final UserTO ignore) {
+                try {
+                    restClient.delete(model.getObject().getETagValue(), model.getObject().getKey());
+                    SyncopeConsoleSession.get().info(getString(Constants.OPERATION_SUCCEEDED));
+                    target.add(container);
+                } catch (Exception 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, StandardEntitlement.USER_DELETE, true);
+
+        return panel;
     }
 
     public static class Builder extends AnyDirectoryPanel.Builder<UserTO, UserRestClient> {

http://git-wip-us.apache.org/repos/asf/syncope/blob/f8b61e78/client/console/src/main/java/org/apache/syncope/client/console/panels/UserDisplayAttributesModalPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/UserDisplayAttributesModalPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/UserDisplayAttributesModalPanel.java
index 1ef96ca..513ec9d 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/UserDisplayAttributesModalPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/UserDisplayAttributesModalPanel.java
@@ -35,7 +35,7 @@ public class UserDisplayAttributesModalPanel<T extends Serializable> extends Dis
 
     private static final long serialVersionUID = 5194630813773543054L;
 
-    public static final String[] DEFAULT_SELECTION = { "key", "username", "status", "mustChangePassword" };
+    public static final String[] DEFAULT_SELECTION = { "username", "status", "mustChangePassword" };
 
     public UserDisplayAttributesModalPanel(
             final BaseModal<T> modal,

http://git-wip-us.apache.org/repos/asf/syncope/blob/f8b61e78/client/console/src/main/java/org/apache/syncope/client/console/panels/WorkflowDirectoryPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/WorkflowDirectoryPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/WorkflowDirectoryPanel.java
index b7192b3..3225b52 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/WorkflowDirectoryPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/WorkflowDirectoryPanel.java
@@ -37,12 +37,11 @@ import org.apache.syncope.client.console.pages.BasePage;
 import org.apache.syncope.client.console.pages.ModelerPopupPage;
 import org.apache.syncope.client.console.panels.WorkflowDirectoryPanel.WorkflowDefinitionDataProvider;
 import org.apache.syncope.client.console.rest.WorkflowRestClient;
-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.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.wicket.markup.html.form.ImageModalPanel;
 import org.apache.syncope.client.console.wicket.markup.html.form.XMLEditorPanel;
 import org.apache.syncope.client.console.wizards.AjaxWizardBuilder;
@@ -162,142 +161,130 @@ public class WorkflowDirectoryPanel extends DirectoryPanel<
     protected List<IColumn<WorkflowDefinitionTO, String>> getColumns() {
         List<IColumn<WorkflowDefinitionTO, String>> columns = new ArrayList<>();
 
-        columns.add(new KeyPropertyColumn<WorkflowDefinitionTO>(new ResourceModel("key"), "key", "key"));
+        columns.add(new KeyPropertyColumn<WorkflowDefinitionTO>(new ResourceModel("key"), "key"));
         columns.add(new PropertyColumn<WorkflowDefinitionTO, String>(new ResourceModel("name"), "name", "name"));
         columns.add(new BooleanPropertyColumn<WorkflowDefinitionTO>(new ResourceModel("main"), null, "main"));
 
-        columns.add(new ActionColumn<WorkflowDefinitionTO, String>(new ResourceModel("actions")) {
-
-            private static final long serialVersionUID = 906457126287899096L;
+        return columns;
+    }
 
-            @Override
-            public ActionLinksPanel<?> getActions(final String componentId, final IModel<WorkflowDefinitionTO> model) {
-                final ActionLinksPanel.Builder<WorkflowDefinitionTO> panel = ActionLinksPanel.builder();
+    @Override
+    public ActionsPanel<WorkflowDefinitionTO> getActions(final IModel<WorkflowDefinitionTO> model) {
+        final ActionsPanel<WorkflowDefinitionTO> panel = super.getActions(model);
 
-                panel.add(new ActionLink<WorkflowDefinitionTO>() {
+        panel.add(new ActionLink<WorkflowDefinitionTO>() {
 
-                    private static final long serialVersionUID = 3109256773218160485L;
+            private static final long serialVersionUID = -184018732772021627L;
 
-                    @Override
-                    public void onClick(final AjaxRequestTarget target, final WorkflowDefinitionTO ignore) {
-                        modal.header(Model.of(model.getObject().getKey()));
-                        modal.setContent(new ImageModalPanel<>(
-                                modal, restClient.getDiagram(model.getObject().getKey()), pageRef));
-                        modal.show(target);
-                        target.add(modal);
-                    }
-                }, ActionLink.ActionType.VIEW, StandardEntitlement.WORKFLOW_DEF_GET);
+            @Override
+            public void onClick(final AjaxRequestTarget target, final WorkflowDefinitionTO ignore) {
+                final IModel<String> wfDefinition = new Model<>();
+                try {
+                    wfDefinition.setObject(IOUtils.toString(restClient.getDefinition(
+                            MediaType.APPLICATION_XML_TYPE, model.getObject().getKey())));
+                } catch (IOException e) {
+                    LOG.error("Could not get workflow definition", e);
+                }
 
-                panel.add(new ActionLink<WorkflowDefinitionTO>() {
+                utility.header(Model.of(model.getObject().getKey()));
+                utility.setContent(new XMLEditorPanel(utility, wfDefinition, false, pageRef) {
 
-                    private static final long serialVersionUID = -184018732772021627L;
+                    private static final long serialVersionUID = -7688359318035249200L;
 
                     @Override
-                    public void onClick(final AjaxRequestTarget target, final WorkflowDefinitionTO ignore) {
-                        final IModel<String> wfDefinition = new Model<>();
-                        try {
-                            wfDefinition.setObject(IOUtils.toString(restClient.getDefinition(
-                                    MediaType.APPLICATION_XML_TYPE, model.getObject().getKey())));
-                        } catch (IOException e) {
-                            LOG.error("Could not get workflow definition", e);
-                        }
-
-                        utility.header(Model.of(model.getObject().getKey()));
-                        utility.setContent(new XMLEditorPanel(utility, wfDefinition, false, pageRef) {
-
-                            private static final long serialVersionUID = -7688359318035249200L;
-
-                            @Override
-                            public void onSubmit(final AjaxRequestTarget target, final Form<?> form) {
-                                if (StringUtils.isNotBlank(wfDefinition.getObject())) {
-                                    try {
-                                        restClient.setDefinition(MediaType.APPLICATION_XML_TYPE,
-                                                model.getObject().getKey(), wfDefinition.getObject());
-                                        SyncopeConsoleSession.get().info(getString(Constants.OPERATION_SUCCEEDED));
-
-                                        target.add(container);
-                                        utility.show(false);
-                                        utility.close(target);
-                                    } catch (SyncopeClientException e) {
-                                        SyncopeConsoleSession.get().error(StringUtils.isBlank(e.getMessage())
-                                                ? e.getClass().getName() : e.getMessage());
-                                    }
-                                    ((BasePage) pageRef.getPage()).getNotificationPanel().refresh(target);
-                                }
+                    public void onSubmit(final AjaxRequestTarget target, final Form<?> form) {
+                        if (StringUtils.isNotBlank(wfDefinition.getObject())) {
+                            try {
+                                restClient.setDefinition(MediaType.APPLICATION_XML_TYPE,
+                                        model.getObject().getKey(), wfDefinition.getObject());
+                                SyncopeConsoleSession.get().info(getString(Constants.OPERATION_SUCCEEDED));
+
+                                target.add(container);
+                                utility.show(false);
+                                utility.close(target);
+                            } catch (SyncopeClientException e) {
+                                SyncopeConsoleSession.get().error(StringUtils.isBlank(e.getMessage())
+                                        ? e.getClass().getName() : e.getMessage());
                             }
-                        });
-                        utility.show(target);
-                        target.add(utility);
+                            ((BasePage) pageRef.getPage()).getNotificationPanel().refresh(target);
+                        }
                     }
-                }, ActionLink.ActionType.EDIT, StandardEntitlement.WORKFLOW_DEF_SET);
-
-                panel.add(new ActionLink<WorkflowDefinitionTO>() {
+                });
+                utility.show(target);
+                target.add(utility);
+            }
+        }, ActionLink.ActionType.EDIT, StandardEntitlement.WORKFLOW_DEF_SET);
 
-                    private static final long serialVersionUID = -184018732772021627L;
+        panel.add(new ActionLink<WorkflowDefinitionTO>() {
 
-                    @Override
-                    public Class<? extends Page> getPageClass() {
-                        return ModelerPopupPage.class;
-                    }
+            private static final long serialVersionUID = 3109256773218160485L;
 
-                    @Override
-                    public PageParameters getPageParameters() {
-                        PageParameters parameters = new PageParameters();
-                        if (modelerCtx != null) {
-                            parameters.add(Constants.MODELER_CONTEXT, modelerCtx);
-                        }
-                        parameters.add(Constants.MODEL_ID_PARAM, model.getObject().getModelId());
+            @Override
+            public void onClick(final AjaxRequestTarget target, final WorkflowDefinitionTO ignore) {
+                modal.header(Model.of(model.getObject().getKey()));
+                modal.setContent(new ImageModalPanel<>(
+                        modal, restClient.getDiagram(model.getObject().getKey()), pageRef));
+                modal.show(target);
+                target.add(modal);
+            }
+        }, ActionLink.ActionType.VIEW, StandardEntitlement.WORKFLOW_DEF_GET);
 
-                        return parameters;
-                    }
+        panel.add(new ActionLink<WorkflowDefinitionTO>() {
 
-                    @Override
-                    public void onClick(final AjaxRequestTarget target, final WorkflowDefinitionTO ignore) {
-                        // do nothing
-                    }
-                }, ActionLink.ActionType.WORKFLOW_MODELER, StandardEntitlement.WORKFLOW_DEF_SET, modelerCtx != null);
+            private static final long serialVersionUID = -184018732772021627L;
 
-                panel.add(new ActionLink<WorkflowDefinitionTO>() {
+            @Override
+            public Class<? extends Page> getPageClass() {
+                return ModelerPopupPage.class;
+            }
 
-                    private static final long serialVersionUID = -7978723352517770644L;
+            @Override
+            public PageParameters getPageParameters() {
+                PageParameters parameters = new PageParameters();
+                if (modelerCtx != null) {
+                    parameters.add(Constants.MODELER_CONTEXT, modelerCtx);
+                }
+                parameters.add(Constants.MODEL_ID_PARAM, model.getObject().getModelId());
 
-                    @Override
-                    public void onClick(final AjaxRequestTarget target, final WorkflowDefinitionTO ignore) {
-                        try {
-                            restClient.deleteDefinition(model.getObject().getKey());
-                            SyncopeConsoleSession.get().info(getString(Constants.OPERATION_SUCCEEDED));
-                            target.add(container);
-                        } catch (SyncopeClientException e) {
-                            LOG.error("While deleting workflow definition {}", model.getObject().getName(), e);
-                            SyncopeConsoleSession.get().error(
-                                    StringUtils.isBlank(e.getMessage()) ? e.getClass().getName() : e.getMessage());
-                        }
-                        ((BasePage) pageRef.getPage()).getNotificationPanel().refresh(target);
-                    }
-                }, ActionLink.ActionType.DELETE, StandardEntitlement.WORKFLOW_DEF_DELETE, !model.getObject().isMain());
+                return parameters;
+            }
 
-                return panel.build(componentId);
+            @Override
+            protected boolean statusCondition(final WorkflowDefinitionTO modelObject) {
+                return modelerCtx != null;
             }
 
             @Override
-            public ActionLinksPanel<WorkflowDefinitionTO> getHeader(final String componentId) {
-                final ActionLinksPanel.Builder<WorkflowDefinitionTO> panel = ActionLinksPanel.builder();
+            public void onClick(final AjaxRequestTarget target, final WorkflowDefinitionTO ignore) {
+                // do nothing
+            }
+        }, ActionLink.ActionType.WORKFLOW_MODELER, StandardEntitlement.WORKFLOW_DEF_SET);
 
-                return panel.add(new ActionLink<WorkflowDefinitionTO>() {
+        panel.add(new ActionLink<WorkflowDefinitionTO>() {
 
-                    private static final long serialVersionUID = -184018732772021627L;
+            private static final long serialVersionUID = -7978723352517770644L;
 
-                    @Override
-                    public void onClick(final AjaxRequestTarget target, final WorkflowDefinitionTO ignore) {
-                        if (target != null) {
-                            target.add(container);
-                        }
-                    }
-                }, ActionLink.ActionType.RELOAD, StandardEntitlement.WORKFLOW_DEF_LIST).build(componentId);
+            @Override
+            protected boolean statusCondition(final WorkflowDefinitionTO modelObject) {
+                return !modelObject.isMain();
             }
-        });
 
-        return columns;
+            @Override
+            public void onClick(final AjaxRequestTarget target, final WorkflowDefinitionTO ignore) {
+                try {
+                    restClient.deleteDefinition(model.getObject().getKey());
+                    SyncopeConsoleSession.get().info(getString(Constants.OPERATION_SUCCEEDED));
+                    target.add(container);
+                } catch (SyncopeClientException e) {
+                    LOG.error("While deleting workflow definition {}", model.getObject().getName(), e);
+                    SyncopeConsoleSession.get().error(
+                            StringUtils.isBlank(e.getMessage()) ? e.getClass().getName() : e.getMessage());
+                }
+                ((BasePage) pageRef.getPage()).getNotificationPanel().refresh(target);
+            }
+        }, ActionLink.ActionType.DELETE, StandardEntitlement.WORKFLOW_DEF_DELETE, true);
+
+        return panel;
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/syncope/blob/f8b61e78/client/console/src/main/java/org/apache/syncope/client/console/panels/search/AnyObjectSelectionDirectoryPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/search/AnyObjectSelectionDirectoryPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/search/AnyObjectSelectionDirectoryPanel.java
index d89b3ea..8276be9 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/search/AnyObjectSelectionDirectoryPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/search/AnyObjectSelectionDirectoryPanel.java
@@ -20,7 +20,6 @@ package org.apache.syncope.client.console.panels.search;
 
 import java.util.List;
 import org.apache.syncope.client.console.commons.Constants;
-import org.apache.syncope.client.console.panels.AnyObjectDisplayAttributesModalPanel;
 import org.apache.syncope.client.console.rest.AnyObjectRestClient;
 import org.apache.syncope.client.console.wizards.WizardMgtPanel;
 import org.apache.syncope.client.console.wizards.any.AnyWrapper;
@@ -43,11 +42,6 @@ public final class AnyObjectSelectionDirectoryPanel
     }
 
     @Override
-    protected String[] getDisplayAttributes() {
-        return AnyObjectDisplayAttributesModalPanel.DEFAULT_SELECTION;
-    }
-
-    @Override
     public String getPrefDetailsView() {
         return String.format(Constants.PREF_ANY_OBJECT_DETAILS_VIEW, type);
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/f8b61e78/client/console/src/main/java/org/apache/syncope/client/console/panels/search/AnySelectionDirectoryPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/search/AnySelectionDirectoryPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/search/AnySelectionDirectoryPanel.java
index 5919dee..27712ce 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/search/AnySelectionDirectoryPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/search/AnySelectionDirectoryPanel.java
@@ -21,15 +21,12 @@ package org.apache.syncope.client.console.panels.search;
 import java.io.Serializable;
 import java.lang.reflect.Field;
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Date;
 import java.util.List;
-import org.apache.syncope.client.console.panels.AnyObjectDisplayAttributesModalPanel;
 import org.apache.syncope.client.console.panels.AnyDirectoryPanel;
 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;
 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.DatePropertyColumn;
@@ -37,7 +34,7 @@ import org.apache.syncope.client.console.wicket.extensions.markup.html.repeater.
 import org.apache.syncope.client.console.wicket.extensions.markup.html.repeater.data.table.TokenColumn;
 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.AnyTypeClassTO;
 import org.apache.syncope.common.lib.to.AnyObjectTO;
 import org.apache.syncope.common.lib.to.AnyTO;
@@ -104,71 +101,25 @@ public abstract class AnySelectionDirectoryPanel<A extends AnyTO, E extends Abst
             }
         }
 
-        // Add defaults in case of no selection
-        if (columns.isEmpty()) {
-            for (String name : getDisplayAttributes()) {
-                columns.add(new PropertyColumn<A, String>(new ResourceModel(name, name), name, name));
-            }
-
-            prefMan.setList(getRequest(), getResponse(), getPrefDetailsView(), Arrays.asList(getDisplayAttributes()));
-        }
-
-        columns.add(new ActionColumn<A, String>(new ResourceModel("actions")) {
-
-            private static final long serialVersionUID = -3503023501954863131L;
-
-            @Override
-            public ActionLinksPanel<A> getActions(final String componentId, final IModel<A> model) {
-                final ActionLinksPanel.Builder<A> panel = ActionLinksPanel.builder();
+        return columns;
+    }
 
-                panel.add(new ActionLink<A>() {
+    @Override
+    public ActionsPanel<A> getActions(final IModel<A> model) {
+        final ActionsPanel<A> panel = super.getActions(model);
 
-                    private static final long serialVersionUID = -7978723352517770644L;
+        panel.add(new ActionLink<A>() {
 
-                    @Override
-                    public void onClick(final AjaxRequestTarget target, final A ignore) {
-                        send(AnySelectionDirectoryPanel.this,
-                                Broadcast.BUBBLE, new ItemSelection<>(target, model.getObject()));
-                    }
-                }, ActionType.SELECT, AnyEntitlement.READ.getFor(type));
-
-                return panel.build(componentId, model.getObject());
-            }
+            private static final long serialVersionUID = -7978723352517770644L;
 
             @Override
-            public ActionLinksPanel<A> getHeader(final String componentId) {
-                final ActionLinksPanel.Builder<A> panel = ActionLinksPanel.builder();
-
-                return panel.add(new ActionLink<A>() {
-
-                    private static final long serialVersionUID = -7978723352517770644L;
-
-                    @Override
-                    public void onClick(final AjaxRequestTarget target, final A ignore) {
-                        // still missing content
-                        target.add(altDefaultModal.setContent(new AnyObjectDisplayAttributesModalPanel<>(
-                                altDefaultModal, page.getPageReference(), pSchemaNames, dSchemaNames, type)));
-
-                        altDefaultModal.addSubmitButton();
-                        altDefaultModal.header(new ResourceModel("any.attr.display"));
-                        altDefaultModal.show(true);
-                    }
-                }, ActionType.CHANGE_VIEW, AnyEntitlement.READ.getFor(type)).add(new ActionLink<A>() {
-
-                    private static final long serialVersionUID = -7978723352517770644L;
-
-                    @Override
-                    public void onClick(final AjaxRequestTarget target, final A ignore) {
-                        if (target != null) {
-                            target.add(container);
-                        }
-                    }
-                }, ActionType.RELOAD, AnyEntitlement.SEARCH.getFor(type)).
-                        build(componentId);
+            public void onClick(final AjaxRequestTarget target, final A ignore) {
+                send(AnySelectionDirectoryPanel.this,
+                        Broadcast.BUBBLE, new ItemSelection<>(target, model.getObject()));
             }
-        });
+        }, ActionType.SELECT, AnyEntitlement.READ.getFor(type));
 
-        return columns;
+        return panel;
     }
 
     @Override
@@ -176,8 +127,6 @@ public abstract class AnySelectionDirectoryPanel<A extends AnyTO, E extends Abst
         return Collections.<ActionType>emptyList();
     }
 
-    protected abstract String[] getDisplayAttributes();
-
     protected abstract String getPrefDetailsView();
 
     protected abstract String getPrefPlainAttributesView();

http://git-wip-us.apache.org/repos/asf/syncope/blob/f8b61e78/client/console/src/main/java/org/apache/syncope/client/console/panels/search/GroupSelectionDirectoryPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/search/GroupSelectionDirectoryPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/search/GroupSelectionDirectoryPanel.java
index 65c7bd6..4642414 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/search/GroupSelectionDirectoryPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/search/GroupSelectionDirectoryPanel.java
@@ -20,7 +20,6 @@ package org.apache.syncope.client.console.panels.search;
 
 import java.util.List;
 import org.apache.syncope.client.console.commons.Constants;
-import org.apache.syncope.client.console.panels.GroupDisplayAttributesModalPanel;
 import org.apache.syncope.client.console.rest.GroupRestClient;
 import org.apache.syncope.client.console.wizards.WizardMgtPanel;
 import org.apache.syncope.client.console.wizards.any.AnyWrapper;
@@ -42,11 +41,6 @@ public final class GroupSelectionDirectoryPanel extends AnySelectionDirectoryPan
     }
 
     @Override
-    protected String[] getDisplayAttributes() {
-        return GroupDisplayAttributesModalPanel.DEFAULT_SELECTION;
-    }
-
-    @Override
     public String getPrefDetailsView() {
         return Constants.PREF_GROUP_DETAILS_VIEW;
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/f8b61e78/client/console/src/main/java/org/apache/syncope/client/console/panels/search/UserSelectionDirectoryPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/search/UserSelectionDirectoryPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/search/UserSelectionDirectoryPanel.java
index c3c8825..a27c2f6 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/search/UserSelectionDirectoryPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/search/UserSelectionDirectoryPanel.java
@@ -20,7 +20,6 @@ package org.apache.syncope.client.console.panels.search;
 
 import java.util.List;
 import org.apache.syncope.client.console.commons.Constants;
-import org.apache.syncope.client.console.panels.UserDisplayAttributesModalPanel;
 import org.apache.syncope.client.console.rest.UserRestClient;
 import org.apache.syncope.client.console.wizards.WizardMgtPanel;
 import org.apache.syncope.client.console.wizards.any.AnyWrapper;
@@ -42,11 +41,6 @@ public final class UserSelectionDirectoryPanel extends AnySelectionDirectoryPane
     }
 
     @Override
-    protected String[] getDisplayAttributes() {
-        return UserDisplayAttributesModalPanel.DEFAULT_SELECTION;
-    }
-
-    @Override
     protected String getPrefDetailsView() {
         return Constants.PREF_USERS_DETAILS_VIEW;
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/f8b61e78/client/console/src/main/java/org/apache/syncope/client/console/policies/AccountPolicyDirectoryPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/policies/AccountPolicyDirectoryPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/policies/AccountPolicyDirectoryPanel.java
index 9e7d7a0..5b0f2f1 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/policies/AccountPolicyDirectoryPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/policies/AccountPolicyDirectoryPanel.java
@@ -22,7 +22,7 @@ import java.util.List;
 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.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.policy.AccountPolicyTO;
 import org.apache.syncope.common.lib.types.PolicyType;
 import org.apache.syncope.common.lib.types.StandardEntitlement;
@@ -54,7 +54,7 @@ public class AccountPolicyDirectoryPanel extends PolicyDirectoryPanel<AccountPol
     @Override
     protected void addCustomColumnFields(final List<IColumn<AccountPolicyTO, String>> columns) {
         columns.add(new CollectionPropertyColumn<AccountPolicyTO>(new StringResourceModel(
-                "passthroughResources", this), "passthroughResources", "passthroughResources"));
+                "passthroughResources", this), "passthroughResources"));
 
         columns.add(new PropertyColumn<AccountPolicyTO, String>(new StringResourceModel(
                 "maxAuthenticationAttempts", this), "maxAuthenticationAttempts", "maxAuthenticationAttempts"));
@@ -64,8 +64,7 @@ public class AccountPolicyDirectoryPanel extends PolicyDirectoryPanel<AccountPol
     }
 
     @Override
-    protected void addCustomActions(
-            final ActionLinksPanel.Builder<AccountPolicyTO> panel, final IModel<AccountPolicyTO> model) {
+    protected void addCustomActions(final ActionsPanel<AccountPolicyTO> panel, final IModel<AccountPolicyTO> model) {
         panel.add(new ActionLink<AccountPolicyTO>() {
 
             private static final long serialVersionUID = -3722207913631435501L;

http://git-wip-us.apache.org/repos/asf/syncope/blob/f8b61e78/client/console/src/main/java/org/apache/syncope/client/console/policies/PasswordPolicyDirectoryPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/policies/PasswordPolicyDirectoryPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/policies/PasswordPolicyDirectoryPanel.java
index bc16a74..59fe831 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/policies/PasswordPolicyDirectoryPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/policies/PasswordPolicyDirectoryPanel.java
@@ -21,7 +21,7 @@ package org.apache.syncope.client.console.policies;
 import java.util.List;
 import org.apache.syncope.client.console.wicket.extensions.markup.html.repeater.data.table.BooleanPropertyColumn;
 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.policy.PasswordPolicyTO;
 import org.apache.syncope.common.lib.types.PolicyType;
 import org.apache.syncope.common.lib.types.StandardEntitlement;
@@ -61,8 +61,7 @@ public class PasswordPolicyDirectoryPanel extends PolicyDirectoryPanel<PasswordP
     }
 
     @Override
-    protected void addCustomActions(
-            final ActionLinksPanel.Builder<PasswordPolicyTO> panel, final IModel<PasswordPolicyTO> model) {
+    protected void addCustomActions(final ActionsPanel<PasswordPolicyTO> panel, final IModel<PasswordPolicyTO> model) {
         panel.add(new ActionLink<PasswordPolicyTO>() {
 
             private static final long serialVersionUID = -3722207913631435501L;

http://git-wip-us.apache.org/repos/asf/syncope/blob/f8b61e78/client/console/src/main/java/org/apache/syncope/client/console/policies/PolicyDirectoryPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/policies/PolicyDirectoryPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/policies/PolicyDirectoryPanel.java
index 21e63cd..166b9e2 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/policies/PolicyDirectoryPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/policies/PolicyDirectoryPanel.java
@@ -33,18 +33,16 @@ import org.apache.syncope.client.console.commons.SortableDataProviderComparator;
 import org.apache.syncope.client.console.pages.BasePage;
 import org.apache.syncope.client.console.panels.DirectoryPanel;
 import org.apache.syncope.client.console.rest.PolicyRestClient;
-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.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.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.common.lib.types.StandardEntitlement;
 import org.apache.syncope.common.lib.SyncopeClientException;
 import org.apache.syncope.common.lib.policy.AbstractPolicyTO;
-import org.apache.syncope.common.lib.to.ReportTO;
 import org.apache.syncope.common.lib.types.PolicyType;
 import org.apache.wicket.PageReference;
 import org.apache.wicket.ajax.AjaxRequestTarget;
@@ -55,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.CompoundPropertyModel;
 import org.apache.wicket.model.IModel;
-import org.apache.wicket.model.ResourceModel;
 import org.apache.wicket.model.StringResourceModel;
 
 /**
@@ -112,6 +109,8 @@ public abstract class PolicyDirectoryPanel<T extends AbstractPolicyTO>
         setFooterVisibility(true);
         modal.addSubmitButton();
         modal.size(Modal.Size.Large);
+        
+        disableCheckBoxes();
     }
 
     @Override
@@ -119,107 +118,82 @@ public abstract class PolicyDirectoryPanel<T extends AbstractPolicyTO>
         final List<IColumn<T, String>> columns = new ArrayList<>();
 
         columns.add(new KeyPropertyColumn<T>(
-                new StringResourceModel("key", this), "key", "key"));
-
-        columns.add(new PropertyColumn<T, String>(new StringResourceModel(
-                "description", this), "description", "description"));
-
+                new StringResourceModel("key", this), "key"));
+        columns.add(new PropertyColumn<T, String>(
+                new StringResourceModel("description", this), "description", "description"));
         columns.add(new CollectionPropertyColumn<T>(
-                new StringResourceModel("usedByResources", this), "usedByResources", "usedByResources"));
-
+                new StringResourceModel("usedByResources", this), "usedByResources"));
         columns.add(new CollectionPropertyColumn<T>(
-                new StringResourceModel("usedByRealms", this), "usedByRealms", "usedByRealms"));
+                new StringResourceModel("usedByRealms", this), "usedByRealms"));
 
         addCustomColumnFields(columns);
 
-        columns.add(new ActionColumn<T, String>(new ResourceModel("actions")) {
+        return columns;
+    }
+
+    @Override
+    public ActionsPanel<T> getActions(final IModel<T> model) {
+        final ActionsPanel<T> panel = super.getActions(model);
+
+        panel.add(new ActionLink<T>() {
 
-            private static final long serialVersionUID = 2054811145491901166L;
+            private static final long serialVersionUID = -3722207913631435501L;
 
             @Override
-            public ActionLinksPanel<T> getActions(final String componentId, final IModel<T> model) {
-
-                final ActionLinksPanel.Builder<T> panel = ActionLinksPanel.<T>builder().
-                        add(new ActionLink<T>() {
-
-                            private static final long serialVersionUID = -3722207913631435501L;
-
-                            @Override
-                            public void onClick(final AjaxRequestTarget target, final AbstractPolicyTO ignore) {
-                                final AbstractPolicyTO clone = SerializationUtils.clone(model.getObject());
-                                clone.setKey(null);
-                                send(PolicyDirectoryPanel.this, Broadcast.EXACT,
-                                        new AjaxWizard.EditItemActionEvent<>(clone, target));
-                            }
-                        }, ActionLink.ActionType.CLONE, StandardEntitlement.POLICY_CREATE).
-                        add(new ActionLink<T>() {
-
-                            private static final long serialVersionUID = -3722207913631435501L;
-
-                            @Override
-                            public void onClick(final AjaxRequestTarget target, final AbstractPolicyTO ignore) {
-                                send(PolicyDirectoryPanel.this, Broadcast.EXACT,
-                                        new AjaxWizard.EditItemActionEvent<>(
-                                                restClient.getPolicy(model.getObject().getKey()), target));
-                            }
-                        }, ActionLink.ActionType.EDIT, StandardEntitlement.POLICY_UPDATE).
-                        add(new ActionLink<T>() {
-
-                            private static final long serialVersionUID = -3722207913631435501L;
-
-                            @Override
-                            public void onClick(final AjaxRequestTarget target, final AbstractPolicyTO ignore) {
-                                final T policyTO = model.getObject();
-                                try {
-                                    restClient.delete(policyTO.getKey());
-                                    SyncopeConsoleSession.get().info(getString(Constants.OPERATION_SUCCEEDED));
-                                    target.add(container);
-                                } catch (SyncopeClientException e) {
-                                    LOG.error("While deleting {}", policyTO.getKey(), e);
-                                    SyncopeConsoleSession.get().error(StringUtils.isBlank(e.getMessage())
-                                            ? e.getClass().getName() : e.getMessage());
-                                }
-                                ((BasePage) pageRef.getPage()).getNotificationPanel().refresh(target);
-                            }
-                        }, ActionLink.ActionType.DELETE, StandardEntitlement.POLICY_DELETE);
-
-                addCustomActions(panel, model);
-                return panel.build(componentId);
+            public void onClick(final AjaxRequestTarget target, final AbstractPolicyTO ignore) {
+                send(PolicyDirectoryPanel.this, Broadcast.EXACT,
+                        new AjaxWizard.EditItemActionEvent<>(
+                                restClient.getPolicy(model.getObject().getKey()), target));
             }
+        }, ActionLink.ActionType.EDIT, StandardEntitlement.POLICY_UPDATE);
+
+        panel.add(new ActionLink<T>() {
+
+            private static final long serialVersionUID = -3722207913631435501L;
 
             @Override
-            public ActionLinksPanel<ReportTO> getHeader(final String componentId) {
-                final ActionLinksPanel.Builder<ReportTO> panel = ActionLinksPanel.builder();
+            public void onClick(final AjaxRequestTarget target, final AbstractPolicyTO ignore) {
+                final AbstractPolicyTO clone = SerializationUtils.clone(model.getObject());
+                clone.setKey(null);
+                send(PolicyDirectoryPanel.this, Broadcast.EXACT,
+                        new AjaxWizard.EditItemActionEvent<>(clone, target));
+            }
+        }, ActionLink.ActionType.CLONE, StandardEntitlement.POLICY_CREATE);
+
+        addCustomActions(panel, model);
 
-                return panel.add(new ActionLink<ReportTO>() {
+        panel.add(new ActionLink<T>() {
 
-                    private static final long serialVersionUID = -7978723352517770644L;
+            private static final long serialVersionUID = -3722207913631435501L;
 
-                    @Override
-                    public void onClick(final AjaxRequestTarget target, final ReportTO ignore) {
-                        if (target != null) {
-                            target.add(container);
-                        }
-                    }
-                }, ActionLink.ActionType.RELOAD, StandardEntitlement.TASK_LIST).build(componentId);
+            @Override
+            public void onClick(final AjaxRequestTarget target, final AbstractPolicyTO ignore) {
+                final T policyTO = model.getObject();
+                try {
+                    restClient.delete(policyTO.getKey());
+                    SyncopeConsoleSession.get().info(getString(Constants.OPERATION_SUCCEEDED));
+                    target.add(container);
+                } catch (SyncopeClientException e) {
+                    LOG.error("While deleting {}", policyTO.getKey(), e);
+                    SyncopeConsoleSession.get().error(StringUtils.isBlank(e.getMessage())
+                            ? e.getClass().getName() : e.getMessage());
+                }
+                ((BasePage) pageRef.getPage()).getNotificationPanel().refresh(target);
             }
-        });
+        }, ActionLink.ActionType.DELETE, StandardEntitlement.POLICY_DELETE, true);
 
-        return columns;
+        return panel;
     }
 
     protected void addCustomColumnFields(final List<IColumn<T, String>> columns) {
     }
 
-    protected void addCustomActions(final ActionLinksPanel.Builder<T> panel, final IModel<T> model) {
+    protected void addCustomActions(final ActionsPanel<T> panel, final IModel<T> model) {
     }
 
     @Override
     protected Collection<ActionType> getBulkActions() {
-        final List<ActionType> bulkActions = new ArrayList<>();
-        bulkActions.add(ActionType.EXECUTE);
-        bulkActions.add(ActionType.DELETE);
-        return bulkActions;
+        return Collections.<ActionType>emptyList();
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/syncope/blob/f8b61e78/client/console/src/main/java/org/apache/syncope/client/console/policies/PolicyRuleDirectoryPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/policies/PolicyRuleDirectoryPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/policies/PolicyRuleDirectoryPanel.java
index cb5969a..fd3c72e 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/policies/PolicyRuleDirectoryPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/policies/PolicyRuleDirectoryPanel.java
@@ -38,11 +38,10 @@ import org.apache.syncope.client.console.panels.DirectoryPanel;
 import org.apache.syncope.client.console.panels.ModalPanel;
 import org.apache.syncope.client.console.policies.PolicyRuleDirectoryPanel.PolicyRuleWrapper;
 import org.apache.syncope.client.console.rest.PolicyRestClient;
-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.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.common.lib.types.StandardEntitlement;
 import org.apache.syncope.common.lib.SyncopeClientException;
@@ -64,7 +63,6 @@ import org.apache.wicket.markup.html.basic.Label;
 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;
 
 /**
@@ -120,90 +118,86 @@ public class PolicyRuleDirectoryPanel<T extends AbstractPolicyTO> extends Direct
                 cellItem.add(new Label(componentId, rowModel.getObject().getConf().getClass().getName()));
             }
         });
+        return columns;
+    }
 
-        columns.add(new ActionColumn<PolicyRuleWrapper, String>(new ResourceModel("actions")) {
+    @Override
+    public ActionsPanel<PolicyRuleWrapper> getActions(final IModel<PolicyRuleWrapper> model) {
+        final ActionsPanel<PolicyRuleWrapper> panel = super.getActions(model);
 
-            private static final long serialVersionUID = 2054811145491901166L;
+        panel.add(new ActionLink<PolicyRuleWrapper>() {
+
+            private static final long serialVersionUID = -3722207913631435501L;
 
             @Override
-            public ActionLinksPanel<PolicyRuleWrapper> getActions(final String componentId,
-                    final IModel<PolicyRuleWrapper> model) {
-
-                final ActionLinksPanel<PolicyRuleWrapper> panel = ActionLinksPanel.<PolicyRuleWrapper>builder().
-                        add(new ActionLink<PolicyRuleWrapper>() {
-
-                            private static final long serialVersionUID = -3722207913631435501L;
-
-                            @Override
-                            public void onClick(final AjaxRequestTarget target, final PolicyRuleWrapper ignore) {
-                                RuleConf clone = SerializationUtils.clone(model.getObject().getConf());
-
-                                send(PolicyRuleDirectoryPanel.this, Broadcast.EXACT,
-                                        new AjaxWizard.EditItemActionEvent<>(
-                                                new PolicyRuleWrapper().setConf(clone),
-                                                target));
-                            }
-                        }, ActionLink.ActionType.CLONE, StandardEntitlement.POLICY_UPDATE).
-                        add(new ActionLink<PolicyRuleWrapper>() {
-
-                            private static final long serialVersionUID = -3722207913631435501L;
-
-                            @Override
-                            public void onClick(final AjaxRequestTarget target, final PolicyRuleWrapper ignore) {
-                                send(PolicyRuleDirectoryPanel.this, Broadcast.EXACT,
-                                        new AjaxWizard.EditItemActionEvent<>(model.getObject(), target));
-                            }
-                        }, ActionLink.ActionType.EDIT, StandardEntitlement.POLICY_UPDATE).
-                        add(new ActionLink<PolicyRuleWrapper>() {
-
-                            private static final long serialVersionUID = -3722207913631435501L;
-
-                            @Override
-                            public void onClick(final AjaxRequestTarget target, final PolicyRuleWrapper ignore) {
-                                final RuleConf rule = model.getObject().getConf();
-                                try {
-                                    final T actual = restClient.getPolicy(policy);
-                                    CollectionUtils.filter(getRuleConf(actual), new Predicate<RuleConf>() {
-
-                                        @Override
-                                        public boolean evaluate(final RuleConf object) {
-                                            return !object.getName().equals(rule.getName());
-                                        }
-                                    });
-                                    restClient.updatePolicy(actual);
-                                    SyncopeConsoleSession.get().info(getString(Constants.OPERATION_SUCCEEDED));
-                                    customActionOnFinishCallback(target);
-                                } catch (SyncopeClientException e) {
-                                    LOG.error("While deleting {}", rule.getName(), e);
-                                    SyncopeConsoleSession.get().error(StringUtils.isBlank(e.getMessage())
-                                            ? e.getClass().getName() : e.getMessage());
-                                }
-                                ((BasePage) pageRef.getPage()).getNotificationPanel().refresh(target);
-                            }
-                        }, ActionLink.ActionType.DELETE, StandardEntitlement.POLICY_UPDATE).build(componentId);
-
-                return panel;
+            public void onClick(final AjaxRequestTarget target, final PolicyRuleWrapper ignore) {
+                RuleConf clone = SerializationUtils.clone(model.getObject().getConf());
+
+                PolicyRuleDirectoryPanel.this.getTogglePanel().close(target);
+                send(PolicyRuleDirectoryPanel.this, Broadcast.EXACT,
+                        new AjaxWizard.EditItemActionEvent<>(
+                                new PolicyRuleWrapper().setConf(clone),
+                                target));
             }
+        }, ActionLink.ActionType.CLONE, StandardEntitlement.POLICY_CREATE);
+        panel.add(new ActionLink<PolicyRuleWrapper>() {
 
-            @Override
-            public ActionLinksPanel<PolicyRuleWrapper> getHeader(final String componentId) {
-                final ActionLinksPanel.Builder<PolicyRuleWrapper> panel = ActionLinksPanel.builder();
+            private static final long serialVersionUID = -3722207913631435501L;
 
-                return panel.add(new ActionLink<PolicyRuleWrapper>() {
+            @Override
+            public void onClick(final AjaxRequestTarget target, final PolicyRuleWrapper ignore) {
+                PolicyRuleDirectoryPanel.this.getTogglePanel().close(target);
+                send(PolicyRuleDirectoryPanel.this, Broadcast.EXACT,
+                        new AjaxWizard.EditItemActionEvent<>(model.getObject(), target));
+            }
+        }, ActionLink.ActionType.EDIT, StandardEntitlement.POLICY_UPDATE);
+        panel.add(new ActionLink<PolicyRuleWrapper>() {
 
-                    private static final long serialVersionUID = -7978723352517770644L;
+            private static final long serialVersionUID = -3722207913631435501L;
 
-                    @Override
-                    public void onClick(final AjaxRequestTarget target, final PolicyRuleWrapper ignore) {
-                        if (target != null) {
-                            customActionOnFinishCallback(target);
+            @Override
+            public void onClick(final AjaxRequestTarget target, final PolicyRuleWrapper ignore) {
+                final RuleConf rule = model.getObject().getConf();
+                try {
+                    final T actual = restClient.getPolicy(policy);
+                    CollectionUtils.filter(getRuleConf(actual), new Predicate<RuleConf>() {
+
+                        @Override
+                        public boolean evaluate(final RuleConf object) {
+                            return !object.getName().equals(rule.getName());
                         }
-                    }
-                }, ActionLink.ActionType.RELOAD, StandardEntitlement.TASK_LIST).build(componentId);
+                    });
+                    restClient.updatePolicy(actual);
+                    SyncopeConsoleSession.get().info(getString(Constants.OPERATION_SUCCEEDED));
+                    customActionOnFinishCallback(target);
+                } catch (SyncopeClientException e) {
+                    LOG.error("While deleting {}", rule.getName(), e);
+                    SyncopeConsoleSession.get().error(StringUtils.isBlank(e.getMessage())
+                            ? e.getClass().getName() : e.getMessage());
+                }
+                ((BasePage) pageRef.getPage()).getNotificationPanel().refresh(target);
             }
-        });
+        }, ActionLink.ActionType.DELETE, StandardEntitlement.POLICY_DELETE, true);
 
-        return columns;
+        return panel;
+    }
+
+    @Override
+    public ActionsPanel<Serializable> getHeader(final String componentId) {
+        final ActionsPanel<Serializable> panel = new ActionsPanel<>(componentId, null);
+
+        panel.add(new ActionLink<Serializable>() {
+
+            private static final long serialVersionUID = -7978723352517770644L;
+
+            @Override
+            public void onClick(final AjaxRequestTarget target, final Serializable ignore) {
+                if (target != null) {
+                    customActionOnFinishCallback(target);
+                }
+            }
+        }, ActionLink.ActionType.RELOAD, StandardEntitlement.TASK_LIST).hideLabel();
+        return panel;
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/syncope/blob/f8b61e78/client/console/src/main/java/org/apache/syncope/client/console/policies/PullPolicyDirectoryPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/policies/PullPolicyDirectoryPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/policies/PullPolicyDirectoryPanel.java
index 1f3442b..32b81b7 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/policies/PullPolicyDirectoryPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/policies/PullPolicyDirectoryPanel.java
@@ -19,7 +19,7 @@
 package org.apache.syncope.client.console.policies;
 
 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.policy.PullPolicySpec;
 import org.apache.syncope.common.lib.policy.PullPolicyTO;
 import org.apache.syncope.common.lib.types.PolicyType;
@@ -52,8 +52,7 @@ public class PullPolicyDirectoryPanel extends PolicyDirectoryPanel<PullPolicyTO>
     }
 
     @Override
-    protected void addCustomActions(
-            final ActionLinksPanel.Builder<PullPolicyTO> panel, final IModel<PullPolicyTO> model) {
+    protected void addCustomActions(final ActionsPanel<PullPolicyTO> panel, final IModel<PullPolicyTO> model) {
         panel.add(new ActionLink<PullPolicyTO>() {
 
             private static final long serialVersionUID = -3722207913631435501L;