From d9d190b772f73270d585d7fd0f30551b3e51f780 Mon Sep 17 00:00:00 2001 From: Toby Zerner Date: Sun, 3 May 2015 12:08:41 +0930 Subject: [PATCH] Gracefully handle non-existent/deleted users during rendering --- js/forum/src/components/discussion-list.js | 14 +++++++------- js/forum/src/components/post-comment.js | 2 +- js/forum/src/components/post-header-user.js | 4 +++- js/forum/src/components/terminal-post.js | 3 ++- 4 files changed, 13 insertions(+), 10 deletions(-) diff --git a/js/forum/src/components/discussion-list.js b/js/forum/src/components/discussion-list.js index 46f6ccb31..8a82d81fc 100644 --- a/js/forum/src/components/discussion-list.js +++ b/js/forum/src/components/discussion-list.js @@ -99,10 +99,10 @@ export default class DiscussionList extends Component { return m('div', [ m('ul.discussions-list', [ this.discussions().map(discussion => { - var startUser = discussion.startUser() - var isUnread = discussion.isUnread() - var displayUnread = this.countType() !== 'replies' && isUnread - var jumpTo = Math.min(discussion.lastPostNumber(), (discussion.readNumber() || 0) + 1) + var startUser = discussion.startUser(); + var isUnread = discussion.isUnread(); + var displayUnread = this.countType() !== 'replies' && isUnread; + var jumpTo = Math.min(discussion.lastPostNumber(), (discussion.readNumber() || 0) + 1); var controls = discussion.controls(this).toArray(); @@ -116,13 +116,13 @@ export default class DiscussionList extends Component { buttonClass: 'btn btn-default btn-icon btn-sm btn-naked', menuClass: 'pull-right' }) : '', - m('a.author', { - href: app.route('user', { username: startUser.username() }), + m((startUser ? 'a' : 'span')+'.author', { + href: startUser ? app.route('user', { username: startUser.username() }) : undefined, config: function(element, isInitialized, context) { $(element).tooltip({ placement: 'right' }) m.route.call(this, element) }, - title: 'Started by '+startUser.username()+' '+humanTime(discussion.startTime()) + title: 'Started by '+(startUser ? startUser.username() : '[deleted]')+' '+humanTime(discussion.startTime()) }, [ avatar(startUser, {title: ''}) ]), diff --git a/js/forum/src/components/post-comment.js b/js/forum/src/components/post-comment.js index 49f58f9d5..5fc69c665 100644 --- a/js/forum/src/components/post-comment.js +++ b/js/forum/src/components/post-comment.js @@ -24,7 +24,7 @@ export default class PostComment extends Component { this.subtree = new SubtreeRetainer( () => this.props.post.freshness, - () => this.props.post.user().freshness, + () => this.props.post.user() && this.props.post.user().freshness, this.postHeaderUser.showCard ); } diff --git a/js/forum/src/components/post-header-user.js b/js/forum/src/components/post-header-user.js index 4ec2dfa47..86e7191d8 100644 --- a/js/forum/src/components/post-header-user.js +++ b/js/forum/src/components/post-header-user.js @@ -31,7 +31,9 @@ export default class PostHeaderUser extends Component { username() ] ), - this.showCard() ? UserCard.component({user, className: 'user-card-popover fade', controlsButtonClass: 'btn btn-default btn-icon btn-sm btn-naked'}) : '' + user && this.showCard() + ? UserCard.component({user, className: 'user-card-popover fade', controlsButtonClass: 'btn btn-default btn-icon btn-sm btn-naked'}) + : '' ]); } diff --git a/js/forum/src/components/terminal-post.js b/js/forum/src/components/terminal-post.js index 494f75c40..da9fa00de 100644 --- a/js/forum/src/components/terminal-post.js +++ b/js/forum/src/components/terminal-post.js @@ -1,5 +1,6 @@ import Component from 'flarum/component'; import humanTime from 'flarum/utils/human-time'; +import username from 'flarum/helpers/username'; /** Displays information about a the first or last post in a discussion. @@ -16,7 +17,7 @@ export default class TerminalPost extends Component { var lastPost = this.props.lastPost && discussion.repliesCount(); return m('span', [ - m('span.username', discussion[lastPost ? 'lastUser' : 'startUser']().username()), + username(discussion[lastPost ? 'lastUser' : 'startUser']()), lastPost ? ' replied ' : ' started ', m('time', humanTime(discussion[lastPost ? 'lastTime' : 'startTime']())) ])