diff --git a/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/Frontend.java b/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/Frontend.java index d17ebc8b895..b9a16e3377d 100644 --- a/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/Frontend.java +++ b/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/Frontend.java @@ -58,6 +58,8 @@ */ public class Frontend implements HasHandlers { + private NotificationHandler notificationHandler; + /** * Provides static access to {@code Frontend} singleton instance. */ @@ -1109,4 +1111,20 @@ public WebAdminSettings getWebAdminSettings() { } return webAdminSettings; } + + public void setNotificationHandler(NotificationHandler handler) { + this.notificationHandler = handler; + } + + /** + * Display a toast notification using registered {@linkplain NotificationHandler} (if available). + */ + public void showToast(String text, NotificationStatus status) { + // use local reference for async action + NotificationHandler handler = notificationHandler; + if (handler != null) { + Scheduler.get().scheduleDeferred(() -> handler.showToast(text, status)); + } + } + } diff --git a/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/NotificationHandler.java b/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/NotificationHandler.java new file mode 100644 index 00000000000..5ee7325cc0d --- /dev/null +++ b/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/NotificationHandler.java @@ -0,0 +1,8 @@ +package org.ovirt.engine.ui.frontend; + +/** + * Generic notification handler that can be used across all modules. + */ +public interface NotificationHandler { + void showToast(String text, NotificationStatus status); +} diff --git a/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/NotificationStatus.java b/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/NotificationStatus.java new file mode 100644 index 00000000000..49359ad4200 --- /dev/null +++ b/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/NotificationStatus.java @@ -0,0 +1,11 @@ +package org.ovirt.engine.ui.frontend; + +/** + * Version without any dependencies to be used across all modules. + */ +public enum NotificationStatus { + INFO, + SUCCESS, + WARNING, + DANGER; +} diff --git a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/tasks/ToastNotification.java b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/tasks/ToastNotification.java index 5bac0c09353..9418de16d8d 100644 --- a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/tasks/ToastNotification.java +++ b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/tasks/ToastNotification.java @@ -31,6 +31,20 @@ public enum NotificationStatus { this.iconStyleName = iconStyleName; } + public static NotificationStatus from(org.ovirt.engine.ui.frontend.NotificationStatus status) { + switch (status){ + case DANGER: + return DANGER; + case SUCCESS: + return SUCCESS; + case WARNING: + return WARNING; + case INFO: + default: + return INFO; + } + } + public String getStyleName() { return styleName; } diff --git a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/presenter/overlay/TasksPresenterWidget.java b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/presenter/overlay/TasksPresenterWidget.java index 01dd6658db6..c7c44788f9c 100644 --- a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/presenter/overlay/TasksPresenterWidget.java +++ b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/presenter/overlay/TasksPresenterWidget.java @@ -14,6 +14,8 @@ import org.ovirt.engine.core.common.job.Job; import org.ovirt.engine.core.common.job.JobExecutionStatus; import org.ovirt.engine.ui.common.widget.uicommon.tasks.ToastNotification.NotificationStatus; +import org.ovirt.engine.ui.frontend.Frontend; +import org.ovirt.engine.ui.frontend.NotificationHandler; import org.ovirt.engine.ui.uicommonweb.models.events.TaskListModel; import org.ovirt.engine.ui.uicompat.EnumTranslator; import org.ovirt.engine.ui.webadmin.section.main.presenter.AbstractOverlayPresenterWidget; @@ -23,10 +25,16 @@ import com.google.inject.Inject; import com.google.web.bindery.event.shared.EventBus; -public class TasksPresenterWidget extends AbstractOverlayPresenterWidget { +public class TasksPresenterWidget extends AbstractOverlayPresenterWidget + implements NotificationHandler { protected final Logger log = Logger.getLogger(TasksPresenterWidget.class.getName()); + @Override + public void showToast(String text, org.ovirt.engine.ui.frontend.NotificationStatus status) { + notificationPresenterWidget.createNotification(text, NotificationStatus.from(status)); + } + public interface ViewDef extends AbstractOverlayPresenterWidget.ViewDef { void updateTaskStatus(TaskListModel taskListModel); } @@ -71,6 +79,8 @@ protected void onReveal() { @Override public void onBind() { super.onBind(); + Frontend.getInstance().setNotificationHandler(this); + registerHandler(() -> Frontend.getInstance().setNotificationHandler(null)); taskModelProvider.getModel().getItemsChangedEvent().addListener((ev, sender, args) -> { getView().updateTaskStatus(taskModelProvider.getModel()); if (lastSpecialTaskEndTime == NOT_INITIALIZED_END_TIME) {