From db30bd712ec7af98251259240768acdcb53083b5 Mon Sep 17 00:00:00 2001 From: Guilherme Gazzo Date: Wed, 18 Apr 2018 22:03:13 -0300 Subject: [PATCH 01/20] added ignored flag on messages --- .../server/lib/sendNotificationsOnMessage.js | 10 ++-- .../server/models/Subscriptions.js | 15 ++++++ .../client/imports/components/messages.css | 4 ++ .../client/tabs/membersList.html | 2 +- .../client/tabs/membersList.js | 11 +++-- .../client/tabs/userActions.js | 23 ++++++++- .../rocketchat-ui-message/client/message.html | 2 +- .../rocketchat-ui-message/client/message.js | 3 ++ .../client/lib/RoomHistoryManager.js | 47 ++++++++----------- .../rocketchat-ui/client/lib/RoomManager.js | 34 ++++++-------- server/methods/ignoreUser.js | 29 ++++++++++++ server/publications/subscription.js | 3 +- 12 files changed, 125 insertions(+), 58 deletions(-) create mode 100644 server/methods/ignoreUser.js diff --git a/packages/rocketchat-lib/server/lib/sendNotificationsOnMessage.js b/packages/rocketchat-lib/server/lib/sendNotificationsOnMessage.js index 16c425a8a6dd6..40223c8ffa71d 100644 --- a/packages/rocketchat-lib/server/lib/sendNotificationsOnMessage.js +++ b/packages/rocketchat-lib/server/lib/sendNotificationsOnMessage.js @@ -206,11 +206,9 @@ RocketChat.callbacks.add('afterSaveMessage', function(message, room, userId) { const maxMembersForNotification = RocketChat.settings.get('Notifications_Max_Room_Members'); const disableAllMessageNotifications = room.usernames.length > maxMembersForNotification && maxMembersForNotification !== 0; const subscriptions = RocketChat.models.Subscriptions.findNotificationPreferencesByRoom(room._id, disableAllMessageNotifications); - const userIds = []; - subscriptions.forEach((s) => { - userIds.push(s.u._id); - }); + const userIds = subscriptions.map(s => userIds.push(s.u._id)); const users = {}; + RocketChat.models.Users.findUsersByIds(userIds, { fields: { 'settings.preferences': 1 } }).forEach((user) => { users[user._id] = user; }); @@ -223,6 +221,10 @@ RocketChat.callbacks.add('afterSaveMessage', function(message, room, userId) { return; } + if (subscription.ignored && subscription.ignored.find(message.u._id)) { + return; + } + const { audioNotifications = RocketChat.getUserPreference(users[subscription.u._id], 'audioNotifications'), desktopNotifications = RocketChat.getUserPreference(users[subscription.u._id], 'desktopNotifications'), diff --git a/packages/rocketchat-lib/server/models/Subscriptions.js b/packages/rocketchat-lib/server/models/Subscriptions.js index 9e585150bf012..116751db301d8 100644 --- a/packages/rocketchat-lib/server/models/Subscriptions.js +++ b/packages/rocketchat-lib/server/models/Subscriptions.js @@ -454,6 +454,21 @@ class ModelSubscriptions extends RocketChat.models._Base { return this.update(query, update, { multi: true }); } + ignoreUser({_id, ignoredUser : ignored, ignore = true}) { + const query = { + _id + }; + const update = { + }; + if (ignore) { + update.$addToSet = { ignored }; + } else { + update.$pull = { ignored }; + } + + return this.update(query, update); + } + setAlertForRoomIdExcludingUserId(roomId, userId) { const query = { rid: roomId, diff --git a/packages/rocketchat-theme/client/imports/components/messages.css b/packages/rocketchat-theme/client/imports/components/messages.css index 16e1b2986988a..892f1852f8677 100644 --- a/packages/rocketchat-theme/client/imports/components/messages.css +++ b/packages/rocketchat-theme/client/imports/components/messages.css @@ -41,6 +41,10 @@ } .message { + + &--ignored { + background: red; + } &.active { & .message-actions__label { color: var(--rc-color-button-primary); diff --git a/packages/rocketchat-ui-flextab/client/tabs/membersList.html b/packages/rocketchat-ui-flextab/client/tabs/membersList.html index 651b3e73f1a5f..d9c415a730356 100644 --- a/packages/rocketchat-ui-flextab/client/tabs/membersList.html +++ b/packages/rocketchat-ui-flextab/client/tabs/membersList.html @@ -37,7 +37,7 @@ {{> avatar username=user.username}}
- {{displayName}} {{utcOffset}} + {{ignored}} {{displayName}} {{utcOffset}}
{{> icon user=. block="rc-member-list__menu js-action" icon="menu" }} diff --git a/packages/rocketchat-ui-flextab/client/tabs/membersList.js b/packages/rocketchat-ui-flextab/client/tabs/membersList.js index a17fa52ddb79b..9514f15839b5e 100644 --- a/packages/rocketchat-ui-flextab/client/tabs/membersList.js +++ b/packages/rocketchat-ui-flextab/client/tabs/membersList.js @@ -3,6 +3,11 @@ import _ from 'underscore'; import {getActions} from './userActions'; Template.membersList.helpers({ + ignored() { + const {user} = this; + const sub = RocketChat.models.Subscriptions.findOne({rid: Session.get('openedRoom')}); + return sub.ignored && sub.ignored.indexOf(user._id) > -1 ? '(ignorado)' : ''; + }, tAddUsers() { return t('Add_users'); }, @@ -63,7 +68,7 @@ Template.membersList.helpers({ return { user, - status: (onlineUsers[user.username] != null ? onlineUsers[user.username].status : undefined), + status: (onlineUsers[user.username] != null ? onlineUsers[user.username].status : 'offline'), muted: Array.from(roomMuted).includes(user.username), utcOffset }; @@ -76,7 +81,7 @@ Template.membersList.helpers({ } // show online users first. // sortBy is stable, so we can do this - users = _.sortBy(users, u => u.status == null); + users = _.sortBy(users, u => u.status === 'offline'); let hasMore = undefined; const usersLimit = Template.instance().usersLimit.get(); @@ -264,6 +269,7 @@ Template.membersList.onCreated(function() { this.showDetail = new ReactiveVar(false); this.filter = new ReactiveVar(''); + this.users = new ReactiveVar([]); this.total = new ReactiveVar; this.loading = new ReactiveVar(true); @@ -272,7 +278,6 @@ Template.membersList.onCreated(function() { Tracker.autorun(() => { if (this.data.rid == null) { return; } - this.loading.set(true); return Meteor.call('getUsersOfRoom', this.data.rid, this.showAllUsers.get(), (error, users) => { this.users.set(users.records); diff --git a/packages/rocketchat-ui-flextab/client/tabs/userActions.js b/packages/rocketchat-ui-flextab/client/tabs/userActions.js index 6f79c1c68d102..80653889f5930 100644 --- a/packages/rocketchat-ui-flextab/client/tabs/userActions.js +++ b/packages/rocketchat-ui-flextab/client/tabs/userActions.js @@ -6,7 +6,10 @@ import toastr from 'toastr'; export const getActions = function({ user, directActions, hideAdminControls }) { const hasPermission = RocketChat.authz.hasAllPermission; - + const isIgnored = () => { + const sub = RocketChat.models.Subscriptions.findOne({rid : Session.get('openedRoom')}); + return sub.ignored && sub.ignored.indexOf(user._id) > -1; + }; const canSetLeader= () => { return RocketChat.authz.hasAllPermission('set-leader', Session.get('openedRoom')); }; @@ -469,6 +472,24 @@ export const getActions = function({ user, directActions, hideAdminControls }) { name: t('Activate'), action: prevent(getUser, ({_id}) => Meteor.call('setUserActiveStatus', _id, true, success(() => toastr.success(t('User_has_been_activated'))))) }; + }, () => { + if (user._id === Meteor.userId()) { + return; + } + if (isIgnored()) { + return { + group: 'channel', + icon : 'plus', + name: 'designore', + action: prevent(getUser, ({_id}) => Meteor.call('ignoreUser', { rid: Session.get('openedRoom'), userId:_id, ignore: false}, success(() => toastr.success(t('user ignored no more'))))) + }; + } + return { + group: 'channel', + icon : 'plus', + name: 'ignore', + action: prevent(getUser, ({_id}) => Meteor.call('ignoreUser', { rid: Session.get('openedRoom'), userId:_id, ignore: true}, success(() => toastr.success(t('user ignored'))))) + }; }]; return actions; }; diff --git a/packages/rocketchat-ui-message/client/message.html b/packages/rocketchat-ui-message/client/message.html index fe107febd65f4..fc8926d95b67b 100644 --- a/packages/rocketchat-ui-message/client/message.html +++ b/packages/rocketchat-ui-message/client/message.html @@ -1,5 +1,5 @@