From 37bccc63f596454b5dc9ad8da98f898c22a6a727 Mon Sep 17 00:00:00 2001 From: Dutervil Date: Tue, 9 Sep 2025 14:37:58 -0400 Subject: [PATCH 1/3] Creating controller and .gsp file for Prenatal Visit Status --- .../VisitStatusFragmentController.java | 69 +++++++++++++++++++ .../dashboardwidgets/visitStatus.gsp | 42 +++++++++++ 2 files changed, 111 insertions(+) create mode 100644 omod/src/main/java/org/openmrs/module/pihcore/fragment/controller/dashboardwidgets/VisitStatusFragmentController.java create mode 100644 omod/src/main/webapp/fragments/dashboardwidgets/visitStatus.gsp diff --git a/omod/src/main/java/org/openmrs/module/pihcore/fragment/controller/dashboardwidgets/VisitStatusFragmentController.java b/omod/src/main/java/org/openmrs/module/pihcore/fragment/controller/dashboardwidgets/VisitStatusFragmentController.java new file mode 100644 index 000000000..9c9a63c5f --- /dev/null +++ b/omod/src/main/java/org/openmrs/module/pihcore/fragment/controller/dashboardwidgets/VisitStatusFragmentController.java @@ -0,0 +1,69 @@ +package org.openmrs.module.pihcore.fragment.controller.dashboardwidgets; + +import org.codehaus.jackson.JsonNode; +import org.openmrs.Patient; +import org.openmrs.api.PatientService; +import org.openmrs.module.appframework.domain.AppDescriptor; +import org.openmrs.module.emrapi.patient.PatientDomainWrapper; +import org.openmrs.module.pihcore.status.StatusData; +import org.openmrs.module.pihcore.status.StatusDataEvaluator; +import org.openmrs.ui.framework.UiUtils; +import org.openmrs.ui.framework.annotation.FragmentParam; +import org.openmrs.ui.framework.annotation.InjectBeans; +import org.openmrs.ui.framework.annotation.SpringBean; +import org.openmrs.ui.framework.fragment.FragmentConfiguration; +import org.openmrs.ui.framework.fragment.FragmentModel; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.List; + +public class VisitStatusFragmentController { + + private final Logger log = LoggerFactory.getLogger(getClass()); + + public void controller(@SpringBean("patientService") PatientService patientService, + @SpringBean("statusDataEvaluator") StatusDataEvaluator statusDataEvaluator, + @InjectBeans PatientDomainWrapper patientWrapper, + @FragmentParam("app") AppDescriptor app, + UiUtils ui, + FragmentConfiguration config, + FragmentModel model) { + + Object patientConfig = config.get("patient"); + if (patientConfig == null ) { + patientConfig = config.get("patientId"); + } + Patient patient = null; + if (patientConfig != null) { + if (patientConfig instanceof Patient) { + patient = (Patient) patientConfig; + } + else if (patientConfig instanceof PatientDomainWrapper) { + patient = ((PatientDomainWrapper) patientConfig).getPatient(); + } + else if (patientConfig instanceof Integer) { + patient = patientService.getPatient((Integer)patientConfig); + } + else if (patientConfig instanceof String) { + patient = patientService.getPatientByUuid((String)patientConfig); + } + } + if (patient == null) { + throw new IllegalArgumentException("No patient found in the status data fragment. Please pass patient into the configuration"); + } + + model.put("app", app); + model.put("icon", app.getConfig().get("icon").asText()); + model.put("label", app.getConfig().get("label").asText()); + + // Evaluate Status Data based on configFile specified in app configuration + JsonNode configFileNode = app.getConfig().get("configFile"); + if (configFileNode == null || configFileNode.asText() == null) { + throw new IllegalStateException("You must supply a configFile configuration to the statusData fragment"); + } + List statusData = statusDataEvaluator.evaluate(patient, configFileNode.asText()); + statusData.removeIf(statusData1 -> !statusData1.isEnabled()); + model.put("statusData", statusData); + } +} diff --git a/omod/src/main/webapp/fragments/dashboardwidgets/visitStatus.gsp b/omod/src/main/webapp/fragments/dashboardwidgets/visitStatus.gsp new file mode 100644 index 000000000..321e0ecd0 --- /dev/null +++ b/omod/src/main/webapp/fragments/dashboardwidgets/visitStatus.gsp @@ -0,0 +1,42 @@ +
+
+ +

${ ui.message(label) }

+
+
+ <% + statusData.each { status -> + def formattedValue + def displayValue = status.displayValue + + if (displayValue != null && displayValue instanceof String) { + displayValue = displayValue.replace('{{contextPath}}', contextPath) + } + + if (displayValue instanceof Date) { + formattedValue = ui.formatDatePretty(displayValue) + } else if (displayValue instanceof String) { + try { + // updated format for "2025-09-10T00:00" + def sdf = new java.text.SimpleDateFormat("yyyy-MM-dd'T'HH:mm") + def parsedDate = sdf.parse(displayValue) + formattedValue = ui.formatDatePretty(parsedDate) + } catch (Exception e) { + // fallback to raw string if parsing fails + formattedValue = displayValue + } + } else { + formattedValue = displayValue + } + %> +
+ + ${status.label}${status.label ? ': ' : ''} + + + ${formattedValue} + +
+ <% } %> +
+
From f5bb6df0d9a2a4a99af995d21cabd7b5e0f6834c Mon Sep 17 00:00:00 2001 From: Dutervil Date: Tue, 9 Sep 2025 14:53:54 -0400 Subject: [PATCH 2/3] change variable statusData to prenatalStatusData --- .../dashboardwidgets/VisitStatusFragmentController.java | 2 +- omod/src/main/webapp/fragments/dashboardwidgets/visitStatus.gsp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/omod/src/main/java/org/openmrs/module/pihcore/fragment/controller/dashboardwidgets/VisitStatusFragmentController.java b/omod/src/main/java/org/openmrs/module/pihcore/fragment/controller/dashboardwidgets/VisitStatusFragmentController.java index 9c9a63c5f..bdc516067 100644 --- a/omod/src/main/java/org/openmrs/module/pihcore/fragment/controller/dashboardwidgets/VisitStatusFragmentController.java +++ b/omod/src/main/java/org/openmrs/module/pihcore/fragment/controller/dashboardwidgets/VisitStatusFragmentController.java @@ -64,6 +64,6 @@ else if (patientConfig instanceof String) { } List statusData = statusDataEvaluator.evaluate(patient, configFileNode.asText()); statusData.removeIf(statusData1 -> !statusData1.isEnabled()); - model.put("statusData", statusData); + model.put("prenatalStatusData", statusData); } } diff --git a/omod/src/main/webapp/fragments/dashboardwidgets/visitStatus.gsp b/omod/src/main/webapp/fragments/dashboardwidgets/visitStatus.gsp index 321e0ecd0..835dd3e74 100644 --- a/omod/src/main/webapp/fragments/dashboardwidgets/visitStatus.gsp +++ b/omod/src/main/webapp/fragments/dashboardwidgets/visitStatus.gsp @@ -5,7 +5,7 @@
<% - statusData.each { status -> + prenatalStatusData.each { status -> def formattedValue def displayValue = status.displayValue From b79fccef94038ef0ec9ceada29c4d4c37f91f4c7 Mon Sep 17 00:00:00 2001 From: Dutervil Date: Fri, 12 Sep 2025 12:27:38 -0400 Subject: [PATCH 3/3] remove visitStatus.gsp and VisitStatusFragmentController.java --- .../VisitStatusFragmentController.java | 69 ------------------- .../dashboardwidgets/visitStatus.gsp | 42 ----------- 2 files changed, 111 deletions(-) delete mode 100644 omod/src/main/java/org/openmrs/module/pihcore/fragment/controller/dashboardwidgets/VisitStatusFragmentController.java delete mode 100644 omod/src/main/webapp/fragments/dashboardwidgets/visitStatus.gsp diff --git a/omod/src/main/java/org/openmrs/module/pihcore/fragment/controller/dashboardwidgets/VisitStatusFragmentController.java b/omod/src/main/java/org/openmrs/module/pihcore/fragment/controller/dashboardwidgets/VisitStatusFragmentController.java deleted file mode 100644 index bdc516067..000000000 --- a/omod/src/main/java/org/openmrs/module/pihcore/fragment/controller/dashboardwidgets/VisitStatusFragmentController.java +++ /dev/null @@ -1,69 +0,0 @@ -package org.openmrs.module.pihcore.fragment.controller.dashboardwidgets; - -import org.codehaus.jackson.JsonNode; -import org.openmrs.Patient; -import org.openmrs.api.PatientService; -import org.openmrs.module.appframework.domain.AppDescriptor; -import org.openmrs.module.emrapi.patient.PatientDomainWrapper; -import org.openmrs.module.pihcore.status.StatusData; -import org.openmrs.module.pihcore.status.StatusDataEvaluator; -import org.openmrs.ui.framework.UiUtils; -import org.openmrs.ui.framework.annotation.FragmentParam; -import org.openmrs.ui.framework.annotation.InjectBeans; -import org.openmrs.ui.framework.annotation.SpringBean; -import org.openmrs.ui.framework.fragment.FragmentConfiguration; -import org.openmrs.ui.framework.fragment.FragmentModel; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.util.List; - -public class VisitStatusFragmentController { - - private final Logger log = LoggerFactory.getLogger(getClass()); - - public void controller(@SpringBean("patientService") PatientService patientService, - @SpringBean("statusDataEvaluator") StatusDataEvaluator statusDataEvaluator, - @InjectBeans PatientDomainWrapper patientWrapper, - @FragmentParam("app") AppDescriptor app, - UiUtils ui, - FragmentConfiguration config, - FragmentModel model) { - - Object patientConfig = config.get("patient"); - if (patientConfig == null ) { - patientConfig = config.get("patientId"); - } - Patient patient = null; - if (patientConfig != null) { - if (patientConfig instanceof Patient) { - patient = (Patient) patientConfig; - } - else if (patientConfig instanceof PatientDomainWrapper) { - patient = ((PatientDomainWrapper) patientConfig).getPatient(); - } - else if (patientConfig instanceof Integer) { - patient = patientService.getPatient((Integer)patientConfig); - } - else if (patientConfig instanceof String) { - patient = patientService.getPatientByUuid((String)patientConfig); - } - } - if (patient == null) { - throw new IllegalArgumentException("No patient found in the status data fragment. Please pass patient into the configuration"); - } - - model.put("app", app); - model.put("icon", app.getConfig().get("icon").asText()); - model.put("label", app.getConfig().get("label").asText()); - - // Evaluate Status Data based on configFile specified in app configuration - JsonNode configFileNode = app.getConfig().get("configFile"); - if (configFileNode == null || configFileNode.asText() == null) { - throw new IllegalStateException("You must supply a configFile configuration to the statusData fragment"); - } - List statusData = statusDataEvaluator.evaluate(patient, configFileNode.asText()); - statusData.removeIf(statusData1 -> !statusData1.isEnabled()); - model.put("prenatalStatusData", statusData); - } -} diff --git a/omod/src/main/webapp/fragments/dashboardwidgets/visitStatus.gsp b/omod/src/main/webapp/fragments/dashboardwidgets/visitStatus.gsp deleted file mode 100644 index 835dd3e74..000000000 --- a/omod/src/main/webapp/fragments/dashboardwidgets/visitStatus.gsp +++ /dev/null @@ -1,42 +0,0 @@ -
-
- -

${ ui.message(label) }

-
-
- <% - prenatalStatusData.each { status -> - def formattedValue - def displayValue = status.displayValue - - if (displayValue != null && displayValue instanceof String) { - displayValue = displayValue.replace('{{contextPath}}', contextPath) - } - - if (displayValue instanceof Date) { - formattedValue = ui.formatDatePretty(displayValue) - } else if (displayValue instanceof String) { - try { - // updated format for "2025-09-10T00:00" - def sdf = new java.text.SimpleDateFormat("yyyy-MM-dd'T'HH:mm") - def parsedDate = sdf.parse(displayValue) - formattedValue = ui.formatDatePretty(parsedDate) - } catch (Exception e) { - // fallback to raw string if parsing fails - formattedValue = displayValue - } - } else { - formattedValue = displayValue - } - %> -
- - ${status.label}${status.label ? ': ' : ''} - - - ${formattedValue} - -
- <% } %> -
-