diff --git a/app/assets/javascripts/discourse/components/show-popup-button.js.es6 b/app/assets/javascripts/discourse/components/show-popup-button.js.es6 index e082f87d1..0f1a40734 100644 --- a/app/assets/javascripts/discourse/components/show-popup-button.js.es6 +++ b/app/assets/javascripts/discourse/components/show-popup-button.js.es6 @@ -11,11 +11,6 @@ export default DButton.extend({ top: position.top }; - // TODO views/topic-footer-buttons is instantiating this via attachViewWithArgs - // attachViewWithArgs does not set this.appEvents, it is undefined - // this is a workaround but a proper fix probably depends on either deprecation - // of attachViewClass et.el or correction of the methods to hydrate the depndencies - this.appEvents = this.appEvents || this.container.lookup('app-events:main'); this.appEvents.trigger("popup-menu:open", loc); this.sendAction("action"); } diff --git a/app/assets/javascripts/discourse/views/container.js.es6 b/app/assets/javascripts/discourse/views/container.js.es6 index 39d623c84..f7a474fc0 100644 --- a/app/assets/javascripts/discourse/views/container.js.es6 +++ b/app/assets/javascripts/discourse/views/container.js.es6 @@ -1,6 +1,11 @@ export default Ember.ContainerView.extend({ attachViewWithArgs(viewArgs, viewClass) { + if (typeof viewClass === "string") { + viewClass = this.container.lookupFactory("view:" + viewClass) || + this.container.lookupFactory("component:" + viewClass); + } + if (!viewClass) { viewClass = Ember.View.extend(); } this.pushObject(this.createChildView(viewClass, viewArgs)); }, diff --git a/app/assets/javascripts/discourse/views/topic-footer-buttons.js.es6 b/app/assets/javascripts/discourse/views/topic-footer-buttons.js.es6 index 2467d9a93..5fba8abcd 100644 --- a/app/assets/javascripts/discourse/views/topic-footer-buttons.js.es6 +++ b/app/assets/javascripts/discourse/views/topic-footer-buttons.js.es6 @@ -1,69 +1,24 @@ -import LoginReplyButton from 'discourse/views/login-reply-button'; -import FlagTopicButton from 'discourse/views/flag-topic-button'; -import BookmarkButton from 'discourse/views/bookmark-button'; -import ShareButton from 'discourse/views/share-button'; -import InviteReplyButton from 'discourse/views/invite-reply-button'; -import ReplyButton from 'discourse/views/reply-button'; -import PinnedButton from 'discourse/components/pinned-button'; -import TopicNotificationsButton from 'discourse/components/topic-notifications-button'; -import DiscourseContainerView from 'discourse/views/container'; -import ShowPopupButton from 'discourse/components/show-popup-button'; +import ContainerView from 'discourse/views/container'; +import { on } from 'ember-addons/ember-computed-decorators'; -const MainPanel = Discourse.ContainerView.extend({ - elementId: 'topic-footer-main-buttons', - topicBinding: 'controller.content', - - init() { - this._super(); - - if (Discourse.User.currentProp('staff')) { - const viewArgs = {action: 'showTopicAdminMenu', title: 'topic_admin_menu', icon: 'wrench', position: 'absolute'}; - this.attachViewWithArgs(viewArgs, ShowPopupButton); - } - - const topic = this.get('topic'); - if (!topic.get('isPrivateMessage')) { - // We hide some controls from private messages - if (this.get('topic.details.can_invite_to')) { - this.attachViewClass(InviteReplyButton); - } - this.attachViewClass(BookmarkButton); - this.attachViewClass(ShareButton); - if (this.get('topic.details.can_flag_topic')) { - this.attachViewClass(FlagTopicButton); - } - } - if (this.get('topic.details.can_create_post')) { - this.attachViewClass(ReplyButton); - } - } - -}); - -export default DiscourseContainerView.extend({ +export default ContainerView.extend({ elementId: 'topic-footer-buttons', - topicBinding: 'controller.content', - init() { - this._super(); - this.createButtons(); - }, - - // Add the buttons below a topic + @on('init') createButtons() { const topic = this.get('topic'); const currentUser = this.get('controller.currentUser'); if (currentUser) { - const viewArgs = {topic}; - this.attachViewWithArgs(viewArgs, MainPanel); - this.attachViewWithArgs(viewArgs, PinnedButton); - this.attachViewWithArgs(viewArgs, TopicNotificationsButton); + const viewArgs = { topic, currentUser }; + this.attachViewWithArgs(viewArgs, 'topic-footer-main-buttons'); + this.attachViewWithArgs(viewArgs, 'pinned-button'); + this.attachViewWithArgs(viewArgs, 'topic-notifications-button'); this.trigger('additionalButtons', this); } else { // If not logged in give them a login control - this.attachViewClass(LoginReplyButton); + this.attachViewClass('login-reply-button'); } } }); diff --git a/app/assets/javascripts/discourse/views/topic-footer-main-buttons.js.es6 b/app/assets/javascripts/discourse/views/topic-footer-main-buttons.js.es6 new file mode 100644 index 000000000..8ee440935 --- /dev/null +++ b/app/assets/javascripts/discourse/views/topic-footer-main-buttons.js.es6 @@ -0,0 +1,30 @@ +import ContainerView from 'discourse/views/container'; +import { on } from 'ember-addons/ember-computed-decorators'; + +export default ContainerView.extend({ + elementId: 'topic-footer-main-buttons', + + @on('init') + createButtons() { + if (this.currentUser.get('staff')) { + const viewArgs = {action: 'showTopicAdminMenu', title: 'topic_admin_menu', icon: 'wrench', position: 'absolute'}; + this.attachViewWithArgs(viewArgs, 'show-popup-button'); + } + + const topic = this.get('topic'); + if (!topic.get('isPrivateMessage')) { + // We hide some controls from private messages + if (this.get('topic.details.can_invite_to')) { + this.attachViewClass('invite-reply-button'); + } + this.attachViewClass('bookmark-button'); + this.attachViewClass('share-button'); + if (this.get('topic.details.can_flag_topic')) { + this.attachViewClass('flag-topic-button'); + } + } + if (this.get('topic.details.can_create_post')) { + this.attachViewClass('reply-button'); + } + } +});