1+ /*
2+ * SORMAS® - Surveillance Outbreak Response Management & Analysis System
3+ * Copyright © 2016-2026 SORMAS Foundation gGmbH
4+ * This program is free software: you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation, either version 3 of the License, or
7+ * (at your option) any later version.
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ * You should have received a copy of the GNU General Public License
13+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
14+ */
15+
116package de .symeda .sormas .ui .externalmessage ;
217
318import static de .symeda .sormas .ui .utils .LayoutUtil .fluidRowLocs ;
1025import com .vaadin .ui .CustomLayout ;
1126import com .vaadin .ui .Label ;
1227import com .vaadin .ui .Panel ;
13- import com .vaadin .v7 .data .util .converter .Converter ;
28+ import com .vaadin .ui .TabSheet ;
29+ import com .vaadin .ui .VerticalLayout ;
1430
1531import de .symeda .sormas .api .FacadeProvider ;
1632import de .symeda .sormas .api .externalmessage .ExternalMessageDto ;
1733import de .symeda .sormas .api .externalmessage .ExternalMessageResult ;
34+ import de .symeda .sormas .api .i18n .Captions ;
35+ import de .symeda .sormas .api .i18n .I18nProperties ;
1836import de .symeda .sormas .ui .utils .AbstractEditForm ;
1937import de .symeda .sormas .ui .utils .VaadinUiUtil ;
2038
39+ @ SuppressWarnings ({
40+ "java:S110" , // suppress sonar too many parents warning
41+ "java:S2160" // equals not overridden; value-equality is not needed for Vaadin form components
42+ })
2143public class ExternalMessageForm extends AbstractEditForm <ExternalMessageDto > {
2244
2345 private static final long serialVersionUID = -3859401780981133265L ;
2446
2547 //@formatter:off
2648 private static final String HTML_LAYOUT =
27- fluidRowLocs (ExternalMessageDto .UUID , ExternalMessageDto .MESSAGE_DATE_TIME ) +
49+ fluidRowLocs (ExternalMessageDto .UUID , ExternalMessageDto .MESSAGE_DATE_TIME ) +
2850 fluidRowLocs (ExternalMessageDto .EXTERNAL_MESSAGE_DETAILS );
2951 //@formatter:on
3052
31- private Panel detailsPanel ;
53+ private TabSheet detailsTabSheet ;
54+ private Panel structuredViewPanel ;
55+ @ SuppressWarnings ("java:S1450" ) // referenced in addFields, tab listener and setValue - cannot be local
56+ private Panel detailedViewPanel ;
57+ private VerticalLayout structuredViewContainer ;
58+ private VerticalLayout detailedViewContainer ;
59+ private boolean structuredViewLoaded ;
60+ private boolean detailedViewLoaded ;
3261
62+ @ SuppressWarnings ("java:S1948" ) // Logger is effectively serializable via its name
3363 private final Logger logger = LoggerFactory .getLogger (getClass ());
3464
3565 public ExternalMessageForm () {
@@ -40,10 +70,44 @@ public ExternalMessageForm() {
4070 protected void addFields () {
4171 addFields (ExternalMessageDto .UUID , ExternalMessageDto .MESSAGE_DATE_TIME );
4272
43- detailsPanel = new Panel ();
44- detailsPanel .setHeightFull ();
45- detailsPanel .addStyleName ("lab-message-details" );
46- getContent ().addComponent (detailsPanel , ExternalMessageDto .EXTERNAL_MESSAGE_DETAILS );
73+ structuredViewContainer = new VerticalLayout ();
74+ structuredViewContainer .setMargin (false );
75+ structuredViewContainer .setSizeUndefined ();
76+
77+ structuredViewPanel = new Panel ();
78+ structuredViewPanel .setSizeFull ();
79+ structuredViewPanel .addStyleName ("lab-message-structured-view" );
80+ structuredViewPanel .setContent (structuredViewContainer );
81+
82+ detailedViewContainer = new VerticalLayout ();
83+ detailedViewContainer .setMargin (false );
84+ detailedViewContainer .setSizeUndefined ();
85+
86+ detailedViewPanel = new Panel ();
87+ detailedViewPanel .setSizeFull ();
88+ detailedViewPanel .addStyleName ("lab-message-detailed-view" );
89+ detailedViewPanel .setContent (detailedViewContainer );
90+
91+ detailsTabSheet = new TabSheet ();
92+ detailsTabSheet .setSizeFull ();
93+ detailsTabSheet .addStyleName ("lab-message-details" );
94+ detailsTabSheet .addTab (structuredViewPanel , I18nProperties .getCaption (Captions .externalMessage_structuredView ));
95+ detailsTabSheet .addTab (detailedViewPanel , I18nProperties .getCaption (Captions .externalMessage_detailedView ));
96+
97+ detailsTabSheet .addSelectedTabChangeListener (event -> {
98+ ExternalMessageDto msg = getValue ();
99+ if (msg == null ) {
100+ return ;
101+ }
102+ Component selected = event .getTabSheet ().getSelectedTab ();
103+ if (selected == structuredViewPanel ) {
104+ loadStructuredView (msg );
105+ } else if (selected == detailedViewPanel ) {
106+ loadDetailedView (msg );
107+ }
108+ });
109+
110+ getContent ().addComponent (detailsTabSheet , ExternalMessageDto .EXTERNAL_MESSAGE_DETAILS );
47111 }
48112
49113 @ Override
@@ -52,23 +116,57 @@ protected String createHtmlLayout() {
52116 }
53117
54118 @ Override
55- public void setValue (ExternalMessageDto externalMessage ) throws ReadOnlyException , Converter . ConversionException {
119+ public void setValue (ExternalMessageDto externalMessage ) {
56120 super .setValue (externalMessage );
57121 getFieldGroup ().setReadOnly (true );
122+ structuredViewLoaded = false ;
123+ detailedViewLoaded = false ;
124+ structuredViewContainer .removeAllComponents ();
125+ detailedViewContainer .removeAllComponents ();
126+ loadStructuredView (externalMessage );
127+ detailsTabSheet .setSelectedTab (structuredViewPanel );
128+ }
129+
130+ private void loadStructuredView (ExternalMessageDto externalMessage ) {
131+ if (structuredViewLoaded ) {
132+ return ;
133+ }
134+ try {
135+ ExternalMessageResult <String > result = FacadeProvider .getExternalLabResultsFacade ().convertToHTML (externalMessage );
136+ if (result .isSuccess ()) {
137+ CustomLayout layout = new CustomLayout ();
138+ layout .setTemplateContents (result .getValue ());
139+ structuredViewContainer .addComponent (layout );
140+ } else {
141+ structuredViewContainer .addComponent (createXmlDisplay (externalMessage .getExternalMessageDetails ()));
142+ VaadinUiUtil .showWarningPopup (result .getError ());
143+ }
144+ } catch (Exception e ) {
145+ structuredViewContainer .addComponent (createXmlDisplay (externalMessage .getExternalMessageDetails ()));
146+ logger .error (e .getMessage ());
147+ }
148+ structuredViewLoaded = true ;
149+ }
150+
151+ private void loadDetailedView (ExternalMessageDto externalMessage ) {
152+ if (detailedViewLoaded ) {
153+ return ;
154+ }
58155 try {
59- ExternalMessageResult <String > htmlConversionResult = FacadeProvider .getExternalLabResultsFacade ().convertToHTML (externalMessage );
60- if (htmlConversionResult .isSuccess ()) {
61- CustomLayout externalMessageDetails = new CustomLayout ();
62- externalMessageDetails .setTemplateContents (htmlConversionResult .getValue ());
63- detailsPanel . setContent ( externalMessageDetails );
156+ ExternalMessageResult <String > result = FacadeProvider .getExternalLabResultsFacade ().convertToDetailedHTML (externalMessage );
157+ if (result .isSuccess ()) {
158+ CustomLayout layout = new CustomLayout ();
159+ layout .setTemplateContents (result .getValue ());
160+ detailedViewContainer . addComponent ( layout );
64161 } else {
65- detailsPanel . setContent (createXmlDisplay (externalMessage .getExternalMessageDetails ()));
66- VaadinUiUtil .showWarningPopup (htmlConversionResult .getError ());
162+ detailedViewContainer . addComponent (createXmlDisplay (externalMessage .getExternalMessageDetails ()));
163+ VaadinUiUtil .showWarningPopup (result .getError ());
67164 }
68165 } catch (Exception e ) {
69- detailsPanel . setContent (createXmlDisplay (externalMessage .getExternalMessageDetails ()));
166+ detailedViewContainer . addComponent (createXmlDisplay (externalMessage .getExternalMessageDetails ()));
70167 logger .error (e .getMessage ());
71168 }
169+ detailedViewLoaded = true ;
72170 }
73171
74172 private Component createXmlDisplay (String xml ) {
0 commit comments