diff --git a/src/main/java/org/olat/core/gui/components/form/flexible/elements/MultipleSelectionElement.java b/src/main/java/org/olat/core/gui/components/form/flexible/elements/MultipleSelectionElement.java index 2c26d85de130401b3fcd88a76a3a185e7611d904..23269f389cc2103bba37231fc45f7b0cbf62e69e 100644 --- a/src/main/java/org/olat/core/gui/components/form/flexible/elements/MultipleSelectionElement.java +++ b/src/main/java/org/olat/core/gui/components/form/flexible/elements/MultipleSelectionElement.java @@ -26,6 +26,7 @@ package org.olat.core.gui.components.form.flexible.elements; import java.util.Collection; +import java.util.List; import java.util.Set; @@ -43,6 +44,8 @@ public interface MultipleSelectionElement extends SelectionElement { */ public Collection<String> getSelectedKeys(); + public List<String> getSelectedValues(); + public void setKeysAndValues(String[] keys, String[] values); /** diff --git a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/MultipleSelectionElementImpl.java b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/MultipleSelectionElementImpl.java index 24ba5c4205541d96a0719b05a72960891a40c900..ef6fbb7297b43420d0ebb98f5a935c1631f8c09e 100644 --- a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/MultipleSelectionElementImpl.java +++ b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/MultipleSelectionElementImpl.java @@ -25,17 +25,18 @@ */ package org.olat.core.gui.components.form.flexible.impl.elements; +import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.HashSet; import java.util.List; import java.util.Set; +import org.apache.logging.log4j.Logger; import org.olat.core.gui.UserRequest; import org.olat.core.gui.components.form.flexible.elements.MultipleSelectionElement; import org.olat.core.gui.components.form.flexible.impl.Form; import org.olat.core.gui.components.form.flexible.impl.FormItemImpl; -import org.apache.logging.log4j.Logger; import org.olat.core.logging.Tracing; import org.olat.core.util.ConsumableBoolean; import org.olat.core.util.ValidationStatus; @@ -136,6 +137,21 @@ public class MultipleSelectionElementImpl extends FormItemImpl implements Multip public Collection<String> getSelectedKeys() { return selected; } + + @Override + public List<String> getSelectedValues() { + if (selected == null || selected.isEmpty()) return new ArrayList<>(0); + + List<String> selectedValues = new ArrayList<>(); + for (int i = 0; i < keys.length; i++) { + String key = keys[i]; + if (selected.contains(key)) { + String value = values[i]; + selectedValues.add(value); + } + } + return selectedValues; + } @Override public void setKeysAndValues(String[] keys, String[] values) { diff --git a/src/main/java/org/olat/modules/quality/analysis/ui/AnalysisController.java b/src/main/java/org/olat/modules/quality/analysis/ui/AnalysisController.java index 0d1e2961bd805abd5a780ce3e46b5b4162fde052..466e3b8cef6b5dc0fad8b5bcb8870388daf3fac3 100644 --- a/src/main/java/org/olat/modules/quality/analysis/ui/AnalysisController.java +++ b/src/main/java/org/olat/modules/quality/analysis/ui/AnalysisController.java @@ -180,7 +180,6 @@ public class AnalysisController extends BasicController implements TooledControl public void initTools() { initPresentationTools(); initOutputTools(); - initFilterTools(); stackPanel.addTool(segmentButtonsCmp, true); } @@ -214,18 +213,19 @@ public class AnalysisController extends BasicController implements TooledControl printPopupLink.setIconLeftCSS("o_icon o_icon-fw o_icon_qual_ana_print"); printPopupLink.setPopup(new LinkPopupSettings(950, 750, "report-hm")); stackPanel.addTool(printPopupLink, Align.right, true); - - toolComponents = new ToolComponents(stackPanel, printLink, printPopupLink, pdfLink, exportLink); - } - - private void initFilterTools() { + showFilterLink = LinkFactory.createToolLink("filter.show", translate("filter.show"), this); showFilterLink.setIconLeftCSS("o_icon o_icon-fw o_icon_qual_ana_show_filter"); stackPanel.addTool(showFilterLink, Align.right, true); + hideFilterLink = LinkFactory.createToolLink("filter.hide", translate("filter.hide"), this); hideFilterLink.setIconLeftCSS("o_icon o_icon-fw o_icon_qual_ana_hide_filter"); stackPanel.addTool(hideFilterLink, Align.right, true); + doHideFilter(); + + toolComponents = new ToolComponents(stackPanel, printLink, printPopupLink, pdfLink, exportLink, showFilterLink, + hideFilterLink); } @Override @@ -402,6 +402,7 @@ public class AnalysisController extends BasicController implements TooledControl toolComponents.setPrintPopupVisibility(false); toolComponents.setPdfVisibility(true); toolComponents.setExportVisibility(true); + toolComponents.setFilterVisibility(true); } private void doOpenOverviewReport(UserRequest ureq) { @@ -453,13 +454,12 @@ public class AnalysisController extends BasicController implements TooledControl removeAsListenerAndDispose(sessionSelectionCtrl); sessionSelectionCtrl = new AnalysisSessionSelectionController(ureq, getWindowControl(), form, - storage, getReportSessionFilter(), getReportHelper(), stackPanel, filterCtrl, toolComponents); + storage, getReportSessionFilter(), getReportHelper(), stackPanel, toolComponents); colsCtrl = new Analysis2ColController(ureq, getWindowControl(), sessionSelectionCtrl, filterCtrl); stackPanel.popUpToController(this); stackPanel.pushController(translate("segments.session.selection"), colsCtrl); segmentButtonsCmp.setSelectedButton(sessionSelectionLink); - setEvaluationFormToolComponents(); } private void doOpenHeatMap(UserRequest ureq) { @@ -684,9 +684,6 @@ public class AnalysisController extends BasicController implements TooledControl private void setShowFilter(Boolean show) { colsCtrl.setShowFilter(show); - if (sessionSelectionCtrl != null) { - sessionSelectionCtrl.setShowFilter(show); - } if (heatMapCtrl != null) { heatMapCtrl.setShowFilter(show); } @@ -735,13 +732,20 @@ public class AnalysisController extends BasicController implements TooledControl private final Link printPopupLink; private final Link pdfLink; private final Link exportLink; + private final Link showFilterLink; + private final Link hideFilterLink; + + private Link lastVisibleFilter; - private ToolComponents(TooledStackedPanel stackPanel, Link printLink, Link printPopupLink, Link pdfLink, Link exportLink) { + private ToolComponents(TooledStackedPanel stackPanel, Link printLink, Link printPopupLink, Link pdfLink, + Link exportLink, Link showFilterLink, Link hideFilterLink) { this.stackPanel = stackPanel; this.printLink = printLink; this.printPopupLink = printPopupLink; this.pdfLink = pdfLink; this.exportLink = exportLink; + this.showFilterLink = showFilterLink; + this.hideFilterLink = hideFilterLink; } void setPrintVisibility(boolean visible) { @@ -772,6 +776,28 @@ public class AnalysisController extends BasicController implements TooledControl } } + void setFilterVisibility(boolean visible) { + if (visible) { + if (!isFilterVisible()) { + if (lastVisibleFilter == null || lastVisibleFilter == showFilterLink) { + showFilterLink.setVisible(true); + hideFilterLink.setVisible(false); + } else { + showFilterLink.setVisible(false); + hideFilterLink.setVisible(true); + } + } + } else { + lastVisibleFilter = showFilterLink.isVisible()? showFilterLink: hideFilterLink; + showFilterLink.setVisible(false); + hideFilterLink.setVisible(false); + } + } + + private boolean isFilterVisible() { + return showFilterLink.isVisible() || hideFilterLink.isVisible(); + } + } } diff --git a/src/main/java/org/olat/modules/quality/analysis/ui/AnalysisSessionSelectionController.java b/src/main/java/org/olat/modules/quality/analysis/ui/AnalysisSessionSelectionController.java index 208e72c8ca14df900c0b010b253b0f9556d2ec1e..b159fa5cf082111a8336fc3d360c15121f31dff5 100644 --- a/src/main/java/org/olat/modules/quality/analysis/ui/AnalysisSessionSelectionController.java +++ b/src/main/java/org/olat/modules/quality/analysis/ui/AnalysisSessionSelectionController.java @@ -20,7 +20,10 @@ package org.olat.modules.quality.analysis.ui; import org.olat.core.gui.UserRequest; +import org.olat.core.gui.components.Component; +import org.olat.core.gui.components.stack.PopEvent; import org.olat.core.gui.components.stack.TooledStackedPanel; +import org.olat.core.gui.control.Event; import org.olat.core.gui.control.WindowControl; import org.olat.core.util.Util; import org.olat.modules.ceditor.DataStorage; @@ -40,44 +43,66 @@ import org.olat.modules.quality.analysis.ui.AnalysisController.ToolComponents; public class AnalysisSessionSelectionController extends AbstractSessionSelectionController { private final TooledStackedPanel stackPanel; - private final FilterController filterCtrl; private final ToolComponents toolComponents; - private Analysis2ColController colsCtrl; - - private Boolean showFilter; + private EvaluationFormExecutionController theExecutionCtrl; public AnalysisSessionSelectionController(UserRequest ureq, WindowControl wControl, Form form, DataStorage storage, - SessionFilter filter, ReportHelper reportHelper, TooledStackedPanel stackPanel, FilterController filterCtrl, - ToolComponents toolComponents) { + SessionFilter filter, ReportHelper reportHelper, TooledStackedPanel stackPanel, ToolComponents toolComponents) { super(ureq, wControl, form, storage, filter, reportHelper, null); setTranslator(Util.createPackageTranslator(AbstractSessionSelectionController.class, getLocale(), getTranslator())); this.stackPanel = stackPanel; - this.filterCtrl = filterCtrl; + this.stackPanel.addListener(this); this.toolComponents = toolComponents; + initToolComponents(); initForm(ureq); } @Override public void pushController(UserRequest ureq, String breadcrumbName, EvaluationFormExecutionController theExecutionCtrl) { - filterCtrl.setReadOnly(true); - colsCtrl = new Analysis2ColController(ureq, getWindowControl(), theExecutionCtrl, filterCtrl); - listenTo(colsCtrl); - - stackPanel.pushController(breadcrumbName, colsCtrl); + this.theExecutionCtrl = theExecutionCtrl; + listenTo(theExecutionCtrl); + + stackPanel.pushController(breadcrumbName, theExecutionCtrl); - colsCtrl.setShowFilter(showFilter); + initSingleSessionToolComponents(); + } + + @Override + public void event(UserRequest ureq, Component source, Event event) { + if (source == stackPanel) { + if (event instanceof PopEvent) { + PopEvent popEvent = (PopEvent)event; + if (popEvent.getController() == theExecutionCtrl) { + initToolComponents(); + } + } + } + super.event(ureq, source, event); + } + + private void initToolComponents() { + toolComponents.setPrintVisibility(true); + toolComponents.setPrintPopupVisibility(false); + toolComponents.setPdfVisibility(true); + toolComponents.setExportVisibility(true); + toolComponents.setFilterVisibility(true); + } + + private void initSingleSessionToolComponents() { toolComponents.setPrintVisibility(false); toolComponents.setPrintPopupVisibility(false); toolComponents.setPdfVisibility(false); toolComponents.setExportVisibility(false); + toolComponents.setFilterVisibility(false); } - public void setShowFilter(Boolean show) { - this.showFilter = show; - if (colsCtrl != null) { - colsCtrl.setShowFilter(show); - } + @Override + protected void doDispose() { + if (stackPanel != null) { + stackPanel.removeListener(this); + } + super.doDispose(); } } diff --git a/src/main/java/org/olat/modules/quality/analysis/ui/FilterController.java b/src/main/java/org/olat/modules/quality/analysis/ui/FilterController.java index ea1c3d611fc2f7dfaed7f67a05aff3b99d01a0ab..8fbe8fef17d4f7ca48bb80a05e3de98575c7d1fd 100644 --- a/src/main/java/org/olat/modules/quality/analysis/ui/FilterController.java +++ b/src/main/java/org/olat/modules/quality/analysis/ui/FilterController.java @@ -42,6 +42,7 @@ import org.olat.core.gui.components.form.flexible.FormItem; import org.olat.core.gui.components.form.flexible.FormItemContainer; import org.olat.core.gui.components.form.flexible.elements.DateChooser; import org.olat.core.gui.components.form.flexible.elements.MultipleSelectionElement; +import org.olat.core.gui.components.form.flexible.elements.StaticTextElement; import org.olat.core.gui.components.form.flexible.impl.FormBasicController; import org.olat.core.gui.components.form.flexible.impl.FormEvent; import org.olat.core.gui.components.form.flexible.impl.FormLayoutContainer; @@ -50,6 +51,7 @@ import org.olat.core.gui.control.Controller; import org.olat.core.gui.control.WindowControl; import org.olat.core.id.Organisation; import org.olat.core.id.OrganisationRef; +import org.olat.core.util.Formatter; import org.olat.modules.curriculum.Curriculum; import org.olat.modules.curriculum.CurriculumElement; import org.olat.modules.curriculum.CurriculumElementRef; @@ -85,6 +87,7 @@ public class FilterController extends FormBasicController { private static final String[] WITH_USER_INFOS_KEYS = new String[] { "filter.with.user.informations" }; + private FormLayoutContainer dateRangeCont; private DateChooser dateRangeFromEl; private DateChooser dateRangeToEl; private MultipleSelectionElement topicIdentityEl; @@ -102,6 +105,25 @@ public class FilterController extends FormBasicController { private MultipleSelectionElement seriesIndexEl; private MultipleSelectionElement contextRoleEl; private MultipleSelectionElement withUserInformationsEl; + + private StaticTextElement dateRangeFromRoEl; + private StaticTextElement dateRangeToRoEl; + private StaticTextElement topicIdentityRoEl; + private StaticTextElement topicOrganisationRoEl; + private StaticTextElement topicCurriculumRoEl; + private StaticTextElement topicCurriculumElementRoEl; + private StaticTextElement topicRepositoryRoEl; + private StaticTextElement contextExecutorOrganisationRoEl; + private StaticTextElement contextCurriculumRoEl; + private StaticTextElement contextCurriculumElementRoEl; + private StaticTextElement contextCurriculumElementTypeRoEl; + private StaticTextElement contextCurriculumOrganisationRoEl; + private StaticTextElement contextTaxonomyLevelRoEl; + private StaticTextElement contextLocationRoEl; + private StaticTextElement seriesIndexRoEl; + private StaticTextElement contextRoleRoEl; + private StaticTextElement withUserInformationsRoEl; + private StaticTextElement noFilterSelectedRoEl; private final AnalysisSearchParameter searchParams; private final AvailableAttributes availableAttributes; @@ -121,6 +143,8 @@ public class FilterController extends FormBasicController { this.availableAttributes = availableAttributes; this.sessionInformationsAvailable = getSessionInformationAvailable(form); initForm(ureq); + setReadOnly(false); + setSelectionValues(); initSelection(); } @@ -137,14 +161,14 @@ public class FilterController extends FormBasicController { protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) { formLayout.setElementCssClass("o_qual_ana_filter"); - FormLayoutContainer dateRange = FormLayoutContainer.createHorizontalFormLayout("dateRange", getTranslator()); - flc.add("dateRange", dateRange); - dateRange.setElementCssClass("o_date_range"); - dateRangeFromEl = uifactory.addDateChooser("filter.date.range.from", null, dateRange); + dateRangeCont = FormLayoutContainer.createHorizontalFormLayout("dateRange", getTranslator()); + flc.add("dateRange", dateRangeCont); + dateRangeCont.setElementCssClass("o_date_range"); + dateRangeFromEl = uifactory.addDateChooser("filter.date.range.from", null, dateRangeCont); dateRangeFromEl.setElementCssClass("o_date_range_from"); dateRangeFromEl.addActionListener(FormEvent.ONCHANGE); - dateRangeToEl = uifactory.addDateChooser("filter.date.range.to", null, dateRange); + dateRangeToEl = uifactory.addDateChooser("filter.date.range.to", null, dateRangeCont); dateRangeToEl.setElementCssClass("o_date_range_to"); dateRangeToEl.addActionListener(FormEvent.ONCHANGE); @@ -193,30 +217,120 @@ public class FilterController extends FormBasicController { withUserInformationsEl = uifactory.addCheckboxesVertical("filter.with.user.informations.label", formLayout, WITH_USER_INFOS_KEYS, translateAll(getTranslator(), WITH_USER_INFOS_KEYS), 1); withUserInformationsEl.addActionListener(FormEvent.ONCLICK); - withUserInformationsEl.setVisible(sessionInformationsAvailable); - - setSelectionValues(); + + // Read only + dateRangeFromRoEl = uifactory.addStaticTextElement("filter.date.range.from.ro", "filter.date.range.from", null, formLayout); + dateRangeToRoEl = uifactory.addStaticTextElement("filter.date.range.to.ro", "filter.date.range.to", null, formLayout); + topicIdentityRoEl = uifactory.addStaticTextElement("filter.topic.identities.ro", "filter.topic.identities", null, formLayout); + topicOrganisationRoEl = uifactory.addStaticTextElement("filter.topic.organisations.ro", "filter.topic.organisations", null, formLayout); + topicCurriculumRoEl = uifactory.addStaticTextElement("filter.topic.curriculums.ro", "filter.topic.curriculums", null, formLayout); + topicCurriculumElementRoEl = uifactory.addStaticTextElement("filter.topic.curriculum.elements.ro", "filter.topic.curriculum.elements", null, formLayout); + topicRepositoryRoEl = uifactory.addStaticTextElement("filter.topic.repositories.ro", "filter.topic.repositories", null, formLayout); + contextExecutorOrganisationRoEl = uifactory.addStaticTextElement("filter.context.organisations.ro", "filter.context.organisations", null, formLayout); + contextCurriculumRoEl = uifactory.addStaticTextElement("filter.context.curriculums.ro", "filter.context.curriculums", null, formLayout); + contextCurriculumElementRoEl = uifactory.addStaticTextElement("filter.context.curriculum.elements.ro", "filter.context.curriculum.elements", null, formLayout); + contextCurriculumElementTypeRoEl = uifactory.addStaticTextElement("filter.context.curriculum.element.types.ro", "filter.context.curriculum.element.types", null, formLayout); + contextCurriculumOrganisationRoEl = uifactory.addStaticTextElement("filter.context.curriculum.organisations.ro", "filter.context.curriculum.organisations", null, formLayout); + contextTaxonomyLevelRoEl = uifactory.addStaticTextElement("filter.context.taxonomy.level.ro", "filter.context.taxonomy.level", null, formLayout); + contextLocationRoEl = uifactory.addStaticTextElement("filter.context.location.ro", "filter.context.location", null, formLayout); + seriesIndexRoEl = uifactory.addStaticTextElement("filter.series.index.ro", "filter.series.index", null, formLayout); + contextRoleRoEl = uifactory.addStaticTextElement("filter.context.role.ro", "filter.context.role", null, formLayout); + withUserInformationsRoEl = uifactory.addStaticTextElement("filter.with.user.informations.label.ro", "filter.with.user.informations.label", null, formLayout); + noFilterSelectedRoEl = uifactory.addStaticTextElement("filter.no.selected.ro", "filter.no.selected.label", translate("filter.no.selected.ro"), formLayout); } void setReadOnly(boolean readOnly) { - boolean enabled = !readOnly; - dateRangeFromEl.setEnabled(enabled); - dateRangeToEl.setEnabled(enabled); - topicIdentityEl.setEnabled(enabled); - topicOrganisationEl.setEnabled(enabled); - topicCurriculumEl.setEnabled(enabled); - topicCurriculumElementEl.setEnabled(enabled); - topicRepositoryEl.setEnabled(enabled); - contextExecutorOrganisationEl.setEnabled(enabled); - contextCurriculumEl.setEnabled(enabled); - contextCurriculumElementEl.setEnabled(enabled); - contextCurriculumElementTypeEl.setEnabled(enabled); - contextCurriculumOrganisationEl.setEnabled(enabled); - contextTaxonomyLevelEl.setEnabled(enabled); - contextLocationEl.setEnabled(enabled); - seriesIndexEl.setEnabled(enabled); - contextRoleEl.setEnabled(enabled); - withUserInformationsEl.setEnabled(enabled); + // selection + boolean selection = !readOnly; + dateRangeCont.setVisible(selection); + dateRangeFromEl.setVisible(selection); + dateRangeToEl.setVisible(selection); + topicIdentityEl.setVisible(selection && availableAttributes.isTopicIdentity()); + topicOrganisationEl.setVisible(selection && availableAttributes.isTopicOrganisation() && organisationModule.isEnabled()); + topicCurriculumEl.setVisible(selection && availableAttributes.isTopicCurriculum() && curriculumModule.isEnabled()); + topicCurriculumElementEl.setVisible(selection && availableAttributes.isTopicCurriculumElement() && curriculumModule.isEnabled()); + topicRepositoryEl.setVisible(selection && availableAttributes.isTopicRepository()); + contextExecutorOrganisationEl.setVisible(selection && availableAttributes.isContextExecutorOrganisation() && organisationModule.isEnabled()); + contextCurriculumEl.setVisible(selection && availableAttributes.isContextCurriculum() && curriculumModule.isEnabled()); + contextCurriculumElementEl.setVisible(selection && availableAttributes.isContextCurriculumElement() && curriculumModule.isEnabled()); + contextCurriculumElementTypeEl.setVisible(selection && availableAttributes.isContextCurriculumElementType() && curriculumModule.isEnabled()); + contextCurriculumOrganisationEl.setVisible(selection && availableAttributes.isContextCurriculumOrganisation() + && organisationModule.isEnabled() && curriculumModule.isEnabled()); + contextTaxonomyLevelEl.setVisible(selection && availableAttributes.isContextTaxonomyLevel()); + contextLocationEl.setVisible(selection && availableAttributes.isContextLocation()); + seriesIndexEl.setVisible(selection && availableAttributes.isSeriesIndex()); + contextRoleEl.setVisible(selection); + withUserInformationsEl.setVisible(selection && sessionInformationsAvailable); + + // read only + showReadOnly(readOnly, dateRangeFromRoEl, dateRangeFromEl); + showReadOnly(readOnly, dateRangeToRoEl, dateRangeToEl); + showReadOnly(readOnly, topicIdentityRoEl, topicIdentityEl); + showReadOnly(readOnly, topicOrganisationRoEl, topicOrganisationEl); + showReadOnly(readOnly, topicCurriculumRoEl, topicCurriculumEl); + showReadOnly(readOnly, topicCurriculumElementRoEl, topicCurriculumElementEl); + showReadOnly(readOnly, topicRepositoryRoEl, topicRepositoryEl); + showReadOnly(readOnly, contextExecutorOrganisationRoEl, contextExecutorOrganisationEl); + showReadOnly(readOnly, contextCurriculumRoEl, contextCurriculumEl); + showReadOnly(readOnly, contextCurriculumElementRoEl, contextCurriculumElementEl); + showReadOnly(readOnly, contextCurriculumElementTypeRoEl, contextCurriculumElementTypeEl); + showReadOnly(readOnly, contextCurriculumOrganisationRoEl, contextCurriculumOrganisationEl); + showReadOnly(readOnly, contextTaxonomyLevelRoEl, contextTaxonomyLevelEl); + showReadOnly(readOnly, contextLocationRoEl, contextLocationEl); + showReadOnly(readOnly, seriesIndexRoEl, seriesIndexEl); + showReadOnly(readOnly, contextRoleRoEl, contextRoleEl); + + if (readOnly && withUserInformationsEl.isAtLeastSelected(1)) { + String value = withUserInformationsEl.getSelectedValues().get(0); + withUserInformationsRoEl.setValue(value); + withUserInformationsRoEl.setVisible(true); + } else { + withUserInformationsRoEl.setVisible(false); + } + + noFilterSelectedRoEl.setVisible(readOnly && !isAtLeastOneRoVisible()); + } + + private void showReadOnly(boolean readOnly, StaticTextElement roEl, DateChooser dateEl) { + if (readOnly && dateEl.getDate() != null) { + String value = Formatter.getInstance(getLocale()).formatDate(dateEl.getDate()); + roEl.setValue(value); + roEl.setVisible(true); + } else { + roEl.setVisible(false); + } + } + + private void showReadOnly(boolean readOnly, StaticTextElement roEl, MultipleSelectionElement selectEl) { + if (readOnly && selectEl.isAtLeastSelected(1)) { + List<String> selectedValues = selectEl.getSelectedValues(); + String value = QualityUIFactory.toHtmlList(selectedValues); + roEl.setValue(value); + roEl.setVisible(true); + } else { + roEl.setVisible(false); + } + } + + private boolean isAtLeastOneRoVisible() { + return dateRangeFromRoEl.isVisible() + || dateRangeToRoEl.isVisible() + || topicIdentityRoEl.isVisible() + || topicOrganisationRoEl.isVisible() + || topicCurriculumRoEl.isVisible() + || topicCurriculumElementRoEl.isVisible() + || topicRepositoryRoEl.isVisible() + || contextExecutorOrganisationRoEl.isVisible() + || contextCurriculumRoEl.isVisible() + || contextCurriculumElementRoEl.isVisible() + || contextCurriculumElementTypeRoEl.isVisible() + || contextCurriculumOrganisationRoEl.isVisible() + || contextTaxonomyLevelRoEl.isVisible() + || contextLocationRoEl.isVisible() + || seriesIndexRoEl.isVisible() + || contextRoleRoEl.isVisible() + || withUserInformationsRoEl.isVisible() + || noFilterSelectedRoEl.isVisible(); } private void setSelectionValues() { @@ -265,9 +379,7 @@ public class FilterController extends FormBasicController { } private void setTopicIdentityValues() { - if (!availableAttributes.isTopicIdentity()) { - topicIdentityEl.setVisible(false); - } + if (!topicIdentityEl.isVisible()) return; Collection<String> selectedKeys = topicIdentityEl.getSelectedKeys(); @@ -298,10 +410,7 @@ public class FilterController extends FormBasicController { } private void setTopicOrganisationValues() { - if (!availableAttributes.isTopicOrganisation() || !organisationModule.isEnabled()) { - topicOrganisationEl.setVisible(false); - return; - } + if (!topicOrganisationEl.isVisible()) return; Collection<String> selectedKeys = topicOrganisationEl.getSelectedKeys(); @@ -332,10 +441,7 @@ public class FilterController extends FormBasicController { } private void setTopicCurriculumValues() { - if (!availableAttributes.isTopicCurriculum() || !curriculumModule.isEnabled()) { - topicCurriculumEl.setVisible(false); - return; - } + if (!topicCurriculumEl.isVisible()) return; Collection<String> selectedKeys = topicCurriculumEl.getSelectedKeys(); @@ -365,10 +471,7 @@ public class FilterController extends FormBasicController { } private void setTopicCurriculumElementValues() { - if (!availableAttributes.isTopicCurriculumElement() || !curriculumModule.isEnabled()) { - topicCurriculumElementEl.setVisible(false); - return; - } + if (!topicCurriculumElementEl.isVisible()) return; Collection<String> selectedKeys = topicCurriculumEl.getSelectedKeys(); @@ -400,9 +503,7 @@ public class FilterController extends FormBasicController { } private void setTopicRepositoryValues() { - if (!availableAttributes.isTopicRepository()) { - topicRepositoryEl.setVisible(false); - } + if (!topicRepositoryEl.isVisible()) return; Collection<String> selectedKeys = topicRepositoryEl.getSelectedKeys(); @@ -433,10 +534,7 @@ public class FilterController extends FormBasicController { } private void setContextExecutorOrganisationValues() { - if (!availableAttributes.isContextExecutorOrganisation() || !organisationModule.isEnabled()) { - contextExecutorOrganisationEl.setVisible(false); - return; - } + if (!contextExecutorOrganisationEl.isVisible()) return; Collection<String> selectedKeys = contextExecutorOrganisationEl.getSelectedKeys(); @@ -469,10 +567,7 @@ public class FilterController extends FormBasicController { } private void setContextCurriculumValues() { - if (!availableAttributes.isContextCurriculum() || !curriculumModule.isEnabled()) { - contextCurriculumEl.setVisible(false); - return; - } + if (!contextCurriculumEl.isVisible()) return; Collection<String> selectedKeys = contextCurriculumEl.getSelectedKeys(); @@ -502,10 +597,7 @@ public class FilterController extends FormBasicController { } private void setContextCurriculumElementValues() { - if (!availableAttributes.isContextCurriculumElement() || !curriculumModule.isEnabled()) { - contextCurriculumElementEl.setVisible(false); - return; - } + if (!contextCurriculumElementEl.isVisible()) return; Collection<String> selectedKeys = contextCurriculumElementEl.getSelectedKeys(); @@ -545,10 +637,7 @@ public class FilterController extends FormBasicController { } private void setContextCurriculumElementTypeValues() { - if (!availableAttributes.isContextCurriculumElementType() || !curriculumModule.isEnabled()) { - contextCurriculumElementTypeEl.setVisible(false); - return; - } + if (!contextCurriculumElementTypeEl.isVisible()) return; Collection<String> selectedKeys = contextCurriculumElementTypeEl.getSelectedKeys(); @@ -586,11 +675,7 @@ public class FilterController extends FormBasicController { } private void setContextCurriculumOrganisationValues() { - if (!availableAttributes.isContextCurriculumOrganisation() || !organisationModule.isEnabled() - || !curriculumModule.isEnabled()) { - contextCurriculumOrganisationEl.setVisible(false); - return; - } + if (!contextCurriculumOrganisationEl.isVisible()) return; Collection<String> selectedKeys = contextCurriculumOrganisationEl.getSelectedKeys(); @@ -626,10 +711,7 @@ public class FilterController extends FormBasicController { } private void setContextTaxonomyLevelValues() { - if (!availableAttributes.isContextTaxonomyLevel()) { - contextTaxonomyLevelEl.setVisible(false); - return; - } + if (!contextTaxonomyLevelEl.isVisible()) return; Collection<String> selectedKeys = contextTaxonomyLevelEl.getSelectedKeys(); @@ -679,10 +761,7 @@ public class FilterController extends FormBasicController { } private void setContextLocationValues() { - if (!availableAttributes.isContextLocation()) { - contextLocationEl.setVisible(false); - return; - } + if (!contextLocationEl.isVisible()) return; Collection<String> selectedKeys = contextLocationEl.getSelectedKeys(); @@ -712,10 +791,7 @@ public class FilterController extends FormBasicController { } private void setSeriesIndexValues() { - if (!availableAttributes.isSeriesIndex()) { - seriesIndexEl.setVisible(false); - return; - } + if (!seriesIndexEl.isVisible()) return; Collection<String> selectedKeys = seriesIndexEl.getSelectedKeys(); diff --git a/src/main/java/org/olat/modules/quality/analysis/ui/GroupByController.java b/src/main/java/org/olat/modules/quality/analysis/ui/GroupByController.java index 63cc1d587af541eca8a12ba6733ffaf664b70e7d..141c81149e4dba846dd03069db30f9bd5d7fe517 100644 --- a/src/main/java/org/olat/modules/quality/analysis/ui/GroupByController.java +++ b/src/main/java/org/olat/modules/quality/analysis/ui/GroupByController.java @@ -42,6 +42,7 @@ import java.util.stream.Collectors; import org.olat.basesecurity.model.IdentityRefImpl; import org.olat.basesecurity.model.OrganisationRefImpl; import org.olat.core.gui.UserRequest; +import org.olat.core.gui.components.Component; import org.olat.core.gui.components.EscapeMode; import org.olat.core.gui.components.form.flexible.FormItem; import org.olat.core.gui.components.form.flexible.FormItemContainer; @@ -58,9 +59,11 @@ import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTable import org.olat.core.gui.components.form.flexible.impl.elements.table.SelectionEvent; import org.olat.core.gui.components.form.flexible.impl.elements.table.StaticFlexiCellRenderer; import org.olat.core.gui.components.form.flexible.impl.elements.table.TextFlexiCellRenderer; +import org.olat.core.gui.components.stack.PopEvent; import org.olat.core.gui.components.stack.TooledStackedPanel; import org.olat.core.gui.components.util.KeyValues; import org.olat.core.gui.control.Controller; +import org.olat.core.gui.control.Event; import org.olat.core.gui.control.WindowControl; import org.olat.core.gui.control.creator.ControllerCreator; import org.olat.core.util.StringHelper; @@ -143,7 +146,6 @@ public abstract class GroupByController extends FormBasicController implements F private Boolean showFilter; private Analysis2ColController sliderTrendColsCtrl; private SliderTrendController sliderTrendCtrl; - private Analysis2ColController dataCollectionColsCtrl; private Controller dataCollectionCtrl; // This list is the master for the sort order of the questions (sliders). @@ -172,6 +174,7 @@ public abstract class GroupByController extends FormBasicController implements F TrendDifference trendDifference, String rubricId) { super(ureq, wControl, LAYOUT_BAREBONE); this.stackPanel = stackPanel; + this.stackPanel.addListener(this); this.filterCtrl = filterCtrl; this.availableAttributes = availableAttributes; this.multiGroupBy = multiGroupBy; @@ -289,10 +292,17 @@ public abstract class GroupByController extends FormBasicController implements F void setToolComponents(ToolComponents toolComponents) { this.toolComponents = toolComponents; - toolComponents.setPrintVisibility(false); - toolComponents.setPrintPopupVisibility(true); - toolComponents.setPdfVisibility(true); - toolComponents.setExportVisibility(true); + initToolComponents(); + } + + private void initToolComponents() { + if (toolComponents != null) { + toolComponents.setPrintVisibility(false); + toolComponents.setPrintPopupVisibility(true); + toolComponents.setPdfVisibility(true); + toolComponents.setExportVisibility(true); + toolComponents.setFilterVisibility(true); + } } void setShowFilter(Boolean show) { @@ -519,6 +529,22 @@ public abstract class GroupByController extends FormBasicController implements F refreshDiagram(); } + @Override + public void event(UserRequest ureq, Component source, Event event) { + if (source == stackPanel) { + if (event instanceof PopEvent) { + PopEvent popEvent = (PopEvent)event; + if (popEvent.getController() == dataCollectionCtrl) { + initToolComponents(); + } else if (popEvent.getController() == sliderTrendColsCtrl) { + initToolComponents(); + filterCtrl.setReadOnly(false); + } + } + } + super.event(ureq, source, event); + } + @Override protected void formInnerEvent(UserRequest ureq, FormItem source, FormEvent event) { if (source == groupEl1 || source == groupEl2 || source == groupEl3) { @@ -752,6 +778,7 @@ public abstract class GroupByController extends FormBasicController implements F toolComponents.setPrintPopupVisibility(true); toolComponents.setPdfVisibility(true); toolComponents.setExportVisibility(false); + toolComponents.setFilterVisibility(true); } private AnalysisSearchParameter getTrendSearchParams(MultiKey multiKey) { @@ -877,17 +904,14 @@ public abstract class GroupByController extends FormBasicController implements F dataCollectionCtrl = new DataCollectionReportController(ureq, getWindowControl(), dataCollection); listenTo(dataCollectionCtrl); - filterCtrl.setReadOnly(true); - dataCollectionColsCtrl = new Analysis2ColController(ureq, getWindowControl(), dataCollectionCtrl, filterCtrl); - - String detailTrend = translate("analysis.trend.breadcrumb", new String[] { dataCollection.getTitle() }); - stackPanel.pushController(detailTrend, dataCollectionColsCtrl); + String title = translate("analysis.data.collection.breadcrumb", new String[] { dataCollection.getTitle() }); + stackPanel.pushController(title, dataCollectionCtrl); - dataCollectionColsCtrl.setShowFilter(showFilter); toolComponents.setPrintVisibility(false); toolComponents.setPrintPopupVisibility(false); toolComponents.setPdfVisibility(false); toolComponents.setExportVisibility(false); + toolComponents.setFilterVisibility(false); } } @@ -910,7 +934,9 @@ public abstract class GroupByController extends FormBasicController implements F @Override protected void doDispose() { - // + if (stackPanel != null) { + stackPanel.removeListener(this); + } } public final static class SliderWrapper { diff --git a/src/main/java/org/olat/modules/quality/analysis/ui/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/modules/quality/analysis/ui/_i18n/LocalStrings_de.properties index 41dbd72f1de95dfb5999eed02d1546b552300b75..83c79be7b8d4e8fccc817d8582023f7e8d958a27 100644 --- a/src/main/java/org/olat/modules/quality/analysis/ui/_i18n/LocalStrings_de.properties +++ b/src/main/java/org/olat/modules/quality/analysis/ui/_i18n/LocalStrings_de.properties @@ -1,3 +1,4 @@ +analysis.data.collection.breadcrumb=Datenerhebung "{0}" analysis.details=Trend Details analysis.details.print.title={0}: {1} analysis.export=Export Excel @@ -29,8 +30,10 @@ filter.context.role=Rolle des Teilnehmers filter.context.taxonomy.level=Fachbereich filter.count=Anzahl Datenerhebungen filter.date.range.from=Datenerhebungen von -filter.date.range.to=Datenerhebungen to +filter.date.range.to=Datenerhebungen bis filter.hide=Filter +filter.no.selected.ro=<i>Es sind keine Filter gesetzt.</i> +filter.no.selected.label= filter.panel.header=Filter filter.series.index.value=Datenerhebung {0} filter.series.index=Serie diff --git a/src/main/java/org/olat/modules/quality/analysis/ui/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/modules/quality/analysis/ui/_i18n/LocalStrings_en.properties index 6170846e9faf821003945ccce99ce48511ef68f5..006a893059e4895a9355ebee487ac6c3a1789a6b 100644 --- a/src/main/java/org/olat/modules/quality/analysis/ui/_i18n/LocalStrings_en.properties +++ b/src/main/java/org/olat/modules/quality/analysis/ui/_i18n/LocalStrings_en.properties @@ -1,3 +1,4 @@ +analysis.data.collection.breadcrumb=Data collection "{0}" analysis.details=Trend details analysis.details.print.title={0}: {1} analysis.export=Export Excel @@ -5,7 +6,7 @@ analysis.pdf=Export PDF analysis.print=Print analysis.table.data.collections.latest=Latest data collection analysis.table.data.collections.number=Data collections -analysis.table.data.collections.soonest=Soonest data collection +analysis.table.data.collections.soonest=First data collection analysis.table.empty=This table contains no data. analysis.table.form.created.on=Created on {0} analysis.table.form.created=Created @@ -31,6 +32,8 @@ filter.count=Number of data collections filter.date.range.from=Data collections from filter.date.range.to=Data collections to filter.hide=Filters +filter.no.selected.ro=<i>No filters active.</i> +filter.no.selected.label= filter.panel.header=Filters filter.series.index.value=Data collection {0} filter.series.index=Series diff --git a/src/main/java/org/olat/modules/quality/ui/QualityUIFactory.java b/src/main/java/org/olat/modules/quality/ui/QualityUIFactory.java index a964a3ea9d3f3856831b20054d0dcc6c4ac0d091..a01745069906453c0502bd766a065bdd03f57d8b 100644 --- a/src/main/java/org/olat/modules/quality/ui/QualityUIFactory.java +++ b/src/main/java/org/olat/modules/quality/ui/QualityUIFactory.java @@ -546,6 +546,17 @@ public class QualityUIFactory { return null; } + public static String toHtmlList(List<String> values) { + StringBuilder sb = new StringBuilder(); + sb.append("<ul>"); + for (String value : values) { + sb.append("<li>").append(value.trim()).append("</li>"); + } + sb.append("</ul>"); + String value = sb.toString(); + return value; + } + public static boolean validateInteger(TextElement el, int min, int max) { boolean allOk = true; el.clearError();