From 63bff7c4f84afa9bc7f82c7ecda0f65abf29c839 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pau=20Ferrer=20Oca=C3=B1a?= Date: Fri, 13 Dec 2019 10:29:10 +0100 Subject: [PATCH] MOBILE-3213 forum: Fix discussion links when nested view is on --- .../mod/forum/pages/discussion/discussion.ts | 18 +++++++++++------- .../forum/providers/discussion-link-handler.ts | 2 +- src/addon/mod/forum/providers/forum.ts | 9 ++------- 3 files changed, 14 insertions(+), 15 deletions(-) diff --git a/src/addon/mod/forum/pages/discussion/discussion.ts b/src/addon/mod/forum/pages/discussion/discussion.ts index cc4cd42f6..e49b8684d 100644 --- a/src/addon/mod/forum/pages/discussion/discussion.ts +++ b/src/addon/mod/forum/pages/discussion/discussion.ts @@ -326,10 +326,17 @@ export class AddonModForumDiscussionPage implements OnDestroy { }).then(() => { let posts = offlineReplies.concat(onlinePosts); + const startingPost = this.forumProvider.extractStartingPost(posts); + if (startingPost) { + // Update discussion data from first post. + this.discussion = Object.assign(this.discussion || {}, startingPost); + } + // If sort type is nested, normal sorting is disabled and nested posts will be displayed. if (this.sort == 'nested') { // Sort first by creation date to make format tree work. this.forumProvider.sortDiscussionPosts(posts, 'ASC'); + posts = this.utils.formatTree(posts, 'parent', 'id', this.discussion.id); } else { // Set default reply subject. @@ -364,7 +371,7 @@ export class AddonModForumDiscussionPage implements OnDestroy { } })); - // Fetch the discussion if not passed as parameter. + // The discussion object was not passed as parameter and there is no starting post. Should not happen. if (!this.discussion) { promises.push(this.loadDiscussion(this.forumId, this.discussionId)); } @@ -373,12 +380,9 @@ export class AddonModForumDiscussionPage implements OnDestroy { }).catch(() => { // Ignore errors. }).then(() => { - const startingPost = this.forumProvider.extractStartingPost(posts); - if (startingPost) { - // Update discussion data from first post. - this.discussion = Object.assign(this.discussion || {}, startingPost); - } else if (!this.discussion) { - // The discussion object was not passed as parameter and there is no starting post. + + if (!this.discussion) { + // The discussion object was not passed as parameter and there is no starting post. Should not happen. return Promise.reject('Invalid forum discussion.'); } diff --git a/src/addon/mod/forum/providers/discussion-link-handler.ts b/src/addon/mod/forum/providers/discussion-link-handler.ts index e884b6545..546e477f0 100644 --- a/src/addon/mod/forum/providers/discussion-link-handler.ts +++ b/src/addon/mod/forum/providers/discussion-link-handler.ts @@ -51,7 +51,7 @@ export class AddonModForumDiscussionLinkHandler extends CoreContentLinksHandlerB return [{ action: (siteId, navCtrl?): void => { const pageParams: any = { - courseId: courseId || parseInt(params.courseid, 10) || parseInt(params.cid, 10), + courseId: courseId || parseInt(params.courseid, 10) || parseInt(params.cid, 10) || undefined, discussionId: parseInt(params.d, 10), cmId: data.cmid && parseInt(data.cmid, 10), forumId: data.instance && parseInt(data.instance, 10) diff --git a/src/addon/mod/forum/providers/forum.ts b/src/addon/mod/forum/providers/forum.ts index a852c2aec..96fd64ce1 100644 --- a/src/addon/mod/forum/providers/forum.ts +++ b/src/addon/mod/forum/providers/forum.ts @@ -278,14 +278,9 @@ export class AddonModForumProvider { * @return Starting post or undefined if not found. */ extractStartingPost(posts: any[]): any { - // Check the last post first, since they'll usually be ordered by create time. - for (let i = posts.length - 1; i >= 0; i--) { - if (posts[i].parent == 0) { - return posts.splice(i, 1).pop(); // Remove it from the array. - } - } + const index = posts.findIndex((post) => post.parent == 0); - return undefined; + return index >= 0 ? posts.splice(index, 1).pop() : undefined; } /**