package org.akaza.openclinica.control.submit;
import org.akaza.openclinica.bean.core.Role;
import org.akaza.openclinica.bean.core.Status;
import org.akaza.openclinica.bean.core.SubjectEventStatus;
import org.akaza.openclinica.bean.login.StudyUserRoleBean;
import org.akaza.openclinica.bean.login.UserAccountBean;
import org.akaza.openclinica.bean.managestudy.StudyBean;
import org.akaza.openclinica.bean.managestudy.StudyEventBean;
import org.akaza.openclinica.bean.managestudy.StudyEventDefinitionBean;
import org.akaza.openclinica.bean.managestudy.StudyGroupBean;
import org.akaza.openclinica.bean.managestudy.StudyGroupClassBean;
import org.akaza.openclinica.bean.managestudy.StudySubjectBean;
import org.akaza.openclinica.bean.submit.EventCRFBean;
import org.akaza.openclinica.bean.submit.SubjectBean;
import org.akaza.openclinica.bean.submit.SubjectGroupMapBean;
import org.akaza.openclinica.control.AbstractTableFactory;
import org.akaza.openclinica.control.DefaultActionsEditor;
import org.akaza.openclinica.control.ListStudyView;
import org.akaza.openclinica.core.SessionManager;
import org.akaza.openclinica.dao.managestudy.EventDefinitionCRFDAO;
import org.akaza.openclinica.dao.managestudy.FindSubjectsFilter;
import org.akaza.openclinica.dao.managestudy.FindSubjectsSort;
import org.akaza.openclinica.dao.managestudy.StudyDAO;
import org.akaza.openclinica.dao.managestudy.StudyEventDAO;
import org.akaza.openclinica.dao.managestudy.StudyEventDefinitionDAO;
import org.akaza.openclinica.dao.managestudy.StudyGroupClassDAO;
import org.akaza.openclinica.dao.managestudy.StudyGroupDAO;
import org.akaza.openclinica.dao.managestudy.StudySubjectDAO;
import org.akaza.openclinica.dao.service.StudyParameterValueDAO;
import org.akaza.openclinica.dao.submit.EventCRFDAO;
import org.akaza.openclinica.dao.submit.SubjectDAO;
import org.akaza.openclinica.dao.submit.SubjectGroupMapDAO;
import org.akaza.openclinica.i18n.core.LocaleResolver;
import org.akaza.openclinica.i18n.util.ResourceBundleProvider;
import org.akaza.openclinica.service.pmanage.ParticipantPortalRegistrar;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.StringEscapeUtils;
import org.jmesa.core.filter.FilterMatcher;
import org.jmesa.core.filter.MatcherKey;
import org.jmesa.facade.TableFacade;
import org.jmesa.limit.Filter;
import org.jmesa.limit.FilterSet;
import org.jmesa.limit.Limit;
import org.jmesa.limit.Sort;
import org.jmesa.limit.SortSet;
import org.jmesa.view.component.Row;
import org.jmesa.view.editor.BasicCellEditor;
import org.jmesa.view.editor.CellEditor;
import org.jmesa.view.html.HtmlBuilder;
import org.jmesa.view.html.editor.DroplistFilterEditor;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.ResourceBundle;
import java.util.Properties;
import java.lang.Exception;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import javax.sql.DataSource;
public class ListStudySubjectTableFactory extends AbstractTableFactory {
private StudyEventDefinitionDAO studyEventDefinitionDao;
private StudySubjectDAO studySubjectDAO;
private SubjectDAO subjectDAO;
private StudyEventDAO studyEventDAO;
private StudyGroupClassDAO studyGroupClassDAO;
private SubjectGroupMapDAO subjectGroupMapDAO;
private StudyGroupDAO studyGroupDAO;
private StudyDAO studyDAO;
private EventCRFDAO eventCRFDAO;
private EventDefinitionCRFDAO eventDefintionCRFDAO;
private HttpSession session;
private StudyBean studyBean;
private String[] columnNames = new String[] {};
private ArrayList<StudyEventDefinitionBean> studyEventDefinitions;
private ArrayList<StudyGroupClassBean> studyGroupClasses;
private StudyUserRoleBean currentRole;
private UserAccountBean currentUser;
private final boolean showMoreLink;
private ResourceBundle resword;
private ResourceBundle resformat;
private final ResourceBundle resterms = ResourceBundleProvider.getTermsBundle();
private StudyParameterValueDAO studyParameterValueDAO;
private ParticipantPortalRegistrar participantPortalRegistrar;
final HashMap<Integer, String> imageIconPaths = new HashMap<Integer, String>(8);
@Override
// To avoid showing title in other pages, the request element is used to determine where the request came from.
public TableFacade createTable(HttpServletRequest request, HttpServletResponse response) {
locale = LocaleResolver.getLocale(request);
session = request.getSession();
TableFacade tableFacade = getTableFacadeImpl(request, response);
tableFacade.setStateAttr("restore");
setDataAndLimitVariables(tableFacade);
configureTableFacade(response, tableFacade);
if (!tableFacade.getLimit().isExported()) {
configureColumns(tableFacade, locale);
tableFacade.setMaxRowsIncrements(getMaxRowIncrements());
configureTableFacadePostColumnConfiguration(tableFacade);
configureTableFacadeCustomView(tableFacade, request);
configureUnexportedTable(tableFacade, locale);
} else {
configureExportColumns(tableFacade, locale);
}
return tableFacade;
}
public ListStudySubjectTableFactory(boolean showMoreLink) {
imageIconPaths.put(1, "images/icon_Scheduled.gif");
imageIconPaths.put(2, "images/icon_NotStarted.gif");
imageIconPaths.put(3, "images/icon_InitialDE.gif");
imageIconPaths.put(4, "images/icon_DEcomplete.gif");
imageIconPaths.put(5, "images/icon_Stopped.gif");
imageIconPaths.put(6, "images/icon_Skipped.gif");
imageIconPaths.put(7, "images/icon_Locked.gif");
imageIconPaths.put(8, "images/icon_Signed.gif");
this.showMoreLink = showMoreLink;
}
@Override
protected String getTableName() {
return "findSubjects";
}
public void configureTableFacadeCustomView(TableFacade tableFacade, HttpServletRequest request) {
tableFacade.setView(new ListStudyView(getLocale(), request));
}
@Override
protected void configureColumns(TableFacade tableFacade, Locale locale) {
resword = ResourceBundleProvider.getWordsBundle(locale);
resformat = ResourceBundleProvider.getFormatBundle(locale);
tableFacade.setColumnProperties(columnNames);
Row row = tableFacade.getTable().getRow();
int index = 0;
configureColumn(row.getColumn(columnNames[index]), resword.getString("study_subject_ID"), null, null);
++index;
configureColumn(row.getColumn(columnNames[index]), resword.getString("subject_status"), new StatusCellEditor(), new StatusDroplistFilterEditor());
++index;
configureColumn(row.getColumn(columnNames[index]), resword.getString("site_id"), null, null);
++index;
configureColumn(row.getColumn(columnNames[index]), resword.getString("rule_oid"), null, null);
++index;
configureColumn(row.getColumn(columnNames[index]), resword.getString("gender"), null, null, true, false);
++index;
configureColumn(row.getColumn(columnNames[index]), resword.getString("secondary_ID"), null, null);
++index;
// group class columns
for (int i = index; i < index + studyGroupClasses.size(); i++) {
StudyGroupClassBean studyGroupClass = studyGroupClasses.get(i - index);
// configureColumn(row.getColumn(columnNames[i]),
// studyGroupClass.getName(), new
// StudyGroupClassCellEditor(studyGroupClass), null, false, false);
configureColumn(row.getColumn(columnNames[i]), studyGroupClass.getName(), new StudyGroupClassCellEditor(studyGroupClass),
new SubjectGroupClassDroplistFilterEditor(studyGroupClass), true, false);
}
// study event definition columns
for (int i = index + studyGroupClasses.size(); i < columnNames.length - 1; i++) {
StudyEventDefinitionBean studyEventDefinition = studyEventDefinitions.get(i - (index + studyGroupClasses.size()));
configureColumn(row.getColumn(columnNames[i]), studyEventDefinition.getName(), new StudyEventDefinitionMapCellEditor(),
new SubjectEventStatusDroplistFilterEditor(), true, false);
}
String actionsHeader = resword.getString("rule_actions")
+ " ";
configureColumn(row.getColumn(columnNames[columnNames.length - 1]), actionsHeader, new ActionsCellEditor(), new DefaultActionsEditor(locale), true,
false);
}
@Override
public void configureTableFacade(HttpServletResponse response, TableFacade tableFacade) {
super.configureTableFacade(response, tableFacade);
// getColumnNames();
getColumnNamesMap();
tableFacade.addFilterMatcher(new MatcherKey(Character.class), new CharFilterMatcher());
tableFacade.addFilterMatcher(new MatcherKey(Status.class), new StatusFilterMatcher());
// tableFacade.addFilterMatcher(new MatcherKey(Integer.class), new
// SubjectEventStatusFilterMatcher());
for (int i = 6; i < 6 + studyGroupClasses.size(); i++) {
tableFacade.addFilterMatcher(new MatcherKey(Integer.class, columnNames[i]), new SubjectGroupFilterMatcher());
}
for (int i = 6 + studyGroupClasses.size(); i < columnNames.length - 1; i++) {
tableFacade.addFilterMatcher(new MatcherKey(Integer.class, columnNames[i]), new SubjectEventStatusFilterMatcher());
}
}
@Override
public void configureTableFacadePostColumnConfiguration(TableFacade tableFacade) {
Role r = currentRole.getRole();
boolean addSubjectLinkShow = studyBean.getStatus().isAvailable() && !r.equals(Role.MONITOR);
tableFacade.setToolbar(new ListStudySubjectTableToolbar(getStudyEventDefinitions(), getStudyGroupClasses(), addSubjectLinkShow, showMoreLink));
}
@Override
public void setDataAndLimitVariables(TableFacade tableFacade) {
Limit limit = tableFacade.getLimit();
FindSubjectsFilter subjectFilter = getSubjectFilter(limit);
if (!limit.isComplete()) {
int totalRows = getStudySubjectDAO().getCountWithFilter(subjectFilter, getStudyBean());
tableFacade.setTotalRows(totalRows);
}
FindSubjectsSort subjectSort = getSubjectSort(limit);
int rowStart = limit.getRowSelect().getRowStart();
int rowEnd = limit.getRowSelect().getRowEnd();
Collection<StudySubjectBean> items = getStudySubjectDAO().getWithFilterAndSort(getStudyBean(), subjectFilter, subjectSort, rowStart, rowEnd);
Collection<HashMap<Object, Object>> theItems = new ArrayList<HashMap<Object, Object>>();
for (StudySubjectBean studySubjectBean : items) {
HashMap<Object, Object> theItem = new HashMap<Object, Object>();
theItem.put("studySubject", studySubjectBean);
theItem.put("studySubject.label", StringEscapeUtils.unescapeHtml(studySubjectBean.getLabel()));
theItem.put("studySubject.status", studySubjectBean.getStatus());
theItem.put("enrolledAt", ((StudyBean) getStudyDAO().findByPK(studySubjectBean.getStudyId())).getIdentifier());
theItem.put("studySubject.oid", studySubjectBean.getOid());
theItem.put("studySubject.secondaryLabel", StringEscapeUtils.unescapeHtml(studySubjectBean.getSecondaryLabel()));
SubjectBean subjectBean = (SubjectBean) getSubjectDAO().findByPK(studySubjectBean.getSubjectId());
theItem.put("subject", subjectBean);
theItem.put("subject.charGender", subjectBean.getGender());
// Get All study events for this study subject and then put list in
// HashMap with study event definition id as
// key and a list of study events as the value.
List<StudyEventBean> allStudyEventsForStudySubject = getStudyEventDAO().findAllByStudySubject(studySubjectBean);
HashMap<Integer, List<StudyEventBean>> allStudyEventsForStudySubjectBySedId = new HashMap<Integer, List<StudyEventBean>>();
theItem.put("isSignable", isSignable(allStudyEventsForStudySubject, studySubjectBean));
for (StudyEventBean studyEventBean : allStudyEventsForStudySubject) {
if (allStudyEventsForStudySubjectBySedId.get(studyEventBean.getStudyEventDefinitionId()) == null) {
ArrayList<StudyEventBean> a = new ArrayList<StudyEventBean>();
a.add(studyEventBean);
allStudyEventsForStudySubjectBySedId.put(studyEventBean.getStudyEventDefinitionId(), a);
} else {
allStudyEventsForStudySubjectBySedId.get(studyEventBean.getStudyEventDefinitionId()).add(studyEventBean);
}
}
SubjectGroupMapBean subjectGroupMapBean;
for (StudyGroupClassBean studyGroupClass : getStudyGroupClasses()) {
subjectGroupMapBean = getSubjectGroupMapDAO().findAllByStudySubjectAndStudyGroupClass(studySubjectBean.getId(), studyGroupClass.getId());
if (null != subjectGroupMapBean) {
theItem.put("sgc_" + studyGroupClass.getId(), subjectGroupMapBean.getStudyGroupId());
theItem.put("grpName_sgc_" + studyGroupClass.getId(), subjectGroupMapBean.getStudyGroupName());
}
}
subjectGroupMapBean = null;
for (StudyEventDefinitionBean studyEventDefinition : getStudyEventDefinitions()) {
List<StudyEventBean> studyEvents = allStudyEventsForStudySubjectBySedId.get(studyEventDefinition.getId());
SubjectEventStatus subjectEventStatus = null;
studyEvents = studyEvents == null ? new ArrayList<StudyEventBean>() : studyEvents;
if (studyEvents.size() < 1) {
subjectEventStatus = SubjectEventStatus.NOT_SCHEDULED;
} else {
for (StudyEventBean studyEventBean : studyEvents) {
if (studyEventBean.getSampleOrdinal() == 1) {
subjectEventStatus = studyEventBean.getSubjectEventStatus();
break;
}
}
}
theItem.put("sed_" + studyEventDefinition.getId(), subjectEventStatus.getId());
theItem.put("sed_" + studyEventDefinition.getId() + "_studyEvents", studyEvents);
theItem.put("sed_" + studyEventDefinition.getId() + "_object", studyEventDefinition);
}
theItems.add(theItem);
}
// Do not forget to set the items back on the tableFacade.
tableFacade.setItems(theItems);
}
private Boolean isSignable(List<StudyEventBean> allStudyEventsForStudySubject, StudySubjectBean studySubjectBean) {
boolean isSignable = true;
boolean isRequiredUncomplete;
if (studySubjectBean.getStatus().isSigned()) {
return false;
}
for (StudyEventBean studyEventBean : allStudyEventsForStudySubject) {
if (studyEventBean.getSubjectEventStatus() == SubjectEventStatus.DATA_ENTRY_STARTED
|| studyEventBean.getSubjectEventStatus() == SubjectEventStatus.SCHEDULED) {
isSignable = false;
break;
} else {
isRequiredUncomplete = eventHasRequiredUncompleteCRFs(studyEventBean);
if (isRequiredUncomplete) {
isSignable = false;
break;
}
}
}
return isSignable;
}
@SuppressWarnings("unchecked")
private boolean eventHasRequiredUncompleteCRFs(StudyEventBean studyEventBean) {
List<EventCRFBean> eventCrfBeans = new ArrayList<EventCRFBean>();
eventCrfBeans.addAll(getEventCRFDAO().findAllByStudyEvent(studyEventBean));
// If the EventCRFBean has a completionStatusId of 0 (indicating that it
// is not complete),
// then find out whether it's required. If so, then return from the
// method false.
for (EventCRFBean crfBean : eventCrfBeans) {
if (crfBean != null && crfBean.getCompletionStatusId() == 0) {
if (getEventDefintionCRFDAO().isRequiredInDefinition(crfBean.getCRFVersionId(), studyEventBean)) {
return true;
}
}
}
return false;
}
private void getColumnNames() {
ArrayList<String> columnNamesList = new ArrayList<String>();
columnNamesList.add("label");
columnNamesList.add("status");
columnNamesList.add("enrolledAt");
columnNamesList.add("oid");
columnNamesList.add("subject.charGender");
columnNamesList.add("secondaryLabel");
for (StudyGroupClassBean studyGroupClass : getStudyGroupClasses()) {
columnNamesList.add("sgc_" + studyGroupClass.getId());
}
for (StudyEventDefinitionBean studyEventDefinition : getStudyEventDefinitions()) {
columnNamesList.add("sed_" + studyEventDefinition.getId());
}
columnNamesList.add("actions");
columnNames = columnNamesList.toArray(columnNames);
}
private void getColumnNamesMap() {
ArrayList<String> columnNamesList = new ArrayList<String>();
columnNamesList.add("studySubject.label");
columnNamesList.add("studySubject.status");
columnNamesList.add("enrolledAt");
columnNamesList.add("studySubject.oid");
columnNamesList.add("subject.charGender");
columnNamesList.add("studySubject.secondaryLabel");
for (StudyGroupClassBean studyGroupClass : getStudyGroupClasses()) {
columnNamesList.add("sgc_" + studyGroupClass.getId());
}
for (StudyEventDefinitionBean studyEventDefinition : getStudyEventDefinitions()) {
columnNamesList.add("sed_" + studyEventDefinition.getId());
}
columnNamesList.add("actions");
columnNames = columnNamesList.toArray(columnNames);
}
protected FindSubjectsFilter getSubjectFilter(Limit limit) {
FindSubjectsFilter auditUserLoginFilter = new FindSubjectsFilter();
FilterSet filterSet = limit.getFilterSet();
Collection<Filter> filters = filterSet.getFilters();
for (Filter filter : filters) {
String property = filter.getProperty();
String value = filter.getValue();
if ("studySubject.status".equalsIgnoreCase(property)) {
value = Status.getByName(value).getId() + "";
} else if (property.startsWith("sgc_")) {
int studyGroupClassId = property.endsWith("_") ? 0 : Integer.valueOf(property.split("_")[1]);
value = studyGroupDAO.findByNameAndGroupClassID(value, studyGroupClassId).getId() + "";
}
auditUserLoginFilter.addFilter(property, value);
}
return auditUserLoginFilter;
}
/**
* A very custom way to sort the items. The PresidentSort acts as a command for the Hibernate criteria object. There
* are probably many ways to do this, but this is the most flexible way I have found. The point is you need to
* somehow take the Limit information and sort the rows.
*
* @param limit
* The Limit to use.
*/
protected FindSubjectsSort getSubjectSort(Limit limit) {
FindSubjectsSort auditUserLoginSort = new FindSubjectsSort();
SortSet sortSet = limit.getSortSet();
Collection<Sort> sorts = sortSet.getSorts();
for (Sort sort : sorts) {
String property = sort.getProperty();
String order = sort.getOrder().toParam();
auditUserLoginSort.addSort(property, order);
}
return auditUserLoginSort;
}
private ArrayList<StudyEventDefinitionBean> getStudyEventDefinitions() {
if (this.studyEventDefinitions == null) {
if (studyBean.getParentStudyId() > 0) {
studyEventDefinitions = getStudyEventDefinitionDao().findAllActiveByParentStudyId(studyBean.getParentStudyId());
} else {
studyEventDefinitions = getStudyEventDefinitionDao().findAllActiveByParentStudyId(studyBean.getId());
}
}
return this.studyEventDefinitions;
}
@SuppressWarnings("unchecked")
private ArrayList<StudyGroupClassBean> getStudyGroupClasses() {
if (this.studyGroupClasses == null) {
if (studyBean.getParentStudyId() > 0) {
StudyBean parentStudy = (StudyBean) getStudyDAO().findByPK(studyBean.getParentStudyId());
studyGroupClasses = getStudyGroupClassDAO().findAllActiveByStudy(parentStudy);
} else {
studyGroupClasses = getStudyGroupClassDAO().findAllActiveByStudy(studyBean);
}
}
return studyGroupClasses;
}
public StudyParameterValueDAO getStudyParameterValueDAO() {
return studyParameterValueDAO;
}
public void setStudyParameterValueDAO(StudyParameterValueDAO studyParameterValueDAO) {
this.studyParameterValueDAO = studyParameterValueDAO;
}
public StudyEventDefinitionDAO getStudyEventDefinitionDao() {
return studyEventDefinitionDao;
}
public void setStudyEventDefinitionDao(StudyEventDefinitionDAO studyEventDefinitionDao) {
this.studyEventDefinitionDao = studyEventDefinitionDao;
}
public StudyBean getStudyBean() {
return studyBean;
}
public void setStudyBean(StudyBean studyBean) {
this.studyBean = studyBean;
}
public StudySubjectDAO getStudySubjectDAO() {
return studySubjectDAO;
}
public void setStudySubjectDAO(StudySubjectDAO studySubjectDAO) {
this.studySubjectDAO = studySubjectDAO;
}
public SubjectDAO getSubjectDAO() {
return subjectDAO;
}
public void setSubjectDAO(SubjectDAO subjectDAO) {
this.subjectDAO = subjectDAO;
}
public StudyEventDAO getStudyEventDAO() {
return studyEventDAO;
}
public void setStudyEventDAO(StudyEventDAO studyEventDAO) {
this.studyEventDAO = studyEventDAO;
}
public StudyGroupClassDAO getStudyGroupClassDAO() {
return studyGroupClassDAO;
}
public void setStudyGroupClassDAO(StudyGroupClassDAO studyGroupClassDAO) {
this.studyGroupClassDAO = studyGroupClassDAO;
}
public SubjectGroupMapDAO getSubjectGroupMapDAO() {
return subjectGroupMapDAO;
}
public void setSubjectGroupMapDAO(SubjectGroupMapDAO subjectGroupMapDAO) {
this.subjectGroupMapDAO = subjectGroupMapDAO;
}
public StudyDAO getStudyDAO() {
return studyDAO;
}
public void setStudyDAO(StudyDAO studyDAO) {
this.studyDAO = studyDAO;
}
public StudyUserRoleBean getCurrentRole() {
return currentRole;
}
public void setCurrentRole(StudyUserRoleBean currentRole) {
this.currentRole = currentRole;
}
public EventCRFDAO getEventCRFDAO() {
return eventCRFDAO;
}
public void setEventCRFDAO(EventCRFDAO eventCRFDAO) {
this.eventCRFDAO = eventCRFDAO;
}
public EventDefinitionCRFDAO getEventDefintionCRFDAO() {
return eventDefintionCRFDAO;
}
public void setEventDefintionCRFDAO(EventDefinitionCRFDAO eventDefintionCRFDAO) {
this.eventDefintionCRFDAO = eventDefintionCRFDAO;
}
public StudyGroupDAO getStudyGroupDAO() {
return studyGroupDAO;
}
public void setStudyGroupDAO(StudyGroupDAO studyGroupDAO) {
this.studyGroupDAO = studyGroupDAO;
}
public UserAccountBean getCurrentUser() {
return currentUser;
}
public void setCurrentUser(UserAccountBean currentUser) {
this.currentUser = currentUser;
}
private class CharFilterMatcher implements FilterMatcher {
public boolean evaluate(Object itemValue, String filterValue) {
String item = StringUtils.lowerCase(String.valueOf(itemValue));
String filter = StringUtils.lowerCase(String.valueOf(filterValue));
if (StringUtils.contains(item, filter)) {
return true;
}
return false;
}
}
public class StatusFilterMatcher implements FilterMatcher {
public boolean evaluate(Object itemValue, String filterValue) {
String item = StringUtils.lowerCase(String.valueOf(((Status) itemValue).getName()));
String filter = StringUtils.lowerCase(String.valueOf(filterValue));
if (filter.equals(item)) {
return true;
}
return false;
}
}
public class SubjectEventStatusFilterMatcher implements FilterMatcher {
public boolean evaluate(Object itemValue, String filterValue) {
String item = StringUtils.lowerCase(SubjectEventStatus.getSubjectEventStatusName((Integer) itemValue));
String filter = StringUtils.lowerCase(String.valueOf(filterValue));// .trim().replace(" ", "_");
if (filterValue.equals(resterms.getString(item))) {
return true;
}
return false;
}
}
public class SubjectGroupFilterMatcher implements FilterMatcher {
public boolean evaluate(Object itemValue, String filterValue) {
String item = StringUtils.lowerCase(studyGroupDAO.findByPK(Integer.valueOf(itemValue.toString())).getName());
String filter = StringUtils.lowerCase(String.valueOf(filterValue.trim()));
if (filter.equals(item)) {
return true;
}
return false;
}
}
private class StatusCellEditor implements CellEditor {
public Object getValue(Object item, String property, int rowcount) {
StudySubjectBean studySubject = (StudySubjectBean) new BasicCellEditor().getValue(item, "studySubject", rowcount);
return studySubject.getStatus().getName();
}
}
private class StatusDroplistFilterEditor extends DroplistFilterEditor {
@Override
protected List<Option> getOptions() {
List<Option> options = new ArrayList<Option>();
for (Object status : Status.toDropDownArrayList()) {
((Status) status).getName();
options.add(new Option(((Status) status).getName(), ((Status) status).getName()));
}
return options;
}
}
private class SubjectEventStatusDroplistFilterEditor extends DroplistFilterEditor {
@Override
protected List<Option> getOptions() {
List<Option> options = new ArrayList<Option>();
for (Object subjectEventStatus : SubjectEventStatus.toArrayList()) {
((SubjectEventStatus) subjectEventStatus).getName();
options.add(new Option(((SubjectEventStatus) subjectEventStatus).getName(), ((SubjectEventStatus) subjectEventStatus).getName()));
}
return options;
}
}
private class SubjectGroupClassDroplistFilterEditor extends DroplistFilterEditor {
private StudyGroupClassBean studyGroupClass = new StudyGroupClassBean();
// constructor
SubjectGroupClassDroplistFilterEditor(StudyGroupClassBean studyGroupClass) {
this.studyGroupClass = studyGroupClass;
}
@Override
protected List<Option> getOptions() {
List<Option> options = new ArrayList<Option>();
StudyGroupDAO studyGroupDAO = getStudyGroupDAO();
for (Object subjectStudyGroup : studyGroupDAO.findAllByGroupClass(this.studyGroupClass)) {
options.add(new Option(((StudyGroupBean) subjectStudyGroup).getName(), ((StudyGroupBean) subjectStudyGroup).getName()));
}
return options;
}
}
private class StudyGroupClassCellEditor implements CellEditor {
StudyGroupClassBean studyGroupClass;
String groupName;
public StudyGroupClassCellEditor(StudyGroupClassBean studyGroupClass) {
this.studyGroupClass = studyGroupClass;
}
private String logic() {
return groupName != null ? groupName : "";
}
public Object getValue(Object item, String property, int rowcount) {
groupName = (String) ((HashMap<Object, Object>) item).get("grpName_sgc_" + studyGroupClass.getId());
return logic();
}
}
private class StudyEventDefinitionCellEditor implements CellEditor {
StudyEventDefinitionBean studyEventDefinition;
StudySubjectBean studySubjectBean;
SubjectEventStatus subjectEventStatus;
List<StudyEventBean> studyEvents;
public StudyEventDefinitionCellEditor(StudyEventDefinitionBean studyEventDefinition) {
this.studyEventDefinition = studyEventDefinition;
}
@SuppressWarnings("unchecked")
private void logic() {
studyEvents = getStudyEventDAO().findAllByStudySubjectAndDefinition(studySubjectBean, studyEventDefinition);
if (studyEvents.size() < 1) {
subjectEventStatus = SubjectEventStatus.NOT_SCHEDULED;
} else {
subjectEventStatus = studyEvents.get(studyEvents.size() - 1).getSubjectEventStatus();
}
}
private String getCount() {
return studyEvents.size() < 2 ? "" : " x" + String.valueOf(studyEvents.size() + "");
}
public Object getValue(Object item, String property, int rowcount) {
studySubjectBean = (StudySubjectBean) ((HashMap<Object, Object>) item).get("studySubject");
logic();
StringBuilder url = new StringBuilder();
url.append("<img src='" + imageIconPaths.get(subjectEventStatus.getId()) + "' border='0' style='position: relative; left: 7px;'>");
url.append(getCount());
return url.toString();
}
}
private class StudyEventDefinitionMapCellEditor implements CellEditor {
StudyEventDefinitionBean studyEventDefinition;
StudySubjectBean studySubjectBean;
SubjectEventStatus subjectEventStatus;
List<StudyEventBean> studyEvents;
SubjectBean subject;
private String getCount() {
return studyEvents.size() < 2 ? "" : " x" + String.valueOf(studyEvents.size() + "");
}
@SuppressWarnings("unchecked")
public Object getValue(Object item, String property, int rowcount) {
studyEvents = (List<StudyEventBean>) ((HashMap<Object, Object>) item).get(property + "_studyEvents");
studyEventDefinition = (StudyEventDefinitionBean) ((HashMap<Object, Object>) item).get(property + "_object");
subjectEventStatus = SubjectEventStatus.get((Integer) ((HashMap<Object, Object>) item).get(property));
subject = (SubjectBean) ((HashMap<Object, Object>) item).get("subject");
studySubjectBean = (StudySubjectBean) ((HashMap<Object, Object>) item).get("studySubject");
StringBuilder url = new StringBuilder();
url.append(eventDivBuilder(subject, rowcount, studyEvents, studyEventDefinition, studySubjectBean));
url.append("<img src='" + imageIconPaths.get(subjectEventStatus.getId()) + "' border='0' style='position: relative; left: 7px;'>");
url.append(getCount());
url.append("</a></td></tr></table>");
return url.toString();
}
}
private class ActionsCellEditor implements CellEditor {
@SuppressWarnings("unchecked")
public Object getValue(Object item, String property, int rowcount) {
String value = "";
StudySubjectBean studySubjectBean = (StudySubjectBean) ((HashMap<Object, Object>) item).get("studySubject");
Boolean isSignable = (Boolean) ((HashMap<Object, Object>) item).get("isSignable");
Integer studySubjectId = studySubjectBean.getId();
if (studySubjectId != null) {
StringBuilder url = new StringBuilder();
url.append(viewStudySubjectLinkBuilder(studySubjectBean));
if (getCurrentRole().getRole() != Role.MONITOR) {
if (getStudyBean().getStatus() == Status.AVAILABLE
&& !(studySubjectBean.getStatus() == Status.DELETED || studySubjectBean.getStatus() == Status.AUTO_DELETED)
&& getCurrentRole().getRole() != Role.RESEARCHASSISTANT && getCurrentRole().getRole() != Role.RESEARCHASSISTANT2) {
url.append(removeStudySubjectLinkBuilder(studySubjectBean));
}
if (getStudyBean().getStatus() == Status.AVAILABLE
&& (studySubjectBean.getStatus() == Status.DELETED || studySubjectBean.getStatus() == Status.AUTO_DELETED)) {
url.append(restoreStudySubjectLinkBuilder(studySubjectBean));
}
if (getStudyBean().getStatus() == Status.AVAILABLE && getCurrentRole().getRole() != Role.RESEARCHASSISTANT
&& getCurrentRole().getRole() != Role.RESEARCHASSISTANT2 && getCurrentRole().getRole() != Role.INVESTIGATOR
&& studySubjectBean.getStatus() == Status.AVAILABLE) {
url.append(reAssignStudySubjectLinkBuilder(studySubjectBean));
}
if (getCurrentRole().getRole() == Role.INVESTIGATOR && getStudyBean().getStatus() == Status.AVAILABLE
&& studySubjectBean.getStatus() != Status.DELETED && isSignable) {
url.append(signStudySubjectLinkBuilder(studySubjectBean));
}
try {
if (getStudyBean().getStatus() == Status.AVAILABLE
&& (getCurrentRole().getRole() == Role.RESEARCHASSISTANT || getCurrentRole().getRole() == Role.RESEARCHASSISTANT2)
&& studySubjectBean.getStatus() == Status.AVAILABLE && pManageStatus(studySubjectBean).equalsIgnoreCase("ACTIVE")
&& participateStatus(studySubjectBean).equalsIgnoreCase("enabled")) {
url.append(viewParticipateBuilder(studySubjectBean));
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
value = url.toString();
}
return value;
}
}
private String participateStatus(StudySubjectBean studySubjectBean) {
StudyBean study = (StudyBean) studyDAO.findByPK(studySubjectBean.getStudyId());
StudyBean pStudy = getParentStudy(study.getOid());
String participateFormStatus = getStudyParameterValueDAO().findByHandleAndStudy(pStudy.getId(), "participantPortal").getValue();
return participateFormStatus;
}
private String pManageStatus(StudySubjectBean studySubjectBean) throws Exception {
participantPortalRegistrar = new ParticipantPortalRegistrar();
StudyBean study = (StudyBean) studyDAO.findByPK(studySubjectBean.getStudyId());
StudyBean pStudy = getParentStudy(study.getOid());
String pManageStatus = participantPortalRegistrar.getCachedRegistrationStatus(pStudy.getOid(), session).toString(); // ACTIVE
return pManageStatus;
}
private StudyBean getParentStudy(String studyOid) {
StudyBean study = getStudy(studyOid);
if (study.getParentStudyId() == 0) {
return study;
} else {
StudyBean parentStudy = (StudyBean) studyDAO.findByPK(study.getParentStudyId());
return parentStudy;
}
}
private StudyBean getStudy(String oid) {
StudyBean studyBean = (StudyBean) studyDAO.findByOid(oid);
return studyBean;
}
private String viewStudySubjectLinkBuilder(StudySubjectBean studySubject) {
HtmlBuilder actionLink = new HtmlBuilder();
actionLink.a().href("ViewStudySubject?id=" + studySubject.getId());
actionLink.append("onMouseDown=\"javascript:setImage('bt_View1','images/bt_View_d.gif');\"");
actionLink.append("onMouseUp=\"javascript:setImage('bt_View1','images/bt_View.gif');\"").close();
actionLink.img().name("bt_View1").src("images/bt_View.gif").border("0").alt(resword.getString("view")).title(resword.getString("view"))
.append("hspace=\"2\"").end().aEnd();
actionLink.append(" ");
return actionLink.toString();
}
private String viewParticipateBuilder(StudySubjectBean studySubject) throws Exception {
participantPortalRegistrar = new ParticipantPortalRegistrar();
StudyBean study = (StudyBean) studyDAO.findByPK(studySubject.getStudyId());
StudyBean pStudy = getParentStudy(study.getOid());
String url = participantPortalRegistrar.getStudyHost(pStudy.getOid());
System.out.println("URL: " + url);
HtmlBuilder actionLink = new HtmlBuilder();
// actionLink.a().href("url?id=" + studySubject.getId());
actionLink.a().href(url + "?ssid=" + studySubject.getLabel());
actionLink.append("target=\"_blank\"");
actionLink.append("onMouseDown=\"javascript:setImage('bt_Participate1','images/bt_Ocui_d.gif');\"");
actionLink.append("onMouseUp=\"javascript:setImage('bt_Participate1','images/bt_Ocui.gif');\"").close();
actionLink.img().name("bt_Participate1").src("images/bt_Ocui.gif").border("0").alt(resword.getString("connect_participant"))
.title(resword.getString("connect_participant")).append("hspace=\"2\"").end().aEnd();
actionLink.append(" ");
return actionLink.toString();
}
private String removeStudySubjectLinkBuilder(StudySubjectBean studySubject) {
HtmlBuilder actionLink = new HtmlBuilder();
actionLink.a().href(
"RemoveStudySubject?action=confirm&id=" + studySubject.getId() + "&subjectId=" + studySubject.getSubjectId() + "&studyId="
+ studySubject.getStudyId());
actionLink.append("onMouseDown=\"javascript:setImage('bt_Remove1','images/bt_Remove_d.gif');\"");
actionLink.append("onMouseUp=\"javascript:setImage('bt_Remove1','images/bt_Remove.gif');\"").close();
actionLink.img().name("bt_Remove1").src("images/bt_Remove.gif").border("0").alt(resword.getString("remove")).title(resword.getString("remove"))
.append("hspace=\"2\"").end().aEnd();
actionLink.append(" ");
return actionLink.toString();
}
private String signStudySubjectLinkBuilder(StudySubjectBean studySubject) {
HtmlBuilder actionLink = new HtmlBuilder();
actionLink.a().href("SignStudySubject?id=" + studySubject.getId());
actionLink.append("onMouseDown=\"javascript:setImage('icon_signed','images/icon_Signed.gif');\"");
actionLink.append("onMouseUp=\"javascript:setImage('icon_signed','images/icon_Signed.gif');\"").close();
actionLink.img().name("bt_Sign1").src("images/icon_Signed.gif").border("0").alt(resword.getString("sign")).title(resword.getString("sign"))
.append("hspace=\"2\"").end().aEnd();
actionLink.append(" ");
return actionLink.toString();
}
private String reAssignStudySubjectLinkBuilder(StudySubjectBean studySubject) {
HtmlBuilder actionLink = new HtmlBuilder();
actionLink.a().href("ReassignStudySubject?id=" + studySubject.getId());
actionLink.append("onMouseDown=\"javascript:setImage('bt_Reassign1','images/bt_Reassign_d.gif');\"");
actionLink.append("onMouseUp=\"javascript:setImage('bt_Reassign1','images/bt_Reassign.gif');\"").close();
actionLink.img().name("bt_Reassign1").src("images/bt_Reassign.gif").border("0").alt(resword.getString("reassign")).title(resword.getString("reassign"))
.append("hspace=\"2\"").end().aEnd();
actionLink.append(" ");
return actionLink.toString();
}
private String restoreStudySubjectLinkBuilder(StudySubjectBean studySubject) {
HtmlBuilder actionLink = new HtmlBuilder();
actionLink.a().href(
"RestoreStudySubject?action=confirm&id=" + studySubject.getId() + "&subjectId=" + studySubject.getSubjectId() + "&studyId="
+ studySubject.getStudyId());
actionLink.append("onMouseDown=\"javascript:setImage('bt_Restor3','images/bt_Restore_d.gif');\"");
actionLink.append("onMouseUp=\"javascript:setImage('bt_Restor3','images/bt_Restore_d.gif');\"").close();
actionLink.img().name("bt_Restore1").src("images/bt_Restore.gif").border("0").alt(resword.getString("restore")).title(resword.getString("restore"))
.append("hspace=\"2\"").end().aEnd();
return actionLink.toString();
}
private String eventDivBuilder(SubjectBean subject, Integer rowCount, List<StudyEventBean> studyEvents, StudyEventDefinitionBean sed,
StudySubjectBean studySubject) {
String studySubjectLabel = studySubject.getLabel();
String divWidth = studyEvents.size() >= 3 ? "565" : studyEvents.size() == 2 ? "395" : "180";
HtmlBuilder eventDiv = new HtmlBuilder();
eventDiv.table(0).border("0").cellpadding("0").cellspacing("0").close();
// Lock Div
eventDiv.div().id("Lock_" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount)
.style("position: absolute; visibility: hidden; z-index: 3; width: 50px; height: 30px; top: 0px;").close();
if (studyEvents.size() > 1) {
repeatingLockLinkBuilder(eventDiv, studySubjectLabel, rowCount, studyEvents, sed);
} else {
lockLinkBuilder(eventDiv, studySubjectLabel, rowCount, studyEvents, sed);
}
eventDiv.divEnd();
eventDiv.tr(0).valign("top").close().td(0).close();
// Event Div
eventDiv.div().id("Event_" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount)
.style("position: absolute; visibility: hidden; z-index: 3;width:" + divWidth + "px; top: 0px; float: left;").close();
eventDiv.div().styleClass("box_T").close().div().styleClass("box_L").close().div().styleClass("box_R").close().div().styleClass("box_B").close().div()
.styleClass("box_TL").close().div().styleClass("box_TR").close().div().styleClass("box_BL").close().div().styleClass("box_BR").close();
eventDiv.div().styleClass("tablebox_center").close();
eventDiv.div().styleClass("ViewSubjectsPopup").style("color: rgb(91, 91, 91);").close();
eventDiv.table(0).border("0").cellpadding("0").cellspacing("0").close();
eventDiv.tr(0).valign("top").close();
if (studyEvents.size() > 1) {
repeatingEventDivBuilder(eventDiv, subject, rowCount, studyEvents, sed, studySubject);
} else {
singleEventDivBuilder(eventDiv, subject, rowCount, studyEvents, sed, studySubject);
}
return eventDiv.toString();
}
private void repeatingEventDivBuilder(HtmlBuilder eventDiv, SubjectBean subject, Integer rowCount, List<StudyEventBean> studyEvents,
StudyEventDefinitionBean sed, StudySubjectBean studySubject) {
String tableHeaderRowStyleClass = "table_header_row";
String tableHeaderRowLeftStyleClass = "table_header_row_left";
String add_another_occurrence = resword.getString("add_another_occurrence");
String click_for_more_options = resword.getString("click_for_more_options");
String schedule = resword.getString("schedule");
String view = resword.getString("view") + "/" + resword.getString("enter_data");
String edit = resword.getString("edit");
String remove = resword.getString("remove");
String occurrence_x_of = resword.getString("ocurrence");
String subjectText = resword.getString("subject");
String eventText = resword.getString("event");
String status = resword.getString("status");
StudyEventBean defaultEvent = studyEvents.get(0);
String studySubjectLabel = studySubject.getLabel();
Status eventSysStatus = studySubject.getStatus();
Integer studyEventsSize = studyEvents.size();
eventDiv.td(0).styleClass(tableHeaderRowLeftStyleClass).colspan("2").close();
eventDiv.append(subjectText).append(": ").append(studySubjectLabel).br();
eventDiv.append(eventText).append(": ").append(sed.getName()).br();
eventDiv.tdEnd();
eventDiv.td(0).styleClass(tableHeaderRowLeftStyleClass).align("right").colspan("3").close();
divCloseRepeatinglinkBuilder(eventDiv, studySubjectLabel, rowCount, studyEvents, sed);
eventDiv.br();
if (eventSysStatus != Status.DELETED && eventSysStatus != Status.AUTO_DELETED && studyBean.getStatus() == Status.AVAILABLE) {
eventDiv.span().styleClass("font-weight: normal;").close();
eventDiv.ahref("CreateNewStudyEvent?studySubjectId=" + studySubject.getId() + "&studyEventDefinition=" + sed.getId(), add_another_occurrence);
}
eventDiv.nbsp().nbsp().nbsp();
for (int i = 1; i <= studyEventsSize; i++) {
eventDiv.ahref("javascript:StatusBoxSkip('" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount + "'," + studyEventsSize + "," + i + ");",
String.valueOf(i));
if (i < studyEventsSize) {
eventDiv.append("|");
}
}
eventDiv.spanEnd();
eventDiv.tdEnd().trEnd(0);
eventDiv.tr(0).close();
// <td>...</td>
eventDiv.td(0).id("Scroll_off_" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount + "_back").styleClass("statusbox_scroll_L_dis").width("20")
.close();
eventDiv.img().src("images/arrow_status_back_dis.gif").border("0").close();
eventDiv.tdEnd();
// <td>...</td>
eventDiv.td(0).id("Scroll_on_" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount + "_back").styleClass("statusbox_scroll_L").width("20")
.style("display: none;").close();
// <div>...</div>
eventDiv.div().id("bt_Scroll_Event_" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount + "_back").style("display: none;").close();
eventDiv.a().href("javascript:StatusBoxBack('" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount + "'," + studyEventsSize + ");").close();
eventDiv.img().src("images/arrow_status_back.gif").border("0").close();
eventDiv.aEnd();
eventDiv.divEnd();
// <div>...</div>
eventDiv.div().id("bt_Scroll_Event_" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount + "_back_dis").close();
eventDiv.img().src("images/arrow_status_back_dis.gif").border("0").close();
eventDiv.divEnd();
eventDiv.tdEnd();
for (int i = 0; i < studyEvents.size(); i++) {
StudyEventBean studyEventBean = studyEvents.get(i);
// <td>...</td>
eventDiv.td(0).id("Event_" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount + "_" + (i + 1)).valign("top").width("180");
if (i + 1 > 3) {
eventDiv.style("display: none;");
}
eventDiv.close();
// <table>...</table>
eventDiv.table(0).border("0").cellpadding("0").cellspacing("0").width("100%").close();
// <tr><td>...</td></tr>
eventDiv.tr(0).valign("top").close();
eventDiv.td(0).styleClass(tableHeaderRowStyleClass).colspan("2").close();
eventDiv.bold().append(occurrence_x_of).append("#" + (i + 1) + " of " + studyEventsSize).br();
eventDiv.append(formatDate(studyEventBean.getDateStarted())).br();
eventDiv.append(status + ": " + studyEventBean.getSubjectEventStatus().getName());
eventDiv.boldEnd().tdEnd().trEnd(0);
// <tr><td><table>...</table></td></tr>
eventDiv.tr(0).id("Menu_on_" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount + "_" + (i + 1)).style("display: none").close();
eventDiv.td(0).colspan("2").close();
eventDiv.table(0).border("0").cellpadding("0").cellspacing("0").width("100%").close();
linksDivBuilder(eventDiv, subject, rowCount, studyEvents, sed, studySubject, studyEventBean);
eventDiv.tableEnd(0).tdEnd().trEnd(0);
eventDiv.tableEnd(0);
eventDiv.tdEnd();
}
// <td>...</td>
eventDiv.td(0).id("Scroll_off_" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount + "_next").styleClass("statusbox_scroll_R_dis").width("20")
.close();
eventDiv.img().src("images/arrow_status_next_dis.gif").border("0").close();
eventDiv.tdEnd();
// <td>...</td>
eventDiv.td(0).id("Scroll_on_" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount + "_next").styleClass("statusbox_scroll_R").width("20")
.style("display: none;").close();
// <div>...</div>
eventDiv.div().id("bt_Scroll_Event_" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount + "_next").close();
eventDiv.a().href("javascript:StatusBoxNext('" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount + "'," + studyEventsSize + ");").close();
eventDiv.img().src("images/arrow_status_next.gif").border("0").close();
eventDiv.aEnd();
eventDiv.divEnd();
// <div>...</div>
eventDiv.div().id("bt_Scroll_Event_" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount + "_next_dis").style("display: none;").close();
eventDiv.img().src("images/arrow_status_next_dis.gif").border("0").close();
eventDiv.divEnd();
eventDiv.tdEnd().trEnd(0);
eventDiv.tr(0).id("Menu_off_" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount).style("").close();
eventDiv.td(0).styleClass("table_cell_left").colspan(String.valueOf(studyEventsSize)).close().append("<i>").append(click_for_more_options)
.append("</i>").tdEnd();
eventDiv.trEnd(0);
eventDiv.tableEnd(0);
eventDiv.divEnd().divEnd().divEnd().divEnd().divEnd().divEnd().divEnd().divEnd().divEnd().divEnd().divEnd();
repeatingIconLinkBuilder(eventDiv, studySubjectLabel, rowCount, studyEvents, sed);
}
private void linksDivBuilder(HtmlBuilder eventDiv, SubjectBean subject, Integer rowCount, List<StudyEventBean> studyEvents, StudyEventDefinitionBean sed,
StudySubjectBean studySubject, StudyEventBean currentEvent) {
Status eventSysStatus = studySubject.getStatus();
SubjectEventStatus eventStatus = currentEvent.getSubjectEventStatus();
String studyEventId = String.valueOf(currentEvent.getId());
String view = resword.getString("view") + "/" + resword.getString("enter_data");
String edit = resword.getString("edit");
String remove = resword.getString("remove");
if (eventSysStatus.getId() == Status.AVAILABLE.getId() || eventSysStatus == Status.SIGNED) {
if (eventStatus == SubjectEventStatus.COMPLETED) {
eventDiv.tr(0).valign("top").close();
eventDiv.td(0).styleClass("table_cell").close();
enterDataForStudyEventLinkBuilder(eventDiv, studyEventId, view);
eventDiv.tdEnd().trEnd(0);
if ((currentRole.getRole() == Role.STUDYDIRECTOR || currentUser.isSysAdmin()) && studyBean.getStatus() == Status.AVAILABLE) {
eventDiv.tr(0).valign("top").close();
eventDiv.td(0).styleClass("table_cell").close();
updateStudyEventLinkBuilder(eventDiv, studySubject.getId(), studyEventId, edit);
eventDiv.tdEnd().trEnd(0);
eventDiv.tr(0).valign("top").close();
eventDiv.td(0).styleClass("table_cell").close();
removeStudyEventLinkBuilder(eventDiv, studySubject.getId(), studyEventId, remove);
eventDiv.tdEnd().trEnd(0);
}
} else if (eventStatus == SubjectEventStatus.LOCKED) {
if (currentRole.getRole() == Role.STUDYDIRECTOR || currentUser.isSysAdmin()) {
eventDiv.tr(0).valign("top").close();
eventDiv.td(0).styleClass("table_cell").close();
enterDataForStudyEventLinkBuilder(eventDiv, studyEventId, view);
eventDiv.tdEnd().trEnd(0);
if (studyBean.getStatus() == Status.AVAILABLE) {
eventDiv.tr(0).valign("top").close();
eventDiv.td(0).styleClass("table_cell").close();
removeStudyEventLinkBuilder(eventDiv, studySubject.getId(), studyEventId, remove);
eventDiv.tdEnd().trEnd(0);
}
}
} else {
eventDiv.tr(0).valign("top").close();
eventDiv.td(0).styleClass("table_cell_left");
enterDataForStudyEventLinkBuilder(eventDiv, studyEventId, view);
eventDiv.tdEnd().trEnd(0);
if ((currentRole.getRole() == Role.STUDYDIRECTOR || currentUser.isSysAdmin()) && studyBean.getStatus() == Status.AVAILABLE) {
eventDiv.tr(0).valign("top").close();
eventDiv.td(0).styleClass("table_cell_left").close();
updateStudyEventLinkBuilder(eventDiv, studySubject.getId(), studyEventId, edit);
eventDiv.tdEnd().trEnd(0);
eventDiv.tr(0).valign("top").close();
eventDiv.td(0).styleClass("table_cell_left").close();
removeStudyEventLinkBuilder(eventDiv, studySubject.getId(), studyEventId, remove);
eventDiv.tdEnd().trEnd(0);
}
}
}
if (eventSysStatus == Status.DELETED || eventSysStatus == Status.AUTO_DELETED) {
eventDiv.tr(0).valign("top").close();
eventDiv.td(0).styleClass("table_cell").close();
enterDataForStudyEventLinkBuilder(eventDiv, studyEventId, view);
eventDiv.tdEnd().trEnd(0);
}
}
private void singleEventDivBuilder(HtmlBuilder eventDiv, SubjectBean subject, Integer rowCount, List<StudyEventBean> studyEvents,
StudyEventDefinitionBean sed, StudySubjectBean studySubject) {
String tableHeaderRowStyleClass = "table_header_row";
String tableHeaderRowLeftStyleClass = "table_header_row_left";
String add_another_occurrence = resword.getString("add_another_occurrence");
String click_for_more_options = resword.getString("click_for_more_options");
String schedule = resword.getString("schedule");
String view = resword.getString("view") + "/" + resword.getString("enter_data");
String edit = resword.getString("edit");
String remove = resword.getString("remove");
String occurrence_x_of = resword.getString("ocurrence");
String subjectText = resword.getString("subject");
String eventText = resword.getString("event");
String status = resword.getString("status");
SubjectEventStatus eventStatus = studyEvents.size() == 0 ? SubjectEventStatus.NOT_SCHEDULED : studyEvents.get(0).getSubjectEventStatus();
String studyEventName = studyEvents.size() == 0 ? "" : studyEvents.get(0).getName();
String studyEventId = studyEvents.size() == 0 ? "" : String.valueOf(studyEvents.get(0).getId());
Status eventSysStatus = studySubject.getStatus();
String studySubjectLabel = studySubject.getLabel();
eventDiv.td(0).styleClass(tableHeaderRowLeftStyleClass).close();
eventDiv.append(subjectText).append(": ").append(studySubjectLabel).br();
eventDiv.append(eventText).append(": ").append(sed.getName()).br();
if (!sed.isRepeating()) {
eventDiv.append(resword.getString("status")).append(":").append(eventStatus.getName()).br();
eventDiv.tdEnd();
eventDiv.td(0).styleClass(tableHeaderRowLeftStyleClass).align("right").close();
linkBuilder(eventDiv, studySubjectLabel, rowCount, studyEvents, sed);
eventDiv.tdEnd();
} else {
eventDiv.tdEnd();
eventDiv.td(0).styleClass(tableHeaderRowLeftStyleClass).align("right").close();
linkBuilder(eventDiv, studySubjectLabel, rowCount, studyEvents, sed);
eventDiv.tdEnd();
eventDiv.tr(0).valign("top").close();
eventDiv.td(0).styleClass(tableHeaderRowStyleClass).colspan("2").close();
eventDiv.bold().append(occurrence_x_of).append("#1 of 1").br();
if (studyEvents.size() > 0) {
eventDiv.append(formatDate(studyEvents.get(0).getDateStarted())).br();
eventDiv.append(status + " : " + studyEvents.get(0).getSubjectEventStatus().getName());
} else {
eventDiv.append(status + " : " + SubjectEventStatus.NOT_SCHEDULED.getName());
}
eventDiv.boldEnd().tdEnd().trEnd(0);
if (eventStatus != SubjectEventStatus.NOT_SCHEDULED && eventSysStatus != Status.DELETED && eventSysStatus != Status.AUTO_DELETED) {
eventDiv.tr(0).close().td(0).styleClass("table_cell_left").close();
eventDiv.ahref("CreateNewStudyEvent?studySubjectId=" + studySubject.getId() + "&studyEventDefinition=" + sed.getId(), add_another_occurrence);
eventDiv.tdEnd().trEnd(0);
}
}
eventDiv.trEnd(0);
eventDiv.tr(0).id("Menu_off_" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount).style("display: all").close();
eventDiv.td(0).styleClass("table_cell_left").colspan("2").close().append("<i>").append(click_for_more_options).append("</i>").tdEnd();
eventDiv.trEnd(0);
eventDiv.tr(0).id("Menu_on_" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount).style("display: none").close();
eventDiv.td(0).colspan("2").close();
eventDiv.table(0).border("0").cellpadding("0").cellspacing("0").width("100%").close();
if (eventSysStatus.getId() == Status.AVAILABLE.getId() || eventSysStatus == Status.SIGNED) {
if (eventStatus == SubjectEventStatus.NOT_SCHEDULED && currentRole.getRole() != Role.MONITOR && !studyBean.getStatus().isFrozen()) {
eventDiv.tr(0).valign("top").close();
eventDiv.td(0).styleClass("table_cell_left").close();
createNewStudyEventLinkBuilder(eventDiv, studySubject.getId(), sed, schedule);
eventDiv.tdEnd().trEnd(0);
}
else if (eventStatus == SubjectEventStatus.COMPLETED) {
eventDiv.tr(0).valign("top").close();
eventDiv.td(0).styleClass("table_cell_left").close();
enterDataForStudyEventLinkBuilder(eventDiv, studyEventId, view);
eventDiv.tdEnd().trEnd(0);
if ((currentRole.getRole() == Role.STUDYDIRECTOR || currentUser.isSysAdmin()) && studyBean.getStatus() == Status.AVAILABLE) {
eventDiv.tr(0).valign("top").close();
eventDiv.td(0).styleClass("table_cell_left").close();
updateStudyEventLinkBuilder(eventDiv, studySubject.getId(), studyEventId, edit);
eventDiv.tdEnd().trEnd(0);
eventDiv.tr(0).valign("top").close();
eventDiv.td(0).styleClass("table_cell_left").close();
removeStudyEventLinkBuilder(eventDiv, studySubject.getId(), studyEventId, remove);
eventDiv.tdEnd().trEnd(0);
}
}
else if (eventStatus == SubjectEventStatus.LOCKED) {
eventDiv.tdEnd().trEnd(0);
if (currentRole.getRole() == Role.STUDYDIRECTOR || currentUser.isSysAdmin()) {
eventDiv.tr(0).valign("top").close();
eventDiv.td(0).styleClass("table_cell_left").close();
enterDataForStudyEventLinkBuilder(eventDiv, studyEventId, view);
eventDiv.tdEnd().trEnd(0);
if (studyBean.getStatus() == Status.AVAILABLE) {
eventDiv.tr(0).valign("top").close();
eventDiv.td(0).styleClass("table_cell_left").close();
removeStudyEventLinkBuilder(eventDiv, studySubject.getId(), studyEventId, remove);
eventDiv.tdEnd().trEnd(0);
}
}
} else {
eventDiv.tr(0).valign("top").close();
eventDiv.td(0).styleClass("table_cell_left");
enterDataForStudyEventLinkBuilder(eventDiv, studyEventId, view);
eventDiv.tdEnd().trEnd(0);
if ((currentRole.getRole() == Role.STUDYDIRECTOR || currentUser.isSysAdmin()) && studyBean.getStatus() == Status.AVAILABLE) {
eventDiv.tr(0).valign("top").close();
eventDiv.td(0).styleClass("table_cell_left").close();
updateStudyEventLinkBuilder(eventDiv, studySubject.getId(), studyEventId, edit);
eventDiv.tdEnd().trEnd(0);
eventDiv.tr(0).valign("top").close();
eventDiv.td(0).styleClass("table_cell_left").close();
removeStudyEventLinkBuilder(eventDiv, studySubject.getId(), studyEventId, remove);
eventDiv.tdEnd().trEnd(0);
}
}
}
if (eventSysStatus == Status.DELETED || eventSysStatus == Status.AUTO_DELETED) {
eventDiv.tr(0).valign("top").close();
eventDiv.td(0).styleClass("table_cell_left").close();
enterDataForStudyEventLinkBuilder(eventDiv, studyEventId, view);
eventDiv.tdEnd().trEnd(0);
}
eventDiv.tableEnd(0).tdEnd().trEnd(0);
eventDiv.tableEnd(0);
eventDiv.divEnd().divEnd().divEnd().divEnd().divEnd().divEnd().divEnd().divEnd().divEnd().divEnd().divEnd();
iconLinkBuilder(eventDiv, studySubjectLabel, rowCount, studyEvents, sed);
}
private void updateStudyEventLinkBuilder(HtmlBuilder builder, Integer studySubjectId, String studyEventId, String edit) {
String href1 = "UpdateStudyEvent?event_id=" + studyEventId + "&ss_id=" + studySubjectId;
builder.a().href(href1);
builder.close();
builder.img().src("images/bt_Edit.gif").border("0").align("left").close().aEnd();
builder.nbsp().nbsp().a().href(href1);
builder.close().append(edit).aEnd();
}
private void removeStudyEventLinkBuilder(HtmlBuilder builder, Integer studySubjectId, String studyEventId, String remove) {
String href1 = "RemoveStudyEvent?action=confirm&id=" + studyEventId + "&studySubId=" + studySubjectId;
builder.a().href(href1);
builder.close();
builder.img().src("images/bt_Remove.gif").border("0").align("left").close().aEnd();
builder.nbsp().nbsp().a().href(href1);
builder.close().append(remove).aEnd();
}
private void createNewStudyEventLinkBuilder(HtmlBuilder builder, Integer studySubjectId, StudyEventDefinitionBean sed, String schedule) {
String href1 = "CreateNewStudyEvent?studySubjectId=" + studySubjectId + "&studyEventDefinition=" + sed.getId();
builder.a().href(href1);
builder.close();
builder.img().src("images/bt_Schedule.gif").border("0").align("left").close().aEnd();
builder.nbsp().nbsp().a().href(href1);
builder.close().append(schedule).aEnd();
}
private void enterDataForStudyEventLinkBuilder(HtmlBuilder builder, String studyEventId, String view) {
String href1 = "EnterDataForStudyEvent?eventId=" + studyEventId;
builder.a().href(href1);
builder.close();
builder.img().src("images/bt_View.gif").border("0").align("left").close().aEnd();
builder.nbsp().nbsp().a().href(href1);
builder.close().append(view).aEnd();
}
private void lockLinkBuilder(HtmlBuilder builder, String studySubjectLabel, Integer rowCount, List<StudyEventBean> studyEvents, StudyEventDefinitionBean sed) {
String href1 = "javascript:leftnavExpand('Menu_on_" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount + "'); ";
String href2 = "javascript:leftnavExpand('Menu_off_" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount + "'); ";
String onmouseover = "layersShowOrHide('visible','Event_" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount + "'); ";
onmouseover += "javascript:setImage('ExpandIcon_" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount + "','images/icon_collapse.gif');";
String onClick1 = "layersShowOrHide('hidden','Lock_all'); ";
String onClick2 = "layersShowOrHide('hidden','Event_" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount + "'); ";
String onClick3 = "layersShowOrHide('hidden','Lock_" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount + "'); ";
String onClick4 = "javascript:setImage('ExpandIcon_" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount + "','images/icon_blank.gif'); ";
builder.a().href(href1 + href2);
builder.onmouseover(onmouseover);
builder.onclick(onClick1 + onClick2 + onClick3 + onClick4);
builder.close();
builder.img().src("images/spacer.gif").border("0").append("height=\"30\"").width("50").close().aEnd();
}
private void repeatingLockLinkBuilder(HtmlBuilder builder, String studySubjectLabel, Integer rowCount, List<StudyEventBean> studyEvents,
StudyEventDefinitionBean sed) {
String href1 = "javascript:ExpandEventOccurrences('" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount + "'," + studyEvents.size() + "); ";
// String href1 = "javascript:leftnavExpand('Menu_on_" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount
// + "'); ";
String href2 = "javascript:leftnavExpand('Menu_off_" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount + "'); ";
String onmouseover = "layersShowOrHide('visible','Event_" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount + "'); ";
onmouseover += "javascript:setImage('ExpandIcon_" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount + "','images/icon_collapse.gif');";
String onClick1 = "layersShowOrHide('hidden','Lock_all'); ";
String onClick2 = "layersShowOrHide('hidden','Event_" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount + "'); ";
String onClick3 = "layersShowOrHide('hidden','Lock_" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount + "'); ";
String onClick4 = "javascript:setImage('ExpandIcon_" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount + "','images/icon_blank.gif'); ";
builder.a().href(href1 + href2);
builder.onmouseover(onmouseover);
builder.onclick(onClick1 + onClick2 + onClick3 + onClick4);
builder.close();
builder.img().src("images/spacer.gif").border("0").append("height=\"30\"").width("50").close().aEnd();
}
private void repeatingIconLinkBuilder(HtmlBuilder builder, String studySubjectLabel, Integer rowCount, List<StudyEventBean> studyEvents,
StudyEventDefinitionBean sed) {
String href1 = "javascript:ExpandEventOccurrences('" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount + "'," + studyEvents.size() + "); ";
// String href1 = "javascript:leftnavExpand('Menu_on_" +
// studySubjectLabel + "_" + sed.getId() + "_" + rowCount + "'); ";
String href2 = "javascript:leftnavExpand('Menu_off_" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount + "'); ";
String onmouseover = "moveObject('Event_" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount + "', event); ";
onmouseover += "setImage('ExpandIcon_" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount + "','images/icon_expand.gif');";
String onmouseout = "layersShowOrHide('hidden','Event_" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount + "'); ";
onmouseout += "setImage('ExpandIcon_" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount + "','images/icon_blank.gif');";
String onClick1 = "layersShowOrHide('visible','Lock_all'); ";
String onClick2 = "LockObject('Lock_" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount + "',event); ";
builder.a().href(href1 + href2);
builder.onmouseover(onmouseover);
builder.onmouseout(onmouseout);
builder.onclick(onClick1 + onClick2);
builder.close();
}
private void iconLinkBuilder(HtmlBuilder builder, String studySubjectLabel, Integer rowCount, List<StudyEventBean> studyEvents, StudyEventDefinitionBean sed) {
String href1Repeating = "javascript:ExpandEventOccurrences('" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount + "'," + studyEvents.size()
+ "); ";
String href1 = "javascript:leftnavExpand('Menu_on_" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount + "'); ";
String href2 = "javascript:leftnavExpand('Menu_off_" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount + "'); ";
String onmouseover = "moveObject('Event_" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount + "', event); ";
onmouseover += "setImage('ExpandIcon_" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount + "','images/icon_expand.gif');";
String onmouseout = "layersShowOrHide('hidden','Event_" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount + "'); ";
onmouseout += "setImage('ExpandIcon_" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount + "','images/icon_blank.gif');";
String onClick1 = "layersShowOrHide('visible','Lock_all'); ";
String onClick2 = "LockObject('Lock_" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount + "',event); ";
String href = studyEvents.size() > 1 ? href1Repeating + href2 : href1 + href2;
builder.a().href(href);
builder.onmouseover(onmouseover);
builder.onmouseout(onmouseout);
builder.onclick(onClick1 + onClick2);
builder.close();
}
private void divCloseRepeatinglinkBuilder(HtmlBuilder builder, String studySubjectLabel, Integer rowCount, List<StudyEventBean> studyEvents,
StudyEventDefinitionBean sed) {
String href1 = "javascript:ExpandEventOccurrences('" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount + "'," + studyEvents.size() + "); ";
String href2 = "javascript:leftnavExpand('Menu_off_" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount + "'); ";
String onClick1 = "layersShowOrHide('hidden','Lock_all'); ";
String onClick2 = "layersShowOrHide('hidden','Event_" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount + "'); ";
String onClick3 = "layersShowOrHide('hidden','Lock_" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount + "'); ";
String onClick4 = "javascript:setImage('ExpandIcon_" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount + "','images/icon_blank.gif'); ";
builder.a().href(href1 + href2);
builder.onclick(onClick1 + onClick2 + onClick3 + onClick4);
builder.close().append("X").aEnd();
}
private void linkBuilder(HtmlBuilder builder, String studySubjectLabel, Integer rowCount, List<StudyEventBean> studyEvents, StudyEventDefinitionBean sed) {
String href1 = "javascript:leftnavExpand('Menu_on_" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount + "'); ";
String href2 = "javascript:leftnavExpand('Menu_off_" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount + "'); ";
String onClick1 = "layersShowOrHide('hidden','Lock_all'); ";
String onClick2 = "layersShowOrHide('hidden','Event_" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount + "'); ";
String onClick3 = "layersShowOrHide('hidden','Lock_" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount + "'); ";
String onClick4 = "javascript:setImage('ExpandIcon_" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount + "','images/icon_blank.gif'); ";
builder.a().href(href1 + href2);
builder.onclick(onClick1 + onClick2 + onClick3 + onClick4);
builder.close().append("X").aEnd();
}
private String formatDate(Date date) {
String format = resformat.getString("date_format_string");
SimpleDateFormat sdf = new SimpleDateFormat(format);
return sdf.format(date);
}
}