diff --git a/olat3/webapp/WEB-INF/src/org/olat/course/nodes/InfoCourseNode.java b/olat3/webapp/WEB-INF/src/org/olat/course/nodes/InfoCourseNode.java index 931c062ac680558436256f896dbae91119617fd9..5bc00898a4736043a39b8867b628df9704d49e73 100644 --- a/olat3/webapp/WEB-INF/src/org/olat/course/nodes/InfoCourseNode.java +++ b/olat3/webapp/WEB-INF/src/org/olat/course/nodes/InfoCourseNode.java @@ -22,11 +22,16 @@ package org.olat.course.nodes; import java.util.List; +import org.olat.commons.info.manager.InfoMessageFrontendManager; +import org.olat.commons.info.model.InfoMessage; import org.olat.core.gui.UserRequest; import org.olat.core.gui.control.Controller; import org.olat.core.gui.control.WindowControl; import org.olat.core.gui.control.generic.tabbable.TabbableController; import org.olat.core.util.Util; +import org.olat.core.util.notifications.NotificationsManager; +import org.olat.core.util.notifications.SubscriptionContext; +import org.olat.course.CourseModule; import org.olat.course.ICourse; import org.olat.course.condition.Condition; import org.olat.course.condition.interpreter.ConditionInterpreter; @@ -195,4 +200,22 @@ public class InfoCourseNode extends AbstractAccessableCourseNode { boolean admin = (getPreConditionAdmin().getConditionExpression() == null ? true : ci.evaluateCondition(getPreConditionAdmin())); nodeEval.putAccessStatus(ADMIN_CONDITION_ID, admin); } + + @Override + /** + * is called when deleting this node, clean up info-messages and subscriptions! + */ + public void cleanupOnDelete(ICourse course) { + // delete infoMessages and subscriptions (OLAT-6171) + List<InfoMessage> messages = InfoMessageFrontendManager.getInstance().loadInfoMessageByResource(course,null, null, null, null, 0, 0); + InfoMessageFrontendManager infoMessageManager = InfoMessageFrontendManager.getInstance(); + for (InfoMessage im : messages) { + infoMessageManager.deleteInfoMessage(im); + } + + final SubscriptionContext subscriptionContext = CourseModule.createTechnicalSubscriptionContext(course.getCourseEnvironment(), this); + NotificationsManager notifManagar = NotificationsManager.getInstance(); + notifManagar.delete(subscriptionContext); + super.cleanupOnDelete(course); + } } diff --git a/olat3/webapp/WEB-INF/src/org/olat/portfolio/ui/artefacts/view/EPArtefactViewOptionsLinkController.java b/olat3/webapp/WEB-INF/src/org/olat/portfolio/ui/artefacts/view/EPArtefactViewOptionsLinkController.java new file mode 100644 index 0000000000000000000000000000000000000000..a5f37af0a54f129a6d30c92b7aa93e1a9735e34b --- /dev/null +++ b/olat3/webapp/WEB-INF/src/org/olat/portfolio/ui/artefacts/view/EPArtefactViewOptionsLinkController.java @@ -0,0 +1,181 @@ +/** + * OLAT - Online Learning and Training<br> + * http://www.olat.org + * <p> + * Licensed under the Apache License, Version 2.0 (the "License"); <br> + * you may not use this file except in compliance with the License.<br> + * You may obtain a copy of the License at + * <p> + * http://www.apache.org/licenses/LICENSE-2.0 + * <p> + * Unless required by applicable law or agreed to in writing,<br> + * software distributed under the License is distributed on an "AS IS" BASIS, <br> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> + * See the License for the specific language governing permissions and <br> + * limitations under the License. + * <p> + * Copyright (c) frentix GmbH<br> + * http://www.frentix.com<br> + * <p> + */ +package org.olat.portfolio.ui.artefacts.view; + +import org.olat.core.CoreSpringFactory; +import org.olat.core.gui.UserRequest; +import org.olat.core.gui.components.Component; +import org.olat.core.gui.components.link.Link; +import org.olat.core.gui.components.link.LinkFactory; +import org.olat.core.gui.components.velocity.VelocityContainer; +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.controller.BasicController; +import org.olat.core.gui.control.generic.closablewrapper.CloseableCalloutWindowController; +import org.olat.core.gui.control.generic.closablewrapper.CloseableModalWindowWrapperController; +import org.olat.portfolio.EPSecurityCallback; +import org.olat.portfolio.EPUIFactory; +import org.olat.portfolio.manager.EPFrontendManager; +import org.olat.portfolio.model.artefacts.AbstractArtefact; +import org.olat.portfolio.model.structel.PortfolioStructure; +import org.olat.portfolio.ui.artefacts.collect.EPCollectStepForm04; +import org.olat.portfolio.ui.structel.EPStructureChangeEvent; + +/** + * Description: Displays the options-Link for an artefact. handles displaying of the callout and its links + * (remove artefact from map, reflexion, move artefact within map)<br> + * <P> + * Initial Date: 14.07.2011 <br> + * + * @author Sergio Trentini, sergio.trentini@frentix.com, http://www.frentix.com + */ +public class EPArtefactViewOptionsLinkController extends BasicController { + + + private final AbstractArtefact artefact; + private PortfolioStructure struct; + private final EPSecurityCallback secCallback; + private final VelocityContainer vC; + private final EPFrontendManager ePFMgr; + + //controllers + private EPCollectStepForm04 moveTreeCtrl; + private CloseableModalWindowWrapperController moveTreeBox; + private Controller reflexionCtrl; + private CloseableCalloutWindowController artefactOptionCalloutCtrl; + + + + // the link that triggers the callout + private Link optionLink; + + // the links within the callout + private Link unlinkLink; + private Link moveLink; + private Link reflexionLink; + + + public EPArtefactViewOptionsLinkController(final UserRequest ureq, final WindowControl wControl, final AbstractArtefact artefact, + final EPSecurityCallback secCallback, final PortfolioStructure struct){ + super(ureq,wControl); + System.out.println("instantiate new EPArtefactViewOptionsLinkController "+this.toString()); + this.artefact = artefact; + this.struct = struct; + this.secCallback = secCallback; + + ePFMgr = (EPFrontendManager) CoreSpringFactory.getBean("epFrontendManager"); + vC = createVelocityContainer("optionsLink"); + + optionLink = LinkFactory.createCustomLink("option.link", "option", " ", Link.NONTRANSLATED, vC, this); + optionLink.setCustomEnabledLinkCSS("b_ep_options"); + optionLink.setTooltip(translate("option.link"), false); + + putInitialPanel(vC); + } + + + @Override + protected void event(UserRequest ureq, Component source, Event event) { + if (source == optionLink){ + popUpArtefactOptionsBox(ureq); + }else if (source == unlinkLink) { + closeArtefactOptionsCallout(); + struct = ePFMgr.removeArtefactFromStructure(artefact, struct); + fireEvent(ureq, new EPStructureChangeEvent(EPStructureChangeEvent.REMOVED, struct)); // refresh ui + } else if (source == moveLink){ + closeArtefactOptionsCallout(); + showMoveTree(ureq); + } else if (source == reflexionLink) { + closeArtefactOptionsCallout(); + reflexionCtrl = EPUIFactory.getReflexionPopup(ureq, getWindowControl(), secCallback, artefact, struct); + listenTo(reflexionCtrl); + } + } + + /** + * @see org.olat.core.gui.control.DefaultController#event(org.olat.core.gui.UserRequest, org.olat.core.gui.control.Controller, org.olat.core.gui.control.Event) + */ + @Override + protected void event(UserRequest ureq, Controller source, Event event) { + if (source == moveTreeCtrl && event.getCommand().equals(EPStructureChangeEvent.CHANGED)){ + EPStructureChangeEvent epsEv = (EPStructureChangeEvent) event; + PortfolioStructure newStruct = epsEv.getPortfolioStructure(); + showInfo("artefact.moved", newStruct.getTitle()); + moveTreeBox.deactivate(); + } + fireEvent(ureq, event); + } + + /** + * opens a modalWindow that displays the "move-tree" + * + * @param ureq + */ + private void showMoveTree(UserRequest ureq){ + moveTreeCtrl = new EPCollectStepForm04(ureq, getWindowControl(), artefact, struct); + listenTo(moveTreeCtrl); + String title = translate("artefact.move.title"); + moveTreeBox = new CloseableModalWindowWrapperController(ureq, getWindowControl(), title, moveTreeCtrl.getInitialComponent(), "moveTreeBox"); + listenTo(moveTreeBox); + moveTreeBox.setInitialWindowSize(450, 300); + moveTreeBox.activate(); + } + + + /** + * closes the callout + */ + private void closeArtefactOptionsCallout() { + if (artefactOptionCalloutCtrl != null){ + artefactOptionCalloutCtrl.deactivate(); + removeAsListenerAndDispose(artefactOptionCalloutCtrl); + artefactOptionCalloutCtrl = null; + } + } + + /** + * opens the callout + * @param ureq + */ + private void popUpArtefactOptionsBox(UserRequest ureq) { + VelocityContainer artOptVC = createVelocityContainer("artefactOptions"); + if (secCallback.canRemoveArtefactFromStruct()){ + unlinkLink = LinkFactory.createCustomLink("unlink.link", "remove", "remove.from.map", Link.LINK, artOptVC, this); + } + if (secCallback.canAddArtefact() && secCallback.canRemoveArtefactFromStruct() && secCallback.isOwner()){ // isOwner: don't show move in group maps! + moveLink = LinkFactory.createCustomLink("move.link", "move", "artefact.options.move", Link.LINK, artOptVC, this); + } + reflexionLink = LinkFactory.createCustomLink("reflexion.link", "reflexion", "table.header.reflexion", Link.LINK, artOptVC, this); + String title = translate("option.link"); + removeAsListenerAndDispose(artefactOptionCalloutCtrl); + artefactOptionCalloutCtrl = new CloseableCalloutWindowController(ureq, getWindowControl(), artOptVC, optionLink, title, true, null); + listenTo(artefactOptionCalloutCtrl); + artefactOptionCalloutCtrl.activate(); + } + + + @Override + protected void doDispose() { + closeArtefactOptionsCallout(); + } + +} diff --git a/olat3/webapp/WEB-INF/src/org/olat/portfolio/ui/artefacts/view/EPArtefactViewReadOnlyController.java b/olat3/webapp/WEB-INF/src/org/olat/portfolio/ui/artefacts/view/EPArtefactViewReadOnlyController.java index 2c6c179c8a96136818d623cb08caad1d1662d2ae..d28bb311b39dfd74833fca3ef9a2b485a31d6972 100644 --- a/olat3/webapp/WEB-INF/src/org/olat/portfolio/ui/artefacts/view/EPArtefactViewReadOnlyController.java +++ b/olat3/webapp/WEB-INF/src/org/olat/portfolio/ui/artefacts/view/EPArtefactViewReadOnlyController.java @@ -32,7 +32,6 @@ 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.controller.BasicController; -import org.olat.core.gui.control.generic.closablewrapper.CloseableCalloutWindowController; import org.olat.core.gui.control.generic.closablewrapper.CloseableModalWindowWrapperController; import org.olat.core.id.Identity; import org.olat.core.id.UserConstants; @@ -44,13 +43,10 @@ import org.olat.portfolio.EPUIFactory; import org.olat.portfolio.manager.EPFrontendManager; import org.olat.portfolio.model.artefacts.AbstractArtefact; import org.olat.portfolio.model.structel.PortfolioStructure; -import org.olat.portfolio.ui.artefacts.collect.EPCollectStepForm04; -import org.olat.portfolio.ui.structel.EPStructureChangeEvent; /** * Description:<br> * simple artefact read-only controller - * * <P> * Initial Date: 17.11.2010 <br> * @author Roman Haag, roman.haag@frentix.com, http://www.frentix.com @@ -63,19 +59,10 @@ public class EPArtefactViewReadOnlyController extends BasicController { private AbstractArtefact artefact; private PortfolioStructure struct; private EPSecurityCallback secCallback; - private Link unlinkLink; - private Link optionLink; - private Link moveLink; - private CloseableCalloutWindowController artefactOptionCalloutCtrl; - private Link reflexionLink; - private EPCollectStepForm04 moveTreeCtrl; - private CloseableModalWindowWrapperController moveTreeBox; - private Controller reflexionCtrl; protected EPArtefactViewReadOnlyController(UserRequest ureq, WindowControl wControl, AbstractArtefact artefact, EPSecurityCallback secCallback, PortfolioStructure struct) { super(ureq, wControl); this.artefact = artefact; - this.struct = struct; this.secCallback = secCallback; vC = createVelocityContainer("smallSingleArtefact"); vC.contextPut("artefact", artefact); @@ -89,9 +76,6 @@ public class EPArtefactViewReadOnlyController extends BasicController { if (secCallback.canView()){ detailsLink = LinkFactory.createCustomLink("small.details.link", "open", "small.details.link", Link.LINK, vC, this); } - optionLink = LinkFactory.createCustomLink("option.link", "option", " ", Link.NONTRANSLATED, vC, this); - optionLink.setCustomEnabledLinkCSS("b_ep_options"); - optionLink.setTooltip(translate("option.link"), false); ePFMgr = (EPFrontendManager) CoreSpringFactory.getBean("epFrontendManager"); List<String> tags = ePFMgr.getArtefactTags(artefact); @@ -110,20 +94,7 @@ public class EPArtefactViewReadOnlyController extends BasicController { String title = translate("view.artefact.header"); CloseableModalWindowWrapperController artDetails = EPUIFactory.getAndActivatePopupArtefactController(artefact, ureq, getWindowControl(), title); listenTo(artDetails); - } else if (source == unlinkLink){ - closeArtefactOptionsCallout(); - struct = ePFMgr.removeArtefactFromStructure(artefact, struct); - fireEvent(ureq, new EPStructureChangeEvent(EPStructureChangeEvent.ADDED, struct)); // refresh ui - } else if (source == optionLink){ - popUpArtefactOptionsBox(ureq); - } else if (source == moveLink){ - closeArtefactOptionsCallout(); - showMoveTree(ureq); - } else if (source == reflexionLink) { - closeArtefactOptionsCallout(); - reflexionCtrl = EPUIFactory.getReflexionPopup(ureq, getWindowControl(), secCallback, artefact, struct); - listenTo(reflexionCtrl); - } + } } /** @@ -131,47 +102,6 @@ public class EPArtefactViewReadOnlyController extends BasicController { */ @Override protected void event(UserRequest ureq, Controller source, Event event) { - if (source == moveTreeCtrl && event.getCommand().equals(EPStructureChangeEvent.CHANGED)){ - EPStructureChangeEvent epsEv = (EPStructureChangeEvent) event; - PortfolioStructure newStruct = epsEv.getPortfolioStructure(); - showInfo("artefact.moved", newStruct.getTitle()); - fireEvent(ureq, event); - moveTreeBox.deactivate(); - } - } - - private void showMoveTree(UserRequest ureq){ - moveTreeCtrl = new EPCollectStepForm04(ureq, getWindowControl(), artefact, struct); - listenTo(moveTreeCtrl); - String title = translate("artefact.move.title"); - moveTreeBox = new CloseableModalWindowWrapperController(ureq, getWindowControl(), title, moveTreeCtrl.getInitialComponent(), "moveTreeBox"); - listenTo(moveTreeBox); - moveTreeBox.setInitialWindowSize(450, 300); - moveTreeBox.activate(); - } - - private void popUpArtefactOptionsBox(UserRequest ureq) { - VelocityContainer artOptVC = createVelocityContainer("artefactOptions"); - if (secCallback.canRemoveArtefactFromStruct()){ - unlinkLink = LinkFactory.createCustomLink("unlink.link", "remove", "remove.from.map", Link.LINK, artOptVC, this); - } - if (secCallback.canAddArtefact() && secCallback.canRemoveArtefactFromStruct() && secCallback.isOwner()){ // isOwner: don't show move in group maps! - moveLink = LinkFactory.createCustomLink("move.link", "move", "artefact.options.move", Link.LINK, artOptVC, this); - } - reflexionLink = LinkFactory.createCustomLink("reflexion.link", "reflexion", "table.header.reflexion", Link.LINK, artOptVC, this); - String title = translate("option.link"); - removeAsListenerAndDispose(artefactOptionCalloutCtrl); - artefactOptionCalloutCtrl = new CloseableCalloutWindowController(ureq, getWindowControl(), artOptVC, optionLink, title, true, null); - listenTo(artefactOptionCalloutCtrl); - artefactOptionCalloutCtrl.activate(); - } - - private void closeArtefactOptionsCallout() { - if (artefactOptionCalloutCtrl != null){ - artefactOptionCalloutCtrl.deactivate(); - removeAsListenerAndDispose(artefactOptionCalloutCtrl); - artefactOptionCalloutCtrl = null; - } } /** @@ -179,7 +109,6 @@ public class EPArtefactViewReadOnlyController extends BasicController { */ @Override protected void doDispose() { - closeArtefactOptionsCallout(); } } diff --git a/olat3/webapp/WEB-INF/src/org/olat/portfolio/ui/artefacts/view/EPMultipleArtefactSmallReadOnlyPreviewController.java b/olat3/webapp/WEB-INF/src/org/olat/portfolio/ui/artefacts/view/EPMultipleArtefactSmallReadOnlyPreviewController.java index c316a451dbc0aec7185d8a2d83532f8bd30200ad..c9c4c6b28a0d8802bce717fec56cb7f30d585b62 100644 --- a/olat3/webapp/WEB-INF/src/org/olat/portfolio/ui/artefacts/view/EPMultipleArtefactSmallReadOnlyPreviewController.java +++ b/olat3/webapp/WEB-INF/src/org/olat/portfolio/ui/artefacts/view/EPMultipleArtefactSmallReadOnlyPreviewController.java @@ -42,11 +42,10 @@ import org.olat.portfolio.model.structel.PortfolioStructure; /** * Description:<br> * show minimal set of artefact details in small preview controllers. - * if an artefact handler provides a special preview, use this instead the generic artefact-view - * used inside maps. - * + * if an artefact handler provides a special preview, use this instead the generic artefact-view used inside maps. * <P> - * Initial Date: 17.11.2010 <br> + * Initial Date: 17.11.2010 <br> + * * @author Roman Haag, roman.haag@frentix.com, http://www.frentix.com */ public class EPMultipleArtefactSmallReadOnlyPreviewController extends BasicController implements EPMultiArtefactsController { @@ -54,6 +53,7 @@ public class EPMultipleArtefactSmallReadOnlyPreviewController extends BasicContr private List<AbstractArtefact> artefacts; private PortfolioModule portfolioModule; private ArrayList<Controller> artefactCtrls; + private ArrayList<Controller> optionLinkCtrls; private VelocityContainer vC; private PortfolioStructure struct; private EPSecurityCallback secCallback; @@ -72,6 +72,8 @@ public class EPMultipleArtefactSmallReadOnlyPreviewController extends BasicContr private void init(UserRequest ureq) { if (artefactCtrls != null) disposeArtefactControllers(); + if( optionLinkCtrls != null) disposeOptionLinkControllers(); + optionLinkCtrls = new ArrayList<Controller>(); artefactCtrls = new ArrayList<Controller>(); List<List<Panel>> artefactCtrlCompLines = new ArrayList<List<Panel>>(); List<Panel> artefactCtrlCompLine = new ArrayList<Panel>(); @@ -113,6 +115,13 @@ public class EPMultipleArtefactSmallReadOnlyPreviewController extends BasicContr if(special) {//need a flag in a lopp for the velociy template vC.put("specialartCtrl" + i, artefactCtrlComponent); } + + //add the optionsLink to the artefact + EPArtefactViewOptionsLinkController optionsLinkCtrl = new EPArtefactViewOptionsLinkController(ureq, getWindowControl(), artefact, secCallback, struct); + vC.put("optionsLink"+i,optionsLinkCtrl.getInitialComponent()); + listenTo(optionsLinkCtrl); + optionLinkCtrls.add(optionsLinkCtrl); + i++; } } @@ -133,6 +142,19 @@ public class EPMultipleArtefactSmallReadOnlyPreviewController extends BasicContr } } + /** + * dispose the list that holds optionLinkControlllers + */ + private void disposeOptionLinkControllers(){ + if (optionLinkCtrls != null) { + for (Controller optionCtrl : optionLinkCtrls) { + removeAsListenerAndDispose(optionCtrl); + optionCtrl = null; + } + optionLinkCtrls = null; + } + } + /** * @see org.olat.portfolio.ui.artefacts.view.EPMultiArtefactsController#setNewArtefactsList(org.olat.core.gui.UserRequest, java.util.List) */ @@ -166,6 +188,7 @@ public class EPMultipleArtefactSmallReadOnlyPreviewController extends BasicContr @Override protected void doDispose() { disposeArtefactControllers(); + disposeOptionLinkControllers(); } } diff --git a/olat3/webapp/WEB-INF/src/org/olat/portfolio/ui/artefacts/view/_content/optionsLink.html b/olat3/webapp/WEB-INF/src/org/olat/portfolio/ui/artefacts/view/_content/optionsLink.html new file mode 100644 index 0000000000000000000000000000000000000000..2a7be69d7f4d6dcc81c858325c699dd13d2d2997 --- /dev/null +++ b/olat3/webapp/WEB-INF/src/org/olat/portfolio/ui/artefacts/view/_content/optionsLink.html @@ -0,0 +1 @@ +$r.render("option.link") \ No newline at end of file diff --git a/olat3/webapp/WEB-INF/src/org/olat/portfolio/ui/artefacts/view/_content/smallMultiArtefactPreview.html b/olat3/webapp/WEB-INF/src/org/olat/portfolio/ui/artefacts/view/_content/smallMultiArtefactPreview.html index a48e4a64b31063722fd53570c5a6029ad87ef089..31b954564a8d6d213bc332b32aeb5f9469624688 100644 --- a/olat3/webapp/WEB-INF/src/org/olat/portfolio/ui/artefacts/view/_content/smallMultiArtefactPreview.html +++ b/olat3/webapp/WEB-INF/src/org/olat/portfolio/ui/artefacts/view/_content/smallMultiArtefactPreview.html @@ -1,19 +1,26 @@ <div class="b_subcolumns"> + #set($innerCounter = 1) #foreach($artefactCtrlCompLine in $artefactCtrlCompLines) <div class="b_clearfix"> #foreach($artefactCtrlPanel in $artefactCtrlCompLine) #set($specialCtrlName = "special$artefactCtrlPanel.componentName") + #set($optionsLinkName = "optionsLink$innerCounter") #if($r.available($specialCtrlName)) <div class="b_eportfolio_preview_c100l"> <div class="b_artefact"> $r.render($artefactCtrlPanel.componentName) + <div class="b_artefact_optionslink">$r.render($optionsLinkName)</div> </div> </div> #else <div class="b_eportfolio_preview_c33l b_c33l"> + <div class="b_form b_artefact b_clearfix" > $r.render($artefactCtrlPanel.componentName) + <div class="b_artefact_optionslink">$r.render($optionsLinkName)</div> + </div> </div> #end + #set($innerCounter = $innerCounter + 1) #end </div> #end diff --git a/olat3/webapp/WEB-INF/src/org/olat/portfolio/ui/artefacts/view/_content/smallSingleArtefact.html b/olat3/webapp/WEB-INF/src/org/olat/portfolio/ui/artefacts/view/_content/smallSingleArtefact.html index e0947fe31fe3a327dc9029d9f05a0801047168e8..53a799f95c398a1e9647d5a90e562b8f08d8d5f4 100644 --- a/olat3/webapp/WEB-INF/src/org/olat/portfolio/ui/artefacts/view/_content/smallSingleArtefact.html +++ b/olat3/webapp/WEB-INF/src/org/olat/portfolio/ui/artefacts/view/_content/smallSingleArtefact.html @@ -1,4 +1,4 @@ -<div class="b_form b_artefact b_clearfix" > +<div > <h4 class="b_with_small_icon_left $artefact.getIcon()">$!artefact.getTitle()</h4> #if($description) <div class="b_desc"> diff --git a/olat3/webapp/WEB-INF/src/org/olat/portfolio/ui/structel/EPStructureElementsController.java b/olat3/webapp/WEB-INF/src/org/olat/portfolio/ui/structel/EPStructureElementsController.java index 5d0949e2261ba920a252c8ee1702bdb3b496011c..b8adf3160b279a26ede7b99d7c01cb35c9f049fe 100644 --- a/olat3/webapp/WEB-INF/src/org/olat/portfolio/ui/structel/EPStructureElementsController.java +++ b/olat3/webapp/WEB-INF/src/org/olat/portfolio/ui/structel/EPStructureElementsController.java @@ -153,6 +153,9 @@ public class EPStructureElementsController extends BasicController { // something changed initForm(ureq); + + //pass it on, parent controllers (EPPageViewController) might need to update + fireEvent(ureq, changeEvent); } } diff --git a/olat3/webapp/static/themes/default/all/brasato.css b/olat3/webapp/static/themes/default/all/brasato.css index 44124c0efa43391d215205c53771fb3586a8036c..a4582b6e5f8dfcd9f79cf2ba10bc51b634e6c447 100644 --- a/olat3/webapp/static/themes/default/all/brasato.css +++ b/olat3/webapp/static/themes/default/all/brasato.css @@ -1031,7 +1031,7 @@ .b_ep_multiartefacts div.b_artefact_count { margin: 1em 0 1em 0;} a.b_ep_options { background: url(../images/brasato/preferences.png) top left no-repeat; width:16px; height:16px; display: block;} - a.b_ep_options:hover { background: url(../images/brasato/preferences_over.png) top left no-repeat; width:16px; height:16px; display: block;} + a.b_ep_options:hover { background: url(../images/brasato/preferences_over.png) top left no-repeat; width:16px; height:16px; display: block;text-decoration:none;} .b_ep_liveblog_icon { background-image: url(../images/brasato/eportfolio/ep_liveblog_icon.png); } div.b_portfolio_toc ul { margin: 0; }