org.patientview.radar.web.panels.PlasmaPheresisPanel.java Source code

Java tutorial

Introduction

Here is the source code for org.patientview.radar.web.panels.PlasmaPheresisPanel.java

Source

/*
 * 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;

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.markup.html.basic.DateLabel;
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.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.Model;
import org.apache.wicket.spring.injection.annot.SpringBean;
import org.patientview.radar.model.Plasmapheresis;
import org.patientview.radar.model.enums.RemissionAchieved;
import org.patientview.radar.model.exception.InvalidModelException;
import org.patientview.radar.model.user.User;
import org.patientview.radar.service.PlasmapheresisManager;
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 java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Date;
import java.util.List;

public class PlasmaPheresisPanel extends Panel {
    @SpringBean
    private PlasmapheresisManager plasmapheresisManager;

    public PlasmaPheresisPanel(String id, final IModel<Long> radarNumberModel) {

        super(id);
        final WebMarkupContainer plasmapheresisContainer = new WebMarkupContainer("plasmapheresisContainer");

        plasmapheresisContainer.setOutputMarkupId(true);
        plasmapheresisContainer.setOutputMarkupPlaceholderTag(true);
        add(plasmapheresisContainer);

        final List<Component> addPlasmapheresisComponentsToUpdate = new ArrayList<Component>();
        final List<Component> editPlasmapheresisComponentsToUpdate = new ArrayList<Component>();

        final IModel plasmapheresisListModel = new AbstractReadOnlyModel<List>() {
            @Override
            public List getObject() {

                if (radarNumberModel.getObject() != null) {
                    return plasmapheresisManager.getPlasmapheresisByRadarNumber(radarNumberModel.getObject());
                }
                return Collections.emptyList();
            }
        };

        final IModel editPlasmapheresisModel = new Model<Plasmapheresis>();
        final MarkupContainer editPlasmapheresisContainer = new WebMarkupContainer("editPlasmapheresisContainer") {
            @Override
            public boolean isVisible() {
                return editPlasmapheresisModel.getObject() != null;
            }
        };
        editPlasmapheresisContainer.setOutputMarkupPlaceholderTag(true);
        editPlasmapheresisContainer.setOutputMarkupId(true);

        ListView<Plasmapheresis> plasmapheresisListViewlistView = new ListView<Plasmapheresis>("plasmapheresis",
                plasmapheresisListModel) {
            @Override
            protected void populateItem(final ListItem<Plasmapheresis> item) {
                item.setModel(new CompoundPropertyModel<Plasmapheresis>(item.getModelObject()));
                item.add(DateLabel.forDatePattern("startDate", RadarApplication.DATE_PATTERN));
                item.add(DateLabel.forDatePattern("endDate", RadarApplication.DATE_PATTERN));
                item.add(new Label("plasmapheresisExchanges.name"));
                item.add(new Label("response.label"));
                AjaxLink ajaxDeleteLink = new AjaxLink("deleteLink") {
                    @Override
                    public void onClick(AjaxRequestTarget target) {
                        Plasmapheresis plasmapheresis = item.getModelObject();
                        plasmapheresisManager.deletePlasmaPheresis(plasmapheresis);
                        target.add(addPlasmapheresisComponentsToUpdate
                                .toArray(new Component[addPlasmapheresisComponentsToUpdate.size()]));
                        target.add(plasmapheresisContainer);
                    }
                };
                item.add(ajaxDeleteLink);
                ajaxDeleteLink.add(RadarBehaviourFactory.getDeleteConfirmationBehaviour());
                AjaxLink ajaxEditLink = new AjaxLink("editLink") {
                    @Override
                    public void onClick(AjaxRequestTarget target) {
                        editPlasmapheresisModel.setObject(item.getModelObject());
                        target.add(editPlasmapheresisContainer);
                    }
                };
                item.add(ajaxEditLink);

                AuthenticatedWebSession session = RadarSecuredSession.get();
                if (session.isSignedIn()) {
                    if (session.getRoles().hasRole(User.ROLE_PATIENT)) {
                        ajaxDeleteLink.setVisible(false);
                        ajaxEditLink.setVisible(false);
                    }
                }
            }
        };
        plasmapheresisContainer.add(plasmapheresisListViewlistView);

        // Add the form
        PlasmapheresisForm editPlasmapheresisForm = new PlasmapheresisForm("editPlasmapheresisForm",
                new CompoundPropertyModel<Plasmapheresis>(editPlasmapheresisModel),
                editPlasmapheresisComponentsToUpdate);

        editPlasmapheresisForm.add(new AjaxSubmitLink("saveTop") {
            @Override
            protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
                target.add(editPlasmapheresisContainer);
                target.add(plasmapheresisContainer);
                try {
                    plasmapheresisManager.savePlasmapheresis((Plasmapheresis) form.getModelObject());
                } catch (InvalidModelException e) {
                    for (String error : e.getErrors()) {
                        error(error);
                    }
                    return;
                }
                form.getModel().setObject(null);
            }

            @Override
            protected void onError(AjaxRequestTarget target, Form<?> form) {
                target.add(editPlasmapheresisComponentsToUpdate
                        .toArray(new Component[editPlasmapheresisComponentsToUpdate.size()]));
            }
        });

        editPlasmapheresisForm.add(new AjaxLink("cancelTop") {
            @Override
            public void onClick(AjaxRequestTarget target) {
                editPlasmapheresisModel.setObject(null);
                target.add(editPlasmapheresisContainer);
            }
        });

        editPlasmapheresisForm.add(new AjaxSubmitLink("saveBottom") {
            @Override
            protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
                target.add(editPlasmapheresisContainer);
                target.add(plasmapheresisContainer);
                try {
                    plasmapheresisManager.savePlasmapheresis((Plasmapheresis) form.getModelObject());
                } catch (InvalidModelException e) {
                    for (String error : e.getErrors()) {
                        error(error);
                    }
                    return;
                }
                form.getModel().setObject(null);
            }

            @Override
            protected void onError(AjaxRequestTarget target, Form<?> form) {
                target.add(editPlasmapheresisComponentsToUpdate
                        .toArray(new Component[editPlasmapheresisComponentsToUpdate.size()]));
            }
        });
        editPlasmapheresisForm.add(new AjaxLink("cancelBottom") {
            @Override
            public void onClick(AjaxRequestTarget target) {
                editPlasmapheresisModel.setObject(null);
                target.add(editPlasmapheresisContainer);
            }
        });

        editPlasmapheresisContainer.add(editPlasmapheresisForm);
        add(editPlasmapheresisContainer);

        // Add the add plasmapheresis form
        PlasmapheresisForm addPlasmapheresisForm = new PlasmapheresisForm("addPlasmapheresisForm",
                new CompoundPropertyModel<Plasmapheresis>(new Plasmapheresis()),
                addPlasmapheresisComponentsToUpdate);

        addPlasmapheresisForm.add(new AjaxSubmitLink("save") {
            @Override
            protected void onSubmit(AjaxRequestTarget target, Form form) {
                target.add(addPlasmapheresisComponentsToUpdate
                        .toArray(new Component[addPlasmapheresisComponentsToUpdate.size()]));
                target.add(plasmapheresisContainer);

                Plasmapheresis plasmapheresis = (Plasmapheresis) form.getModelObject();
                plasmapheresis.setRadarNumber(radarNumberModel.getObject());
                try {
                    plasmapheresisManager.savePlasmapheresis(plasmapheresis);
                } catch (InvalidModelException e) {
                    for (String error : e.getErrors()) {
                        error(error);
                    }
                    return;
                }

                form.getModel().setObject(new Plasmapheresis());
                plasmapheresisContainer.setVisible(true);
            }

            @Override
            protected void onError(AjaxRequestTarget target, Form<?> form) {
                target.add(addPlasmapheresisComponentsToUpdate
                        .toArray(new Component[addPlasmapheresisComponentsToUpdate.size()]));
            }
        });
        add(addPlasmapheresisForm);
    }

    private final class PlasmapheresisForm extends Form<Plasmapheresis> {
        private RadarDateTextField endDate;
        @SpringBean
        private PlasmapheresisManager plasmapheresisManager;

        private PlasmapheresisForm(String id, IModel<Plasmapheresis> model, List<Component> componentsToUpdate) {
            super(id, model);
            RadarRequiredDateTextField startDate = new RadarRequiredDateTextField("startDate", this,
                    componentsToUpdate);
            add(startDate);
            endDate = new RadarDateTextField("endDate", this, componentsToUpdate);
            add(endDate);

            RadarRequiredDropdownChoice plasmapheresisExchanges = new RadarRequiredDropdownChoice(
                    "plasmapheresisExchanges", plasmapheresisManager.getPlasmapheresisExchangeUnits(),
                    new ChoiceRenderer("name", "id"), this, componentsToUpdate);
            add(plasmapheresisExchanges);

            RadarRequiredDropdownChoice response = new RadarRequiredDropdownChoice("response",
                    Arrays.asList(RemissionAchieved.COMPLETE, RemissionAchieved.PARTIAL, RemissionAchieved.NONE),
                    new ChoiceRenderer("label", "id"), this, componentsToUpdate);
            add(response);

            componentsToUpdate.add(startDate);
            componentsToUpdate.add(endDate);
            componentsToUpdate.add(plasmapheresisExchanges);
            componentsToUpdate.add(response);

            endDate.setOutputMarkupId(true);
            endDate.setOutputMarkupPlaceholderTag(true);

            startDate.setOutputMarkupId(true);
            startDate.setOutputMarkupPlaceholderTag(true);

            plasmapheresisExchanges.setOutputMarkupId(true);
            plasmapheresisExchanges.setOutputMarkupPlaceholderTag(true);

            response.setOutputMarkupId(true);
            response.setOutputMarkupPlaceholderTag(true);

            FeedbackPanel plasmapheresisFeedback = new FeedbackPanel("plasmapheresisFeedback",
                    new IFeedbackMessageFilter() {
                        public boolean accept(FeedbackMessage feedbackMessage) {
                            return TreatmentManager.ERROR_MESSAGES.contains(feedbackMessage.getMessage());
                        }
                    });

            add(plasmapheresisFeedback);
            plasmapheresisFeedback.setOutputMarkupPlaceholderTag(true);
            componentsToUpdate.add(plasmapheresisFeedback);
        }

        @Override
        protected void onValidateModelObjects() {
            super.onValidateModelObjects();
            Plasmapheresis plasmapheresis = getModelObject();
            Date start = plasmapheresis.getStartDate();
            Date end = plasmapheresis.getEndDate();
            if (start != null && end != null && start.compareTo(end) != -1) {
                endDate.error("End date cannot be less than start date");
            }
        }
    }
}