diff --git a/app/assets/javascripts/discourse/components/create-topic-button.js.es6 b/app/assets/javascripts/discourse/components/create-topic-button.js.es6 new file mode 100644 index 00000000000..a792b83a291 --- /dev/null +++ b/app/assets/javascripts/discourse/components/create-topic-button.js.es6 @@ -0,0 +1 @@ +export default Ember.Component.extend({ tagName: '' }); diff --git a/app/assets/javascripts/discourse/controllers/application.js.es6 b/app/assets/javascripts/discourse/controllers/application.js.es6 index 78402acd259..45286bbec36 100644 --- a/app/assets/javascripts/discourse/controllers/application.js.es6 +++ b/app/assets/javascripts/discourse/controllers/application.js.es6 @@ -14,11 +14,5 @@ export default Ember.Controller.extend({ @computed loginRequired() { return Discourse.SiteSettings.login_required && !Discourse.User.current(); - }, - - actions: { - appRouteAction(name) { - return this.send(name); - } } }); diff --git a/app/assets/javascripts/discourse/controllers/full-page-search.js.es6 b/app/assets/javascripts/discourse/controllers/full-page-search.js.es6 index f3da3585d3a..de70b3701f8 100644 --- a/app/assets/javascripts/discourse/controllers/full-page-search.js.es6 +++ b/app/assets/javascripts/discourse/controllers/full-page-search.js.es6 @@ -5,6 +5,7 @@ import Category from 'discourse/models/category'; import { escapeExpression } from 'discourse/lib/utilities'; import { setTransient } from 'discourse/lib/page-tracker'; import { iconHTML } from 'discourse-common/lib/icon-library'; +import Composer from 'discourse/models/composer'; const SortOrders = [ {name: I18n.t('search.relevance'), id: 0}, @@ -18,6 +19,7 @@ const PAGE_LIMIT = 10; export default Ember.Controller.extend({ application: Ember.inject.controller(), + composer: Ember.inject.controller(), bulkSelectEnabled: null, loading: false, @@ -226,6 +228,21 @@ export default Ember.Controller.extend({ actions: { + createTopic(searchTerm) { + let topicCategory; + if (searchTerm.indexOf("category:") !== -1) { + const match = searchTerm.match(/category:(\S*)/); + if (match && match[1]) { + topicCategory = match[1]; + } + } + this.get('composer').open({ + action: Composer.CREATE_TOPIC, + draftKey: Composer.CREATE_TOPIC, + topicCategory + }); + }, + selectAll() { this.get('selected').addObjects(this.get('model.posts').map(r => r.topic)); // Doing this the proper way is a HUGE pain, diff --git a/app/assets/javascripts/discourse/helpers/route-action.js.es6 b/app/assets/javascripts/discourse/helpers/route-action.js.es6 new file mode 100644 index 00000000000..983d62b05d8 --- /dev/null +++ b/app/assets/javascripts/discourse/helpers/route-action.js.es6 @@ -0,0 +1,59 @@ +const { + A: emberArray, + Helper, + assert, + computed, + get, + getOwner, + run, + runInDebug +} = Ember; + +function getCurrentHandlerInfos(router) { + let routerLib = router._routerMicrolib || router.router; + + return routerLib.currentHandlerInfos; +} + +function getRoutes(router) { + return emberArray(getCurrentHandlerInfos(router)) + .mapBy('handler') + .reverse(); +} + +function getRouteWithAction(router, actionName) { + let action; + let handler = emberArray(getRoutes(router)).find((route) => { + let actions = route.actions || route._actions; + action = actions[actionName]; + + return typeof(action) === 'function'; + }); + + return { action, handler }; +} + +export default Helper.extend({ + router: computed(function() { + return getOwner(this).lookup('router:main'); + }).readOnly(), + + compute([actionName, ...params]) { + let router = get(this, 'router'); + assert('[ember-route-action-helper] Unable to lookup router', router); + + runInDebug(() => { + let { handler } = getRouteWithAction(router, actionName); + assert(`[ember-route-action-helper] Unable to find action ${actionName}`, handler); + }); + + let routeAction = function(...invocationArgs) { + let { action, handler } = getRouteWithAction(router, actionName); + let args = params.concat(invocationArgs); + return run.join(handler, action, ...args); + }; + + return routeAction; + } +}); + diff --git a/app/assets/javascripts/discourse/routes/full-page-search.js.es6 b/app/assets/javascripts/discourse/routes/full-page-search.js.es6 index 41ea9d48296..427120bb6d7 100644 --- a/app/assets/javascripts/discourse/routes/full-page-search.js.es6 +++ b/app/assets/javascripts/discourse/routes/full-page-search.js.es6 @@ -1,9 +1,7 @@ import { ajax } from 'discourse/lib/ajax'; import { translateResults, getSearchKey, isValidSearchTerm } from "discourse/lib/search"; -import Composer from 'discourse/models/composer'; import PreloadStore from 'preload-store'; import { getTransient, setTransient } from 'discourse/lib/page-tracker'; -import { getOwner } from 'discourse-common/lib/get-owner'; export default Discourse.Route.extend({ queryParams: { q: {}, expanded: false, context_id: {}, context: {}, skip_context: {} }, @@ -47,17 +45,6 @@ export default Discourse.Route.extend({ didTransition() { this.controllerFor("full-page-search")._showFooter(); return true; - }, - - createTopic(searchTerm) { - let category; - if (searchTerm.indexOf("category:")) { - const match = searchTerm.match(/category:(\S*)/); - if (match && match[1]) { - category = match[1]; - } - } - getOwner(this).lookup('controller:composer').open({action: Composer.CREATE_TOPIC, draftKey: Composer.CREATE_TOPIC, topicCategory: category}); } } diff --git a/app/assets/javascripts/discourse/templates/application.hbs b/app/assets/javascripts/discourse/templates/application.hbs index 6250c28d1fd..a77b96a0863 100644 --- a/app/assets/javascripts/discourse/templates/application.hbs +++ b/app/assets/javascripts/discourse/templates/application.hbs @@ -1,11 +1,11 @@ {{plugin-outlet name="above-site-header"}} {{site-header canSignUp=canSignUp - showCreateAccount=(action "appRouteAction" "showCreateAccount") - showLogin=(action "appRouteAction" "showLogin") - showKeyboard=(action "appRouteAction" "showKeyboardShortcutsHelp") - toggleMobileView=(action "appRouteAction" "toggleMobileView") - toggleAnonymous=(action "appRouteAction" "toggleAnonymous") - logout=(action "appRouteAction" "logout")}} + showCreateAccount=(route-action "showCreateAccount") + showLogin=(route-action "showLogin") + showKeyboard=(route-action "showKeyboardShortcutsHelp") + toggleMobileView=(route-action "toggleMobileView") + toggleAnonymous=(route-action "toggleAnonymous") + logout=(route-action "logout")}} {{plugin-outlet name="below-site-header"}}