/* * 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.patientview.radar.model.Issue; import org.patientview.radar.model.enums.IssuePriority; import org.patientview.radar.model.enums.IssueStatus; import org.patientview.radar.model.enums.IssueType; import org.patientview.radar.model.filter.IssueFilter; import org.patientview.radar.service.IssueManager; import org.patientview.radar.web.components.ClearLink; import org.patientview.radar.web.components.SearchDateField; import org.patientview.radar.web.components.SearchDropDownChoice; import org.patientview.radar.web.components.SearchField; import org.patientview.radar.web.components.SortLink; import org.patientview.radar.web.dataproviders.IssuesDataProvider; import org.patientview.radar.web.panels.RadarAjaxPagingNavigator; import org.apache.wicket.datetime.markup.html.basic.DateLabel; 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.repeater.Item; import org.apache.wicket.markup.repeater.data.DataView; import org.apache.wicket.model.Model; import org.apache.wicket.spring.injection.annot.SpringBean; import java.util.Arrays; import java.util.Date; import java.util.HashMap; import java.util.Map; public class AdminIssuesPage extends AdminsBasePage { @SpringBean private IssueManager issueManager; private static final int RESULTS_PER_PAGE = 10; public AdminIssuesPage() { final IssuesDataProvider issuesDataProvider = new IssuesDataProvider(issueManager); add(new BookmarkablePageLink<AdminIssuesPage>("addNewIssue", AdminIssuePage.class)); final WebMarkupContainer issuesContainer = new WebMarkupContainer("issuesContainer"); issuesContainer.setOutputMarkupId(true); add(issuesContainer); final DataView<Issue> issueList = new DataView<Issue>("issues", issuesDataProvider) { @Override protected void populateItem(Item<Issue> item) { builtDataViewRow(item); } }; issueList.setItemsPerPage(RESULTS_PER_PAGE); issuesContainer.add(issueList); // add paging element issuesContainer.add(new RadarAjaxPagingNavigator("navigator", issueList, issuesDataProvider.size())); // button to clear all the filter fields for each colum final ClearLink clearButton = new ClearLink("clearButton", issuesDataProvider, issueList, issuesContainer); add(clearButton); // add sort links to the table column headers for (Map.Entry<String, String> entry : getSortFields().entrySet()) { add(new SortLink(entry.getKey(), entry.getValue(), issuesDataProvider, issueList, Arrays.asList(issuesContainer))); } // add a search field to the top of each column - these will AND each search for (Map.Entry<String, String> entry : getFilterFields().entrySet()) { add(new SearchField(entry.getKey(), entry.getValue(), issuesDataProvider, issueList, Arrays.asList(issuesContainer, clearButton))); } // some of the sort fields are drop downs so add these add(new SearchDropDownChoice<IssueType>("searchType", Arrays.asList(IssueType.values()), IssueFilter.Field.TYPE.getDatabaseFieldName(), issuesDataProvider, issueList, Arrays.asList(issuesContainer, clearButton))); add(new SearchDropDownChoice<IssuePriority>("searchPriority", Arrays.asList(IssuePriority.values()), IssueFilter.Field.PRIORITY.getDatabaseFieldName(), issuesDataProvider, issueList, Arrays.asList(issuesContainer, clearButton))); add(new SearchDropDownChoice<IssueStatus>("searchStatus", Arrays.asList(IssueStatus.values()), IssueFilter.Field.STATUS.getDatabaseFieldName(), issuesDataProvider, issueList, Arrays.asList(issuesContainer, clearButton))); add(new SearchDateField("searchDateLogged", IssueFilter.Field.DATE_LOGGED.getDatabaseFieldName(), issuesDataProvider, issueList, Arrays.asList(issuesContainer, clearButton))); add(new SearchDateField("searchDateResolved", IssueFilter.Field.DATE_RESOLVED.getDatabaseFieldName(), issuesDataProvider, issueList, Arrays.asList(issuesContainer, clearButton))); add(new SearchDateField("searchUpdated", IssueFilter.Field.UPDATED.getDatabaseFieldName(), issuesDataProvider, issueList, Arrays.asList(issuesContainer, clearButton))); } /** * Build a row in the dataview from the object * @param item Item<ProfessionalUser> */ private void builtDataViewRow(Item<Issue> item) { Issue issue = item.getModelObject(); item.add(new BookmarkablePageLink<AdminIssuePage>("edit", AdminIssuePage.class, AdminIssuePage.getPageParameters(issue))); item.add(new Label("id", issue.getId().toString())); item.add(new Label("type", issue.getType().getName())); item.add(new Label("page", issue.getPage())); item.add(DateLabel.forDatePattern("dateLogged", new Model<Date>(issue.getDateLogged()), SearchDateField.DATABASE_DATE_PATTERN)); item.add(DateLabel.forDatePattern("dateResolved", new Model<Date>(issue.getDateLogged()), SearchDateField.DATABASE_DATE_PATTERN)); item.add(new Label("description", issue.getDescription())); item.add(new Label("comment", issue.getComments())); item.add(new Label("priority", issue.getPriority().getName())); item.add(new Label("status", issue.getStatus().getName())); item.add(DateLabel.forDatePattern("updated", new Model<Date>(issue.getUpdated()), SearchDateField.DATABASE_DATE_PATTERN)); } /** * 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, IssueFilter.UserField> */ private Map<String, String> getSortFields() { return new HashMap<String, String>() { { put("orderById", IssueFilter.Field.ID.getDatabaseFieldName()); put("orderByType", IssueFilter.Field.TYPE.getDatabaseFieldName()); put("orderByPage", IssueFilter.Field.PAGE.getDatabaseFieldName()); put("orderByDateLogged", IssueFilter.Field.DATE_LOGGED.getDatabaseFieldName()); put("orderByDateResolved", IssueFilter.Field.DATE_RESOLVED.getDatabaseFieldName()); put("orderByDescription", IssueFilter.Field.DESC.getDatabaseFieldName()); put("orderByComment", IssueFilter.Field.COMMENTS.getDatabaseFieldName()); put("orderByPriority", IssueFilter.Field.PRIORITY.getDatabaseFieldName()); put("orderByStatus", IssueFilter.Field.STATUS.getDatabaseFieldName()); put("orderByUpdated", IssueFilter.Field.UPDATED.getDatabaseFieldName()); } }; } /** * List of column filters - will return ID of el to be bound to and the field to filter * @return Map<String, IssueFilter.UserField> */ private Map<String, String> getFilterFields() { return new HashMap<String, String>() { { put("searchId", IssueFilter.Field.ID.getDatabaseFieldName()); put("searchPage", IssueFilter.Field.PAGE.getDatabaseFieldName()); put("searchDescription", IssueFilter.Field.DESC.getDatabaseFieldName()); put("searchComment", IssueFilter.Field.COMMENTS.getDatabaseFieldName()); } }; } }