From 513b7bf7067f7dbff420feb4542f41262e0f85cc Mon Sep 17 00:00:00 2001 From: Robin Ward Date: Tue, 1 Aug 2017 14:50:17 -0400 Subject: [PATCH] REFACTOR: DRY up New Topic button code --- .../components/create-topic-button.js.es6 | 1 + .../discourse/controllers/application.js.es6 | 6 -- .../controllers/full-page-search.js.es6 | 17 ++++++ .../discourse/helpers/route-action.js.es6 | 59 +++++++++++++++++++ .../discourse/routes/full-page-search.js.es6 | 13 ---- .../discourse/templates/application.hbs | 12 ++-- .../components/create-topic-button.hbs | 9 +++ .../discourse/templates/full-page-search.hbs | 4 +- .../templates/navigation/categories.hbs | 9 +-- .../templates/navigation/category.hbs | 12 ++-- .../templates/navigation/default.hbs | 5 +- .../discourse/templates/tags/show.hbs | 4 +- 12 files changed, 100 insertions(+), 51 deletions(-) create mode 100644 app/assets/javascripts/discourse/components/create-topic-button.js.es6 create mode 100644 app/assets/javascripts/discourse/helpers/route-action.js.es6 create mode 100644 app/assets/javascripts/discourse/templates/components/create-topic-button.hbs 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"}}
diff --git a/app/assets/javascripts/discourse/templates/components/create-topic-button.hbs b/app/assets/javascripts/discourse/templates/components/create-topic-button.hbs new file mode 100644 index 00000000000..ee1172ffe23 --- /dev/null +++ b/app/assets/javascripts/discourse/templates/components/create-topic-button.hbs @@ -0,0 +1,9 @@ +{{#if canCreateTopic}} + {{d-button + id="create-topic" + class="btn btn-default" + action=action + icon="plus" + disabled=disabled + label="topic.create"}} +{{/if}} diff --git a/app/assets/javascripts/discourse/templates/full-page-search.hbs b/app/assets/javascripts/discourse/templates/full-page-search.hbs index 712529c40ed..3382bbb07a0 100644 --- a/app/assets/javascripts/discourse/templates/full-page-search.hbs +++ b/app/assets/javascripts/discourse/templates/full-page-search.hbs @@ -14,9 +14,7 @@ {{/if}}
- {{#if canCreateTopic}} - {{d-button id="create-topic" class="btn-default" action="createTopic" actionParam=searchTerm icon="plus" label="topic.create"}} - {{/if}} + {{create-topic-button canCreateTopic=canCreateTopic action=(action "createTopic" searchTerm)}} {{#if canBulkSelect}} {{d-button icon="list" class="bulk-select" title="topics.bulk.toggle" action="toggleBulkSelect"}} diff --git a/app/assets/javascripts/discourse/templates/navigation/categories.hbs b/app/assets/javascripts/discourse/templates/navigation/categories.hbs index 72204f60630..c7221fa8ea2 100644 --- a/app/assets/javascripts/discourse/templates/navigation/categories.hbs +++ b/app/assets/javascripts/discourse/templates/navigation/categories.hbs @@ -6,12 +6,5 @@ {{#if canCreateCategory}} {{categories-admin-dropdown}} {{/if}} - {{#if canCreateTopic}} - {{d-button - id="create-topic" - action="createTopic" - icon="plus" - label="topic.create" - }} - {{/if}} + {{create-topic-button canCreateTopic=canCreateTopic action=(route-action "createTopic")}} {{/d-section}} diff --git a/app/assets/javascripts/discourse/templates/navigation/category.hbs b/app/assets/javascripts/discourse/templates/navigation/category.hbs index 4086eb489fe..a8c71880707 100644 --- a/app/assets/javascripts/discourse/templates/navigation/category.hbs +++ b/app/assets/javascripts/discourse/templates/navigation/category.hbs @@ -20,14 +20,10 @@ {{category-notifications-button category=category}} {{/if}} - {{#if canCreateTopic}} - {{d-button id="create-topic" - class="btn-default" - action="createTopic" - icon="plus" - label="topic.create" - disabled=cannotCreateTopicOnCategory}} - {{/if}} + {{create-topic-button + canCreateTopic=canCreateTopic + disabled=cannotCreateTopicOnCategory + action=(route-action "createTopic")}} {{#if canEditCategory}} {{d-button class="btn-default edit-category" action="editCategory" actionParam=category icon="wrench" label="category.edit_long"}} diff --git a/app/assets/javascripts/discourse/templates/navigation/default.hbs b/app/assets/javascripts/discourse/templates/navigation/default.hbs index fbf412f7b24..e9eb44b9939 100644 --- a/app/assets/javascripts/discourse/templates/navigation/default.hbs +++ b/app/assets/javascripts/discourse/templates/navigation/default.hbs @@ -3,8 +3,5 @@ {{navigation-bar navItems=navItems filterMode=filterMode}} - {{#if canCreateTopic}} - - {{/if}} + {{create-topic-button canCreateTopic=canCreateTopic action=(route-action "createTopic")}} {{/d-section}} diff --git a/app/assets/javascripts/discourse/templates/tags/show.hbs b/app/assets/javascripts/discourse/templates/tags/show.hbs index 18659601d17..4ef67d0f269 100644 --- a/app/assets/javascripts/discourse/templates/tags/show.hbs +++ b/app/assets/javascripts/discourse/templates/tags/show.hbs @@ -15,9 +15,7 @@ {{d-button action="deleteTag" icon="trash-o" class="admin-tag btn-danger"}} {{d-button action="renameTag" actionParam=tag icon="pencil" class="admin-tag"}} {{else}} - {{#if canCreateTopic}} - - {{/if}} + {{create-topic-button canCreateTopic=canCreateTopic action=(route-action "createTopic")}} {{/if}} {{#if showTagFilter}}