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

Commit b555494

Browse files
Merge branch 'development' into feature-3005-campaign-data-import-duplicate-detection
2 parents 5b148c6 + 3d71de3 commit b555494

10 files changed

Lines changed: 150 additions & 46 deletions

File tree

sormas-api/src/main/java/de/symeda/sormas/api/campaign/data/CampaignFormDataEntry.java

Lines changed: 20 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,11 @@
1818
import java.io.Serializable;
1919
import java.util.Collection;
2020
import java.util.Iterator;
21+
import java.util.List;
22+
import java.util.Objects;
2123

2224
import de.symeda.sormas.api.i18n.I18nProperties;
2325
import de.symeda.sormas.api.i18n.Strings;
24-
import de.symeda.sormas.api.utils.JsonDataEntry;
2526

2627
public class CampaignFormDataEntry implements Serializable, JsonDataEntry {
2728

@@ -58,22 +59,6 @@ public void setValue(Object value) {
5859
this.value = value;
5960
}
6061

61-
// does not make sense. Leads to hibernate not persisting any changes in value
62-
// @Override
63-
// public boolean equals(Object o) {
64-
// if (this == o)
65-
// return true;
66-
// if (o == null || getClass() != o.getClass())
67-
// return false;
68-
// CampaignFormDataEntry that = (CampaignFormDataEntry) o;
69-
// return Objects.equals(id, that.id);
70-
// }
71-
//
72-
// @Override
73-
// public int hashCode() {
74-
// return Objects.hash(id);
75-
// }
76-
7762
@Override
7863
public String toString() {
7964
if (value == null) {
@@ -97,4 +82,22 @@ public static void removeNullValueEntries(Collection<CampaignFormDataEntry> entr
9782
}
9883
}
9984
}
85+
86+
/**
87+
* Needed. Otherwise hibernate will persist whenever loading,
88+
* because hibernate types creates new instances that aren't equal.
89+
*/
90+
@Override
91+
public boolean equals(Object o) {
92+
if (this == o) return true;
93+
if (o == null || getClass() != o.getClass()) return false;
94+
CampaignFormDataEntry that = (CampaignFormDataEntry) o;
95+
return Objects.equals(id, that.id) &&
96+
Objects.equals(value, that.value);
97+
}
98+
99+
@Override
100+
public int hashCode() {
101+
return Objects.hash(id, value);
102+
}
100103
}

sormas-api/src/main/java/de/symeda/sormas/api/campaign/diagram/CampaignDashboardElement.java

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package de.symeda.sormas.api.campaign.diagram;
22

33
import java.io.Serializable;
4+
import java.util.Objects;
45

56
public class CampaignDashboardElement implements Serializable {
67

@@ -81,4 +82,26 @@ public Integer getHeight() {
8182
public void setHeight(Integer height) {
8283
this.height = height;
8384
}
85+
86+
/**
87+
* Needed. Otherwise hibernate will persist whenever loading,
88+
* because hibernate types creates new instances that aren't equal.
89+
*/
90+
@Override
91+
public boolean equals(Object o) {
92+
if (this == o) return true;
93+
if (o == null || getClass() != o.getClass()) return false;
94+
CampaignDashboardElement that = (CampaignDashboardElement) o;
95+
return Objects.equals(diagramId, that.diagramId) &&
96+
Objects.equals(tabId, that.tabId) &&
97+
Objects.equals(subTabId, that.subTabId) &&
98+
Objects.equals(order, that.order) &&
99+
Objects.equals(width, that.width) &&
100+
Objects.equals(height, that.height);
101+
}
102+
103+
@Override
104+
public int hashCode() {
105+
return Objects.hash(diagramId, tabId, subTabId, order, width, height);
106+
}
84107
}

sormas-api/src/main/java/de/symeda/sormas/api/campaign/diagram/CampaignDiagramSeries.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,10 @@ public void setStack(String stack) {
5757
this.stack = stack;
5858
}
5959

60+
/**
61+
* Needed. Otherwise hibernate will persist whenever loading,
62+
* because hibernate types creates new instances that aren't equal.
63+
*/
6064
@Override
6165
public boolean equals(Object o) {
6266
if (this == o)

sormas-api/src/main/java/de/symeda/sormas/api/campaign/form/CampaignFormElement.java

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package de.symeda.sormas.api.campaign.form;
22

33
import java.io.Serializable;
4+
import java.util.Arrays;
5+
import java.util.Objects;
46

57
public class CampaignFormElement implements Serializable {
68

@@ -110,4 +112,30 @@ public boolean isImportant() {
110112
public void setImportant(boolean important) {
111113
this.important = important;
112114
}
115+
116+
/**
117+
* Needed. Otherwise hibernate will persist whenever loading,
118+
* because hibernate types creates new instances that aren't equal.
119+
*/
120+
@Override
121+
public boolean equals(Object o) {
122+
if (this == o) return true;
123+
if (o == null || getClass() != o.getClass()) return false;
124+
CampaignFormElement that = (CampaignFormElement) o;
125+
return important == that.important &&
126+
Objects.equals(type, that.type) &&
127+
Objects.equals(id, that.id) &&
128+
Objects.equals(caption, that.caption) &&
129+
Arrays.equals(styles, that.styles) &&
130+
Objects.equals(dependingOn, that.dependingOn) &&
131+
Arrays.equals(dependingOnValues, that.dependingOnValues);
132+
}
133+
134+
@Override
135+
public int hashCode() {
136+
int result = Objects.hash(type, id, caption, dependingOn, important);
137+
result = 31 * result + Arrays.hashCode(styles);
138+
result = 31 * result + Arrays.hashCode(dependingOnValues);
139+
return result;
140+
}
113141
}

sormas-api/src/main/java/de/symeda/sormas/api/campaign/form/CampaignFormTranslation.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package de.symeda.sormas.api.campaign.form;
22

33
import java.io.Serializable;
4+
import java.util.Objects;
45

56
public class CampaignFormTranslation implements Serializable {
67

@@ -24,4 +25,22 @@ public String getCaption() {
2425
public void setCaption(String caption) {
2526
this.caption = caption;
2627
}
28+
29+
/**
30+
* Needed. Otherwise hibernate will persist whenever loading,
31+
* because hibernate types creates new instances that aren't equal.
32+
*/
33+
@Override
34+
public boolean equals(Object o) {
35+
if (this == o) return true;
36+
if (o == null || getClass() != o.getClass()) return false;
37+
CampaignFormTranslation that = (CampaignFormTranslation) o;
38+
return Objects.equals(elementId, that.elementId) &&
39+
Objects.equals(caption, that.caption);
40+
}
41+
42+
@Override
43+
public int hashCode() {
44+
return Objects.hash(elementId, caption);
45+
}
2746
}

sormas-api/src/main/java/de/symeda/sormas/api/campaign/form/CampaignFormTranslations.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import java.io.Serializable;
44
import java.util.List;
5+
import java.util.Objects;
56

67
public class CampaignFormTranslations implements Serializable {
78

@@ -25,4 +26,22 @@ public List<CampaignFormTranslation> getTranslations() {
2526
public void setTranslations(List<CampaignFormTranslation> translations) {
2627
this.translations = translations;
2728
}
29+
30+
/**
31+
* Needed. Otherwise hibernate will persist whenever loading,
32+
* because hibernate types creates new instances that aren't equal.
33+
*/
34+
@Override
35+
public boolean equals(Object o) {
36+
if (this == o) return true;
37+
if (o == null || getClass() != o.getClass()) return false;
38+
CampaignFormTranslations that = (CampaignFormTranslations) o;
39+
return Objects.equals(languageCode, that.languageCode) &&
40+
Objects.equals(translations, that.translations);
41+
}
42+
43+
@Override
44+
public int hashCode() {
45+
return Objects.hash(languageCode, translations);
46+
}
2847
}

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import de.symeda.sormas.api.i18n.I18nProperties;
2525
import de.symeda.sormas.api.i18n.Strings;
2626
import de.symeda.sormas.ui.ControllerProvider;
27+
import de.symeda.sormas.ui.SormasUI;
2728
import de.symeda.sormas.ui.utils.CommitDiscardWrapperComponent;
2829
import de.symeda.sormas.ui.utils.CssStyles;
2930
import de.symeda.sormas.ui.utils.DetailSubComponentWrapper;
@@ -50,6 +51,7 @@ protected void initView(String params) {
5051
CampaignFormDataDto campaignFormData = FacadeProvider.getCampaignFormDataFacade().getCampaignFormDataByUuid(getReference().getUuid());
5152
editComponent = ControllerProvider.getCampaignController()
5253
.getCampaignFormDataComponent(campaignFormData, campaignFormData.getCampaignFormMeta(), true, true, () -> {
54+
SormasUI.refreshView();
5355
Notification.show(
5456
String.format(I18nProperties.getString(Strings.messageCampaignFormSaved), campaignFormData.getCampaignFormMeta().toString()),
5557
TRAY_NOTIFICATION);

sormas-ui/src/main/java/de/symeda/sormas/ui/campaign/campaigns/CampaignDashboardElementsGridComponent.java

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -36,23 +36,20 @@ protected Binder<CampaignDashboardElement> addColumnsBinder(List<CampaignDashboa
3636
Binder<CampaignDashboardElement> binder = new Binder<>();
3737

3838
final List<CampaignDiagramDefinitionDto> campaignDiagramDefinitionDtos = FacadeProvider.getCampaignDiagramDefinitionFacade().getAll();
39+
final Map<String, String> diagramIdCaptionMap = campaignDiagramDefinitionDtos.stream()
40+
.collect(Collectors.toMap(CampaignDiagramDefinitionDto::getDiagramId, CampaignDiagramDefinitionDto::getDiagramCaption));
3941

40-
ComboBox<DiagramIdCaption> diagramIdCaptionCombo = new ComboBox<>(
41-
Captions.campaignDashboardChart,
42-
campaignDiagramDefinitionDtos.stream()
43-
.map(cdd -> new DiagramIdCaption(cdd.getDiagramId(), cdd.getDiagramCaption()))
44-
.collect(Collectors.toList()));
42+
ComboBox<String> diagramIdCaptionCombo = new ComboBox<>(Captions.campaignDashboardChart, diagramIdCaptionMap.keySet());
43+
diagramIdCaptionCombo.setItemCaptionGenerator(diagramId -> diagramIdCaptionMap.get(diagramId));
4544
diagramIdCaptionCombo.setEmptySelectionAllowed(false);
4645

47-
final Map<String, String> diagramIdCaptionMap = campaignDiagramDefinitionDtos.stream()
48-
.collect(Collectors.toMap(CampaignDiagramDefinitionDto::getDiagramId, CampaignDiagramDefinitionDto::getDiagramCaption));
49-
50-
Binder.Binding<CampaignDashboardElement, DiagramIdCaption> diagramIdCaptionBind = binder.bind(
46+
Binder.Binding<CampaignDashboardElement, String> diagramIdCaptionBind = binder.bind(
5147
diagramIdCaptionCombo,
52-
cde -> new DiagramIdCaption(cde.getDiagramId(), diagramIdCaptionMap.get(cde.getDiagramId())),
48+
CampaignDashboardElement::getDiagramId, CampaignDashboardElement::setDiagramId);
49+
/*cde -> new DiagramIdCaption(cde.getDiagramId(), diagramIdCaptionMap.get(cde.getDiagramId())),
5350
(campaignDashboardElement, diagramIdCaption) -> {
5451
campaignDashboardElement.setDiagramId(diagramIdCaption.getDiagramId());
55-
});
52+
});*/
5653

5754
final Grid.Column<CampaignDashboardElement, String> diagramIdColumn =
5855
grid.addColumn(campaignDashboardElement -> diagramIdCaptionMap.get(campaignDashboardElement.getDiagramId()))
@@ -155,7 +152,7 @@ protected void reorderGrid() {
155152
gridItems.forEach(campaignDashboardElement -> campaignDashboardElement.setOrder(gridItems.indexOf(campaignDashboardElement)));
156153
}
157154

158-
public static class DiagramIdCaption implements Serializable {
155+
/*public static class DiagramIdCaption implements Serializable {
159156
160157
private String diagramId;
161158
private String diagramCaption;
@@ -185,6 +182,6 @@ public void setDiagramCaption(String diagramCaption) {
185182
public String toString() {
186183
return this.diagramCaption;
187184
}
188-
}
185+
}*/
189186

190187
}

sormas-ui/src/main/java/de/symeda/sormas/ui/campaign/campaigns/CampaignFormsGridComponent.java

Lines changed: 23 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import com.vaadin.ui.ComboBox;
1010
import com.vaadin.ui.Grid;
1111

12+
import de.symeda.sormas.api.ReferenceDto;
1213
import de.symeda.sormas.api.campaign.form.CampaignFormMetaReferenceDto;
1314
import de.symeda.sormas.api.i18n.Captions;
1415
import de.symeda.sormas.api.i18n.I18nProperties;
@@ -31,7 +32,7 @@ public CampaignFormsGridComponent(
3132
protected Button.ClickListener newRowEvent() {
3233
return event -> {
3334
final ArrayList<CampaignFormMetaReferenceDto> gridItems = getItems();
34-
gridItems.add(new CampaignFormMetaReferenceDto(UUID.randomUUID().toString(), ""));
35+
gridItems.add(new CampaignFormMetaReferenceDto(null, ""));
3536
grid.setItems(gridItems);
3637
};
3738
}
@@ -40,24 +41,32 @@ protected Button.ClickListener newRowEvent() {
4041
protected Binder<CampaignFormMetaReferenceDto> addColumnsBinder(List<CampaignFormMetaReferenceDto> allElements) {
4142
final Binder<CampaignFormMetaReferenceDto> binder = new Binder<>();
4243

44+
// This is a bit hacky: The grid is used here to "select" the whole item instead of editing properties
45+
// This is done by replacing uuid and caption of the item
46+
4347
ComboBox<CampaignFormMetaReferenceDto> formCombo = new ComboBox<>(Strings.entityCampaignDataForm, allElements);
4448

4549
Binder.Binding<CampaignFormMetaReferenceDto, CampaignFormMetaReferenceDto> formBind = binder.forField(formCombo)
46-
.withValidator(
47-
campaignFormMetaReferenceDto -> campaignFormMetaReferenceDto != null && campaignFormMetaReferenceDto.getUuid() != null,
48-
I18nProperties.getValidationError(Validations.campaignDashboardDataFormValueNull))
49-
.withValidator(campaignFormMetaReferenceDto -> {
50-
ArrayList<CampaignFormMetaReferenceDto> items = getItems();
51-
return !items.contains(campaignFormMetaReferenceDto);
52-
}, I18nProperties.getValidationError(Validations.campaignDashboardDataFormValueDuplicate))
53-
.bind(campaignFormMetaReferenceDto -> campaignFormMetaReferenceDto, (bindedCampaignFormMeta, selectedCampaignFormMeta) -> {
54-
bindedCampaignFormMeta.setUuid(selectedCampaignFormMeta.getUuid());
55-
bindedCampaignFormMeta.setCaption(selectedCampaignFormMeta.getCaption());
56-
});
50+
.withValidator(
51+
campaignFormMetaReferenceDto -> campaignFormMetaReferenceDto != null && campaignFormMetaReferenceDto.getUuid() != null,
52+
I18nProperties.getValidationError(Validations.campaignDashboardDataFormValueNull))
53+
.withValidator(campaignFormMetaReferenceDto -> {
54+
ArrayList<CampaignFormMetaReferenceDto> items = getItems();
55+
return !items.contains(campaignFormMetaReferenceDto);
56+
}, I18nProperties.getValidationError(Validations.campaignDashboardDataFormValueDuplicate))
57+
.bind(campaignFormMetaReferenceDto -> new CampaignFormMetaReferenceDto(campaignFormMetaReferenceDto.getUuid(), campaignFormMetaReferenceDto.getCaption()),
58+
(bindedCampaignFormMeta, selectedCampaignFormMeta) -> {
59+
bindedCampaignFormMeta.setUuid(selectedCampaignFormMeta.getUuid());
60+
bindedCampaignFormMeta.setCaption(selectedCampaignFormMeta.getCaption());
61+
// workarround: grid doesn't refresh itself for unknown reason
62+
grid.getDataProvider().refreshAll();
63+
});
5764
formCombo.setEmptySelectionAllowed(false);
65+
5866
Grid.Column<CampaignFormMetaReferenceDto, String> formColumn =
59-
grid.addColumn(campaignFormMetaReferenceDto -> campaignFormMetaReferenceDto.getCaption())
60-
.setCaption(I18nProperties.getString(Strings.entityCampaignDataForm));
67+
grid.addColumn(ReferenceDto::getCaption)
68+
.setCaption(I18nProperties.getString(Strings.entityCampaignDataForm));
69+
6170
formColumn.setEditorBinding(formBind);
6271
return binder;
6372
}

sormas-ui/src/main/java/de/symeda/sormas/ui/utils/AbstractEditableGrid.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ public AbstractEditableGrid(List<T> savedElements, List<T> allElements) {
6767
savedItems.addAll(savedElements);
6868
grid.setItems(new ArrayList<>(savedElements));
6969
reorderGrid();
70-
grid.setSelectionMode(Grid.SelectionMode.SINGLE);
70+
grid.setSelectionMode(Grid.SelectionMode.NONE);
7171
setSizeFull();
7272

7373
final GridRowDragger<T> gridRowDragger = new GridRowDragger<>(grid);
@@ -98,7 +98,7 @@ public AbstractEditableGrid(List<T> savedElements, List<T> allElements) {
9898
});
9999

100100
grid.getEditor().setBinder(binder);
101-
grid.getEditor().setBuffered(false);
101+
grid.getEditor().setBuffered(true);
102102
grid.getEditor().setEnabled(true);
103103

104104
final HorizontalLayout buttonLayout = new HorizontalLayout();

0 commit comments

Comments
 (0)