Skip to content
Open
Show file tree
Hide file tree
Changes from all 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
Expand Up @@ -10,6 +10,7 @@

import com.divudi.bean.clinical.*;
import com.divudi.bean.common.BillController;
import com.divudi.bean.common.ConfigOptionApplicationController;
import com.divudi.bean.common.SearchController;
import com.divudi.bean.common.SessionController;

Expand Down Expand Up @@ -143,6 +144,9 @@ public class InpatientClinicalDataController implements Serializable {
@Inject
private FavouriteController favouriteController;

@Inject
private ConfigOptionApplicationController configOptionApplicationController;

private Patient patient;

private List<DocumentTemplate> userDocumentTemplates;
Expand Down Expand Up @@ -227,6 +231,11 @@ public class InpatientClinicalDataController implements Serializable {

private Upload selectedDiagnosisCardTemplate;
private Upload selectedDiagnosisCard;

// Diagnosis card types - Ward Admission and Local Surgery
private String wardAdmissionDiagnosisCardHtml;
private String localSurgeryDiagnosisCardHtml;
private String selectedDiagnosisCardTypeHtml;

@Deprecated
public void calculateBmi() {
Expand Down Expand Up @@ -481,6 +490,55 @@ public Upload findAndReplaceText(Upload upload, Map<String, String> replacements
return upload;
}

/**
* Load and display Ward Admission Diagnosis Card with variable replacement
*/
public void loadWardAdmissionDiagnosisCard() {
if (current == null) {
JsfUtil.addErrorMessage("No patient encounter selected");
return;
}
String templateHtml = configOptionApplicationController.getLongTextValueByKey("Ward Admission Diagnosis Card Template", "");
if (templateHtml == null || templateHtml.isEmpty()) {
JsfUtil.addErrorMessage("Ward Admission Diagnosis Card template not configured");
return;
}
Map<String, String> replacements = createReplacementsMap(current);
wardAdmissionDiagnosisCardHtml = replaceVariablesInHtml(templateHtml, replacements);
selectedDiagnosisCardTypeHtml = wardAdmissionDiagnosisCardHtml;
}

/**
* Load and display Local Surgery Diagnosis Card with variable replacement
*/
public void loadLocalSurgeryDiagnosisCard() {
if (current == null) {
JsfUtil.addErrorMessage("No patient encounter selected");
return;
}
String templateHtml = configOptionApplicationController.getLongTextValueByKey("Local Surgery Diagnosis Card Template", "");
if (templateHtml == null || templateHtml.isEmpty()) {
JsfUtil.addErrorMessage("Local Surgery Diagnosis Card template not configured");
return;
}
Map<String, String> replacements = createReplacementsMap(current);
localSurgeryDiagnosisCardHtml = replaceVariablesInHtml(templateHtml, replacements);
selectedDiagnosisCardTypeHtml = localSurgeryDiagnosisCardHtml;
}
Comment on lines +493 to +527
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Reset diagnosis card HTML on failure and ensure encounter context is fully prepared

In loadWardAdmissionDiagnosisCard() / loadLocalSurgeryDiagnosisCard():

if (current == null) {
    JsfUtil.addErrorMessage("No patient encounter selected");
    return;
}
String templateHtml = configOptionApplicationController.getLongTextValueByKey(...);
if (templateHtml == null || templateHtml.isEmpty()) {
    JsfUtil.addErrorMessage("... template not configured");
    return;
}
Map<String, String> replacements = createReplacementsMap(current);
wardAdmissionDiagnosisCardHtml = replaceVariablesInHtml(templateHtml, replacements);
selectedDiagnosisCardTypeHtml = wardAdmissionDiagnosisCardHtml;

Two points:

  1. Stale HTML when validation fails
  • On the early returns (no current, or missing template), wardAdmissionDiagnosisCardHtml / localSurgeryDiagnosisCardHtml and selectedDiagnosisCardTypeHtml are left unchanged.
  • Because the UI always opens the dialog in oncomplete, this can show a previous patient’s card (or previous encounter) when the current call fails, which is misleading and potentially sensitive.

Consider clearing state at the start of each method:

public void loadWardAdmissionDiagnosisCard() {
    wardAdmissionDiagnosisCardHtml = null;
    selectedDiagnosisCardTypeHtml = null;

    if (current == null) {
        JsfUtil.addErrorMessage("No patient encounter selected");
        return;
    }
    ...
}

(and similarly for localSurgeryDiagnosisCardHtml).

  1. Robustness of createReplacementsMap(current)
  • createReplacementsMap() iterates over lists like getEncounterInvestigations(), getEncounterProcedures(), getPatientAllergies(), etc. Some getters (e.g. getEncounterInvestigations()) can return null until fillCurrentEncounterLists(current) / fillCurrentPatientLists(current.getPatient()) have been called.
  • Today those fill methods are invoked in the navigation methods that lead to clinical_data.xhtml, but these new loaders are now also called from admission_profile.xhtml. If current is ever set without also populating the encounter lists, you could get NullPointerExceptions here.

A defensive pattern would be:

if (current != null) {
    fillCurrentPatientLists(current.getPatient());
    fillCurrentEncounterLists(current);
}
Map<String, String> replacements = createReplacementsMap(current);

before building the HTML, to ensure all lists are in a known good state.

🤖 Prompt for AI Agents
In @src/main/java/com/divudi/bean/inward/InpatientClinicalDataController.java
around lines 493-527, Reset the diagnosis card HTML state at the start of each
loader and ensure encounter/patient lists are populated before building
replacements: in loadWardAdmissionDiagnosisCard() and
loadLocalSurgeryDiagnosisCard() clear wardAdmissionDiagnosisCardHtml /
localSurgeryDiagnosisCardHtml and selectedDiagnosisCardTypeHtml immediately,
then if current != null call fillCurrentPatientLists(current.getPatient()) and
fillCurrentEncounterLists(current) before invoking
createReplacementsMap(current) and replaceVariablesInHtml(...); this prevents
stale HTML on early returns and avoids NPEs inside createReplacementsMap when
encounter/patient lists are null.


/**
* Replace variables in HTML with actual values using the replacements map
*/
public String replaceVariablesInHtml(String htmlTemplate, Map<String, String> replacements) {
String result = htmlTemplate;
for (Map.Entry<String, String> replacement : replacements.entrySet()) {
if (replacement.getValue() != null) {
result = result.replace("{{" + replacement.getKey().substring(1, replacement.getKey().length() - 1) + "}}", replacement.getValue());
}
}
return result;
}

public String generateDocumentFromTemplate(DocumentTemplate t, PatientEncounter e) {

if (t == null) {
Expand Down Expand Up @@ -3189,6 +3247,30 @@ public Upload getSelectedDiagnosisCard() {
return selectedDiagnosisCard;
}

public String getWardAdmissionDiagnosisCardHtml() {
return wardAdmissionDiagnosisCardHtml;
}

public void setWardAdmissionDiagnosisCardHtml(String wardAdmissionDiagnosisCardHtml) {
this.wardAdmissionDiagnosisCardHtml = wardAdmissionDiagnosisCardHtml;
}

public String getLocalSurgeryDiagnosisCardHtml() {
return localSurgeryDiagnosisCardHtml;
}

public void setLocalSurgeryDiagnosisCardHtml(String localSurgeryDiagnosisCardHtml) {
this.localSurgeryDiagnosisCardHtml = localSurgeryDiagnosisCardHtml;
}

public String getSelectedDiagnosisCardTypeHtml() {
return selectedDiagnosisCardTypeHtml;
}

public void setSelectedDiagnosisCardTypeHtml(String selectedDiagnosisCardTypeHtml) {
this.selectedDiagnosisCardTypeHtml = selectedDiagnosisCardTypeHtml;
}

public void setSelectedDiagnosisCard(Upload selectedDiagnosisCard) {
this.selectedDiagnosisCard = selectedDiagnosisCard;
}
Expand Down
80 changes: 79 additions & 1 deletion src/main/webapp/inward/admission_profile.xhtml
Original file line number Diff line number Diff line change
Expand Up @@ -345,12 +345,32 @@
class="w-100">
</p:commandButton>
<p:commandButton
value="Diagnosis Card"
value="Diagnosis Card (Legacy)"
ajax="false"
action="#{admissionController.navigateToInpatientDiagnosisCard()}"
icon="fa fa-diagnoses"
class="w-100">
</p:commandButton>
<p:commandButton
value="Ward Admission Card"
ajax="true"
icon="pi pi-document"
styleClass="ui-button-success w-100"
action="#{inpatientClinicalDataController.loadWardAdmissionDiagnosisCard}"
oncomplete="PF('wardDiagnosisDialogDashboard').show()"
process="@this"
update="wardDiagnosisPanelDashboard">
</p:commandButton>
<p:commandButton
value="Local Surgery Card"
ajax="true"
icon="pi pi-document"
styleClass="ui-button-info w-100"
action="#{inpatientClinicalDataController.loadLocalSurgeryDiagnosisCard}"
oncomplete="PF('surgeryDiagnosisDialogDashboard').show()"
process="@this"
update="surgeryDiagnosisPanelDashboard">
</p:commandButton>
Comment on lines +348 to +373
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

find . -type f -name "*InpatientClinicalDataController*"

Repository: hmislk/hmis

Length of output: 130


🏁 Script executed:

find . -type f -name "admission_profile.xhtml"

Repository: hmislk/hmis

Length of output: 103


🏁 Script executed:

rg "loadWardAdmissionDiagnosisCard|loadLocalSurgeryDiagnosisCard" -A 10 -B 2

Repository: hmislk/hmis

Length of output: 11016


🏁 Script executed:

head -100 ./src/main/webapp/inward/admission_profile.xhtml

Repository: hmislk/hmis

Length of output: 5777


🏁 Script executed:

rg "inpatientClinicalDataController|admissionController" ./src/main/webapp/inward/admission_profile.xhtml | head -30

Repository: hmislk/hmis

Length of output: 3203


🏁 Script executed:

head -150 ./src/main/webapp/inward/clinical_data.xhtml

Repository: hmislk/hmis

Length of output: 9534


🏁 Script executed:

grep -n "current\|setCurrent\|fillCurrentEncounterLists" ./src/main/java/com/divudi/bean/inward/InpatientClinicalDataController.java | head -40

Repository: hmislk/hmis

Length of output: 2410


🏁 Script executed:

grep -n "setCurrent\|public.*current\|@PostConstruct\|preRender\|postLoad" ./src/main/java/com/divudi/bean/inward/InpatientClinicalDataController.java | head -20

Repository: hmislk/hmis

Length of output: 567


🏁 Script executed:

rg "inpatientClinicalDataController\.current\s*=" ./src/main/webapp/inward/admission_profile.xhtml

Repository: hmislk/hmis

Length of output: 37


🏁 Script executed:

rg "f:viewAction|p:ajax.*event=\"load\"|@PostConstruct" ./src/main/webapp/inward/admission_profile.xhtml

Repository: hmislk/hmis

Length of output: 37


🏁 Script executed:

rg "preRender\|viewAction\|PostConstruct" ./src/main/java/com/divudi/bean/inward/InpatientClinicalDataController.java -B 2 -A 5

Repository: hmislk/hmis

Length of output: 37


🏁 Script executed:

cat ./src/main/java/com/divudi/bean/inward/InpatientClinicalDataController.java | grep -A 5 "public void setCurrent"

Repository: hmislk/hmis

Length of output: 709


🏁 Script executed:

grep -n "navigateToAdmissionProfilePage" ./src/main/java/com/divudi/bean/inward/AdmissionController.java -A 10

Repository: hmislk/hmis

Length of output: 456


🏁 Script executed:

grep -n "f:setPropertyActionListener\|inpatientClinicalDataController" ./src/main/webapp/inward/admission_profile.xhtml

Repository: hmislk/hmis

Length of output: 3250


🏁 Script executed:

grep -n "p:ajax.*load\|p:poll" ./src/main/webapp/inward/admission_profile.xhtml

Repository: hmislk/hmis

Length of output: 37


🏁 Script executed:

wc -l ./src/main/webapp/inward/admission_profile.xhtml

Repository: hmislk/hmis

Length of output: 107


🏁 Script executed:

tail -200 ./src/main/webapp/inward/admission_profile.xhtml | head -100

Repository: hmislk/hmis

Length of output: 6598


🏁 Script executed:

sed -n '340,380p' ./src/main/webapp/inward/admission_profile.xhtml

Repository: hmislk/hmis

Length of output: 2470


🏁 Script executed:

grep -B 20 "loadWardAdmissionDiagnosisCard\|loadLocalSurgeryDiagnosisCard" ./src/main/webapp/inward/admission_profile.xhtml | head -50

Repository: hmislk/hmis

Length of output: 2018


🏁 Script executed:

grep -n "f:setPropertyActionListener.*inpatientClinicalDataController" ./src/main/webapp/inward/admission_profile.xhtml

Repository: hmislk/hmis

Length of output: 37


🏁 Script executed:

sed -n '1,100p' ./src/main/webapp/inward/admission_profile.xhtml | grep -i "ajax\|listener\|load\|init"

Repository: hmislk/hmis

Length of output: 654


🏁 Script executed:

grep -n "p:ajax.*event=\"load\"\|p:remoteCommand\|onload" ./src/main/webapp/inward/admission_profile.xhtml

Repository: hmislk/hmis

Length of output: 37


🏁 Script executed:

grep -n "private.*current\|public.*getCurrent\|patientEncounter" ./src/main/java/com/divudi/bean/inward/AdmissionController.java | head -20

Repository: hmislk/hmis

Length of output: 1222


🏁 Script executed:

grep -n "navigateToAdmissionProfilePage\|navigateToInpatientClinicalData\|clinical_data" ./src/main/java/com/divudi/bean/inward/AdmissionController.java -A 5 | head -40

Repository: hmislk/hmis

Length of output: 564


🏁 Script executed:

grep -rn "inpatientClinicalDataController.setCurrent\|inpatientClinicalDataController.*current\s*=" ./src/main/webapp/inward/ --include="*.xhtml"

Repository: hmislk/hmis

Length of output: 37


🏁 Script executed:

rg "navigateToClinical|clinical_data" ./src/main/java/com/divudi/bean/inward/AdmissionController.java -A 8

Repository: hmislk/hmis

Length of output: 37


🏁 Script executed:

grep -n "class Admission\|extends PatientEncounter" ./src/main/java/com/divudi/entity/Admission.java | head -5

Repository: hmislk/hmis

Length of output: 136


🏁 Script executed:

grep -n "class PatientEncounter\|private.*Admission\|getEncounter\|patientEncounter" ./src/main/java/com/divudi/entity/Admission.java | head -20

Repository: hmislk/hmis

Length of output: 136


🏁 Script executed:

rg "navigateToAdmissionProfilePage" ./src/main/webapp/inward/ --include="*.xhtml" -B 5 -A 5

Repository: hmislk/hmis

Length of output: 496


🏁 Script executed:

find . -type f -name "Admission.java"

Repository: hmislk/hmis

Length of output: 115


🏁 Script executed:

rg "navigateToAdmissionProfilePage" ./src/main/webapp/inward/ -B 5 -A 5

Repository: hmislk/hmis

Length of output: 9073


🏁 Script executed:

grep -n "class Admission" ./src/main/java/com/divudi/entity/inward/Admission.java | head -3

Repository: hmislk/hmis

Length of output: 143


🏁 Script executed:

grep -n "class Admission" ./src/main/java/com/divudi/core/entity/inward/Admission.java | head -3

Repository: hmislk/hmis

Length of output: 131


🏁 Script executed:

grep -n "extends PatientEncounter\|implements PatientEncounter" ./src/main/java/com/divudi/core/entity/inward/Admission.java

Repository: hmislk/hmis

Length of output: 131


🏁 Script executed:

head -50 ./src/main/java/com/divudi/core/entity/inward/Admission.java

Repository: hmislk/hmis

Length of output: 348


🏁 Script executed:

grep -n "inpatientClinicalDataController.current\|setCurrent" ./src/main/webapp/inward/admission_profile.xhtml

Repository: hmislk/hmis

Length of output: 37


🏁 Script executed:

sed -n '1,20p' ./src/main/webapp/inward/admission_profile.xhtml

Repository: hmislk/hmis

Length of output: 1120


Sync InpatientClinicalDataController.current before invoking Ward/Local Surgery Card buttons

These buttons call inpatientClinicalDataController.loadWardAdmissionDiagnosisCard and loadLocalSurgeryDiagnosisCard, which both guard against null current and return early with "No patient encounter selected" if not initialized. Since this page never propagates admissionController.current to inpatientClinicalDataController.current, clicking these buttons will fail with an error unless the user reached this page through navigateToInpatientClinicalData() (which explicitly sets the current).

Add <f:setPropertyActionListener value="#{admissionController.current}" target="#{inpatientClinicalDataController.current}" /> to at least one of the buttons, or use an actionListener to synchronize before the action fires.

🤖 Prompt for AI Agents
In @src/main/webapp/inward/admission_profile.xhtml around lines 348-373, The
Ward and Local Surgery buttons call
inpatientClinicalDataController.loadWardAdmissionDiagnosisCard and
loadLocalSurgeryDiagnosisCard but never set
inpatientClinicalDataController.current from admissionController.current,
causing a null-current early return; fix by adding a pre-action sync such as an
<f:setPropertyActionListener> (value="#{admissionController.current}"
target="#{inpatientClinicalDataController.current}") or an actionListener that
sets inpatientClinicalDataController.current before invoking the
loadWardAdmissionDiagnosisCard / loadLocalSurgeryDiagnosisCard actions so the
controller has the selected encounter (alternatively mirror how
navigateToInpatientClinicalData() assigns current).

</div>
</p:panel>

Expand Down Expand Up @@ -525,6 +545,64 @@
</div>
</p:panel>

<!-- Ward Admission Diagnosis Card Dialog - Dashboard -->
<p:dialog id="wardDiagnosisDlgDashboard" widgetVar="wardDiagnosisDialogDashboard" modal="true" width="90%" height="90%" header="Ward Admission Diagnosis Card">
<h:panelGroup id="wardDiagnosisPanelDashboard">
<div class="card">
<div class="card-body">
<h:outputText value="#{inpatientClinicalDataController.wardAdmissionDiagnosisCardHtml}" escape="false" rendered="#{inpatientClinicalDataController.wardAdmissionDiagnosisCardHtml ne null}"/>
</div>
<div class="card-footer">
<p:commandButton
value="Print"
ajax="true"
icon="pi pi-print"
styleClass="ui-button-success">
<p:printer target="wardDiagnosisPanelDashboard" />
</p:commandButton>
<p:commandButton
value="Close"
ajax="true"
icon="pi pi-times"
oncomplete="PF('wardDiagnosisDialogDashboard').hide()"
styleClass="ui-button-secondary">
</p:commandButton>
</div>
</div>
</h:panelGroup>
</p:dialog>

<!-- Local Surgery Diagnosis Card Dialog - Dashboard -->
<p:dialog id="surgeryDiagnosisDlgDashboard" widgetVar="surgeryDiagnosisDialogDashboard" modal="true" width="90%" height="90%" header="Local Surgery Diagnosis Card">
<h:panelGroup id="surgeryDiagnosisPanelDashboard">
<div class="card">
<div class="card-body">
<h:outputText value="#{inpatientClinicalDataController.localSurgeryDiagnosisCardHtml}" escape="false" rendered="#{inpatientClinicalDataController.localSurgeryDiagnosisCardHtml ne null}"/>
</div>
<div class="card-footer">
<p:commandButton
value="Print"
ajax="true"
icon="pi pi-print"
styleClass="ui-button-success">
<p:printer target="surgeryDiagnosisPanelDashboard" />
</p:commandButton>
<p:commandButton
value="Close"
ajax="true"
icon="pi pi-times"
oncomplete="PF('surgeryDiagnosisDialogDashboard').hide()"
styleClass="ui-button-secondary">
</p:commandButton>
</div>
</div>
</h:panelGroup>
</p:dialog>

</h:form>
</ui:define>
</ui:composition>




Expand Down
122 changes: 110 additions & 12 deletions src/main/webapp/inward/clinical_data.xhtml
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,29 @@
<f:setPropertyActionListener value="#{bhtEditController.current.patient}" target="#{patientController.current}" ></f:setPropertyActionListener>
</p:commandButton>

<!-- Diagnosis Card Type Buttons -->
<p:commandButton
ajax="true"
icon="pi pi-document"
value="Ward Admission Card"
class="m-1 p-0 ui-button-success"
action="#{inpatientClinicalDataController.loadWardAdmissionDiagnosisCard}"
oncomplete="PF('wardDiagnosisDialog').show()"
process="@this"
update="wardDiagnosisPanel">
</p:commandButton>

<p:commandButton
ajax="true"
icon="pi pi-document"
value="Surgery Card"
class="m-1 p-0 ui-button-info"
action="#{inpatientClinicalDataController.loadLocalSurgeryDiagnosisCard}"
oncomplete="PF('surgeryDiagnosisDialog').show()"
process="@this"
update="surgeryDiagnosisPanel">
</p:commandButton>
Comment on lines +59 to +80
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Align naming and avoid confusing duplication for diagnosis card buttons

You now have four labels for essentially two concepts:

  • Header: Ward Admission Card / Surgery Card
  • Diagnosis tab section: Ward Admission Diagnosis Card / Local Surgery Diagnosis Card

All four trigger the same two controller methods and dialogs, so this inconsistency is likely to confuse users and makes the UI harder to document.

Consider:

  • Using consistent wording for each card type across header and tab sections (e.g., always “Ward Admission Diagnosis Card” and “Local Surgery Diagnosis Card”).
  • Optionally de‑duplicating the buttons (e.g., keep either header shortcuts or the section, not both) to simplify the UX, unless both placements are intentionally required.

Also applies to: 626-659

🤖 Prompt for AI Agents
In @src/main/webapp/inward/clinical_data.xhtml around lines 59-80, The button
labels are inconsistent and duplicate concepts across header and tab sections,
causing confusion; update the value attributes so wording is consistent across
both places (use either "Ward Admission Diagnosis Card" and "Local Surgery
Diagnosis Card" everywhere) and/or remove duplicate buttons if redundant;
specifically harmonize the values for the p:commandButton elements that call
inpatientClinicalDataController.loadWardAdmissionDiagnosisCard /
loadLocalSurgeryDiagnosisCard and ensure the oncomplete targets
PF('wardDiagnosisDialog') and PF('surgeryDiagnosisDialog') match the chosen
labels so header shortcuts and tab labels consistently refer to the same dialog
and controller actions.


</div>
</div>
<div class="row" >
Expand Down Expand Up @@ -600,21 +623,96 @@
value="#{inpatientClinicalDataController.selectedDiagnosisCard.comments}">
</p:textEditor>




<!-- Diagnosis Card Types Section -->
<div class="card m-2 p-2">
<div class="card-header">
<h:outputLabel value="System-Based Diagnosis Cards" />
</div>
<div class="card-body">
<div class="row">
<div class="col-md-6">
<p:commandButton
value="Ward Admission Diagnosis Card"
ajax="true"
icon="pi pi-document"
styleClass="ui-button-success w-100"
action="#{inpatientClinicalDataController.loadWardAdmissionDiagnosisCard}"
oncomplete="PF('wardDiagnosisDialog').show()"
process="@this"
update="wardDiagnosisPanel">
</p:commandButton>
</div>
<div class="col-md-6">
<p:commandButton
value="Local Surgery Diagnosis Card"
ajax="true"
icon="pi pi-document"
styleClass="ui-button-info w-100"
action="#{inpatientClinicalDataController.loadLocalSurgeryDiagnosisCard}"
oncomplete="PF('surgeryDiagnosisDialog').show()"
process="@this"
update="surgeryDiagnosisPanel">
</p:commandButton>
</div>
</div>
</div>
</div>

</p:tab>
</p:tabView>
</div>
</div>



</h:form>

</ui:define>
</ui:composition>

</h:body>
</html>
<!-- Ward Admission Diagnosis Card Dialog -->
<p:dialog id="wardDiagnosisDlg" widgetVar="wardDiagnosisDialog" modal="true" width="90%" height="90%" header="Ward Admission Diagnosis Card">
<h:panelGroup id="wardDiagnosisPanel">
<div class="card">
<div class="card-body">
<h:outputText value="#{inpatientClinicalDataController.wardAdmissionDiagnosisCardHtml}" escape="false" rendered="#{inpatientClinicalDataController.wardAdmissionDiagnosisCardHtml ne null}"/>
</div>
<div class="card-footer">
<p:commandButton
value="Print"
ajax="true"
icon="pi pi-print"
styleClass="ui-button-success">
<p:printer target="wardDiagnosisPanel" />
</p:commandButton>
<p:commandButton
value="Close"
ajax="true"
icon="pi pi-times"
oncomplete="PF('wardDiagnosisDialog').hide()"
styleClass="ui-button-secondary">
</p:commandButton>
</div>
</div>
</h:panelGroup>
</p:dialog>

<!-- Local Surgery Diagnosis Card Dialog -->
<p:dialog id="surgeryDiagnosisDlg" widgetVar="surgeryDiagnosisDialog" modal="true" width="90%" height="90%" header="Local Surgery Diagnosis Card">
<h:panelGroup id="surgeryDiagnosisPanel">
<div class="card">
<div class="card-body">
<h:outputText value="#{inpatientClinicalDataController.localSurgeryDiagnosisCardHtml}" escape="false" rendered="#{inpatientClinicalDataController.localSurgeryDiagnosisCardHtml ne null}"/>
</div>
<div class="card-footer">
<p:commandButton
value="Print"
ajax="true"
icon="pi pi-print"
styleClass="ui-button-success">
<p:printer target="surgeryDiagnosisPanel" />
</p:commandButton>
<p:commandButton
value="Close"
ajax="true"
icon="pi pi-times"
oncomplete="PF('surgeryDiagnosisDialog').hide()"
styleClass="ui-button-secondary">
</p:commandButton>
</div>
</div>
</h:panelGroup>
</p:dialog>
Loading