diff --git a/app/assets/javascripts/discourse/views/post-menu.js.es6 b/app/assets/javascripts/discourse/views/post-menu.js.es6
index 5a583cf52d9..1b9c5bed1b7 100644
--- a/app/assets/javascripts/discourse/views/post-menu.js.es6
+++ b/app/assets/javascripts/discourse/views/post-menu.js.es6
@@ -7,32 +7,31 @@
@module Discourse
**/
-/* Create and memoize our list of buttons, both open and collapsed */
-var _allButtons, _collapsedButtons;
-function postButtons(collapsed) {
- if (!_allButtons) {
- _allButtons = [];
- _collapsedButtons = [];
+// Helper class for rendering a button
+var Button = function(action, label, icon, opts) {
+ this.action = action;
+ this.label = label;
- var hidden = [];
- if (!Em.isEmpty(Discourse.SiteSettings.post_menu_hidden_items)) {
- hidden = Discourse.SiteSettings.post_menu_hidden_items.split('|');
- }
- Discourse.SiteSettings.post_menu.split("|").forEach(function(i) {
- var buttonName = i.replace(/\+/, '').capitalize();
- _allButtons.push(buttonName);
- if (hidden.indexOf(i) === -1) {
- _collapsedButtons.push(buttonName);
- }
- });
-
- // Add ellipsis to collapsed
- if (_allButtons.length !== _collapsedButtons.length) {
- _collapsedButtons.splice(_collapsedButtons.length - 1, 0, 'ShowMoreActions');
- }
+ if (typeof icon === "object") {
+ this.opts = icon;
+ } else {
+ this.icon = icon;
}
- return collapsed ? _collapsedButtons : _allButtons;
-}
+ this.opts = this.opts || opts || {};
+};
+
+Button.prototype.render = function(buffer) {
+ buffer.push("");
+};
+
+var hiddenButtons;
export default Discourse.View.extend({
tagName: 'section',
@@ -61,6 +60,7 @@ export default Discourse.View.extend({
buffer.push("");
},
@@ -90,11 +90,41 @@ export default Discourse.View.extend({
},
renderButtons: function(post, buffer) {
- var self = this;
+ var self = this,
+ allButtons = [],
+ visibleButtons = [];
+
+ if (typeof hiddenButtons === "undefined") {
+ if (!Em.isEmpty(Discourse.SiteSettings.post_menu_hidden_items)) {
+ hiddenButtons = Discourse.SiteSettings.post_menu_hidden_items.split('|');
+ } else {
+ hiddenButtons = [];
+ }
+ }
+
+ Discourse.SiteSettings.post_menu.split("|").forEach(function(i) {
+ var creator = self["buttonFor" + i.replace(/\+/, '').capitalize()];
+ if (creator) {
+ var button = creator.call(self, post);
+ if (button) {
+ allButtons.push(button);
+ if (hiddenButtons.indexOf(i) === -1) {
+ visibleButtons.push(button);
+ }
+ }
+ }
+ });
+
+ // Only show ellipsis if there is more than one button hidden
+ if (!this.get('collapsed') || (allButtons.length <= visibleButtons.length + 1)) {
+ visibleButtons = allButtons;
+ } else {
+ visibleButtons.splice(visibleButtons.length - 1, 0, this.buttonForShowMoreActions(post));
+ }
+
buffer.push('
');
- postButtons(this.get('collapsed')).forEach(function(button) {
- var renderer = "render" + button;
- if(self[renderer]) self[renderer](post, buffer);
+ visibleButtons.forEach(function (b) {
+ b.render(buffer);
});
buffer.push("
");
},
@@ -108,7 +138,7 @@ export default Discourse.View.extend({
},
// Delete button
- renderDelete: function(post, buffer) {
+ buttonForDelete: function(post) {
var label, icon;
if (post.get('post_number') === 1) {
@@ -136,11 +166,8 @@ export default Discourse.View.extend({
icon = "trash-o";
}
}
-
var action = (icon === 'trash-o') ? 'delete' : 'recover';
- buffer.push("");
+ return new Button(action, label, icon);
},
clickRecover: function(post) {
@@ -152,11 +179,9 @@ export default Discourse.View.extend({
},
// Like button
- renderLike: function(post, buffer) {
+ buttonForLike: function(post) {
if (!post.get('actionByName.like.can_act')) return;
- buffer.push("");
+ return new Button('like', 'post.controls.like', 'heart', {className: 'like'});
},
clickLike: function(post) {
@@ -164,11 +189,9 @@ export default Discourse.View.extend({
},
// Flag button
- renderFlag: function(post, buffer) {
- if (!this.present('post.flagsAvailable')) return;
- buffer.push("");
+ buttonForFlag: function(post) {
+ if (Em.isEmpty(post.get('flagsAvailable'))) return;
+ return new Button('flag', 'post.controls.flag', 'flag');
},
clickFlag: function(post) {
@@ -176,11 +199,9 @@ export default Discourse.View.extend({
},
// Edit button
- renderEdit: function(post, buffer) {
+ buttonForEdit: function(post) {
if (!post.get('can_edit')) return;
- buffer.push("");
+ return new Button('edit', 'post.controls.edit', 'pencil');
},
clickEdit: function(post) {
@@ -188,20 +209,14 @@ export default Discourse.View.extend({
},
// Share button
- renderShare: function(post, buffer) {
- buffer.push("");
+ buttonForShare: function(post) {
+ return new Button('share', 'post.controls.share', 'link', {shareUrl: post.get('shareUrl')});
},
// Reply button
- renderReply: function(post, buffer) {
+ buttonForReply: function() {
if (!this.get('controller.model.details.can_create_post')) return;
- buffer.push("");
+ return new Button('reply', 'post.controls.reply', 'reply', {className: 'create', textLabel: 'topic.reply.title'});
},
clickReply: function(post) {
@@ -209,43 +224,33 @@ export default Discourse.View.extend({
},
// Bookmark button
- renderBookmark: function(post, buffer) {
+ buttonForBookmark: function(post) {
if (!Discourse.User.current()) return;
var iconClass = 'read-icon',
buttonClass = 'bookmark',
- tooltip;
+ tooltip = 'bookmarks.not_bookmarked';
if (post.get('bookmarked')) {
iconClass += ' bookmarked';
buttonClass += ' bookmarked';
- tooltip = I18n.t('bookmarks.created');
- } else {
- tooltip = I18n.t('bookmarks.not_bookmarked');
+ tooltip = 'bookmarks.created';
}
- buffer.push("");
+ return new Button('bookmark', tooltip, {className: buttonClass, innerHTML: ""});
},
clickBookmark: function(post) {
this.get('controller').send('toggleBookmark', post);
},
- renderAdmin: function(post, buffer) {
- var currentUser = Discourse.User.current();
- if (!currentUser || !currentUser.get('canManageTopic')) {
- return;
- }
-
- buffer.push('');
-
- this.renderAdminPopup(post, buffer);
+ buttonForAdmin: function() {
+ if (!Discourse.User.currentProp('canManageTopic')) { return; }
+ return new Button('admin', 'post.controls.admin', 'wrench');
},
renderAdminPopup: function(post, buffer) {
+ if (!Discourse.User.currentProp('canManageTopic')) { return; }
var wikiText = post.get('wiki') ? I18n.t('post.controls.unwiki') : I18n.t('post.controls.wiki');
buffer.push('');
},
@@ -260,10 +265,8 @@ export default Discourse.View.extend({
this.get('controller').send('toggleWiki', this.get('post'));
},
- renderShowMoreActions: function(post, buffer) {
- buffer.push("");
+ buttonForShowMoreActions: function() {
+ return new Button('showMoreActions', 'show_more', 'ellipsis-h');
},
clickShowMoreActions: function() {