diff --git a/js/src/common/utils/patchMithril.ts b/js/src/common/utils/patchMithril.ts index 491939cf1..c174421be 100644 --- a/js/src/common/utils/patchMithril.ts +++ b/js/src/common/utils/patchMithril.ts @@ -2,7 +2,7 @@ import prop from 'mithril/stream'; export default () => { m.withAttr = (key: string, cb: Function) => function () { - cb(this.getAttribute(key)); + cb(this.getAttribute(key) || this[key]); }; m.prop = prop; diff --git a/js/src/forum/Forum.ts b/js/src/forum/Forum.ts index babbeb979..e0939e748 100644 --- a/js/src/forum/Forum.ts +++ b/js/src/forum/Forum.ts @@ -16,6 +16,8 @@ export default class Forum extends Application { 'user.posts': { path: '/u/:username', component: PostsUserPage }, 'user.discussions': { path: '/u/:username', component: PostsUserPage }, 'settings': { path: '/u/:username', component: PostsUserPage }, + + 'discussion': { path: '/d/:id', IndexPage }, }; /** diff --git a/js/src/forum/components/DiscussionsSearchSource.tsx b/js/src/forum/components/DiscussionsSearchSource.tsx index 6c9368307..3ca478006 100644 --- a/js/src/forum/components/DiscussionsSearchSource.tsx +++ b/js/src/forum/components/DiscussionsSearchSource.tsx @@ -43,10 +43,10 @@ export default class DiscussionsSearchSource extends SearchSource { return (
  • - +
    {highlight(discussion.title(), query)}
    {mostRelevantPost ?
    {highlight(mostRelevantPost.contentPlain(), query, 100)}
    : ''} -
    +
  • ); }) diff --git a/js/src/forum/components/NotificationList.tsx b/js/src/forum/components/NotificationList.tsx index 6c1bbbc80..ae7dcec5f 100644 --- a/js/src/forum/components/NotificationList.tsx +++ b/js/src/forum/components/NotificationList.tsx @@ -76,12 +76,11 @@ export default class NotificationList extends Component {
    {group.discussion ? ( - + {badges && badges.length ?
      {listItems(badges)}
    : ''} {group.discussion.title()} -
    + ) : (
    {app.forum.attribute('title')} diff --git a/js/src/forum/components/NotificationsDropdown.tsx b/js/src/forum/components/NotificationsDropdown.tsx index 0491d3b18..c4e515ec1 100644 --- a/js/src/forum/components/NotificationsDropdown.tsx +++ b/js/src/forum/components/NotificationsDropdown.tsx @@ -54,7 +54,7 @@ export default class NotificationsDropdown extends Dropdown { } goToRoute() { - m.route(app.route('notifications')); + m.route.set(app.route('notifications')); } getUnreadCount() { diff --git a/js/src/forum/components/PostsUserPage.tsx b/js/src/forum/components/PostsUserPage.tsx index d94c2e9bf..ba48120ec 100644 --- a/js/src/forum/components/PostsUserPage.tsx +++ b/js/src/forum/components/PostsUserPage.tsx @@ -33,7 +33,13 @@ export default class PostsUserPage extends UserPage { oninit(vnode) { super.oninit(vnode); - this.loadUser(m.route.param('username')); + this.loadUser(vnode.attrs.username); + } + + onupdate(vnode) { + super.onupdate(vnode); + + this.loadUser(vnode.attrs.username); } content() { @@ -69,7 +75,7 @@ export default class PostsUserPage extends UserPage { {this.posts.map(post => (
  • - {app.translator.trans('core.forum.user.in_discussion_text', {discussion: {post.discussion().title()}})} + {app.translator.trans('core.forum.user.in_discussion_text', {discussion: {post.discussion().title()}})}
    {CommentPost.component({post})}
  • diff --git a/js/src/forum/components/Search.tsx b/js/src/forum/components/Search.tsx index 456b3edf4..0f702f947 100644 --- a/js/src/forum/components/Search.tsx +++ b/js/src/forum/components/Search.tsx @@ -185,7 +185,7 @@ export default class Search extends Component { this.loadingSources = 0; if (this.value()) { - m.route(this.getItem(this.index).find('a').attr('href')); + m.route.set(this.getItem(this.index).find('a').attr('href')); } else { this.clear(); } diff --git a/js/src/forum/components/UserCard.tsx b/js/src/forum/components/UserCard.tsx index 64556bbeb..1648471b7 100644 --- a/js/src/forum/components/UserCard.tsx +++ b/js/src/forum/components/UserCard.tsx @@ -48,10 +48,10 @@ export default class UserCard extends Component { {this.props.editable ? [AvatarEditor.component({user, className: 'UserCard-avatar'}), username(user)] : ( - +
    {avatar(user)}
    {username(user)} -
    + )} diff --git a/js/src/forum/components/UserPage.tsx b/js/src/forum/components/UserPage.tsx index 4de893a81..854d0827f 100644 --- a/js/src/forum/components/UserPage.tsx +++ b/js/src/forum/components/UserPage.tsx @@ -22,6 +22,11 @@ export default abstract class UserPage extends Page { user: User; bodyClass: string = 'App--user'; + /** + * The username of the currently loaded user + */ + username: string; + view() { return (
    @@ -54,7 +59,6 @@ export default abstract class UserPage extends Page { */ abstract content(); - /** * Initialize the component with a user, and trigger the loading of their * activity feed. @@ -74,6 +78,10 @@ export default abstract class UserPage extends Page { loadUser(username: string) { const lowercaseUsername = username.toLowerCase(); + if (lowercaseUsername == this.username) return; + + this.username = lowercaseUsername; + app.store.all('users').some(user => { if (user.username().toLowerCase() === lowercaseUsername && user.joinTime()) { this.show(user); diff --git a/js/src/forum/components/UsersSearchSource.tsx b/js/src/forum/components/UsersSearchSource.tsx index 4ac0c5e18..c02e6d66e 100644 --- a/js/src/forum/components/UsersSearchSource.tsx +++ b/js/src/forum/components/UsersSearchSource.tsx @@ -37,14 +37,20 @@ export default class UsersSearchSource extends SearchSource {
  • {app.translator.trans('core.forum.search.users_heading')}
  • , results.map(user => { const name = username(user); + + if (!name.children) { + name.children = [name.text]; + delete name.text; + } + name.children[0] = highlight(name.children[0], query); return (
  • - + {avatar(user)} {name} - +
  • ); })