diff --git a/app/assets/javascripts/discourse/components/url.js b/app/assets/javascripts/discourse/components/url.js index 2cf9f41d5f7..b4062a37627 100644 --- a/app/assets/javascripts/discourse/components/url.js +++ b/app/assets/javascripts/discourse/components/url.js @@ -13,18 +13,6 @@ Discourse.URL = Em.Object.createWithMixins({ // Used for matching a /more URL MORE_REGEXP: /\/more$/, - /** - @private - - Get a handle on the application's router. Note that currently it uses `__container__` which is not - advised but there is no other way to access the router. - - @method router - **/ - router: function() { - return Discourse.__container__.lookup('router:main'); - }.property(), - /** Browser aware replaceState. Will only be invoked if the browser supports it. @@ -70,11 +58,65 @@ Discourse.URL = Em.Object.createWithMixins({ path = path.replace(rootURL, ''); } - /* - If the URL is in the topic form, /t/something/:topic_id/:post_number - then we want to apply some special logic. If the post_number changes within the - same topic, use replaceState and instruct our controller to load more posts. - */ + // TODO: Extract into rules we can inject into the URL handler + if (this.navigatedToHome(oldPath, path)) { return; } + if (this.navigatedToListMore(oldPath, path)) { return; } + if (this.navigatedToHome(oldPath, path)) { return; } + + // Be wary of looking up the router. In this case, we have links in our + // HTML, say form compiled markdown posts, that need to be routed. + var router = this.get('router'); + router.router.updateURL(path); + return router.handleURL(path); + }, + + /** + Replaces the query parameters in the URL. Use no parameters to clear them. + + @method replaceQueryParams + **/ + queryParams: Em.computed.alias('router.location.queryParams'), + + /** + Redirect to a URL. + This has been extracted so it can be tested. + + @method redirectTo + **/ + redirectTo: function(url) { + window.location = Discourse.getURL(url); + }, + + /** + @private + + If we're viewing more topics, scroll to where we were previously. + + @method navigatedToListMore + @param {String} oldPath the previous path we were on + @param {String} path the path we're navigating to + **/ + navigatedToListMore: function(oldPath, path) { + // If we transition from a /more path, scroll to the top + if (this.MORE_REGEXP.exec(oldPath) && (oldPath.indexOf(path) === 0)) { + window.scrollTo(0, 0); + } + return false; + }, + + /** + @private + + If the URL is in the topic form, /t/something/:topic_id/:post_number + then we want to apply some special logic. If the post_number changes within the + same topic, use replaceState and instruct our controller to load more posts. + + @method navigatedToPost + @param {String} oldPath the previous path we were on + @param {String} path the path we're navigating to + **/ + navigatedToPost: function(oldPath, path) { + var newMatches = this.TOPIC_REGEXP.exec(path), newTopicId = newMatches ? newMatches[2] : null; @@ -99,28 +141,33 @@ Discourse.URL = Em.Object.createWithMixins({ }); // Abort routing, we have replaced our state. - return; + return true; } } - // If we transition from a /more path, scroll to the top - if (this.MORE_REGEXP.exec(oldPath) && (oldPath.indexOf(path) === 0)) { - window.scrollTo(0, 0); - } - - // Be wary of looking up the router. In this case, we have links in our - // HTML, say form compiled markdown posts, that need to be routed. - var router = this.get('router'); - router.router.updateURL(path); - return router.handleURL(path); + return false; }, /** - Replaces the query parameters in the URL. Use no parameters to clear them. + @private - @method replaceQueryParams + Handle the custom case of routing to the root path from itself. + + @param {String} oldPath the previous path we were on + @param {String} path the path we're navigating to **/ - queryParams: Em.computed.alias('router.location.queryParams'), + navigatedToHome: function(oldPath, path) { + + var defaultFilter = "/" + Discourse.ListController.filters[0]; + + if (path === "/" && (oldPath === "/" || oldPath === defaultFilter)) { + // Refresh our list + this.controllerFor('list').refresh(); + return true; + } + + return false; + }, /** @private @@ -137,13 +184,27 @@ Discourse.URL = Em.Object.createWithMixins({ /** @private - Redirect to a URL. - This has been extracted so it can be tested. + Get a handle on the application's router. Note that currently it uses `__container__` which is not + advised but there is no other way to access the router. - @method redirectTo + @property router **/ - redirectTo: function(url) { - window.location = Discourse.getURL(url); + router: function() { + return Discourse.__container__.lookup('router:main'); + }.property(), + + /** + @private + + Get a controller. Note that currently it uses `__container__` which is not + advised but there is no other way to access the router. + + @method controllerFor + @param {String} name the name of the controller + **/ + controllerFor: function(name) { + return Discourse.__container__.lookup('controller:' + name); } + }); diff --git a/app/assets/javascripts/discourse/controllers/list_controller.js b/app/assets/javascripts/discourse/controllers/list_controller.js index 73efc4a56e3..26d02146e83 100644 --- a/app/assets/javascripts/discourse/controllers/list_controller.js +++ b/app/assets/javascripts/discourse/controllers/list_controller.js @@ -24,6 +24,19 @@ Discourse.ListController = Discourse.Controller.extend({ }); }.property(), + /** + Refresh our current topic list + + @method refresh + **/ + refresh: function() { + var listTopicsController = this.get('controllers.listTopics'); + listTopicsController.set('model.loaded', false); + this.load(this.get('filterMode')).then(function (topicList) { + listTopicsController.set('model', topicList); + }); + }, + /** Load a list based on a filter diff --git a/app/assets/javascripts/discourse/routes/filtered_list_route.js b/app/assets/javascripts/discourse/routes/filtered_list_route.js index f1cdac355ea..402546d2fea 100644 --- a/app/assets/javascripts/discourse/routes/filtered_list_route.js +++ b/app/assets/javascripts/discourse/routes/filtered_list_route.js @@ -31,7 +31,7 @@ Discourse.FilteredListRoute = Discourse.Route.extend({ var listTopicsController = this.controllerFor('listTopics'); listController.set('filterMode', this.filter); - var listContent = listTopicsController.get('content'); + var listContent = listTopicsController.get('model'); if (listContent) { listContent.set('loaded', false); } @@ -39,7 +39,7 @@ Discourse.FilteredListRoute = Discourse.Route.extend({ listController.load(this.filter).then(function(topicList) { listController.set('category', null); listController.set('canCreateTopic', topicList.get('can_create_topic')); - listTopicsController.set('content', topicList); + listTopicsController.set('model', topicList); }); } }); diff --git a/lib/tasks/integration.rake b/lib/tasks/integration.rake index 175c2d97b03..5400eaa22d9 100644 --- a/lib/tasks/integration.rake +++ b/lib/tasks/integration.rake @@ -31,7 +31,6 @@ task 'integration:create_fixtures' => :environment do File.write(filename, content) end - end diff --git a/test/javascripts/test_helper.js b/test/javascripts/test_helper.js index 98ca5f11c36..724e7a39edb 100644 --- a/test/javascripts/test_helper.js +++ b/test/javascripts/test_helper.js @@ -70,6 +70,7 @@ d.write('