Skip to content
Snippets Groups Projects
Commit b1bff6dc authored by uhensler's avatar uhensler
Browse files

OO-3185: Add the summary to the top of the portfolio binder toc and list

parent b2c7912c
No related branches found
No related tags found
No related merge requests found
...@@ -48,6 +48,7 @@ import org.olat.modules.portfolio.Binder; ...@@ -48,6 +48,7 @@ import org.olat.modules.portfolio.Binder;
import org.olat.modules.portfolio.BinderConfiguration; import org.olat.modules.portfolio.BinderConfiguration;
import org.olat.modules.portfolio.BinderSecurityCallback; import org.olat.modules.portfolio.BinderSecurityCallback;
import org.olat.modules.portfolio.BinderStatus; import org.olat.modules.portfolio.BinderStatus;
import org.olat.modules.portfolio.PortfolioService;
import org.olat.modules.portfolio.PortfolioV2Module; import org.olat.modules.portfolio.PortfolioV2Module;
import org.olat.modules.portfolio.ui.event.DeleteBinderEvent; import org.olat.modules.portfolio.ui.event.DeleteBinderEvent;
import org.olat.modules.portfolio.ui.event.RestoreBinderEvent; import org.olat.modules.portfolio.ui.event.RestoreBinderEvent;
...@@ -82,6 +83,8 @@ public class BinderController extends BasicController implements TooledControlle ...@@ -82,6 +83,8 @@ public class BinderController extends BasicController implements TooledControlle
@Autowired @Autowired
private PortfolioV2Module portfolioModule; private PortfolioV2Module portfolioModule;
@Autowired
private PortfolioService portfolioService;
public BinderController(UserRequest ureq, WindowControl wControl, TooledStackedPanel stackPanel, public BinderController(UserRequest ureq, WindowControl wControl, TooledStackedPanel stackPanel,
BinderSecurityCallback secCallback, Binder binder, BinderConfiguration config) { BinderSecurityCallback secCallback, Binder binder, BinderConfiguration config) {
...@@ -208,6 +211,7 @@ public class BinderController extends BasicController implements TooledControlle ...@@ -208,6 +211,7 @@ public class BinderController extends BasicController implements TooledControlle
if(event == Event.CHANGED_EVENT) { if(event == Event.CHANGED_EVENT) {
removeAsListenerAndDispose(entriesCtrl); removeAsListenerAndDispose(entriesCtrl);
entriesCtrl = null; entriesCtrl = null;
binder = portfolioService.getBinderByKey(binder.getKey());
} else if(event instanceof SectionSelectionEvent) { } else if(event instanceof SectionSelectionEvent) {
SectionSelectionEvent sse = (SectionSelectionEvent)event; SectionSelectionEvent sse = (SectionSelectionEvent)event;
List<ContextEntry> entries = new ArrayList<>(); List<ContextEntry> entries = new ArrayList<>();
......
...@@ -47,17 +47,21 @@ import org.olat.core.gui.components.link.LinkFactory; ...@@ -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.link.LinkPopupSettings;
import org.olat.core.gui.components.stack.TooledStackedPanel; import org.olat.core.gui.components.stack.TooledStackedPanel;
import org.olat.core.gui.components.stack.TooledStackedPanel.Align; 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.Controller;
import org.olat.core.gui.control.Event; import org.olat.core.gui.control.Event;
import org.olat.core.gui.control.WindowControl; import org.olat.core.gui.control.WindowControl;
import org.olat.core.gui.control.creator.ControllerCreator; import org.olat.core.gui.control.creator.ControllerCreator;
import org.olat.core.gui.control.generic.closablewrapper.CloseableModalController; 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.gui.media.MediaResource;
import org.olat.core.id.Identity; import org.olat.core.id.Identity;
import org.olat.core.id.OLATResourceable; import org.olat.core.id.OLATResourceable;
import org.olat.core.id.context.ContextEntry; import org.olat.core.id.context.ContextEntry;
import org.olat.core.id.context.StateEntry; import org.olat.core.id.context.StateEntry;
import org.olat.core.logging.activity.ThreadLocalUserActivityLogger; import org.olat.core.logging.activity.ThreadLocalUserActivityLogger;
import org.olat.core.util.CodeHelper;
import org.olat.core.util.StringHelper; import org.olat.core.util.StringHelper;
import org.olat.modules.portfolio.AssessmentSection; import org.olat.modules.portfolio.AssessmentSection;
import org.olat.modules.portfolio.Assignment; import org.olat.modules.portfolio.Assignment;
...@@ -94,6 +98,8 @@ public class BinderPageListController extends AbstractPageListController { ...@@ -94,6 +98,8 @@ public class BinderPageListController extends AbstractPageListController {
private FormLink newSectionButton, previousSectionLink, nextSectionLink, showAllSectionsLink; private FormLink newSectionButton, previousSectionLink, nextSectionLink, showAllSectionsLink;
private CloseableModalController cmc; private CloseableModalController cmc;
private TextComponent summaryComp;
private ToggleBoxController summaryCtrl;
private SectionEditController newSectionCtrl; private SectionEditController newSectionCtrl;
private PageMetadataEditController newPageCtrl; private PageMetadataEditController newPageCtrl;
private AssignmentEditController newAssignmentCtrl; private AssignmentEditController newAssignmentCtrl;
...@@ -111,6 +117,10 @@ public class BinderPageListController extends AbstractPageListController { ...@@ -111,6 +117,10 @@ public class BinderPageListController extends AbstractPageListController {
this.binder = binder; this.binder = binder;
owners = portfolioService.getMembers(binder, PortfolioRoles.owner.name()); 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); initForm(ureq);
loadModel(ureq, null); loadModel(ureq, null);
...@@ -119,6 +129,14 @@ public class BinderPageListController extends AbstractPageListController { ...@@ -119,6 +129,14 @@ public class BinderPageListController extends AbstractPageListController {
initialPanel.setCssClass("o_edit_mode"); initialPanel.setCssClass("o_edit_mode");
} }
} }
private String getGuiPrefsKey(OLATResourceable binderOres) {
return new StringBuilder()
.append(binderOres.getResourceableTypeName())
.append("::")
.append(binderOres.getResourceableId())
.toString();
}
@Override @Override
public void initTools() { public void initTools() {
...@@ -214,6 +232,13 @@ public class BinderPageListController extends AbstractPageListController { ...@@ -214,6 +232,13 @@ public class BinderPageListController extends AbstractPageListController {
@Override @Override
protected void loadModel(UserRequest ureq, String searchString) { 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<Section> sections = portfolioService.getSections(binder);
List<CategoryToElement> categorizedElements = portfolioService.getCategorizedSectionsAndPages(binder); List<CategoryToElement> categorizedElements = portfolioService.getCategorizedSectionsAndPages(binder);
...@@ -389,6 +414,13 @@ public class BinderPageListController extends AbstractPageListController { ...@@ -389,6 +414,13 @@ public class BinderPageListController extends AbstractPageListController {
} }
timelineEl.setPoints(points); timelineEl.setPoints(points);
} }
@Override
protected void doDispose() {
removeAsListenerAndDispose(summaryCtrl);
summaryCtrl = null;
super.doDispose();
}
@Override @Override
protected void formInnerEvent(UserRequest ureq, FormItem source, FormEvent event) { protected void formInnerEvent(UserRequest ureq, FormItem source, FormEvent event) {
......
...@@ -39,6 +39,8 @@ import org.olat.core.gui.components.link.LinkPopupSettings; ...@@ -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.TooledController;
import org.olat.core.gui.components.stack.TooledStackedPanel; import org.olat.core.gui.components.stack.TooledStackedPanel;
import org.olat.core.gui.components.stack.TooledStackedPanel.Align; 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.components.velocity.VelocityContainer;
import org.olat.core.gui.control.Controller; import org.olat.core.gui.control.Controller;
import org.olat.core.gui.control.Event; import org.olat.core.gui.control.Event;
...@@ -49,12 +51,14 @@ import org.olat.core.gui.control.generic.closablewrapper.CloseableModalControlle ...@@ -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.dtabs.Activateable2;
import org.olat.core.gui.control.generic.modal.DialogBoxController; 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.modal.DialogBoxUIFactory;
import org.olat.core.gui.control.generic.spacesaver.ToggleBoxController;
import org.olat.core.gui.media.MediaResource; import org.olat.core.gui.media.MediaResource;
import org.olat.core.id.Identity; import org.olat.core.id.Identity;
import org.olat.core.id.OLATResourceable; import org.olat.core.id.OLATResourceable;
import org.olat.core.id.context.ContextEntry; import org.olat.core.id.context.ContextEntry;
import org.olat.core.id.context.StateEntry; import org.olat.core.id.context.StateEntry;
import org.olat.core.logging.activity.ThreadLocalUserActivityLogger; import org.olat.core.logging.activity.ThreadLocalUserActivityLogger;
import org.olat.core.util.CodeHelper;
import org.olat.core.util.StringHelper; import org.olat.core.util.StringHelper;
import org.olat.core.util.resource.OresHelper; import org.olat.core.util.resource.OresHelper;
import org.olat.modules.portfolio.AssessmentSection; import org.olat.modules.portfolio.AssessmentSection;
...@@ -105,6 +109,8 @@ public class TableOfContentController extends BasicController implements TooledC ...@@ -105,6 +109,8 @@ public class TableOfContentController extends BasicController implements TooledC
private final TooledStackedPanel stackPanel; private final TooledStackedPanel stackPanel;
private CloseableModalController cmc; private CloseableModalController cmc;
private TextComponent summaryComp;
private ToggleBoxController summaryCtrl;
private UserCommentsController commentsCtrl; private UserCommentsController commentsCtrl;
private SectionEditController newSectionCtrl; private SectionEditController newSectionCtrl;
private SectionEditController editSectionCtrl; private SectionEditController editSectionCtrl;
...@@ -152,10 +158,23 @@ public class TableOfContentController extends BasicController implements TooledC ...@@ -152,10 +158,23 @@ public class TableOfContentController extends BasicController implements TooledC
mainVC.contextPut("isTemplate", secCallback.canNewAssignment()); mainVC.contextPut("isTemplate", secCallback.canNewAssignment());
mainVC.contextPut("isPersonalBinder", (!secCallback.canNewAssignment() && secCallback.canEditMetadataBinder())); 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); putInitialPanel(mainVC);
loadModel(); loadModel();
} }
private String getGuiPrefsKey(OLATResourceable binderOres) {
return new StringBuilder()
.append(binderOres.getResourceableTypeName())
.append("::")
.append(binderOres.getResourceableId())
.toString();
}
public int getNumOfSections() { public int getNumOfSections() {
return sectionList == null ? 0 : sectionList.size(); return sectionList == null ? 0 : sectionList.size();
} }
...@@ -226,6 +245,13 @@ public class TableOfContentController extends BasicController implements TooledC ...@@ -226,6 +245,13 @@ public class TableOfContentController extends BasicController implements TooledC
protected void loadModel() { protected void loadModel() {
mainVC.contextPut("binderTitle", StringHelper.escapeHtml(binder.getTitle())); 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<>(); List<SectionRow> sectionRows = new ArrayList<>();
Map<Long,SectionRow> sectionMap = new HashMap<>(); Map<Long,SectionRow> sectionMap = new HashMap<>();
...@@ -429,7 +455,8 @@ public class TableOfContentController extends BasicController implements TooledC ...@@ -429,7 +455,8 @@ public class TableOfContentController extends BasicController implements TooledC
@Override @Override
protected void doDispose() { protected void doDispose() {
// removeAsListenerAndDispose(summaryCtrl);
summaryCtrl = null;
} }
@Override @Override
...@@ -482,6 +509,7 @@ public class TableOfContentController extends BasicController implements TooledC ...@@ -482,6 +509,7 @@ public class TableOfContentController extends BasicController implements TooledC
if(event == Event.DONE_EVENT) { if(event == Event.DONE_EVENT) {
binder = binderMetadataCtrl.getBinder(); binder = binderMetadataCtrl.getBinder();
loadModel(); loadModel();
fireEvent(ureq, Event.CHANGED_EVENT);
} }
cmc.deactivate(); cmc.deactivate();
cleanUp(); cleanUp();
......
...@@ -10,8 +10,14 @@ ...@@ -10,8 +10,14 @@
</div> </div>
#end #end
</div> </div>
<div class="o_portfolio_entries #if($timelineSwitch) o_portfolio_withtimeline #end"> <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") $r.render("table")
#if($r.available("create.new.section")) #if($r.available("create.new.section"))
......
...@@ -7,6 +7,9 @@ ...@@ -7,6 +7,9 @@
$r.contextHelpWithWrapper("Portfolio task and assignment: Collecting and editing") $r.contextHelpWithWrapper("Portfolio task and assignment: Collecting and editing")
#end #end
<h2>$r.translate("table.of.contents", $binderTitle) #if($owners && !$owners.isEmpty())<small>$r.translate("binder.by",$owners)</small>#end</h2> <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"> <div class="o_portfolio_toc #if($timelineSwitch) o_portfolio_withtimeline #end clearfix">
<ul class="list-unstyled"> <ul class="list-unstyled">
......
...@@ -353,6 +353,8 @@ status.user.incoming=Neu ...@@ -353,6 +353,8 @@ status.user.incoming=Neu
status.user.inProcess=In Bearbeitung status.user.inProcess=In Bearbeitung
status.user.done=Erledigt status.user.done=Erledigt
summary=Zusammenfassung summary=Zusammenfassung
summary.close=Zusammenfassung ausblenden
summary.open=Zusammenfassung \u00F6ffnen
summary.placeholder=Kurze Zusammenfassung \u00FCber den Inhalt 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.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 table.grading.no=noch kein Bewertung
......
...@@ -351,6 +351,8 @@ status.user.incoming=New ...@@ -351,6 +351,8 @@ status.user.incoming=New
status.user.inProcess=In process status.user.inProcess=In process
status.user.done=Done status.user.done=Done
summary=Summary summary=Summary
summary.close=Hide summary
summary.open=Open summary
summary.placeholder=Short summary about the content 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.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 table.grading.no=no grading yet
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment