diff --git a/app/autotranslate/client/lib/actionButton.js b/app/autotranslate/client/lib/actionButton.js index 41440be6b6ff..c1983132c4bd 100644 --- a/app/autotranslate/client/lib/actionButton.js +++ b/app/autotranslate/client/lib/actionButton.js @@ -11,9 +11,9 @@ Meteor.startup(function() { Tracker.autorun(function() { if (settings.get('AutoTranslate_Enabled') && hasAtLeastOnePermission(['auto-translate'])) { MessageAction.addButton({ - id: 'toggle-language', + id: 'translate', icon: 'language', - label: 'Toggle_original_translated', + label: 'Translate', context: [ 'message', 'message-mobile', @@ -30,7 +30,32 @@ Meteor.startup(function() { Messages.update({ _id: message._id }, { [action]: { autoTranslateShowInverse: true } }); }, condition(message) { - return message && message.u && message.u._id !== Meteor.userId(); + return message && message.u && message.u._id !== Meteor.userId() && message.translations && !message.translations.original; + }, + order: 90, + }); + MessageAction.addButton({ + id: 'view-original', + icon: 'language', + label: 'View_original', + context: [ + 'message', + 'message-mobile', + ], + action() { + const { msg: message } = messageArgs(this); + const language = AutoTranslate.getLanguage(message.rid); + if ((!message.translations || !message.translations[language])) { // } && !_.find(message.attachments, attachment => { return attachment.translations && attachment.translations[language]; })) { + AutoTranslate.messageIdsToWait[message._id] = true; + Messages.update({ _id: message._id }, { $set: { autoTranslateFetching: true } }); + Meteor.call('autoTranslate.translateMessage', message, language); + } + const action = message.autoTranslateShowInverse ? '$unset' : '$set'; + Messages.update({ _id: message._id }, { [action]: { autoTranslateShowInverse: true } }); + }, + condition(message) { + return message && message.u && message.u._id !== Meteor.userId() && message.translations && message.translations.original; + }, order: 90, }); diff --git a/app/message-mark-as-unread/client/actionButton.js b/app/message-mark-as-unread/client/actionButton.js index ae6afef256bc..620e97abec65 100644 --- a/app/message-mark-as-unread/client/actionButton.js +++ b/app/message-mark-as-unread/client/actionButton.js @@ -9,7 +9,7 @@ Meteor.startup(() => { MessageAction.addButton({ id: 'mark-message-as-unread', icon: 'flag', - label: 'Mark_as_unread', + label: 'Mark_unread', context: ['message', 'message-mobile'], action() { const { msg: message } = messageArgs(this); @@ -30,7 +30,7 @@ Meteor.startup(() => { condition(message) { return Meteor.userId() && message.u._id !== Meteor.userId(); }, - order: 22, + order: 10, group: 'menu', }); }); diff --git a/app/message-pin/client/actionButton.js b/app/message-pin/client/actionButton.js index 38fb313ac9af..9f17bd36f890 100644 --- a/app/message-pin/client/actionButton.js +++ b/app/message-pin/client/actionButton.js @@ -13,7 +13,7 @@ Meteor.startup(function() { MessageAction.addButton({ id: 'pin-message', icon: 'pin', - label: 'Pin_Message', + label: 'Pin', context: ['pinned', 'message', 'message-mobile'], action() { const { msg: message } = messageArgs(this); @@ -31,14 +31,14 @@ Meteor.startup(function() { return hasAtLeastOnePermission('pin-message', message.rid); }, - order: 20, + order: 7, group: 'menu', }); MessageAction.addButton({ id: 'unpin-message', icon: 'pin', - label: 'Unpin_Message', + label: 'Unpin', context: ['pinned', 'message', 'message-mobile'], action() { const { msg: message } = messageArgs(this); @@ -56,7 +56,7 @@ Meteor.startup(function() { return hasAtLeastOnePermission('pin-message', message.rid); }, - order: 21, + order: 8, group: 'menu', }); @@ -85,7 +85,7 @@ Meteor.startup(function() { MessageAction.addButton({ id: 'permalink-pinned', icon: 'permalink', - label: 'Permalink', + label: 'Get_link', classes: 'clipboard', context: ['pinned'], async action(event) { diff --git a/app/message-snippet/client/actionButton.js b/app/message-snippet/client/actionButton.js index e50c89c767ca..342ff2b2854d 100644 --- a/app/message-snippet/client/actionButton.js +++ b/app/message-snippet/client/actionButton.js @@ -1,68 +1,69 @@ -import { Meteor } from 'meteor/meteor'; -import { MessageAction, modal } from '../../ui-utils'; -import { messageArgs } from '../../ui-utils/client/lib/messageArgs'; -import { t, handleError } from '../../utils'; -import { settings } from '../../settings'; -import { Subscriptions } from '../../models'; -import { hasAtLeastOnePermission } from '../../authorization'; - -Meteor.startup(function() { - MessageAction.addButton({ - id: 'snippeted-message', - icon: 'code', - label: 'Snippet', - context: [ - 'snippeted', - 'message', - 'message-mobile', - ], - order: 10, - group: 'menu', - action() { - const { msg: message } = messageArgs(this); - - modal.open({ - title: 'Create a Snippet', - text: 'The name of your snippet (with file extension):', - type: 'input', - showCancelButton: true, - closeOnConfirm: false, - inputPlaceholder: 'Snippet name', - }, function(filename) { - if (filename === false) { - return false; - } - if (filename === '') { - modal.showInputError('You need to write something!'); - return false; - } - message.snippeted = true; - Meteor.call('snippetMessage', message, filename, function(error) { - if (error) { - return handleError(error); - } - modal.open({ - title: t('Nice'), - text: `Snippet '${ filename }' created.`, - type: 'success', - timer: 2000, - }); - }); - }); - - }, - condition(message) { - if (Subscriptions.findOne({ rid: message.rid, 'u._id': Meteor.userId() }) === undefined) { - return false; - } - - if (message.snippeted || ((settings.get('Message_AllowSnippeting') === undefined) || - (settings.get('Message_AllowSnippeting') === null) || - (settings.get('Message_AllowSnippeting')) === false)) { - return false; - } - - return hasAtLeastOnePermission('snippet-message', message.rid); - }, - }); -}); +// import { Meteor } from 'meteor/meteor'; +// import { MessageAction, modal } from '../../ui-utils'; +// import { messageArgs } from '../../ui-utils/client/lib/messageArgs'; +// import { t, handleError } from '../../utils'; +// import { settings } from '../../settings'; +// import { Subscriptions } from '../../models'; +// import { hasAtLeastOnePermission } from '../../authorization'; +// +// Meteor.startup(function() { +// MessageAction.addButton({ +// id: 'snippeted-message', +// icon: 'code', +// label: 'Snippet', +// context: [ +// 'snippeted', +// 'message', +// 'message-mobile', +// ], +// order: 10, +// group: 'menu', +// action() { +// const { msg: message } = messageArgs(this); +// +// modal.open({ +// title: 'Create a Snippet', +// text: 'The name of your snippet (with file extension):', +// type: 'input', +// showCancelButton: true, +// closeOnConfirm: false, +// inputPlaceholder: 'Snippet name', +// }, function(filename) { +// if (filename === false) { +// return false; +// } +// if (filename === '') { +// modal.showInputError('You need to write something!'); +// return false; +// } +// message.snippeted = true; +// Meteor.call('snippetMessage', message, filename, function(error) { +// if (error) { +// return handleError(error); +// } +// modal.open({ +// title: t('Nice'), +// text: `Snippet '${ filename }' created.`, +// type: 'success', +// timer: 2000, +// }); +// }); +// }); +// +// }, +// condition(message) { +// if (Subscriptions.findOne({ rid: message.rid, 'u._id': Meteor.userId() }) === undefined) { +// return false; +// } +// +// if (message.snippeted || ((settings.get('Message_AllowSnippeting') === undefined) || +// (settings.get('Message_AllowSnippeting') === null) || +// (settings.get('Message_AllowSnippeting')) === false)) { +// return false; +// } +// +// return hasAtLeastOnePermission('snippet-message', message.rid); +// }, +// }); +// +// }); diff --git a/app/message-star/client/actionButton.js b/app/message-star/client/actionButton.js index bb6d6c50329e..c528cd55810f 100644 --- a/app/message-star/client/actionButton.js +++ b/app/message-star/client/actionButton.js @@ -11,7 +11,7 @@ Meteor.startup(function() { MessageAction.addButton({ id: 'star-message', icon: 'star', - label: 'Star_Message', + label: 'Star', context: ['starred', 'message', 'message-mobile'], action() { const { msg: message } = messageArgs(this); @@ -29,7 +29,7 @@ Meteor.startup(function() { return !message.starred || !message.starred.find((star) => star._id === Meteor.userId()); }, - order: 10, + order: 9, group: 'menu', }); @@ -54,7 +54,7 @@ Meteor.startup(function() { return message.starred && message.starred.find((star) => star._id === Meteor.userId()); }, - order: 10, + order: 9, group: 'menu', }); @@ -83,7 +83,7 @@ Meteor.startup(function() { MessageAction.addButton({ id: 'permalink-star', icon: 'permalink', - label: 'Permalink', + label: 'Get_link', classes: 'clipboard', context: ['starred'], async action(event) { diff --git a/app/threads/client/index.js b/app/threads/client/index.js index 6ddd27945ba9..5331d52fbc5e 100644 --- a/app/threads/client/index.js +++ b/app/threads/client/index.js @@ -4,3 +4,5 @@ import './flextab/threads'; import './threads.css'; import './messageAction/follow'; import './messageAction/unfollow'; +import './messageAction/replyInThread'; + diff --git a/app/threads/client/messageAction/follow.js b/app/threads/client/messageAction/follow.js index 4bf89c0c51cb..8e4d20ec0755 100644 --- a/app/threads/client/messageAction/follow.js +++ b/app/threads/client/messageAction/follow.js @@ -15,7 +15,7 @@ Meteor.startup(function() { id: 'follow-message', icon: 'bell', label: 'Follow_message', - context: ['message', 'message-mobile', 'threads'], + context: ['threads'], async action() { const { msg } = messageArgs(this); call('followMessage', { mid: msg._id }); diff --git a/app/threads/client/messageAction/replyInThread.js b/app/threads/client/messageAction/replyInThread.js new file mode 100644 index 000000000000..337bd5ba7399 --- /dev/null +++ b/app/threads/client/messageAction/replyInThread.js @@ -0,0 +1,41 @@ +import { Meteor } from 'meteor/meteor'; +import { Tracker } from 'meteor/tracker'; + +import { settings } from '../../../settings/client'; +import { MessageAction } from '../../../ui-utils/client'; +import { messageArgs } from '../../../ui-utils/client/lib/messageArgs'; +import { chatMessages } from '../../../ui/client'; +import { addMessageToList } from '../../../ui-utils/client/lib/MessageAction'; +import { Subscriptions } from '../../../models/client'; + +Meteor.startup(function() { + Tracker.autorun(() => { + if (!settings.get('Threads_enabled')) { + return MessageAction.removeButton('reply-in-thread'); + } + MessageAction.addButton({ + id: 'reply-in-thread', + icon: 'thread', + label: 'Reply_in_thread', + context: ['message', 'message-mobile', 'threads'], + action() { + const { msg: message } = messageArgs(this); + const { input } = chatMessages[message.rid]; + const $input = $(input); + + const messages = addMessageToList($input.data('reply') || [], message, input); + + $(input) + .focus() + .data('mention-user', true) + .data('reply', messages) + .trigger('dataChange'); + }, + condition(message) { + return Boolean(Subscriptions.findOne({ rid: message.rid })); + }, + order: 1, + group: 'menu', + }); + }); +}); diff --git a/app/threads/client/messageAction/unfollow.js b/app/threads/client/messageAction/unfollow.js index 1f54ad1dcea1..49dfdd74addf 100644 --- a/app/threads/client/messageAction/unfollow.js +++ b/app/threads/client/messageAction/unfollow.js @@ -15,7 +15,7 @@ Meteor.startup(function() { id: 'unfollow-message', icon: 'bell-off', label: 'Unfollow_message', - context: ['message', 'message-mobile', 'threads'], + context: ['threads'], async action() { const { msg } = messageArgs(this); call('unfollowMessage', { mid: msg._id }); diff --git a/app/ui-master/public/icons/discussion.svg b/app/ui-master/public/icons/discussion.svg new file mode 100644 index 000000000000..f36cd50aa7a4 --- /dev/null +++ b/app/ui-master/public/icons/discussion.svg @@ -0,0 +1,3 @@ + + + diff --git a/app/ui-master/public/icons/reply-directly.svg b/app/ui-master/public/icons/reply-directly.svg new file mode 100644 index 000000000000..5334f969cc9b --- /dev/null +++ b/app/ui-master/public/icons/reply-directly.svg @@ -0,0 +1,3 @@ + + + diff --git a/app/ui-master/public/icons/report.svg b/app/ui-master/public/icons/report.svg new file mode 100644 index 000000000000..a0d1db38d62b --- /dev/null +++ b/app/ui-master/public/icons/report.svg @@ -0,0 +1,3 @@ + + + diff --git a/app/ui-message/client/messageBox/messageBox.js b/app/ui-message/client/messageBox/messageBox.js index acde75b6b59c..9d0a3f323a34 100644 --- a/app/ui-message/client/messageBox/messageBox.js +++ b/app/ui-message/client/messageBox/messageBox.js @@ -98,6 +98,11 @@ Template.messageBox.onCreated(function() { }); Template.messageBox.onRendered(function() { + const $input = $(this.find('.js-input-message')); + $input.on('dataChange', () => { + const messages = $input.data('reply') || []; + this.replyMessageData.set(messages); + }); this.autorun(() => { const { rid, subscription } = Template.currentData(); const room = Session.get(`roomData${ rid }`); @@ -156,12 +161,6 @@ Template.messageBox.onRendered(function() { const shadow = this.find('.js-input-message-shadow'); this.autogrow = setupAutogrow(input, shadow, onResize); - - const $input = $(input); - $input.on('dataChange', () => { - const messages = $input.data('reply') || []; - this.replyMessageData.set(messages); - }); }); }); }); diff --git a/app/ui-sidenav/client/sidebarItem.js b/app/ui-sidenav/client/sidebarItem.js index 09b70bc82ffe..2e82468248bd 100644 --- a/app/ui-sidenav/client/sidebarItem.js +++ b/app/ui-sidenav/client/sidebarItem.js @@ -144,14 +144,14 @@ Template.sidebarItem.events({ if (this.alert) { items.push({ icon: 'flag', - name: t('Mark_as_read'), + name: t('Mark_read'), type: 'sidebar-item', id: 'read', }); } else { items.push({ icon: 'flag', - name: t('Mark_as_unread'), + name: t('Mark_unread'), type: 'sidebar-item', id: 'unread', }); diff --git a/app/ui-utils/client/lib/MessageAction.js b/app/ui-utils/client/lib/MessageAction.js index 2b9540a7c3d4..a42fef4c48f1 100644 --- a/app/ui-utils/client/lib/MessageAction.js +++ b/app/ui-utils/client/lib/MessageAction.js @@ -10,11 +10,12 @@ import { ReactiveVar } from 'meteor/reactive-var'; import { Tracker } from 'meteor/tracker'; import { Session } from 'meteor/session'; -import { t, handleError, roomTypes, canDeleteMessage } from '../../../utils/client'; +import { roomTypes, canDeleteMessage } from '../../../utils/client'; import { messageArgs } from './messageArgs'; import { Messages, Rooms, Subscriptions } from '../../../models/client'; import { hasAtLeastOnePermission } from '../../../authorization/client'; import { settings } from '../../../settings/client'; +import { modal } from './modal'; const call = (method, ...args) => new Promise((resolve, reject) => { Meteor.call(method, ...args, function(err, data) { @@ -25,18 +26,7 @@ const call = (method, ...args) => new Promise((resolve, reject) => { }); }); -const success = function success(fn) { - return function(error, result) { - if (error) { - return handleError(error); - } - if (result) { - fn.call(this, result); - } - }; -}; - -const addMessageToList = (messagesList, message) => { +export const addMessageToList = (messagesList, message) => { // checks if the message is not already on the list if (!messagesList.find(({ _id }) => _id === message._id)) { messagesList.push(message); @@ -156,94 +146,56 @@ export const MessageAction = new class { Meteor.startup(async function() { const { chatMessages } = await import('../../../ui'); MessageAction.addButton({ - id: 'reply-message', - icon: 'reply', - label: 'Reply', + id: 'reply-directly', + icon: 'reply-directly', + label: 'Reply_in_direct_message', context: ['message', 'message-mobile'], action() { - const { msg: message } = messageArgs(this); - const { input } = chatMessages[message.rid]; - const $input = $(input); - - const messages = addMessageToList($input.data('reply') || [], message, input); - - $(input) - .focus() - .data('mention-user', true) - .data('reply', messages) - .trigger('dataChange'); + const { msg } = messageArgs(this); + roomTypes.openRouteLink('d', { name: msg.u.username }, { + ...FlowRouter.current().queryParams, + reply: msg._id, + }); }, condition(message) { if (Subscriptions.findOne({ rid: message.rid }) == null) { return false; } - - return true; - }, - order: 1, - group: 'menu', - }); - - MessageAction.addButton({ - id: 'edit-message', - icon: 'edit', - label: 'Edit', - context: ['message', 'message-mobile'], - action() { - const { msg } = messageArgs(this); - chatMessages[Session.get('openedRoom')].edit(document.getElementById(msg._id)); - }, - condition(message) { - if (Subscriptions.findOne({ - rid: message.rid, - }) == null) { + if (roomTypes.getRoomType(message.rid) === 'd') { return false; } - const hasPermission = hasAtLeastOnePermission('edit-message', message.rid); - const isEditAllowed = settings.get('Message_AllowEditing'); - const editOwn = message.u && message.u._id === Meteor.userId(); - if (!(hasPermission || (isEditAllowed && editOwn))) { - return; - } - const blockEditInMinutes = settings.get('Message_AllowEditing_BlockEditInMinutes'); - if (blockEditInMinutes) { - let msgTs; - if (message.ts != null) { - msgTs = moment(message.ts); - } - let currentTsDiff; - if (msgTs != null) { - currentTsDiff = moment().diff(msgTs, 'minutes'); - } - return currentTsDiff < blockEditInMinutes; - } else { - return true; - } + return true; }, order: 2, group: 'menu', }); MessageAction.addButton({ - id: 'delete-message', - icon: 'trash', - label: 'Delete', + id: 'quote-message', + icon: 'quote', + label: 'Quote', context: ['message', 'message-mobile'], - color: 'alert', action() { const { msg: message } = messageArgs(this); - chatMessages[Session.get('openedRoom')].confirmDeleteMsg(message); + const { input } = chatMessages[message.rid]; + const $input = $(input); + + let messages = $input.data('reply') || []; + + messages = addMessageToList(messages, message, input); + + $input + .focus() + .data('mention-user', false) + .data('reply', messages) + .trigger('dataChange'); }, condition(message) { if (Subscriptions.findOne({ rid: message.rid }) == null) { return false; } - return canDeleteMessage({ - rid: message.rid, - ts: message.ts, - uid: message.u._id, - }); + return true; }, order: 3, group: 'menu', @@ -252,7 +204,7 @@ Meteor.startup(async function() { MessageAction.addButton({ id: 'permalink', icon: 'permalink', - label: 'Permalink', + label: 'Get_link', classes: 'clipboard', context: ['message', 'message-mobile'], async action(event) { @@ -295,92 +247,114 @@ Meteor.startup(async function() { }); MessageAction.addButton({ - id: 'quote-message', - icon: 'quote', - label: 'Quote', + id: 'edit-message', + icon: 'edit', + label: 'Edit', context: ['message', 'message-mobile'], action() { - const { msg: message } = messageArgs(this); - const { input } = chatMessages[message.rid]; - const $input = $(input); - - let messages = $input.data('reply') || []; - - messages = addMessageToList(messages, message, input); - - $input - .focus() - .data('mention-user', false) - .data('reply', messages) - .trigger('dataChange'); + const { msg } = messageArgs(this); + chatMessages[Session.get('openedRoom')].edit(document.getElementById(msg._id)); }, condition(message) { - if (Subscriptions.findOne({ rid: message.rid }) == null) { + if (Subscriptions.findOne({ + rid: message.rid, + }) == null) { return false; } - return true; + const hasPermission = hasAtLeastOnePermission('edit-message', message.rid); + const isEditAllowed = settings.get('Message_AllowEditing'); + const editOwn = message.u && message.u._id === Meteor.userId(); + if (!(hasPermission || (isEditAllowed && editOwn))) { + return; + } + const blockEditInMinutes = settings.get('Message_AllowEditing_BlockEditInMinutes'); + if (blockEditInMinutes) { + let msgTs; + if (message.ts != null) { + msgTs = moment(message.ts); + } + let currentTsDiff; + if (msgTs != null) { + currentTsDiff = moment().diff(msgTs, 'minutes'); + } + return currentTsDiff < blockEditInMinutes; + } else { + return true; + } }, order: 6, group: 'menu', }); MessageAction.addButton({ - id: 'reply-privately', - icon: 'chat', - label: 'Reply_in_direct_message', + id: 'delete-message', + icon: 'trash', + label: 'Delete', context: ['message', 'message-mobile'], + color: 'alert', action() { - const { msg } = messageArgs(this); - roomTypes.openRouteLink('d', { name: msg.u.username }, { ...FlowRouter.current().queryParams, reply: msg._id }); + const { msg: message } = messageArgs(this); + chatMessages[Session.get('openedRoom')].confirmDeleteMsg(message); }, condition(message) { if (Subscriptions.findOne({ rid: message.rid }) == null) { return false; } - if (roomTypes.getRoomType(message.rid) === 'd') { - return false; - } - return true; + + return canDeleteMessage({ + rid: message.rid, + ts: message.ts, + uid: message.u._id, + }); }, - order: 7, + order: 18, group: 'menu', }); MessageAction.addButton({ - id: 'ignore-user', - icon: 'ban', - label: t('Ignore'), + id: 'report-message', + icon: 'report', + label: 'Report', context: ['message', 'message-mobile'], + color: 'alert', action() { - const { msg: { rid, u: { _id } } } = messageArgs(this); - Meteor.call('ignoreUser', { rid, userId:_id, ignore: true }, success(() => toastr.success(t('User_has_been_ignored')))); - }, - condition(message) { - const subscription = Subscriptions.findOne({ rid: message.rid }); + const { msg: message } = messageArgs(this); + modal.open({ + title: TAPi18n.__('Report_this_message_question_mark'), + text: message.msg, + inputPlaceholder: TAPi18n.__('Why_do_you_want_to_report_question_mark'), + type: 'input', + showCancelButton: true, + confirmButtonColor: '#DD6B55', + confirmButtonText: TAPi18n.__('Report_exclamation_mark'), + cancelButtonText: TAPi18n.__('Cancel'), + closeOnConfirm: false, + html: false, + }, (inputValue) => { + if (inputValue === false) { + return false; + } - return Meteor.userId() !== message.u._id && !(subscription && subscription.ignored && subscription.ignored.indexOf(message.u._id) > -1); - }, - order: 20, - group: 'menu', - }); + if (inputValue === '') { + modal.showInputError(TAPi18n.__('You_need_to_write_something')); + return false; + } - MessageAction.addButton({ - id: 'unignore-user', - icon: 'ban', - label: t('Unignore'), - context: ['message', 'message-mobile'], - action() { - const { msg: { rid, u: { _id } } } = messageArgs(this); - Meteor.call('ignoreUser', { rid, userId:_id, ignore: false }, success(() => toastr.success(t('User_has_been_unignored')))); + Meteor.call('reportMessage', message._id, inputValue); + modal.open({ + title: TAPi18n.__('Report_sent'), + text: TAPi18n.__('Thank_you_exclamation_mark '), + type: 'success', + timer: 1000, + showConfirmButton: false, + }); + }); }, condition(message) { - const subscription = Subscriptions.findOne({ rid: message.rid }, { fields: { ignored: 1 } }); - return Meteor.userId() !== message.u._id && subscription && subscription.ignored && subscription.ignored.indexOf(message.u._id) > -1; + return Boolean(Subscriptions.findOne({ rid: message.rid })); }, - order: 20, + order: 17, group: 'menu', }); - - }); diff --git a/app/ui-utils/client/lib/popover.js b/app/ui-utils/client/lib/popover.js index 46d4ce4ff8ca..f7fbdd75d5b0 100644 --- a/app/ui-utils/client/lib/popover.js +++ b/app/ui-utils/client/lib/popover.js @@ -3,13 +3,10 @@ import { Meteor } from 'meteor/meteor'; import { Blaze } from 'meteor/blaze'; import { FlowRouter } from 'meteor/kadira:flow-router'; import { Template } from 'meteor/templating'; -import { TAPi18n } from 'meteor/tap:i18n'; -import { isRtl, handleError } from '../../../utils'; -import { messageArgs } from './messageArgs'; -import { ChatSubscription } from '../../../models'; +import { isRtl, handleError } from '../../../utils/client'; +import { ChatSubscription } from '../../../models/client'; import _ from 'underscore'; import { hide, leave } from './ChannelActions'; -import { modal } from './modal'; import { messageBox } from './messageBox'; import { MessageAction } from './MessageAction'; import { RoomManager } from './RoomManager'; @@ -178,42 +175,6 @@ Template.popover.events({ popover.close(); return false; } - - if (e.currentTarget.dataset.id === 'report-abuse') { - const { msg: message } = messageArgs(t.data.data); - modal.open({ - title: TAPi18n.__('Report_this_message_question_mark'), - text: message.msg, - inputPlaceholder: TAPi18n.__('Why_do_you_want_to_report_question_mark'), - type: 'input', - showCancelButton: true, - confirmButtonColor: '#DD6B55', - confirmButtonText: TAPi18n.__('Report_exclamation_mark'), - cancelButtonText: TAPi18n.__('Cancel'), - closeOnConfirm: false, - html: false, - }, (inputValue) => { - if (inputValue === false) { - return false; - } - - if (inputValue === '') { - modal.showInputError(TAPi18n.__('You_need_to_write_something')); - return false; - } - - Meteor.call('reportMessage', message._id, inputValue); - - modal.open({ - title: TAPi18n.__('Report_sent'), - text: TAPi18n.__('Thank_you_exclamation_mark '), - type: 'success', - timer: 1000, - showConfirmButton: false, - }); - }); - popover.close(); - } }, 'click [data-type="sidebar-item"]'(e, instance) { popover.close(); diff --git a/app/ui/client/views/app/room.js b/app/ui/client/views/app/room.js index 0b12c3013151..5c36855fd8fb 100644 --- a/app/ui/client/views/app/room.js +++ b/app/ui/client/views/app/room.js @@ -779,13 +779,16 @@ Template.room.events({ id: item.id, modifier: item.color, })); - const [items, deleteItem] = allItems.reduce((result, value) => (result[value.id === 'delete-message' ? 1 : 0].push(value), result), [[], []]); + const itemsBelowDivider = [ + 'delete-message', + 'report-message', + ]; + const [items, alertsItem] = allItems.reduce((result, value) => (result[itemsBelowDivider.includes(value.id) ? 1 : 0].push(value), result), [[], []]); const groups = [{ items }]; - if (deleteItem.length) { - groups.push({ items: deleteItem }); + if (alertsItem .length) { + groups.push({ items: alertsItem }); } - const config = { columns: [ { diff --git a/imports/message-read-receipt/client/room.js b/imports/message-read-receipt/client/room.js index 71357b3b58ac..89d678b2d877 100644 --- a/imports/message-read-receipt/client/room.js +++ b/imports/message-read-receipt/client/room.js @@ -6,12 +6,12 @@ import { settings } from '../../../app/settings'; MessageAction.addButton({ id: 'receipt-detail', icon: 'info-circled', - label: 'Message_info', + label: 'Info', context: ['starred', 'message', 'message-mobile'], action() { const { msg: message } = messageArgs(this); modal.open({ - title: t('Message_info'), + title: t('Info'), content: 'readReceipts', data: { messageId: message._id, @@ -24,6 +24,6 @@ MessageAction.addButton({ condition() { return settings.get('Message_Read_Receipt_Store_Users'); }, - order: 1, + order: 10, group: 'menu', }); diff --git a/packages/rocketchat-i18n/i18n/en.i18n.json b/packages/rocketchat-i18n/i18n/en.i18n.json index 8ee97937e08a..3a44700a18ef 100644 --- a/packages/rocketchat-i18n/i18n/en.i18n.json +++ b/packages/rocketchat-i18n/i18n/en.i18n.json @@ -663,6 +663,7 @@ "Convert_Ascii_Emojis": "Convert ASCII to Emoji", "Copied": "Copied", "Copy": "Copy", + "Copy_text": "Copy Text", "Copy_to_clipboard": "Copy to clipboard", "COPY_TO_CLIPBOARD": "COPY TO CLIPBOARD", "could-not-access-webdav": "Could not access WebDAV", @@ -1424,6 +1425,7 @@ "Full_Screen": "Full Screen", "Gaming": "Gaming", "General": "General", + "Get_link": "Get Link", "github_no_public_email": "You don't have any email as public email in your GitHub account", "Give_a_unique_name_for_the_custom_oauth": "Give a unique name for the custom oauth", "Give_the_application_a_name_This_will_be_seen_by_your_users": "Give the application a name. This will be seen by your users.", @@ -1934,6 +1936,8 @@ "Mark_all_as_read": "Mark all messages (in all channels) as read", "Mark_as_read": "Mark As Read", "Mark_as_unread": "Mark As Unread", + "Mark_read": "Mark Read", + "Mark_unread": "Mark Unread", "Markdown_Headers": "Allow Markdown headers in messages", "Markdown_Marked_Breaks": "Enable Marked Breaks", "Markdown_Marked_GFM": "Enable Marked GFM", @@ -2238,6 +2242,7 @@ "Permissions": "Permissions", "Personal_Access_Tokens": "Personal Access Tokens", "Phone_number": "Phone number", + "Pin": "Pin", "pin-message": "Pin Message", "pin-message_description": "Permission to pin a message in a channel", "Pin_Message": "Pin Message", @@ -2414,8 +2419,10 @@ "Replied_on": "Replied on", "Replies": "Replies", "Reply": "Reply", + "Reply_in_thread": "Reply in Thread", "Reply_in_direct_message": "Reply in Direct Message", "ReplyTo": "Reply-To", + "Report": "Report", "Report_Abuse": "Report Abuse", "Report_exclamation_mark": "Report!", "Report_sent": "Report sent", @@ -2694,6 +2701,7 @@ "Sound": "Sound", "Sound_File_mp3": "Sound File (mp3)", "SSL": "SSL", + "Star": "Star", "Star_Message": "Star Message", "Starred_Messages": "Starred Messages", "Start": "Start", @@ -2895,6 +2903,7 @@ "Transcript_Enabled": "Ask Visitor if They Would Like a Transcript After Chat Closed", "Transcript_message": "Message to Show When Asking About Transcript", "Transcript_of_your_livechat_conversation": "Transcript of your livechat conversation.", + "Translate": "Translate", "Translated": "Translated", "Translations": "Translations", "Travel_and_Places": "Travel & Places", @@ -2939,6 +2948,7 @@ "Unmute_someone_in_room": "Unmute someone in the room", "Unmute_user": "Unmute user", "Unnamed": "Unnamed", + "Unpin": "Unpin", "Unpin_Message": "Unpin Message", "Unread": "Unread", "Unread_Count": "Unread Count", @@ -3123,6 +3133,7 @@ "View_All": "View All Members", "View_Logs": "View Logs", "View_mode": "View Mode", + "View_original": "View Original", "Viewing_room_administration": "Viewing room administration", "View_the_Logs_for": "View the logs for: \"__name__\"", "Visibility": "Visibility", diff --git a/private/public/icons.svg b/private/public/icons.svg index 3c91828d41b5..6ae97ffaea94 100644 --- a/private/public/icons.svg +++ b/private/public/icons.svg @@ -83,8 +83,8 @@ - - + + @@ -266,9 +266,15 @@ + + + + + + @@ -362,4 +368,4 @@ - + \ No newline at end of file diff --git a/public/public/icons.html b/public/public/icons.html index a7f74b2671f8..050d518c5196 100644 --- a/public/public/icons.html +++ b/public/public/icons.html @@ -22,7 +22,7 @@ height: 20px; color: blue; } -
+
@@ -107,6 +107,9 @@ + + + @@ -287,9 +290,15 @@ + + + + + + @@ -383,4 +392,4 @@ -
+
\ No newline at end of file diff --git a/tests/pageobjects/main-content.page.js b/tests/pageobjects/main-content.page.js index d54c492db622..4c7f9ecf3ca7 100644 --- a/tests/pageobjects/main-content.page.js +++ b/tests/pageobjects/main-content.page.js @@ -35,7 +35,7 @@ class MainContent extends Page { get lastMessageQuote() { return browser.element('.message:last-child .thread-quote'); } get messageOptionsBtn() { return browser.element('.message:last-child .message-actions__menu'); } get messageActionMenu() { return browser.element('.rc-popover .rc-popover__content'); } - get messageReply() { return browser.element('[data-id="reply-message"][data-type="message-action"]'); } + get messageReply() { return browser.element('[data-id="reply-in-thread"][data-type="message-action"]'); } get messageEdit() { return browser.element('[data-id="edit-message"][data-type="message-action"]'); } get messageDelete() { return browser.element('[data-id="delete-message"][data-type="message-action"]'); } get messagePermalink() { return browser.element('[data-id="permalink"][data-type="message-action"]'); }