parent
a3d6215dd3
commit
6ad7f4454a
@ -1,12 +0,0 @@ |
||||
RocketChat.ChannelSettingsMailMessages = new class |
||||
addCheckboxes = -> |
||||
$('.messages-box .wrapper .message').each (index, item) -> |
||||
$item = $(item) |
||||
unless $item.find('input[type=checkbox]').length |
||||
$item.prepend(HTML.toHTML(HTML.INPUT({type: 'checkbox', class: 'send-message', style: 'position: absolute; left: 0' }))); |
||||
|
||||
removeCheckboxes = -> |
||||
$('.messages-box .wrapper .message input[type=checkbox].send-message').remove() |
||||
|
||||
addCheckboxes: addCheckboxes |
||||
removeCheckboxes: removeCheckboxes |
@ -0,0 +1,24 @@ |
||||
.flex-tab { |
||||
.mail-message { |
||||
form { |
||||
margin-top: 20px; |
||||
|
||||
.input-line.double-col { |
||||
margin-bottom: 20px; |
||||
|
||||
label { |
||||
line-height: 15px; |
||||
} |
||||
|
||||
div { |
||||
line-height: 15px; |
||||
i.octicon { |
||||
font-size: 13px; |
||||
opacity: 0.4; |
||||
vertical-align: top; |
||||
} |
||||
} |
||||
} |
||||
} |
||||
} |
||||
} |
@ -1,8 +1,8 @@ |
||||
<template name="channelSettingsMailMessages"> |
||||
<div class="input-line double-col"> |
||||
<li> |
||||
<label>{{_ "Mail_Messages"}}</label> |
||||
<div> |
||||
<button type="button" class="button primary mail-messages">{{_ "Choose_messages"}}</button> |
||||
</div> |
||||
</div> |
||||
</li> |
||||
</template> |
||||
|
@ -1,17 +1,79 @@ |
||||
Template.mailMessagesInstructions.helpers |
||||
body: -> |
||||
return '' |
||||
name: -> |
||||
return Meteor.user().name |
||||
email: -> |
||||
return Meteor.user().emails?[0]?.address |
||||
roomName: -> |
||||
return ChatRoom.findOne(Session.get('openedRoom'))?.name |
||||
erroredEmails: -> |
||||
return Template.instance()?.erroredEmails.get().join(', ') |
||||
|
||||
Template.mailMessagesInstructions.events |
||||
'click .cancel': (e, t) -> |
||||
RocketChat.TabBar.setTemplate('channelSettings') |
||||
view = Blaze.getView($('.messages-box')[0]) |
||||
view?.templateInstance?().resetSelection?(false) |
||||
t.reset() |
||||
|
||||
'click .send': (e, t) -> |
||||
console.log 'sending' |
||||
t.$('.error').hide() |
||||
$btn = t.$('button.send') |
||||
oldBtnValue = $btn.html() |
||||
$btn.html(TAPi18n.__('Sending')) |
||||
|
||||
selectedMessages = $('.messages-box .message.selected') |
||||
|
||||
error = false |
||||
if selectedMessages.length is 0 |
||||
t.$('.error-select').show() |
||||
error = true |
||||
|
||||
if t.$('input[name=to]').val().trim() |
||||
rfcMailPatternWithName = /^(?:.*<)?([a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*)(?:>?)$/ |
||||
emails = t.$('input[name=to]').val().trim().split(',') |
||||
erroredEmails = [] |
||||
for email in emails |
||||
unless rfcMailPatternWithName.test email.trim() |
||||
erroredEmails.push email.trim() |
||||
|
||||
t.erroredEmails.set erroredEmails |
||||
if erroredEmails.length > 0 |
||||
t.$('.error-invalid-emails').show() |
||||
error = true |
||||
else |
||||
t.$('.error-missing-to').show() |
||||
error = true |
||||
|
||||
if error |
||||
$btn.html(oldBtnValue) |
||||
else |
||||
data = |
||||
rid: Session.get('openedRoom') |
||||
to: t.$('input[name=to]').val().trim() |
||||
subject: t.$('input[name=subject]').val().trim() |
||||
messages: selectedMessages.map((i, message) -> return message.id).toArray() |
||||
language: localStorage.getItem('userLanguage') |
||||
|
||||
Meteor.call 'mailMessages', data, (err, result) -> |
||||
$btn.html(oldBtnValue) |
||||
if err? |
||||
return toastr.error(err.reason or err.message) |
||||
|
||||
toastr.success(TAPi18n.__('Your_email_has_been_queued_for_sending')) |
||||
t.reset() |
||||
|
||||
'click .select-all': (e, t) -> |
||||
t.$('.error-select').hide() |
||||
|
||||
view = Blaze.getView($('.messages-box')[0]) |
||||
view?.templateInstance?().selectedMessages = _.pluck(ChatMessage.find({rid: Session.get('openedRoom')})?.fetch(), '_id') |
||||
$(".messages-box .message").addClass('selected') |
||||
|
||||
Template.mailMessagesInstructions.onCreated -> |
||||
@erroredEmails = new ReactiveVar [] |
||||
|
||||
@reset = -> |
||||
RocketChat.TabBar.setTemplate('channelSettings') |
||||
view = Blaze.getView($('.messages-box')[0]) |
||||
view?.templateInstance?().resetSelection?(false) |
||||
|
||||
@autorun => |
||||
if Session.get('channelSettingsMailMessages') isnt Session.get('openedRoom') |
||||
RocketChat.TabBar.setTemplate('channelSettings') |
||||
|
@ -0,0 +1,40 @@ |
||||
Meteor.methods |
||||
'mailMessages': (data) -> |
||||
if not Meteor.userId() |
||||
throw new Meteor.Error('invalid-user', "[methods] mailMessages -> Invalid user") |
||||
|
||||
check(data, Match.ObjectIncluding({ rid: String, to: String, subject: String, messages: [ String ], language: String })) |
||||
|
||||
room = Meteor.call 'canAccessRoom', data.rid, Meteor.userId() |
||||
unless room |
||||
throw new Meteor.Error('invalid-room', "[methods] mailMessages -> Invalid room") |
||||
|
||||
rfcMailPatternWithName = /^(?:.*<)?([a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*)(?:>?)$/ |
||||
emails = data.to.trim().split(',') |
||||
for email in emails |
||||
unless rfcMailPatternWithName.test email.trim() |
||||
throw new Meteor.Error('invalid-email', "[methods] mailMessages -> Invalid e-mail") |
||||
|
||||
user = Meteor.user() |
||||
name = user.name |
||||
email = user.emails?[0]?.address |
||||
|
||||
moment(data.language) |
||||
|
||||
html = "" |
||||
RocketChat.models.Messages.findByRoomIdAndMessageIds(data.rid, data.messages, { sort: { ts: 1 } }).forEach (message) -> |
||||
dateTime = moment(message.ts).format('L LT') |
||||
html += "<p style='margin-bottom: 5px'><b>#{message.u.username}</b> <span style='color: #aaa; font-size: 12px'>#{dateTime}</span><br />" + RocketChat.Message.parse(message, data.language) + "</p>" |
||||
|
||||
Meteor.defer -> |
||||
Email.send |
||||
to: emails |
||||
from: RocketChat.settings.get('From_Email') |
||||
replyTo: email |
||||
subject: data.subject |
||||
html: html |
||||
|
||||
console.log 'Sending email to ' + emails.join(', ') |
||||
|
||||
|
||||
return true |
@ -0,0 +1,26 @@ |
||||
RocketChat.Message = |
||||
parse: (msg, language) -> |
||||
messageType = RocketChat.MessageTypes.getType(msg) |
||||
if messageType?.render? |
||||
return messageType.render(msg) |
||||
else if messageType?.template? |
||||
# render template |
||||
else if messageType?.message? |
||||
if not language and localStorage?.getItem('userLanguage') |
||||
language = localStorage.getItem('userLanguage') |
||||
if messageType.data?(msg)? |
||||
return TAPi18n.__(messageType.message, messageType.data(msg), language) |
||||
else |
||||
return TAPi18n.__(messageType.message, {}, language) |
||||
else |
||||
if msg.u?.username is RocketChat.settings.get('Chatops_Username') |
||||
msg.html = msg.msg |
||||
return msg.html |
||||
|
||||
msg.html = msg.msg |
||||
if _.trim(msg.html) isnt '' |
||||
msg.html = _.escapeHTML msg.html |
||||
|
||||
# message = RocketChat.callbacks.run 'renderMessage', msg |
||||
msg.html = msg.html.replace /\n/gm, '<br/>' |
||||
return msg.html |
Loading…
Reference in new issue