/* * 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.pages.admin; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.ajax.markup.html.AjaxLink; import org.apache.wicket.markup.html.WebMarkupContainer; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.link.BookmarkablePageLink; import org.apache.wicket.markup.html.link.ResourceLink; import org.apache.wicket.markup.html.panel.FeedbackPanel; import org.apache.wicket.markup.repeater.Item; import org.apache.wicket.markup.repeater.data.DataView; import org.apache.wicket.spring.injection.annot.SpringBean; import org.patientview.model.Patient; import org.patientview.radar.model.enums.ExportType; import org.patientview.radar.model.filter.PatientUserFilter; import org.patientview.radar.model.user.PatientUser; import org.patientview.radar.service.EmailManager; import org.patientview.radar.service.ExportManager; import org.patientview.radar.service.PatientManager; import org.patientview.radar.service.UserManager; import org.patientview.radar.web.behaviours.RadarBehaviourFactory; import org.patientview.radar.web.components.SortLink; import org.patientview.radar.web.dataproviders.PatientUserDataProvider; import org.patientview.radar.web.panels.RadarAjaxPagingNavigator; import org.patientview.radar.web.resources.RadarResourceFactory; import java.util.Arrays; import java.util.HashMap; import java.util.Map; public class AdminPatientsPage extends AdminsBasePage { @SpringBean private UserManager userManager; @SpringBean private PatientManager patientManager; @SpringBean private EmailManager emailManager; @SpringBean private ExportManager exportManager; private static final int RESULTS_PER_PAGE = 10; public AdminPatientsPage() { final PatientUserDataProvider patientsDataProvider = new PatientUserDataProvider(userManager); final FeedbackPanel feedback = new FeedbackPanel("feedback"); feedback.setOutputMarkupId(true); feedback.setOutputMarkupPlaceholderTag(true); add(feedback); // TODO: need to hook these up add(new ResourceLink("exportPdf", RadarResourceFactory.getExportResource( exportManager.getPatientsExportData(ExportType.PDF), "patients-users" + AdminsBasePage.EXPORT_FILE_NAME_SUFFIX, ExportType.PDF))); add(new ResourceLink("exportExcel", RadarResourceFactory.getExportResource( exportManager.getPatientsExportData(ExportType.EXCEL), "patients-users" + AdminsBasePage.EXPORT_FILE_NAME_SUFFIX, ExportType.EXCEL))); final WebMarkupContainer patientsContainer = new WebMarkupContainer("patientsContainer"); patientsContainer.setOutputMarkupId(true); add(patientsContainer); final DataView<PatientUser> patientList = new DataView<PatientUser>("patients", patientsDataProvider) { @Override protected void populateItem(Item<PatientUser> item) { builtDataViewRow(item, feedback); } }; patientList.setItemsPerPage(RESULTS_PER_PAGE); patientsContainer.add(patientList); // add paging element patientsContainer.add(new RadarAjaxPagingNavigator("navigator", patientList, patientsDataProvider.size())); // add sort links to the table column headers for (Map.Entry<String, String> entry : getSortFields().entrySet()) { add(new SortLink(entry.getKey(), entry.getValue(), patientsDataProvider, patientList, Arrays.asList(patientsContainer))); } } /** * Build a row in the dataview from the object * * @param item Item<PatientUser> * @param feedback */ private void builtDataViewRow(final Item<PatientUser> item, final FeedbackPanel feedback) { final PatientUser patientUser = item.getModelObject(); final Patient patient = patientManager.getPatientByRadarNumber( patientUser.getRadarNumber()); item.add(new BookmarkablePageLink<AdminConsultantPage>("edit", AdminPatientPage.class, AdminPatientPage.getPageParameters(patientUser))); // item.add(new Label("radarNo", patientUser.getRadarNumber().toString())); item.add(new Label("forename", patient.getForename())); item.add(new Label("surname", patient.getSurname())); item.add(new Label("dob", patientUser.getDateOfBirth().toString())); String dateRegistered = ""; if (patientUser.getDateRegistered() != null) { dateRegistered = patientUser.getDateRegistered().toString(); } item.add(new Label("dateRegistered", dateRegistered)); item.add(new Label("username", patientUser.getUsername())); AjaxLink deleteLink = new AjaxLink("deleteLink") { public void onClick(AjaxRequestTarget ajaxRequestTarget) { try { userManager.deletePatientUser(patientUser); setResponsePage(AdminPatientsPage.class); } catch (Exception e) { error("Could not delete patient " + e); ajaxRequestTarget.add(feedback); } } }; deleteLink.add(RadarBehaviourFactory.getDeleteConfirmationBehaviour()); item.add(deleteLink); item.add(new AjaxLink("emailLink") { public void onClick(AjaxRequestTarget ajaxRequestTarget) { try { emailManager.sendPatientRegistrationReminderEmail(patientUser); } catch (Exception e) { error("There was an error sending reminder email to patient " + e); ajaxRequestTarget.add(feedback); } } }); } /** * List of columns that can be used to sort the results - will return ID of el to be bound to and the field to sort * * @return Map<String, PatientUserFilter.UserField> */ private Map<String, String> getSortFields() { return new HashMap<String, String>() { { put("orderByRadarNo", PatientUserFilter.UserField.RADAR_NO.getDatabaseFieldName()); put("orderByUsername", PatientUserFilter.UserField.USERNAME.getDatabaseFieldName()); put("orderByDob", PatientUserFilter.UserField.DOB.getDatabaseFieldName()); put("orderByDateRegistered", PatientUserFilter.UserField.REGISTRATION_DATE.getDatabaseFieldName()); } }; } }