syncope-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From mdisabat...@apache.org
Subject [2/2] syncope git commit: [SYNCOPE-156] New notification component
Date Tue, 29 Dec 2015 11:49:20 GMT
[SYNCOPE-156] New notification component


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

Branch: refs/heads/master
Commit: c34dd05eace2e3db9235f614639567f536d1937e
Parents: 57a1202
Author: Marco Di Sabatino Di Diodoro <mdisabatino@apache.org>
Authored: Tue Dec 29 12:47:36 2015 +0100
Committer: Marco Di Sabatino Di Diodoro <mdisabatino@apache.org>
Committed: Tue Dec 29 12:47:44 2015 +0100

----------------------------------------------------------------------
 client/console/pom.xml                          |  8 ++
 .../console/SyncopeConsoleApplication.java      | 19 +++-
 .../commons/NotificationAwareComponent.java     |  2 +-
 .../commons/StyledNotificationBehavior.java     | 39 ++++++++
 .../client/console/pages/AbstractBasePage.java  | 23 ++---
 .../syncope/client/console/pages/BasePage.java  | 43 +++------
 .../console/pages/BulkActionModalPage.java      | 13 +--
 .../pages/DisplayAttributesModalPage.java       |  5 +-
 .../syncope/client/console/pages/Realms.java    | 19 ++--
 .../client/console/pages/SecurityQuestions.java | 17 ++--
 .../client/console/pages/StatusModal.java       | 66 ++++++--------
 .../syncope/client/console/pages/Types.java     | 14 +--
 .../console/pages/XMLEditorPopupPage.java       |  4 +-
 .../console/panels/AbstractLogsPanel.java       |  9 +-
 .../console/panels/AbstractModalPanel.java      |  4 +-
 .../console/panels/AbstractResourceModal.java   |  2 +-
 .../panels/AbstractSchemaDetailsPanel.java      |  8 +-
 .../panels/AbstractSearchResultPanel.java       | 16 +---
 .../console/panels/AbstractTypesPanel.java      |  5 --
 .../console/panels/ActionDataTablePanel.java    | 14 +--
 .../console/panels/AjaxDataTablePanel.java      | 18 ++--
 .../panels/AnyObjectSearchResultPanel.java      |  2 +-
 .../console/panels/AnyTypeClassModalPanel.java  |  7 +-
 .../console/panels/AnyTypeClassesPanel.java     |  2 +-
 .../console/panels/AnyTypeModalPanel.java       |  8 +-
 .../client/console/panels/AnyTypePanel.java     |  8 +-
 .../client/console/panels/ConnectorModal.java   | 12 +--
 .../client/console/panels/DerSchemaDetails.java |  7 +-
 .../console/panels/GroupSearchResultPanel.java  |  4 +-
 .../console/panels/NotificationPanel.java       | 94 ++++++--------------
 .../console/panels/PlainSchemaDetails.java      |  7 +-
 .../syncope/client/console/panels/Realm.java    |  7 +-
 .../client/console/panels/RealmModalPanel.java  | 13 +--
 .../panels/RelationshipTypeModalPanel.java      |  7 +-
 .../console/panels/RelationshipTypePanel.java   |  3 +-
 .../client/console/panels/ResourceModal.java    | 15 ++--
 .../console/panels/RoleSearchResultPanel.java   |  4 +-
 .../client/console/panels/SchemasPanel.java     | 38 ++++----
 .../panels/SecurityQuestionModalPanel.java      |  7 +-
 .../console/panels/SecurityQuestionsPanel.java  |  4 +-
 .../console/panels/UserSearchResultPanel.java   | 13 +--
 .../client/console/panels/VirSchemaDetails.java | 10 +--
 .../panels/search/AbstractSearchPanel.java      | 44 +++++----
 .../client/console/topology/Topology.java       | 10 +--
 .../console/topology/TopologyNodePanel.java     | 33 +++----
 .../markup/html/ClearIndicatingAjaxButton.java  |  2 +-
 .../markup/html/ClearIndicatingAjaxLink.java    | 10 +--
 .../markup/html/bootstrap/dialog/BaseModal.java | 12 +--
 .../markup/html/form/ActionLinksPanel.java      | 74 +++++++--------
 .../html/form/IndicatingOnConfirmAjaxLink.java  | 13 ++-
 .../META-INF/resources/css/syncopeConsole.css   | 84 +++++++++++------
 .../syncope/client/console/pages/BasePage.html  | 16 +---
 .../client/console/pages/BasePopupPage.html     | 12 ---
 .../syncope/client/console/pages/Logs.html      |  6 +-
 .../console/panels/NotificationPanel.html       | 38 ++++++++
 .../markup/html/bootstrap/dialog/BaseModal.html | 13 +--
 .../console/pages/CamelRouteModalPage.java      |  4 +-
 pom.xml                                         | 10 +++
 58 files changed, 461 insertions(+), 540 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/syncope/blob/c34dd05e/client/console/pom.xml
----------------------------------------------------------------------
diff --git a/client/console/pom.xml b/client/console/pom.xml
index 5d3e658..a78d5c4 100644
--- a/client/console/pom.xml
+++ b/client/console/pom.xml
@@ -71,6 +71,14 @@ under the License.
       <artifactId>wicket-jquery-ui</artifactId>
     </dependency>
     <dependency>
+      <groupId>com.googlecode.wicket-jquery-ui</groupId>
+      <artifactId>wicket-kendo-ui</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>com.googlecode.wicket-jquery-ui</groupId>
+      <artifactId>wicket-kendo-ui-theme-bootstrap</artifactId>
+    </dependency>
+    <dependency>
       <groupId>org.apache.wicket</groupId>
       <artifactId>wicket-native-websocket-javax</artifactId>
     </dependency>

http://git-wip-us.apache.org/repos/asf/syncope/blob/c34dd05e/client/console/src/main/java/org/apache/syncope/client/console/SyncopeConsoleApplication.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/SyncopeConsoleApplication.java b/client/console/src/main/java/org/apache/syncope/client/console/SyncopeConsoleApplication.java
index 87eb0fe..7c03f02 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/SyncopeConsoleApplication.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/SyncopeConsoleApplication.java
@@ -48,6 +48,9 @@ import org.apache.wicket.authroles.authentication.AbstractAuthenticatedWebSessio
 import org.apache.wicket.authroles.authentication.AuthenticatedWebApplication;
 import org.apache.wicket.authroles.authentication.AuthenticatedWebSession;
 import org.apache.wicket.authroles.authorization.strategies.role.metadata.MetaDataRoleAuthorizationStrategy;
+import org.apache.wicket.feedback.DefaultCleanupFeedbackMessageFilter;
+import org.apache.wicket.feedback.FeedbackMessage;
+import org.apache.wicket.feedback.IFeedbackMessageFilter;
 import org.apache.wicket.markup.html.WebPage;
 import org.apache.wicket.protocol.http.WebApplication;
 import org.apache.wicket.request.resource.IResource;
@@ -84,6 +87,8 @@ public class SyncopeConsoleApplication extends AuthenticatedWebApplication {
 
     private SyncopeClientFactoryBean clientFactory;
 
+    private IFeedbackMessageFilter feedbackMessageCleanupFilter = new DefaultCleanupFeedbackMessageFilter();
+
     @Override
     protected void init() {
         super.init();
@@ -153,6 +158,16 @@ public class SyncopeConsoleApplication extends AuthenticatedWebApplication {
 
         getRequestCycleListeners().add(new SyncopeConsoleRequestCycleListener());
 
+        getApplicationSettings().setFeedbackMessageCleanupFilter(new DefaultCleanupFeedbackMessageFilter() {
+
+            private static final long serialVersionUID = 4419535854770831722L;
+
+            @Override
+            public boolean accept(final FeedbackMessage message) {
+                return true;
+            }
+        });
+
         mountPage("/login", getSignInPageClass());
 
         activitiModelerDirectory = props.getProperty("activitiModelerDirectory");
@@ -201,8 +216,8 @@ public class SyncopeConsoleApplication extends AuthenticatedWebApplication {
     public Class<? extends Page> getHomePage() {
         return AuthenticatedWebSession.get().isSignedIn()
                 && SyncopeConsoleSession.get().owns(StandardEntitlement.MUST_CHANGE_PASSWORD)
-                        ? MustChangePassword.class
-                        : Dashboard.class;
+                ? MustChangePassword.class
+                : Dashboard.class;
     }
 
     public String getVersion() {

http://git-wip-us.apache.org/repos/asf/syncope/blob/c34dd05e/client/console/src/main/java/org/apache/syncope/client/console/commons/NotificationAwareComponent.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/commons/NotificationAwareComponent.java b/client/console/src/main/java/org/apache/syncope/client/console/commons/NotificationAwareComponent.java
index b767db0..d674b2a 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/commons/NotificationAwareComponent.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/commons/NotificationAwareComponent.java
@@ -21,5 +21,5 @@ package org.apache.syncope.client.console.commons;
 import org.apache.syncope.client.console.panels.NotificationPanel;
 
 public interface NotificationAwareComponent {
-    NotificationPanel getFeedbackPanel();
+    NotificationPanel getNotificationPanel();
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/c34dd05e/client/console/src/main/java/org/apache/syncope/client/console/commons/StyledNotificationBehavior.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/commons/StyledNotificationBehavior.java b/client/console/src/main/java/org/apache/syncope/client/console/commons/StyledNotificationBehavior.java
new file mode 100644
index 0000000..98f53ec
--- /dev/null
+++ b/client/console/src/main/java/org/apache/syncope/client/console/commons/StyledNotificationBehavior.java
@@ -0,0 +1,39 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.syncope.client.console.commons;
+
+import com.googlecode.wicket.jquery.core.Options;
+import com.googlecode.wicket.kendo.ui.widget.notification.NotificationBehavior;
+import java.io.Serializable;
+import org.apache.wicket.core.request.handler.IPartialPageRequestHandler;
+
+public class StyledNotificationBehavior extends NotificationBehavior {
+
+    private static final long serialVersionUID = -3985689554352173472L;
+
+    public StyledNotificationBehavior(final String selector, final Options options) {
+        super(selector, options);
+    }
+
+    @Override
+    public void show(final IPartialPageRequestHandler handler, final Serializable message, final String level) {
+        handler.appendJavaScript(String.format("%s.show( { message: '%s' } , '%s');", this.widget(), this.format(String.
+                valueOf(message), level), level.toLowerCase()));
+    }
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/c34dd05e/client/console/src/main/java/org/apache/syncope/client/console/pages/AbstractBasePage.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/pages/AbstractBasePage.java b/client/console/src/main/java/org/apache/syncope/client/console/pages/AbstractBasePage.java
index 247051e..2075346 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/pages/AbstractBasePage.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/pages/AbstractBasePage.java
@@ -18,7 +18,6 @@
  */
 package org.apache.syncope.client.console.pages;
 
-import org.apache.syncope.client.console.commons.Constants;
 import org.apache.syncope.client.console.commons.NotificationAwareComponent;
 import org.apache.syncope.client.console.panels.NotificationPanel;
 import org.apache.syncope.client.console.wicket.markup.head.MetaHeaderItem;
@@ -46,7 +45,7 @@ public class AbstractBasePage extends WebPage implements NotificationAwareCompon
 
     protected final HeaderItem meta = new MetaHeaderItem("X-UA-Compatible", "IE=edge");
 
-    protected NotificationPanel feedbackPanel;
+    protected NotificationPanel notificationPanel;
 
     /**
      * Response flag set by the Modal Window after the operation is completed.
@@ -60,22 +59,6 @@ public class AbstractBasePage extends WebPage implements NotificationAwareCompon
     public AbstractBasePage(final PageParameters parameters) {
         super(parameters);
 
-        feedbackPanel = new NotificationPanel(Constants.FEEDBACK);
-        feedbackPanel.setOutputMarkupId(true);
-        add(feedbackPanel);
-    }
-
-    @Override
-    public NotificationPanel getFeedbackPanel() {
-        return feedbackPanel;
-    }
-
-    public boolean isModalResult() {
-        return modalResult;
-    }
-
-    public void setModalResult(final boolean modalResult) {
-        this.modalResult = modalResult;
     }
 
     @Override
@@ -84,4 +67,8 @@ public class AbstractBasePage extends WebPage implements NotificationAwareCompon
         response.render(new PriorityHeaderItem(meta));
     }
 
+    @Override
+    public NotificationPanel getNotificationPanel() {
+        return notificationPanel;
+    }
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/c34dd05e/client/console/src/main/java/org/apache/syncope/client/console/pages/BasePage.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/pages/BasePage.java b/client/console/src/main/java/org/apache/syncope/client/console/pages/BasePage.java
index b7132cd..6c91a91 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/pages/BasePage.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/pages/BasePage.java
@@ -20,7 +20,7 @@ package org.apache.syncope.client.console.pages;
 
 import org.apache.syncope.client.console.SyncopeConsoleApplication;
 import org.apache.syncope.client.console.SyncopeConsoleSession;
-import org.apache.syncope.client.console.commons.Constants;
+import org.apache.syncope.client.console.panels.NotificationPanel;
 import org.apache.syncope.client.console.rest.UserWorkflowRestClient;
 import org.apache.syncope.client.console.topology.Topology;
 import org.apache.syncope.client.console.wicket.markup.html.bootstrap.dialog.BaseModal;
@@ -52,6 +52,10 @@ public class BasePage extends AbstractBasePage implements IAjaxIndicatorAware {
     public BasePage(final PageParameters parameters) {
         super(parameters);
 
+        notificationPanel = new NotificationPanel("feedback");
+        notificationPanel.setOutputMarkupId(true);
+        addOrReplace(notificationPanel);
+
         // header, footer
         add(new Label("version", SyncopeConsoleApplication.get().getVersion()));
         add(new Label("username", SyncopeConsoleSession.get().getSelfTO().getUsername()));
@@ -124,7 +128,7 @@ public class BasePage extends AbstractBasePage implements IAjaxIndicatorAware {
         confULContainer.add(liContainer);
         liContainer.add(new BookmarkablePageLink<>("roles", Roles.class));
         MetaDataRoleAuthorizationStrategy.authorize(liContainer, WebPage.RENDER, StandardEntitlement.ROLE_LIST);
-        
+
         liContainer = new WebMarkupContainer(getLIContainerId("policies"));
         confULContainer.add(liContainer);
         liContainer.add(new BookmarkablePageLink<>("policies", Policies.class));
@@ -205,32 +209,6 @@ public class BasePage extends AbstractBasePage implements IAjaxIndicatorAware {
     }
 
     /**
-     * Set a WindowClosedCallback for a ModalWindow instance.
-     *
-     * @param window window
-     * @param container container
-     */
-    public void setWindowClosedCallback(final ModalWindow window, final WebMarkupContainer container) {
-        window.setWindowClosedCallback(new ModalWindow.WindowClosedCallback() {
-
-            private static final long serialVersionUID = 8804221891699487139L;
-
-            @Override
-            public void onClose(final AjaxRequestTarget target) {
-                if (container != null) {
-                    target.add(container);
-                }
-
-                if (isModalResult()) {
-                    info(getString(Constants.OPERATION_SUCCEEDED));
-                    feedbackPanel.refresh(target);
-                    setModalResult(false);
-                }
-            }
-        });
-    }
-
-    /**
      * Set a WindowClosedCallback for a Modal instance.
      *
      * @param modal window
@@ -247,11 +225,10 @@ public class BasePage extends AbstractBasePage implements IAjaxIndicatorAware {
                     target.add(container);
                 }
 
-                if (isModalResult()) {
-                    info(getString(Constants.OPERATION_SUCCEEDED));
-                    feedbackPanel.refresh(target);
-                    setModalResult(false);
-                }
+//                if (isModalResult()) {
+//                    notification.success(target, getString(Constants.OPERATION_SUCCEEDED));
+//                    setModalResult(false);
+//                }
             }
         });
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/c34dd05e/client/console/src/main/java/org/apache/syncope/client/console/pages/BulkActionModalPage.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/pages/BulkActionModalPage.java b/client/console/src/main/java/org/apache/syncope/client/console/pages/BulkActionModalPage.java
index 7d98e51..9a16098 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/pages/BulkActionModalPage.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/pages/BulkActionModalPage.java
@@ -27,7 +27,6 @@ import java.util.List;
 import org.apache.syncope.client.console.commons.Constants;
 import org.apache.syncope.client.console.panels.AbstractModalPanel;
 import org.apache.syncope.client.console.rest.BaseRestClient;
-import org.apache.syncope.client.console.wicket.ajax.markup.html.ClearIndicatingAjaxButton;
 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;
@@ -36,6 +35,7 @@ import org.apache.syncope.common.lib.to.BulkActionResult;
 import org.apache.wicket.PageReference;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.ajax.markup.html.form.AjaxButton;
+import org.apache.wicket.extensions.ajax.markup.html.IndicatingAjaxButton;
 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.util.SortableDataProvider;
@@ -88,8 +88,8 @@ public class BulkActionModalPage<T, S> extends AbstractModalPanel {
                 Integer.MAX_VALUE).setVisible(items != null && !items.isEmpty()));
 
         @SuppressWarnings("rawtypes")
-        final ActionLinksPanel<Serializable> actionPanel
-                = ActionLinksPanel.builder(pageRef).build("actions");
+        final ActionLinksPanel<Serializable> actionPanel =
+                ActionLinksPanel.builder(pageRef).build("actions");
         add(actionPanel);
 
         for (ActionLink.ActionType action : actions) {
@@ -139,7 +139,7 @@ public class BulkActionModalPage<T, S> extends AbstractModalPanel {
                             | IllegalArgumentException | InvocationTargetException e) {
                         error(getString(Constants.ERROR)
                                 + ": Operation " + bulkAction.getType() + " not supported");
-                        modal.getFeedbackPanel().refresh(target);
+                        modal.getNotificationPanel().refresh(target);
                     }
 
                 }
@@ -149,14 +149,15 @@ public class BulkActionModalPage<T, S> extends AbstractModalPanel {
         final Form<Void> form = new Form<>(FORM);
         add(form);
 
-        final AjaxButton cancel = new ClearIndicatingAjaxButton(CANCEL, new ResourceModel(CANCEL), pageRef) {
+        final AjaxButton cancel = new IndicatingAjaxButton(CANCEL, new ResourceModel(CANCEL)) {
 
             private static final long serialVersionUID = -958724007591692537L;
 
             @Override
-            protected void onSubmitInternal(final AjaxRequestTarget target, final Form<?> form) {
+            protected void onSubmit(final AjaxRequestTarget target, final Form<?> form) {
                 modal.close(target);
             }
+
         };
 
         cancel.setDefaultFormProcessing(false);

http://git-wip-us.apache.org/repos/asf/syncope/blob/c34dd05e/client/console/src/main/java/org/apache/syncope/client/console/pages/DisplayAttributesModalPage.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/pages/DisplayAttributesModalPage.java b/client/console/src/main/java/org/apache/syncope/client/console/pages/DisplayAttributesModalPage.java
index fa961b4..a6c0298 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/pages/DisplayAttributesModalPage.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/pages/DisplayAttributesModalPage.java
@@ -22,6 +22,7 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import org.apache.syncope.client.console.PreferenceManager;
+import org.apache.syncope.client.console.commons.Constants;
 import org.apache.syncope.client.console.panels.AbstractModalPanel;
 import org.apache.syncope.client.console.wicket.markup.html.bootstrap.dialog.BaseModal;
 import org.apache.syncope.common.lib.search.SearchableFields;
@@ -200,7 +201,7 @@ public abstract class DisplayAttributesModalPage<T extends AnyTO> extends Abstra
 
                     prefMan.setList(getRequest(), getResponse(), prefs);
 
-                    ((BasePage) pageRef.getPage()).setModalResult(true);
+                    info(getString(Constants.OPERATION_SUCCEEDED));
 
                     modal.close(target);
                 }
@@ -208,7 +209,7 @@ public abstract class DisplayAttributesModalPage<T extends AnyTO> extends Abstra
 
             @Override
             protected void onError(final AjaxRequestTarget target, final Form<?> form) {
-                modal.getFeedbackPanel().refresh(target);
+                modal.getNotificationPanel().refresh(target);
             }
         };
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/c34dd05e/client/console/src/main/java/org/apache/syncope/client/console/pages/Realms.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/pages/Realms.java b/client/console/src/main/java/org/apache/syncope/client/console/pages/Realms.java
index 922dacc..53cd426 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/pages/Realms.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/pages/Realms.java
@@ -24,7 +24,6 @@ import org.apache.syncope.client.console.panels.RealmModalPanel;
 import org.apache.syncope.client.console.panels.RealmSidebarPanel;
 import org.apache.syncope.client.console.panels.RealmSidebarPanel.ControlSidebarClick;
 import org.apache.syncope.client.console.rest.RealmRestClient;
-import org.apache.syncope.client.console.wicket.ajax.markup.html.ClearIndicatingAjaxLink;
 import org.apache.syncope.client.console.wicket.markup.html.bootstrap.confirmation.ConfirmationModalBehavior;
 import org.apache.syncope.client.console.wicket.markup.html.bootstrap.dialog.BaseModal;
 import org.apache.syncope.common.lib.to.RealmTO;
@@ -33,6 +32,7 @@ import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.ajax.markup.html.AjaxLink;
 import org.apache.wicket.authroles.authorization.strategies.role.metadata.MetaDataRoleAuthorizationStrategy;
 import org.apache.wicket.event.IEvent;
+import org.apache.wicket.extensions.ajax.markup.html.IndicatingAjaxLink;
 import org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow.WindowClosedCallback;
 import org.apache.wicket.markup.html.WebMarkupContainer;
 import org.apache.wicket.markup.html.basic.Label;
@@ -79,12 +79,6 @@ public class Realms extends BasePage {
                 target.add(updateRealmContent(realmSidebarPanel.getCurrentRealm()));
 
                 modal.show(false);
-
-                if (isModalResult()) {
-                    info(getString(Constants.OPERATION_SUCCEEDED));
-                    feedbackPanel.refresh(target);
-                    setModalResult(false);
-                }
             }
         });
 
@@ -135,12 +129,11 @@ public class Realms extends BasePage {
                     target.add(updateRealmContent(realmSidebarPanel.getCurrentRealm()));
 
                     info(getString(Constants.OPERATION_SUCCEEDED));
-                    feedbackPanel.refresh(target);
                 } catch (Exception e) {
                     LOG.error("While deleting realm", e);
                     error(getString(Constants.ERROR) + ": " + e.getMessage());
-                    getFeedbackPanel().refresh(target);
                 }
+                notificationPanel.refresh(target);
             }
         };
 
@@ -152,12 +145,12 @@ public class Realms extends BasePage {
 
     private void setupCreateLink() {
 
-        final AjaxLink<Void> createLink = new ClearIndicatingAjaxLink<Void>("createLink", getPageReference()) {
+        final AjaxLink<Void> createLink = new IndicatingAjaxLink<Void>("createLink") {
 
             private static final long serialVersionUID = -7978723352517770644L;
 
             @Override
-            protected void onClickInternal(final AjaxRequestTarget target) {
+            public void onClick(final AjaxRequestTarget target) {
                 modal.header(new ResourceModel("createRealm"));
 
                 final RealmTO realmTO = new RealmTO();
@@ -182,12 +175,12 @@ public class Realms extends BasePage {
     }
 
     private void setupEditLink() {
-        final AjaxLink<Void> editLink = new ClearIndicatingAjaxLink<Void>("editLink", getPageReference()) {
+        final AjaxLink<Void> editLink = new IndicatingAjaxLink<Void>("editLink") {
 
             private static final long serialVersionUID = -6957616042924610290L;
 
             @Override
-            protected void onClickInternal(final AjaxRequestTarget target) {
+            public void onClick(final AjaxRequestTarget target) {
                 modal.header(Model.of(realmSidebarPanel.getCurrentRealm().getName()));
 
                 final RealmTO realmTO = realmSidebarPanel.getCurrentRealm();

http://git-wip-us.apache.org/repos/asf/syncope/blob/c34dd05e/client/console/src/main/java/org/apache/syncope/client/console/pages/SecurityQuestions.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/pages/SecurityQuestions.java b/client/console/src/main/java/org/apache/syncope/client/console/pages/SecurityQuestions.java
index 9f30062..6b0df50 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/pages/SecurityQuestions.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/pages/SecurityQuestions.java
@@ -20,16 +20,15 @@ package org.apache.syncope.client.console.pages;
 
 import de.agilecoders.wicket.core.markup.html.bootstrap.dialog.Modal;
 import org.apache.syncope.client.console.SyncopeConsoleSession;
-import org.apache.syncope.client.console.commons.Constants;
 import org.apache.syncope.client.console.panels.SecurityQuestionModalPanel;
 import org.apache.syncope.client.console.panels.SecurityQuestionsPanel;
-import org.apache.syncope.client.console.wicket.ajax.markup.html.ClearIndicatingAjaxLink;
 import org.apache.syncope.client.console.wicket.markup.html.bootstrap.dialog.BaseModal;
 import org.apache.syncope.common.lib.to.SecurityQuestionTO;
 import org.apache.syncope.common.lib.types.StandardEntitlement;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.ajax.markup.html.AjaxLink;
 import org.apache.wicket.authroles.authorization.strategies.role.metadata.MetaDataRoleAuthorizationStrategy;
+import org.apache.wicket.extensions.ajax.markup.html.IndicatingAjaxLink;
 import org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow;
 import org.apache.wicket.markup.html.WebMarkupContainer;
 import org.apache.wicket.markup.html.basic.Label;
@@ -56,13 +55,12 @@ public class SecurityQuestions extends BasePage {
         addWindowWindowClosedCallback(securityQuestionModal);
         add(securityQuestionModal);
 
-        final AjaxLink<Void> createLink = new ClearIndicatingAjaxLink<Void>(
-                "createSecurityQuestion", getPageReference()) {
+        final AjaxLink<Void> createLink = new IndicatingAjaxLink<Void>("createSecurityQuestion") {
 
             private static final long serialVersionUID = -7978723352517770644L;
 
             @Override
-            protected void onClickInternal(final AjaxRequestTarget target) {
+            public void onClick(final AjaxRequestTarget target) {
                 securityQuestionModal.header(new ResourceModel("createSecurityQuestion"));
                 securityQuestionModal.setFormModel(new SecurityQuestionTO());
                 securityQuestionModal.size(Modal.Size.Large);
@@ -96,12 +94,9 @@ public class SecurityQuestions extends BasePage {
                 target.add(securityQuestionsPanel);
                 modal.show(false);
 
-                if (((AbstractBasePage) SecurityQuestions.this.getPage()).isModalResult()) {
-                    info(getString(Constants.OPERATION_SUCCEEDED));
-                    feedbackPanel.refresh(target);
-                    ((AbstractBasePage) SecurityQuestions.this.getPage()).setModalResult(false);
-                }
+                ((AbstractBasePage) getPage()).getNotificationPanel().refresh(target);
             }
-        });
+        }
+        );
     }
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/c34dd05e/client/console/src/main/java/org/apache/syncope/client/console/pages/StatusModal.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/pages/StatusModal.java b/client/console/src/main/java/org/apache/syncope/client/console/pages/StatusModal.java
index 8ee6357..d59088a 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/pages/StatusModal.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/pages/StatusModal.java
@@ -34,7 +34,6 @@ import org.apache.syncope.client.console.panels.ActionDataTablePanel;
 import org.apache.syncope.client.console.rest.GroupRestClient;
 import org.apache.syncope.client.console.rest.ResourceRestClient;
 import org.apache.syncope.client.console.rest.UserRestClient;
-import org.apache.syncope.client.console.wicket.ajax.markup.html.ClearIndicatingAjaxButton;
 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.AjaxCheckBoxPanel;
@@ -47,6 +46,7 @@ import org.apache.syncope.common.lib.types.ResourceAssociationAction;
 import org.apache.wicket.PageReference;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior;
+import org.apache.wicket.extensions.ajax.markup.html.IndicatingAjaxButton;
 import org.apache.wicket.extensions.markup.html.repeater.data.grid.ICellPopulator;
 import org.apache.wicket.extensions.markup.html.repeater.data.table.AbstractColumn;
 import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn;
@@ -85,7 +85,7 @@ public class StatusModal<T extends AnyTO> extends AbstractStatusModalPage {
     // --------------------------------
     // password management fields ..
     // --------------------------------
-    private final ClearIndicatingAjaxButton cancel;
+    private final IndicatingAjaxButton cancel;
 
     private final WebMarkupContainer pwdMgt;
 
@@ -232,26 +232,25 @@ public class StatusModal<T extends AnyTO> extends AbstractStatusModalPage {
             }
         });
 
-        cancel = new ClearIndicatingAjaxButton("cancel", new ResourceModel("cancel"), pageRef) {
+        cancel = new IndicatingAjaxButton("cancel", new ResourceModel("cancel")) {
 
             private static final long serialVersionUID = -2341391430136818026L;
 
             @Override
-            protected void onSubmitInternal(final AjaxRequestTarget target, final Form<?> form) {
+            protected void onSubmit(final AjaxRequestTarget target, final Form<?> form) {
                 // ignore
                 modal.close(target);
             }
-        }.feedbackPanelAutomaticReload(false);
+        };
 
         pwdMgtForm.add(cancel);
 
-        final ClearIndicatingAjaxButton goon = new ClearIndicatingAjaxButton("continue", new ResourceModel("continue"),
-                pageRef) {
+        final IndicatingAjaxButton goon = new IndicatingAjaxButton("continue", new ResourceModel("continue")) {
 
             private static final long serialVersionUID = -2341391430136818027L;
 
             @Override
-            protected void onSubmitInternal(final AjaxRequestTarget target, final Form<?> form) {
+            protected void onSubmit(final AjaxRequestTarget target, final Form<?> form) {
                 // none
             }
         };
@@ -271,13 +270,12 @@ public class StatusModal<T extends AnyTO> extends AbstractStatusModalPage {
                                 anyTO.getKey(),
                                 new ArrayList<>(table.getModelObject()));
 
-                        ((BasePage) pageRef.getPage()).setModalResult(true);
-
+                        info(getString(Constants.OPERATION_SUCCEEDED));
                         modal.close(target);
                     } catch (Exception e) {
                         LOG.error("Error enabling resources", e);
                         error(getString(Constants.ERROR) + ": " + e.getMessage());
-                        modal.getFeedbackPanel().refresh(target);
+                        modal.getNotificationPanel().refresh(target);
                     }
                 }
             }, ActionLink.ActionType.REACTIVATE, pageId);
@@ -294,15 +292,12 @@ public class StatusModal<T extends AnyTO> extends AbstractStatusModalPage {
                                 anyTO.getKey(),
                                 new ArrayList<>(table.getModelObject()));
 
-                        if (pageRef.getPage() instanceof BasePage) {
-                            ((BasePage) pageRef.getPage()).setModalResult(true);
-                        }
-
+                        info(getString(Constants.OPERATION_SUCCEEDED));
                         modal.close(target);
                     } catch (Exception e) {
                         LOG.error("Error disabling resources", e);
                         error(getString(Constants.ERROR) + ": " + e.getMessage());
-                        modal.getFeedbackPanel().refresh(target);
+                        modal.getNotificationPanel().refresh(target);
                     }
                 }
             }, ActionLink.ActionType.SUSPEND, pageId);
@@ -326,12 +321,12 @@ public class StatusModal<T extends AnyTO> extends AbstractStatusModalPage {
                                     new ArrayList<>(table.getModelObject()));
                         }
 
-                        ((BasePage) pageRef.getPage()).setModalResult(true);
+                        info(getString(Constants.OPERATION_SUCCEEDED));
                         modal.close(target);
                     } catch (Exception e) {
                         LOG.error("Error unlinking resources", e);
                         error(getString(Constants.ERROR) + ": " + e.getMessage());
-                        modal.getFeedbackPanel().refresh(target);
+                        modal.getNotificationPanel().refresh(target);
                     }
                 }
             }, ActionLink.ActionType.UNLINK, pageId);
@@ -355,12 +350,12 @@ public class StatusModal<T extends AnyTO> extends AbstractStatusModalPage {
                                     new ArrayList<>(table.getModelObject()));
                         }
 
-                        ((BasePage) pageRef.getPage()).setModalResult(true);
+                        info(getString(Constants.OPERATION_SUCCEEDED));
                         modal.close(target);
                     } catch (Exception e) {
                         LOG.error("Error linking resources", e);
                         error(getString(Constants.ERROR) + ": " + e.getMessage());
-                        modal.getFeedbackPanel().refresh(target);
+                        modal.getNotificationPanel().refresh(target);
                     }
                 }
             }, ActionLink.ActionType.LINK, pageId);
@@ -385,12 +380,12 @@ public class StatusModal<T extends AnyTO> extends AbstractStatusModalPage {
                                     new ArrayList<>(table.getModelObject()));
                         }
 
-                        ((BasePage) pageRef.getPage()).setModalResult(true);
+                        info(getString(Constants.OPERATION_SUCCEEDED));
                         loadBulkActionResultPage(target, table.getModelObject(), bulkActionResult);
                     } catch (Exception e) {
                         LOG.error("Error de-provisioning user", e);
                         error(getString(Constants.ERROR) + ": " + e.getMessage());
-                        modal.getFeedbackPanel().refresh(target);
+                        modal.getNotificationPanel().refresh(target);
                     }
                 }
             }, ActionLink.ActionType.DEPROVISION, pageId);
@@ -412,12 +407,12 @@ public class StatusModal<T extends AnyTO> extends AbstractStatusModalPage {
                                     anyTO.getKey(),
                                     new ArrayList<>(table.getModelObject()));
 
-                            ((BasePage) pageRef.getPage()).setModalResult(true);
+                            info(getString(Constants.OPERATION_SUCCEEDED));
                             loadBulkActionResultPage(target, table.getModelObject(), bulkActionResult);
                         } catch (Exception e) {
                             LOG.error("Error provisioning user", e);
                             error(getString(Constants.ERROR) + ": " + e.getMessage());
-                            modal.getFeedbackPanel().refresh(target);
+                            modal.getNotificationPanel().refresh(target);
                         }
                     }
                 }
@@ -443,12 +438,12 @@ public class StatusModal<T extends AnyTO> extends AbstractStatusModalPage {
                                     new ArrayList<>(table.getModelObject()));
                         }
 
-                        ((BasePage) pageRef.getPage()).setModalResult(true);
+                        info(getString(Constants.OPERATION_SUCCEEDED));
                         loadBulkActionResultPage(target, table.getModelObject(), bulkActionResult);
                     } catch (Exception e) {
                         LOG.error("Error unassigning resources", e);
                         error(getString(Constants.ERROR) + ": " + e.getMessage());
-                        modal.getFeedbackPanel().refresh(target);
+                        modal.getNotificationPanel().refresh(target);
                     }
                 }
             }, ActionLink.ActionType.UNASSIGN, pageId);
@@ -469,12 +464,12 @@ public class StatusModal<T extends AnyTO> extends AbstractStatusModalPage {
                                     anyTO.getKey(),
                                     new ArrayList<>(table.getModelObject()));
 
-                            ((BasePage) pageRef.getPage()).setModalResult(true);
+                            info(getString(Constants.OPERATION_SUCCEEDED));
                             loadBulkActionResultPage(target, table.getModelObject(), bulkActionResult);
                         } catch (Exception e) {
                             LOG.error("Error assigning resources", e);
                             error(getString(Constants.ERROR) + ": " + e.getMessage());
-                            modal.getFeedbackPanel().refresh(target);
+                            modal.getNotificationPanel().refresh(target);
                         }
                     }
                 }
@@ -552,13 +547,13 @@ public class StatusModal<T extends AnyTO> extends AbstractStatusModalPage {
             final ResourceAssociationAction type,
             final Collection<StatusBean> selection) {
 
-        final ClearIndicatingAjaxButton goon = new ClearIndicatingAjaxButton("continue", new ResourceModel("continue",
-                "Continue"), pageRef) {
+        final IndicatingAjaxButton goon =
+                new IndicatingAjaxButton("continue", new ResourceModel("continue", "Continue")) {
 
             private static final long serialVersionUID = -2341391430136818027L;
 
             @Override
-            protected void onSubmitInternal(final AjaxRequestTarget target, final Form<?> form) {
+            protected void onSubmit(final AjaxRequestTarget target, final Form<?> form) {
                 try {
                     if (StringUtils.isNotBlank(password.getModelObject())
                             && !password.getModelObject().equals(confirm.getModelObject())) {
@@ -588,22 +583,19 @@ public class StatusModal<T extends AnyTO> extends AbstractStatusModalPage {
                         // ignore
                     }
 
-                    ((BasePage) pageRef.getPage()).setModalResult(true);
-
                     if (bulkActionResult != null) {
                         loadBulkActionResultPage(target, selection, bulkActionResult);
                     } else {
-
-                        target.add(((BasePage) pageRef.getPage()).getFeedbackPanel());
+                        modal.getNotificationPanel().refresh(target);
                         modal.close(target);
                     }
                 } catch (Exception e) {
                     LOG.error("Error provisioning resources", e);
                     error(getString(Constants.ERROR) + ": " + e.getMessage());
-                    modal.getFeedbackPanel().refresh(target);
+                    modal.getNotificationPanel().refresh(target);
                 }
             }
-        }.feedbackPanelAutomaticReload(false);
+        };
 
         pwdMgtForm.addOrReplace(goon);
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/c34dd05e/client/console/src/main/java/org/apache/syncope/client/console/pages/Types.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/pages/Types.java b/client/console/src/main/java/org/apache/syncope/client/console/pages/Types.java
index 95eb868..0cad78a 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/pages/Types.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/pages/Types.java
@@ -23,7 +23,6 @@ import de.agilecoders.wicket.core.markup.html.bootstrap.tabs.AjaxBootstrapTabbed
 import java.util.ArrayList;
 import java.util.List;
 import org.apache.syncope.client.console.SyncopeConsoleSession;
-import org.apache.syncope.client.console.commons.Constants;
 import org.apache.syncope.client.console.panels.AnyTypeClassModalPanel;
 import org.apache.syncope.client.console.panels.AnyTypeClassesPanel;
 import org.apache.syncope.client.console.panels.AnyTypeModalPanel;
@@ -32,7 +31,6 @@ import org.apache.syncope.client.console.panels.ModalPanel;
 import org.apache.syncope.client.console.panels.RelationshipTypeModalPanel;
 import org.apache.syncope.client.console.panels.RelationshipTypePanel;
 import org.apache.syncope.client.console.panels.SchemasPanel;
-import org.apache.syncope.client.console.wicket.ajax.markup.html.ClearIndicatingAjaxLink;
 import org.apache.syncope.client.console.wicket.markup.html.bootstrap.dialog.BaseModal;
 import org.apache.syncope.common.lib.to.AbstractSchemaTO;
 import org.apache.wicket.ajax.AjaxRequestTarget;
@@ -52,6 +50,7 @@ import org.apache.syncope.common.lib.to.AnyTypeTO;
 import org.apache.syncope.common.lib.to.PlainSchemaTO;
 import org.apache.syncope.common.lib.to.RelationshipTypeTO;
 import org.apache.syncope.common.lib.types.StandardEntitlement;
+import org.apache.wicket.extensions.ajax.markup.html.IndicatingAjaxLink;
 import org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow;
 
 public class Types extends BasePage {
@@ -185,12 +184,12 @@ public class Types extends BasePage {
 
     private AjaxLink<Void> buildCreateLink(final String label, final BaseModal<?> modal, final Type type) {
 
-        final AjaxLink<Void> createLink = new ClearIndicatingAjaxLink<Void>(label, getPageReference()) {
+        final AjaxLink<Void> createLink = new IndicatingAjaxLink<Void>(label) {
 
             private static final long serialVersionUID = -7978723352517770644L;
 
             @Override
-            protected void onClickInternal(final AjaxRequestTarget target) {
+            public void onClick(final AjaxRequestTarget target) {
                 modal.header(new ResourceModel(label));
                 target.add(modal.setContent(buildModalPanel(type)));
                 modal.addSumbitButton();
@@ -237,12 +236,7 @@ public class Types extends BasePage {
                 tabbedPanel.setSelectedTab(tabbedPanel.getSelectedTab());
                 target.add(tabbedPanel);
                 modal.show(false);
-
-                if (((AbstractBasePage) Types.this.getPage()).isModalResult()) {
-                    info(getString(Constants.OPERATION_SUCCEEDED));
-                    feedbackPanel.refresh(target);
-                    ((AbstractBasePage) Types.this.getPage()).setModalResult(false);
-                }
+                notificationPanel.refresh(target);
             }
         });
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/c34dd05e/client/console/src/main/java/org/apache/syncope/client/console/pages/XMLEditorPopupPage.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/pages/XMLEditorPopupPage.java b/client/console/src/main/java/org/apache/syncope/client/console/pages/XMLEditorPopupPage.java
index e2a585f..a885c0c 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/pages/XMLEditorPopupPage.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/pages/XMLEditorPopupPage.java
@@ -68,12 +68,12 @@ public class XMLEditorPopupPage extends BasePopupPage {
                 } catch (SyncopeClientException scee) {
                     error(getString(Constants.ERROR) + ": " + scee.getMessage());
                 }
-                feedbackPanel.refresh(target);
+                notificationPanel.refresh(target);
             }
 
             @Override
             protected void onError(final AjaxRequestTarget target, final Form<?> form) {
-                feedbackPanel.refresh(target);
+                notificationPanel.refresh(target);
             }
         };
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/c34dd05e/client/console/src/main/java/org/apache/syncope/client/console/panels/AbstractLogsPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/AbstractLogsPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/AbstractLogsPanel.java
index 1584c93..627e75d 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/AbstractLogsPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/AbstractLogsPanel.java
@@ -44,14 +44,11 @@ public abstract class AbstractLogsPanel<T extends AbstractBaseBean> extends Pane
 
     private static final long serialVersionUID = -6313532280206208227L;
 
-    protected final NotificationPanel feedbackPanel;
-
     public AbstractLogsPanel(
-            final String id, 
+            final String id,
             final PageReference pageRef,
             final List<LoggerTO> loggerTOs) {
         super(id);
-        this.feedbackPanel = ((AbstractBasePage) pageRef.getPage()).getFeedbackPanel();
 
         final WebMarkupContainer container = new WebMarkupContainer("loggerContainer");
         container.setOutputMarkupId(true);
@@ -82,9 +79,9 @@ public abstract class AbstractLogsPanel<T extends AbstractBaseBean> extends Pane
                                 info(getString(Constants.OPERATION_SUCCEEDED));
                             } catch (SyncopeClientException e) {
                                 LOG.error("Error updating the logger level", e);
-                                info(getString(Constants.OPERATION_ERROR));
+                                error(getString(Constants.OPERATION_ERROR + e.getMessage()));
                             }
-                            feedbackPanel.refresh(target);
+                            ((AbstractBasePage) getPage()).getNotificationPanel().refresh(target);
                         }
                     });
                     return loggerTOs;

http://git-wip-us.apache.org/repos/asf/syncope/blob/c34dd05e/client/console/src/main/java/org/apache/syncope/client/console/panels/AbstractModalPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/AbstractModalPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/AbstractModalPanel.java
index 57d34aa..3811873 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/AbstractModalPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/AbstractModalPanel.java
@@ -68,11 +68,11 @@ public class AbstractModalPanel extends Panel implements ModalPanel {
 
     @Override
     public void onSubmit(final AjaxRequestTarget target, final Form<?> form) {
-        modal.getFeedbackPanel().refresh(target);
+        modal.getNotificationPanel().refresh(target);
     }
 
     @Override
     public void onError(final AjaxRequestTarget target, final Form<?> form) {
-        modal.getFeedbackPanel().refresh(target);
+        modal.getNotificationPanel().refresh(target);
     }
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/c34dd05e/client/console/src/main/java/org/apache/syncope/client/console/panels/AbstractResourceModal.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/AbstractResourceModal.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/AbstractResourceModal.java
index 21568eb..68fcc19 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/AbstractResourceModal.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/AbstractResourceModal.java
@@ -73,7 +73,7 @@ public abstract class AbstractResourceModal extends AbstractModalPanel {
 
                 @Override
                 protected void onError(final AjaxRequestTarget target, final Form<?> form) {
-                    modal.getFeedbackPanel().refresh(target);
+                    modal.getNotificationPanel().refresh(target);
                 }
             };
         }

http://git-wip-us.apache.org/repos/asf/syncope/blob/c34dd05e/client/console/src/main/java/org/apache/syncope/client/console/panels/AbstractSchemaDetailsPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/AbstractSchemaDetailsPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/AbstractSchemaDetailsPanel.java
index ee55faa..6faced0 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/AbstractSchemaDetailsPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/AbstractSchemaDetailsPanel.java
@@ -44,12 +44,7 @@ public abstract class AbstractSchemaDetailsPanel extends Panel {
      * Schema rest client for create and update operations
      */
     protected final SchemaRestClient schemaRestClient = new SchemaRestClient();
-
-    /**
-     * Feedback panel specified by the caller.
-     */
-    protected final NotificationPanel feedbackPanel;
-
+    
     /**
      * Schema form
      */
@@ -66,7 +61,6 @@ public abstract class AbstractSchemaDetailsPanel extends Panel {
         super(id);
 
         this.page = (AbstractBasePage) pageReference.getPage();
-        this.feedbackPanel = page.getFeedbackPanel();
         this.schemaTO = modal.getFormModel();
 
         schemaForm = new Form<>(FORM);

http://git-wip-us.apache.org/repos/asf/syncope/blob/c34dd05e/client/console/src/main/java/org/apache/syncope/client/console/panels/AbstractSearchResultPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/AbstractSearchResultPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/AbstractSearchResultPanel.java
index d588a9c..c633a4f 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/AbstractSearchResultPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/AbstractSearchResultPanel.java
@@ -69,11 +69,6 @@ public abstract class AbstractSearchResultPanel<
     protected final WebMarkupContainer container;
 
     /**
-     * Feedback panel specified by the caller.
-     */
-    protected final NotificationPanel feedbackPanel;
-
-    /**
      * Specify if results are about a filtered search or not. Using this attribute it is possible to use this panel to
      * show results about user list and user search.
      */
@@ -106,7 +101,6 @@ public abstract class AbstractSearchResultPanel<
 
         this.filtered = builder.filtered;
         this.checkBoxEnabled = builder.checkBoxEnabled;
-        this.feedbackPanel = page.getFeedbackPanel();
 
         this.restClient = builder.restClient;
 
@@ -223,15 +217,7 @@ public abstract class AbstractSearchResultPanel<
                 data.setRows(rows);
 
                 send(getParent(), Broadcast.BREADTH, data);
-
-                if (page.isModalResult()) {
-                    // reset modal result
-                    page.setModalResult(false);
-                    // set operation succeeded
-                    getSession().info(getString(Constants.OPERATION_SUCCEEDED));
-                    // refresh feedback panel
-                    feedbackPanel.refresh(target);
-                }
+                ((AbstractBasePage) getPage()).getNotificationPanel().refresh(target);
             }
         });
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/c34dd05e/client/console/src/main/java/org/apache/syncope/client/console/panels/AbstractTypesPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/AbstractTypesPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/AbstractTypesPanel.java
index 2a9b968..cad794e 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/AbstractTypesPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/AbstractTypesPanel.java
@@ -21,7 +21,6 @@ package org.apache.syncope.client.console.panels;
 import java.util.List;
 import org.apache.syncope.client.console.PreferenceManager;
 import org.apache.syncope.client.console.commons.Constants;
-import org.apache.syncope.client.console.pages.AbstractBasePage;
 import org.apache.syncope.client.console.wicket.extensions.markup.html.repeater.data.table.AjaxFallbackDataTable;
 import org.apache.syncope.client.console.wicket.markup.html.form.SelectChoiceRenderer;
 import org.apache.syncope.common.lib.AbstractBaseBean;
@@ -42,17 +41,13 @@ public class AbstractTypesPanel<T extends AbstractBaseBean> extends Panel {
 
     protected final PreferenceManager prefMan = new PreferenceManager();
 
-    protected final NotificationPanel feedbackPanel;
-
     protected final PageReference pageRef;
 
     protected int pageRows;
 
     public AbstractTypesPanel(final String id, final PageReference pageRef) {
         super(id);
-
         this.pageRef = pageRef;
-        this.feedbackPanel = ((AbstractBasePage) pageRef.getPage()).getFeedbackPanel();
     }
 
     protected void buildDataTable(final WebMarkupContainer container, final List<IColumn<T, String>> tableCols,

http://git-wip-us.apache.org/repos/asf/syncope/blob/c34dd05e/client/console/src/main/java/org/apache/syncope/client/console/panels/ActionDataTablePanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/ActionDataTablePanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/ActionDataTablePanel.java
index eb4421a..8c063b2 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/ActionDataTablePanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/ActionDataTablePanel.java
@@ -23,7 +23,6 @@ import java.util.Collection;
 import java.util.List;
 import org.apache.syncope.client.console.commons.ActionTableCheckGroup;
 import org.apache.syncope.client.console.wicket.ajax.form.IndicatorAjaxFormChoiceComponentUpdatingBehavior;
-import org.apache.syncope.client.console.wicket.ajax.markup.html.ClearIndicatingAjaxButton;
 import org.apache.syncope.client.console.wicket.extensions.markup.html.repeater.data.table.AjaxFallbackDataTable;
 import org.apache.syncope.client.console.wicket.extensions.markup.html.repeater.data.table.CheckGroupColumn;
 import org.apache.syncope.client.console.wicket.markup.html.bootstrap.dialog.BaseModal;
@@ -34,6 +33,7 @@ import org.apache.wicket.AttributeModifier;
 import org.apache.wicket.PageReference;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.ajax.markup.html.form.AjaxButton;
+import org.apache.wicket.extensions.ajax.markup.html.IndicatingAjaxButton;
 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;
@@ -100,12 +100,12 @@ public class ActionDataTablePanel<T, S> extends DataTablePanel<T, S> {
             actionPanelContainer.add(new AttributeModifier("style", "display: none"));
         }
 
-        bulkActionForm.add(new ClearIndicatingAjaxButton(CANCEL, new ResourceModel(CANCEL), pageRef) {
+        bulkActionForm.add(new IndicatingAjaxButton(CANCEL, new ResourceModel(CANCEL)) {
 
             private static final long serialVersionUID = -2341391430136818025L;
 
             @Override
-            protected void onSubmitInternal(final AjaxRequestTarget target, final Form<?> form) {
+            protected void onSubmit(final AjaxRequestTarget target, final Form<?> form) {
                 // ignore
             }
         }.setVisible(false).setEnabled(false));
@@ -123,15 +123,15 @@ public class ActionDataTablePanel<T, S> extends DataTablePanel<T, S> {
 
     public void addCancelButton(final BaseModal<?> modal) {
 
-        final AjaxButton cancel = new ClearIndicatingAjaxButton(CANCEL, new ResourceModel(CANCEL), pageRef) {
+        final AjaxButton cancel = new IndicatingAjaxButton(CANCEL, new ResourceModel(CANCEL)) {
 
-            private static final long serialVersionUID = -2341391430136818025L;
+            private static final long serialVersionUID = -4804368561204623354L;
 
             @Override
-            protected void onSubmitInternal(final AjaxRequestTarget target, final Form<?> form) {
+            protected void onSubmit(final AjaxRequestTarget target, final Form<?> form) {
                 modal.close(target);
             }
-        }.feedbackPanelAutomaticReload(false);
+        };
 
         cancel.setDefaultFormProcessing(false);
         bulkActionForm.addOrReplace(cancel);

http://git-wip-us.apache.org/repos/asf/syncope/blob/c34dd05e/client/console/src/main/java/org/apache/syncope/client/console/panels/AjaxDataTablePanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/AjaxDataTablePanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/AjaxDataTablePanel.java
index fc653c1..f740fc3 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/AjaxDataTablePanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/AjaxDataTablePanel.java
@@ -26,17 +26,17 @@ import org.apache.syncope.client.console.rest.BaseRestClient;
 import org.apache.syncope.client.console.wicket.markup.html.form.ActionLink;
 import org.apache.syncope.client.console.panels.AbstractSearchResultPanel.EventDataWrapper;
 import org.apache.syncope.client.console.pages.AbstractBasePage;
-import org.apache.syncope.client.console.commons.Constants;
+import org.apache.syncope.client.console.pages.BasePage;
 import org.apache.syncope.client.console.wicket.ajax.form.IndicatorAjaxFormChoiceComponentUpdatingBehavior;
 import org.apache.syncope.client.console.pages.BulkActionModalPage;
 import org.apache.syncope.client.console.wicket.extensions.markup.html.repeater.data.table.CheckGroupColumn;
-import org.apache.syncope.client.console.wicket.ajax.markup.html.ClearIndicatingAjaxButton;
 import org.apache.syncope.client.console.wicket.extensions.markup.html.repeater.data.table.AjaxFallbackDataTable;
 import org.apache.syncope.client.console.wicket.markup.html.bootstrap.dialog.BaseModal;
 import org.apache.wicket.AttributeModifier;
 import org.apache.wicket.PageReference;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.event.Broadcast;
+import org.apache.wicket.extensions.ajax.markup.html.IndicatingAjaxButton;
 import org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow;
 import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn;
 import org.apache.wicket.extensions.markup.html.repeater.data.table.ISortableDataProvider;
@@ -164,15 +164,7 @@ public final class AjaxDataTablePanel<T, S> extends DataTablePanel<T, S> {
                 send(builder.pageRef.getPage(), Broadcast.BREADTH, data);
 
                 final AbstractBasePage page = (AbstractBasePage) builder.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());
-                }
+                ((BasePage) getPage()).getNotificationPanel().refresh(target);
             }
         });
 
@@ -203,12 +195,12 @@ public final class AjaxDataTablePanel<T, S> extends DataTablePanel<T, S> {
 
         group.add(dataTable);
 
-        fragment.add(new ClearIndicatingAjaxButton("bulkActionLink", bulkActionForm, builder.pageRef) {
+        fragment.add(new IndicatingAjaxButton("bulkActionLink", bulkActionForm) {
 
             private static final long serialVersionUID = 382302811235019988L;
 
             @Override
-            protected void onSubmitInternal(final AjaxRequestTarget target, final Form<?> form) {
+            protected void onSubmit(final AjaxRequestTarget target, final Form<?> form) {
                 bulkModalWin.setContent(new BulkActionModalPage<>(
                         bulkModalWin,
                         builder.pageRef,

http://git-wip-us.apache.org/repos/asf/syncope/blob/c34dd05e/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyObjectSearchResultPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyObjectSearchResultPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyObjectSearchResultPanel.java
index badfbd5..fa0b7d7 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyObjectSearchResultPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyObjectSearchResultPanel.java
@@ -201,7 +201,7 @@ public class AnyObjectSearchResultPanel<T extends AnyTO>
                                     error(getString(Constants.ERROR) + ": " + e.getMessage());
                                     LOG.error("While deleting object {}", model.getObject().getKey(), e);
                                 }
-                                ((BasePage) getPage()).getFeedbackPanel().refresh(target);
+                                ((BasePage) getPage()).getNotificationPanel().refresh(target);
                             }
                         }, ActionLink.ActionType.DELETE, String.format("%s_%s", type, AnyEntitlement.DELETE));
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/c34dd05e/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyTypeClassModalPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyTypeClassModalPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyTypeClassModalPanel.java
index 6df508f..a5eae89 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyTypeClassModalPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyTypeClassModalPanel.java
@@ -20,7 +20,6 @@ package org.apache.syncope.client.console.panels;
 
 import org.apache.syncope.client.console.SyncopeConsoleSession;
 import org.apache.syncope.client.console.commons.Constants;
-import org.apache.syncope.client.console.pages.AbstractBasePage;
 import org.apache.syncope.client.console.wicket.markup.html.bootstrap.dialog.BaseModal;
 import org.apache.syncope.client.console.wicket.markup.html.form.AjaxTextFieldPanel;
 import org.apache.syncope.common.lib.to.AnyTypeClassTO;
@@ -74,14 +73,12 @@ public class AnyTypeClassModalPanel extends AbstractModalPanel {
                 SyncopeConsoleSession.get().getService(AnyTypeClassService.class).update(updatedAnyTypeClassTO);
             }
 
-            if (pageRef.getPage() instanceof AbstractBasePage) {
-                ((AbstractBasePage) pageRef.getPage()).setModalResult(true);
-            }
+            info(getString(Constants.OPERATION_SUCCEEDED));
             modal.close(target);
         } catch (Exception e) {
             LOG.error("While creating or updating AnyTypeClass", e);
             error(getString(Constants.ERROR) + ": " + e.getMessage());
-            modal.getFeedbackPanel().refresh(target);
+            modal.getNotificationPanel().refresh(target);
         }
     }
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/c34dd05e/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyTypeClassesPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyTypeClassesPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyTypeClassesPanel.java
index 28a9fab..f5dba79 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyTypeClassesPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyTypeClassesPanel.java
@@ -154,7 +154,7 @@ public class AnyTypeClassesPanel extends Panel {
                     LOG.error("While deleting AnyTypeClass", e);
                     error(getString(Constants.ERROR) + ": " + e.getMessage());
                 }
-                ((AbstractBasePage) pageRef.getPage()).getFeedbackPanel().refresh(target);
+                ((AbstractBasePage) getPage()).getNotificationPanel().refresh(target);
             }
         }, ActionLink.ActionType.DELETE, StandardEntitlement.ANYTYPECLASS_DELETE);
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/c34dd05e/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyTypeModalPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyTypeModalPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyTypeModalPanel.java
index 4e82737..76acff0 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyTypeModalPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyTypeModalPanel.java
@@ -20,7 +20,6 @@ package org.apache.syncope.client.console.panels;
 
 import org.apache.syncope.client.console.SyncopeConsoleSession;
 import org.apache.syncope.client.console.commons.Constants;
-import org.apache.syncope.client.console.pages.AbstractBasePage;
 import org.apache.syncope.client.console.wicket.markup.html.bootstrap.dialog.BaseModal;
 import org.apache.syncope.common.lib.to.AnyTypeTO;
 import org.apache.syncope.common.rest.api.service.AnyTypeService;
@@ -51,15 +50,12 @@ public class AnyTypeModalPanel extends AbstractModalPanel {
             } else {
                 SyncopeConsoleSession.get().getService(AnyTypeService.class).update(updateAnyTypeTO);
             }
-
-            if (pageRef.getPage() instanceof AbstractBasePage) {
-                ((AbstractBasePage) pageRef.getPage()).setModalResult(true);
-            }
+            info(getString(Constants.OPERATION_SUCCEEDED));
             modal.close(target);
         } catch (Exception e) {
             LOG.error("While creating or updating AnyTypeTO", e);
             error(getString(Constants.ERROR) + ": " + e.getMessage());
-            modal.getFeedbackPanel().refresh(target);
+            modal.getNotificationPanel().refresh(target);
         }
     }
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/c34dd05e/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyTypePanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyTypePanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyTypePanel.java
index 1c1067f..ccdfd77 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyTypePanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyTypePanel.java
@@ -29,6 +29,7 @@ import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.client.console.SyncopeConsoleSession;
 import org.apache.syncope.client.console.commons.Constants;
 import org.apache.syncope.client.console.commons.SortableDataProviderComparator;
+import org.apache.syncope.client.console.pages.AbstractBasePage;
 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;
@@ -166,17 +167,14 @@ public class AnyTypePanel extends AbstractTypesPanel<AnyTypeTO> {
                     @Override
                     public void onClick(final AjaxRequestTarget target, final Serializable ignore) {
                         try {
-                            SyncopeConsoleSession.get().getService(AnyTypeService.class
-                            ).delete(anyTypeTO.getKey());
+                            SyncopeConsoleSession.get().getService(AnyTypeService.class).delete(anyTypeTO.getKey());
                             info(getString(Constants.OPERATION_SUCCEEDED));
-                            feedbackPanel.refresh(target);
                             target.add(webContainer);
                         } catch (Exception e) {
                             LOG.error("While deleting AnyTypeTO", e);
                             error(getString(Constants.ERROR) + ": " + e.getMessage());
-                            feedbackPanel.refresh(target);
                         }
-
+                        ((AbstractBasePage) getPage()).getNotificationPanel().refresh(target);
                     }
                 }, ActionLink.ActionType.DELETE, StandardEntitlement.ANYTYPE_DELETE);
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/c34dd05e/client/console/src/main/java/org/apache/syncope/client/console/panels/ConnectorModal.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/ConnectorModal.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/ConnectorModal.java
index b7dca18..03a836d 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/ConnectorModal.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/ConnectorModal.java
@@ -26,7 +26,6 @@ import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.collections4.IterableUtils;
 import org.apache.commons.collections4.Predicate;
 import org.apache.syncope.client.console.commons.Constants;
-import org.apache.syncope.client.console.pages.AbstractBasePage;
 import org.apache.syncope.client.console.rest.ConnectorRestClient;
 import org.apache.syncope.client.console.topology.TopologyNode;
 import org.apache.syncope.client.console.wicket.markup.html.bootstrap.dialog.BaseModal;
@@ -102,7 +101,7 @@ public class ConnectorModal extends AbstractResourceModal {
                         } else {
                             error(getString("error_connection"));
                         }
-                        modal.getFeedbackPanel().refresh(target);
+                        modal.getNotificationPanel().refresh(target);
                     }
 
                 };
@@ -127,7 +126,7 @@ public class ConnectorModal extends AbstractResourceModal {
 
     @Override
     public void onError(final AjaxRequestTarget target, final Form<?> form) {
-        modal.getFeedbackPanel().refresh(target);
+        modal.getNotificationPanel().refresh(target);
     }
 
     @Override
@@ -163,15 +162,12 @@ public class ConnectorModal extends AbstractResourceModal {
             } else {
                 connectorRestClient.update(connInstanceTO);
             }
-
-            if (pageRef.getPage() instanceof AbstractBasePage) {
-                ((AbstractBasePage) pageRef.getPage()).setModalResult(true);
-            }
+            info(getString(Constants.OPERATION_SUCCEEDED));
             modal.close(target);
         } catch (Exception e) {
             LOG.error("Failure managing resource {}", connInstanceTO, e);
             error(getString(Constants.ERROR) + ": " + e.getMessage());
-            modal.getFeedbackPanel().refresh(target);
+            modal.getNotificationPanel().refresh(target);
         }
     }
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/c34dd05e/client/console/src/main/java/org/apache/syncope/client/console/panels/DerSchemaDetails.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/DerSchemaDetails.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/DerSchemaDetails.java
index fd27845..e013dcb 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/DerSchemaDetails.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/DerSchemaDetails.java
@@ -20,7 +20,6 @@ package org.apache.syncope.client.console.panels;
 
 import org.apache.syncope.client.console.commons.Constants;
 import org.apache.syncope.client.console.commons.JexlHelpUtils;
-import org.apache.syncope.client.console.pages.AbstractBasePage;
 import org.apache.syncope.client.console.wicket.markup.html.bootstrap.dialog.BaseModal;
 import org.apache.syncope.client.console.wicket.markup.html.form.AjaxTextFieldPanel;
 import org.apache.syncope.common.lib.to.AbstractSchemaTO;
@@ -65,14 +64,12 @@ public class DerSchemaDetails extends AbstractSchemaDetailsPanel {
                 schemaRestClient.updateDerSchema(updatedDerSchemaTO);
             }
 
-            if (pageReference.getPage() instanceof AbstractBasePage) {
-                ((AbstractBasePage) pageReference.getPage()).setModalResult(true);
-            }
+            info(getString(Constants.OPERATION_SUCCEEDED));
             modal.close(target);
         } catch (Exception e) {
             LOG.error("While creating or updating derived schema", e);
             error(getString(Constants.ERROR) + ": " + e.getMessage());
-            modal.getFeedbackPanel().refresh(target);
+            modal.getNotificationPanel().refresh(target);
         }
     }
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/c34dd05e/client/console/src/main/java/org/apache/syncope/client/console/panels/GroupSearchResultPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/GroupSearchResultPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/GroupSearchResultPanel.java
index 8ac8812..8670265 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/GroupSearchResultPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/GroupSearchResultPanel.java
@@ -27,7 +27,7 @@ import java.util.Date;
 import java.util.List;
 import org.apache.commons.lang3.SerializationUtils;
 import org.apache.syncope.client.console.commons.Constants;
-import org.apache.syncope.client.console.pages.BasePage;
+import org.apache.syncope.client.console.pages.AbstractBasePage;
 import org.apache.syncope.client.console.pages.GroupDisplayAttributesModalPage;
 import org.apache.syncope.client.console.rest.AbstractAnyRestClient;
 import org.apache.syncope.client.console.rest.GroupRestClient;
@@ -151,7 +151,7 @@ public class GroupSearchResultPanel extends AnyObjectSearchResultPanel<GroupTO>
                             error(getString(Constants.ERROR) + ": " + e.getMessage());
                             LOG.error("While deleting object {}", model.getObject().getKey(), e);
                         }
-                        ((BasePage) getPage()).getFeedbackPanel().refresh(target);
+                        ((AbstractBasePage) getPage()).getNotificationPanel().refresh(target);
                     }
                 }, ActionLink.ActionType.DELETE, StandardEntitlement.GROUP_DELETE);
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/c34dd05e/client/console/src/main/java/org/apache/syncope/client/console/panels/NotificationPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/NotificationPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/NotificationPanel.java
index e9693e3..03102ae 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/NotificationPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/NotificationPanel.java
@@ -18,93 +18,55 @@
  */
 package org.apache.syncope.client.console.panels;
 
+import com.googlecode.wicket.jquery.core.Options;
+import com.googlecode.wicket.kendo.ui.widget.notification.Notification;
 import org.apache.syncope.client.console.commons.Constants;
-import org.apache.wicket.AttributeModifier;
-import org.apache.wicket.ajax.AjaxEventBehavior;
+import org.apache.syncope.client.console.commons.StyledNotificationBehavior;
 import org.apache.wicket.ajax.AjaxRequestTarget;
-import org.apache.wicket.feedback.FeedbackMessage;
-import org.apache.wicket.feedback.IFeedbackMessageFilter;
 import org.apache.wicket.markup.html.panel.FeedbackPanel;
-import org.apache.wicket.model.Model;
+import org.apache.wicket.feedback.FeedbackMessage;
 
 public class NotificationPanel extends FeedbackPanel {
 
     private static final long serialVersionUID = 5895940553202128621L;
 
-    public NotificationPanel(final String id) {
-        this(id, null);
-    }
+    private final Notification notification;
 
-    public NotificationPanel(
-            final String id, final IFeedbackMessageFilter feedbackMessageFilter) {
+    private StyledNotificationBehavior behavior;
 
-        super(id, feedbackMessageFilter);
+    public NotificationPanel(final String id) {
+        super(id);
 
-        this.add(new AjaxEventBehavior(Constants.ON_CLICK) {
+        final Options options = new Options();
+        options.set("position", "{ pinned: true }");
+        options.set("autoHideAfter", "0");
+        options.set("templates",
+                "[ { type: 'success' , template: $('#successTemplate').html() },"
+                + "  { type: 'error', template: $('#errorTemplate').html() } ] ");
 
-            private static final long serialVersionUID = -7133385027739964990L;
+        notification = new Notification(Constants.FEEDBACK, options) {
+
+            private static final long serialVersionUID = 785830249476640904L;
 
             @Override
-            protected void onEvent(final AjaxRequestTarget target) {
-                target.appendJavaScript("setTimeout(\"$('div#" + getMarkupId() + "').fadeOut('normal')\", 0);");
+            public StyledNotificationBehavior newWidgetBehavior(final String selector) {
+                behavior = new StyledNotificationBehavior(selector, options);
+                return behavior;
             }
-        });
-
-        setOutputMarkupId(true);
-
-        this.add(new AttributeModifier("class", new Model<>("alert")));
-        this.add(new AttributeModifier("style", new Model<>("opacity: 1; display: none;")));
-    }
+        };
 
-    private String getCSSClass(final int level) {
-        return level == FeedbackMessage.SUCCESS
-                ? "alert alert-success"
-                : level == FeedbackMessage.INFO
-                        ? "alert alert-info"
-                        : level == FeedbackMessage.WARNING
-                                ? "alert alert-warning"
-                                : "alert alert-danger";
+        add(notification);
     }
 
-    /**
-     * Method to refresh the notification panel.
-     *
-     * If there are any feedback messages for the user, find the gravest level, format the notification panel
-     * accordingly and show it.
-     *
-     * @param target AjaxRequestTarget to add panel and the calling javascript function
-     */
     public void refresh(final AjaxRequestTarget target) {
-        // any feedback at all in the current form?
         if (anyMessage()) {
-            int highestFeedbackLevel = FeedbackMessage.INFO;
-
-            // any feedback with the given level?
-            if (anyMessage(FeedbackMessage.WARNING)) {
-                highestFeedbackLevel = FeedbackMessage.WARNING;
-            }
-            if (anyMessage(FeedbackMessage.ERROR)) {
-                highestFeedbackLevel = FeedbackMessage.ERROR;
-            }
-
-            // add the css classes to the notification panel,
-            add(new AttributeModifier("class", new Model<>(getCSSClass(highestFeedbackLevel))));
-
-            // refresh the panel and call the js function with the panel markup id 
-            // and the total count of messages
-            target.add(this);
-
-            if (anyMessage(FeedbackMessage.ERROR)) {
-                target.appendJavaScript("$('div#" + getMarkupId() + "').fadeTo('normal', 1.0);");
-            } else {
-                target.appendJavaScript(
-                        "showNotification('" + getMarkupId() + "', " + getCurrentMessages().size() + ");");
+            for (FeedbackMessage message : getCurrentMessages()) {
+                if (anyErrorMessage()) {
+                    notification.error(target, message.getMessage());
+                } else {
+                    notification.success(target, message.getMessage());
+                }
             }
         }
     }
-
-    @Override
-    protected String getCSSClass(final FeedbackMessage message) {
-        return "notificationpanel_row";
-    }
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/c34dd05e/client/console/src/main/java/org/apache/syncope/client/console/panels/PlainSchemaDetails.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/PlainSchemaDetails.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/PlainSchemaDetails.java
index 175d758..f556680 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/PlainSchemaDetails.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/PlainSchemaDetails.java
@@ -27,7 +27,6 @@ import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.client.console.commons.Constants;
 import org.apache.syncope.client.console.commons.JexlHelpUtils;
 import org.apache.syncope.client.console.init.MIMETypesLoader;
-import org.apache.syncope.client.console.pages.AbstractBasePage;
 import org.apache.syncope.client.console.wicket.markup.html.bootstrap.dialog.BaseModal;
 import org.apache.syncope.client.console.wicket.markup.html.form.AjaxCheckBoxPanel;
 import org.apache.syncope.client.console.wicket.markup.html.form.AjaxDropDownChoicePanel;
@@ -412,14 +411,12 @@ public class PlainSchemaDetails extends AbstractSchemaDetailsPanel {
                 schemaRestClient.updatePlainSchema(updatedPlainSchemaTO);
             }
 
-            if (pageReference.getPage() instanceof AbstractBasePage) {
-                ((AbstractBasePage) pageReference.getPage()).setModalResult(true);
-            }
+            info(getString(Constants.OPERATION_SUCCEEDED));
             modal.close(target);
         } catch (Exception e) {
             LOG.error("While creating or updating plain schema", e);
             error(getString(Constants.ERROR) + ": " + e.getMessage());
-            modal.getFeedbackPanel().refresh(target);
+            modal.getNotificationPanel().refresh(target);
         }
     }
 }


Mime
View raw message