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

Commit 48f81f1

Browse files
SORMAS-Foundation#3488: intermediate state again
1 parent 50e7cb0 commit 48f81f1

7 files changed

Lines changed: 211 additions & 44 deletions

File tree

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -401,7 +401,7 @@ public interface Strings {
401401
String headingPIAAccountCreation = "headingPIAAccountCreation";
402402
String headingPickOrCreateCase = "headingPickOrCreateCase";
403403
String headingPickOrCreateContact = "headingPickOrCreateContact";
404-
String headingPickOrCreateEntity = "headingPickOrCreateEntity";
404+
String headingPickOrCreateEntry = "headingPickOrCreateEntry";
405405
String headingPickOrCreateEvent = "headingPickOrCreateEvent";
406406
String headingPickOrCreatePerson = "headingPickOrCreatePerson";
407407
String headingPointOfEntryImport = "headingPointOfEntryImport";
@@ -466,7 +466,7 @@ public interface Strings {
466466
String infoContactCreationSourceCase = "infoContactCreationSourceCase";
467467
String infoContactDashboard = "infoContactDashboard";
468468
String infoContactsViewRegionDistrictFilter = "infoContactsViewRegionDistrictFilter";
469-
String infoCreateEntity = "infoCreateEntity";
469+
String infoCreateEntry = "infoCreateEntry";
470470
String infoCreateNewContactDiscardsChanges = "infoCreateNewContactDiscardsChanges";
471471
String infoCreateNewSampleDiscardsChanges = "infoCreateNewSampleDiscardsChanges";
472472
String infoCreateNewSampleDiscardsChangesEventParticipant = "infoCreateNewSampleDiscardsChangesEventParticipant";

sormas-api/src/main/java/de/symeda/sormas/api/labmessage/SimilarEntitiesDto.java renamed to sormas-api/src/main/java/de/symeda/sormas/api/labmessage/SimilarEntriesDto.java

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,14 @@
66
import de.symeda.sormas.api.contact.SimilarContactDto;
77
import de.symeda.sormas.api.event.SimilarEventParticipantDto;
88

9-
public class SimilarEntitiesDto implements Serializable {
9+
public class SimilarEntriesDto implements Serializable {
1010

1111
CaseIndexDto caze;
1212
SimilarContactDto contact;
1313
SimilarEventParticipantDto eventParticipant;
14+
boolean newCase;
15+
boolean newContact;
16+
boolean newEventParticipant;
1417

1518
public CaseIndexDto getCaze() {
1619
return caze;
@@ -35,4 +38,28 @@ public SimilarEventParticipantDto getEventParticipant() {
3538
public void setEventParticipant(SimilarEventParticipantDto eventParticipant) {
3639
this.eventParticipant = eventParticipant;
3740
}
41+
42+
public boolean isNewCase() {
43+
return newCase;
44+
}
45+
46+
public void setNewCase(boolean newCase) {
47+
this.newCase = newCase;
48+
}
49+
50+
public boolean isNewContact() {
51+
return newContact;
52+
}
53+
54+
public void setNewContact(boolean newContact) {
55+
this.newContact = newContact;
56+
}
57+
58+
public boolean isNewEventParticipant() {
59+
return newEventParticipant;
60+
}
61+
62+
public void setNewEventParticipant(boolean newEventParticipant) {
63+
this.newEventParticipant = newEventParticipant;
64+
}
3865
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -408,7 +408,7 @@ headingPersonOccupation = Occupation & education
408408
headingPickOrCreateCase = Pick or Create a Case
409409
headingPickOrCreatePerson = Pick or create person
410410
headingPickOrCreateEvent = Pick or create event
411-
headingPickOrCreateEntity = Pick or create entity
411+
headingPickOrCreateEntry = Pick or create entry
412412
headingPointOfEntryInformation = Point of entry information
413413
headingPrescriptionsDeleted = Prescriptions deleted
414414
headingReferSample = Refer sample to another laboratory
@@ -504,7 +504,7 @@ infoCaseDate = By default, cases are filtered by the most relevant date availabl
504504
infoCaseIncidence = "Case incidence proportion" means the number of cases per 100,000 inhabitants. You can check the map key to see the thresholds that define how the districts are colorized.
505505
infoCaseMap = If cases are shown by home address and there are no GPS coordinates available for it, the coordinates of the location where the case has been reported are used instead.
506506
infoContactDashboard = All Dashboard elements that display general information about contacts use the follow-up period of the respective contact, starting with the contact report date.
507-
infoCreateEntity = The database contains no entity that seems to be similar to the details of the lab message.<br/><br>Select on <i>Create new case</i>, <i>Create new contact</i> or <i>Create new event particiapnt</i> and click on the <i>Save</i> button to create a new entity for the person.<br/><br/>If you are unsure, you can discard this window and cancel the process.
507+
infoCreateEntry = The database contains no entry that seems to be similar to the details of the lab message.<br/><br>Select on <i>Create new case</i>, <i>Create new contact</i> or <i>Create new event particiapnt</i> and click on the <i>Save</i> button to create a new entity for the person.<br/><br/>If you are unsure, you can discard this window and cancel the process.
508508
infoDashboardIncidence = Thresholds are calculated using quartiles.
509509
infoDatabaseExportTables = Please select the database tables you want to export.
510510
infoDefineOutbreaks = Click on a button to define which districts of the region currently have an outbreak of a specific disease.

sormas-ui/src/main/java/de/symeda/sormas/ui/labmessage/EntitySelectionField.java renamed to sormas-ui/src/main/java/de/symeda/sormas/ui/labmessage/EntrySelectionField.java

Lines changed: 49 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,14 @@
1717
import de.symeda.sormas.api.i18n.I18nProperties;
1818
import de.symeda.sormas.api.i18n.Strings;
1919
import de.symeda.sormas.api.labmessage.LabMessageDto;
20-
import de.symeda.sormas.api.labmessage.SimilarEntitiesDto;
20+
import de.symeda.sormas.api.labmessage.SimilarEntriesDto;
2121
import de.symeda.sormas.ui.caze.CaseSelectionGrid;
2222
import de.symeda.sormas.ui.contact.ContactSelectionGrid;
2323
import de.symeda.sormas.ui.events.EventParticipantSelectionGrid;
2424
import de.symeda.sormas.ui.utils.CssStyles;
2525
import de.symeda.sormas.ui.utils.VaadinUiUtil;
2626

27-
public class EntitySelectionField extends CustomField<SimilarEntitiesDto> {
27+
public class EntrySelectionField extends CustomField<SimilarEntriesDto> {
2828

2929
private static final Object CREATE_CASE = "createCase";
3030
private static final Object CREATE_CONTACT = "createContact";
@@ -46,7 +46,7 @@ public class EntitySelectionField extends CustomField<SimilarEntitiesDto> {
4646
protected ContactSelectionGrid contactGrid;
4747
protected EventParticipantSelectionGrid eventParticipantGrid;
4848

49-
public EntitySelectionField(
49+
public EntrySelectionField(
5050
LabMessageDto labMessageDto,
5151
List<CaseIndexDto> cases,
5252
List<SimilarContactDto> contacts,
@@ -101,15 +101,27 @@ private void addCreateEntityRadioGroup() {
101101
});
102102
rbCreateEntity.addValueChangeListener(e -> {
103103
if (e.getValue() != null) {
104-
rbSelectCase.setValue(null);
105-
rbSelectContact.setValue(null);
106-
rbSelectEventParticipant.setValue(null);
107-
caseGrid.deselectAll();
108-
caseGrid.setEnabled(false);
109-
contactGrid.deselectAll();
110-
contactGrid.setEnabled(false);
111-
eventParticipantGrid.deselectAll();
112-
eventParticipantGrid.setEnabled(false);
104+
if (rbSelectCase != null) {
105+
rbSelectCase.setValue(null);
106+
}
107+
if (rbSelectContact != null) {
108+
rbSelectContact.setValue(null);
109+
}
110+
if (rbSelectEventParticipant != null) {
111+
rbSelectEventParticipant.setValue(null);
112+
}
113+
if (caseGrid != null) {
114+
caseGrid.deselectAll();
115+
caseGrid.setEnabled(false);
116+
}
117+
if (contactGrid != null) {
118+
contactGrid.deselectAll();
119+
contactGrid.setEnabled(false);
120+
}
121+
if (eventParticipantGrid != null) {
122+
eventParticipantGrid.deselectAll();
123+
eventParticipantGrid.setEnabled(false);
124+
}
113125
if (selectionChangeCallback != null) {
114126
selectionChangeCallback.accept(true);
115127
}
@@ -257,42 +269,54 @@ private void addInfoComponent() {
257269
|| eventParticipants != null && !eventParticipants.isEmpty()) {
258270
mainLayout.addComponent(VaadinUiUtil.createInfoComponent(I18nProperties.getString(Strings.infoSelectOrCreateEntity)));
259271
} else {
260-
mainLayout.addComponent(VaadinUiUtil.createInfoComponent(I18nProperties.getString(Strings.infoCreateEntity)));
272+
mainLayout.addComponent(VaadinUiUtil.createInfoComponent(I18nProperties.getString(Strings.infoCreateEntry)));
261273
}
262274
}
263275

264276
@Override
265-
protected void doSetValue(SimilarEntitiesDto similarEntitiesDto) {
266-
if (similarEntitiesDto == null) {
277+
protected void doSetValue(SimilarEntriesDto similarEntriesDto) {
278+
if (similarEntriesDto == null) {
267279
throw new IllegalArgumentException();
268280
}
269281

270-
if (similarEntitiesDto.getCaze() != null) {
282+
if (similarEntriesDto.getCaze() != null) {
271283
rbSelectCase.setValue(SELECT_CASE);
272-
caseGrid.select(similarEntitiesDto.getCaze());
273-
} else if (similarEntitiesDto.getContact() != null) {
284+
caseGrid.select(similarEntriesDto.getCaze());
285+
} else if (similarEntriesDto.getContact() != null) {
274286
rbSelectContact.setValue(SELECT_CONTACT);
275-
contactGrid.select(similarEntitiesDto.getContact());
276-
} else if (similarEntitiesDto.getEventParticipant() != null) {
287+
contactGrid.select(similarEntriesDto.getContact());
288+
} else if (similarEntriesDto.getEventParticipant() != null) {
277289
rbSelectEventParticipant.setValue(SELECT_EVENT_PARTICIPANT);
278-
eventParticipantGrid.select(similarEntitiesDto.getEventParticipant());
290+
eventParticipantGrid.select(similarEntriesDto.getEventParticipant());
279291
}
280292
}
281293

282294
@Override
283-
public SimilarEntitiesDto getValue() {
295+
public SimilarEntriesDto getValue() {
284296
if (caseGrid != null && rbSelectCase.getValue() != null) {
285-
SimilarEntitiesDto value = new SimilarEntitiesDto();
297+
SimilarEntriesDto value = new SimilarEntriesDto();
286298
value.setCaze((CaseIndexDto) caseGrid.getSelectedRow());
287299
return value;
288300
} else if (contactGrid != null && rbSelectContact.getValue() != null) {
289-
SimilarEntitiesDto value = new SimilarEntitiesDto();
301+
SimilarEntriesDto value = new SimilarEntriesDto();
290302
value.setContact((SimilarContactDto) contactGrid.getSelectedRow());
291303
return value;
292304
} else if (eventParticipantGrid != null && rbSelectEventParticipant.getValue() != null) {
293-
SimilarEntitiesDto value = new SimilarEntitiesDto();
305+
SimilarEntriesDto value = new SimilarEntriesDto();
294306
value.setEventParticipant((SimilarEventParticipantDto) eventParticipantGrid.getSelectedRow());
295307
return value;
308+
} else if (CREATE_CASE.equals(rbCreateEntity.getValue())) {
309+
SimilarEntriesDto value = new SimilarEntriesDto();
310+
value.setNewCase(true);
311+
return value;
312+
} else if (CREATE_CONTACT.equals(rbCreateEntity.getValue())) {
313+
SimilarEntriesDto value = new SimilarEntriesDto();
314+
value.setNewContact(true);
315+
return value;
316+
} else if (CREATE_EVENT_PARTICIPANT.equals(rbCreateEntity.getValue())) {
317+
SimilarEntriesDto value = new SimilarEntriesDto();
318+
value.setNewEventParticipant(true);
319+
return value;
296320
}
297321
return null;
298322
}

sormas-ui/src/main/java/de/symeda/sormas/ui/labmessage/LabMessageController.java

Lines changed: 112 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,14 @@
22

33
import java.util.List;
44

5+
import com.vaadin.ui.HorizontalLayout;
6+
import com.vaadin.ui.UI;
57
import com.vaadin.ui.VerticalLayout;
8+
import com.vaadin.ui.Window;
69

710
import de.symeda.sormas.api.FacadeProvider;
811
import de.symeda.sormas.api.caze.CaseCriteria;
12+
import de.symeda.sormas.api.caze.CaseDataDto;
913
import de.symeda.sormas.api.caze.CaseIndexDto;
1014
import de.symeda.sormas.api.caze.CaseSimilarityCriteria;
1115
import de.symeda.sormas.api.contact.ContactSimilarityCriteria;
@@ -15,9 +19,15 @@
1519
import de.symeda.sormas.api.i18n.Strings;
1620
import de.symeda.sormas.api.labmessage.EventParticipantSimilarityCriteria;
1721
import de.symeda.sormas.api.labmessage.LabMessageDto;
18-
import de.symeda.sormas.api.labmessage.SimilarEntitiesDto;
22+
import de.symeda.sormas.api.labmessage.SimilarEntriesDto;
1923
import de.symeda.sormas.api.person.PersonDto;
24+
import de.symeda.sormas.api.sample.PathogenTestDto;
25+
import de.symeda.sormas.api.sample.SampleDto;
2026
import de.symeda.sormas.ui.ControllerProvider;
27+
import de.symeda.sormas.ui.UserProvider;
28+
import de.symeda.sormas.ui.caze.CaseCreateForm;
29+
import de.symeda.sormas.ui.samples.PathogenTestForm;
30+
import de.symeda.sormas.ui.samples.SampleCreateForm;
2131
import de.symeda.sormas.ui.utils.CommitDiscardWrapperComponent;
2232
import de.symeda.sormas.ui.utils.VaadinUiUtil;
2333

@@ -79,30 +89,122 @@ public void process(String uuid) {
7989
List<SimilarEventParticipantDto> similarEventParticipants =
8090
FacadeProvider.getEventParticipantFacade().getSimilarEventParticipants(eventParticipantSimilarityCriteria);
8191

82-
pickOrCreateEntity(labMessageDto, similarCases, similarContacts, similarEventParticipants);
92+
pickOrCreateEntry(labMessageDto, similarCases, similarContacts, similarEventParticipants);
8393
}
8494
});
8595
}
8696

87-
private void pickOrCreateEntity(
97+
private void pickOrCreateEntry(
8898
LabMessageDto labMessageDto,
8999
List<CaseIndexDto> cases,
90100
List<SimilarContactDto> contacts,
91101
List<SimilarEventParticipantDto> eventParticipants) {
92-
EntitySelectionField selectField = new EntitySelectionField(labMessageDto, cases, contacts, eventParticipants);
102+
EntrySelectionField selectField = new EntrySelectionField(labMessageDto, cases, contacts, eventParticipants);
93103

94-
final CommitDiscardWrapperComponent<EntitySelectionField> component = new CommitDiscardWrapperComponent<>(selectField);
104+
final CommitDiscardWrapperComponent<EntrySelectionField> component = new CommitDiscardWrapperComponent<>(selectField);
95105
component.addCommitListener(() -> {
96-
SimilarEntitiesDto similarEntitiesDto = selectField.getValue();
97-
// if (resultConsumer != null) {
98-
// resultConsumer.accept(similarEntitiesDto.toReference());
99-
// }
106+
SimilarEntriesDto similarEntriesDto = selectField.getValue();
107+
if (similarEntriesDto.isNewCase()) {
108+
createCase(labMessageDto);
109+
}
100110
});
101111

102112
selectField.setSelectionChangeCallback((commitAllowed) -> {
103113
component.getCommitButton().setEnabled(commitAllowed);
104114
});
115+
component.getCommitButton().setEnabled(false);
105116

106-
VaadinUiUtil.showModalPopupWindow(component, I18nProperties.getString(Strings.headingPickOrCreateEntity));
117+
VaadinUiUtil.showModalPopupWindow(component, I18nProperties.getString(Strings.headingPickOrCreateEntry));
118+
}
119+
120+
private void createCase(LabMessageDto labMessageDto) {
121+
CommitDiscardWrapperComponent<CaseCreateForm> caseCreateComponent =
122+
ControllerProvider.getCaseController().getCaseCreateComponent(null, null, null);
123+
124+
Window window = VaadinUiUtil.createPopupWindow();
125+
caseCreateComponent.addCommitListener(() -> {
126+
createSample(caseCreateComponent.getWrappedComponent().getValue(), labMessageDto);
127+
window.close();
128+
});
129+
130+
PersonDto personDto = PersonDto.build();
131+
personDto.setFirstName(labMessageDto.getPersonFirstName());
132+
personDto.setLastName(labMessageDto.getPersonLastName());
133+
personDto.setSex(labMessageDto.getPersonSex());
134+
personDto.setBirthdateDD(labMessageDto.getPersonBirthDateDD());
135+
personDto.setBirthdateMM(labMessageDto.getPersonBirthDateMM());
136+
personDto.setBirthdateYYYY(labMessageDto.getPersonBirthDateYYYY());
137+
personDto.getAddress().setPostalCode(labMessageDto.getPersonPostalCode());
138+
personDto.getAddress().setCity(labMessageDto.getPersonCity());
139+
personDto.getAddress().setStreet(labMessageDto.getPersonStreet());
140+
personDto.getAddress().setHouseNumber(labMessageDto.getPersonHouseNumber());
141+
CaseDataDto caseDto = CaseDataDto.build(personDto.toReference(), labMessageDto.getTestedDisease());
142+
caseDto.setReportingUser(UserProvider.getCurrent().getUserReference());
143+
caseCreateComponent.getWrappedComponent().setValue(caseDto);
144+
caseCreateComponent.getWrappedComponent().setPerson(personDto);
145+
146+
LabMessageEditForm form = new LabMessageEditForm(true);
147+
form.setValue(labMessageDto);
148+
HorizontalLayout layout = new HorizontalLayout(form, caseCreateComponent);
149+
layout.setMargin(true);
150+
window.setContent(layout);
151+
window.setCaption(I18nProperties.getString(Strings.headingCreateNewCase));
152+
UI.getCurrent().addWindow(window);
153+
}
154+
155+
private void createSample(CaseDataDto caseDataDto, LabMessageDto labMessageDto) {
156+
SampleDto sampleDto = SampleDto.build(UserProvider.getCurrent().getUserReference(), caseDataDto.toReference());
157+
sampleDto.setSampleDateTime(labMessageDto.getSampleDateTime());
158+
if (labMessageDto.getSampleReceivedDate() != null) {
159+
sampleDto.setReceived(true);
160+
sampleDto.setReceivedDate(labMessageDto.getSampleReceivedDate());
161+
sampleDto.setLabSampleID(labMessageDto.getLabSampleId());
162+
}
163+
sampleDto.setSampleMaterial(labMessageDto.getSampleMaterial());
164+
sampleDto.setSpecimenCondition(labMessageDto.getSpecimenCondition());
165+
166+
Window window = VaadinUiUtil.createPopupWindow();
167+
CommitDiscardWrapperComponent<SampleCreateForm> sampleCreateComponent =
168+
ControllerProvider.getSampleController().getSampleCreateComponent(sampleDto, () -> {
169+
window.close();
170+
});
171+
172+
sampleCreateComponent.addCommitListener(() -> {
173+
createPathogenTest(sampleCreateComponent.getWrappedComponent().getValue(), labMessageDto);
174+
});
175+
176+
LabMessageEditForm form = new LabMessageEditForm(true);
177+
form.setValue(labMessageDto);
178+
HorizontalLayout layout = new HorizontalLayout(form, sampleCreateComponent);
179+
layout.setMargin(true);
180+
window.setContent(layout);
181+
window.setCaption(I18nProperties.getString(Strings.headingCreateNewSample));
182+
UI.getCurrent().addWindow(window);
183+
}
184+
185+
private void createPathogenTest(SampleDto sampleDto, LabMessageDto labMessageDto) {
186+
PathogenTestDto pathogenTestDto = PathogenTestDto.build(sampleDto, UserProvider.getCurrent().getUser());
187+
pathogenTestDto.setTestType(labMessageDto.getTestType());
188+
pathogenTestDto.setTestedDisease(labMessageDto.getTestedDisease());
189+
pathogenTestDto.setTestDateTime(labMessageDto.getTestDateTime());
190+
191+
Window window = VaadinUiUtil.createPopupWindow();
192+
193+
CommitDiscardWrapperComponent<PathogenTestForm> pathogenTestCreateComponent =
194+
ControllerProvider.getPathogenTestController().getPathogenTestCreateComponent(sampleDto.toReference(), 0, () -> {
195+
labMessageDto.setProcessed(true);
196+
FacadeProvider.getLabMessageFacade().save(labMessageDto);
197+
window.close();
198+
}, null);
199+
200+
pathogenTestCreateComponent.getWrappedComponent().setValue(pathogenTestDto);
201+
202+
LabMessageEditForm form = new LabMessageEditForm(true);
203+
form.setValue(labMessageDto);
204+
HorizontalLayout layout = new HorizontalLayout(form, pathogenTestCreateComponent);
205+
layout.setMargin(true);
206+
window.setContent(layout);
207+
window.setCaption(I18nProperties.getString(Strings.headingCreatePathogenTestResult));
208+
UI.getCurrent().addWindow(window);
107209
}
108210
}

0 commit comments

Comments
 (0)