Skip to content
Open
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -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> statusData = statusDataEvaluator.evaluate(patient, configFileNode.asText());
statusData.removeIf(statusData1 -> !statusData1.isEnabled());
model.put("prenatalStatusData", statusData);
}
}
42 changes: 42 additions & 0 deletions omod/src/main/webapp/fragments/dashboardwidgets/visitStatus.gsp
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
<div class="info-section status-data-widget ${app.id}">
<div class="info-header">
<i class="${icon}"></i>
<h3>${ ui.message(label) }</h3>
</div>
<div class="info-body">
<%
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
}
%>
<div>
<span class="patient-dashboard-widget-label">
${status.label}${status.label ? ': ' : ''}
</span>
<span class="patient-dashboard-widget-value ${status.displayFormat}">
${formattedValue}
</span>
</div>
<% } %>
</div>
</div>