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}}
-
-{{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"