44import static de .symeda .sormas .ui .utils .LayoutUtil .loc ;
55
66import java .util .Date ;
7+ import java .util .List ;
78import java .util .stream .Stream ;
89
910import org .apache .commons .lang3 .StringUtils ;
3839import de .symeda .sormas .api .region .DistrictReferenceDto ;
3940import de .symeda .sormas .api .region .RegionReferenceDto ;
4041import de .symeda .sormas .api .user .UserDto ;
42+ import de .symeda .sormas .api .user .UserReferenceDto ;
4143import de .symeda .sormas .api .user .UserRole ;
4244import de .symeda .sormas .api .utils .DateFilterOption ;
4345import de .symeda .sormas .api .utils .DateHelper ;
@@ -136,7 +138,7 @@ protected void addFields() {
136138 @ Override
137139 public void addMoreFilters (CustomLayout moreFiltersContainer ) {
138140
139- UserDto user = UserProvider . getCurrent (). getUser ();
141+ UserDto user = currentUser ();
140142
141143 if (user .getRegion () == null ) {
142144 ComboBox regionField = addField (
@@ -169,12 +171,13 @@ public void addMoreFilters(CustomLayout moreFiltersContainer) {
169171 CssStyles .style (infoLabel , CssStyles .LABEL_XLARGE , CssStyles .LABEL_SECONDARY , AbstractFilterForm .FILTER_ITEM_STYLE );
170172 moreFiltersContainer .addComponent (infoLabel , DISTRICT_INFO_LABEL_ID );
171173
172- addField (
174+ ComboBox officerField = addField (
173175 moreFiltersContainer ,
174176 FieldConfiguration .withCaptionAndPixelSized (
175177 ContactCriteria .CONTACT_OFFICER ,
176178 I18nProperties .getPrefixCaption (ContactIndexDto .I18N_PREFIX , ContactIndexDto .CONTACT_OFFICER_UUID ),
177179 140 ));
180+ officerField .addItems (fetchSurveillanceOfficersByRegion (currentUser ().getRegion ()));
178181 addField (
179182 moreFiltersContainer ,
180183 FieldConfiguration .withCaptionAndPixelSized (ContactCriteria .REPORTING_USER_ROLE , I18nProperties .getString (Strings .reportedBy ), 140 ));
@@ -313,21 +316,23 @@ protected void applyDependenciesOnFieldChange(String propertyId, Property.ValueC
313316 switch (propertyId ) {
314317 case ContactCriteria .REGION : {
315318 RegionReferenceDto region = (RegionReferenceDto ) event .getProperty ().getValue ();
316- if (region == null ) {
317- clearAndDisableFields (ContactCriteria .DISTRICT , ContactCriteria .COMMUNITY );
318- } else {
319+ if (region != null ) {
319320 applyRegionFilterDependency (region , ContactCriteria .DISTRICT );
320321 clearAndDisableFields (ContactCriteria .COMMUNITY );
322+ } else {
323+ clearAndDisableFields (ContactCriteria .DISTRICT , ContactCriteria .COMMUNITY );
321324 }
325+ populateSurveillanceOfficersForRegion (region );
322326 break ;
323327 }
324328 case ContactCriteria .DISTRICT : {
325329 DistrictReferenceDto district = (DistrictReferenceDto ) event .getProperty ().getValue ();
326- if (district == null ) {
327- clearAndDisableFields (ContactCriteria .COMMUNITY );
328- } else {
330+ if (district != null ) {
329331 applyDistrictDependency (district , ContactCriteria .COMMUNITY );
332+ } else {
333+ clearAndDisableFields (ContactCriteria .COMMUNITY );
330334 }
335+ populateSurveillanceOfficersForDistrict (district );
331336 break ;
332337 }
333338 case ContactCriteria .FOLLOW_UP_UNTIL_TO : {
@@ -353,7 +358,7 @@ protected void applyDependenciesOnNewValue(ContactCriteria newValue) {
353358 final DistrictReferenceDto district = newValue .getDistrict ();
354359 applyRegionAndDistrictFilterDependency (region , ContactCriteria .DISTRICT , district , ContactCriteria .COMMUNITY );
355360
356- final UserDto user = UserProvider . getCurrent (). getUser ();
361+ final UserDto user = currentUser ();
357362
358363 ComboBox officerField = getField (ContactCriteria .CONTACT_OFFICER );
359364 if (user .getRegion () != null ) {
@@ -494,4 +499,34 @@ public void setSearchFieldEnabled(boolean enabled) {
494499 this .getField (ContactCriteria .NAME_UUID_CASE_LIKE ).setEnabled (enabled );
495500 this .getField (ContactCriteria .EVENT_LIKE ).setEnabled (enabled );
496501 }
502+
503+ private void populateSurveillanceOfficersForRegion (RegionReferenceDto regionReferenceDto ) {
504+ List <UserReferenceDto > items = fetchSurveillanceOfficersByRegion (regionReferenceDto != null ? regionReferenceDto : currentUser ().getRegion ());
505+ populateSurveillanceOfficers (items );
506+ }
507+
508+ private void populateSurveillanceOfficersForDistrict (DistrictReferenceDto districtReferenceDto ) {
509+ if (districtReferenceDto != null ) {
510+ List <UserReferenceDto > items =
511+ FacadeProvider .getUserFacade ().getUserRefsByDistrict (districtReferenceDto , false , UserRole .SURVEILLANCE_OFFICER );
512+ populateSurveillanceOfficers (items );
513+ } else {
514+ final ComboBox regionField = getField (ContactCriteria .REGION );
515+ populateSurveillanceOfficersForRegion ((RegionReferenceDto ) regionField .getValue ());
516+ }
517+ }
518+
519+ private void populateSurveillanceOfficers (List <UserReferenceDto > items ) {
520+ final ComboBox officerField = getField (ContactCriteria .CONTACT_OFFICER );
521+ officerField .removeAllItems ();
522+ officerField .addItems (items );
523+ }
524+
525+ private List <UserReferenceDto > fetchSurveillanceOfficersByRegion (RegionReferenceDto regionReferenceDto ) {
526+ return FacadeProvider .getUserFacade ().getUsersByRegionAndRoles (regionReferenceDto , UserRole .SURVEILLANCE_OFFICER );
527+ }
528+
529+ private UserDto currentUser () {
530+ return UserProvider .getCurrent ().getUser ();
531+ }
497532}
0 commit comments