Message Action Buttons

pull/984/head
Marcelo Schmidt 10 years ago
parent 4ab5412917
commit 06b0a03d46
  1. 3
      client/lib/tapi18n.coffee
  2. 11
      client/views/app/message.coffee
  3. 11
      client/views/app/message.html
  4. 44
      client/views/app/room.coffee
  5. 114
      packages/rocketchat-lib/client/MessageAction.coffee
  6. 4
      packages/rocketchat-lib/i18n/en.i18n.json
  7. 4
      packages/rocketchat-lib/i18n/pt.i18n.json
  8. 0
      packages/rocketchat-lib/package-tap.i18n
  9. 18
      packages/rocketchat-lib/package.js

@ -13,3 +13,6 @@
@isRtl = (language) ->
# https://en.wikipedia.org/wiki/Right-to-left#cite_note-2
return language?.split('-').shift().toLowerCase() in ['ar', 'dv', 'fa', 'he', 'ku', 'ps', 'sd', 'ug', 'ur', 'yi']
UI.registerHelper '_t', (key) ->
return TAPi18next.t key

@ -1,7 +1,7 @@
Template.message.helpers
actions: ->
return Template.instance()?.actions?.getButtons()
return RocketChat.MessageAction.getButtons(this)
own: ->
return 'own' if this.u?._id is Meteor.userId()
@ -59,7 +59,6 @@ Template.message.helpers
Template.message.onViewRendered = (context) ->
view = this
console.log view
this._domrange.onAttached (domRange) ->
lastNode = domRange.lastNode()
if lastNode.previousElementSibling?.dataset?.date isnt lastNode.dataset.date
@ -95,9 +94,3 @@ Template.message.onViewRendered = (context) ->
if view.parentView.parentView.parentView.parentView.parentView.templateInstance?().atBottom isnt true
newMessage = document.querySelector(".new-message")
newMessage.className = "new-message"
# if RocketChat.authz.hasAtLeastOnePermission('edit-message', context.rid ) or (RocketChat.settings.get('Message_AllowEditing') and context.u?._id is Meteor.userId())
# view.instance().actions.addButton({ id: 'edit-message', icon: 'icon-pencil', label: 'Edit' })
Template.message.onCreated ->
@actions = new MessageAction

@ -15,18 +15,9 @@
</span>
<ul class="message-dropdown">
{{#each actions}}
<li class="{{id}}"><i class="{{icon}}"></i>{{label}}</li>
<li class="{{id}} {{classes}}"><i class="{{icon}}"></i>{{_t i18nLabel}}</li>
{{/each}}
{{!-- {{#if canEdit}}
<li class="edit-message"><i class="icon-pencil"></i>Edit</li>
{{/if}}
{{#if canDelete}}
<li class="delete-message"><i class="icon-trash-1"></i>Delete</li>
{{/if}} --}}
</ul>
<div class="body" dir="auto">

@ -405,17 +405,6 @@ Template.room.events
'click .see-all': (e, instance) ->
instance.showUsersOffline.set(!instance.showUsersOffline.get())
"click .edit-message": (e) ->
message = e.currentTarget.parentNode.parentNode
Template.instance().chatMessages.edit(message)
$("\##{message.id} .message-dropdown").hide()
input = Template.instance().find('.input-message')
Meteor.setTimeout ->
input.focus()
, 200
'click .message-cog': (e) ->
message_id = e.currentTarget.parentNode.parentNode.id
@ -440,33 +429,6 @@ Template.room.events
'click .image-to-download': (event) ->
ChatMessage.update {_id: this._arguments[1]._id, 'urls.url': $(event.currentTarget).data('url')}, {$set: {'urls.$.downloadImages': true}}
'click .delete-message': (event) ->
message = @_arguments[1]
msg = event.currentTarget.parentNode.parentNode
$("\##{msg.id} .message-dropdown").hide()
instance = Template.instance()
return if msg.classList.contains("system")
swal {
title: t('Are_you_sure')
text: t('You_will_not_be_able_to_recover')
type: 'warning'
showCancelButton: true
confirmButtonColor: '#DD6B55'
confirmButtonText: t('Yes_delete_it')
cancelButtonText: t('Cancel')
closeOnConfirm: false
html: false
}, ->
swal
title: t('Deleted')
text: t('Your_entry_has_been_deleted')
type: 'success'
timer: 1000
showConfirmButton: false
instance.chatMessages.deleteMsg(message)
'click .pin-message': (event) ->
message = @_arguments[1]
instance = Template.instance()
@ -581,6 +543,12 @@ Template.room.onCreated ->
@autorun ->
self.subscribe 'fullUserData', Session.get('showUserInfo'), 1
for button in RocketChat.MessageAction.getButtons()
if _.isFunction button.action
evt = {}
evt["click .#{button.id}"] = button.action
Template.room.events evt
Template.room.onDestroyed ->
RocketChat.TabBar.resetButtons()

@ -1,31 +1,105 @@
class @MessageAction
constructor: ->
@buttons = new ReactiveVar {}
addButton: (config) =>
RocketChat.MessageAction = new class
buttons = new ReactiveVar {}
###
config expects the following keys (only id is mandatory):
id (mandatory)
icon: string
i18nLabel: string
action: function(event, instance)
validation: function(message)
order: integer
###
addButton = (config) ->
unless config?.id
throw new Meteor.Error "MessageAction-addButton-error", "Button id was not informed."
Tracker.nonreactive =>
btns = @buttons.get()
Tracker.nonreactive ->
btns = buttons.get()
btns[config.id] = config
@buttons.set btns
buttons.set btns
removeButton: (id) =>
Tracker.nonreactive =>
btns = @buttons.get()
removeButton = (id) ->
Tracker.nonreactive ->
btns = buttons.get()
delete btns[id]
@buttons.set btns
buttons.set btns
updateButton: (id, config) =>
Tracker.nonreactive =>
btns = @buttons.get()
updateButton = (id, config) ->
Tracker.nonreactive ->
btns = buttons.get()
if btns[id]
btns[id] = _.extend btns[id], config
@buttons.set btns
buttons.set btns
getButtons = (message) ->
allButtons = _.toArray buttons.get()
if message
allowedButtons = _.compact _.map allButtons, (button) ->
unless button.validation?
return true
if button.validation(message)
return button
else
allowedButtons = allButtons
return _.sortBy allowedButtons, 'order'
resetButtons = ->
buttons.set {}
addButton: addButton
removeButton: removeButton
updateButton: updateButton
getButtons: getButtons
resetButtons: resetButtons
Meteor.startup ->
RocketChat.MessageAction.addButton
id: 'edit-message'
icon: 'icon-pencil'
i18nLabel: 'rocketchat-lib:Edit'
action: (event, instance) ->
message = event.currentTarget.parentNode.parentNode
instance.chatMessages.edit(message)
$("\##{message.id} .message-dropdown").hide()
input = instance.find('.input-message')
Meteor.setTimeout ->
input.focus()
, 200
validation: (message) ->
return RocketChat.authz.hasAtLeastOnePermission('edit-message', message.rid ) or RocketChat.settings.get('Message_AllowEditing') and message.u?._id is Meteor.userId()
order: 1
RocketChat.MessageAction.addButton
id: 'delete-message'
icon: 'icon-trash-1'
i18nLabel: 'rocketchat-lib:Delete'
action: (event, instance) ->
message = @_arguments[1]
msg = event.currentTarget.parentNode.parentNode
$("\##{msg.id} .message-dropdown").hide()
getButtons: =>
return _.sortBy (_.toArray @buttons.get()), 'order'
return if msg.classList.contains("system")
swal {
title: t('Are_you_sure')
text: t('You_will_not_be_able_to_recover')
type: 'warning'
showCancelButton: true
confirmButtonColor: '#DD6B55'
confirmButtonText: t('Yes_delete_it')
cancelButtonText: t('Cancel')
closeOnConfirm: false
html: false
}, ->
swal
title: t('Deleted')
text: t('Your_entry_has_been_deleted')
type: 'success'
timer: 1000
showConfirmButton: false
resetButtons: =>
@buttons.set {}
instance.chatMessages.deleteMsg(message)
validation: (message) ->
return RocketChat.authz.hasAtLeastOnePermission('delete-message', message.rid ) or RocketChat.settings.get('Message_AllowDeleting') and message.u?._id is Meteor.userId()
order: 2

@ -0,0 +1,4 @@
{
"Edit": "Edit",
"Delete": "Delete"
}

@ -0,0 +1,4 @@
{
"Edit": "Editar",
"Delete": "Excluir"
}

@ -15,6 +15,19 @@ Package.onUse(function(api) {
api.use('underscore');
api.use('underscorestring:underscore.string');
// TAPi18n
api.use('templating', 'client');
var _ = Npm.require('underscore');
var fs = Npm.require('fs');
tapi18nFiles = _.compact(_.map(fs.readdirSync('packages/rocketchat-lib/i18n'), function(filename) {
if (fs.statSync('packages/rocketchat-lib/i18n/' + filename).size > 16) {
return 'i18n/' + filename;
}
}));
api.use(["tap:i18n@1.5.1"], ["client", "server"]);
api.imply('tap:i18n');
api.addFiles("package-tap.i18n", ["client", "server"]);
// COMMON
api.addFiles('lib/core.coffee');
api.addFiles('lib/callbacks.coffee');
@ -23,7 +36,6 @@ Package.onUse(function(api) {
api.addFiles('settings/lib/settings.coffee');
api.addFiles('settings/lib/rocketchat.coffee');
// CLIENT
api.addFiles('client/Notifications.coffee', 'client');
api.addFiles('client/TabBar.coffee', 'client');
@ -32,7 +44,6 @@ Package.onUse(function(api) {
api.addFiles('settings/client/startup.coffee', 'client');
api.addFiles('settings/client/rocketchat.coffee', 'client');
// SERVER
api.addFiles('server/functions/checkUsernameAvailability.coffee', 'server');
api.addFiles('server/functions/setUsername.coffee', 'server');
@ -47,6 +58,7 @@ Package.onUse(function(api) {
api.addFiles('server/Notifications.coffee', 'server');
// Settings
api.addFiles('settings/server/methods.coffee', 'server');
api.addFiles('settings/server/publication.coffee', 'server');
api.addFiles('settings/server/startup.coffee', 'server');
@ -55,6 +67,8 @@ Package.onUse(function(api) {
api.addFiles('server/cdn.coffee', 'server');
// TAPi18n -- needs to be added last
api.addFiles(tapi18nFiles, ["client", "server"]);
// EXPORT
api.export('RocketChat');

Loading…
Cancel
Save