diff --git a/user-interface/src/main/java/life/qbic/datamanager/views/general/QbicDialog.java b/user-interface/src/main/java/life/qbic/datamanager/views/general/QbicDialog.java index 827a3ae6f..620908001 100644 --- a/user-interface/src/main/java/life/qbic/datamanager/views/general/QbicDialog.java +++ b/user-interface/src/main/java/life/qbic/datamanager/views/general/QbicDialog.java @@ -5,6 +5,8 @@ import com.vaadin.flow.component.ShortcutRegistration; import com.vaadin.flow.component.Shortcuts; import com.vaadin.flow.component.dialog.Dialog; +import com.vaadin.flow.router.BeforeLeaveEvent; +import com.vaadin.flow.router.BeforeLeaveObserver; import com.vaadin.flow.server.Command; import java.util.Objects; @@ -15,7 +17,7 @@ * @see Dialog * @since 1.4.0 */ -public class QbicDialog extends Dialog { +public class QbicDialog extends Dialog implements BeforeLeaveObserver { private ShortcutRegistration escShortcut; @@ -38,4 +40,9 @@ public void setEscAction(Command command) { } escShortcut = Shortcuts.addShortcutListener(this, command, Key.ESCAPE); } + + @Override + public void beforeLeave(BeforeLeaveEvent event) { + this.close(); + } } diff --git a/user-interface/src/main/java/life/qbic/datamanager/views/general/dialog/AppDialog.java b/user-interface/src/main/java/life/qbic/datamanager/views/general/dialog/AppDialog.java index fd8b981f2..80a8345e7 100644 --- a/user-interface/src/main/java/life/qbic/datamanager/views/general/dialog/AppDialog.java +++ b/user-interface/src/main/java/life/qbic/datamanager/views/general/dialog/AppDialog.java @@ -5,6 +5,8 @@ import com.vaadin.flow.component.Component; import com.vaadin.flow.component.dialog.Dialog; import com.vaadin.flow.component.html.Div; +import com.vaadin.flow.router.BeforeLeaveEvent; +import com.vaadin.flow.router.BeforeLeaveObserver; import java.util.Objects; import java.util.Optional; import life.qbic.datamanager.views.general.icon.IconFactory; @@ -22,7 +24,7 @@ * * @since 1.7.0 */ -public class AppDialog extends Dialog { +public class AppDialog extends Dialog implements BeforeLeaveObserver { public static final String PADDING_LEFT_RIGHT_07 = "padding-left-right-07"; public static final String PADDING_TOP_BOTTOM_04 = "padding-top-bottom-04"; @@ -229,6 +231,16 @@ public void registerUserInput(UserInput userInput) { this.userInput = Objects.requireNonNull(userInput); } + @Override + public void beforeLeave(BeforeLeaveEvent event) { + if (hasChanges()) { + event.postpone(); + cancel(); + } else { + this.close(); + } + } + private interface Style { diff --git a/user-interface/src/main/java/life/qbic/datamanager/views/notifications/NotificationDialog.java b/user-interface/src/main/java/life/qbic/datamanager/views/notifications/NotificationDialog.java index 181b67833..8f3a9b1e3 100644 --- a/user-interface/src/main/java/life/qbic/datamanager/views/notifications/NotificationDialog.java +++ b/user-interface/src/main/java/life/qbic/datamanager/views/notifications/NotificationDialog.java @@ -10,6 +10,8 @@ import com.vaadin.flow.component.icon.Icon; import com.vaadin.flow.component.icon.VaadinIcon; import com.vaadin.flow.dom.Style.Display; +import com.vaadin.flow.router.BeforeLeaveEvent; +import com.vaadin.flow.router.BeforeLeaveObserver; /** * A dialog notifying the user of some event. @@ -31,7 +33,7 @@ *
  • info-dialog
  • * */ -public class NotificationDialog extends ConfirmDialog { +public class NotificationDialog extends ConfirmDialog implements BeforeLeaveObserver { private final H2 title; private final NotificationLevel level; @@ -191,4 +193,8 @@ public T withContent(Component... content) { return withContent(hiddenCollectionDiv); } + @Override + public void beforeLeave(BeforeLeaveEvent event) { + this.close(); + } } diff --git a/user-interface/src/main/java/life/qbic/datamanager/views/projects/project/measurements/MeasurementMain.java b/user-interface/src/main/java/life/qbic/datamanager/views/projects/project/measurements/MeasurementMain.java index 4adeeff73..8fe651ec2 100644 --- a/user-interface/src/main/java/life/qbic/datamanager/views/projects/project/measurements/MeasurementMain.java +++ b/user-interface/src/main/java/life/qbic/datamanager/views/projects/project/measurements/MeasurementMain.java @@ -13,6 +13,8 @@ import com.vaadin.flow.dom.Style.Visibility; import com.vaadin.flow.router.BeforeEnterEvent; import com.vaadin.flow.router.BeforeEnterObserver; +import com.vaadin.flow.router.BeforeLeaveEvent; +import com.vaadin.flow.router.BeforeLeaveObserver; import com.vaadin.flow.router.Route; import com.vaadin.flow.spring.annotation.SpringComponent; import com.vaadin.flow.spring.annotation.UIScope; @@ -50,6 +52,7 @@ import life.qbic.logging.api.Logger; import life.qbic.logging.service.LoggerFactory; import life.qbic.projectmanagement.application.ProjectInformationService; +import life.qbic.projectmanagement.application.measurement.MeasurementMetadata; import life.qbic.projectmanagement.application.measurement.MeasurementService; import life.qbic.projectmanagement.application.measurement.MeasurementService.MeasurementDeletionException; import life.qbic.projectmanagement.application.measurement.validation.MeasurementValidationService; @@ -76,7 +79,7 @@ @UIScope @Route(value = "projects/:projectId?/experiments/:experimentId?/measurements", layout = ExperimentMainLayout.class) @PermitAll -public class MeasurementMain extends Main implements BeforeEnterObserver { +public class MeasurementMain extends Main implements BeforeEnterObserver, BeforeLeaveObserver { public static final String PROJECT_ID_ROUTE_PARAMETER = "projectId"; public static final String EXPERIMENT_ID_ROUTE_PARAMETER = "experimentId"; @@ -103,6 +106,7 @@ public class MeasurementMain extends Main implements BeforeEnterObserver { private final transient ProjectInformationService projectInformationService; private final transient CancelConfirmationDialogFactory cancelConfirmationDialogFactory; private final transient MessageSourceNotificationFactory messageFactory; + private MeasurementMetadataUploadDialog dialog; private transient Context context; public MeasurementMain( @@ -157,7 +161,6 @@ public MeasurementMain( getClass().getSimpleName(), System.identityHashCode(this), measurementTemplateListComponent.getClass().getSimpleName(), System.identityHashCode(measurementTemplateListComponent))); - } private static String convertErrorCodeToMessage(MeasurementService.ErrorCode errorCode) { @@ -359,7 +362,7 @@ private void triggerMeasurementRegistration( } private void openEditMeasurementDialog() { - var dialog = new MeasurementMetadataUploadDialog(measurementValidationService, + this.dialog = new MeasurementMetadataUploadDialog(measurementValidationService, cancelConfirmationDialogFactory, MODE.EDIT, context.projectId().orElse(null)); @@ -549,7 +552,7 @@ private void onDownloadMeasurementTemplateClicked( } private void openRegisterMeasurementDialog() { - var dialog = new MeasurementMetadataUploadDialog(measurementValidationService, + this.dialog = new MeasurementMetadataUploadDialog(measurementValidationService, cancelConfirmationDialogFactory, MODE.ADD, context.projectId().orElse(null)); @@ -601,4 +604,10 @@ static class HandledException extends RuntimeException { } } + + @Override + public void beforeLeave(BeforeLeaveEvent event) { + Optional.ofNullable(this.dialog).ifPresent(Dialog::close); + } + }