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

Commit 4918297

Browse files
author
barnabartha
committed
SORMAS-Foundation#3253 - send sms in bulk mode
1 parent 2a91a1d commit 4918297

9 files changed

Lines changed: 70 additions & 12 deletions

File tree

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
@@ -20,6 +20,7 @@ public interface Strings {
2020
String bpm = "bpm";
2121
String by = "by";
2222
String cancel = "cancel";
23+
String characters = "characters";
2324
String classificationAllOf = "classificationAllOf";
2425
String classificationClassificationRules = "classificationClassificationRules";
2526
String classificationConfirmed = "classificationConfirmed";
@@ -129,6 +130,7 @@ public interface Strings {
129130
String done = "done";
130131
String edit = "edit";
131132
String email = "email";
133+
String enterSMS = "enterSMS";
132134
String entityAction = "entityAction";
133135
String entityActions = "entityActions";
134136
String entityAdditionalTest = "entityAdditionalTest";
@@ -745,12 +747,14 @@ public interface Strings {
745747
String notificationTaskStartSpecific = "notificationTaskStartSpecific";
746748
String notificationVisitCompleted = "notificationVisitCompleted";
747749
String notSpecified = "notSpecified";
750+
String nrOfCharactersLeft = "nrOfCharactersLeft";
748751
String number = "number";
749752
String numberEight = "numberEight";
750753
String numberEleven = "numberEleven";
751754
String numberFive = "numberFive";
752755
String numberFour = "numberFour";
753756
String numberNine = "numberNine";
757+
String numberOfMissingPhoneNumbers = "numberOfMissingPhoneNumbers";
754758
String numberOne = "numberOne";
755759
String numberSeven = "numberSeven";
756760
String numberSix = "numberSix";

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -888,3 +888,7 @@ email = Email
888888
send = Send
889889
cancel = Cancel
890890
sendingSms = Send new SMS
891+
numberOfMissingPhoneNumbers = %s of the selected cases does not have a valid phone number
892+
enterSMS = Please enter your SMS message here:
893+
characters = Characters:
894+
nrOfCharactersLeft = / 160 => Nr. of messages::

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

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@
6767
import de.symeda.sormas.api.importexport.ExportConfigurationDto;
6868
import de.symeda.sormas.api.infrastructure.PointOfEntryDto;
6969
import de.symeda.sormas.api.infrastructure.PointOfEntryReferenceDto;
70+
import de.symeda.sormas.api.messaging.MessageType;
7071
import de.symeda.sormas.api.person.PersonDto;
7172
import de.symeda.sormas.api.region.DistrictReferenceDto;
7273
import de.symeda.sormas.api.region.RegionReferenceDto;
@@ -91,6 +92,7 @@
9192
import de.symeda.sormas.ui.caze.exporter.CaseExportConfigurationsGrid;
9293
import de.symeda.sormas.ui.caze.maternalhistory.MaternalHistoryForm;
9394
import de.symeda.sormas.ui.caze.maternalhistory.MaternalHistoryView;
95+
import de.symeda.sormas.ui.caze.messaging.SmsComponent;
9496
import de.symeda.sormas.ui.caze.porthealthinfo.PortHealthInfoForm;
9597
import de.symeda.sormas.ui.caze.porthealthinfo.PortHealthInfoView;
9698
import de.symeda.sormas.ui.clinicalcourse.ClinicalCourseForm;
@@ -1150,6 +1152,32 @@ public void deleteAllSelectedItems(Collection<? extends CaseIndexDto> selectedRo
11501152
}
11511153
}
11521154

1155+
public void sendSmsToAllSelectedItems(Collection<? extends CaseIndexDto> selectedRows, Runnable callback) {
1156+
1157+
if (selectedRows.size() == 0) {
1158+
new Notification(
1159+
I18nProperties.getString(Strings.headingNoCasesSelected),
1160+
I18nProperties.getString(Strings.messageNoCasesSelected),
1161+
Type.WARNING_MESSAGE,
1162+
false).show(Page.getCurrent());
1163+
} else {
1164+
final List<String> caseUuids = selectedRows.stream().map(caseIndexDto -> caseIndexDto.getUuid()).collect(Collectors.toList());
1165+
final SmsComponent smsComponent =
1166+
new SmsComponent(FacadeProvider.getCaseFacade().countCasesWithMissingMessageType(caseUuids, MessageType.SMS));
1167+
VaadinUiUtil.showConfirmationPopup(
1168+
I18nProperties.getString(Strings.sendingSms),
1169+
smsComponent,
1170+
I18nProperties.getString(Strings.send),
1171+
I18nProperties.getString(Strings.cancel),
1172+
640,
1173+
confirmationEvent -> {
1174+
if (confirmationEvent.booleanValue()) {
1175+
FacadeProvider.getCaseFacade().sendMessage(caseUuids, "", smsComponent.getValue(), MessageType.SMS);
1176+
}
1177+
});
1178+
}
1179+
}
1180+
11531181
public void archiveAllSelectedItems(Collection<? extends CaseIndexDto> selectedRows, Runnable callback) {
11541182

11551183
if (selectedRows.size() == 0) {

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,13 +27,15 @@
2727

2828
import de.symeda.sormas.api.FacadeProvider;
2929
import de.symeda.sormas.api.caze.CaseDataDto;
30+
import de.symeda.sormas.api.feature.FeatureType;
3031
import de.symeda.sormas.api.i18n.I18nProperties;
3132
import de.symeda.sormas.api.i18n.Strings;
3233
import de.symeda.sormas.api.task.TaskContext;
3334
import de.symeda.sormas.api.user.UserRight;
3435
import de.symeda.sormas.ui.ControllerProvider;
3536
import de.symeda.sormas.ui.UserProvider;
3637
import de.symeda.sormas.ui.caze.eventLink.EventListComponent;
38+
import de.symeda.sormas.ui.caze.messaging.SmsListComponent;
3739
import de.symeda.sormas.ui.docgeneration.DocGenerationComponent;
3840
import de.symeda.sormas.ui.samples.sampleLink.SampleListComponent;
3941
import de.symeda.sormas.ui.sormastosormas.SormasToSormasListComponent;
@@ -114,7 +116,8 @@ protected void initView(String params) {
114116
taskList.addStyleName(CssStyles.SIDE_COMPONENT);
115117
layout.addComponent(taskList, TASKS_LOC);
116118

117-
if (UserProvider.getCurrent().hasUserRight(UserRight.SEND_MANUAL_EXTERNAL_MESSAGES)) {
119+
boolean externalMessagesEnabled = FacadeProvider.getFeatureConfigurationFacade().isFeatureEnabled(FeatureType.MANUAL_EXTERNAL_MESSAGES);
120+
if (externalMessagesEnabled && UserProvider.getCurrent().hasUserRight(UserRight.SEND_MANUAL_EXTERNAL_MESSAGES)) {
118121
SmsListComponent smsList = new SmsListComponent(getCaseRef());
119122
smsList.addStyleName(CssStyles.SIDE_COMPONENT);
120123
layout.addComponent(smsList, SMS_LOC);

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -694,6 +694,12 @@ public HorizontalLayout createStatusFilterBar() {
694694
selectedItem -> ControllerProvider.getCaseController()
695695
.deleteAllSelectedItems(caseGrid.asMultiSelect().getSelectedItems(), () -> navigateTo(criteria)),
696696
hasBulkOperationsRight),
697+
new MenuBarHelper.MenuBarItem(
698+
I18nProperties.getCaption(Captions.sendSMS),
699+
VaadinIcons.MOBILE_RETRO,
700+
selectedItem -> ControllerProvider.getCaseController()
701+
.sendSmsToAllSelectedItems(caseGrid.asMultiSelect().getSelectedItems(), () -> navigateTo(criteria)),
702+
hasBulkOperationsRight),
697703
new MenuBarHelper.MenuBarItem(
698704
I18nProperties.getCaption(Captions.actionArchive),
699705
VaadinIcons.ARCHIVE,

sormas-ui/src/main/java/de/symeda/sormas/ui/caze/SmsComponent.java renamed to sormas-ui/src/main/java/de/symeda/sormas/ui/caze/messaging/SmsComponent.java

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package de.symeda.sormas.ui.caze;
1+
package de.symeda.sormas.ui.caze.messaging;
22

33
import com.vaadin.ui.Alignment;
44
import com.vaadin.ui.Component;
@@ -8,28 +8,43 @@
88
import com.vaadin.ui.VerticalLayout;
99
import com.vaadin.v7.ui.CustomField;
1010

11+
import de.symeda.sormas.api.i18n.I18nProperties;
12+
import de.symeda.sormas.api.i18n.Strings;
13+
1114
public class SmsComponent extends CustomField<String> {
1215

16+
private long missingPhoneNumbers;
17+
1318
private TextArea smsTextArea;
1419

20+
public SmsComponent(long missingPhoneNumbers) {
21+
this.missingPhoneNumbers = missingPhoneNumbers;
22+
}
23+
1524
@Override
1625
protected Component initContent() {
1726
final VerticalLayout mainLayout = new VerticalLayout();
1827
mainLayout.setSpacing(false);
1928
mainLayout.setSizeUndefined();
2029
mainLayout.setWidth(100, Unit.PERCENTAGE);
2130

31+
if (missingPhoneNumbers > 0) {
32+
mainLayout.addComponent(new Label(String.format(I18nProperties.getString(Strings.numberOfMissingPhoneNumbers), missingPhoneNumbers)));
33+
}
34+
35+
mainLayout.addComponent(new Label(I18nProperties.getString(Strings.enterSMS)));
36+
2237
smsTextArea = new TextArea();
2338
smsTextArea.setWidth(100, Unit.PERCENTAGE);
2439
smsTextArea.setRows(4);
2540
mainLayout.addComponent(smsTextArea);
2641

2742
final HorizontalLayout charactersLayout = new HorizontalLayout();
2843
charactersLayout.setSpacing(false);
29-
charactersLayout.addComponent(new Label("Characters: "));
44+
charactersLayout.addComponent(new Label(I18nProperties.getString(Strings.characters)));
3045
final Label characterLeftLabel = new Label("0");
3146
charactersLayout.addComponent(characterLeftLabel);
32-
charactersLayout.addComponent(new Label(" / 160 => Nr. of messages: "));
47+
charactersLayout.addComponent(new Label(I18nProperties.getString(Strings.nrOfCharactersLeft)));
3348
final Label nrOfMessagesLabel = new Label("1");
3449
charactersLayout.addComponent(nrOfMessagesLabel);
3550

sormas-ui/src/main/java/de/symeda/sormas/ui/caze/SmsList.java renamed to sormas-ui/src/main/java/de/symeda/sormas/ui/caze/messaging/SmsList.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package de.symeda.sormas.ui.caze;
1+
package de.symeda.sormas.ui.caze.messaging;
22

33
import java.util.List;
44

sormas-ui/src/main/java/de/symeda/sormas/ui/caze/SmsListComponent.java renamed to sormas-ui/src/main/java/de/symeda/sormas/ui/caze/messaging/SmsListComponent.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package de.symeda.sormas.ui.caze;
1+
package de.symeda.sormas.ui.caze.messaging;
22

33
import java.util.Arrays;
44

@@ -25,9 +25,10 @@ public class SmsListComponent extends VerticalLayout {
2525
private boolean hasPhoneNumber;
2626

2727
public SmsListComponent(CaseReferenceDto caseRef) {
28-
hasPhoneNumber = FacadeProvider.getCaseFacade().countCasesWithMissingMessageType(Arrays.asList(caseRef.getUuid()), MessageType.SMS) == 0;
28+
long missingPhoneNumbers = FacadeProvider.getCaseFacade().countCasesWithMissingMessageType(Arrays.asList(caseRef.getUuid()), MessageType.SMS);
29+
hasPhoneNumber = missingPhoneNumbers == 0;
2930
createSmsListComponent(new SmsList(caseRef, hasPhoneNumber), e -> {
30-
final SmsComponent smsComponent = new SmsComponent();
31+
final SmsComponent smsComponent = new SmsComponent(missingPhoneNumbers);
3132
VaadinUiUtil.showConfirmationPopup(
3233
I18nProperties.getString(Strings.sendingSms),
3334
smsComponent,

sormas-ui/src/main/java/de/symeda/sormas/ui/caze/SmsListEntry.java renamed to sormas-ui/src/main/java/de/symeda/sormas/ui/caze/messaging/SmsListEntry.java

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package de.symeda.sormas.ui.caze;
1+
package de.symeda.sormas.ui.caze.messaging;
22

33
import com.vaadin.ui.HorizontalLayout;
44
import com.vaadin.ui.Label;
@@ -11,10 +11,7 @@
1111

1212
public class SmsListEntry extends HorizontalLayout {
1313

14-
private final ManualMessageLogDto manualMessageLogDto;
15-
1614
public SmsListEntry(ManualMessageLogDto manualMessageLogDto) {
17-
this.manualMessageLogDto = manualMessageLogDto;
1815

1916
setMargin(false);
2017
setSpacing(true);

0 commit comments

Comments
 (0)