diff --git a/src/addon/mod/forum/pages/discussion/discussion.ts b/src/addon/mod/forum/pages/discussion/discussion.ts index adf2ebbe2..7ef3aa4de 100644 --- a/src/addon/mod/forum/pages/discussion/discussion.ts +++ b/src/addon/mod/forum/pages/discussion/discussion.ts @@ -85,6 +85,7 @@ export class AddonModForumDiscussionPage implements OnDestroy { protected forumId: number; protected postId: number; + protected parent: number; protected onlineObserver: any; protected syncObserver: any; protected syncManualObserver: any; @@ -120,6 +121,7 @@ export class AddonModForumDiscussionPage implements OnDestroy { this.discussionId = this.discussion ? this.discussion.discussion : navParams.get('discussionId'); this.trackPosts = navParams.get('trackPosts'); this.postId = navParams.get('postId'); + this.parent = navParams.get('parent'); this.isOnline = this.appProvider.isOnline(); this.onlineObserver = network.onchange().subscribe(() => { @@ -136,41 +138,56 @@ export class AddonModForumDiscussionPage implements OnDestroy { /** * View loaded. */ - ionViewDidLoad(): void { - this.sitesProvider.getCurrentSite().getLocalSiteConfig('AddonModForumDiscussionSort').catch(() => { - this.userProvider.getUserPreference('forum_displaymode').catch(() => { - // Ignore errors. - }).then((value) => { - const sortValue = value && parseInt(value, 10); + async ionViewDidLoad(): Promise { + if (this.parent) { + this.sort = 'nested'; // Force nested order. + } else { + this.sort = await this.getUserSort(); + } - switch (sortValue) { + await this.fetchPosts(true, false, true); + + const scrollTo = this.postId || this.parent; + if (scrollTo) { + // Scroll to the post. + setTimeout(() => { + this.domUtils.scrollToElementBySelector(this.content, '#addon-mod_forum-post-' + scrollTo); + }); + } + } + + /** + * Get sort type configured by the current user. + * + * @return Promise resolved with the sort type. + */ + protected async getUserSort(): Promise { + try { + const value = await this.sitesProvider.getCurrentSite().getLocalSiteConfig('AddonModForumDiscussionSort'); + + return value; + } catch (error) { + try { + const value = await this.userProvider.getUserPreference('forum_displaymode'); + + switch (Number(value)) { case 1: - this.sort = 'flat-oldest'; - break; + return 'flat-oldest'; case -1: - this.sort = 'flat-newest'; - break; + return 'flat-newest'; case 3: - this.sort = 'nested'; - break; + return 'nested'; case 2: // Threaded not implemented. default: // Not set, use default sort. // @TODO add fallback to $CFG->forum_displaymode. } - }); - }).then((value) => { - this.sort = value; - }).finally(() => { - this.fetchPosts(true, false, true).then(() => { - if (this.postId) { - // Scroll to the post. - setTimeout(() => { - this.domUtils.scrollToElementBySelector(this.content, '#addon-mod_forum-post-' + this.postId); - }); - } - }); - }); + } catch (error) { + // Ignore errors. + } + } + + return 'flat-oldest'; } /** diff --git a/src/addon/mod/forum/providers/discussion-link-handler.ts b/src/addon/mod/forum/providers/discussion-link-handler.ts index 546e477f0..cb6866dd7 100644 --- a/src/addon/mod/forum/providers/discussion-link-handler.ts +++ b/src/addon/mod/forum/providers/discussion-link-handler.ts @@ -60,6 +60,9 @@ export class AddonModForumDiscussionLinkHandler extends CoreContentLinksHandlerB if (data.postid || params.urlHash) { pageParams.postId = parseInt(data.postid || params.urlHash.replace('p', '')); } + if (params.parent) { + pageParams.parent = parseInt(params.parent); + } this.linkHelper.goInSite(navCtrl, 'AddonModForumDiscussionPage', pageParams, siteId); } diff --git a/src/addon/notifications/pages/list/list.html b/src/addon/notifications/pages/list/list.html index 951c63659..1bb618eaa 100644 --- a/src/addon/notifications/pages/list/list.html +++ b/src/addon/notifications/pages/list/list.html @@ -30,7 +30,7 @@

{{ notification.userfromfullname }}

-

+

diff --git a/src/addon/notifications/pages/list/list.scss b/src/addon/notifications/pages/list/list.scss index 122b8e4dc..15f586332 100644 --- a/src/addon/notifications/pages/list/list.scss +++ b/src/addon/notifications/pages/list/list.scss @@ -1,5 +1,62 @@ -page-addon-notifications-list .core-notification-icon { - width: 34px; - height: 34px; - margin: 10px !important; -} \ No newline at end of file +page-addon-notifications-list { + .core-notification-icon { + width: 34px; + height: 34px; + margin: 10px !important; + } + + .item core-format-text { + + .forumpost { + border: 1px solid $gray-light; + width: 100%; + margin: 0 0 1em 0; + + td { + padding: $content-padding; + } + + .header { + background-color: $gray-lighter; + } + + .picture { + width: auto; + text-align: center; + } + + .subject { + font-weight: 700; + margin-bottom: 1rem; + } + } + + a { + text-decoration: none; + } + + .userpicture { + border-radius: 50%; + } + + .mdl-right { + @include text-align('end'); + a { + display: none; + } + font { + font-size: 0.9em; + } + } + + .commands { + display: none; + } + + hr { + margin-top: 1.5rem; + margin-bottom: 1.5rem; + background-color: $gray-light; + } + } +} diff --git a/src/addon/notifications/pages/list/list.ts b/src/addon/notifications/pages/list/list.ts index 2046b00bc..49fbdb209 100644 --- a/src/addon/notifications/pages/list/list.ts +++ b/src/addon/notifications/pages/list/list.ts @@ -204,8 +204,21 @@ export class AddonNotificationsListPage { * @param notification The notification object. */ protected formatText(notification: AddonNotificationsAnyNotification): void { - const text = notification.mobiletext.replace(/-{4,}/ig, ''); - notification.mobiletext = this.textUtils.replaceNewLines(text, '
'); + notification.displayfullhtml = this.shouldDisplayFullHtml(notification); + + notification.mobiletext = notification.displayfullhtml ? + notification.fullmessagehtml : + this.textUtils.replaceNewLines(notification.mobiletext.replace(/-{4,}/ig, ''), '
'); + } + + /** + * Check whether we should display full HTML of the notification. + * + * @param notification Notification. + * @return Whether to display full HTML. + */ + protected shouldDisplayFullHtml(notification: AddonNotificationsAnyNotification): boolean { + return notification.component == 'mod_forum' && notification.eventtype == 'digests'; } /** diff --git a/src/addon/notifications/providers/notifications.ts b/src/addon/notifications/providers/notifications.ts index 3a2234ada..8a96d1f68 100644 --- a/src/addon/notifications/providers/notifications.ts +++ b/src/addon/notifications/providers/notifications.ts @@ -616,4 +616,5 @@ export type AddonNotificationsNotificationCalculatedData = { courseid?: number; // Calculated in the app. Course the notification belongs to. profileimageurlfrom?: string; // Calculated in the app. Avatar of user that sent the notification. userfromfullname?: string; // Calculated in the app in some cases. User from full name. + displayfullhtml?: boolean; // Whether to display the full HTML of the notification. };