diff --git a/packages/rocketchat-message-star/client/actionButton.coffee b/packages/rocketchat-message-star/client/actionButton.coffee deleted file mode 100644 index c0b873a6db8c..000000000000 --- a/packages/rocketchat-message-star/client/actionButton.coffee +++ /dev/null @@ -1,83 +0,0 @@ -import toastr from 'toastr' -Meteor.startup -> - RocketChat.MessageAction.addButton - id: 'star-message' - icon: 'icon-star-empty' - i18nLabel: 'Star_Message' - context: [ - 'starred' - 'message' - 'message-mobile' - ] - action: (event, instance) -> - message = @_arguments[1] - message.starred = Meteor.userId() - Meteor.call 'starMessage', message, (error, result) -> - if error - return handleError(error) - validation: (message) -> - if not RocketChat.models.Subscriptions.findOne({ rid: message.rid })? - return false - - return RocketChat.settings.get('Message_AllowStarring') and not message.starred - order: 10 - - RocketChat.MessageAction.addButton - id: 'unstar-message' - icon: 'icon-star' - i18nLabel: 'Unstar_Message' - context: [ - 'starred' - 'message' - 'message-mobile' - ] - action: (event, instance) -> - message = @_arguments[1] - message.starred = false - Meteor.call 'starMessage', message, (error, result) -> - if error - return handleError(error) - validation: (message) -> - if not RocketChat.models.Subscriptions.findOne({ rid: message.rid })? - return false - - return RocketChat.settings.get('Message_AllowStarring') and message.starred - order: 10 - - RocketChat.MessageAction.addButton - id: 'jump-to-star-message' - icon: 'icon-right-hand' - i18nLabel: 'Jump_to_message' - context: [ - 'starred' - ] - action: (event, instance) -> - message = @_arguments[1] - RocketChat.MessageAction.hideDropDown() - RoomHistoryManager.getSurroundingMessages(message, 50) - validation: (message) -> - if not RocketChat.models.Subscriptions.findOne({ rid: message.rid })? - return false - - return true - order: 100 - - RocketChat.MessageAction.addButton - id: 'permalink-star' - icon: 'icon-link' - i18nLabel: 'Permalink' - classes: 'clipboard' - context: [ - 'starred' - ] - action: (event, instance) -> - message = @_arguments[1] - RocketChat.MessageAction.hideDropDown() - $(event.currentTarget).attr('data-clipboard-text', RocketChat.MessageAction.getPermaLink(message._id)); - toastr.success(TAPi18n.__('Copied')) - validation: (message) -> - if not RocketChat.models.Subscriptions.findOne({ rid: message.rid })? - return false - - return true - order: 101 diff --git a/packages/rocketchat-message-star/client/actionButton.js b/packages/rocketchat-message-star/client/actionButton.js new file mode 100644 index 000000000000..8b8a82e31c9f --- /dev/null +++ b/packages/rocketchat-message-star/client/actionButton.js @@ -0,0 +1,85 @@ +import toastr from 'toastr'; +Meteor.startup(function() { + RocketChat.MessageAction.addButton({ + id: 'star-message', + icon: 'icon-star-empty', + i18nLabel: 'Star_Message', + context: ['starred', 'message', 'message-mobile'], + action() { + const message = this._arguments[1]; + message.starred = Meteor.userId(); + return Meteor.call('starMessage', message, function(error) { + if (error) { + return handleError(error); + } + }); + }, + validation(message) { + if (RocketChat.models.Subscriptions.findOne({ rid: message.rid }) == null) { + return false; + } + return RocketChat.settings.get('Message_AllowStarring') && !message.starred; + }, + order: 10 + }); + RocketChat.MessageAction.addButton({ + id: 'unstar-message', + icon: 'icon-star', + i18nLabel: 'Unstar_Message', + context: ['starred', 'message', 'message-mobile'], + action() { + const message = this._arguments[1]; + message.starred = false; + return Meteor.call('starMessage', message, function(error) { + if (error) { + return handleError(error); + } + }); + }, + validation(message) { + if (RocketChat.models.Subscriptions.findOne({ rid: message.rid }) == null) { + return false; + } + return RocketChat.settings.get('Message_AllowStarring') && message.starred; + }, + order: 10 + }); + RocketChat.MessageAction.addButton({ + id: 'jump-to-star-message', + icon: 'icon-right-hand', + i18nLabel: 'Jump_to_message', + context: ['starred'], + action() { + const message = this._arguments[1]; + RocketChat.MessageAction.hideDropDown(); + return RoomHistoryManager.getSurroundingMessages(message, 50); + }, + validation(message) { + if (RocketChat.models.Subscriptions.findOne({ rid: message.rid }) == null) { + return false; + } + return true; + }, + order: 100 + }); + return RocketChat.MessageAction.addButton({ + id: 'permalink-star', + icon: 'icon-link', + i18nLabel: 'Permalink', + classes: 'clipboard', + context: ['starred'], + action() { + const message = this._arguments[1]; + RocketChat.MessageAction.hideDropDown(); + $(event.currentTarget).attr('data-clipboard-text', RocketChat.MessageAction.getPermaLink(message._id)); + return toastr.success(TAPi18n.__('Copied')); + }, + validation(message) { + if (RocketChat.models.Subscriptions.findOne({ rid: message.rid }) == null) { + return false; + } + return true; + }, + order: 101 + }); +}); diff --git a/packages/rocketchat-message-star/client/lib/StarredMessage.coffee b/packages/rocketchat-message-star/client/lib/StarredMessage.coffee deleted file mode 100644 index 10798a3a464b..000000000000 --- a/packages/rocketchat-message-star/client/lib/StarredMessage.coffee +++ /dev/null @@ -1 +0,0 @@ -@StarredMessage = new Mongo.Collection 'rocketchat_starred_message' diff --git a/packages/rocketchat-message-star/client/lib/StarredMessage.js b/packages/rocketchat-message-star/client/lib/StarredMessage.js new file mode 100644 index 000000000000..cd014935ac3f --- /dev/null +++ b/packages/rocketchat-message-star/client/lib/StarredMessage.js @@ -0,0 +1 @@ +this.StarredMessage = new Mongo.Collection('rocketchat_starred_message'); diff --git a/packages/rocketchat-message-star/client/starMessage.coffee b/packages/rocketchat-message-star/client/starMessage.coffee deleted file mode 100644 index d6b22b9488a8..000000000000 --- a/packages/rocketchat-message-star/client/starMessage.coffee +++ /dev/null @@ -1,15 +0,0 @@ -Meteor.methods - starMessage: (message) -> - if not Meteor.userId() - return false - - if not RocketChat.models.Subscriptions.findOne({ rid: message.rid })? - return false - - if not RocketChat.settings.get 'Message_AllowStarring' - return false - - ChatMessage.update - _id: message._id - , - $set: { starred: !!message.starred } diff --git a/packages/rocketchat-message-star/client/starMessage.js b/packages/rocketchat-message-star/client/starMessage.js new file mode 100644 index 000000000000..cae539c7eaa1 --- /dev/null +++ b/packages/rocketchat-message-star/client/starMessage.js @@ -0,0 +1,20 @@ +Meteor.methods({ + starMessage(message) { + if (!Meteor.userId()) { + return false; + } + if (RocketChat.models.Subscriptions.findOne({ rid: message.rid }) == null) { + return false; + } + if (!RocketChat.settings.get('Message_AllowStarring')) { + return false; + } + return ChatMessage.update({ + _id: message._id + }, { + $set: { + starred: !!message.starred + } + }); + } +}); diff --git a/packages/rocketchat-message-star/client/tabBar.coffee b/packages/rocketchat-message-star/client/tabBar.js similarity index 68% rename from packages/rocketchat-message-star/client/tabBar.coffee rename to packages/rocketchat-message-star/client/tabBar.js index cab66321912a..85f32f93349a 100644 --- a/packages/rocketchat-message-star/client/tabBar.coffee +++ b/packages/rocketchat-message-star/client/tabBar.js @@ -1,9 +1,10 @@ -Meteor.startup -> - RocketChat.TabBar.addButton({ +Meteor.startup(function() { + return RocketChat.TabBar.addButton({ groups: ['channel', 'group', 'direct'], id: 'starred-messages', i18nTitle: 'Starred_Messages', icon: 'icon-star', template: 'starredMessages', order: 3 - }) + }); +}); diff --git a/packages/rocketchat-message-star/client/views/starredMessages.coffee b/packages/rocketchat-message-star/client/views/starredMessages.coffee deleted file mode 100644 index 9b34d6269365..000000000000 --- a/packages/rocketchat-message-star/client/views/starredMessages.coffee +++ /dev/null @@ -1,40 +0,0 @@ -Template.starredMessages.helpers - hasMessages: -> - return StarredMessage.find({ rid: @rid }, { sort: { ts: -1 } }).count() > 0 - - messages: -> - return StarredMessage.find { rid: @rid }, { sort: { ts: -1 } } - - message: -> - return _.extend(this, { customClass: 'starred' }) - - hasMore: -> - return Template.instance().hasMore.get() - -Template.starredMessages.onCreated -> - @hasMore = new ReactiveVar true - @limit = new ReactiveVar 50 - @autorun => - sub = @subscribe 'starredMessages', @data.rid, @limit.get() - if sub.ready() - if StarredMessage.find({ rid: @data.rid }).count() < @limit.get() - @hasMore.set false - -Template.starredMessages.events - 'click .message-cog': (e, t) -> - e.stopPropagation() - e.preventDefault() - message_id = $(e.currentTarget).closest('.message').attr('id') - RocketChat.MessageAction.hideDropDown() - t.$("\##{message_id} .message-dropdown").remove() - message = StarredMessage.findOne message_id - actions = RocketChat.MessageAction.getButtons message, 'starred' - el = Blaze.toHTMLWithData Template.messageDropdown, { actions: actions } - t.$("\##{message_id} .message-cog-container").append el - dropDown = t.$("\##{message_id} .message-dropdown") - dropDown.show() - - 'scroll .content': _.throttle (e, instance) -> - if e.target.scrollTop >= e.target.scrollHeight - e.target.clientHeight - instance.limit.set(instance.limit.get() + 50) - , 200 diff --git a/packages/rocketchat-message-star/client/views/starredMessages.js b/packages/rocketchat-message-star/client/views/starredMessages.js new file mode 100644 index 000000000000..eed8d3d0baca --- /dev/null +++ b/packages/rocketchat-message-star/client/views/starredMessages.js @@ -0,0 +1,66 @@ +/*globals StarredMessage */ +Template.starredMessages.helpers({ + hasMessages() { + return StarredMessage.find({ + rid: this.rid + }, { + sort: { + ts: -1 + } + }).count() > 0; + }, + messages() { + return StarredMessage.find({ + rid: this.rid + }, { + sort: { + ts: -1 + } + }); + }, + message() { + return _.extend(this, { + customClass: 'starred' + }); + }, + hasMore() { + return Template.instance().hasMore.get(); + } +}); + +Template.starredMessages.onCreated(function() { + this.hasMore = new ReactiveVar(true); + this.limit = new ReactiveVar(50); + this.autorun(() => { + const sub = this.subscribe('starredMessages', this.data.rid, this.limit.get()); + const findStarredMessage = StarredMessage.find({ rid: this.data.rid }); + if (sub.ready()) { + if (findStarredMessage.count() < this.limit.get()) { + return this.hasMore.set(false); + } + } + }); +}); + +Template.starredMessages.events({ + 'click .message-cog'(e, t) { + e.stopPropagation(); + e.preventDefault(); + const message_id = $(e.currentTarget).closest('.message').attr('id'); + RocketChat.MessageAction.hideDropDown(); + t.$(`\#${ message_id } .message-dropdown`).remove(); + const message = StarredMessage.findOne(message_id); + const actions = RocketChat.MessageAction.getButtons(message, 'starred'); + const el = Blaze.toHTMLWithData(Template.messageDropdown, { + actions + }); + t.$(`\#${ message_id } .message-cog-container`).append(el); + const dropDown = t.$(`\#${ message_id } .message-dropdown`); + return dropDown.show(); + }, + 'scroll .content': _.throttle(function(e, instance) { + if (e.target.scrollTop >= e.target.scrollHeight - e.target.clientHeight) { + return instance.limit.set(instance.limit.get() + 50); + } + }, 200) +}); diff --git a/packages/rocketchat-message-star/package.js b/packages/rocketchat-message-star/package.js index c9bcefca8cb1..b0e1f3e6b6bb 100644 --- a/packages/rocketchat-message-star/package.js +++ b/packages/rocketchat-message-star/package.js @@ -8,7 +8,6 @@ Package.describe({ Package.onUse(function(api) { api.use([ 'mongo', - 'coffeescript', 'ecmascript', 'underscore', 'less', @@ -18,19 +17,19 @@ Package.onUse(function(api) { api.use('templating', 'client'); api.addFiles([ - 'client/lib/StarredMessage.coffee', - 'client/actionButton.coffee', - 'client/starMessage.coffee', - 'client/tabBar.coffee', + 'client/lib/StarredMessage.js', + 'client/actionButton.js', + 'client/starMessage.js', + 'client/tabBar.js', 'client/views/starredMessages.html', - 'client/views/starredMessages.coffee', + 'client/views/starredMessages.js', 'client/views/stylesheets/messagestar.less' ], 'client'); api.addFiles([ - 'server/settings.coffee', - 'server/starMessage.coffee', - 'server/publications/starredMessages.coffee', - 'server/startup/indexes.coffee' + 'server/settings.js', + 'server/starMessage.js', + 'server/publications/starredMessages.js', + 'server/startup/indexes.js' ], 'server'); }); diff --git a/packages/rocketchat-message-star/server/publications/starredMessages.coffee b/packages/rocketchat-message-star/server/publications/starredMessages.coffee deleted file mode 100644 index 51d664d76530..000000000000 --- a/packages/rocketchat-message-star/server/publications/starredMessages.coffee +++ /dev/null @@ -1,23 +0,0 @@ -Meteor.publish 'starredMessages', (rid, limit=50) -> - unless this.userId - return this.ready() - - publication = @ - - user = RocketChat.models.Users.findOneById this.userId - unless user - return this.ready() - - cursorHandle = RocketChat.models.Messages.findStarredByUserAtRoom(this.userId, rid, { sort: { ts: -1 }, limit: limit }).observeChanges - added: (_id, record) -> - publication.added('rocketchat_starred_message', _id, record) - - changed: (_id, record) -> - publication.changed('rocketchat_starred_message', _id, record) - - removed: (_id) -> - publication.removed('rocketchat_starred_message', _id) - - @ready() - @onStop -> - cursorHandle.stop() diff --git a/packages/rocketchat-message-star/server/publications/starredMessages.js b/packages/rocketchat-message-star/server/publications/starredMessages.js new file mode 100644 index 000000000000..15446bebeef5 --- /dev/null +++ b/packages/rocketchat-message-star/server/publications/starredMessages.js @@ -0,0 +1,30 @@ +Meteor.publish('starredMessages', function(rid, limit = 50) { + if (!this.userId) { + return this.ready(); + } + const publication = this; + const user = RocketChat.models.Users.findOneById(this.userId); + if (!user) { + return this.ready(); + } + const cursorHandle = RocketChat.models.Messages.findStarredByUserAtRoom(this.userId, rid, { + sort: { + ts: -1 + }, + limit + }).observeChanges({ + added(_id, record) { + return publication.added('rocketchat_starred_message', _id, record); + }, + changed(_id, record) { + return publication.changed('rocketchat_starred_message', _id, record); + }, + removed(_id) { + return publication.removed('rocketchat_starred_message', _id); + } + }); + this.ready(); + return this.onStop(function() { + return cursorHandle.stop(); + }); +}); diff --git a/packages/rocketchat-message-star/server/settings.coffee b/packages/rocketchat-message-star/server/settings.coffee deleted file mode 100644 index de6bb651c8f7..000000000000 --- a/packages/rocketchat-message-star/server/settings.coffee +++ /dev/null @@ -1,2 +0,0 @@ -Meteor.startup -> - RocketChat.settings.add 'Message_AllowStarring', true, { type: 'boolean', group: 'Message', public: true } diff --git a/packages/rocketchat-message-star/server/settings.js b/packages/rocketchat-message-star/server/settings.js new file mode 100644 index 000000000000..4a8fa47af713 --- /dev/null +++ b/packages/rocketchat-message-star/server/settings.js @@ -0,0 +1,7 @@ +Meteor.startup(function() { + return RocketChat.settings.add('Message_AllowStarring', true, { + type: 'boolean', + group: 'Message', + 'public': true + }); +}); diff --git a/packages/rocketchat-message-star/server/starMessage.coffee b/packages/rocketchat-message-star/server/starMessage.coffee deleted file mode 100644 index 030fa9081628..000000000000 --- a/packages/rocketchat-message-star/server/starMessage.coffee +++ /dev/null @@ -1,14 +0,0 @@ -Meteor.methods - starMessage: (message) -> - if not Meteor.userId() - throw new Meteor.Error('error-invalid-user', "Invalid user", { method: 'starMessage' }) - - if not RocketChat.settings.get 'Message_AllowStarring' - throw new Meteor.Error 'error-action-not-allowed', 'Message starring not allowed', { method: 'pinMessage', action: 'Message_starring' } - - room = RocketChat.models.Rooms.findOneById(message.rid) - - if Array.isArray(room.usernames) && room.usernames.indexOf(Meteor.user().username) is -1 - return false - - RocketChat.models.Messages.updateUserStarById(message._id, Meteor.userId(), message.starred) diff --git a/packages/rocketchat-message-star/server/starMessage.js b/packages/rocketchat-message-star/server/starMessage.js new file mode 100644 index 000000000000..3ed7ee3bd8b6 --- /dev/null +++ b/packages/rocketchat-message-star/server/starMessage.js @@ -0,0 +1,21 @@ +Meteor.methods({ + starMessage(message) { + if (!Meteor.userId()) { + throw new Meteor.Error('error-invalid-user', 'Invalid user', { + method: 'starMessage' + }); + } + if (!RocketChat.settings.get('Message_AllowStarring')) { + throw new Meteor.Error('error-action-not-allowed', 'Message starring not allowed', { + method: 'pinMessage', + action: 'Message_starring' + }); + } + const room = RocketChat.models.Rooms.findOneById(message.rid); + if (Array.isArray(room.usernames) && room.usernames.indexOf(Meteor.user().username) === -1) { + return false; + } + return RocketChat.models.Messages.updateUserStarById(message._id, Meteor.userId(), message.starred); + } +}); + diff --git a/packages/rocketchat-message-star/server/startup/indexes.coffee b/packages/rocketchat-message-star/server/startup/indexes.coffee deleted file mode 100644 index 519eb19b596f..000000000000 --- a/packages/rocketchat-message-star/server/startup/indexes.coffee +++ /dev/null @@ -1,3 +0,0 @@ -Meteor.startup -> - Meteor.defer -> - RocketChat.models.Messages.tryEnsureIndex { 'starred._id': 1 }, { sparse: 1 } diff --git a/packages/rocketchat-message-star/server/startup/indexes.js b/packages/rocketchat-message-star/server/startup/indexes.js new file mode 100644 index 000000000000..f1946d6f4eb1 --- /dev/null +++ b/packages/rocketchat-message-star/server/startup/indexes.js @@ -0,0 +1,9 @@ +Meteor.startup(function() { + return Meteor.defer(function() { + return RocketChat.models.Messages.tryEnsureIndex({ + 'starred._id': 1 + }, { + sparse: 1 + }); + }); +});