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;
}
-