/* * PatientView * * Copyright (c) Worth Solutions Limited 2004-2013 * * This file is part of PatientView. * * PatientView is free software: you can redistribute it and/or modify it under the terms of the * GNU General Public License as published by the Free Software Foundation, either version 3 of the License, * or (at your option) any later version. * PatientView is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License along with PatientView in a file * titled COPYING. If not, see <http://www.gnu.org/licenses/>. * * @package PatientView * @link http://www.patientview.org * @author PatientView <info@patientview.org> * @copyright Copyright (c) 2004-2013, Worth Solutions Limited * @license http://www.gnu.org/licenses/gpl-3.0.html The GNU General Public License V3.0 */ package org.patientview.radar.web.panels.followup; import org.apache.wicket.Component; import org.apache.wicket.MarkupContainer; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.ajax.markup.html.AjaxLink; import org.apache.wicket.ajax.markup.html.form.AjaxSubmitLink; import org.apache.wicket.authroles.authentication.AuthenticatedWebSession; import org.apache.wicket.datetime.PatternDateConverter; import org.apache.wicket.datetime.markup.html.basic.DateLabel; import org.apache.wicket.extensions.markup.html.form.DateTextField; import org.apache.wicket.feedback.FeedbackMessage; import org.apache.wicket.feedback.IFeedbackMessageFilter; import org.apache.wicket.markup.html.WebMarkupContainer; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.form.ChoiceRenderer; import org.apache.wicket.markup.html.form.Form; import org.apache.wicket.markup.html.form.TextField; import org.apache.wicket.markup.html.list.ListItem; import org.apache.wicket.markup.html.list.ListView; import org.apache.wicket.markup.html.panel.FeedbackPanel; import org.apache.wicket.markup.html.panel.Panel; import org.apache.wicket.model.AbstractReadOnlyModel; import org.apache.wicket.model.CompoundPropertyModel; import org.apache.wicket.model.IModel; import org.apache.wicket.model.LoadableDetachableModel; import org.apache.wicket.model.Model; import org.apache.wicket.model.PropertyModel; import org.apache.wicket.spring.injection.annot.SpringBean; import org.patientview.radar.model.Diagnosis; import org.patientview.radar.model.Transplant; import org.patientview.radar.model.exception.InvalidModelException; import org.patientview.radar.model.user.User; import org.patientview.radar.service.DiagnosisManager; import org.patientview.radar.service.PatientManager; import org.patientview.radar.service.TransplantManager; import org.patientview.radar.service.TreatmentManager; import org.patientview.radar.web.RadarApplication; import org.patientview.radar.web.RadarSecuredSession; import org.patientview.radar.web.behaviours.RadarBehaviourFactory; import org.patientview.radar.web.components.RadarDateTextField; import org.patientview.radar.web.components.RadarRequiredDateTextField; import org.patientview.radar.web.components.RadarRequiredDropdownChoice; import org.patientview.radar.web.components.YesNoRadioGroup; import org.patientview.radar.web.models.RadarModelFactory; import org.patientview.radar.web.panels.FollowUpPanel; import org.patientview.radar.web.panels.tables.DialysisTablePanel; import java.util.ArrayList; import java.util.Collections; import java.util.Date; import java.util.List; public class RrtTherapyPanel extends Panel { @SpringBean private DiagnosisManager diagnosisManager; @SpringBean private TransplantManager transplantManager; @SpringBean private PatientManager patientManager; public RrtTherapyPanel(String id, final IModel<Long> radarNumberModel) { super(id); setOutputMarkupId(true); setOutputMarkupPlaceholderTag(true); // General details TextField radarNumber = new TextField("radarNumber", radarNumberModel); radarNumber.setEnabled(false); add(radarNumber); add(new TextField("hospitalNumber", RadarModelFactory.getHospitalNumberModel(radarNumberModel, patientManager))); add(new TextField("diagnosis", new PropertyModel(RadarModelFactory.getDiagnosisCodeModel(radarNumberModel, diagnosisManager), "abbreviation"))); add(new TextField("firstName", RadarModelFactory.getFirstNameModel(radarNumberModel, patientManager))); add(new TextField("surname", RadarModelFactory.getSurnameModel(radarNumberModel, patientManager))); add(new DateTextField("dob", RadarModelFactory.getDobModel(radarNumberModel, patientManager), RadarApplication.DATE_PATTERN)); final IModel<Date> esrfDateModel = new LoadableDetachableModel<Date>() { @Override protected Date load() { Diagnosis diagnosis = RadarModelFactory.getDiagnosisModel(radarNumberModel, diagnosisManager) .getObject(); if (diagnosis != null) { return diagnosis.getEsrfDate(); } return null; } }; add(new DateLabel("esrfDate", esrfDateModel, new PatternDateConverter(RadarApplication.DATE_PATTERN, true)) { @Override public boolean isVisible() { return esrfDateModel.getObject() != null; } }); add(new WebMarkupContainer("esrfNotEnteredContainer") { @Override public boolean isVisible() { return esrfDateModel.getObject() == null; } }); // Reusable panel for the dialysis table add(new DialysisTablePanel("dialysisContainer", radarNumberModel)); final IModel transplantListModel = new AbstractReadOnlyModel<List>() { @Override public List getObject() { if (radarNumberModel.getObject() != null) { return transplantManager.getTransplantsByRadarNumber(radarNumberModel.getObject()); } return Collections.emptyList(); } }; final IModel editTransplantModel = new Model<Transplant>(); final List<Component> addTransplantFormComponentsToUpdate = new ArrayList<Component>(); final List<Component> editTransplantFormComponentsToUpdate = new ArrayList<Component>(); final WebMarkupContainer transplantsContainer = new WebMarkupContainer("transplantsContainer"); add(transplantsContainer); transplantsContainer.setOutputMarkupPlaceholderTag(true); transplantsContainer.setOutputMarkupId(true); // Container for edit transplants final MarkupContainer editTransplantContainer = new WebMarkupContainer("editTransplantContainer") { @Override public boolean isVisible() { return editTransplantModel.getObject() != null; } }; editTransplantContainer.setOutputMarkupPlaceholderTag(true); editTransplantContainer.setOutputMarkupPlaceholderTag(true); add(editTransplantContainer); final IModel<Transplant.RejectData> addRejectModel = new CompoundPropertyModel<Transplant.RejectData>( new Model<Transplant.RejectData>()); // Container for reject transplants final MarkupContainer rejectDataContainer = new WebMarkupContainer("rejectDataContainer") { @Override public boolean isVisible() { return addRejectModel.getObject() != null; } }; rejectDataContainer.setOutputMarkupPlaceholderTag(true); rejectDataContainer.setOutputMarkupId(true); add(rejectDataContainer); // Transplants table transplantsContainer.add(new ListView<Transplant>("transplants", transplantListModel) { @Override protected void populateItem(final ListItem<Transplant> item) { item.setModel(new CompoundPropertyModel<Transplant>(item.getModelObject())); item.add(DateLabel.forDatePattern("date", RadarApplication.DATE_PATTERN)); item.add(new Label("modality.description")); item.add(new Label("recurr", new AbstractReadOnlyModel<Object>() { @Override public Object getObject() { return Boolean.TRUE.equals(item.getModelObject().getRecurr()) ? "yes" : "no"; } })); item.add(DateLabel.forDatePattern("dateRecurr", RadarApplication.DATE_PATTERN)); item.add(DateLabel.forDatePattern("dateFailureRejectData.failureDate", RadarApplication.DATE_PATTERN)); IModel rejectDataListModel = new AbstractReadOnlyModel<List>() { @Override public List getObject() { return transplantManager.getRejectDataByTransplantNumber(item.getModelObject().getId()); } }; final WebMarkupContainer rejectDataListContainer = new WebMarkupContainer("rejectDataListContainer"); rejectDataListContainer.setOutputMarkupId(true); rejectDataContainer.setOutputMarkupPlaceholderTag(true); rejectDataListContainer.add(new ListView<Transplant.RejectData>("rejectDataList", rejectDataListModel) { @Override protected void populateItem(final ListItem<Transplant.RejectData> rejectDataListItem) { rejectDataListItem.setModel(new CompoundPropertyModel<Transplant.RejectData>( rejectDataListItem.getModelObject())); rejectDataListItem.add(DateLabel.forDatePattern("rejectedDate", RadarApplication.DATE_PATTERN)); rejectDataListItem.add(DateLabel.forDatePattern("biopsyDate", RadarApplication.DATE_PATTERN)); AjaxLink ajaxDeleteLink = new AjaxLink("deleteLink") { @Override public void onClick(AjaxRequestTarget target) { transplantManager.deleteRejectData(rejectDataListItem.getModelObject()); target.add(rejectDataListContainer); } }; rejectDataListItem.add(ajaxDeleteLink); ajaxDeleteLink.add(RadarBehaviourFactory.getDeleteConfirmationBehaviour()); AuthenticatedWebSession session = RadarSecuredSession.get(); if (session.isSignedIn()) { if (session.getRoles().hasRole(User.ROLE_PATIENT)) { ajaxDeleteLink.setVisible(false); } } } }); item.add(rejectDataListContainer); // Delete, edit and add reject buttons AjaxLink ajaxDeleteLink = new AjaxLink("deleteLink") { @Override public void onClick(AjaxRequestTarget target) { Transplant transplant = item.getModelObject(); transplantManager.deleteTransplant(transplant); target.add(addTransplantFormComponentsToUpdate.toArray(new Component[ addTransplantFormComponentsToUpdate.size()])); target.add(transplantsContainer); } }; item.add(ajaxDeleteLink); ajaxDeleteLink.add(RadarBehaviourFactory.getDeleteConfirmationBehaviour()); AjaxLink ajaxEditLink = new AjaxLink("editLink") { @Override public void onClick(AjaxRequestTarget target) { editTransplantModel.setObject(item.getModelObject()); target.add(editTransplantContainer); } }; item.add(ajaxEditLink); AjaxLink ajaxAddRejectLink = new AjaxLink("addRejectLink") { { if (item.getModelObject().getDateFailureRejectData() != null) { if (item.getModelObject().getDateFailureRejectData().getFailureDate() != null) { setVisible(false); } } } @Override public void onClick(AjaxRequestTarget target) { Transplant.RejectData rejectData = new Transplant.RejectData(); rejectData.setTransplantId(item.getModelObject().getId()); addRejectModel.setObject(rejectData); target.add(rejectDataContainer); } }; item.add(ajaxAddRejectLink); AuthenticatedWebSession session = RadarSecuredSession.get(); if (session.isSignedIn()) { if (session.getRoles().hasRole(User.ROLE_PATIENT)) { ajaxDeleteLink.setVisible(false); ajaxEditLink.setVisible(false); ajaxAddRejectLink.setVisible(false); } } } }); final List<Component> rejectDataComponentsToUpdate = new ArrayList<Component>(); // Form for adding reject data - model probably needs changing Form<Transplant.RejectData> rejectDataForm = new Form<Transplant.RejectData>("form", addRejectModel); rejectDataForm.add(new RadarDateTextField("rejectedDate", rejectDataForm, rejectDataComponentsToUpdate)); rejectDataForm.add(new RadarDateTextField("biopsyDate", rejectDataForm, rejectDataComponentsToUpdate)); rejectDataForm.add(new AjaxSubmitLink("add") { @Override protected void onSubmit(AjaxRequestTarget target, Form<?> form) { target.add(rejectDataContainer); target.add(transplantsContainer); target.add(rejectDataComponentsToUpdate.toArray(new Component[rejectDataComponentsToUpdate.size()])); try { transplantManager.saveRejectDataWithValidation((Transplant.RejectData) form.getModelObject()); } catch (InvalidModelException e) { for (String error : e.getErrors()) { error(error); } return; } addRejectModel.setObject(null); } @Override protected void onError(AjaxRequestTarget target, Form<?> form) { target.add(rejectDataComponentsToUpdate.toArray(new Component[rejectDataComponentsToUpdate.size()])); } }); rejectDataForm.add(new AjaxLink("cancel") { @Override public void onClick(AjaxRequestTarget target) { addRejectModel.setObject(null); target.add(rejectDataContainer); } }); rejectDataForm.add(DateLabel.forDatePattern("transplantDate", new Model<Date>(), "dd/MM/yyyy")); rejectDataContainer.add(rejectDataForm); rejectDataForm.add(new FeedbackPanel("dateRejectFeedback", new IFeedbackMessageFilter() { public boolean accept(FeedbackMessage feedbackMessage) { List<String> acceptedErrorMessages = new ArrayList<String>(); acceptedErrorMessages.addAll(TransplantManager.REJECT_DATA_ERROR_MESSAGES); return acceptedErrorMessages.contains(feedbackMessage.getMessage()); } })); // Edit transplant form Form<Transplant> editTransplantForm = new TransplantForm("form", new CompoundPropertyModel<Transplant>(editTransplantModel), editTransplantFormComponentsToUpdate); editTransplantContainer.add(editTransplantForm); editTransplantForm.add(new AjaxSubmitLink("saveTop") { @Override protected void onSubmit(AjaxRequestTarget target, Form<?> form) { target.add(editTransplantContainer); target.add(transplantsContainer); try { transplantManager.saveTransplant((Transplant) form.getModelObject()); } catch (InvalidModelException e) { for (String error : e.getErrors()) { error(error); } return; } editTransplantModel.setObject(null); } @Override protected void onError(AjaxRequestTarget target, Form<?> form) { target.add(editTransplantFormComponentsToUpdate.toArray( new Component[editTransplantFormComponentsToUpdate.size()])); } }); editTransplantForm.add(new AjaxLink("cancelTop") { @Override public void onClick(AjaxRequestTarget target) { editTransplantModel.setObject(null); target.add(editTransplantContainer); } }); editTransplantForm.add(new AjaxSubmitLink("saveBottom") { @Override protected void onSubmit(AjaxRequestTarget target, Form<?> form) { target.add(editTransplantContainer); target.add(transplantsContainer); try { transplantManager.saveTransplant((Transplant) form.getModelObject()); } catch (InvalidModelException e) { for (String error : e.getErrors()) { error(error); } return; } editTransplantModel.setObject(null); } @Override protected void onError(AjaxRequestTarget target, Form<?> form) { target.add(editTransplantFormComponentsToUpdate.toArray( new Component[editTransplantFormComponentsToUpdate.size()])); } }); editTransplantForm.add(new AjaxLink("cancelBottom") { @Override public void onClick(AjaxRequestTarget target) { editTransplantModel.setObject(null); target.add(editTransplantContainer); } }); // Add transplant form Form<Transplant> addTransplantForm = new TransplantForm("addTransplantForm", new CompoundPropertyModel<Transplant>(new Transplant()), addTransplantFormComponentsToUpdate); addTransplantForm.add(new AjaxSubmitLink("add") { @Override protected void onSubmit(AjaxRequestTarget target, Form form) { target.add(form); Transplant transplant = (Transplant) form.getModelObject(); transplant.setRadarNumber(radarNumberModel.getObject()); try { transplantManager.saveTransplant(transplant); } catch (InvalidModelException e) { for (String error : e.getErrors()) { error(error); } return; } form.getModel().setObject(new Transplant()); transplantsContainer.setVisible(true); target.add(transplantsContainer); } @Override protected void onError(AjaxRequestTarget target, Form<?> form) { target.add(addTransplantFormComponentsToUpdate.toArray(new Component[ addTransplantFormComponentsToUpdate.size()])); } }); addTransplantForm.setOutputMarkupId(true); addTransplantForm.setOutputMarkupPlaceholderTag(true); add(addTransplantForm); } private final class TransplantForm extends Form<Transplant> { @SpringBean private TransplantManager transplantManager; private TransplantForm(String id, IModel<Transplant> transplantIModel, List<Component> componentsToUpdate) { super(id, transplantIModel); RadarRequiredDateTextField date = new RadarRequiredDateTextField("date", this, componentsToUpdate); add(date); RadarRequiredDropdownChoice modality = new RadarRequiredDropdownChoice("modality", transplantManager.getTransplantModalitites(), new ChoiceRenderer("description", "id"), this, componentsToUpdate); add(modality); YesNoRadioGroup recurr = new YesNoRadioGroup("recurr") { /** * disable input if editing and date of failure is set */ @Override public boolean isEnabled() { Transplant transplant = TransplantForm.this.getModelObject(); if (transplant != null) { if (transplant.getDateFailureRejectData() != null && transplant.getId() != null) { if (transplant.getDateFailureRejectData().getFailureDate() != null) { return false; } } } return true; } }; add(recurr); RadarDateTextField dateRecurr = new RadarDateTextField("dateRecurr", this, componentsToUpdate) { /** * disable input if editing and date of failure is set */ @Override public boolean isEnabled() { Transplant transplant = TransplantForm.this.getModelObject(); if (transplant != null) { if (transplant.getDateFailureRejectData() != null && transplant.getId() != null) { if (transplant.getDateFailureRejectData().getFailureDate() != null) { return false; } } } return true; } }; add(dateRecurr); RadarDateTextField dateFailure = new RadarDateTextField("dateFailureRejectData.failureDate", this, componentsToUpdate); add(dateFailure); FeedbackPanel editTransplantFeedback = new FeedbackPanel("transplantFeedback", new IFeedbackMessageFilter() { public boolean accept(FeedbackMessage feedbackMessage) { List<String> acceptedErrorMessages = new ArrayList<String>(); acceptedErrorMessages.addAll(TreatmentManager.ERROR_MESSAGES); acceptedErrorMessages.addAll(TransplantManager.ERROR_MESSAGES); return acceptedErrorMessages.contains(feedbackMessage.getMessage()); } }); add(editTransplantFeedback); editTransplantFeedback.setOutputMarkupPlaceholderTag(true); componentsToUpdate.add(editTransplantFeedback); } } @Override public boolean isVisible() { return ((FollowUpPanel) getParent()).getCurrentTab().equals(FollowUpPanel.CurrentTab.RRT_THERAPY); } }