From cceef5b2eb01d8152b559166e5e344f0287cde0d Mon Sep 17 00:00:00 2001 From: srosse <none@none> Date: Fri, 27 Nov 2015 12:33:47 +0100 Subject: [PATCH] OO-1770: more fix for the forum --- .../notifications/NotificationHelper.java | 14 +++----- .../fo/_i18n/LocalStrings_de.properties | 2 ++ .../fo/_i18n/LocalStrings_en.properties | 3 ++ .../formatters/ForumOpenXMLFormatter.java | 8 +++-- .../olat/modules/fo/manager/ForumManager.java | 7 ++-- .../modules/fo/ui/ForumMessageDataModel.java | 8 +++-- .../fo/ui/ForumMessageListController.java | 15 +++++++++ .../modules/fo/ui/IndentCellRenderer.java | 2 +- .../modules/fo/ui/MessageListController.java | 24 +++++++------- .../modules/fo/ui/_content/threadview.html | 33 +++++++++---------- 10 files changed, 69 insertions(+), 47 deletions(-) diff --git a/src/main/java/org/olat/core/commons/services/notifications/NotificationHelper.java b/src/main/java/org/olat/core/commons/services/notifications/NotificationHelper.java index 074135dbf7c..33db9824de9 100644 --- a/src/main/java/org/olat/core/commons/services/notifications/NotificationHelper.java +++ b/src/main/java/org/olat/core/commons/services/notifications/NotificationHelper.java @@ -107,12 +107,9 @@ public class NotificationHelper { * @return */ public static String getFormatedName(Identity ident) { - Translator trans; - User user = null; - String formattedName = null; - + String formattedName; if (ident == null) { - trans = Util.createPackageTranslator(NotificationNewsController.class, I18nManager.getInstance().getLocaleOrDefault(null)); + Translator trans = Util.createPackageTranslator(NotificationNewsController.class, I18nManager.getInstance().getLocaleOrDefault(null)); return trans.translate("user.unknown"); } else { // Optimize: use from cache to not re-calculate user properties over and over again @@ -121,10 +118,10 @@ public class NotificationHelper { return formattedName; } } - trans = Util.createPackageTranslator(NotificationNewsController.class, I18nManager.getInstance().getLocaleOrDefault( - ident.getUser().getPreferences().getLanguage())); - user = ident.getUser(); + Translator trans = Util.createPackageTranslator(NotificationNewsController.class, I18nManager.getInstance().getLocaleOrDefault( + ident.getUser().getPreferences().getLanguage())); + User user = ident.getUser(); if (user == null) { formattedName = trans.translate("user.unknown"); } else { @@ -144,7 +141,6 @@ public class NotificationHelper { } // put formatted name in cache, times out after 5 mins userPropertiesCache.put(ident.getKey(), formattedName); - return formattedName; } diff --git a/src/main/java/org/olat/modules/fo/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/modules/fo/_i18n/LocalStrings_de.properties index fc699e16b5f..a79ebeaee7a 100644 --- a/src/main/java/org/olat/modules/fo/_i18n/LocalStrings_de.properties +++ b/src/main/java/org/olat/modules/fo/_i18n/LocalStrings_de.properties @@ -9,6 +9,7 @@ anonymous.group.default=Default for group forum anonymous.posting=Erlaubt anonymous posting using a pseudonym anonymous.poster=Gastbeitrag guest=Gast +guest.suffix=(Gast) archive.forum=Forum archivieren archive.forum.dialog=Wollen Sie dieses Forum wirklich in Ihrem pers\u00F6nlichen Ordner im Unterordner "private/archive" archivieren? archive.forum.successfully=Das Forum wurde in Ihrem pers\u00F6nlichen Ordner im Unterordner "private/archive" archiviert. @@ -74,6 +75,7 @@ msg.title=Titel msg.title.re=Re\: msg.update=Editieren msg.upload=Datei anh\u00E4ngen +natural.sort=Verschaltet no=Nein notifications.entry=Nachricht "{0}" von {1} erstellt notifications.entry.modified=Nachricht "{0}" von {1} ver\u00E4ndert diff --git a/src/main/java/org/olat/modules/fo/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/modules/fo/_i18n/LocalStrings_en.properties index 106b346c3db..0f5f5d943e2 100644 --- a/src/main/java/org/olat/modules/fo/_i18n/LocalStrings_en.properties +++ b/src/main/java/org/olat/modules/fo/_i18n/LocalStrings_en.properties @@ -29,6 +29,8 @@ filter.header.allUsers=All contributions filter.header.title=Search for persons filter.results.title=Contributions by forum.emtpy=No posts published in this forum. +guest=Guest +guest.suffix=(Guest) header.cannoteditmessage=Post cannot be edited header.cannotsavemessage=Post cannot be saved header.editmsg=Edit post @@ -76,6 +78,7 @@ msg.title=Title msg.title.re=Re\: msg.update=Edit msg.upload=Attach file +natural.sort=Thread no=No notifications.entry=Message "{0}" created by {1} notifications.entry.modified=Message "{0}" modified by {1} diff --git a/src/main/java/org/olat/modules/fo/archiver/formatters/ForumOpenXMLFormatter.java b/src/main/java/org/olat/modules/fo/archiver/formatters/ForumOpenXMLFormatter.java index c756944a8aa..820f60cdf6c 100644 --- a/src/main/java/org/olat/modules/fo/archiver/formatters/ForumOpenXMLFormatter.java +++ b/src/main/java/org/olat/modules/fo/archiver/formatters/ForumOpenXMLFormatter.java @@ -100,8 +100,12 @@ public class ForumOpenXMLFormatter extends ForumFormatter { StringBuilder creatorAndDate = new StringBuilder(); if(StringHelper.containsNonWhitespace(m.getPseudonym())) { creatorAndDate.append(m.getPseudonym()) - .append(" ") - .append(translator.translate("pseudonym.suffix")); + .append(" "); + if(m.isGuest()) { + creatorAndDate.append(translator.translate("guest.suffix")); + } else { + creatorAndDate.append(translator.translate("pseudonym.suffix")); + } } else if(m.isGuest()) { creatorAndDate.append(translator.translate("guest")); } else { diff --git a/src/main/java/org/olat/modules/fo/manager/ForumManager.java b/src/main/java/org/olat/modules/fo/manager/ForumManager.java index 524b4333be2..abb90c16f9e 100644 --- a/src/main/java/org/olat/modules/fo/manager/ForumManager.java +++ b/src/main/java/org/olat/modules/fo/manager/ForumManager.java @@ -199,7 +199,7 @@ public class ForumManager { private List<Message> getMessagesByForumID(Long forumKey, int firstResult, int maxResults, boolean onlyThreads, Message.OrderBy orderBy, boolean asc) { StringBuilder query = new StringBuilder(); query.append("select msg from fomessage as msg") - .append(" inner join fetch msg.creator as creator") + .append(" left join fetch msg.creator as creator") .append(" where msg.forum.key=:forumKey "); if(onlyThreads) { query.append(" and msg.parent is null"); @@ -279,8 +279,9 @@ public class ForumManager { .append(" where (posts.threadtop.key=msg.key or posts.key=msg.key) and read.message.key=posts.key and read.identity.key=:identityKey") .append(" ) as numOfReadMessages"); if(identity != null) { - sb.append(" ,(select count(mark.key) from ").append(MarkImpl.class.getName()).append(" as mark ") - .append(" where mark.creator.key=:identityKey and mark.resId=:forumKey and msg.key = cast(mark.resSubPath as long) and mark.resName='Forum'") + sb.append(" ,(select count(mark.key) from ").append(MarkImpl.class.getName()).append(" as mark, fomessage as mposts ") + .append(" where mark.creator.key=:identityKey and mark.resId=:forumKey and (mposts.threadtop.key=msg.key or mposts.key=msg.key)") + .append(" and mposts.key=cast(mark.resSubPath as long) and mark.resName='Forum'") .append(" ) as marks"); } diff --git a/src/main/java/org/olat/modules/fo/ui/ForumMessageDataModel.java b/src/main/java/org/olat/modules/fo/ui/ForumMessageDataModel.java index b0d34b3d8e7..e8dac18b494 100644 --- a/src/main/java/org/olat/modules/fo/ui/ForumMessageDataModel.java +++ b/src/main/java/org/olat/modules/fo/ui/ForumMessageDataModel.java @@ -50,8 +50,12 @@ public class ForumMessageDataModel extends DefaultFlexiTableDataModel<MessageLig @Override public void sort(SortKey orderBy) { if(orderBy != null) { - List<MessageLightView> views = new ForumMessageDataModelSort(orderBy, this, null).sort(); - super.setObjects(views); + if("natural".equals(orderBy.getKey())) { + System.out.println(); + } else { + List<MessageLightView> views = new ForumMessageDataModelSort(orderBy, this, null).sort(); + super.setObjects(views); + } } } diff --git a/src/main/java/org/olat/modules/fo/ui/ForumMessageListController.java b/src/main/java/org/olat/modules/fo/ui/ForumMessageListController.java index 83bfd0c0ccc..245e7213c13 100644 --- a/src/main/java/org/olat/modules/fo/ui/ForumMessageListController.java +++ b/src/main/java/org/olat/modules/fo/ui/ForumMessageListController.java @@ -33,6 +33,8 @@ import org.olat.core.gui.UserRequest; 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.FlexiTableElement; +import org.olat.core.gui.components.form.flexible.elements.FlexiTableSort; +import org.olat.core.gui.components.form.flexible.elements.FlexiTableSortOptions; 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.elements.table.DefaultFlexiColumnModel; @@ -165,13 +167,18 @@ public class ForumMessageListController extends FormBasicController implements F @Override protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) { + List<FlexiTableSort> sorts = new ArrayList<>(); + sorts.add(new FlexiTableSort(translate("natural.sort"), "natural")); + FlexiTableColumnModel columnsModel = FlexiTableDataModelFactory.createFlexiTableColumnModel(); if(withType) { columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(ForumMessageCols.type.i18nKey(), ForumMessageCols.type.ordinal(), true, ForumMessageCols.type.name(), new StatusTypeCellRenderer())); + sorts.add(new FlexiTableSort(translate(ForumMessageCols.type.i18nKey()), ForumMessageCols.type.name())); } columnsModel.addFlexiColumnModel(new StaticFlexiColumnModel(ForumMessageCols.thread.i18nKey(), ForumMessageCols.thread.ordinal(), "select", true, ForumMessageCols.thread.name(), new StaticFlexiCellRenderer("select", new IndentCellRenderer()))); + sorts.add(new FlexiTableSort(translate(ForumMessageCols.thread.i18nKey()), ForumMessageCols.thread.name())); int colPos = USER_PROPS_OFFSET; for (UserPropertyHandler userPropertyHandler : userPropertyHandlers) { @@ -187,16 +194,24 @@ public class ForumMessageListController extends FormBasicController implements F } else { col = new DefaultFlexiColumnModel(visible, userPropertyHandler.i18nColumnDescriptorLabelKey(), colPos, true, propName); } + + sorts.add(new FlexiTableSort(translate(userPropertyHandler.i18nColumnDescriptorLabelKey()), propName)); columnsModel.addFlexiColumnModel(col); colPos++; } columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(ForumMessageCols.lastModified.i18nKey(), ForumMessageCols.lastModified.ordinal(), true, ForumMessageCols.lastModified.name())); + sorts.add(new FlexiTableSort(translate(ForumMessageCols.lastModified.i18nKey()), ForumMessageCols.lastModified.name())); dataModel = new ForumMessageDataModel(columnsModel, getTranslator()); tableEl = uifactory.addTableElement(getWindowControl(), "messages", dataModel, getTranslator(), formLayout); tableEl.setRowCssDelegate(this); + + FlexiTableSortOptions sortOptions = new FlexiTableSortOptions(); + sortOptions.setFromColumnModel(false); + sortOptions.setSorts(sorts); + tableEl.setSortSettings(sortOptions); } @Override diff --git a/src/main/java/org/olat/modules/fo/ui/IndentCellRenderer.java b/src/main/java/org/olat/modules/fo/ui/IndentCellRenderer.java index 4578b8f352c..a4bceb094b9 100644 --- a/src/main/java/org/olat/modules/fo/ui/IndentCellRenderer.java +++ b/src/main/java/org/olat/modules/fo/ui/IndentCellRenderer.java @@ -43,7 +43,7 @@ public class IndentCellRenderer implements FlexiCellRenderer { FlexiTableComponent source, URLBuilder ubu, Translator translator) { SortKey[] keys = source.getFlexiTableElement().getOrderBy(); - if(keys != null && keys.length > 0 && keys[0] != null) { + if(keys != null && keys.length > 0 && keys[0] != null && !"natural".equals(keys[0].getKey())) { if(cellValue instanceof String) { target.append((String)cellValue); } diff --git a/src/main/java/org/olat/modules/fo/ui/MessageListController.java b/src/main/java/org/olat/modules/fo/ui/MessageListController.java index 31d7b4e9e06..79009065ab2 100644 --- a/src/main/java/org/olat/modules/fo/ui/MessageListController.java +++ b/src/main/java/org/olat/modules/fo/ui/MessageListController.java @@ -377,7 +377,7 @@ public class MessageListController extends BasicController implements GenericEve MessageView view = new MessageView(message, userPropertyHandlers, getLocale()); view.setNumOfChildren(0); - addMessageToCurrentMessagesAndVC(ureq, message, view, backupViews.size(), marks, stats, artefactStats, rms); + addMessageToCurrentMessagesAndVC(ureq, message, view, marks, stats, artefactStats, rms); return view; } @@ -432,10 +432,9 @@ public class MessageListController extends BasicController implements GenericEve } } - int msgNum = 0; //append ui things for (MessageLight msg: messages) { - addMessageToCurrentMessagesAndVC(ureq, msg, keyToViews.get(msg.getKey()), msgNum++, marks, stats, artefactStats, rms); + addMessageToCurrentMessagesAndVC(ureq, msg, keyToViews.get(msg.getKey()), marks, stats, artefactStats, rms); } mainVC.contextPut("messages", views); @@ -473,7 +472,7 @@ public class MessageListController extends BasicController implements GenericEve } } - private void addMessageToCurrentMessagesAndVC(UserRequest ureq, MessageLight m, MessageView messageView, int msgCount, + private void addMessageToCurrentMessagesAndVC(UserRequest ureq, MessageLight m, MessageView messageView, Map<String,Mark> marks, Map<String,MarkResourceStat> stats, Map<String,Long> artefactStats, Set<Long> readSet) { @@ -544,44 +543,43 @@ public class MessageListController extends BasicController implements GenericEve // Add link with username that is clickable String creatorFullName = StringHelper.escapeHtml(UserManager.getInstance().getUserDisplayName(creator)); - Link visitingCardLink = LinkFactory.createCustomLink("vc_"+msgCount, "vc_"+msgCount, creatorFullName, Link.LINK_CUSTOM_CSS + Link.NONTRANSLATED, mainVC, this); + Link visitingCardLink = LinkFactory.createCustomLink("vc_".concat(keyString), "vc", creatorFullName, Link.LINK_CUSTOM_CSS + Link.NONTRANSLATED, mainVC, this); visitingCardLink.setUserObject(messageView); - LinkPopupSettings settings = new LinkPopupSettings(800, 600, "_blank"); visitingCardLink.setPopup(settings); } if(!isThreadClosed) { if((numOfChildren == 0 && userIsMsgCreator) || foCallback.mayDeleteMessageAsModerator()) { - Link deleteLink = LinkFactory.createCustomLink("dl_"+msgCount, "dl_"+msgCount, "msg.delete", Link.BUTTON_SMALL, mainVC, this); + Link deleteLink = LinkFactory.createCustomLink("dl_".concat(keyString), "dl", "msg.delete", Link.BUTTON_SMALL, mainVC, this); deleteLink.setIconLeftCSS("o_icon o_icon-fw o_icon_delete_item"); deleteLink.setUserObject(messageView); } if((numOfChildren == 0 && userIsMsgCreator) || foCallback.mayEditMessageAsModerator()) { - Link editLink = LinkFactory.createCustomLink("ed_"+msgCount, "ed_"+msgCount, "msg.update", Link.BUTTON_SMALL, mainVC, this); + Link editLink = LinkFactory.createCustomLink("ed_".concat(keyString), "ed", "msg.update", Link.BUTTON_SMALL, mainVC, this); editLink.setIconLeftCSS("o_icon o_icon-fw o_icon_edit"); editLink.setUserObject(messageView); } if(foCallback.mayReplyMessage()) { - Link quoteLink = LinkFactory.createCustomLink("qt_"+msgCount, "qt_"+msgCount, "msg.quote", Link.BUTTON_SMALL, mainVC, this); + Link quoteLink = LinkFactory.createCustomLink("qt_".concat(keyString), "qt", "msg.quote", Link.BUTTON_SMALL, mainVC, this); quoteLink.setElementCssClass("o_sel_forum_reply_quoted"); quoteLink.setIconLeftCSS("o_icon o_icon-fw o_icon_reply_with_quote"); quoteLink.setUserObject(messageView); - Link replyLink = LinkFactory.createCustomLink("rp_"+msgCount, "rp_"+msgCount, "msg.reply", Link.BUTTON_SMALL, mainVC, this); + Link replyLink = LinkFactory.createCustomLink("rp_".concat(keyString), "rp", "msg.reply", Link.BUTTON_SMALL, mainVC, this); replyLink.setElementCssClass("o_sel_forum_reply"); replyLink.setIconLeftCSS("o_icon o_icon-fw o_icon_reply"); replyLink.setUserObject(messageView); } if(foCallback.mayEditMessageAsModerator() && !threadTop) { - Link splitLink = LinkFactory.createCustomLink("split_"+msgCount, "split_"+msgCount, "msg.split", Link.LINK, mainVC, this); + Link splitLink = LinkFactory.createCustomLink("split_".concat(keyString), "split", "msg.split", Link.LINK, mainVC, this); splitLink.setIconLeftCSS("o_icon o_icon-fw o_icon_split"); splitLink.setUserObject(messageView); - Link moveLink = LinkFactory.createCustomLink("move_"+msgCount, "move_"+msgCount, "msg.move", Link.LINK, mainVC, this); + Link moveLink = LinkFactory.createCustomLink("move_".concat(keyString), "move", "msg.move", Link.LINK, mainVC, this); moveLink.setIconLeftCSS("o_icon o_icon-fw o_icon_move"); moveLink.setUserObject(messageView); } @@ -594,7 +592,7 @@ public class MessageListController extends BasicController implements GenericEve getWindowControl().getBusinessControl().getAsString() + "[Message:" + m.getKey() + "]" : currentMark.getBusinessPath(); Controller markCtrl = markingService.getMarkController(ureq, getWindowControl(), currentMark, stat, forumOres, keyString, businessPath); - mainVC.put("mark_" + msgCount, markCtrl.getInitialComponent()); + mainVC.put("mark_".concat(keyString), markCtrl.getInitialComponent()); } if(userIsMsgCreator && !StringHelper.containsNonWhitespace(m.getPseudonym())) { diff --git a/src/main/java/org/olat/modules/fo/ui/_content/threadview.html b/src/main/java/org/olat/modules/fo/ui/_content/threadview.html index 8a2a270fe74..7c3cf9c8510 100644 --- a/src/main/java/org/olat/modules/fo/ui/_content/threadview.html +++ b/src/main/java/org/olat/modules/fo/ui/_content/threadview.html @@ -65,14 +65,13 @@ #end #foreach ($message in $messages) - #set( $count = $velocityCount - 1) <div #if($threadMode) style="margin-left: ${message.depth}em" #end class="o_forum_message o_block_large_bottom #if($message.newMessage) o_forum_message_new #end #if($message.key == $goToMessageId) o_forum_message_highlight #end" id="o_forum_message_${message.key}"> <div class="o_forum_message_header clearfix"> #if($r.available("eportfolio_${message.key}")) <div class="o_ep_collect">$r.render("eportfolio_${message.key}")</div> #end - #if($r.available("mark_${count}")) - <div class="o_mark">$r.render("mark_${count}")</div> + #if($r.available("mark_${message.key}")) + <div class="o_mark">$r.render("mark_${message.key}")</div> #end #if(!$guestOnly) #if($message.guest || ($message.pseudonym && !${message.pseudonym.isEmpty()})) @@ -93,8 +92,8 @@ $r.escapeHtml($message.pseudonym) #elseif($message.guest) $r.translate("anonymous.poster") - #elseif($r.available("vc_${count}")) - $r.render("vc_${count}") + #elseif($r.available("vc_${message.key}")) + $r.render("vc_${message.key}") #else $r.escapeHtml($message.creatorFirstname) $r.escapeHtml($message.creatorLastname) #end @@ -120,34 +119,34 @@ </div> <div class="o_forum_message_actions o_button_group"> - #if($r.available("open_in_thread_${count}")) - $r.render("open_in_thread_${count}") + #if($r.available("open_in_thread_${message.key}")) + $r.render("open_in_thread_${message.key}") #end - #if ($r.available("dl_${count}") || $r.available("ed_${count}")) + #if ($r.available("dl_${message.key}") || $r.available("ed_${message.key}")) <div class="btn-group"> - #if($r.available("dl_${count}")) - $r.render("dl_${count}") + #if($r.available("dl_${message.key}")) + $r.render("dl_${message.key}") #end - #if ($r.available("ed_${count}")) - $r.render("ed_${count}") + #if ($r.available("ed_${message.key}")) + $r.render("ed_${message.key}") #end </div> #end - #if ($r.available("rp_${count}")) - <div class="btn-group">$r.render("qt_${count}") $r.render("rp_${count}")</div> + #if ($r.available("rp_${message.key}")) + <div class="btn-group">$r.render("qt_${message.key}") $r.render("rp_${message.key}")</div> #end - #if($r.available("split_${count}")) + #if($r.available("split_${message.key}")) <div class="btn-group"> <button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown"> <i class="o_icon o_icon-fw o_icon_actions"></i> <span class="caret"></span> </button> <ul class="dropdown-menu dropdown-menu-right"> - <li>$r.render("split_${count}")</li> - <li>$r.render("move_${count}")</li> + <li>$r.render("split_${message.key}")</li> + <li>$r.render("move_${message.key}")</li> </ul> </div> #end -- GitLab