Combine route/query params in route construction

One params object is passed, and then route params are extracted into
the route and the rest are appended as query params.
This commit is contained in:
Toby Zerner 2015-05-02 08:21:40 +09:30
parent 5d4d031f59
commit bdf71abf23
10 changed files with 20 additions and 17 deletions

View File

@ -62,7 +62,7 @@ export default class ComposerDiscussion extends ComposerBody {
app.store.createRecord('discussions').save(data).then(discussion => {
app.composer.hide();
app.cache.discussionList.discussions().unshift(discussion);
m.route(app.route('discussion', discussion));
m.route(app.route('discussion', { id: discussion.id(), slug: discussion.slug() }));
}, response => {
this.loading(false);
m.redraw();

View File

@ -115,7 +115,7 @@ export default class DiscussionList extends Component {
var controls = this.controlItems(discussion).toArray();
var discussionRoute = app.route('discussion', discussion);
var discussionRoute = app.route('discussion', { id: discussion.id(), slug: discussion.slug() });
var active = m.route().substr(0, discussionRoute.length) === discussionRoute;
return m('li.discussion-summary'+(isUnread ? '.unread' : '')+(active ? '.active' : ''), {key: discussion.id()}, [
@ -126,7 +126,7 @@ export default class DiscussionList extends Component {
menuClass: 'pull-right'
}) : '',
m('a.author', {
href: app.route('user', startUser),
href: app.route('user', { username: startUser.username() }),
config: function(element, isInitialized, context) {
$(element).tooltip({ placement: 'right' })
m.route.call(this, element)

View File

@ -103,7 +103,7 @@ export default class DiscussionPage extends Component {
// stream to jump to the new 'near' param.
var discussion = this.discussion();
if (discussion) {
var discussionRoute = app.route('discussion', discussion);
var discussionRoute = app.route('discussion', { id: discussion.id(), slug: discussion.slug() });
if (m.route().substr(0, discussionRoute.length) === discussionRoute) {
e.preventDefault();
if (m.route.param('near') != this.currentNear) {

View File

@ -143,7 +143,7 @@ export default class IndexPage extends Component {
items.add('allDiscussions',
NavItem.component({
href: app.route('index', {}, params),
href: app.route('index', params),
label: 'All Discussions',
icon: 'comments-o'
})

View File

@ -33,7 +33,7 @@ export default class PostDiscussionRenamed extends Component {
}) : '',
icon('pencil post-icon'),
m('div.post-activity-info', [
m('a.post-user', {href: app.route('user', post.user()), config: m.route}, username(post.user())),
m('a.post-user', {href: app.route('user', { username: post.user().username() }), config: m.route}, username(post.user())),
' changed the title from ', m('strong.old-title', oldTitle), ' to ', m('strong.new-title', newTitle), '.'
]),
m('div.post-activity-time', humanTime(post.time()))

View File

@ -21,7 +21,7 @@ export default class PostHeaderUser extends Component {
return m('div.post-user', {config: this.onload.bind(this)}, [
m('h3',
user ? [
m('a', {href: app.route('user', user), config: m.route}, [
m('a', {href: app.route('user', {username: user.username()}), config: m.route}, [
avatar(user),
username(user)
]),

View File

@ -27,7 +27,7 @@ export default class UserCard extends Component {
m('div.user-profile', [
m('h2.user-identity', this.props.editable
? [AvatarEditor.component({user, className: 'user-avatar'}), username(user)]
: m('a', {href: app.route('user', user), config: m.route}, [
: m('a', {href: app.route('user', {username: user.username()}), config: m.route}, [
avatar(user, {className: 'user-avatar'}),
username(user)
])

View File

@ -26,7 +26,7 @@ export default class UserDropdown extends Component {
ActionButton.component({
icon: 'user',
label: 'Profile',
href: app.route('user', user),
href: app.route('user', {username: user.username()}),
config: m.route
})
);

View File

@ -86,7 +86,7 @@ export default class UserPage extends Component {
items.add('activity',
NavItem.component({
href: app.route('user.activity', user),
href: app.route('user.activity', {username: user.username()}),
label: 'Activity',
icon: 'user'
})
@ -94,7 +94,7 @@ export default class UserPage extends Component {
items.add('discussions',
NavItem.component({
href: app.route('user.discussions', user),
href: app.route('user.discussions', {username: user.username()}),
label: 'Discussions',
icon: 'reorder',
badge: user.discussionsCount()
@ -103,7 +103,7 @@ export default class UserPage extends Component {
items.add('posts',
NavItem.component({
href: app.route('user.posts', user),
href: app.route('user.posts', {username: user.username()}),
label: 'Posts',
icon: 'comment-o',
badge: user.commentsCount()

View File

@ -10,11 +10,14 @@ class App {
this.initializers.toArray().forEach((initializer) => initializer(this));
}
route(name, args, queryParams) {
var queryString = m.route.buildQueryString(queryParams);
return this.routes[name][0].replace(/:([^\/]+)/g, function(m, t) {
return typeof args[t] === 'function' ? args[t]() : args[t];
}) + (queryString ? '?'+queryString : '');
route(name, params) {
var url = this.routes[name][0].replace(/:([^\/]+)/g, function(m, t) {
var value = params[t];
delete params[t];
return value;
});
var queryString = m.route.buildQueryString(params);
return url+(queryString ? '?'+queryString : '');
}
}