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 2013/10/07 16:38:57 UTC

svn commit: r1529856 [2/3] - in /syncope/trunk: common/src/main/java/org/apache/syncope/common/services/ common/src/main/java/org/apache/syncope/common/to/ console/ console/src/main/java/org/apache/syncope/console/commons/ console/src/main/java/org/apa...

Modified: syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/TaskModalPage.java
URL: http://svn.apache.org/viewvc/syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/TaskModalPage.java?rev=1529856&r1=1529855&r2=1529856&view=diff
==============================================================================
--- syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/TaskModalPage.java (original)
+++ syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/TaskModalPage.java Mon Oct  7 14:38:55 2013
@@ -67,7 +67,7 @@ public abstract class TaskModalPage exte
 
     protected WebMarkupContainer executions;
 
-    protected Form form;
+    protected Form<AbstractTaskTO> form;
 
     public TaskModalPage(final AbstractTaskTO taskTO) {
         final ModalWindow taskExecMessageWin = new ModalWindow("taskExecMessageWin");
@@ -75,8 +75,8 @@ public abstract class TaskModalPage exte
         taskExecMessageWin.setCookieName("task-exec-message-win-modal");
         add(taskExecMessageWin);
 
-        form = new Form(FORM);
-        form.setModel(new CompoundPropertyModel(taskTO));
+        form = new Form<AbstractTaskTO>(FORM);
+        form.setModel(new CompoundPropertyModel<AbstractTaskTO>(taskTO));
         add(form);
 
         profile = new WebMarkupContainer("profile");
@@ -96,17 +96,17 @@ public abstract class TaskModalPage exte
         id.setEnabled(false);
         profile.add(id);
 
-        final List<IColumn> columns = new ArrayList<IColumn>();
+        final List<IColumn<TaskExecTO, String>> columns = new ArrayList<IColumn<TaskExecTO, String>>();
 
         final int paginatorRows = 10;
 
-        columns.add(new PropertyColumn(new ResourceModel("id"), "id", "id"));
+        columns.add(new PropertyColumn<TaskExecTO, String>(new ResourceModel("id"), "id", "id"));
 
-        columns.add(new DatePropertyColumn(new ResourceModel("startDate"), "startDate", "startDate"));
+        columns.add(new DatePropertyColumn<TaskExecTO>(new ResourceModel("startDate"), "startDate", "startDate"));
 
-        columns.add(new DatePropertyColumn(new ResourceModel("endDate"), "endDate", "endDate"));
+        columns.add(new DatePropertyColumn<TaskExecTO>(new ResourceModel("endDate"), "endDate", "endDate"));
 
-        columns.add(new PropertyColumn(new ResourceModel("status"), "status", "status"));
+        columns.add(new PropertyColumn<TaskExecTO, String>(new ResourceModel("status"), "status", "status"));
 
         columns.add(new ActionColumn<TaskExecTO, String>(new ResourceModel("actions", "")) {
 
@@ -173,8 +173,8 @@ public abstract class TaskModalPage exte
                     @Override
                     public void onClick(final AjaxRequestTarget target) {
                         if (target != null) {
-                            final AjaxFallbackDefaultDataTable currentTable =
-                                    new AjaxFallbackDefaultDataTable("executionsTable", columns,
+                            final AjaxFallbackDefaultDataTable<TaskExecTO, String> currentTable =
+                                    new AjaxFallbackDefaultDataTable<TaskExecTO, String>("executionsTable", columns,
                                     new TaskExecutionsProvider(getCurrentTaskExecution(taskTO)), paginatorRows);
                             currentTable.setOutputMarkupId(true);
                             target.add(currentTable);
@@ -187,7 +187,8 @@ public abstract class TaskModalPage exte
             }
         });
 
-        final AjaxFallbackDefaultDataTable table = new AjaxFallbackDefaultDataTable("executionsTable", columns,
+        final AjaxFallbackDefaultDataTable<TaskExecTO, String> table =
+                new AjaxFallbackDefaultDataTable<TaskExecTO, String>("executionsTable", columns,
                 new TaskExecutionsProvider(getCurrentTaskExecution(taskTO)), paginatorRows);
 
         executions.add(table);

Modified: syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/Tasks.java
URL: http://svn.apache.org/viewvc/syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/Tasks.java?rev=1529856&r1=1529855&r2=1529856&view=diff
==============================================================================
--- syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/Tasks.java (original)
+++ syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/Tasks.java Mon Oct  7 14:38:55 2013
@@ -151,7 +151,7 @@ public class Tasks extends BasePage {
         public Iterator<T> iterator(final long first, final long count) {
             final List<T> tasks = new ArrayList<T>();
 
-            for (T task : (List<T>) restClient.listTasks(reference, ((int) first / paginatorRows) + 1, paginatorRows)) {
+            for (T task : restClient.listTasks(reference, ((int) first / paginatorRows) + 1, paginatorRows)) {
 
                 if (task instanceof SchedTaskTO && ((SchedTaskTO) task).getLastExec() == null
                         && task.getExecutions() != null && !task.getExecutions().isEmpty()) {
@@ -197,7 +197,7 @@ public class Tasks extends BasePage {
      */
     public static AjaxDataTablePanel<AbstractTaskTO, String> updateTaskTable(
             final List<IColumn<AbstractTaskTO, String>> columns,
-            final TasksProvider dataProvider,
+            final TasksProvider<? extends AbstractTaskTO> dataProvider,
             final WebMarkupContainer container,
             final int currentPage,
             final PageReference pageRef,
@@ -208,8 +208,8 @@ public class Tasks extends BasePage {
                 columns,
                 (ISortableDataProvider<AbstractTaskTO, String>) dataProvider,
                 dataProvider.paginatorRows,
-                Arrays.asList(new ActionLink.ActionType[]{
-                    ActionLink.ActionType.DELETE, ActionLink.ActionType.DRYRUN, ActionLink.ActionType.EXECUTE}),
+                Arrays.asList(new ActionLink.ActionType[] {
+            ActionLink.ActionType.DELETE, ActionLink.ActionType.DRYRUN, ActionLink.ActionType.EXECUTE}),
                 restClient,
                 "id",
                 TASKS,

Modified: syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/VirtualSchemaModalPage.java
URL: http://svn.apache.org/viewvc/syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/VirtualSchemaModalPage.java?rev=1529856&r1=1529855&r2=1529856&view=diff
==============================================================================
--- syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/VirtualSchemaModalPage.java (original)
+++ syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/VirtualSchemaModalPage.java Mon Oct  7 14:38:55 2013
@@ -55,9 +55,9 @@ public class VirtualSchemaModalPage exte
             schema = new VirSchemaTO();
         }
 
-        final Form schemaForm = new Form(FORM);
+        final Form<AbstractBaseBean> schemaForm = new Form<AbstractBaseBean>(FORM);
 
-        schemaForm.setModel(new CompoundPropertyModel(schema));
+        schemaForm.setModel(new CompoundPropertyModel<AbstractBaseBean>(schema));
 
         final AjaxTextFieldPanel name = new AjaxTextFieldPanel("name", getString("name"), new PropertyModel<String>(
                 schema, "name"));

Modified: syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/panels/AbstractSearchResultPanel.java
URL: http://svn.apache.org/viewvc/syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/panels/AbstractSearchResultPanel.java?rev=1529856&r1=1529855&r2=1529856&view=diff
==============================================================================
--- syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/panels/AbstractSearchResultPanel.java (original)
+++ syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/panels/AbstractSearchResultPanel.java Mon Oct  7 14:38:55 2013
@@ -84,7 +84,7 @@ public abstract class AbstractSearchResu
     /**
      * Schemas to be shown modal window width.
      */
-    private final static int STATUS_MODAL_WIN_WIDTH = 500;
+    private final static int STATUS_MODAL_WIN_WIDTH = 700;
 
     /**
      * Application preferences.

Copied: syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/panels/ActionDataTablePanel.java (from r1525003, syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/panels/AjaxDataTablePanel.java)
URL: http://svn.apache.org/viewvc/syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/panels/ActionDataTablePanel.java?p2=syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/panels/ActionDataTablePanel.java&p1=syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/panels/AjaxDataTablePanel.java&r1=1525003&r2=1529856&rev=1529856&view=diff
==============================================================================
--- syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/panels/AjaxDataTablePanel.java (original)
+++ syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/panels/ActionDataTablePanel.java Mon Oct  7 14:38:55 2013
@@ -21,35 +21,36 @@ package org.apache.syncope.console.pages
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
-import org.apache.syncope.console.commons.Constants;
-import org.apache.syncope.console.pages.AbstractBasePage;
-import org.apache.syncope.console.pages.BulkActionModalPage;
-import org.apache.syncope.console.pages.panels.AbstractSearchResultPanel.EventDataWrapper;
-import org.apache.syncope.console.rest.BaseRestClient;
+import org.apache.syncope.console.commons.ActionTableCheckGroup;
 import org.apache.syncope.console.wicket.ajax.markup.html.ClearIndicatingAjaxButton;
 import org.apache.syncope.console.wicket.extensions.markup.html.repeater.data.table.CheckGroupColumn;
 import org.apache.syncope.console.wicket.markup.html.form.ActionLink;
-import org.apache.wicket.Page;
+import org.apache.syncope.console.wicket.markup.html.form.ActionLink.ActionType;
+import org.apache.syncope.console.wicket.markup.html.form.ActionLinksPanel;
+import org.apache.wicket.AttributeModifier;
 import org.apache.wicket.PageReference;
 import org.apache.wicket.ajax.AjaxRequestTarget;
-import org.apache.wicket.event.Broadcast;
+import org.apache.wicket.ajax.form.AjaxFormChoiceComponentUpdatingBehavior;
+import org.apache.wicket.ajax.markup.html.form.AjaxButton;
 import org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow;
 import org.apache.wicket.extensions.ajax.markup.html.repeater.data.table.AjaxFallbackDefaultDataTable;
 import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn;
 import org.apache.wicket.extensions.markup.html.repeater.data.table.ISortableDataProvider;
+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.markup.html.panel.Panel;
+import org.apache.wicket.model.Model;
+import org.apache.wicket.model.ResourceModel;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class AjaxDataTablePanel<T, S> extends Panel {
+public class ActionDataTablePanel<T, S> extends Panel {
 
     /**
      * Logger.
      */
-    protected static final Logger LOG = LoggerFactory.getLogger(AjaxDataTablePanel.class);
+    protected static final Logger LOG = LoggerFactory.getLogger(ActionDataTablePanel.class);
 
     private static final long serialVersionUID = -8826989026203543957L;
 
@@ -57,109 +58,72 @@ public class AjaxDataTablePanel<T, S> ex
 
     private final Form bulkActionForm;
 
-    private final AjaxFallbackDefaultDataTable<T, S> dataTable;
-
-    public AjaxDataTablePanel(
-            final String id,
-            final List<IColumn<T, S>> columns,
-            final ISortableDataProvider<T, S> dataProvider,
-            final int rowsPerPage) {
-        super(id);
+    private final ActionLinksPanel actionPanel;
 
-        this.bulkActionForm = null;
-        this.group = null;
-        dataTable = new AjaxFallbackDefaultDataTable<T, S>("dataTable", columns, dataProvider, rowsPerPage);
+    private final AjaxFallbackDefaultDataTable<T, S> dataTable;
 
-        Fragment fragment = new Fragment("tablePanel", "bulkNotAvailable", this);
-        fragment.add(dataTable);
+    private final PageReference pageRef;
 
-        add(fragment);
-    }
+    private final String CANCEL = "cancel";
 
-    public AjaxDataTablePanel(
+    public ActionDataTablePanel(
             final String id,
             final List<IColumn<T, S>> columns,
             final ISortableDataProvider<T, S> dataProvider,
             final int rowsPerPage,
-            final Collection<ActionLink.ActionType> actions,
-            final BaseRestClient bulkActionExecutor,
-            final String itemIdFiled,
-            final String pageId,
             final PageReference pageRef) {
 
         super(id);
 
-        final ModalWindow bulkModalWin = new ModalWindow("bulkModal");
-        bulkModalWin.setCssClassName(ModalWindow.CSS_CLASS_GRAY);
-        bulkModalWin.setInitialHeight(600);
-        bulkModalWin.setInitialWidth(900);
-        bulkModalWin.setCookieName("bulk-modal");
-        add(bulkModalWin);
+        this.pageRef = pageRef;
+
+        bulkActionForm = new Form("groupForm");
+        add(bulkActionForm);
 
-        bulkModalWin.setWindowClosedCallback(new ModalWindow.WindowClosedCallback() {
+        group = new ActionTableCheckGroup<T>("checkgroup", new ArrayList<T>()) {
 
-            private static final long serialVersionUID = 8804221891699487149L;
+            private static final long serialVersionUID = -8667764190925075389L;
 
             @Override
-            public void onClose(final AjaxRequestTarget target) {
-                final EventDataWrapper data = new EventDataWrapper();
-                data.setTarget(target);
-                data.setRows(rowsPerPage);
-
-                send(pageRef.getPage(), Broadcast.BREADTH, data);
-
-                final AbstractBasePage page = (AbstractBasePage) pageRef.getPage();
-
-                if (page.isModalResult()) {
-                    // reset modal result
-                    page.setModalResult(false);
-                    // set operation succeeded
-                    getSession().info(getString(Constants.OPERATION_SUCCEEDED));
-                    // refresh feedback panel
-                    target.add(page.getFeedbackPanel());
-                }
+            public boolean isCheckable(T element) {
+                return isElementEnabled(element);
             }
-        });
+        };
+        bulkActionForm.add(group);
 
-        Fragment fragment = new Fragment("tablePanel", "bulkAvailable", this);
-        add(fragment);
+        group.add(new AjaxFormChoiceComponentUpdatingBehavior() {
 
-        bulkActionForm = new Form("groupForm");
-        fragment.add(bulkActionForm);
+            private static final long serialVersionUID = -151291731388673682L;
 
-        group = new CheckGroup<T>("checkgroup", new ArrayList<T>());
-        bulkActionForm.add(group);
+            @Override
+            protected void onUpdate(AjaxRequestTarget target) {
+                // ignore
+            }
+        });
 
         columns.add(0, new CheckGroupColumn<T, S>(group));
         dataTable = new AjaxFallbackDefaultDataTable<T, S>("dataTable", columns, dataProvider, rowsPerPage);
         group.add(dataTable);
 
-        fragment.add(new ClearIndicatingAjaxButton("bulkActionLink", bulkActionForm, pageRef) {
+        final WebMarkupContainer actionPanelContainer = new WebMarkupContainer("actionPanelContainer");
+        bulkActionForm.add(actionPanelContainer);
 
-            private static final long serialVersionUID = 382302811235019988L;
+        actionPanel = new ActionLinksPanel("actions", new Model(), pageRef);
+        actionPanelContainer.add(actionPanel);
 
-            @Override
-            protected void onSubmitInternal(final AjaxRequestTarget target, final Form<?> form) {
-                bulkModalWin.setPageCreator(new ModalWindow.PageCreator() {
+        if (dataTable.getRowCount() == 0) {
+            actionPanelContainer.add(new AttributeModifier("style", "display: none"));
+        }
 
-                    private static final long serialVersionUID = -7834632442532690941L;
+        bulkActionForm.add(new ClearIndicatingAjaxButton(CANCEL, new ResourceModel(CANCEL), pageRef) {
 
-                    @Override
-                    public Page createPage() {
-                        return new BulkActionModalPage<T, S>(
-                                bulkModalWin,
-                                new ArrayList<T>(group.getModelObject()),
-                                columns,
-                                actions,
-                                bulkActionExecutor,
-                                itemIdFiled,
-                                pageId);
-                    }
-                });
+            private static final long serialVersionUID = -2341391430136818025L;
 
-                bulkModalWin.show(target);
+            @Override
+            protected void onSubmitInternal(final AjaxRequestTarget target, final Form<?> form) {
+                // ignore
             }
-        });
+        }.setVisible(false).setEnabled(false));
     }
 
     public final void setCurrentPage(final long page) {
@@ -181,4 +145,40 @@ public class AjaxDataTablePanel<T, S> ex
     public void setItemsPerPage(final int resourcePaginatorRows) {
         dataTable.setItemsPerPage(resourcePaginatorRows);
     }
+
+    public void addAction(final ActionLink action, final ActionType type, final String pageId) {
+        actionPanel.add(action, type, pageId);
+    }
+
+    public void addAction(final ActionLink action, final ActionType type, final String pageId, final String actionId) {
+        actionPanel.add(action, type, pageId, actionId);
+    }
+
+    public void addAction(final ActionLink action, final ActionType type, final String pageId, final boolean enabled) {
+        actionPanel.add(action, type, pageId, enabled);
+    }
+
+    public void addCancelButton(final ModalWindow window) {
+
+        final AjaxButton cancel = new ClearIndicatingAjaxButton(CANCEL, new ResourceModel(CANCEL), pageRef) {
+
+            private static final long serialVersionUID = -2341391430136818025L;
+
+            @Override
+            protected void onSubmitInternal(final AjaxRequestTarget target, final Form<?> form) {
+                window.close(target);
+            }
+        };
+
+        cancel.setDefaultFormProcessing(false);
+        bulkActionForm.addOrReplace(cancel);
+    }
+
+    public Collection<T> getModelObject() {
+        return group.getModelObject();
+    }
+
+    public boolean isElementEnabled(final T element) {
+        return true;
+    }
 }

Added: syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/panels/ImagePanel.java
URL: http://svn.apache.org/viewvc/syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/panels/ImagePanel.java?rev=1529856&view=auto
==============================================================================
--- syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/panels/ImagePanel.java (added)
+++ syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/panels/ImagePanel.java Mon Oct  7 14:38:55 2013
@@ -0,0 +1,40 @@
+package org.apache.syncope.console.pages.panels;
+
+import org.apache.wicket.Component;
+import org.apache.wicket.behavior.Behavior;
+import org.apache.wicket.markup.html.image.Image;
+import org.apache.wicket.markup.html.panel.Panel;
+
+/*
+ * Copyright 2013 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+public class ImagePanel extends Panel {
+
+    private static final long serialVersionUID = 5564818820574092960L;
+
+    final Image img;
+
+    public ImagePanel(final String id, final String img) {
+        super(id);
+        this.img = new Image("img", img);
+        add(this.img);
+    }
+
+    @Override
+    public Component add(Behavior... behaviors) {
+        this.img.add(behaviors);
+        return this;
+    }
+}

Modified: syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/panels/MembershipsPanel.java
URL: http://svn.apache.org/viewvc/syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/panels/MembershipsPanel.java?rev=1529856&r1=1529855&r2=1529856&view=diff
==============================================================================
--- syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/panels/MembershipsPanel.java (original)
+++ syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/panels/MembershipsPanel.java Mon Oct  7 14:38:55 2013
@@ -32,7 +32,7 @@ import org.apache.syncope.console.common
 import org.apache.syncope.console.pages.MembershipModalPage;
 import org.apache.syncope.console.pages.UserModalPage;
 import org.apache.syncope.console.wicket.ajax.markup.html.ClearIndicatingAjaxLink;
-import org.apache.syncope.console.wicket.ajax.markup.html.IndicatingDeleteOnConfirmAjaxLink;
+import org.apache.syncope.console.wicket.ajax.markup.html.IndicatingOnConfirmAjaxLink;
 import org.apache.syncope.console.wicket.markup.html.tree.DefaultMutableTreeNodeExpansion;
 import org.apache.syncope.console.wicket.markup.html.tree.DefaultMutableTreeNodeExpansionModel;
 import org.apache.syncope.console.wicket.markup.html.tree.TreeRoleProvider;
@@ -182,7 +182,7 @@ public class MembershipsPanel extends Pa
                 };
                 item.add(editLink);
 
-                AjaxLink deleteLink = new IndicatingDeleteOnConfirmAjaxLink("deleteLink", pageRef) {
+                AjaxLink deleteLink = new IndicatingOnConfirmAjaxLink("deleteLink", pageRef) {
 
                     private static final long serialVersionUID = -7978723352517770644L;
 
@@ -206,7 +206,8 @@ public class MembershipsPanel extends Pa
                             resourcesToRemove.removeAll(userTO.getResources());
                         }
 
-                        StatusUtils.update(statusPanel, target, Collections.<String>emptySet(), resourcesToRemove);
+                        StatusUtils.update(
+                                userTO, statusPanel, target, Collections.<String>emptySet(), resourcesToRemove);
                     }
                 };
                 item.add(deleteLink);
@@ -236,7 +237,8 @@ public class MembershipsPanel extends Pa
                         long roleId = updatedUserTO.getMembershipMap().get(diffMembId).getRoleId();
                         RoleTO roleTO = RoleUtils.findRole(roleTreeBuilder, roleId);
                         resourcesToAdd.addAll(roleTO.getResources());
-                        StatusUtils.update(statusPanel, target, resourcesToAdd, Collections.<String>emptySet());
+                        StatusUtils.update(
+                                userTO, statusPanel, target, resourcesToAdd, Collections.<String>emptySet());
                     }
                 }
 

Modified: syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/panels/ResourcesPanel.java
URL: http://svn.apache.org/viewvc/syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/panels/ResourcesPanel.java?rev=1529856&r1=1529855&r2=1529856&view=diff
==============================================================================
--- syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/panels/ResourcesPanel.java (original)
+++ syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/panels/ResourcesPanel.java Mon Oct  7 14:38:55 2013
@@ -169,7 +169,8 @@ public class ResourcesPanel extends Pane
                                 previousResources.clear();
                                 previousResources.addAll(userTO.getResources());
 
-                                StatusUtils.update(statusPanel, target, userTO.getResources(), resourcesToRemove);
+                                StatusUtils.update(
+                                        userTO, statusPanel, target, userTO.getResources(), resourcesToRemove);
                             }
                         }
                     });

Modified: syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/panels/RoleSearchResultPanel.java
URL: http://svn.apache.org/viewvc/syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/panels/RoleSearchResultPanel.java?rev=1529856&r1=1529855&r2=1529856&view=diff
==============================================================================
--- syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/panels/RoleSearchResultPanel.java (original)
+++ syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/panels/RoleSearchResultPanel.java Mon Oct  7 14:38:55 2013
@@ -98,13 +98,14 @@ public class RoleSearchResultPanel exten
 
                             @Override
                             public Page createPage() {
-                                return new StatusModalPage(page.getPageReference(), statusmodal, model.getObject());
+                                return new StatusModalPage<RoleTO>(
+                                        page.getPageReference(), statusmodal, (RoleTO) model.getObject());
                             }
                         });
 
                         statusmodal.show(target);
                     }
-                }, ActionLink.ActionType.SEARCH, PAGEID);
+                }, ActionLink.ActionType.MANAGE_RESOURCES, PAGEID);
 
                 panel.add(new ActionLink() {
 

Modified: syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/panels/StatusPanel.java
URL: http://svn.apache.org/viewvc/syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/panels/StatusPanel.java?rev=1529856&r1=1529855&r2=1529856&view=diff
==============================================================================
--- syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/panels/StatusPanel.java (original)
+++ syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/panels/StatusPanel.java Mon Oct  7 14:38:55 2013
@@ -20,6 +20,7 @@ package org.apache.syncope.console.pages
 
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
@@ -29,9 +30,9 @@ import org.apache.syncope.common.to.Conn
 import org.apache.syncope.common.to.PropagationRequestTO;
 import org.apache.syncope.common.to.RoleTO;
 import org.apache.syncope.common.to.UserTO;
-import org.apache.syncope.console.commons.Constants;
 import org.apache.syncope.console.commons.StatusBean;
 import org.apache.syncope.console.commons.StatusUtils;
+import org.apache.syncope.console.commons.StatusUtils.ConnObjectWrapper;
 import org.apache.syncope.console.commons.StatusUtils.Status;
 import org.apache.syncope.console.markup.html.list.AltListView;
 import org.apache.syncope.console.pages.ConnObjectModalPage;
@@ -39,21 +40,16 @@ import org.apache.syncope.console.rest.R
 import org.apache.syncope.console.rest.UserRestClient;
 import org.apache.syncope.console.wicket.markup.html.form.ActionLink;
 import org.apache.syncope.console.wicket.markup.html.form.ActionLinksPanel;
-import org.apache.wicket.Component;
 import org.apache.wicket.Page;
 import org.apache.wicket.PageReference;
 import org.apache.wicket.ajax.AjaxRequestTarget;
-import org.apache.wicket.behavior.Behavior;
+import org.apache.wicket.ajax.form.AjaxFormChoiceComponentUpdatingBehavior;
 import org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow;
-import org.apache.wicket.markup.ComponentTag;
-import org.apache.wicket.markup.head.CssContentHeaderItem;
-import org.apache.wicket.markup.head.IHeaderResponse;
 import org.apache.wicket.markup.html.IHeaderContributor;
 import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.markup.html.form.Check;
 import org.apache.wicket.markup.html.form.CheckGroup;
 import org.apache.wicket.markup.html.form.CheckGroupSelector;
-import org.apache.wicket.markup.html.image.Image;
 import org.apache.wicket.markup.html.list.ListItem;
 import org.apache.wicket.markup.html.list.ListView;
 import org.apache.wicket.markup.html.panel.Panel;
@@ -86,9 +82,7 @@ public class StatusPanel extends Panel i
 
     private final ModalWindow connObjectWin;
 
-    private final AbstractAttributableTO attributable;
-
-    private final Map<String, ConnObjectTO> connObjects;
+    private final List<ConnObjectWrapper> connObjects;
 
     private final Map<String, StatusBean> initialStatusBeanMap;
 
@@ -96,11 +90,15 @@ public class StatusPanel extends Panel i
 
     private final ListView<StatusBean> statusBeansListView;
 
-    public <T extends AbstractAttributableTO> StatusPanel(final String id, final AbstractAttributableTO attributable,
-            final List<StatusBean> selectedResources, final PageReference pageref) {
+    private final StatusUtils statusUtils;
+
+    public <T extends AbstractAttributableTO> StatusPanel(
+            final String id,
+            final AbstractAttributableTO attributable,
+            final List<StatusBean> selectedResources,
+            final PageReference pageref) {
 
         super(id);
-        this.attributable = attributable;
 
         connObjectWin = new ModalWindow("connObjectWin");
         connObjectWin.setCssClassName(ModalWindow.CSS_CLASS_GRAY);
@@ -109,45 +107,57 @@ public class StatusPanel extends Panel i
         connObjectWin.setCookieName("connobject-modal");
         add(connObjectWin);
 
-        final StatusBean syncope = new StatusBean();
-        syncope.setResourceName("Syncope");
+        statusUtils = new StatusUtils(attributable instanceof RoleTO ? roleRestClient : userRestClient);
+
+        connObjects = statusUtils.getConnectorObjects(Collections.<AbstractAttributableTO>singleton(attributable));
+
+        final List<StatusBean> statusBeans = new ArrayList<StatusBean>(connObjects.size() + 1);
+        initialStatusBeanMap = new LinkedHashMap<String, StatusBean>(connObjects.size() + 1);
+
+        final StatusBean syncope = new StatusBean(attributable, "syncope");
+
         if (attributable instanceof UserTO) {
-            UserTO userTO = (UserTO) attributable;
-            syncope.setAccountLink(userTO.getUsername());
+            syncope.setAccountLink(((UserTO) attributable).getUsername());
 
             Status syncopeStatus = Status.UNDEFINED;
-            if (userTO.getStatus() != null) {
+            if (((UserTO) attributable).getStatus() != null) {
                 try {
-                    syncopeStatus = Status.valueOf(userTO.getStatus().toUpperCase());
+                    syncopeStatus = Status.valueOf(((UserTO) attributable).getStatus().toUpperCase());
                 } catch (IllegalArgumentException e) {
-                    LOG.warn("Unexpected status found: {}", userTO.getStatus());
+                    LOG.warn("Unexpected status found: {}", ((UserTO) attributable).getStatus(), e);
                 }
             }
             syncope.setStatus(syncopeStatus);
-        }
-        if (attributable instanceof RoleTO) {
-            RoleTO roleTO = (RoleTO) attributable;
-            syncope.setAccountLink(roleTO.getDisplayName());
+        } else if (attributable instanceof RoleTO) {
+            syncope.setAccountLink(((RoleTO) attributable).getDisplayName());
             syncope.setStatus(Status.ACTIVE);
         }
 
-        StatusUtils statusUtils = new StatusUtils((attributable instanceof UserTO ? userRestClient : roleRestClient));
-
-        connObjects = statusUtils.getConnectorObjects(attributable);
-
-        List<StatusBean> statusBeans = new ArrayList<StatusBean>(connObjects.size() + 1);
         statusBeans.add(syncope);
-        initialStatusBeanMap = new LinkedHashMap<String, StatusBean>(connObjects.size() + 1);
         initialStatusBeanMap.put(syncope.getResourceName(), syncope);
-        for (Map.Entry<String, ConnObjectTO> entry : connObjects.entrySet()) {
-            final StatusBean statusBean = statusUtils.getStatusBean(entry.getKey(), entry.getValue());
 
-            initialStatusBeanMap.put(entry.getKey(), statusBean);
+        for (ConnObjectWrapper entry : connObjects) {
+            final StatusBean statusBean = statusUtils.getStatusBean(
+                    entry.getAttributable(),
+                    entry.getResourceName(),
+                    entry.getConnObjectTO(),
+                    attributable instanceof RoleTO);
+
+            initialStatusBeanMap.put(entry.getResourceName(), statusBean);
             statusBeans.add(statusBean);
         }
 
         checkGroup = new CheckGroup<StatusBean>("group", selectedResources);
         checkGroup.setOutputMarkupId(true);
+        checkGroup.add(new AjaxFormChoiceComponentUpdatingBehavior() {
+
+            private static final long serialVersionUID = -151291731388673682L;
+
+            @Override
+            protected void onUpdate(AjaxRequestTarget target) {
+                // ignore
+            }
+        });
         add(checkGroup);
 
         add(new CheckGroupSelector("groupselector", checkGroup));
@@ -158,59 +168,9 @@ public class StatusPanel extends Panel i
 
             @Override
             protected void populateItem(final ListItem<StatusBean> item) {
-                final Image image;
-                final String alt, title;
-                boolean checkVisibility = true;
-
-                switch (item.getModelObject().getStatus()) {
-
-                    case NOT_YET_SUBMITTED:
-                        image = newImage(StatusUtils.Status.UNDEFINED.toString());
-                        alt = "undefined icon";
-                        title = "Not yet submitted";
-                        break;
-
-                    case ACTIVE:
-                        image = newImage(StatusUtils.Status.ACTIVE.toString());
-                        alt = "active icon";
-                        title = "Enabled";
-                        break;
-
-                    case UNDEFINED:
-                        image = newImage(StatusUtils.Status.UNDEFINED.toString());
-                        checkVisibility = false;
-                        alt = "undefined icon";
-                        title = "Undefined status";
-                        break;
-
-                    case OBJECT_NOT_FOUND:
-                        image = newImage(StatusUtils.Status.OBJECT_NOT_FOUND.toString());
-                        checkVisibility = false;
-                        alt = "notfound icon";
-                        title = "User not found";
-                        break;
-
-                    default:
-                        image = newImage(StatusUtils.Status.SUSPENDED.toString());
-                        alt = "inactive icon";
-                        title = "Disabled";
-                }
-
-                image.add(new Behavior() {
-
-                    private static final long serialVersionUID = 1469628524240283489L;
-
-                    @Override
-                    public void onComponentTag(final Component component, final ComponentTag tag) {
-                        tag.put("alt", alt);
-                        tag.put("title", title);
-                    }
-                });
-                item.add(image);
+                item.add(statusUtils.getStatusImage("icon", item.getModelObject().getStatus()));
 
                 final Check<StatusBean> check = new Check<StatusBean>("check", item.getModel(), checkGroup);
-                check.setEnabled(checkVisibility);
-                check.setVisible(checkVisibility);
                 item.add(check);
 
                 item.add(new Label("resource", new ResourceModel(item.getModelObject().getResourceName(), item
@@ -223,13 +183,14 @@ public class StatusPanel extends Panel i
                     item.add(new Label("accountLink", ""));
                 }
 
-                if (pageref != null
-                        && connObjects.containsKey(item.getModelObject().getResourceName())
-                        && connObjects.get(item.getModelObject().getResourceName()) != null) {
+                final ConnObjectTO connObjectTO = statusUtils.getConnObjectTO(
+                        item.getModelObject().getAttributableId(),
+                        item.getModelObject().getResourceName(),
+                        connObjects);
 
-                    final ConnObjectTO connObjectTO = connObjects.get(item.getModelObject().getResourceName());
+                if (pageref != null && connObjectTO != null) {
 
-                    ActionLinksPanel connObject = new ActionLinksPanel("connObject", new Model(), pageref);
+                    final ActionLinksPanel connObject = new ActionLinksPanel("connObject", new Model(), pageref);
 
                     connObject.add(new ActionLink() {
 
@@ -261,10 +222,6 @@ public class StatusPanel extends Panel i
         checkGroup.add(statusBeansListView);
     }
 
-    private Image newImage(final String imageStatus) {
-        return new Image("icon", IMG_STATUES + imageStatus + Constants.PNG_EXT);
-    }
-
     public PropagationRequestTO getPropagationRequestTO() {
         PropagationRequestTO result = null;
 
@@ -298,17 +255,4 @@ public class StatusPanel extends Panel i
             }
         }
     }
-
-    @Override
-    public void renderHead(final IHeaderResponse response) {
-        if (this.attributable instanceof RoleTO) {
-            response.render(new CssContentHeaderItem(
-                    "div#check{"
-                    + "display:none;"
-                    + "}"
-                    + "div#status{"
-                    + "display:none;"
-                    + "}", null, null));
-        }
-    }
 }

Modified: syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/panels/UserSearchResultPanel.java
URL: http://svn.apache.org/viewvc/syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/panels/UserSearchResultPanel.java?rev=1529856&r1=1529855&r2=1529856&view=diff
==============================================================================
--- syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/panels/UserSearchResultPanel.java (original)
+++ syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/panels/UserSearchResultPanel.java Mon Oct  7 14:38:55 2013
@@ -153,7 +153,29 @@ public class UserSearchResultPanel exten
 
                             @Override
                             public Page createPage() {
-                                return new StatusModalPage(page.getPageReference(), statusmodal, model.getObject());
+                                return new StatusModalPage<UserTO>(
+                                        page.getPageReference(), statusmodal, (UserTO) model.getObject());
+                            }
+                        });
+
+                        statusmodal.show(target);
+                    }
+                }, ActionLink.ActionType.MANAGE_RESOURCES, PAGEID);
+
+                panel.add(new ActionLink() {
+
+                    private static final long serialVersionUID = -7978723352517770644L;
+
+                    @Override
+                    public void onClick(final AjaxRequestTarget target) {
+                        statusmodal.setPageCreator(new ModalWindow.PageCreator() {
+
+                            private static final long serialVersionUID = -7834632442532690940L;
+
+                            @Override
+                            public Page createPage() {
+                                return new StatusModalPage<UserTO>(
+                                        page.getPageReference(), statusmodal, (UserTO) model.getObject(), true);
                             }
                         });
 

Modified: syncope/trunk/console/src/main/java/org/apache/syncope/console/rest/ResourceRestClient.java
URL: http://svn.apache.org/viewvc/syncope/trunk/console/src/main/java/org/apache/syncope/console/rest/ResourceRestClient.java?rev=1529856&r1=1529855&r2=1529856&view=diff
==============================================================================
--- syncope/trunk/console/src/main/java/org/apache/syncope/console/rest/ResourceRestClient.java (original)
+++ syncope/trunk/console/src/main/java/org/apache/syncope/console/rest/ResourceRestClient.java Mon Oct  7 14:38:55 2013
@@ -21,10 +21,13 @@ package org.apache.syncope.console.rest;
 import java.util.List;
 import java.util.Set;
 import org.apache.syncope.common.services.ResourceService;
+import org.apache.syncope.common.to.AbstractAttributableTO;
 import org.apache.syncope.common.to.BulkAction;
 import org.apache.syncope.common.to.BulkActionRes;
+import org.apache.syncope.common.to.BulkAssociationAction;
 import org.apache.syncope.common.to.PropagationActionClassTO;
 import org.apache.syncope.common.to.ResourceTO;
+import org.apache.syncope.common.to.UserTO;
 import org.apache.syncope.common.util.CollectionWrapper;
 import org.apache.syncope.common.validation.SyncopeClientCompositeException;
 import org.springframework.stereotype.Component;
@@ -87,4 +90,13 @@ public class ResourceRestClient extends 
     public BulkActionRes bulkAction(final BulkAction action) {
         return getService(ResourceService.class).bulkAction(action);
     }
+
+    public BulkActionRes bulkAssociationAction(
+            String resourceName, BulkAssociationAction bulkAction, Class<? extends AbstractAttributableTO> typeRef) {
+        if (UserTO.class.isAssignableFrom(typeRef)) {
+            return getService(ResourceService.class).usersBulkAssociationAction(resourceName, bulkAction);
+        } else {
+            return getService(ResourceService.class).rolesBulkAssociationAction(resourceName, bulkAction);
+        }
+    }
 }

Modified: syncope/trunk/console/src/main/java/org/apache/syncope/console/rest/RoleRestClient.java
URL: http://svn.apache.org/viewvc/syncope/trunk/console/src/main/java/org/apache/syncope/console/rest/RoleRestClient.java?rev=1529856&r1=1529855&r2=1529856&view=diff
==============================================================================
--- syncope/trunk/console/src/main/java/org/apache/syncope/console/rest/RoleRestClient.java (original)
+++ syncope/trunk/console/src/main/java/org/apache/syncope/console/rest/RoleRestClient.java Mon Oct  7 14:38:55 2013
@@ -32,6 +32,8 @@ import org.apache.syncope.common.to.Bulk
 import org.apache.syncope.common.to.ConnObjectTO;
 import org.apache.syncope.common.to.RoleTO;
 import org.apache.syncope.common.types.AttributableType;
+import org.apache.syncope.console.commons.StatusBean;
+import org.apache.syncope.console.commons.StatusUtils;
 import org.springframework.stereotype.Component;
 
 /**
@@ -95,4 +97,16 @@ public class RoleRestClient extends Abst
     public BulkActionRes bulkAction(final BulkAction action) {
         return getService(RoleRestClient.class).bulkAction(action);
     }
+
+    public RoleTO unlink(final long roleId, final List<StatusBean> statuses) {
+        return getService(RoleService.class).unlink(roleId, StatusUtils.buildPropagationTargetsTO(statuses));
+    }
+
+    public RoleTO unassign(final long roleId, final List<StatusBean> statuses) {
+        return getService(RoleService.class).unassign(roleId, StatusUtils.buildPropagationTargetsTO(statuses));
+    }
+
+    public RoleTO deprovision(final long roleId, final List<StatusBean> statuses) {
+        return getService(RoleService.class).deprovision(roleId, StatusUtils.buildPropagationTargetsTO(statuses));
+    }
 }

Modified: syncope/trunk/console/src/main/java/org/apache/syncope/console/rest/UserRestClient.java
URL: http://svn.apache.org/viewvc/syncope/trunk/console/src/main/java/org/apache/syncope/console/rest/UserRestClient.java?rev=1529856&r1=1529855&r2=1529856&view=diff
==============================================================================
--- syncope/trunk/console/src/main/java/org/apache/syncope/console/rest/UserRestClient.java (original)
+++ syncope/trunk/console/src/main/java/org/apache/syncope/console/rest/UserRestClient.java Mon Oct  7 14:38:55 2013
@@ -127,4 +127,16 @@ public class UserRestClient extends Abst
     public BulkActionRes bulkAction(final BulkAction action) {
         return getService(UserService.class).bulkAction(action);
     }
+
+    public UserTO unlink(final long userId, final List<StatusBean> statuses) {
+        return getService(UserService.class).unlink(userId, StatusUtils.buildPropagationTargetsTO(statuses));
+    }
+
+    public UserTO unassign(final long userId, final List<StatusBean> statuses) {
+        return getService(UserService.class).unassign(userId, StatusUtils.buildPropagationTargetsTO(statuses));
+    }
+
+    public UserTO deprovision(final long userId, final List<StatusBean> statuses) {
+        return getService(UserService.class).deprovision(userId, StatusUtils.buildPropagationTargetsTO(statuses));
+    }
 }

Copied: syncope/trunk/console/src/main/java/org/apache/syncope/console/wicket/ajax/markup/html/IndicatingOnConfirmAjaxLink.java (from r1525003, syncope/trunk/console/src/main/java/org/apache/syncope/console/wicket/ajax/markup/html/IndicatingDeleteOnConfirmAjaxLink.java)
URL: http://svn.apache.org/viewvc/syncope/trunk/console/src/main/java/org/apache/syncope/console/wicket/ajax/markup/html/IndicatingOnConfirmAjaxLink.java?p2=syncope/trunk/console/src/main/java/org/apache/syncope/console/wicket/ajax/markup/html/IndicatingOnConfirmAjaxLink.java&p1=syncope/trunk/console/src/main/java/org/apache/syncope/console/wicket/ajax/markup/html/IndicatingDeleteOnConfirmAjaxLink.java&r1=1525003&r2=1529856&rev=1529856&view=diff
==============================================================================
--- syncope/trunk/console/src/main/java/org/apache/syncope/console/wicket/ajax/markup/html/IndicatingDeleteOnConfirmAjaxLink.java (original)
+++ syncope/trunk/console/src/main/java/org/apache/syncope/console/wicket/ajax/markup/html/IndicatingOnConfirmAjaxLink.java Mon Oct  7 14:38:55 2013
@@ -22,18 +22,20 @@ import org.apache.wicket.Component;
 import org.apache.wicket.PageReference;
 import org.apache.wicket.ajax.attributes.AjaxCallListener;
 import org.apache.wicket.ajax.attributes.AjaxRequestAttributes;
-import org.apache.wicket.model.IModel;
 
-public abstract class IndicatingDeleteOnConfirmAjaxLink<T> extends ClearIndicatingAjaxLink<T> {
+public abstract class IndicatingOnConfirmAjaxLink<T> extends ClearIndicatingAjaxLink<T> {
 
     private static final long serialVersionUID = 2228670850922265663L;
 
-    public IndicatingDeleteOnConfirmAjaxLink(final String id, final PageReference pageRef) {
-        super(id, pageRef);
+    private final String msg;
+
+    public IndicatingOnConfirmAjaxLink(final String id, final PageReference pageRef) {
+        this(id, pageRef, "confirmDelete");
     }
 
-    public IndicatingDeleteOnConfirmAjaxLink(final String id, final IModel<T> model, final PageReference pageRef) {
-        super(id, model, pageRef);
+    public IndicatingOnConfirmAjaxLink(final String id, final PageReference pageRef, final String msg) {
+        super(id, pageRef);
+        this.msg = msg;
     }
 
     @Override
@@ -46,7 +48,9 @@ public abstract class IndicatingDeleteOn
 
             @Override
             public CharSequence getPrecondition(final Component component) {
-                return "if (!confirm('" + getString("confirmDelete") + "')) {return false;} else {return true;}";
+                return "if (!confirm('"
+                        + getString(IndicatingOnConfirmAjaxLink.this.msg)
+                        + "')) {return false;} else {return true;}";
             }
         };
         attributes.getAjaxCallListeners().add(ajaxCallListener);

Modified: syncope/trunk/console/src/main/java/org/apache/syncope/console/wicket/extensions/markup/html/repeater/data/table/CheckBoxPanel.java
URL: http://svn.apache.org/viewvc/syncope/trunk/console/src/main/java/org/apache/syncope/console/wicket/extensions/markup/html/repeater/data/table/CheckBoxPanel.java?rev=1529856&r1=1529855&r2=1529856&view=diff
==============================================================================
--- syncope/trunk/console/src/main/java/org/apache/syncope/console/wicket/extensions/markup/html/repeater/data/table/CheckBoxPanel.java (original)
+++ syncope/trunk/console/src/main/java/org/apache/syncope/console/wicket/extensions/markup/html/repeater/data/table/CheckBoxPanel.java Mon Oct  7 14:38:55 2013
@@ -18,6 +18,7 @@
  */
 package org.apache.syncope.console.wicket.extensions.markup.html.repeater.data.table;
 
+import org.apache.syncope.console.commons.ActionTableCheckGroup;
 import org.apache.wicket.markup.html.form.Check;
 import org.apache.wicket.markup.html.form.CheckGroup;
 import org.apache.wicket.markup.html.panel.Panel;
@@ -32,6 +33,11 @@ public class CheckBoxPanel<T> extends Pa
     public CheckBoxPanel(final String componentId, final IModel<T> model, final CheckGroup<T> checkGroup) {
         super(componentId, model);
         this.check = new Check<T>("check", model, checkGroup);
+        if (checkGroup instanceof ActionTableCheckGroup) {
+            boolean checkable = ((ActionTableCheckGroup<T>) checkGroup).isCheckable(model.getObject());
+            this.check.setEnabled(checkable);
+            this.check.setVisible(checkable);
+        }
         add(this.check);
     }
 }

Modified: syncope/trunk/console/src/main/java/org/apache/syncope/console/wicket/markup/html/form/ActionLink.java
URL: http://svn.apache.org/viewvc/syncope/trunk/console/src/main/java/org/apache/syncope/console/wicket/markup/html/form/ActionLink.java?rev=1529856&r1=1529855&r2=1529856&view=diff
==============================================================================
--- syncope/trunk/console/src/main/java/org/apache/syncope/console/wicket/markup/html/form/ActionLink.java (original)
+++ syncope/trunk/console/src/main/java/org/apache/syncope/console/wicket/markup/html/form/ActionLink.java Mon Oct  7 14:38:55 2013
@@ -42,7 +42,13 @@ public abstract class ActionLink impleme
         SUSPEND("update"),
         REACTIVATE("update"),
         RELOAD("reload"),
-        CHANGE_VIEW("changeView");
+        CHANGE_VIEW("changeView"),
+        UNLINK("update"),
+        UNASSIGN("update"),
+        DEPROVISION("update"),
+        MANAGE_RESOURCES("update"),
+        MANAGE_USERS("update"),
+        MANAGE_ROLES("update");
 
         private final String actionId;
 

Modified: syncope/trunk/console/src/main/java/org/apache/syncope/console/wicket/markup/html/form/ActionLinksPanel.java
URL: http://svn.apache.org/viewvc/syncope/trunk/console/src/main/java/org/apache/syncope/console/wicket/markup/html/form/ActionLinksPanel.java?rev=1529856&r1=1529855&r2=1529856&view=diff
==============================================================================
--- syncope/trunk/console/src/main/java/org/apache/syncope/console/wicket/markup/html/form/ActionLinksPanel.java (original)
+++ syncope/trunk/console/src/main/java/org/apache/syncope/console/wicket/markup/html/form/ActionLinksPanel.java Mon Oct  7 14:38:55 2013
@@ -20,7 +20,7 @@ package org.apache.syncope.console.wicke
 
 import org.apache.syncope.console.commons.XMLRolesReader;
 import org.apache.syncope.console.wicket.ajax.markup.html.ClearIndicatingAjaxLink;
-import org.apache.syncope.console.wicket.ajax.markup.html.IndicatingDeleteOnConfirmAjaxLink;
+import org.apache.syncope.console.wicket.ajax.markup.html.IndicatingOnConfirmAjaxLink;
 import org.apache.wicket.PageReference;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.authroles.authorization.strategies.role.metadata.MetaDataRoleAuthorizationStrategy;
@@ -49,6 +49,9 @@ public class ActionLinksPanel extends Pa
         this.pageRef = pageRef;
 
         super.add(new Fragment("panelClaim", "emptyFragment", this));
+        super.add(new Fragment("panelManageResources", "emptyFragment", this));
+        super.add(new Fragment("panelManageUsers", "emptyFragment", this));
+        super.add(new Fragment("panelManageRoles", "emptyFragment", this));
         super.add(new Fragment("panelCreate", "emptyFragment", this));
         super.add(new Fragment("panelEdit", "emptyFragment", this));
         super.add(new Fragment("panelUserTemplate", "emptyFragment", this));
@@ -64,6 +67,9 @@ public class ActionLinksPanel extends Pa
         super.add(new Fragment("panelReactivate", "emptyFragment", this));
         super.add(new Fragment("panelReload", "emptyFragment", this));
         super.add(new Fragment("panelChangeView", "emptyFragment", this));
+        super.add(new Fragment("panelUnlink", "emptyFragment", this));
+        super.add(new Fragment("panelUnassign", "emptyFragment", this));
+        super.add(new Fragment("panelDeprovision", "emptyFragment", this));
     }
 
     public void add(
@@ -110,6 +116,48 @@ public class ActionLinksPanel extends Pa
                 });
                 break;
 
+            case MANAGE_RESOURCES:
+                fragment = new Fragment("panelManageResources", "fragmentManageResources", this);
+
+                fragment.addOrReplace(new ClearIndicatingAjaxLink("manageResourcesLink", pageRef) {
+
+                    private static final long serialVersionUID = -6957616042924610291L;
+
+                    @Override
+                    protected void onClickInternal(final AjaxRequestTarget target) {
+                        link.onClick(target);
+                    }
+                });
+                break;
+
+            case MANAGE_USERS:
+                fragment = new Fragment("panelManageUsers", "fragmentManageUsers", this);
+
+                fragment.addOrReplace(new ClearIndicatingAjaxLink("manageUsersLink", pageRef) {
+
+                    private static final long serialVersionUID = -6957616042924610292L;
+
+                    @Override
+                    protected void onClickInternal(final AjaxRequestTarget target) {
+                        link.onClick(target);
+                    }
+                });
+                break;
+
+            case MANAGE_ROLES:
+                fragment = new Fragment("panelManageRoles", "fragmentManageRoles", this);
+
+                fragment.addOrReplace(new ClearIndicatingAjaxLink("manageRolesLink", pageRef) {
+
+                    private static final long serialVersionUID = -6957616042924610293L;
+
+                    @Override
+                    protected void onClickInternal(final AjaxRequestTarget target) {
+                        link.onClick(target);
+                    }
+                });
+                break;
+
             case CREATE:
                 fragment = new Fragment("panelCreate", "fragmentCreate", this);
 
@@ -225,7 +273,7 @@ public class ActionLinksPanel extends Pa
             case DELETE:
                 fragment = new Fragment("panelDelete", "fragmentDelete", this);
 
-                fragment.addOrReplace(new IndicatingDeleteOnConfirmAjaxLink("deleteLink", pageRef) {
+                fragment.addOrReplace(new IndicatingOnConfirmAjaxLink("deleteLink", pageRef) {
 
                     private static final long serialVersionUID = -7978723352517770644L;
 
@@ -321,6 +369,51 @@ public class ActionLinksPanel extends Pa
                     }
                 });
                 break;
+
+            case UNLINK:
+                fragment = new Fragment("panelUnlink", "fragmentUnlink", this);
+
+                fragment.addOrReplace(
+                        new IndicatingOnConfirmAjaxLink<Void>("unlinkLink", pageRef, "confirmUnlink") {
+
+                    private static final long serialVersionUID = -6957616042924610293L;
+
+                    @Override
+                    protected void onClickInternal(final AjaxRequestTarget target) {
+                        link.onClick(target);
+                    }
+                });
+                break;
+
+            case UNASSIGN:
+                fragment = new Fragment("panelUnassign", "fragmentUnassign", this);
+
+                fragment.addOrReplace(
+                        new IndicatingOnConfirmAjaxLink<Void>("unassignLink", pageRef, "confirmUnassign") {
+
+                    private static final long serialVersionUID = -6957616042924610294L;
+
+                    @Override
+                    protected void onClickInternal(final AjaxRequestTarget target) {
+                        link.onClick(target);
+                    }
+                });
+                break;
+
+            case DEPROVISION:
+                fragment = new Fragment("panelDeprovision", "fragmentDeprovision", this);
+
+                fragment.addOrReplace(
+                        new IndicatingOnConfirmAjaxLink<Void>("deprovisionLink", pageRef, "confirmDeprovision") {
+
+                    private static final long serialVersionUID = -6957616042924610295L;
+
+                    @Override
+                    protected void onClickInternal(final AjaxRequestTarget target) {
+                        link.onClick(target);
+                    }
+                });
+                break;
             default:
             // do nothink
         }
@@ -338,6 +431,18 @@ public class ActionLinksPanel extends Pa
                 super.addOrReplace(new Fragment("panelClaim", "emptyFragment", this));
                 break;
 
+            case MANAGE_RESOURCES:
+                super.addOrReplace(new Fragment("panelManageResources", "emptyFragment", this));
+                break;
+
+            case MANAGE_USERS:
+                super.addOrReplace(new Fragment("panelManageUsers", "emptyFragment", this));
+                break;
+
+            case MANAGE_ROLES:
+                super.addOrReplace(new Fragment("panelManageRoles", "emptyFragment", this));
+                break;
+
             case CREATE:
                 super.addOrReplace(new Fragment("panelCreate", "emptyFragment", this));
                 break;
@@ -389,6 +494,18 @@ public class ActionLinksPanel extends Pa
             case CHANGE_VIEW:
                 super.addOrReplace(new Fragment("panelChangeView", "emptyFragment", this));
                 break;
+
+            case UNLINK:
+                super.addOrReplace(new Fragment("panelUnlink", "emptyFragment", this));
+                break;
+
+            case UNASSIGN:
+                super.addOrReplace(new Fragment("panelUnassign", "emptyFragment", this));
+                break;
+
+            case DEPROVISION:
+                super.addOrReplace(new Fragment("panelDeprovision", "emptyFragment", this));
+                break;
             default:
             // do nothing
         }

Modified: syncope/trunk/console/src/main/java/org/apache/syncope/console/wicket/markup/html/tree/TreeActionLinkPanel.java
URL: http://svn.apache.org/viewvc/syncope/trunk/console/src/main/java/org/apache/syncope/console/wicket/markup/html/tree/TreeActionLinkPanel.java?rev=1529856&r1=1529855&r2=1529856&view=diff
==============================================================================
--- syncope/trunk/console/src/main/java/org/apache/syncope/console/wicket/markup/html/tree/TreeActionLinkPanel.java (original)
+++ syncope/trunk/console/src/main/java/org/apache/syncope/console/wicket/markup/html/tree/TreeActionLinkPanel.java Mon Oct  7 14:38:55 2013
@@ -27,7 +27,7 @@ import org.apache.syncope.console.pages.
 import org.apache.syncope.console.pages.Roles;
 import org.apache.syncope.console.rest.RoleRestClient;
 import org.apache.syncope.console.wicket.ajax.markup.html.ClearIndicatingAjaxLink;
-import org.apache.syncope.console.wicket.ajax.markup.html.IndicatingDeleteOnConfirmAjaxLink;
+import org.apache.syncope.console.wicket.ajax.markup.html.IndicatingOnConfirmAjaxLink;
 import org.apache.wicket.Page;
 import org.apache.wicket.PageReference;
 import org.apache.wicket.ajax.AjaxRequestTarget;
@@ -122,7 +122,7 @@ public class TreeActionLinkPanel extends
             updateRoleLink.setOutputMarkupId(true);
             fragment.add(updateRoleLink);
 
-            final AjaxLink dropRoleLink = new IndicatingDeleteOnConfirmAjaxLink("dropRoleLink", pageRef) {
+            final AjaxLink dropRoleLink = new IndicatingOnConfirmAjaxLink("dropRoleLink", pageRef) {
 
                 private static final long serialVersionUID = -7978723352517770644L;
 

Modified: syncope/trunk/console/src/main/resources/authorizations.xml
URL: http://svn.apache.org/viewvc/syncope/trunk/console/src/main/resources/authorizations.xml?rev=1529856&r1=1529855&r2=1529856&view=diff
==============================================================================
--- syncope/trunk/console/src/main/resources/authorizations.xml (original)
+++ syncope/trunk/console/src/main/resources/authorizations.xml Mon Oct  7 14:38:55 2013
@@ -57,7 +57,7 @@ under the License.
     <action id="delete">
       <entitlement>USER_DELETE</entitlement>
     </action>
-
+    
     <action id="changeView">
       <entitlement>USER_VIEW</entitlement>
     </action>

Modified: syncope/trunk/console/src/main/resources/org/apache/syncope/console/SyncopeApplication.properties
URL: http://svn.apache.org/viewvc/syncope/trunk/console/src/main/resources/org/apache/syncope/console/SyncopeApplication.properties?rev=1529856&r1=1529855&r2=1529856&view=diff
==============================================================================
--- syncope/trunk/console/src/main/resources/org/apache/syncope/console/SyncopeApplication.properties (original)
+++ syncope/trunk/console/src/main/resources/org/apache/syncope/console/SyncopeApplication.properties Mon Oct  7 14:38:55 2013
@@ -27,6 +27,10 @@ operation_succeeded=Operation executed s
 operation_error=Error occurred during the requested operation
 alert=Alert:
 confirmDelete=Do you really want to delete the selected item?
+confirmUnlink=Do you really want to remove the link between user(s) and resource?
+confirmUnassign=Do you really want to remove the assignment between user(s) and resource?
+confirmDeprovision=Do you really want to de-provision user(s)?
+
 
 unauthorizedInstantiationException=Missing authorization.
 httpClientException=Missing authorization while contacting Syncope core.

Modified: syncope/trunk/console/src/main/resources/org/apache/syncope/console/SyncopeApplication_it.properties
URL: http://svn.apache.org/viewvc/syncope/trunk/console/src/main/resources/org/apache/syncope/console/SyncopeApplication_it.properties?rev=1529856&r1=1529855&r2=1529856&view=diff
==============================================================================
--- syncope/trunk/console/src/main/resources/org/apache/syncope/console/SyncopeApplication_it.properties (original)
+++ syncope/trunk/console/src/main/resources/org/apache/syncope/console/SyncopeApplication_it.properties Mon Oct  7 14:38:55 2013
@@ -27,6 +27,9 @@ operation_succeeded=Operazione eseguita 
 operation_error=Attenzione si \u00e8 verificato un errore durante l'esecuzione dell'operazione richiesta
 alert=Attenzione:
 confirmDelete=Vuoi davvero procedere con la cancellazione?
+confirmUnlink=Vuoi davvero procedere rimuovendo il link tra utente/i e risorsa?
+confirmUnassign=Vuoi davvero procedere rimuovendo l'assegnamento tra utente/i e risorsa?
+confirmDeprovision=Vuoi davvero procedere con il de-provisioning dell'utente?
 
 unauthorizedInstantiationException=Autorizzazione mancante.
 httpClientException=Autorizzazione mancante durante la comunicazione con Syncope core.

Modified: syncope/trunk/console/src/main/resources/org/apache/syncope/console/SyncopeApplication_pt_BR.properties
URL: http://svn.apache.org/viewvc/syncope/trunk/console/src/main/resources/org/apache/syncope/console/SyncopeApplication_pt_BR.properties?rev=1529856&r1=1529855&r2=1529856&view=diff
==============================================================================
--- syncope/trunk/console/src/main/resources/org/apache/syncope/console/SyncopeApplication_pt_BR.properties (original)
+++ syncope/trunk/console/src/main/resources/org/apache/syncope/console/SyncopeApplication_pt_BR.properties Mon Oct  7 14:38:55 2013
@@ -14,35 +14,38 @@
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
-users=Usu\u00E1rios
-roles=Fun\u00E7\u00F5es
-configuration=Configura\u00E7\u00F5es
+users=Usu\u00e1rios
+roles=Fun\u00e7\u00f5es
+configuration=Configura\u00e7\u00f5es
 resources=Recursos
 connectors=Conectores
-reports=Relat\u00F3rios
+reports=Relat\u00f3rios
 tasks=Tarefas
 logout=Sair
 schema=Esquemas
-operation_succeded=Opera\u00E7\u00E3o executada com sucesso
-operation_error=Um erro ocorreu ao executar esta opera\u00E7\u00E3o
+operation_succeded=Opera\u00e7\u00e3o executada com sucesso
+operation_error=Um erro ocorreu ao executar esta opera\u00e7\u00e3o
 alert=Alerta:
-confirmDelete=Voc\u00EA realmente deseja apagar este item selecionado?
+confirmDelete=Voc\u00ea realmente deseja apagar este item selecionado?
+confirmUnlink=Voc\u00ea realmente deseja apagar o v\u00ednculo entre o usu\u00e1rio e de recursos?
+confirmUnassign=Voc\u00ea realmente deseja apagar a atribui\u00e7\u00e3o entre o usu\u00e1rio e de recursos?
+confirmDeprovision=Voc\u00ea realmente de-provision usu\u00e1rio?
 
-unauthorizedInstantiationException=Falta de autoriza\u00E7\u00E3o para concluir.
-httpClientException=Falta de autoriza\u00E7\u00E3o ao comunicar-se com o Syncope core.
+unauthorizedInstantiationException=Falta de autoriza\u00e7\u00e3o para concluir.
+httpClientException=Falta de autoriza\u00e7\u00e3o ao comunicar-se com o Syncope core.
 restClientException=Erro ao comunicar-se com o Syncope core.
-pageExpiredException=Sess\u00E3o encerrada, favor logar-se novamente.
+pageExpiredException=Sess\u00e3o encerrada, favor logar-se novamente.
 
 dropDownChoiceField.nullValid=Escolha um
 todo=A fazer
 DateTimeField$HoursValidator=O seu valor precisa estar entre (1, 12)
 error=Erro
-generic_error=Um erro ocorreu durante a opera\u00E7\u00E3o
+generic_error=Um erro ocorreu durante a opera\u00e7\u00e3o
 id=Id
 name=Nome
-palette.available=Dispon\u00ED\u00ADvel
+palette.available=Dispon\u00ed\u00advel
 palette.selected=Selecionado
-jexl_info=Este campo \u00E9 designado a uma express\u00E3o do tipo JEXL, por exemplo\:
+jexl_info=Este campo \u00e9 designado a uma express\u00e3o do tipo JEXL, por exemplo\:
 jexl_ex1=sobrenome + ',' + nome
 jexl_ex2='novo.' + sobrenome
-jexl_syntax_url=Refer\u00EAncia JEXL completa
+jexl_syntax_url=Refer\u00eancia JEXL completa

Copied: syncope/trunk/console/src/main/resources/org/apache/syncope/console/pages/AbstractStatusModlaPage.html (from r1525003, syncope/trunk/console/src/main/resources/org/apache/syncope/console/pages/StatusModalPage.html)
URL: http://svn.apache.org/viewvc/syncope/trunk/console/src/main/resources/org/apache/syncope/console/pages/AbstractStatusModlaPage.html?p2=syncope/trunk/console/src/main/resources/org/apache/syncope/console/pages/AbstractStatusModlaPage.html&p1=syncope/trunk/console/src/main/resources/org/apache/syncope/console/pages/StatusModalPage.html&r1=1525003&r2=1529856&rev=1529856&view=diff
==============================================================================
--- syncope/trunk/console/src/main/resources/org/apache/syncope/console/pages/StatusModalPage.html (original)
+++ syncope/trunk/console/src/main/resources/org/apache/syncope/console/pages/AbstractStatusModlaPage.html Mon Oct  7 14:38:55 2013
@@ -17,30 +17,23 @@ specific language governing permissions 
 under the License.
 -->
 <wicket:head>
+  <link rel="stylesheet" type="text/css" href="css/bulk.css" media="all"/>
   <style>
-    .submit{
+    #dataTableSpan{
       display:  block;
       clear:  both;
       float: none;
-      margin-left: 10px;
+      margin: 10px;
       padding-top: 10px;
     }
+
+    #dataTableSpan table{
+      width: 100%;
+    }
   </style>
 </wicket:head>
 <wicket:extend>
-  <form wicket:id="form">
-    <p class="ui-widget ui-corner-all ui-widget-header">
-    <wicket:message key="title"/>
-    </p>
-
-    <div style="display: block; margin: 10px">
-      <span wicket:id="statuspanel">[Status Panel]</span>
-    </div>
-
-    <div class="submit">
-      <input type="submit" class="ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only" wicket:id="enable"/>
-      <input type="submit" class="ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only" wicket:id="disable"/>
-      <input type="button" class="ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only" wicket:id="cancel"/>
-    </div>
-  </form>
+  <p class="ui-widget ui-corner-all ui-widget-header"><wicket:message key="title"/></p>
+  <span wicket:id="resourceDatatable" id="dataTableSpan">[resources]</span>
+  <wicket:child />
 </wicket:extend>

Modified: syncope/trunk/console/src/main/resources/org/apache/syncope/console/pages/Resources.html
URL: http://svn.apache.org/viewvc/syncope/trunk/console/src/main/resources/org/apache/syncope/console/pages/Resources.html?rev=1529856&r1=1529855&r2=1529856&view=diff
==============================================================================
--- syncope/trunk/console/src/main/resources/org/apache/syncope/console/pages/Resources.html (original)
+++ syncope/trunk/console/src/main/resources/org/apache/syncope/console/pages/Resources.html Mon Oct  7 14:38:55 2013
@@ -40,6 +40,7 @@ under the License.
           </span>
         </div>
 
+        <div wicket:id="statusModal">[Show modal window for provisioning status]</div>
         <div wicket:id="createResourceWin">[Show modal window for creating resource]</div>
         <div wicket:id="editResourceWin">[Show modal window for editing resource]</div>
 

Copied: syncope/trunk/console/src/main/resources/org/apache/syncope/console/pages/panels/ActionDataTablePanel.html (from r1525003, syncope/trunk/console/src/main/resources/org/apache/syncope/console/pages/panels/AjaxDataTablePanel.html)
URL: http://svn.apache.org/viewvc/syncope/trunk/console/src/main/resources/org/apache/syncope/console/pages/panels/ActionDataTablePanel.html?p2=syncope/trunk/console/src/main/resources/org/apache/syncope/console/pages/panels/ActionDataTablePanel.html&p1=syncope/trunk/console/src/main/resources/org/apache/syncope/console/pages/panels/AjaxDataTablePanel.html&r1=1525003&r2=1529856&rev=1529856&view=diff
==============================================================================
--- syncope/trunk/console/src/main/resources/org/apache/syncope/console/pages/panels/AjaxDataTablePanel.html (original)
+++ syncope/trunk/console/src/main/resources/org/apache/syncope/console/pages/panels/ActionDataTablePanel.html Mon Oct  7 14:38:55 2013
@@ -21,27 +21,25 @@ under the License.
     <link rel="stylesheet" type="text/css" href="css/bulk.css" media="all"/>
   </wicket:head>
   <wicket:panel>
-    <span wicket:id="tablePanel">[Table panel]</span>
-    <div wicket:id="bulkModal" />
 
-    <wicket:fragment wicket:id="bulkAvailable">
-      <form wicket:id="groupForm">
-        <span wicket:id="checkgroup">
-          <table class="ui-widget ui-widget-content table-hover" wicket:id="dataTable">[DataTable]</table>
-        </span>
-      </form>
-      <div class="bulkAction">
-        <div class="bulkActionCell" style="width: 40px">
-          <a href="#" wicket:id="bulkActionLink">
-            <img src="img/actions/bulk.png" alt="bulk action icon"  title="Bulk action"/>
-          </a>
+    <form wicket:id="groupForm">
+      <span wicket:id="checkgroup">
+        <table class="ui-widget ui-widget-content table-hover" wicket:id="dataTable">[Data Table]</table>
+      </span>
+
+      <div id="actionRow" class="pageRowElement">
+        <div id="actions">
+          <div id="actionPanel"  wicket:id="actionPanelContainer" class="ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only">
+            <span wicket:id="actions">[Actions]</span>
+          </div>
+
+          <div id="cancelBtmForm">
+            <input type="button" wicket:id="cancel" id="cancel"
+                   class="ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only"/>
+          </div>
         </div>
       </div>
-    </wicket:fragment>
-
-    <wicket:fragment wicket:id="bulkNotAvailable">
-      <table class="ui-widget ui-widget-content table-hover" wicket:id="dataTable">[DataTable]</table>
-    </wicket:fragment>
+    </form>
 
   </wicket:panel>
 </html>

Copied: syncope/trunk/console/src/main/resources/org/apache/syncope/console/pages/panels/ImagePanel.html (from r1525003, syncope/trunk/console/src/main/resources/org/apache/syncope/console/pages/panels/AbstractSearchPanel.html)
URL: http://svn.apache.org/viewvc/syncope/trunk/console/src/main/resources/org/apache/syncope/console/pages/panels/ImagePanel.html?p2=syncope/trunk/console/src/main/resources/org/apache/syncope/console/pages/panels/ImagePanel.html&p1=syncope/trunk/console/src/main/resources/org/apache/syncope/console/pages/panels/AbstractSearchPanel.html&r1=1525003&r2=1529856&rev=1529856&view=diff
==============================================================================
--- syncope/trunk/console/src/main/resources/org/apache/syncope/console/pages/panels/AbstractSearchPanel.html (original)
+++ syncope/trunk/console/src/main/resources/org/apache/syncope/console/pages/panels/ImagePanel.html Mon Oct  7 14:38:55 2013
@@ -18,61 +18,6 @@ under the License.
 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xmlns:wicket="http://wicket.apache.org">
   <wicket:panel>
-    <div id="searchBox">
-      <div wicket:id="searchFeedback"></div>
-      <table border="0">
-        <thead>
-          <tr>
-            <th></th>
-            <th><wicket:message key="search_not_value"/></th>
-            <th><wicket:message key="search_filter_type"/></th>
-            <th><wicket:message key="search_filter_name"/></th>
-            <th><wicket:message key="search_type_cond"/></th>
-            <th><wicket:message key="search_filter_value"/></th>
-            <th></th>
-            <th></th>
-            <th></th>
-          </tr>
-        </thead>
-        <tbody wicket:id="searchFormContainer">
-          <tr wicket:id="searchView">
-            <td>
-              <b><span wicket:id="operationType"/></b>
-            </td>
-            <td>
-              <input type="checkbox" wicket:id="notOperator"/>
-            </td>
-            <td>
-              <select class="text ui-widget-content ui-corner-all"
-                      wicket:id="filterType"/>
-            </td>
-            <td>
-              <select class="text ui-widget-content ui-corner-all"
-                      wicket:id="filterName"/>
-            </td>
-            <td>
-              <select class="text ui-widget-content ui-corner-all"
-                      wicket:id="type"/>
-            </td>
-            <td>
-              <input type="text" class="text ui-widget-content ui-corner-all"
-                     wicket:id="filterValue"/>
-            </td>
-            <td>
-              <input type="button" class="text ui-widget-content ui-corner-all"
-                     wicket:id="addAndButton"/>
-            </td>
-            <td>
-              <input type="submit" class="text ui-widget-content ui-corner-all"
-                     wicket:id="addOrButton"/>
-            </td>        
-            <td>
-              <input type="button" class="text ui-widget-content ui-corner-all"
-                     wicket:id="dropButton"/>
-            </td>
-          </tr>
-        </tbody>
-      </table>
-    </div>
+    <img wicket:id="img" />
   </wicket:panel>
 </html>

Modified: syncope/trunk/console/src/main/resources/org/apache/syncope/console/wicket/markup/html/form/ActionLinksPanel.html
URL: http://svn.apache.org/viewvc/syncope/trunk/console/src/main/resources/org/apache/syncope/console/wicket/markup/html/form/ActionLinksPanel.html?rev=1529856&r1=1529855&r2=1529856&view=diff
==============================================================================
--- syncope/trunk/console/src/main/resources/org/apache/syncope/console/wicket/markup/html/form/ActionLinksPanel.html (original)
+++ syncope/trunk/console/src/main/resources/org/apache/syncope/console/wicket/markup/html/form/ActionLinksPanel.html Mon Oct  7 14:38:55 2013
@@ -27,6 +27,9 @@ under the License.
   </wicket:head>
   <wicket:panel>
     <span wicket:id="panelClaim">[plus]</span>
+    <span wicket:id="panelManageResources">[plus]</span>
+    <span wicket:id="panelManageUsers">[plus]</span>
+    <span wicket:id="panelManageRoles">[plus]</span>
     <span wicket:id="panelDryRun">[plus]</span>
     <span wicket:id="panelExecute">[plus]</span>
     <span wicket:id="panelEnable">[plus]</span>
@@ -42,11 +45,26 @@ under the License.
     <span wicket:id="panelReactivate">[plus]</span>
     <span wicket:id="panelReload">[plus]</span>
     <span wicket:id="panelChangeView">[plus]</span>
+    <span wicket:id="panelUnlink">[plus]</span>
+    <span wicket:id="panelUnassign">[plus]</span>
+    <span wicket:id="panelDeprovision">[plus]</span>
 
     <wicket:fragment wicket:id="fragmentClaim">
       <a href="#" wicket:id="claimLink"><img id="action" src="img/actions/claim.png" alt="claim icon" title="Claim"/></a>
     </wicket:fragment>
 
+    <wicket:fragment wicket:id="fragmentManageResources">
+      <a href="#" wicket:id="manageResourcesLink"><img id="action" src="img/actions/resources-icon.png" alt="manage resources icon" title="Manage resources"/></a>
+    </wicket:fragment>
+
+    <wicket:fragment wicket:id="fragmentManageUsers">
+      <a href="#" wicket:id="manageUsersLink"><img id="action" src="img/actions/users-icon.png" alt="manage users icon" title="Manage users"/></a>
+    </wicket:fragment>
+
+    <wicket:fragment wicket:id="fragmentManageRoles">
+      <a href="#" wicket:id="manageRolesLink"><img id="action" src="img/actions/roles-icon.png" alt="manage roles icon" title="Manage roles"/></a>
+    </wicket:fragment>
+
     <wicket:fragment wicket:id="fragmentCreate">
       <a href="#" wicket:id="createLink"><img id="action" src="img/actions/create.png" alt="create icon"  title="Create"/></a>
     </wicket:fragment>
@@ -107,6 +125,18 @@ under the License.
       <a href="#" wicket:id="changeViewLink"><img id="action" src="img/actions/settings-icon.png" alt="Change view icon"  title="Change view"/></a>
     </wicket:fragment>
 
+    <wicket:fragment wicket:id="fragmentUnlink">
+      <a href="#" wicket:id="unlinkLink"><img id="action" src="img/actions/unlink-icon.png" alt="Unlink icon"  title="Unlink"/></a>
+    </wicket:fragment>
+
+    <wicket:fragment wicket:id="fragmentUnassign">
+      <a href="#" wicket:id="unassignLink"><img id="action" src="img/actions/unassign-icon.png" alt="Unassign icon"  title="Unassign"/></a>
+    </wicket:fragment>
+
+    <wicket:fragment wicket:id="fragmentDeprovision">
+      <a href="#" wicket:id="deprovisionLink"><img id="action" src="img/actions/deprovision-icon.png" alt="De-provision icon"  title="De-provision"/></a>
+    </wicket:fragment>
+
     <wicket:fragment wicket:id="emptyFragment">
     </wicket:fragment>
   </wicket:panel>

Added: syncope/trunk/console/src/main/webapp/img/actions/deprovision-icon.png
URL: http://svn.apache.org/viewvc/syncope/trunk/console/src/main/webapp/img/actions/deprovision-icon.png?rev=1529856&view=auto
==============================================================================
Binary file - no diff available.

Propchange: syncope/trunk/console/src/main/webapp/img/actions/deprovision-icon.png
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: syncope/trunk/console/src/main/webapp/img/actions/manage-icon.png
URL: http://svn.apache.org/viewvc/syncope/trunk/console/src/main/webapp/img/actions/manage-icon.png?rev=1529856&view=auto
==============================================================================
Binary file - no diff available.

Propchange: syncope/trunk/console/src/main/webapp/img/actions/manage-icon.png
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: syncope/trunk/console/src/main/webapp/img/actions/resources-icon.png
URL: http://svn.apache.org/viewvc/syncope/trunk/console/src/main/webapp/img/actions/resources-icon.png?rev=1529856&view=auto
==============================================================================
Binary file - no diff available.

Propchange: syncope/trunk/console/src/main/webapp/img/actions/resources-icon.png
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: syncope/trunk/console/src/main/webapp/img/actions/roles-icon.png
URL: http://svn.apache.org/viewvc/syncope/trunk/console/src/main/webapp/img/actions/roles-icon.png?rev=1529856&view=auto
==============================================================================
Binary file - no diff available.

Propchange: syncope/trunk/console/src/main/webapp/img/actions/roles-icon.png
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: syncope/trunk/console/src/main/webapp/img/actions/unassign-icon.png
URL: http://svn.apache.org/viewvc/syncope/trunk/console/src/main/webapp/img/actions/unassign-icon.png?rev=1529856&view=auto
==============================================================================
Binary file - no diff available.

Propchange: syncope/trunk/console/src/main/webapp/img/actions/unassign-icon.png
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: syncope/trunk/console/src/main/webapp/img/actions/unlink-icon.png
URL: http://svn.apache.org/viewvc/syncope/trunk/console/src/main/webapp/img/actions/unlink-icon.png?rev=1529856&view=auto
==============================================================================
Binary file - no diff available.

Propchange: syncope/trunk/console/src/main/webapp/img/actions/unlink-icon.png
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: syncope/trunk/console/src/main/webapp/img/actions/users-icon.png
URL: http://svn.apache.org/viewvc/syncope/trunk/console/src/main/webapp/img/actions/users-icon.png?rev=1529856&view=auto
==============================================================================
Binary file - no diff available.

Propchange: syncope/trunk/console/src/main/webapp/img/actions/users-icon.png
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Modified: syncope/trunk/console/src/test/java/org/apache/syncope/console/ConfigurationTestITCase.java
URL: http://svn.apache.org/viewvc/syncope/trunk/console/src/test/java/org/apache/syncope/console/ConfigurationTestITCase.java?rev=1529856&r1=1529855&r2=1529856&view=diff
==============================================================================
--- syncope/trunk/console/src/test/java/org/apache/syncope/console/ConfigurationTestITCase.java (original)
+++ syncope/trunk/console/src/test/java/org/apache/syncope/console/ConfigurationTestITCase.java Mon Oct  7 14:38:55 2013
@@ -46,7 +46,7 @@ public class ConfigurationTestITCase ext
 
         selenium.waitForCondition("selenium.isElementPresent(\"//div[@id='tabs']\");", "30000");
 
-        selenium.click("//tr/td[3]/div/span[9]/a");
+        selenium.click("//tr/td[3]/div/span[12]/a");
 
         selenium.waitForCondition("selenium.isElementPresent(\"//input[@name='key:textField']\");", "30000");
 
@@ -106,7 +106,7 @@ public class ConfigurationTestITCase ext
 
         selenium.waitForCondition("selenium.isElementPresent(\"//div[@id='tabs']\");", "30000");
 
-        selenium.click("//tr[7]/td[3]/div/span[11]/a");
+        selenium.click("//tr[7]/td[3]/div/span[14]/a");
 
         assertTrue(selenium.getConfirmation().matches("^Do you really want to delete the selected item[\\s\\S]$"));
 

Modified: syncope/trunk/console/src/test/java/org/apache/syncope/console/ConnInstanceTestITCase.java
URL: http://svn.apache.org/viewvc/syncope/trunk/console/src/test/java/org/apache/syncope/console/ConnInstanceTestITCase.java?rev=1529856&r1=1529855&r2=1529856&view=diff
==============================================================================
--- syncope/trunk/console/src/test/java/org/apache/syncope/console/ConnInstanceTestITCase.java (original)
+++ syncope/trunk/console/src/test/java/org/apache/syncope/console/ConnInstanceTestITCase.java Mon Oct  7 14:38:55 2013
@@ -55,7 +55,7 @@ public class ConnInstanceTestITCase exte
         selenium.waitForCondition("selenium.isElementPresent(\"//div[@id='tabs']\");", "30000");
 
         selenium.click("//div[3]/ul/li[2]/a");
-        selenium.click("//tr[4]/td[7]/div/span[9]/a");
+        selenium.click("//tr[4]/td[7]/div/span[12]/a");
 
         selenium.waitForCondition(
                 "selenium.isElementPresent(\"//div[2]/form/div[2]/div/div/div[3]/div[2]/span/select\");", "30000");
@@ -76,7 +76,7 @@ public class ConnInstanceTestITCase exte
         selenium.waitForCondition("selenium.isElementPresent(\"//div[@id='tabs']\");", "30000");
 
         selenium.click("//div[3]/ul/li[2]/a");
-        selenium.click("//tr[4]/td[7]/div/span[11]/a");
+        selenium.click("//tr[4]/td[7]/div/span[14]/a");
 
         assertTrue(selenium.getConfirmation().matches("^Do you really want to delete the selected item[\\s\\S]$"));
 
@@ -90,7 +90,7 @@ public class ConnInstanceTestITCase exte
         selenium.waitForCondition("selenium.isElementPresent(\"//div[@id='tabs']\");", "30000");
 
         selenium.click("//div[3]/ul/li[2]/a");
-        selenium.click("//tr[2]/td[7]/div/span[9]/a");
+        selenium.click("//tr[2]/td[7]/div/span[12]/a");
 
         selenium.waitForCondition(
                 "selenium.isElementPresent(\"//select[@name='version:dropDownChoiceField']\");", "30000");

Modified: syncope/trunk/console/src/test/java/org/apache/syncope/console/ReportTestITCase.java
URL: http://svn.apache.org/viewvc/syncope/trunk/console/src/test/java/org/apache/syncope/console/ReportTestITCase.java?rev=1529856&r1=1529855&r2=1529856&view=diff
==============================================================================
--- syncope/trunk/console/src/test/java/org/apache/syncope/console/ReportTestITCase.java (original)
+++ syncope/trunk/console/src/test/java/org/apache/syncope/console/ReportTestITCase.java Mon Oct  7 14:38:55 2013
@@ -27,7 +27,7 @@ public class ReportTestITCase extends Ab
         selenium.click("css=img[alt=\"Reports\"]");
         selenium.waitForCondition("selenium.isElementPresent(\"//div[@id='tabs']\");", "30000");
 
-        selenium.click("//table/tbody/tr/td[8]/div/span[9]/a");
+        selenium.click("//table/tbody/tr/td[8]/div/span[12]/a");
         selenium.waitForCondition("selenium.isElementPresent("
                 + "\"//div[2]/form/div[2]/div/div/span/div/div/div/span\");", "30000");
 
@@ -54,7 +54,7 @@ public class ReportTestITCase extends Ab
 
         selenium.waitForCondition("selenium.isElementPresent(\"//div[@id='tabs']\");", "30000");
 
-        selenium.click("//table/tbody/tr/td[8]/div/span[3]/a");
+        selenium.click("//table/tbody/tr/td[8]/div/span[6]/a");
 
         selenium.waitForCondition("selenium.isTextPresent(\"Operation executed successfully\");", "30000");
     }