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

Commit 94c23fc

Browse files
lgallgal
authored andcommitted
SORMAS-Foundation#3210 sormas to sormas transfer samples web UI
1 parent 9c84eaf commit 94c23fc

10 files changed

Lines changed: 99 additions & 14 deletions

File tree

sormas-api/src/main/java/de/symeda/sormas/api/sample/SampleDto.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,7 @@ public class SampleDto extends PseudonymizableDto {
119119
private String requestedOtherAdditionalTests;
120120

121121
private SormasToSormasOriginInfoDto sormasToSormasOriginInfo;
122+
private boolean isOwnershipHandedOver;
122123

123124
@ImportIgnore
124125
public CaseReferenceDto getAssociatedCase() {
@@ -378,6 +379,14 @@ public void setSormasToSormasOriginInfo(SormasToSormasOriginInfoDto sormasToSorm
378379
this.sormasToSormasOriginInfo = sormasToSormasOriginInfo;
379380
}
380381

382+
public boolean isOwnershipHandedOver() {
383+
return isOwnershipHandedOver;
384+
}
385+
386+
public void setOwnershipHandedOver(boolean ownershipHandedOver) {
387+
isOwnershipHandedOver = ownershipHandedOver;
388+
}
389+
381390
public static SampleDto build(UserReferenceDto userRef, CaseReferenceDto caseRef) {
382391

383392
final SampleDto sampleDto = getSampleDto(userRef);

sormas-backend/src/main/java/de/symeda/sormas/backend/sample/Sample.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import static de.symeda.sormas.api.EntityDto.COLUMN_LENGTH_BIG;
2121
import static de.symeda.sormas.api.EntityDto.COLUMN_LENGTH_DEFAULT;
2222

23+
import java.util.ArrayList;
2324
import java.util.Arrays;
2425
import java.util.Date;
2526
import java.util.HashSet;
@@ -59,6 +60,7 @@
5960
import de.symeda.sormas.backend.event.EventParticipant;
6061
import de.symeda.sormas.backend.facility.Facility;
6162
import de.symeda.sormas.backend.sormastosormas.SormasToSormasOriginInfo;
63+
import de.symeda.sormas.backend.sormastosormas.SormasToSormasShareInfo;
6264
import de.symeda.sormas.backend.user.User;
6365

6466
@Entity(name = "samples")
@@ -147,6 +149,7 @@ public class Sample extends CoreAdo {
147149
private List<AdditionalTest> additionalTests;
148150

149151
private SormasToSormasOriginInfo sormasToSormasOriginInfo;
152+
private List<SormasToSormasShareInfo> sormasToSormasShares = new ArrayList<>(0);
150153

151154
@ManyToOne
152155
@JoinColumn
@@ -568,4 +571,13 @@ public SormasToSormasOriginInfo getSormasToSormasOriginInfo() {
568571
public void setSormasToSormasOriginInfo(SormasToSormasOriginInfo sormasToSormasOriginInfo) {
569572
this.sormasToSormasOriginInfo = sormasToSormasOriginInfo;
570573
}
574+
575+
@OneToMany(mappedBy = SormasToSormasShareInfo.CAZE, fetch = FetchType.LAZY)
576+
public List<SormasToSormasShareInfo> getSormasToSormasShares() {
577+
return sormasToSormasShares;
578+
}
579+
580+
public void setSormasToSormasShares(List<SormasToSormasShareInfo> sormasToSormasShares) {
581+
this.sormasToSormasShares = sormasToSormasShares;
582+
}
571583
}

sormas-backend/src/main/java/de/symeda/sormas/backend/sample/SampleFacadeEjb.java

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,8 @@
103103
import de.symeda.sormas.backend.sample.PathogenTestFacadeEjb.PathogenTestFacadeEjbLocal;
104104
import de.symeda.sormas.backend.sormastosormas.SormasToSormasFacadeEjb;
105105
import de.symeda.sormas.backend.sormastosormas.SormasToSormasFacadeEjb.SormasToSormasFacadeEjbLocal;
106+
import de.symeda.sormas.backend.sormastosormas.SormasToSormasShareInfo;
107+
import de.symeda.sormas.backend.sormastosormas.SormasToSormasShareInfoService;
106108
import de.symeda.sormas.backend.user.User;
107109
import de.symeda.sormas.backend.user.UserFacadeEjb;
108110
import de.symeda.sormas.backend.user.UserRoleConfigFacadeEjb.UserRoleConfigFacadeEjbLocal;
@@ -167,6 +169,8 @@ public class SampleFacadeEjb implements SampleFacade {
167169
private EventJurisdictionChecker eventJurisdictionChecker;
168170
@EJB
169171
private SormasToSormasFacadeEjbLocal sormasToSormasFacade;
172+
@EJB
173+
private SormasToSormasShareInfoService sormasToSormasShareInfoService;
170174

171175
@Override
172176
public List<String> getAllActiveUuids() {
@@ -914,6 +918,7 @@ public static SampleDto toDto(Sample source) {
914918
target.setReportLatLonAccuracy(source.getReportLatLonAccuracy());
915919

916920
target.setSormasToSormasOriginInfo(SormasToSormasFacadeEjb.toSormasToSormasOriginInfoDto(source.getSormasToSormasOriginInfo()));
921+
target.setOwnershipHandedOver(source.getSormasToSormasShares().stream().anyMatch(SormasToSormasShareInfo::isOwnershipHandedOver));
917922

918923
return target;
919924
}
@@ -1004,8 +1009,12 @@ public static class SampleFacadeEjbLocal extends SampleFacadeEjb {
10041009
}
10051010

10061011
public Boolean isSampleEditAllowed(String sampleUuid) {
1007-
10081012
Sample sample = sampleService.getByUuid(sampleUuid);
1009-
return sampleJurisdictionChecker.isInJurisdictionOrOwned(sample);
1013+
1014+
if (sample.getSormasToSormasOriginInfo() != null) {
1015+
return sample.getSormasToSormasOriginInfo().isOwnershipHandedOver();
1016+
}
1017+
1018+
return sampleJurisdictionChecker.isInJurisdictionOrOwned(sample) && !sormasToSormasShareInfoService.isSamlpeOwnershipHandedOver(sample);
10101019
}
10111020
}

sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/SormasToSormasShareInfo.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ public class SormasToSormasShareInfo extends AbstractDomainObject {
3636

3737
public static final String CAZE = "caze";
3838
public static final String CONTACT = "contact";
39+
public static final String SAMPLE = "sample";
3940
public static final String OWNERSHIP_HANDED_OVER = "ownershipHandedOver";
4041

4142
private Case caze;

sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/SormasToSormasShareInfoService.java

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import de.symeda.sormas.backend.caze.Case;
2929
import de.symeda.sormas.backend.common.AbstractAdoService;
3030
import de.symeda.sormas.backend.contact.Contact;
31+
import de.symeda.sormas.backend.sample.Sample;
3132

3233
@Stateless
3334
@LocalBean
@@ -52,7 +53,15 @@ public Predicate buildCriteriaFilter(SormasToSormasShareInfoCriteria criteria, C
5253

5354
if (criteria.getContact() != null) {
5455
filter =
55-
and(cb, filter, cb.equal(from.join(SormasToSormasShareInfo.CONTACT, JoinType.LEFT).get(Case.UUID), criteria.getContact().getUuid()));
56+
and(
57+
cb,
58+
filter,
59+
cb.equal(from.join(SormasToSormasShareInfo.CONTACT, JoinType.LEFT).get(Contact.UUID), criteria.getContact().getUuid()));
60+
}
61+
62+
if (criteria.getSample() != null) {
63+
filter =
64+
and(cb, filter, cb.equal(from.join(SormasToSormasShareInfo.SAMPLE, JoinType.LEFT).get(Sample.UUID), criteria.getSample().getUuid()));
5665
}
5766

5867
return filter;
@@ -70,4 +79,10 @@ public boolean isContactOwnershipHandedOver(Contact contact) {
7079
cb.equal(root.get(SormasToSormasShareInfo.CONTACT), contact),
7180
cb.isTrue(root.get(SormasToSormasShareInfo.OWNERSHIP_HANDED_OVER))));
7281
}
82+
83+
public boolean isSamlpeOwnershipHandedOver(Sample sample) {
84+
return exists(
85+
(cb, root) -> cb
86+
.and(cb.equal(root.get(SormasToSormasShareInfo.SAMPLE), sample), cb.isTrue(root.get(SormasToSormasShareInfo.OWNERSHIP_HANDED_OVER))));
87+
}
7388
}

sormas-backend/src/main/resources/sql/sormas_schema.sql

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5494,4 +5494,14 @@ ALTER TABLE users ADD COLUMN hasConsentedToGdpr boolean default false;
54945494
ALTER TABLE users_history ADD COLUMN hasConsentedToGdpr boolean default false;
54955495
INSERT INTO schema_version (version_number, comment) VALUES (267, 'Add gdpr popup to user');
54965496

5497+
-- 2020-10-22 Sormas 2 Sormas samples #3210
5498+
ALTER TABLE samples ADD COLUMN sormasToSormasOriginInfo_id bigint;
5499+
ALTER TABLE samples ADD CONSTRAINT fk_samples_sormasToSormasOriginInfo_id FOREIGN KEY (sormasToSormasOriginInfo_id) REFERENCES sormastosormasorigininfo (id) ON UPDATE NO ACTION ON DELETE NO ACTION;
5500+
5501+
5502+
ALTER TABLE sormastosormasshareinfo ADD COLUMN sample_id bigint;
5503+
ALTER TABLE sormastosormasshareinfo ADD CONSTRAINT fk_sormastosormasshareinfo_sample_id FOREIGN KEY (sample_id) REFERENCES samples (id) ON UPDATE NO ACTION ON DELETE NO ACTION;
5504+
5505+
INSERT INTO schema_version (version_number, comment) VALUES (268, 'Sormas 2 Sormas samples #3210');
5506+
54975507
-- *** Insert new sql commands BEFORE this line ***

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -141,12 +141,12 @@ protected void initView(String params) {
141141
eventLayout.addComponent(eventList);
142142
layout.addComponent(eventLayout, EVENTS_LOC);
143143

144-
VerticalLayout sormasToSormasLocLayout = new VerticalLayout();
145-
sormasToSormasLocLayout.setMargin(false);
146-
sormasToSormasLocLayout.setSpacing(false);
147-
148144
boolean sormasToSormasEnabled = FacadeProvider.getSormasToSormasFacade().isFeatureEnabled();
149145
if (sormasToSormasEnabled || caze.getSormasToSormasOriginInfo() != null) {
146+
VerticalLayout sormasToSormasLocLayout = new VerticalLayout();
147+
sormasToSormasLocLayout.setMargin(false);
148+
sormasToSormasLocLayout.setSpacing(false);
149+
150150
SormasToSormasListComponent sormasToSormasListComponent = new SormasToSormasListComponent(caze, sormasToSormasEnabled);
151151
sormasToSormasListComponent.addStyleNames(CssStyles.SIDE_COMPONENT);
152152
sormasToSormasLocLayout.addComponent(sormasToSormasListComponent);

sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactDataView.java

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,6 @@
4848
import de.symeda.sormas.ui.utils.CommitDiscardWrapperComponent;
4949
import de.symeda.sormas.ui.utils.CssStyles;
5050
import de.symeda.sormas.ui.utils.DetailSubComponentWrapper;
51-
import de.symeda.sormas.ui.utils.FieldHelper;
5251
import de.symeda.sormas.ui.utils.LayoutUtil;
5352
import de.symeda.sormas.ui.utils.VaadinUiUtil;
5453
import de.symeda.sormas.ui.utils.ViewMode;
@@ -211,12 +210,12 @@ protected void initView(String params) {
211210
layout.addComponent(sampleLocLayout, SAMPLES_LOC);
212211
}
213212

214-
VerticalLayout sormasToSormasLocLayout = new VerticalLayout();
215-
sormasToSormasLocLayout.setMargin(false);
216-
sormasToSormasLocLayout.setSpacing(false);
217-
218213
boolean sormasToSormasfeatureEnabled = FacadeProvider.getSormasToSormasFacade().isFeatureEnabled();
219214
if (sormasToSormasfeatureEnabled || contactDto.getSormasToSormasOriginInfo() != null) {
215+
VerticalLayout sormasToSormasLocLayout = new VerticalLayout();
216+
sormasToSormasLocLayout.setMargin(false);
217+
sormasToSormasLocLayout.setSpacing(false);
218+
220219
SormasToSormasListComponent sormasToSormasListComponent = new SormasToSormasListComponent(contactDto, sormasToSormasfeatureEnabled);
221220
sormasToSormasListComponent.addStyleNames(CssStyles.SIDE_COMPONENT);
222221
sormasToSormasLocLayout.addComponent(sormasToSormasListComponent);

sormas-ui/src/main/java/de/symeda/sormas/ui/samples/SampleDataView.java

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

2323
import com.vaadin.shared.ui.MarginInfo;
2424
import com.vaadin.ui.CustomLayout;
25+
import com.vaadin.ui.VerticalLayout;
2526

2627
import de.symeda.sormas.api.Disease;
2728
import de.symeda.sormas.api.FacadeProvider;
@@ -41,10 +42,10 @@
4142
import de.symeda.sormas.ui.caze.CaseInfoLayout;
4243
import de.symeda.sormas.ui.contact.ContactInfoLayout;
4344
import de.symeda.sormas.ui.events.EventParticipantInfoLayout;
45+
import de.symeda.sormas.ui.sormastosormas.SormasToSormasListComponent;
4446
import de.symeda.sormas.ui.utils.CommitDiscardWrapperComponent;
4547
import de.symeda.sormas.ui.utils.CssStyles;
4648
import de.symeda.sormas.ui.utils.DetailSubComponentWrapper;
47-
import de.symeda.sormas.ui.utils.FieldHelper;
4849
import de.symeda.sormas.ui.utils.LayoutUtil;
4950

5051
public class SampleDataView extends AbstractSampleView {
@@ -59,6 +60,7 @@ public class SampleDataView extends AbstractSampleView {
5960
public static final String EVENT_PARTICIPANT_LOC = "eventParticipant";
6061
public static final String PATHOGEN_TESTS_LOC = "pathogenTests";
6162
public static final String ADDITIONAL_TESTS_LOC = "additionalTests";
63+
public static final String SORMAS_TO_SORMAS_LOC = "sormsToSormas";
6264

6365
private CommitDiscardWrapperComponent<SampleEditForm> editComponent;
6466

@@ -77,7 +79,8 @@ protected void initView(String params) {
7779
LayoutUtil.fluidColumnLoc(4, 0, 6, 0, CONTACT_LOC),
7880
LayoutUtil.fluidColumnLoc(4, 0, 6, 0, EVENT_PARTICIPANT_LOC),
7981
LayoutUtil.fluidColumnLoc(4, 0, 6, 0, PATHOGEN_TESTS_LOC),
80-
LayoutUtil.fluidColumnLoc(4, 0, 6, 0, ADDITIONAL_TESTS_LOC));
82+
LayoutUtil.fluidColumnLoc(4, 0, 6, 0, ADDITIONAL_TESTS_LOC),
83+
LayoutUtil.fluidColumnLoc(4, 0, 6, 0, SORMAS_TO_SORMAS_LOC));
8184

8285
DetailSubComponentWrapper container = new DetailSubComponentWrapper(() -> editComponent);
8386
container.setWidth(100, Unit.PERCENTAGE);
@@ -172,6 +175,20 @@ protected void initView(String params) {
172175
additionalTestList.addStyleName(CssStyles.SIDE_COMPONENT);
173176
layout.addComponent(additionalTestList, ADDITIONAL_TESTS_LOC);
174177
}
178+
179+
boolean sormasToSormasEnabled = FacadeProvider.getSormasToSormasFacade().isFeatureEnabled();
180+
if (sormasToSormasEnabled || sampleDto.getSormasToSormasOriginInfo() != null) {
181+
VerticalLayout sormasToSormasLocLayout = new VerticalLayout();
182+
sormasToSormasLocLayout.setMargin(false);
183+
sormasToSormasLocLayout.setSpacing(false);
184+
185+
SormasToSormasListComponent sormasToSormasListComponent = new SormasToSormasListComponent(sampleDto);
186+
sormasToSormasListComponent.addStyleNames(CssStyles.SIDE_COMPONENT);
187+
sormasToSormasLocLayout.addComponent(sormasToSormasListComponent);
188+
189+
layout.addComponent(sormasToSormasLocLayout, SORMAS_TO_SORMAS_LOC);
190+
}
191+
175192
//}
176193

177194
setSampleEditPermission(container);

sormas-ui/src/main/java/de/symeda/sormas/ui/sormastosormas/SormasToSormasListComponent.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@
3232
import de.symeda.sormas.api.contact.ContactReferenceDto;
3333
import de.symeda.sormas.api.i18n.Captions;
3434
import de.symeda.sormas.api.i18n.I18nProperties;
35+
import de.symeda.sormas.api.sample.SampleDto;
36+
import de.symeda.sormas.api.sample.SampleReferenceDto;
3537
import de.symeda.sormas.api.sormastosormas.ServerAccessDataReferenceDto;
3638
import de.symeda.sormas.api.sormastosormas.SormasToSormasOriginInfoDto;
3739
import de.symeda.sormas.api.sormastosormas.SormasToSormasShareInfoCriteria;
@@ -77,6 +79,17 @@ public SormasToSormasListComponent(ContactDto contact, boolean canShare) {
7779
canShare ? e -> ControllerProvider.getSormasToSormasController().shareContactFromDetailsPage(contactRef, this) : null);
7880
}
7981

82+
public SormasToSormasListComponent(SampleDto sample) {
83+
SampleReferenceDto sampleRef = sample.toReference();
84+
85+
sormasToSormasList = new SormasToSormasList(
86+
new SormasToSormasShareInfoCriteria().sample(sampleRef),
87+
sample.getSormasToSormasOriginInfo() == null,
88+
Captions.sormasToSormasCaseNotShared);
89+
90+
initLayout(sample.getSormasToSormasOriginInfo(), sormasToSormasList, null);
91+
}
92+
8093
private void initLayout(
8194
SormasToSormasOriginInfoDto originInfo,
8295
SormasToSormasList sormasToSormasList,

0 commit comments

Comments
 (0)