diff --git a/app/assets/javascripts/discourse/components/show-topic-admin.js.es6 b/app/assets/javascripts/discourse/components/show-topic-admin.js.es6 new file mode 100644 index 00000000000..1faf600056a --- /dev/null +++ b/app/assets/javascripts/discourse/components/show-topic-admin.js.es6 @@ -0,0 +1,24 @@ +export default Em.Component.extend({ + tagName: "button", + classNames: ["btn", "no-text", "show-topic-admin"], + attributeBindings: ["title"], + title: I18n.t("topic_admin_menu"), + + render: function(buffer) { + buffer.push(""); + }, + + click: function() { + var $target = this.$(), + position = $target.position(), + width = $target.innerWidth(); + var location = { + position: "fixed", + left: position.left + width, + top: position.top, + }; + this.appEvents.trigger("topic-admin-menu:open", location); + this.sendAction("show"); + return false; + } +}); diff --git a/app/assets/javascripts/discourse/controllers/topic-admin-menu.js.es6 b/app/assets/javascripts/discourse/controllers/topic-admin-menu.js.es6 index ce65499f68f..8f77b08a39c 100644 --- a/app/assets/javascripts/discourse/controllers/topic-admin-menu.js.es6 +++ b/app/assets/javascripts/discourse/controllers/topic-admin-menu.js.es6 @@ -10,17 +10,11 @@ import ObjectController from 'discourse/controllers/object'; **/ export default ObjectController.extend({ menuVisible: false, - needs: ['modal'], + showRecover: Em.computed.and('deleted', 'details.can_recover'), actions: { - show: function() { - this.set('menuVisible', true); - }, + show: function() { this.set('menuVisible', true); }, + hide: function() { this.set('menuVisible', false); } + } - hide: function() { - this.set('menuVisible', false); - } - }, - - showRecover: Em.computed.and('deleted', 'details.can_recover') }); diff --git a/app/assets/javascripts/discourse/routes/topic_route.js b/app/assets/javascripts/discourse/routes/topic_route.js index 2c5d08b9bc4..583f008cc70 100644 --- a/app/assets/javascripts/discourse/routes/topic_route.js +++ b/app/assets/javascripts/discourse/routes/topic_route.js @@ -13,6 +13,10 @@ Discourse.TopicRoute = Discourse.Route.extend({ }, actions: { + showTopicAdminMenu: function() { + this.controllerFor("topic-admin-menu").send("show"); + }, + // Modals that can pop up within a topic expandPostUser: function(post) { this.controllerFor('user-expansion').show(post.get('username'), post.get('uploaded_avatar_id')); diff --git a/app/assets/javascripts/discourse/templates/topic-admin-menu.hbs b/app/assets/javascripts/discourse/templates/topic-admin-menu.hbs index 47843acb918..b2ec69b1e33 100644 --- a/app/assets/javascripts/discourse/templates/topic-admin-menu.hbs +++ b/app/assets/javascripts/discourse/templates/topic-admin-menu.hbs @@ -1,74 +1,68 @@ -{{#if menuVisible}} -
-

{{i18n admin_title}}

+

{{i18n admin_title}}

-
-{{else}} - -{{/if}} +
  • + {{#if pinned_at}} + + {{else}} + {{#if visible}} + + + {{/if}} + {{/if}} +
  • + {{/unless}} + +
  • + {{#if archived}} + + {{else}} + + {{/if}} +
  • + +
  • + {{#if visible}} + + {{else}} + + {{/if}} +
  • + + diff --git a/app/assets/javascripts/discourse/templates/topic.hbs b/app/assets/javascripts/discourse/templates/topic.hbs index 2dae08b2d46..a79b9f703eb 100644 --- a/app/assets/javascripts/discourse/templates/topic.hbs +++ b/app/assets/javascripts/discourse/templates/topic.hbs @@ -25,12 +25,12 @@ {{/if}} {{text-field id='edit-title' value=newTitle maxLength=maxTitleLength}} - - + + {{else}}

    {{#unless is_warning}} - + {{fa-icon envelope}} {{/unless}} {{#if details.loaded}} @@ -46,7 +46,7 @@ {{#if details.can_edit}} - + {{fa-icon pencil}} {{/if}}

    @@ -118,7 +118,6 @@ {{/if}} {{/if}} - @@ -134,7 +133,7 @@ {{message}} {{#if noRetry}} {{#unless currentUser}} - + {{/unless}} {{else}} @@ -159,5 +158,6 @@ {{/if}} {{#if currentUser.canManageTopic}} + {{show-topic-admin show="showTopicAdminMenu"}} {{render "topic-admin-menu"}} {{/if}} diff --git a/app/assets/javascripts/discourse/views/button.js.es6 b/app/assets/javascripts/discourse/views/button.js.es6 index d75eabaea17..b06713cb016 100644 --- a/app/assets/javascripts/discourse/views/button.js.es6 +++ b/app/assets/javascripts/discourse/views/button.js.es6 @@ -5,9 +5,10 @@ export default Discourse.View.extend({ title: function() { return I18n.t(this.get('helpKey') || this.get('textKey')); - }.property('helpKey'), + }.property('helpKey', 'textKey'), text: function() { + if (Em.empty(this.get('textKey'))) { return ""; } return I18n.t(this.get('textKey')); }.property('textKey'), diff --git a/app/assets/javascripts/discourse/views/topic-admin-menu-button.js.es6 b/app/assets/javascripts/discourse/views/topic-admin-menu-button.js.es6 new file mode 100644 index 00000000000..cdd00b78dce --- /dev/null +++ b/app/assets/javascripts/discourse/views/topic-admin-menu-button.js.es6 @@ -0,0 +1,21 @@ +import ButtonView from "discourse/views/button"; + +export default ButtonView.extend({ + classNameBindings: [":no-text"], + helpKey: "topic_admin_menu", + + renderIcon: function(buffer) { + buffer.push(""); + }, + + click: function() { + var offset = this.$().offset(); + var location = { + position: "absolute", + left: offset.left, + top: offset.top, + }; + this.get("controller").appEvents.trigger("topic-admin-menu:open", location); + return this.get("controller").send("showTopicAdminMenu"); + } +}); diff --git a/app/assets/javascripts/discourse/views/topic-admin-menu.js.es6 b/app/assets/javascripts/discourse/views/topic-admin-menu.js.es6 index 34f68a50b1e..e33d6d96afd 100644 --- a/app/assets/javascripts/discourse/views/topic-admin-menu.js.es6 +++ b/app/assets/javascripts/discourse/views/topic-admin-menu.js.es6 @@ -7,21 +7,47 @@ @module Discourse **/ export default Discourse.View.extend({ + classNameBindings: ["controller.menuVisible::hidden", ":topic-admin-menu"], - willDestroyElement: function() { - $('html').off('mouseup.discourse-topic-admin-menu'); - }, - - didInsertElement: function() { + _setup: function() { var self = this; - $('html').on('mouseup.discourse-topic-admin-menu', function(e) { + + this.appEvents.on("topic-admin-menu:open", this, "_changeLocation"); + + $("html").on("mouseup.discourse-topic-admin-menu", function(e) { var $target = $(e.target); - if ($target.is('button') || self.$().has($target).length === 0) { - self.get('controller').send('hide'); + if ($target.is("button") || self.$().has($target).length === 0) { + self.get("controller").send("hide"); } }); - } + }.on("didInsertElement"), + + _changeLocation: function(location) { + console.log("_changeLocation", location); + var $this = this.$(); + switch (location.position) { + case "absolute": { + $this.css({ + position: "absolute", + top: location.top - $this.innerHeight() + 5, + left: location.left, + }) + break; + } + case "fixed": { + $this.css({ + position: "fixed", + top: location.top, + left: location.left - $this.innerWidth(), + }) + break; + } + } + }, + + _cleanup: function() { + $("html").off("mouseup.discourse-topic-admin-menu"); + this.appEvents.off("topic-admin-menu:open"); + }.on("willDestroyElement"), }); - - 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 768b5eef65d..d94cead5c2e 100644 --- a/app/assets/javascripts/discourse/views/topic-footer-buttons.js.es6 +++ b/app/assets/javascripts/discourse/views/topic-footer-buttons.js.es6 @@ -1,3 +1,4 @@ +import TopicAdminMenuButton from 'discourse/views/topic-admin-menu-button'; import LoginReplyButton from 'discourse/views/login-reply-button'; import FlagTopicButton from 'discourse/views/flag-topic-button'; import StarButton from 'discourse/views/star-button'; @@ -21,6 +22,9 @@ export default DiscourseContainerView.extend({ createButtons: function() { var topic = this.get('topic'); if (Discourse.User.current()) { + if (Discourse.User.currentProp("staff")) { + this.attachViewClass(TopicAdminMenuButton); + } if (!topic.get('isPrivateMessage')) { // We hide some controls from private messages if (this.get('topic.details.can_invite_to')) { diff --git a/app/assets/stylesheets/common/base/topic-admin-menu.scss b/app/assets/stylesheets/common/base/topic-admin-menu.scss index 658990d8db8..34f692ed434 100644 --- a/app/assets/stylesheets/common/base/topic-admin-menu.scss +++ b/app/assets/stylesheets/common/base/topic-admin-menu.scss @@ -1,10 +1,11 @@ // Styles for the topic admin menu -#show-topic-admin { +.show-topic-admin { position: fixed; top: 70px; right: 10px; z-index: 1000; + outline: 0; } .topic-admin-menu { @@ -12,9 +13,6 @@ width: 205px; padding: 10px; border: 1px solid scale-color-diff(); - position: fixed; - top: 70px; - right: 10px; z-index: 1001; ul { diff --git a/app/assets/stylesheets/desktop/topic-post.scss b/app/assets/stylesheets/desktop/topic-post.scss index 80a6178cb31..f030afd1eba 100644 --- a/app/assets/stylesheets/desktop/topic-post.scss +++ b/app/assets/stylesheets/desktop/topic-post.scss @@ -473,6 +473,7 @@ a.star { color: $primary; } .btn { + outline: 0; margin-bottom: 5px; margin-right: 10px; .fa-star {margin-right: 5px;} diff --git a/config/locales/client.en.yml b/config/locales/client.en.yml index e4680186630..6172da684bd 100644 --- a/config/locales/client.en.yml +++ b/config/locales/client.en.yml @@ -101,6 +101,8 @@ en: google+: 'share this link on Google+' email: 'send this link in an email' + topic_admin_menu: "topic admin actions" + edit: 'edit the title and category of this topic' not_implemented: "That feature hasn't been implemented yet, sorry!" no_value: "No"