diff --git a/web/src/main/java/org/phoenixctms/ctsms/web/model/shared/search/ProbandSearchBean.java b/web/src/main/java/org/phoenixctms/ctsms/web/model/shared/search/ProbandSearchBean.java index 9b3142cc06ba..c535fae4aebd 100644 --- a/web/src/main/java/org/phoenixctms/ctsms/web/model/shared/search/ProbandSearchBean.java +++ b/web/src/main/java/org/phoenixctms/ctsms/web/model/shared/search/ProbandSearchBean.java @@ -166,7 +166,7 @@ public Collection getProbandListStatus(ProbandOutVO proband) { if (!probandListStatusCache.containsKey(proband.getId())) { Collection probandListStatus = null; try { - probandListStatus = WebUtil.getServiceLocator().getTrialService().getProbandListStatus(WebUtil.getAuthentication(), null, proband.getId(), true, null); + probandListStatus = WebUtil.getServiceLocator().getTrialService().getProbandListStatus(WebUtil.getAuthentication(), null, proband.getId(), true, null, null); } catch (ServiceException | AuthorisationException | IllegalArgumentException e) { } catch (AuthenticationException e) { WebUtil.publishException(e); diff --git a/web/src/main/java/org/phoenixctms/ctsms/web/model/trial/DepartmentChartBean.java b/web/src/main/java/org/phoenixctms/ctsms/web/model/trial/DepartmentChartBean.java new file mode 100644 index 000000000000..224723158eac --- /dev/null +++ b/web/src/main/java/org/phoenixctms/ctsms/web/model/trial/DepartmentChartBean.java @@ -0,0 +1,300 @@ +package org.phoenixctms.ctsms.web.model.trial; + +import java.io.ByteArrayInputStream; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Collection; +import java.util.Collections; +import java.util.Date; +import java.util.GregorianCalendar; +import java.util.HashMap; +import java.util.Iterator; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map.Entry; +import java.util.TreeMap; +import java.util.TreeSet; + +import org.phoenixctms.ctsms.compare.ProbandListStatusEntryOutVOComparator; +import org.phoenixctms.ctsms.enumeration.Color; +import org.phoenixctms.ctsms.enumeration.ProbandListStatusLogLevel; +import org.phoenixctms.ctsms.enumeration.VariablePeriod; +import org.phoenixctms.ctsms.exception.AuthenticationException; +import org.phoenixctms.ctsms.exception.AuthorisationException; +import org.phoenixctms.ctsms.exception.ServiceException; +import org.phoenixctms.ctsms.util.CommonUtil; +import org.phoenixctms.ctsms.vo.DepartmentVO; +import org.phoenixctms.ctsms.vo.ProbandListExcelVO; +import org.phoenixctms.ctsms.vo.ProbandListStatusEntryOutVO; +import org.phoenixctms.ctsms.web.model.CartesianChartModel; +import org.phoenixctms.ctsms.web.model.ManagedBeanBase; +import org.phoenixctms.ctsms.web.util.DateUtil; +import org.phoenixctms.ctsms.web.util.DefaultSettings; +import org.phoenixctms.ctsms.web.util.MessageCodes; +import org.phoenixctms.ctsms.web.util.Messages; +import org.phoenixctms.ctsms.web.util.SettingCodes; +import org.phoenixctms.ctsms.web.util.Settings; +import org.phoenixctms.ctsms.web.util.Settings.Bundle; +import org.phoenixctms.ctsms.web.util.WebUtil; +import org.primefaces.model.DefaultStreamedContent; +import org.primefaces.model.StreamedContent; +import org.primefaces.model.chart.ChartSeries; + +public class DepartmentChartBean extends ManagedBeanBase { + + private Long trialId; + //private TrialOutVO trial; + private CartesianChartModel chartModel; + private List departmentColors; + private ArrayList seriesColors; + private Date minX; + private Date maxX; + private Integer maxY; + private boolean stacked; + + public DepartmentChartBean() { + super(); + chartModel = new CartesianChartModel(); + departmentColors = Settings.getColorList(SettingCodes.DEPARTMENT_CHART_DEPARTMENT_COLORS, Bundle.SETTINGS, DefaultSettings.DEPARTMENT_CHART_DEPARTMENT_COLORS); + seriesColors = new ArrayList(); + } + + @Override + protected String changeAction(Long id) { + this.trialId = id; + initIn(); + initSets(); + return CHANGE_OUTCOME; + } + + private String dateToString(Date date) { + return WebUtil.quoteJSString(DateUtil.getJqPlotJsDateFormat().format(date), true); + } + + public CartesianChartModel getChartModel() { + if (isChartEmpty()) { + CartesianChartModel emptyChartModel = new CartesianChartModel(); + ChartSeries emptyChartSeries = new ChartSeries(); + emptyChartSeries.setLabel(Messages.getString(MessageCodes.EMPTY_CHART_LABEL)); + emptyChartSeries.set(dateToString(new Date()), 0); + emptyChartModel.addSeries(emptyChartSeries); + return emptyChartModel; + } + return chartModel; + } + + public boolean getEnableExports() { + return Settings.getBoolean(SettingCodes.ENABLE_PROBAND_LIST_EXPORTS, Bundle.SETTINGS, DefaultSettings.ENABLE_PROBAND_LIST_EXPORTS); + } + + public StreamedContent getEnrollmentLogExcelStreamedContent() throws Exception { + try { + ProbandListExcelVO excel = WebUtil.getServiceLocator().getTrialService().exportProbandList(WebUtil.getAuthentication(), trialId, ProbandListStatusLogLevel.ENROLLMENT); + return new DefaultStreamedContent(new ByteArrayInputStream(excel.getDocumentDatas()), excel.getContentType().getMimeType(), excel.getFileName()); + } catch (AuthenticationException e) { + WebUtil.publishException(e); + throw e; + } catch (AuthorisationException | ServiceException | IllegalArgumentException e) { + throw e; + } + } + + public long getMaxX() { + return (maxX != null ? maxX : WebUtil.subIntervals(new Date(), VariablePeriod.MONTH, null, 1)).getTime(); + } + + public Integer getMaxY() { + return maxY; + } + + public long getMinX() { + return (minX != null ? minX : new Date()).getTime(); + } + + public StreamedContent getPreScreeningLogExcelStreamedContent() throws Exception { + try { + ProbandListExcelVO excel = WebUtil.getServiceLocator().getTrialService() + .exportProbandList(WebUtil.getAuthentication(), trialId, ProbandListStatusLogLevel.PRE_SCREENING); + return new DefaultStreamedContent(new ByteArrayInputStream(excel.getDocumentDatas()), excel.getContentType().getMimeType(), excel.getFileName()); + } catch (AuthenticationException e) { + WebUtil.publishException(e); + throw e; + } catch (AuthorisationException | ServiceException | IllegalArgumentException e) { + throw e; + } + } + + public StreamedContent getScreeningLogExcelStreamedContent() throws Exception { + try { + ProbandListExcelVO excel = WebUtil.getServiceLocator().getTrialService().exportProbandList(WebUtil.getAuthentication(), trialId, ProbandListStatusLogLevel.SCREENING); + return new DefaultStreamedContent(new ByteArrayInputStream(excel.getDocumentDatas()), excel.getContentType().getMimeType(), excel.getFileName()); + } catch (AuthenticationException e) { + WebUtil.publishException(e); + throw e; + } catch (AuthorisationException | ServiceException | IllegalArgumentException e) { + throw e; + } + } + + public String getSeriesColors() { + return WebUtil.getSeriesColors(seriesColors); + } + + public StreamedContent getSiclExcelStreamedContent() throws Exception { + try { + ProbandListExcelVO excel = WebUtil.getServiceLocator().getTrialService().exportProbandList(WebUtil.getAuthentication(), trialId, ProbandListStatusLogLevel.SICL); + return new DefaultStreamedContent(new ByteArrayInputStream(excel.getDocumentDatas()), excel.getContentType().getMimeType(), excel.getFileName()); + } catch (AuthenticationException e) { + WebUtil.publishException(e); + throw e; + } catch (AuthorisationException | ServiceException | IllegalArgumentException e) { + throw e; + } + } + + private void initIn() { + stacked = true; + } + + private void initSets() { + chartModel.clear(); + seriesColors.clear(); + minX = null; + maxX = null; + maxY = null; + //trial = WebUtil.getTrial(trialId); + Collection departments = null; + try { + departments = WebUtil.getServiceLocator().getSelectionSetService().getAllDepartments(WebUtil.getAuthentication()); + } catch (ServiceException | AuthorisationException | IllegalArgumentException e) { + } catch (AuthenticationException e) { + WebUtil.publishException(e); + } + HashMap departmentMap; + if (departments != null) { + departmentMap = new HashMap(departments.size()); + Iterator departmentColorsIt = CommonUtil.getCircularIterator(departmentColors); + Iterator departmentsIt = departments.iterator(); + while (departmentsIt.hasNext()) { + DepartmentVO department = departmentsIt.next(); + departmentMap.put(department.getId(), department); + seriesColors.add(departmentColorsIt.next()); + } + } else { + departmentMap = new HashMap(); + } + Collection initialProbandListStatus = null; + if (trialId != null) { + try { + initialProbandListStatus = WebUtil.getServiceLocator().getTrialService().getProbandListStatus(WebUtil.getAuthentication(), trialId, null, false, true, null); + } catch (ServiceException | AuthorisationException | IllegalArgumentException e) { + } catch (AuthenticationException e) { + WebUtil.publishException(e); + } + } + if (initialProbandListStatus == null) { + initialProbandListStatus = new ArrayList(); + } else { + initialProbandListStatus = new ArrayList(initialProbandListStatus); + Collections.sort((ArrayList) initialProbandListStatus, new ProbandListStatusEntryOutVOComparator()); + } + HashMap> seriesMap = new HashMap>(); + LinkedHashMap probandMap = new LinkedHashMap(); + Iterator probandListStatusIt = initialProbandListStatus.iterator(); + while (probandListStatusIt.hasNext()) { + ProbandListStatusEntryOutVO probandListStatusEntry = probandListStatusIt.next(); + Long probandId = probandListStatusEntry.getListEntry().getProband().getId(); + TreeMap enrollmentStatusMap; + if (!probandMap.containsKey(probandId)) { + probandMap.put(probandId, probandListStatusEntry); + } + } + maxY = probandMap.size(); + TreeSet dates = new TreeSet(); + probandListStatusIt = probandMap.values().iterator(); + while (probandListStatusIt.hasNext()) { + ProbandListStatusEntryOutVO probandListStatusEntry = probandListStatusIt.next(); + Long departmentId = probandListStatusEntry.getListEntry().getProband().getDepartment().getId(); + //Long statusId = probandListStatusEntry.getStatus().getId(); + GregorianCalendar cal = new GregorianCalendar(); + cal.setTime(probandListStatusEntry.getRealTimestamp()); + Date date = (new GregorianCalendar(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DAY_OF_MONTH), 0, 0, 0)).getTime(); + dates.add(date); + //TreeMap enrollmentStatusMap = probandMap.get(probandListStatusEntry.getListEntry().getProband().getId()); + //Entry previousStatus = enrollmentStatusMap.lowerEntry(probandListStatusEntry.getId()); + TreeMap series; + if (seriesMap.containsKey(departmentId)) { + series = seriesMap.get(departmentId); + } else { + series = new TreeMap(); + seriesMap.put(departmentId, series); + } + if (series.containsKey(date)) { + series.put(date, series.get(date).intValue() + 1); + } else { + if (series.size() > 0) { + series.put(date, series.lastEntry().getValue().intValue() + 1); + } else { + series.put(date, 1); + } + } + // if (previousStatus != null) { + // series = seriesMap.get(previousStatus.getValue().getStatus().getId()); + // series.put(date, series.lastEntry().getValue().intValue() - 1); + // } + } + if (dates.size() > 0) { + minX = dates.first(); + maxX = dates.last(); + } + Iterator seriesMapIt = seriesMap.keySet().iterator(); + while (seriesMapIt.hasNext()) { + Long departmentId = seriesMapIt.next(); + DepartmentVO department = departmentMap.get(departmentId); + TreeMap series = seriesMap.get(departmentId); + if (department != null && series.size() > 0) { + ChartSeries chartLine = new ChartSeries(); + chartLine.setLabel(department.getName()); + Iterator datesIt = dates.iterator(); + while (datesIt.hasNext()) { + Date date = datesIt.next(); + if (series.containsKey(date)) { + chartLine.set(dateToString(date), series.get(date)); + } else { + Entry previousValue = series.lowerEntry(date); + chartLine.set(dateToString(date), previousValue == null ? 0 : previousValue.getValue()); + } + } + chartModel.addSeries(chartLine); + //seriesColors.add(department.getColor()); + } + } + } + + public boolean isChartEmpty() { + return chartModel.getSeries().isEmpty(); + } + + @Override + public boolean isCreateable() { + return false; + } + + @Override + public boolean isCreated() { + return false; + } + + public boolean isStacked() { + return stacked; + } + + public void setStacked(boolean stacked) { + this.stacked = stacked; + } + + public void updateChart() { + initIn(); + initSets(); + } +} diff --git a/web/src/main/java/org/phoenixctms/ctsms/web/model/trial/EnrollmentChartBean.java b/web/src/main/java/org/phoenixctms/ctsms/web/model/trial/EnrollmentChartBean.java index c232cf5f0def..bf093e43e00f 100644 --- a/web/src/main/java/org/phoenixctms/ctsms/web/model/trial/EnrollmentChartBean.java +++ b/web/src/main/java/org/phoenixctms/ctsms/web/model/trial/EnrollmentChartBean.java @@ -181,7 +181,7 @@ private void initSets() { Collection probandListStatus = null; if (trialId != null) { try { - probandListStatus = WebUtil.getServiceLocator().getTrialService().getProbandListStatus(WebUtil.getAuthentication(), trialId, null, false, null); + probandListStatus = WebUtil.getServiceLocator().getTrialService().getProbandListStatus(WebUtil.getAuthentication(), trialId, null, false, null, null); } catch (ServiceException | AuthorisationException | IllegalArgumentException e) { } catch (AuthenticationException e) { WebUtil.publishException(e); diff --git a/web/src/main/java/org/phoenixctms/ctsms/web/model/trial/ProbandListEntryBean.java b/web/src/main/java/org/phoenixctms/ctsms/web/model/trial/ProbandListEntryBean.java index 79de5809437b..4e5339da88b7 100644 --- a/web/src/main/java/org/phoenixctms/ctsms/web/model/trial/ProbandListEntryBean.java +++ b/web/src/main/java/org/phoenixctms/ctsms/web/model/trial/ProbandListEntryBean.java @@ -289,7 +289,8 @@ public Collection getProbandListStatus(ProbandOutVO proband) { Collection probandListStatus = null; Collection probandListStatusFiltered = new ArrayList(); try { - probandListStatus = WebUtil.getServiceLocator().getTrialService().getProbandListStatus(WebUtil.getAuthentication(), trialId, proband.getId(), false, null); + probandListStatus = WebUtil.getServiceLocator().getTrialService().getProbandListStatus(WebUtil.getAuthentication(), trialId, proband.getId(), false, null, + null); } catch (ServiceException | AuthorisationException | IllegalArgumentException e) { } catch (AuthenticationException e) { WebUtil.publishException(e); diff --git a/web/src/main/java/org/phoenixctms/ctsms/web/model/trial/TrialAssociationBean.java b/web/src/main/java/org/phoenixctms/ctsms/web/model/trial/TrialAssociationBean.java index bb7301da86ec..b27c710b93a7 100644 --- a/web/src/main/java/org/phoenixctms/ctsms/web/model/trial/TrialAssociationBean.java +++ b/web/src/main/java/org/phoenixctms/ctsms/web/model/trial/TrialAssociationBean.java @@ -32,6 +32,7 @@ public class TrialAssociationBean extends ManagedBeanBase { private TrialMassMailLazyModel trialMassMailModel; private BookingDurationSummaryModel bookingDurationModel; private EnrollmentChartBean enrollmentChartBean; + private DepartmentChartBean departmentChartBean; private RandomizationListCodeLazyModel randomizationListCodeModel; public TrialAssociationBean() { @@ -42,6 +43,7 @@ public TrialAssociationBean() { trialMassMailModel = new TrialMassMailLazyModel(); bookingDurationModel = new BookingDurationSummaryModel(BookingDurationSummaryType.TRIAL); enrollmentChartBean = new EnrollmentChartBean(); + departmentChartBean = new DepartmentChartBean(); randomizationListCodeModel = new RandomizationListCodeLazyModel(); } @@ -64,6 +66,10 @@ public EnrollmentChartBean getEnrollmentChartBean() { return enrollmentChartBean; } + public DepartmentChartBean getDepartmentChartBean() { + return departmentChartBean; + } + public String getMassMailProgressLabel(MassMailOutVO massMail) { return WebUtil.getMassMailProgressLabel(massMail, trialMassMailModel.getMassMailProgress(massMail)); } @@ -107,6 +113,10 @@ public void handleEnrollmentChartChange() { enrollmentChartBean.changeRootEntity(trialId); } + public void handleDepartmentChartChange() { + departmentChartBean.changeRootEntity(trialId); + } + public void handleShiftDurationSummaryChange() { now = new Date(); shiftDurationModel.reset(now, ShiftDurationSummaryType.TRIAL, trialId); @@ -147,6 +157,7 @@ private void initSets() { shiftDurationModel.reset(now, ShiftDurationSummaryType.TRIAL, null); bookingDurationModel.reset(now, BookingDurationSummaryType.TRIAL, null); enrollmentChartBean.changeRootEntity(null); + departmentChartBean.changeRootEntity(null); } @Override diff --git a/web/src/main/java/org/phoenixctms/ctsms/web/util/DefaultSettings.java b/web/src/main/java/org/phoenixctms/ctsms/web/util/DefaultSettings.java index 575a0f2c8c58..856f11ce7bf7 100644 --- a/web/src/main/java/org/phoenixctms/ctsms/web/util/DefaultSettings.java +++ b/web/src/main/java/org/phoenixctms/ctsms/web/util/DefaultSettings.java @@ -603,6 +603,7 @@ public final class DefaultSettings { public static final Color DUTY_SELF_ALLOCATION_LOCKED_COLOR = Color.GAINSBORO; public static final ArrayList INVENTORY_BOOKING_SCHEDULE_TRIAL_COLORS = new ArrayList(); public static final ArrayList DUTY_ROSTER_SCHEDULE_TRIAL_COLORS = new ArrayList(); + public static final ArrayList DEPARTMENT_CHART_DEPARTMENT_COLORS = new ArrayList(); public static final Long MAX_COST_TYPES_PER_TRIAL = 10l; public static final Long MAX_COST_TYPES_COLUMNS = 5l; public final static Color ENROLLMENT_STATUS_IS_NOT_COUNT_COLOR = Color.GAINSBORO; diff --git a/web/src/main/java/org/phoenixctms/ctsms/web/util/SettingCodes.java b/web/src/main/java/org/phoenixctms/ctsms/web/util/SettingCodes.java index fb2b30336284..3e87a69f1d3c 100644 --- a/web/src/main/java/org/phoenixctms/ctsms/web/util/SettingCodes.java +++ b/web/src/main/java/org/phoenixctms/ctsms/web/util/SettingCodes.java @@ -450,6 +450,7 @@ public interface SettingCodes { public final static String DUTY_SELF_ALLOCATION_LOCKED_COLOR = "duty_self_allocation_locked_color"; public final static String INVENTORY_BOOKING_SCHEDULE_TRIAL_COLORS = "inventory_booking_schedule_trial_colors"; public final static String DUTY_ROSTER_SCHEDULE_TRIAL_COLORS = "duty_roster_schedule_trial_colors"; + public final static String DEPARTMENT_CHART_DEPARTMENT_COLORS = "department_chart_department_colors"; public final static String MAX_COST_TYPES_PER_TRIAL = "max_cost_types_per_trial"; public final static String MAX_COST_TYPES_COLUMNS = "max_cost_types_columns"; public final static String ENROLLMENT_STATUS_IS_NOT_COUNT_COLOR = "enrollment_status_is_not_count_color"; diff --git a/web/src/main/java/org/phoenixctms/ctsms/web/util/WebUtil.java b/web/src/main/java/org/phoenixctms/ctsms/web/util/WebUtil.java index 5c4ae6d5550f..1f58c17268fa 100644 --- a/web/src/main/java/org/phoenixctms/ctsms/web/util/WebUtil.java +++ b/web/src/main/java/org/phoenixctms/ctsms/web/util/WebUtil.java @@ -3580,7 +3580,7 @@ public static Long getSelectionSetValueCount(Long inputFieldId) { return null; } - public static String getSeriesColors(ArrayList colors) { + public static String getSeriesColors(List colors) { if (colors != null && colors.size() > 0) { StringBuilder seriesColors = new StringBuilder(); Iterator colorsIt = colors.iterator(); diff --git a/web/src/main/resources/org/phoenixctms/ctsms/web/settings.properties b/web/src/main/resources/org/phoenixctms/ctsms/web/settings.properties index 6f0cf2de08e3..ebe6f5c4d452 100644 --- a/web/src/main/resources/org/phoenixctms/ctsms/web/settings.properties +++ b/web/src/main/resources/org/phoenixctms/ctsms/web/settings.properties @@ -417,6 +417,7 @@ show_inventory_booking_schedule_event_inventory_icons=true show_timeline_event_schedule_event_icons=false duty_roster_schedule_trial_colors=LIGHTSTEELBLUE,LIGHTBLUE,LIGHTSKYBLUE,POWDERBLUE,LIGHTCYAN,LAVENDER,PALETURQUOISE,LAVENDER,THISTLE,PLUM,VIOLET,ORCHID,MEDIUMORCHID,MEDIUMPURPLE +department_chart_department_colors=LIGHTSTEELBLUE,LIGHTBLUE,LIGHTSKYBLUE,POWDERBLUE,LIGHTCYAN,LAVENDER,PALETURQUOISE,LAVENDER,THISTLE,PLUM,VIOLET,ORCHID,MEDIUMORCHID,MEDIUMPURPLE notifications_obsolete=null notifications_send=null diff --git a/web/src/main/resources/org/phoenixctms/ctsms/web/trial/labels.properties b/web/src/main/resources/org/phoenixctms/ctsms/web/trial/labels.properties index 84681e4c89c5..ba4870f31866 100644 --- a/web/src/main/resources/org/phoenixctms/ctsms/web/trial/labels.properties +++ b/web/src/main/resources/org/phoenixctms/ctsms/web/trial/labels.properties @@ -1339,6 +1339,7 @@ proband_list_entry_bulk_delete_confirmation_dialog_message=Multiple proband list trial_association_shift_duration_summary_tab_label=Shift Summary trial_association_booking_duration_summary_tab_label=Inventory Utilisation trial_association_enrollment_chart_tab_label=Enrollment Progress +trial_association_department_chart_tab_label=Inclusions per Site trial_association_courses_tab_label=Courses trial_association_courses_list_header=course(s) @@ -1365,6 +1366,12 @@ trial_association_enrollment_chart_yaxis_label=#Probands trial_association_enrollment_chart_stacked_label=Stacked: trial_association_enrollment_chart_stacked_tooltip=Display area graphs stacked. +trial_association_department_chart_xaxis_label=Time +trial_association_department_chart_yaxis_label=#Probands + +trial_association_department_chart_stacked_label=Stacked: +trial_association_department_chart_stacked_tooltip=Display area graphs stacked. + trial_association_randomization_list_codes_tab_label=Randomization Codes trial_association_randomizationlistcodes_list_header=randomization code(s) trial_association_randomizationlistcodes_list_code_column=Code diff --git a/web/src/main/resources/org/phoenixctms/ctsms/web/trial/labels_de.properties b/web/src/main/resources/org/phoenixctms/ctsms/web/trial/labels_de.properties index 758565249d4a..a4ba135bd4e0 100644 --- a/web/src/main/resources/org/phoenixctms/ctsms/web/trial/labels_de.properties +++ b/web/src/main/resources/org/phoenixctms/ctsms/web/trial/labels_de.properties @@ -1340,6 +1340,7 @@ proband_list_entry_bulk_delete_confirmation_dialog_message=Es werden mehrere Pro trial_association_shift_duration_summary_tab_label=Stunden\u00FCbersicht trial_association_booking_duration_summary_tab_label=Inventarnutzung trial_association_enrollment_chart_tab_label=Enrollment Fortschritt +trial_association_department_chart_tab_label=Einschl\u00FCsse pro Site trial_association_courses_tab_label=Kurse trial_association_courses_list_header=Kurs(e) @@ -1366,6 +1367,12 @@ trial_association_enrollment_chart_yaxis_label=#Probanden trial_association_enrollment_chart_stacked_label=Stapeln: trial_association_enrollment_chart_stacked_tooltip=Fl\u00E4chenkurven \u00FCberinander stapeln. +trial_association_department_chart_xaxis_label=Zeit +trial_association_department_chart_yaxis_label=#Probanden + +trial_association_department_chart_stacked_label=Stapeln: +trial_association_department_chart_stacked_tooltip=Fl\u00E4chenkurven \u00FCberinander stapeln. + trial_association_randomization_list_codes_tab_label=Randomisierungscodes trial_association_randomizationlistcodes_list_header=Randomisierungscode(s) trial_association_randomizationlistcodes_list_code_column=Code diff --git a/web/src/main/webapp/META-INF/includes/trial/trialAssociation.xhtml b/web/src/main/webapp/META-INF/includes/trial/trialAssociation.xhtml index 1d97eb341f17..c01a3e141e79 100644 --- a/web/src/main/webapp/META-INF/includes/trial/trialAssociation.xhtml +++ b/web/src/main/webapp/META-INF/includes/trial/trialAssociation.xhtml @@ -14,6 +14,10 @@ + + - - - - - - - - - - - - - - - - - - - - - - + - + @@ -447,23 +432,103 @@ actionListener="#{trialAssociationBean.enrollmentChartBean.updateChart}" value="#{labels.update_chart_button_label}" icon="ui-icon-refresh" ajax="true" - update="stacked,enrollmentChart" /> + update="enrollmentChart_stacked,enrollmentChart" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - -