Skip to content
This repository was archived by the owner on May 5, 2021. It is now read-only.

Commit 45b71fa

Browse files
Merge pull request SORMAS-Foundation#2927 from hzi-braunschweig/1613_unsaved-changes-warning
1613 unsaved changes warning
2 parents 409049c + 888d878 commit 45b71fa

33 files changed

Lines changed: 277 additions & 120 deletions

sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -751,6 +751,10 @@ public interface Strings {
751751
String step = "step";
752752
String toCase = "toCase";
753753
String total = "total";
754+
String unsavedChanges_discard = "unsavedChanges.discard";
755+
String unsavedChanges_save = "unsavedChanges.save";
756+
String unsavedChanges_warningMessage = "unsavedChanges.warningMessage";
757+
String unsavedChanges_warningTitle = "unsavedChanges.warningTitle";
754758
String until = "until";
755759
String week = "week";
756760
String weekShort = "weekShort";

sormas-api/src/main/resources/strings.properties

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -798,3 +798,9 @@ DiseaseNetworkDiagram.legend = Legend
798798
DiseaseNetworkDiagram.lowRisk = Low risk
799799
DiseaseNetworkDiagram.selectByClassification = Select by Classification
800800
DiseaseNetworkDiagram.subheading = The arrows indicate the direction of transmission
801+
802+
# Unsaved changes
803+
unsavedChanges.warningTitle = Confirm navigation
804+
unsavedChanges.warningMessage = You have unsaved changes on this form.
805+
unsavedChanges.discard = Discard changes
806+
unsavedChanges.save = Save changes

sormas-ui/src/main/java/de/symeda/sormas/ui/campaign/AbstractCampaignView.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,20 +15,22 @@
1515

1616
package de.symeda.sormas.ui.campaign;
1717

18+
import java.util.Optional;
19+
1820
import com.vaadin.navigator.Navigator;
21+
import com.vaadin.ui.Component;
1922
import com.vaadin.ui.Label;
2023
import com.vaadin.ui.VerticalLayout;
24+
2125
import de.symeda.sormas.api.i18n.I18nProperties;
2226
import de.symeda.sormas.ui.SubMenu;
2327
import de.symeda.sormas.ui.campaign.campaigndata.CampaignDataView;
2428
import de.symeda.sormas.ui.campaign.campaigndata.CampaignFormDataView;
2529
import de.symeda.sormas.ui.campaign.campaigns.CampaignsView;
2630
import de.symeda.sormas.ui.utils.AbstractSubNavigationView;
2731

28-
import java.util.Optional;
29-
3032
@SuppressWarnings("serial")
31-
public abstract class AbstractCampaignView extends AbstractSubNavigationView {
33+
public abstract class AbstractCampaignView extends AbstractSubNavigationView<Component> {
3234

3335
public static final String ROOT_VIEW_NAME = "campaign";
3436

sormas-ui/src/main/java/de/symeda/sormas/ui/campaign/CampaignController.java

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515

1616
package de.symeda.sormas.ui.campaign;
1717

18+
import static com.vaadin.v7.data.Validator.InvalidValueException;
19+
1820
import com.vaadin.ui.Alignment;
1921
import com.vaadin.ui.Button;
2022
import com.vaadin.ui.Label;
@@ -23,6 +25,7 @@
2325
import com.vaadin.ui.UI;
2426
import com.vaadin.ui.Window;
2527
import com.vaadin.ui.themes.ValoTheme;
28+
2629
import de.symeda.sormas.api.FacadeProvider;
2730
import de.symeda.sormas.api.campaign.CampaignDto;
2831
import de.symeda.sormas.api.campaign.data.CampaignFormDataDto;
@@ -42,8 +45,6 @@
4245
import de.symeda.sormas.ui.utils.CommitDiscardWrapperComponent;
4346
import de.symeda.sormas.ui.utils.VaadinUiUtil;
4447

45-
import static com.vaadin.v7.data.Validator.InvalidValueException;
46-
4748
public class CampaignController {
4849

4950
public void createOrEditCampaign(String uuid) {
@@ -146,16 +147,15 @@ private void archiveOrDearchiveCampaign(String campaignUuid, boolean archive) {
146147
public CommitDiscardWrapperComponent<CampaignEditForm> getCampaignComponent(CampaignDto campaignDto, Runnable callback) {
147148

148149
CampaignEditForm campaignEditForm = new CampaignEditForm(campaignDto == null);
149-
150-
final CommitDiscardWrapperComponent<CampaignEditForm> view =
151-
new CommitDiscardWrapperComponent<CampaignEditForm>(campaignEditForm, campaignEditForm.getFieldGroup());
152-
153150
if (campaignDto == null) {
154151
campaignDto = CampaignDto.build();
155152
campaignDto.setCreatingUser(UserProvider.getCurrent().getUserReference());
156153
}
157154
campaignEditForm.setValue(campaignDto);
158155

156+
final CommitDiscardWrapperComponent<CampaignEditForm> view =
157+
new CommitDiscardWrapperComponent<CampaignEditForm>(campaignEditForm, campaignEditForm.getFieldGroup());
158+
159159
view.addCommitListener(() -> {
160160
if (!campaignEditForm.getFieldGroup().isModified()) {
161161
CampaignDto dto = campaignEditForm.getValue();
@@ -174,16 +174,15 @@ public CommitDiscardWrapperComponent<CampaignFormDataEditForm> getCampaignFormDa
174174
boolean showDeleteButton,
175175
Runnable commitCallback,
176176
Runnable discardCallback) {
177-
CampaignFormDataEditForm form = new CampaignFormDataEditForm(campaignFormData == null);
178-
179-
final CommitDiscardWrapperComponent<CampaignFormDataEditForm> component = new CommitDiscardWrapperComponent<>(form, form.getFieldGroup());
180177

178+
CampaignFormDataEditForm form = new CampaignFormDataEditForm(campaignFormData == null);
181179
if (campaignFormData == null) {
182180
campaignFormData = CampaignFormDataDto.build(null, campaignForm, null, null, null);
183181
campaignFormData.setCreatingUser(UserProvider.getCurrent().getUserReference());
184182
}
185183
form.setValue(campaignFormData);
186-
final String campaignFormDataUuid = campaignFormData.getUuid();
184+
185+
final CommitDiscardWrapperComponent<CampaignFormDataEditForm> component = new CommitDiscardWrapperComponent<>(form, form.getFieldGroup());
187186

188187
component.addCommitListener(() -> {
189188
if (!form.getFieldGroup().isModified()) {
@@ -211,6 +210,8 @@ public CommitDiscardWrapperComponent<CampaignFormDataEditForm> getCampaignFormDa
211210
}
212211

213212
if (showDeleteButton && UserProvider.getCurrent().hasUserRight(UserRight.CAMPAIGN_DELETE)) {
213+
String campaignFormDataUuid = campaignFormData.getUuid();
214+
214215
component.addDeleteListener(() -> {
215216
FacadeProvider.getCampaignFormDataFacade().deleteCampaignFormData(campaignFormDataUuid);
216217
UI.getCurrent().getNavigator().navigateTo(CampaignFormDataView.VIEW_NAME);

sormas-ui/src/main/java/de/symeda/sormas/ui/campaign/campaigndata/CampaignFormDataView.java

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,9 @@
1515

1616
package de.symeda.sormas.ui.campaign.campaigndata;
1717

18+
import static com.vaadin.ui.Notification.Type.TRAY_NOTIFICATION;
19+
1820
import com.vaadin.ui.Notification;
19-
import com.vaadin.ui.VerticalLayout;
2021

2122
import de.symeda.sormas.api.FacadeProvider;
2223
import de.symeda.sormas.api.campaign.data.CampaignFormDataDto;
@@ -25,40 +26,41 @@
2526
import de.symeda.sormas.ui.ControllerProvider;
2627
import de.symeda.sormas.ui.utils.CommitDiscardWrapperComponent;
2728
import de.symeda.sormas.ui.utils.CssStyles;
28-
29-
import static com.vaadin.ui.Notification.Type.*;
29+
import de.symeda.sormas.ui.utils.DetailSubComponentWrapper;
3030

3131
public class CampaignFormDataView extends AbstractCampaignDataView {
3232

3333
private static final long serialVersionUID = -1890947102041773346L;
3434

3535
public static final String VIEW_NAME = ROOT_VIEW_NAME + "/dataform";
3636

37+
private CommitDiscardWrapperComponent<CampaignFormDataEditForm> editComponent;
38+
3739
public CampaignFormDataView() {
3840
super(VIEW_NAME);
3941
}
4042

4143
@Override
4244
protected void initView(String params) {
43-
VerticalLayout container = new VerticalLayout();
45+
DetailSubComponentWrapper container = new DetailSubComponentWrapper(() -> editComponent);
4446
container.setWidth(100, Unit.PERCENTAGE);
4547
container.setMargin(true);
4648
setSubComponent(container);
4749

4850
CampaignFormDataDto campaignFormData = FacadeProvider.getCampaignFormDataFacade().getCampaignFormDataByUuid(getReference().getUuid());
49-
CommitDiscardWrapperComponent<CampaignFormDataEditForm> component = ControllerProvider.getCampaignController()
51+
editComponent = ControllerProvider.getCampaignController()
5052
.getCampaignFormDataComponent(campaignFormData, campaignFormData.getCampaignFormMeta(), true, true, () -> {
5153
Notification.show(
5254
String.format(I18nProperties.getString(Strings.messageCampaignFormSaved), campaignFormData.getCampaignFormMeta().toString()),
5355
TRAY_NOTIFICATION);
5456
}, null);
55-
component.setMargin(false);
56-
component.getWrappedComponent().setWidth(100, Unit.PERCENTAGE);
57-
component.setHeightUndefined();
58-
component.addStyleName(CssStyles.ROOT_COMPONENT);
59-
component.setWidth(100, Unit.PERCENTAGE);
57+
editComponent.setMargin(false);
58+
editComponent.getWrappedComponent().setWidth(100, Unit.PERCENTAGE);
59+
editComponent.setHeightUndefined();
60+
editComponent.addStyleName(CssStyles.ROOT_COMPONENT);
61+
editComponent.setWidth(100, Unit.PERCENTAGE);
6062

61-
container.addComponent(component);
63+
container.addComponent(editComponent);
6264

6365
hideInfoLabel();
6466

sormas-ui/src/main/java/de/symeda/sormas/ui/caze/AbstractCaseView.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@
5151
import de.symeda.sormas.ui.therapy.TherapyView;
5252
import de.symeda.sormas.ui.utils.AbstractDetailView;
5353
import de.symeda.sormas.ui.utils.CssStyles;
54+
import de.symeda.sormas.ui.utils.DirtyStateComponent;
5455
import de.symeda.sormas.ui.utils.ViewConfiguration;
5556
import de.symeda.sormas.ui.utils.ViewMode;
5657

@@ -235,7 +236,7 @@ protected CaseReferenceDto getReferenceByUuid(String uuid) {
235236
}
236237

237238
@Override
238-
protected void setSubComponent(Component newComponent) {
239+
protected void setSubComponent(DirtyStateComponent newComponent) {
239240

240241
super.setSubComponent(newComponent);
241242

sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseContactsView.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
4545
import de.symeda.sormas.api.contact.ContactDto;
4646
import de.symeda.sormas.api.contact.ContactExportDto;
4747
import de.symeda.sormas.api.contact.ContactIndexDto;
48+
import de.symeda.sormas.api.contact.ContactJurisdictionDto;
4849
import de.symeda.sormas.api.contact.ContactStatus;
4950
import de.symeda.sormas.api.hospitalization.HospitalizationDto;
5051
import de.symeda.sormas.api.i18n.Captions;
@@ -68,6 +69,7 @@
6869
import de.symeda.sormas.ui.utils.ButtonHelper;
6970
import de.symeda.sormas.ui.utils.CssStyles;
7071
import de.symeda.sormas.ui.utils.DateFormatHelper;
72+
import de.symeda.sormas.ui.utils.DetailSubComponentWrapper;
7173
import de.symeda.sormas.ui.utils.DownloadUtil;
7274
import de.symeda.sormas.ui.utils.GridExportStreamResource;
7375
import de.symeda.sormas.ui.utils.LayoutUtil;
@@ -96,7 +98,7 @@ public class CaseContactsView extends AbstractCaseView {
9698
private Button applyButton;
9799

98100
private Button newButton;
99-
private VerticalLayout gridLayout;
101+
private DetailSubComponentWrapper gridLayout;
100102
private HashMap<Button, String> statusButtons;
101103
private Button activeStatusButton;
102104

@@ -369,7 +371,7 @@ protected void initView(String params) {
369371

370372
if (grid == null) {
371373
grid = new ContactGrid(criteria, getClass());
372-
gridLayout = new VerticalLayout();
374+
gridLayout = new DetailSubComponentWrapper(() -> null);
373375
gridLayout.addComponent(createFilterBar());
374376
gridLayout.addComponent(createStatusFilterBar());
375377
gridLayout.addComponent(grid);

sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseDataView.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
import de.symeda.sormas.ui.task.TaskListComponent;
3737
import de.symeda.sormas.ui.utils.CommitDiscardWrapperComponent;
3838
import de.symeda.sormas.ui.utils.CssStyles;
39+
import de.symeda.sormas.ui.utils.DetailSubComponentWrapper;
3940
import de.symeda.sormas.ui.utils.LayoutUtil;
4041
import de.symeda.sormas.ui.utils.ViewMode;
4142

@@ -54,6 +55,8 @@ public class CaseDataView extends AbstractCaseView {
5455
public static final String SAMPLES_LOC = "samples";
5556
public static final String EVENTS_LOC = "events";
5657

58+
private CommitDiscardWrapperComponent<CaseDataForm> editComponent;
59+
5760
public CaseDataView() {
5861
super(VIEW_NAME, false);
5962
}
@@ -71,7 +74,7 @@ protected void initView(String params) {
7174
LayoutUtil.fluidColumnLoc(4, 0, 6, 0, SAMPLES_LOC),
7275
LayoutUtil.fluidColumnLoc(4, 0, 6, 0, EVENTS_LOC));
7376

74-
VerticalLayout container = new VerticalLayout();
77+
DetailSubComponentWrapper container = new DetailSubComponentWrapper(() -> editComponent);
7578
container.setWidth(100, Unit.PERCENTAGE);
7679
container.setMargin(true);
7780
setSubComponent(container);
@@ -83,7 +86,7 @@ protected void initView(String params) {
8386
container.addComponent(layout);
8487

8588
Boolean isInJurisdiction = FacadeProvider.getCaseFacade().isCaseEditAllowed(getCaseRef().getUuid());
86-
CommitDiscardWrapperComponent<CaseDataForm> editComponent;
89+
8790
// if (getViewMode() == ViewMode.SIMPLE) {
8891
// editComponent = ControllerProvider.getCaseController().getCaseCombinedEditComponent(getCaseRef().getUuid(),
8992
// ViewMode.SIMPLE);

sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseVisitsView.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@
2626
import com.vaadin.ui.Button;
2727
import com.vaadin.ui.HorizontalLayout;
2828
import com.vaadin.ui.MenuBar;
29-
import com.vaadin.ui.VerticalLayout;
3029
import com.vaadin.ui.themes.ValoTheme;
3130

3231
import de.symeda.sormas.api.FacadeProvider;
@@ -45,6 +44,7 @@
4544
import de.symeda.sormas.ui.utils.ButtonHelper;
4645
import de.symeda.sormas.ui.utils.CssStyles;
4746
import de.symeda.sormas.ui.utils.DateFormatHelper;
47+
import de.symeda.sormas.ui.utils.DetailSubComponentWrapper;
4848
import de.symeda.sormas.ui.utils.DownloadUtil;
4949
import de.symeda.sormas.ui.utils.MenuBarHelper;
5050
import de.symeda.sormas.ui.visit.VisitGrid;
@@ -57,7 +57,7 @@ public class CaseVisitsView extends AbstractCaseView {
5757

5858
private VisitGrid grid;
5959
private Button newButton;
60-
private VerticalLayout gridLayout;
60+
private DetailSubComponentWrapper gridLayout;
6161

6262
public CaseVisitsView() {
6363
super(VIEW_NAME, false);
@@ -136,7 +136,7 @@ protected void initView(String params) {
136136

137137
if (grid == null) {
138138
grid = new VisitGrid(criteria);
139-
gridLayout = new VerticalLayout();
139+
gridLayout = new DetailSubComponentWrapper(() -> null);
140140
gridLayout.setSizeFull();
141141
gridLayout.setMargin(true);
142142
gridLayout.setSpacing(false);

sormas-ui/src/main/java/de/symeda/sormas/ui/clinicalcourse/ClinicalCourseView.java

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -42,13 +42,16 @@
4242
import de.symeda.sormas.ui.utils.ButtonHelper;
4343
import de.symeda.sormas.ui.utils.CommitDiscardWrapperComponent;
4444
import de.symeda.sormas.ui.utils.CssStyles;
45+
import de.symeda.sormas.ui.utils.DetailSubComponentWrapper;
4546
import de.symeda.sormas.ui.utils.MenuBarHelper;
4647

4748
@SuppressWarnings("serial")
4849
public class ClinicalCourseView extends AbstractCaseView {
4950

5051
public static final String VIEW_NAME = ROOT_VIEW_NAME + "/clinicalcourse";
5152

53+
private CommitDiscardWrapperComponent<ClinicalCourseForm> editComponent;
54+
5255
private ClinicalVisitCriteria clinicalVisitCriteria;
5356
private ClinicalVisitGrid clinicalVisitGrid;
5457

@@ -131,7 +134,7 @@ protected void initView(String params) {
131134
caze = FacadeProvider.getCaseFacade().saveCase(caze);
132135
}
133136

134-
VerticalLayout container = new VerticalLayout();
137+
DetailSubComponentWrapper container = new DetailSubComponentWrapper(() -> editComponent);
135138
container.setWidth(100, Unit.PERCENTAGE);
136139
container.setMargin(true);
137140

@@ -143,10 +146,9 @@ protected void initView(String params) {
143146
CssStyles.style(clinicalVisitGrid, CssStyles.VSPACE_3);
144147
container.addComponent(clinicalVisitGrid);
145148

146-
CommitDiscardWrapperComponent<ClinicalCourseForm> clinicalCourseComponent =
147-
ControllerProvider.getCaseController().getClinicalCourseComponent(getCaseRef().getUuid(), isCaseEditAllowed());
148-
clinicalCourseComponent.setMargin(false);
149-
container.addComponent(clinicalCourseComponent);
149+
editComponent = ControllerProvider.getCaseController().getClinicalCourseComponent(getCaseRef().getUuid(), isCaseEditAllowed());
150+
editComponent.setMargin(false);
151+
container.addComponent(editComponent);
150152

151153
setSubComponent(container);
152154

0 commit comments

Comments
 (0)