From b749585aa79056f674294f4b4b6dd7e66ad9c2e7 Mon Sep 17 00:00:00 2001 From: Robin Ward Date: Wed, 11 Jun 2014 14:30:35 -0400 Subject: [PATCH] REFACTOR: Only show ellipsis if there is more than 1 thing behind it. --- .../discourse/views/post-menu.js.es6 | 159 +++++++++--------- 1 file changed, 81 insertions(+), 78 deletions(-) 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('

' + I18n.t('admin_title') + '

  • ' + wikiText +'
'); }, @@ -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() {