diff --git a/src/main/java/org/olat/course/nodes/FOCourseNode.java b/src/main/java/org/olat/course/nodes/FOCourseNode.java index b071e6471cbd6360e117c9976c8032165b662cc4..dc5a3cda97d3f4d55db9f2428df1a09a3cbbbf31 100644 --- a/src/main/java/org/olat/course/nodes/FOCourseNode.java +++ b/src/main/java/org/olat/course/nodes/FOCourseNode.java @@ -241,7 +241,7 @@ public class FOCourseNode extends AbstractAccessableCourseNode { if (ne.isAtLeastOneAccessible()) { // Create a forum peekview controller that shows the latest two messages Forum theForum = loadOrCreateForum(userCourseEnv.getCourseEnvironment()); - Controller peekViewController = new FOPeekviewController(ureq, wControl, theForum, getIdent(), 2); + Controller peekViewController = new FOPeekviewController(ureq, wControl, theForum, getIdent(), 3); return peekViewController; } else { // use standard peekview @@ -336,8 +336,7 @@ public class FOCourseNode extends AbstractAccessableCourseNode { public StatusDescription[] isConfigValid(CourseEditorEnv cev) { oneClickStatusCache = null; //only here we know which translator to take for translating condition error messages - String translatorStr = Util.getPackageName(FOCourseNodeEditController.class); - List<StatusDescription> sds = isConfigValidWithTranslator(cev, translatorStr,getConditionExpressions()); + List<StatusDescription> sds = isConfigValidWithTranslator(cev, PACKAGE_FO, getConditionExpressions()); oneClickStatusCache = StatusDescriptionHelper.sort(sds); return oneClickStatusCache; } diff --git a/src/main/java/org/olat/course/nodes/fo/FOPeekviewController.java b/src/main/java/org/olat/course/nodes/fo/FOPeekviewController.java index 7f40f4c52f85867e6a1ce9f0983b9ce98be19b13..8048ec8b2b373ce590f80274d28a7c93d40693fb 100644 --- a/src/main/java/org/olat/course/nodes/fo/FOPeekviewController.java +++ b/src/main/java/org/olat/course/nodes/fo/FOPeekviewController.java @@ -19,8 +19,11 @@ */ package org.olat.course.nodes.fo; +import java.util.ArrayList; +import java.util.Date; import java.util.List; +import org.apache.commons.lang.StringEscapeUtils; import org.olat.core.gui.UserRequest; import org.olat.core.gui.components.Component; import org.olat.core.gui.components.htmlsite.OlatCmdEvent; @@ -34,9 +37,12 @@ import org.olat.core.gui.control.controller.BasicController; import org.olat.core.util.Formatter; import org.olat.core.util.StringHelper; import org.olat.core.util.Util; +import org.olat.core.util.filter.FilterFactory; import org.olat.modules.fo.Forum; import org.olat.modules.fo.ForumManager; import org.olat.modules.fo.Message; +import org.olat.user.UserManager; +import org.springframework.beans.factory.annotation.Autowired; /** * <h3>Description:</h3> The forum peekview controller displays the configurable @@ -54,6 +60,11 @@ import org.olat.modules.fo.Message; public class FOPeekviewController extends BasicController implements Controller { // the current course node id private final String nodeId; + + @Autowired + private UserManager userManager; + @Autowired + private ForumManager forumManager; /** * Constructor @@ -70,9 +81,9 @@ public class FOPeekviewController extends BasicController implements Controller VelocityContainer peekviewVC = createVelocityContainer("peekview"); // add items, only as many as configured - ForumManager foMgr = ForumManager.getInstance(); - List<Message> messages = foMgr.getMessagesByForumID(forum.getKey(), 0, itemsToDisplay, Message.OrderBy.creationDate, false); + List<Message> messages = forumManager.getMessagesByForumID(forum.getKey(), 0, itemsToDisplay, Message.OrderBy.creationDate, false); // only take the configured amount of messages + List<MessageView> views = new ArrayList<MessageView>(itemsToDisplay); for (Message message :messages) { // add link to item // Add link to jump to course node @@ -80,17 +91,32 @@ public class FOPeekviewController extends BasicController implements Controller nodeLink.setCustomDisplayText(StringHelper.escapeHtml(message.getTitle())); nodeLink.setIconLeftCSS("o_icon o_icon_post"); nodeLink.setCustomEnabledLinkCSS("o_gotoNode"); - nodeLink.setUserObject(Long.toString(message.getKey())); + nodeLink.setUserObject(message.getKey()); + + String creator = userManager.getUserDisplayName(message.getCreator()); + String body = message.getBody(); + if(body.length() > 256) { + String truncateBody = FilterFactory.getHtmlTagsFilter().filter(body); + truncateBody = StringEscapeUtils.unescapeHtml(truncateBody);// remove entities + if(truncateBody.length() < 256) { + body = StringHelper.xssScan(body); + } else { + truncateBody = Formatter.truncate(truncateBody, 256);// truncate + body = StringHelper.escapeHtml(truncateBody);//ok because html tags are filtered + } + } else { + body = StringHelper.xssScan(body); + } + views.add(new MessageView(message.getKey(), message.getCreationDate(), creator, body)); } - peekviewVC.contextPut("messages", messages); + peekviewVC.contextPut("messages", views); // Add link to show all items (go to node) Link allItemsLink = LinkFactory.createLink("peekview.allItemsLink", peekviewVC, this); allItemsLink.setIconRightCSS("o_icon o_icon_start"); allItemsLink.setCustomEnabledLinkCSS("pull-right"); // Add Formatter for proper date formatting peekviewVC.contextPut("formatter", Formatter.getInstance(getLocale())); - // - this.putInitialPanel(peekviewVC); + putInitialPanel(peekviewVC); } /** @@ -100,7 +126,7 @@ public class FOPeekviewController extends BasicController implements Controller protected void event(UserRequest ureq, Component source, Event event) { if (source instanceof Link) { Link nodeLink = (Link) source; - String messageId = (String) nodeLink.getUserObject(); + Object messageId = nodeLink.getUserObject(); if (messageId == null) { fireEvent(ureq, new OlatCmdEvent(OlatCmdEvent.GOTONODE_CMD, nodeId)); } else { @@ -116,5 +142,35 @@ public class FOPeekviewController extends BasicController implements Controller protected void doDispose() { // nothing to dispose } + + public static class MessageView { + + private final Long key; + private final String body; + private final Date creationDate; + private final String creatorFullname; + + public MessageView(Long key, Date creationDate, String creatorFullname, String body) { + this.key = key; + this.body = body; + this.creationDate = creationDate; + this.creatorFullname = creatorFullname; + } + + public Long getKey() { + return key; + } + + public Date getCreationDate() { + return creationDate; + } + + public String getCreatorFullname() { + return creatorFullname; + } -} + public String getBody() { + return body; + } + } +} \ No newline at end of file diff --git a/src/main/java/org/olat/course/nodes/fo/_content/peekview.html b/src/main/java/org/olat/course/nodes/fo/_content/peekview.html index 75cd5c374a073fd07d93e8f83d99ac580029433d..d38605e0acf4ed6000a650c0936608a40d51bd0a 100644 --- a/src/main/java/org/olat/course/nodes/fo/_content/peekview.html +++ b/src/main/java/org/olat/course/nodes/fo/_content/peekview.html @@ -4,9 +4,8 @@ <h5> $r.render("nodeLink_${message.getKey()}") <small class="o_nowrap"> - #set($user=$message.getCreator().getUser()) - $r.escapeHtml($user.getProperty("firstName", null)) $r.escapeHtml($user.getProperty("lastName", null)) - ($formatter.formatDateAndTime($message.getCreationDate())) + $r.escapeHtml($message.creator) + $formatter.formatDateAndTime($message.getCreationDate()) </small> </h5> <div> diff --git a/src/main/java/org/olat/group/manager/BusinessGroupServiceImpl.java b/src/main/java/org/olat/group/manager/BusinessGroupServiceImpl.java index 26232e480a405ec8f7c8a8bdc8ed258da79d3026..930a93166a74621b775039b0115d081c1d96554e 100644 --- a/src/main/java/org/olat/group/manager/BusinessGroupServiceImpl.java +++ b/src/main/java/org/olat/group/manager/BusinessGroupServiceImpl.java @@ -1525,7 +1525,7 @@ public class BusinessGroupServiceImpl implements BusinessGroupService, UserDataD for(RepositoryEntry re:resources) { boolean found = false; for(RepositoryEntryToGroupRelation relation:relations) { - if(relation.getGroup().equals(group) && relation.getEntry().equals(re)) { + if(relation.getGroup().equals(baseGroup) && relation.getEntry().equals(re)) { found = true; } } diff --git a/src/main/java/org/olat/repository/ui/author/CreateRepositoryEntryController.java b/src/main/java/org/olat/repository/ui/author/CreateRepositoryEntryController.java index 861bf8beb8f7c7e635b139c96703b1f120aa0f89..26427307a711bf7331e7cc0142de12b922b36527 100644 --- a/src/main/java/org/olat/repository/ui/author/CreateRepositoryEntryController.java +++ b/src/main/java/org/olat/repository/ui/author/CreateRepositoryEntryController.java @@ -128,13 +128,12 @@ public class CreateRepositoryEntryController extends FormBasicController { protected boolean validateFormLogic(UserRequest ureq) { boolean allOk = true; + displaynameEl.clearError(); if (!StringHelper.containsNonWhitespace(displaynameEl.getValue())) { displaynameEl.setErrorKey("cif.error.displayname.empty", new String[] {}); - allOk = false; + allOk &= false; } else if (displaynameEl.hasError()) { - allOk = false; - } else { - displaynameEl.clearError(); + allOk &= false; } return allOk & super.validateFormLogic(ureq); diff --git a/src/main/resources/database/mysql/alter_10_3_2_to_10_3_3.sql b/src/main/resources/database/mysql/alter_10_3_2_to_10_3_3.sql index 2e972fb1f05e37c4c88d9b4c426ad5a60337d62c..17d5e2eca76c46c7eaa722265c3f4e3b3dbc9e46 100644 --- a/src/main/resources/database/mysql/alter_10_3_2_to_10_3_3.sql +++ b/src/main/resources/database/mysql/alter_10_3_2_to_10_3_3.sql @@ -1 +1,3 @@ -alter table o_ac_offer add column autobooking boolean default 0; \ No newline at end of file +alter table o_ac_offer add column autobooking boolean default 0; + +create index idx_mail_meta_id_idx on o_mail (meta_mail_id); \ No newline at end of file diff --git a/src/main/resources/database/mysql/setupDatabase.sql b/src/main/resources/database/mysql/setupDatabase.sql index 5dbe58990df2a9a0a5b1dc80c886e4f13c29f09c..9b8c5e37100e8fec48dbdf462f9da10d2cd21fbe 100644 --- a/src/main/resources/database/mysql/setupDatabase.sql +++ b/src/main/resources/database/mysql/setupDatabase.sql @@ -2022,6 +2022,7 @@ alter table o_tag add constraint FK6491FCA5A4FA5DC foreign key (fk_author_id) re -- mail alter table o_mail add constraint FKF86663165A4FA5DC foreign key (fk_from_id) references o_mail_recipient (recipient_id); +create index idx_mail_meta_id_idx on o_mail (meta_mail_id); alter table o_mail_recipient add constraint FKF86663165A4FA5DG foreign key (fk_recipient_id) references o_bs_identity (id); diff --git a/src/main/resources/database/oracle/alter_10_3_2_to_10_3_3.sql b/src/main/resources/database/oracle/alter_10_3_2_to_10_3_3.sql index 88bf104c6e405401d058eef298f794d834fd13d2..9552d3d714e661de5b463601096b9b33f4996bd6 100644 --- a/src/main/resources/database/oracle/alter_10_3_2_to_10_3_3.sql +++ b/src/main/resources/database/oracle/alter_10_3_2_to_10_3_3.sql @@ -1 +1,3 @@ alter table o_ac_offer add autobooking number default 0 not null; + +create index idx_mail_meta_id_idx on o_mail (meta_mail_id); diff --git a/src/main/resources/database/oracle/setupDatabase.sql b/src/main/resources/database/oracle/setupDatabase.sql index 2823622633719d6293d864f09d631ec3b9cd88eb..119d08a4ed4dee413861ff9aa8544e9f97e54198 100644 --- a/src/main/resources/database/oracle/setupDatabase.sql +++ b/src/main/resources/database/oracle/setupDatabase.sql @@ -2167,6 +2167,7 @@ create index idx_mail_from_idx on o_mail (fk_from_id); alter table o_mail_recipient add constraint FKF86663165A4FA5DG foreign key (fk_recipient_id) references o_bs_identity (id); create index idx_mailrec_rcp_idx on o_mail_recipient (fk_recipient_id); +create index idx_mail_meta_id_idx on o_mail (meta_mail_id); alter table o_mail_to_recipient add constraint FKF86663165A4FA5DE foreign key (fk_mail_id) references o_mail (mail_id); create index idx_mailtorec_mail_idx on o_mail_to_recipient (fk_mail_id); diff --git a/src/main/resources/database/postgresql/alter_10_3_0_to_10_3_1.sql b/src/main/resources/database/postgresql/alter_10_3_0_to_10_3_1.sql index 1fbf609db37a91b58af580160217b2cf50534b87..b715e360eb32ab7dac59cf15eb2201c84187c58d 100644 --- a/src/main/resources/database/postgresql/alter_10_3_0_to_10_3_1.sql +++ b/src/main/resources/database/postgresql/alter_10_3_0_to_10_3_1.sql @@ -1 +1,3 @@ alter table o_gta_task alter column g_taskname type varchar(1024); + +create index idx_mail_meta_id_idx on o_mail (meta_mail_id); diff --git a/src/main/resources/database/postgresql/setupDatabase.sql b/src/main/resources/database/postgresql/setupDatabase.sql index 3fcd6cdba400428dd0e0851d4d270650f4e8ae76..df812acdbecca1d8393fe0ed4940c69bae440f31 100644 --- a/src/main/resources/database/postgresql/setupDatabase.sql +++ b/src/main/resources/database/postgresql/setupDatabase.sql @@ -2013,6 +2013,7 @@ create index idx_mail_from_idx on o_mail (fk_from_id); alter table o_mail_recipient add constraint FKF86663165A4FA5DG foreign key (fk_recipient_id) references o_bs_identity (id); create index idx_mailrec_rcp_idx on o_mail_recipient (fk_recipient_id); +create index idx_mail_meta_id_idx on o_mail (meta_mail_id); alter table o_mail_to_recipient add constraint FKF86663165A4FA5DE foreign key (fk_mail_id) references o_mail (mail_id); create index idx_mailtorec_mail_idx on o_mail_to_recipient (fk_mail_id);