From 8af17d2cf7cdba267286fb5b171c4eb54667d8ea Mon Sep 17 00:00:00 2001 From: Noel De Martin Date: Mon, 2 Dec 2019 13:10:53 +0100 Subject: [PATCH] MOBILE-3230 forum: Use nested children in a discussion when calculating parent subjects --- .../mod/forum/pages/discussion/discussion.ts | 31 ++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/src/addon/mod/forum/pages/discussion/discussion.ts b/src/addon/mod/forum/pages/discussion/discussion.ts index 6d47d6db9..798125d78 100644 --- a/src/addon/mod/forum/pages/discussion/discussion.ts +++ b/src/addon/mod/forum/pages/discussion/discussion.ts @@ -33,6 +33,8 @@ import { AddonModForumSyncProvider } from '../../providers/sync'; type SortType = 'flat-newest' | 'flat-oldest' | 'nested'; +type Post = any & { children?: Post[]; }; + /** * Page that displays a forum discussion. */ @@ -391,7 +393,7 @@ export class AddonModForumDiscussionPage implements OnDestroy { this.posts = posts; this.ratingInfo = ratingInfo; - this.postSubjects = this.posts.reduce((postSubjects, post) => { + this.postSubjects = this.getAllPosts().reduce((postSubjects, post) => { postSubjects[post.id] = post.subject; return postSubjects; @@ -651,4 +653,31 @@ export class AddonModForumDiscussionPage implements OnDestroy { ngOnDestroy(): void { this.onlineObserver && this.onlineObserver.unsubscribe(); } + + /** + * Get all the posts contained in the discussion. + * + * @return Array containing all the posts of the discussion. + */ + protected getAllPosts(): Post[] { + return [].concat(...this.posts.map(this.flattenPostHierarchy.bind(this))); + } + + /** + * Flatten a post's hierarchy into an array. + * + * @param parent Parent post. + * @return Array containing all the posts within the hierarchy (including the parent). + */ + protected flattenPostHierarchy(parent: Post): Post[] { + const posts = [parent]; + const children = parent.children || []; + + for (const child of children) { + posts.push(...this.flattenPostHierarchy(child)); + } + + return posts; + } + }