diff --git a/src/main/java/org/olat/modules/portfolio/ui/BinderController.java b/src/main/java/org/olat/modules/portfolio/ui/BinderController.java index 9ef8f947ec04bab3e23f087ce0132a496ec2f69b..fa96f59f095caeb6f2bd6b62ced7d9695b5fc158 100644 --- a/src/main/java/org/olat/modules/portfolio/ui/BinderController.java +++ b/src/main/java/org/olat/modules/portfolio/ui/BinderController.java @@ -48,6 +48,7 @@ import org.olat.modules.portfolio.Binder; import org.olat.modules.portfolio.BinderConfiguration; import org.olat.modules.portfolio.BinderSecurityCallback; import org.olat.modules.portfolio.BinderStatus; +import org.olat.modules.portfolio.PortfolioService; import org.olat.modules.portfolio.PortfolioV2Module; import org.olat.modules.portfolio.ui.event.DeleteBinderEvent; import org.olat.modules.portfolio.ui.event.RestoreBinderEvent; @@ -82,6 +83,8 @@ public class BinderController extends BasicController implements TooledControlle @Autowired private PortfolioV2Module portfolioModule; + @Autowired + private PortfolioService portfolioService; public BinderController(UserRequest ureq, WindowControl wControl, TooledStackedPanel stackPanel, BinderSecurityCallback secCallback, Binder binder, BinderConfiguration config) { @@ -208,6 +211,7 @@ public class BinderController extends BasicController implements TooledControlle if(event == Event.CHANGED_EVENT) { removeAsListenerAndDispose(entriesCtrl); entriesCtrl = null; + binder = portfolioService.getBinderByKey(binder.getKey()); } else if(event instanceof SectionSelectionEvent) { SectionSelectionEvent sse = (SectionSelectionEvent)event; List<ContextEntry> entries = new ArrayList<>(); diff --git a/src/main/java/org/olat/modules/portfolio/ui/BinderPageListController.java b/src/main/java/org/olat/modules/portfolio/ui/BinderPageListController.java index 93b3f1dae0cd576d5abbbc7a764bca0e7325ae94..54076545452e88de0e5b67504d1fc739c34cff7f 100644 --- a/src/main/java/org/olat/modules/portfolio/ui/BinderPageListController.java +++ b/src/main/java/org/olat/modules/portfolio/ui/BinderPageListController.java @@ -47,17 +47,21 @@ import org.olat.core.gui.components.link.LinkFactory; import org.olat.core.gui.components.link.LinkPopupSettings; import org.olat.core.gui.components.stack.TooledStackedPanel; import org.olat.core.gui.components.stack.TooledStackedPanel.Align; +import org.olat.core.gui.components.text.TextComponent; +import org.olat.core.gui.components.text.TextFactory; 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.gui.control.generic.closablewrapper.CloseableModalController; +import org.olat.core.gui.control.generic.spacesaver.ToggleBoxController; import org.olat.core.gui.media.MediaResource; import org.olat.core.id.Identity; import org.olat.core.id.OLATResourceable; import org.olat.core.id.context.ContextEntry; import org.olat.core.id.context.StateEntry; import org.olat.core.logging.activity.ThreadLocalUserActivityLogger; +import org.olat.core.util.CodeHelper; import org.olat.core.util.StringHelper; import org.olat.modules.portfolio.AssessmentSection; import org.olat.modules.portfolio.Assignment; @@ -94,6 +98,8 @@ public class BinderPageListController extends AbstractPageListController { private FormLink newSectionButton, previousSectionLink, nextSectionLink, showAllSectionsLink; private CloseableModalController cmc; + private TextComponent summaryComp; + private ToggleBoxController summaryCtrl; private SectionEditController newSectionCtrl; private PageMetadataEditController newPageCtrl; private AssignmentEditController newAssignmentCtrl; @@ -111,6 +117,10 @@ public class BinderPageListController extends AbstractPageListController { this.binder = binder; owners = portfolioService.getMembers(binder, PortfolioRoles.owner.name()); + summaryComp = TextFactory.createTextComponentFromString("summaryCmp" + CodeHelper.getRAMUniqueID(), "", "o_block_large_bottom", false, null); + summaryCtrl = new ToggleBoxController(ureq, wControl, getGuiPrefsKey(binder), translate("summary.open"), + translate("summary.close"), summaryComp); + initForm(ureq); loadModel(ureq, null); @@ -119,6 +129,14 @@ public class BinderPageListController extends AbstractPageListController { initialPanel.setCssClass("o_edit_mode"); } } + + private String getGuiPrefsKey(OLATResourceable binderOres) { + return new StringBuilder() + .append(binderOres.getResourceableTypeName()) + .append("::") + .append(binderOres.getResourceableId()) + .toString(); + } @Override public void initTools() { @@ -214,6 +232,13 @@ public class BinderPageListController extends AbstractPageListController { @Override protected void loadModel(UserRequest ureq, String searchString) { + if (StringHelper.containsNonWhitespace(binder.getSummary())) { + summaryComp.setText(binder.getSummary()); + flc.getFormItemComponent().put("summary", summaryCtrl.getInitialComponent()); + } else { + flc.getFormItemComponent().remove("summary"); + } + List<Section> sections = portfolioService.getSections(binder); List<CategoryToElement> categorizedElements = portfolioService.getCategorizedSectionsAndPages(binder); @@ -389,6 +414,13 @@ public class BinderPageListController extends AbstractPageListController { } timelineEl.setPoints(points); } + + @Override + protected void doDispose() { + removeAsListenerAndDispose(summaryCtrl); + summaryCtrl = null; + super.doDispose(); + } @Override protected void formInnerEvent(UserRequest ureq, FormItem source, FormEvent event) { diff --git a/src/main/java/org/olat/modules/portfolio/ui/TableOfContentController.java b/src/main/java/org/olat/modules/portfolio/ui/TableOfContentController.java index c3765b45715dc1e55600232bf98fc98bf6fc6c8a..a405100fafa5d263dda852d72eefc0a88bbbf5e7 100644 --- a/src/main/java/org/olat/modules/portfolio/ui/TableOfContentController.java +++ b/src/main/java/org/olat/modules/portfolio/ui/TableOfContentController.java @@ -39,6 +39,8 @@ import org.olat.core.gui.components.link.LinkPopupSettings; import org.olat.core.gui.components.stack.TooledController; import org.olat.core.gui.components.stack.TooledStackedPanel; import org.olat.core.gui.components.stack.TooledStackedPanel.Align; +import org.olat.core.gui.components.text.TextComponent; +import org.olat.core.gui.components.text.TextFactory; import org.olat.core.gui.components.velocity.VelocityContainer; import org.olat.core.gui.control.Controller; import org.olat.core.gui.control.Event; @@ -49,12 +51,14 @@ import org.olat.core.gui.control.generic.closablewrapper.CloseableModalControlle import org.olat.core.gui.control.generic.dtabs.Activateable2; import org.olat.core.gui.control.generic.modal.DialogBoxController; import org.olat.core.gui.control.generic.modal.DialogBoxUIFactory; +import org.olat.core.gui.control.generic.spacesaver.ToggleBoxController; import org.olat.core.gui.media.MediaResource; import org.olat.core.id.Identity; import org.olat.core.id.OLATResourceable; import org.olat.core.id.context.ContextEntry; import org.olat.core.id.context.StateEntry; import org.olat.core.logging.activity.ThreadLocalUserActivityLogger; +import org.olat.core.util.CodeHelper; import org.olat.core.util.StringHelper; import org.olat.core.util.resource.OresHelper; import org.olat.modules.portfolio.AssessmentSection; @@ -105,6 +109,8 @@ public class TableOfContentController extends BasicController implements TooledC private final TooledStackedPanel stackPanel; private CloseableModalController cmc; + private TextComponent summaryComp; + private ToggleBoxController summaryCtrl; private UserCommentsController commentsCtrl; private SectionEditController newSectionCtrl; private SectionEditController editSectionCtrl; @@ -152,10 +158,23 @@ public class TableOfContentController extends BasicController implements TooledC mainVC.contextPut("isTemplate", secCallback.canNewAssignment()); mainVC.contextPut("isPersonalBinder", (!secCallback.canNewAssignment() && secCallback.canEditMetadataBinder())); + summaryComp = TextFactory.createTextComponentFromString("summaryCmp" + CodeHelper.getRAMUniqueID(), "", null, + false, null); + summaryCtrl = new ToggleBoxController(ureq, wControl, getGuiPrefsKey(binder), translate("summary.open"), + translate("summary.close"), summaryComp); + putInitialPanel(mainVC); loadModel(); } + private String getGuiPrefsKey(OLATResourceable binderOres) { + return new StringBuilder() + .append(binderOres.getResourceableTypeName()) + .append("::") + .append(binderOres.getResourceableId()) + .toString(); + } + public int getNumOfSections() { return sectionList == null ? 0 : sectionList.size(); } @@ -226,6 +245,13 @@ public class TableOfContentController extends BasicController implements TooledC protected void loadModel() { mainVC.contextPut("binderTitle", StringHelper.escapeHtml(binder.getTitle())); + + if (StringHelper.containsNonWhitespace(binder.getSummary())) { + summaryComp.setText(binder.getSummary()); + mainVC.put("summary", summaryCtrl.getInitialComponent()); + } else { + mainVC.remove("summary"); + } List<SectionRow> sectionRows = new ArrayList<>(); Map<Long,SectionRow> sectionMap = new HashMap<>(); @@ -429,7 +455,8 @@ public class TableOfContentController extends BasicController implements TooledC @Override protected void doDispose() { - // + removeAsListenerAndDispose(summaryCtrl); + summaryCtrl = null; } @Override @@ -482,6 +509,7 @@ public class TableOfContentController extends BasicController implements TooledC if(event == Event.DONE_EVENT) { binder = binderMetadataCtrl.getBinder(); loadModel(); + fireEvent(ureq, Event.CHANGED_EVENT); } cmc.deactivate(); cleanUp(); diff --git a/src/main/java/org/olat/modules/portfolio/ui/_content/binder_pages.html b/src/main/java/org/olat/modules/portfolio/ui/_content/binder_pages.html index 096668fb9bfa83ee4ffc8671aa6a3eb516ea7263..11757bacc079409292e8cf84667d93497fc191c9 100644 --- a/src/main/java/org/olat/modules/portfolio/ui/_content/binder_pages.html +++ b/src/main/java/org/olat/modules/portfolio/ui/_content/binder_pages.html @@ -10,8 +10,14 @@ </div> #end </div> - + <div class="o_portfolio_entries #if($timelineSwitch) o_portfolio_withtimeline #end"> + #if($r.available("summary")) + <div class="o_block_large_bottom"> + $r.render("summary") + </div> + #end + $r.render("table") #if($r.available("create.new.section")) diff --git a/src/main/java/org/olat/modules/portfolio/ui/_content/table_of_contents.html b/src/main/java/org/olat/modules/portfolio/ui/_content/table_of_contents.html index 4dd5ffc62e8cfa2ec250b72c638ccfe555ab597b..32402ff2f4a0da0c21b69ad97d2676e39d07b037 100644 --- a/src/main/java/org/olat/modules/portfolio/ui/_content/table_of_contents.html +++ b/src/main/java/org/olat/modules/portfolio/ui/_content/table_of_contents.html @@ -7,6 +7,9 @@ $r.contextHelpWithWrapper("Portfolio task and assignment: Collecting and editing") #end <h2>$r.translate("table.of.contents", $binderTitle) #if($owners && !$owners.isEmpty())<small>$r.translate("binder.by",$owners)</small>#end</h2> + #if($r.available("summary")) + $r.render("summary") + #end <div class="o_portfolio_toc #if($timelineSwitch) o_portfolio_withtimeline #end clearfix"> <ul class="list-unstyled"> diff --git a/src/main/java/org/olat/modules/portfolio/ui/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/modules/portfolio/ui/_i18n/LocalStrings_de.properties index 5073941e303f930f6c43e8c95aebf7ddee1f26f0..40a6e63a8d94bb009627c87c1d2f6939caf9b498 100644 --- a/src/main/java/org/olat/modules/portfolio/ui/_i18n/LocalStrings_de.properties +++ b/src/main/java/org/olat/modules/portfolio/ui/_i18n/LocalStrings_de.properties @@ -353,6 +353,8 @@ status.user.incoming=Neu status.user.inProcess=In Bearbeitung status.user.done=Erledigt summary=Zusammenfassung +summary.close=Zusammenfassung ausblenden +summary.open=Zusammenfassung \u00F6ffnen summary.placeholder=Kurze Zusammenfassung \u00FCber den Inhalt table.grading.failed.points=<span class\="o_state o_failed"><i class\="o_icon o_icon_failed"> </i> {0} Punkt(e)</span> table.grading.no=noch kein Bewertung diff --git a/src/main/java/org/olat/modules/portfolio/ui/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/modules/portfolio/ui/_i18n/LocalStrings_en.properties index 756ad06db7f26cb28ddc85f5f78dd92894c4a681..e7e90272249f7e3bdd5a49eed8cee71f4d7ca730 100644 --- a/src/main/java/org/olat/modules/portfolio/ui/_i18n/LocalStrings_en.properties +++ b/src/main/java/org/olat/modules/portfolio/ui/_i18n/LocalStrings_en.properties @@ -351,6 +351,8 @@ status.user.incoming=New status.user.inProcess=In process status.user.done=Done summary=Summary +summary.close=Hide summary +summary.open=Open summary summary.placeholder=Short summary about the content table.grading.failed.points=<span class\="o_state o_failed"><i class\="o_icon o_icon_failed"> </i> {0} Point(s)</span> table.grading.no=no grading yet