diff --git a/src/main/java/org/olat/modules/fo/export/FinishCallback.java b/src/main/java/org/olat/modules/fo/export/FinishCallback.java index 09d75f079a32ea09d9ffc74ef302e0fc3b67bf6e..b99b7857e67ce95f1ec2f3bd66c96f1520e8037a 100644 --- a/src/main/java/org/olat/modules/fo/export/FinishCallback.java +++ b/src/main/java/org/olat/modules/fo/export/FinishCallback.java @@ -71,7 +71,9 @@ public class FinishCallback implements StepRunnerCallback { CourseEnvironment courseEnv = course.getCourseEnvironment(); Forum chosenforum = node.loadOrCreateForum(courseEnv); Message msg = (Message)runContext.get(SendMailStepForm.MESSAGE_TO_MOVE); + msg = forumManager.getMessageById(msg.getKey()); Message parentMessage = (Message)runContext.get(SendMailStepForm.PARENT_MESSAGE); + parentMessage = forumManager.getMessageById(parentMessage.getKey()); if (msg.getParentKey() == null && msg.getThreadtop() == null) { msg = forumManager.createOrAppendThreadInAnotherForum(msg, chosenforum, parentMessage); } else { diff --git a/src/main/java/org/olat/modules/fo/export/SendMailStepForm.java b/src/main/java/org/olat/modules/fo/export/SendMailStepForm.java index 97455756d8c8e9082eeaf674b94d7d25fa10a654..5ce278c624b9152d048f3a806b0ce8d9f00cd983 100644 --- a/src/main/java/org/olat/modules/fo/export/SendMailStepForm.java +++ b/src/main/java/org/olat/modules/fo/export/SendMailStepForm.java @@ -57,9 +57,10 @@ public class SendMailStepForm extends StepFormBasicController { protected static final String SENDER = "sender"; protected static final String MAIL_TEMPLATE = "mailTemplate"; protected static final String FORUM = "forum"; - protected static final String START_COURSE = "startCourse"; + public static final String START_COURSE = "startCourse"; protected static final String PARENT_MESSAGE = "parentMessage"; - protected static final String MESSAGE_TO_MOVE = "messageToMove"; + public static final String MESSAGE_TO_MOVE = "messageToMove"; + public static final String START_THREADTOP = "startMessage"; protected static final String ICOURSE = "icourse"; protected static final String COURSE = "course"; protected static final String NEW_THREAD = "newThread"; 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 97dbcb93fc2caa41cae22434707acdb53dc30fcb..2892cd38c1c5feb5af3f0f442e441b8ab5f49b05 100644 --- a/src/main/java/org/olat/modules/fo/manager/ForumManager.java +++ b/src/main/java/org/olat/modules/fo/manager/ForumManager.java @@ -1069,20 +1069,20 @@ public class ForumManager { /** * Move thread to another forum recursively. * - * @param old the OLD parent message - * @param parentMessage the NEW parent message + * @param oldParent the OLD parent message + * @param newParent the NEW parent message * @param topMsg the top message * @return the message */ - private Message moveThreadToAnotherForumRecursively(Message old, Message parentMessage, Message topMsg) { + private Message moveThreadToAnotherForumRecursively(Message oldParent, Message newParent, Message topMsg) { // 1) get direct children of the old top message - List<Message> children = getMessageChildren(old); + List<Message> children = getMessageChildren(oldParent); Message message = null; // 2) iterate all first level children for (Message child : children) { Message oldMessage = getMessageById(child.getKey()); topMsg = getMessageById(topMsg.getKey()); - message = persistMessageInAnotherLocation(oldMessage, topMsg.getForum(), topMsg, parentMessage); + message = persistMessageInAnotherLocation(oldMessage, topMsg.getForum(), topMsg, newParent); // 3) move the message container to a new destination moveMessageContainer(oldMessage.getForum().getKey(), oldMessage.getKey(), message.getForum().getKey(), message.getKey()); @@ -1134,14 +1134,6 @@ public class ForumManager { * @return the message */ public Message moveMessageToAnotherForum(Message msg, Forum forum, Message topMsg) { - // one has to set a new parent for all children of the moved message - // first message of sublist has to get the parent from the moved message - List<Message> children = getMessageChildren(msg); - for (Message child : children) { - child.setParent(msg.getParent()); - dbInstance.getCurrentEntityManager().merge(child); - } - // now move the message to the chosen thread Message targetThread = null; if (topMsg != null) { targetThread = topMsg.getThreadtop(); @@ -1150,12 +1142,16 @@ public class ForumManager { } targetThread = getMessageById(targetThread.getKey()); } - final Message oldMessage = getMessageById(msg.getKey()); - Message message = persistMessageInAnotherLocation(oldMessage, forum, targetThread, topMsg); - - moveMessageContainer(oldMessage.getForum().getKey(), oldMessage.getKey(), message.getForum().getKey(), message.getKey()); - deleteMessageRecursion(oldMessage.getForum().getKey(), oldMessage); - return message; + final Message oldParent = getMessageById(msg.getKey()); + // one has to set a new parent for all children of the moved message + Message newParent = persistMessageInAnotherLocation(oldParent, forum, targetThread, topMsg); + moveMessageContainer(oldParent.getForum().getKey(), oldParent.getKey(), newParent.getForum().getKey(), newParent.getKey()); + targetThread = targetThread == null ? newParent : targetThread; + if (hasChildren(oldParent)) { + moveThreadToAnotherForumRecursively(oldParent, newParent, targetThread); + } + deleteMessageRecursion(oldParent.getForum().getKey(), oldParent); + return newParent; } /** 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 d7c83cfd815c09b3c8da339a6a75aa481bd98f01..4ddd179269ae1e10b68b4db1d4e2699395d7e4bc 100644 --- a/src/main/java/org/olat/modules/fo/ui/MessageListController.java +++ b/src/main/java/org/olat/modules/fo/ui/MessageListController.java @@ -90,6 +90,7 @@ import org.olat.modules.fo.MessageRef; import org.olat.modules.fo.Status; import org.olat.modules.fo.archiver.formatters.ForumDownloadResource; import org.olat.modules.fo.export.FinishCallback; +import org.olat.modules.fo.export.SendMailStepForm; import org.olat.modules.fo.export.Step_1_SelectCourse; import org.olat.modules.fo.manager.ForumManager; import org.olat.modules.fo.portfolio.ForumMediaHandler; @@ -828,6 +829,17 @@ public class MessageListController extends BasicController implements GenericEve protected void event(UserRequest ureq, Controller source, Event event) { if (source == exportCtrl) { if(event == Event.CANCELLED_EVENT || event == Event.DONE_EVENT || event == Event.CHANGED_EVENT) { + if (event == Event.CHANGED_EVENT) { + StepsRunContext runContext = exportCtrl.getRunContext(); + Message originTopMessage = (Message)runContext.get(SendMailStepForm.START_THREADTOP); + originTopMessage = forumManager.loadMessage(originTopMessage.getKey()); + if (originTopMessage != null) { + //refresh origin thread + fireEvent(ureq, new SelectMessageEvent(SelectMessageEvent.SELECT_THREAD, originTopMessage.getKey())); + } else { + fireEvent(ureq, Event.BACK_EVENT); + } + } getWindowControl().pop(); removeAsListenerAndDispose(exportCtrl); exportCtrl = null; @@ -1364,7 +1376,9 @@ public class MessageListController extends BasicController implements GenericEve "o_sel_bulk_assessment_wizard"); StepsRunContext runContext = exportCtrl.getRunContext(); // can be threadtop message - runContext.put("messageToMove", message); + runContext.put(SendMailStepForm.MESSAGE_TO_MOVE, message); + // starting thread + runContext.put(SendMailStepForm.START_THREADTOP, message.getThreadtop() == null ? message : message.getThreadtop()); // get start course PropertyManager propertyManager = PropertyManager.getInstance(); Long forumResourceableId = forum.getResourceableId(); @@ -1375,7 +1389,7 @@ public class MessageListController extends BasicController implements GenericEve OLATResourceable olatResourceable = olatManager.findResourceable(resourcetypeId, resourcetypeName); RepositoryEntry startCourse = repositoryManager.lookupRepositoryEntry(olatResourceable, false); if (startCourse != null) { - runContext.put("startCourse", startCourse); + runContext.put(SendMailStepForm.START_COURSE, startCourse); } } listenTo(exportCtrl);