
io.imunity.furms.ui.components.NotificationBarComponent Maven / Gradle / Ivy
/*
* Copyright (c) 2020 Bixbit s.c. All rights reserved.
* See LICENSE file for licensing information.
*/
package io.imunity.furms.ui.components;
import com.vaadin.flow.component.AttachEvent;
import com.vaadin.flow.component.Component;
import com.vaadin.flow.component.DetachEvent;
import com.vaadin.flow.component.UI;
import com.vaadin.flow.component.button.Button;
import com.vaadin.flow.component.contextmenu.ContextMenu;
import com.vaadin.flow.component.contextmenu.MenuItem;
import com.vaadin.flow.component.dependency.CssImport;
import com.vaadin.flow.component.html.Div;
import com.vaadin.flow.component.html.Hr;
import com.vaadin.flow.component.html.Label;
import com.vaadin.flow.component.html.Span;
import com.vaadin.flow.shared.Registration;
import io.imunity.furms.domain.FurmsEvent;
import io.imunity.furms.domain.notification.UserAlarmListChangedEvent;
import io.imunity.furms.domain.notification.UserApplicationsListChangedEvent;
import io.imunity.furms.domain.notification.UserInvitationsListChangedEvent;
import io.imunity.furms.domain.notification.UserPoliciesListChangedEvent;
import io.imunity.furms.domain.users.FURMSUser;
import io.imunity.furms.domain.users.FenixUserId;
import io.imunity.furms.ui.VaadinBroadcaster;
import io.imunity.furms.ui.VaadinListener;
import io.imunity.furms.ui.notifications.NotificationBarElement;
import io.imunity.furms.ui.notifications.UINotificationService;
import io.imunity.furms.ui.user_context.FurmsViewUserContext;
import io.imunity.furms.ui.user_context.RoleTranslator;
import java.util.Iterator;
import java.util.Set;
import static com.vaadin.flow.component.icon.VaadinIcon.BELL;
@CssImport("./styles/components/notification-bar.css")
@CssImport("./styles/components/furms-badge.css")
public class NotificationBarComponent extends Button {
private final VaadinBroadcaster vaadinBroadcaster;
private final UINotificationService notificationService;
private final FURMSUser currentUser;
private final Span badge;
private final ContextMenu contextMenu;
private final RoleTranslator roleTranslator;
private Registration broadcasterRegistration;
public NotificationBarComponent(VaadinBroadcaster vaadinBroadcaster, UINotificationService notificationService,
FURMSUser currentUser, RoleTranslator roleTranslator) {
this.vaadinBroadcaster = vaadinBroadcaster;
this.notificationService = notificationService;
this.roleTranslator = roleTranslator;
this.currentUser = currentUser;
badge = new Span();
badge.setClassName("furms-badge");
contextMenu = new ContextMenu();
contextMenu.setOpenOnClick(true);
contextMenu.setTarget(this);
setIcon(new Div(BELL.create(), badge));
loadData();
}
public Component getContextMenuTarget(){
return contextMenu.getTarget();
}
private void setNumber(int number) {
badge.removeAll();
if(number > 0) {
Label label = new Label(String.valueOf(number));
label.getStyle().set("margin-top", "-2px");
badge.add(label);
badge.setVisible(true);
setEnabled(true);
}else {
badge.setVisible(false);
setEnabled(false);
}
}
private void loadData() {
contextMenu.removeAll();
Set allCurrentUserNotification = notificationService.findAllCurrentUserNotification();
Iterator iterator = allCurrentUserNotification.iterator();
while (iterator.hasNext()) {
NotificationBarElement barElement = iterator.next();
MenuItem menuItem = contextMenu.addItem(createLabel(barElement.text), y -> {
roleTranslator.refreshAuthzRolesAndGetRolesToUserViewContexts()
.get(barElement.viewMode).stream()
.filter(context -> barElement.resourceId.filter(resourceId -> resourceId.equals(context.id)).isPresent())
.findAny()
.ifPresent(FurmsViewUserContext::setAsCurrent);
barElement.redirect.ifPresent(redirect ->
barElement.parameter.ifPresentOrElse(
parameter -> UI.getCurrent().navigate(redirect, parameter),
() -> UI.getCurrent().navigate(redirect)
)
);
});
menuItem.setId("context-menu-item-size");
if (iterator.hasNext())
contextMenu.add(new Hr());
}
setNumber(allCurrentUserNotification.size());
}
private Label createLabel(String text) {
Label label = new Label(text);
label.getStyle().set("font-size", "var(--lumo-font-size-s)");
return label;
}
@Override
protected void onAttach(AttachEvent attachEvent) {
super.onAttach(attachEvent);
UI ui = attachEvent.getUI();
broadcasterRegistration = vaadinBroadcaster.register(
VaadinListener.builder()
.consumer(event -> ui.access(this::loadData))
.predicate(this::isCurrentUserPoliciesAcceptanceListChanged)
.orPredicate(this::isCurrentUserInvitationsListChanged)
.orPredicate(this::isCurrentUserApplicationsListChanged)
.orPredicate(this::isCurrentUserFiredAlarmsListChanged)
.build()
);
}
private boolean isCurrentUserFiredAlarmsListChanged(FurmsEvent furmsEvent) {
if(!(furmsEvent instanceof UserAlarmListChangedEvent))
return false;
UserAlarmListChangedEvent event = (UserAlarmListChangedEvent) furmsEvent;
return currentUser.fenixUserId
.filter(id -> id.equals(event.fenixUserId))
.isPresent();
}
private boolean isCurrentUserInvitationsListChanged(FurmsEvent furmsEvent) {
if(!(furmsEvent instanceof UserInvitationsListChangedEvent))
return false;
UserInvitationsListChangedEvent event = (UserInvitationsListChangedEvent) furmsEvent;
return currentUser.email.equals(event.email);
}
private boolean isCurrentUserApplicationsListChanged(FurmsEvent furmsEvent) {
if(!(furmsEvent instanceof UserApplicationsListChangedEvent))
return false;
UserApplicationsListChangedEvent event = (UserApplicationsListChangedEvent) furmsEvent;
return event.isTargetedAt(currentUser);
}
private boolean isCurrentUserPoliciesAcceptanceListChanged(FurmsEvent furmsEvent) {
if(furmsEvent instanceof UserPoliciesListChangedEvent) {
FenixUserId userId = ((UserPoliciesListChangedEvent) furmsEvent).fenixUserId;
return currentUser.fenixUserId
.filter(id -> id.equals(userId))
.isPresent();
}
return false;
}
@Override
protected void onDetach(DetachEvent detachEvent) {
super.onDetach(detachEvent);
broadcasterRegistration.remove();
broadcasterRegistration = null;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy