Skip to content

Commit 1fc224a

Browse files
authored
[BREAK] Filter System messages per room (#16369)
1 parent e4ebac7 commit 1fc224a

File tree

19 files changed

+170
-95
lines changed

19 files changed

+170
-95
lines changed

app/channel-settings/client/index.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,6 @@ import './startup/tabBar';
33
import './startup/trackSettingsChange';
44
import './views/channelSettings.html';
55
import './views/channelSettings';
6+
import './views/Multiselect';
67

78
export { ChannelSettings } from './lib/ChannelSettings';
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
<template name="Multiselect">
2+
<div class="rc-multiselect" style='display: flex;'></div>
3+
</template>
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import './Multiselect.html';
2+
import { Template } from 'meteor/templating';
3+
4+
import { MultiSelectSettingInput } from '../../../../client/components/admin/settings/inputs/MultiSelectSettingInput';
5+
6+
7+
Template.Multiselect.onRendered(async function() {
8+
const { MeteorProvider } = await import('../../../../client/providers/MeteorProvider');
9+
const React = await import('react');
10+
const ReactDOM = await import('react-dom');
11+
this.container = this.firstNode;
12+
this.autorun(() => {
13+
ReactDOM.render(React.createElement(MeteorProvider, {
14+
children: React.createElement(MultiSelectSettingInput, Template.currentData()),
15+
}), this.container);
16+
});
17+
});
18+
19+
20+
Template.Multiselect.onDestroyed(async function() {
21+
const ReactDOM = await import('react-dom');
22+
this.container && ReactDOM.unmountComponentAtNode(this.container);
23+
});

app/channel-settings/client/views/channelSettings.html

Lines changed: 27 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -145,39 +145,48 @@
145145
</div>
146146
{{/if}}
147147
{{/with}}
148-
{{#with settings.archived}}
149-
{{#if canView}}
150-
<div class="rc-user-info__row">
151-
<div class="rc-switch rc-switch--blue">
152-
<label class="rc-switch__label">
153-
<span class="rc-switch__text">
154-
{{_ label}}{{equal default value '*'}}
155-
</span>
156-
<input type="checkbox" class="rc-switch__input js-input-check" name="archived" checked="{{checked}}" disabled="{{./disabled}}">
157-
<span class="rc-switch__button">
158-
<span class="rc-switch__button-inside"></span>
159-
</span>
160-
</label>
161-
</div>
162-
</div>
163-
{{/if}}
164-
{{/with}}
165148

166149
{{#with settings.sysMes}}
167150
{{#if canView}}
151+
<div class="rc-user-info__row rc-user-info__row--separator">
168152
<div class="rc-user-info__row">
169153
<div class="rc-switch rc-switch--blue">
170154
<label class="rc-switch__label">
171155
<span class="rc-switch__text">
172156
{{_ label}}{{equal default value '*'}}
173157
</span>
174-
<input type="checkbox" class="rc-switch__input js-input-check" name="archived" checked="{{checked}}" disabled="{{./disabled}}">
158+
<input type="checkbox" class="rc-switch__input js-input-toggle" name="sysMes" checked="{{c}}" disabled="{{./disabled}}">
175159
<span class="rc-switch__button">
176160
<span class="rc-switch__button-inside"></span>
177161
</span>
178162
</label>
163+
<span class="rc-switch__description">{{# unless c}} {{_ "Use_Server_configuration" }} {{else}} {{_ "Use_Room_configuration"}} {{/unless}}</span>
179164
</div>
180165
</div>
166+
{{# if c}}
167+
<div class="rc-user-info__row">
168+
{{> Multiselect values=values onChangeValue=onChangeValue value=get }}
169+
</div>
170+
{{/if}}
171+
</div>
172+
{{/if}}
173+
{{/with}}
174+
175+
{{#with settings.archived}}
176+
{{#if canView}}
177+
<div class="rc-user-info__row">
178+
<div class="rc-switch rc-switch--blue">
179+
<label class="rc-switch__label">
180+
<span class="rc-switch__text">
181+
{{_ label}}{{equal default value '*'}}
182+
</span>
183+
<input type="checkbox" class="rc-switch__input js-input-check" name="archived" checked="{{checked}}" disabled="{{./disabled}}">
184+
<span class="rc-switch__button">
185+
<span class="rc-switch__button-inside"></span>
186+
</span>
187+
</label>
188+
</div>
189+
</div>
181190
{{/if}}
182191
{{/with}}
183192

app/channel-settings/client/views/channelSettings.js

Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ import { callbacks } from '../../../callbacks';
1313
import { hasPermission, hasAllPermission, hasRole, hasAtLeastOnePermission } from '../../../authorization';
1414
import { t, roomTypes, RoomSettingsEnum } from '../../../utils';
1515
import { ChannelSettings } from '../lib/ChannelSettings';
16+
import { MessageTypesValues } from '../../../lib/lib/MessageTypes';
17+
1618

1719
const common = {
1820
canLeaveRoom() {
@@ -148,6 +150,12 @@ Template.channelSettingsEditing.events({
148150
'change .js-input-check'(e) {
149151
this.value.set(e.currentTarget.checked);
150152
},
153+
'change .js-input-toggle'(e) {
154+
this.toogle.set(e.currentTarget.checked);
155+
if (!e.currentTarget.checked) {
156+
this.value.set(null);
157+
}
158+
},
151159
'click .js-reset'(e, t) {
152160
const { settings } = t;
153161
Object.keys(settings).forEach((key) => settings[key].value.set(settings[key].default.get()));
@@ -406,7 +414,7 @@ Template.channelSettingsEditing.onCreated(function() {
406414
},
407415
sysMes: {
408416
type: 'boolean',
409-
label: 'System_messages',
417+
label: 'Hide_System_Messages',
410418
isToggle: true,
411419
processing: new ReactiveVar(false),
412420
canView() {
@@ -415,13 +423,21 @@ Template.channelSettingsEditing.onCreated(function() {
415423
RoomSettingsEnum.SYSTEM_MESSAGES,
416424
);
417425
},
418-
getValue() {
419-
return room.sysMes !== false;
426+
onChangeValue() {
427+
return function(value) { this.value.set(value || []); }.bind(this);
428+
},
429+
getValue(room) {
430+
return room.sysMes;
420431
},
421432
canEdit() {
422433
return hasAllPermission('edit-room', room._id);
423434
},
424-
save(value) {
435+
get() {
436+
return this.value.get() || [];
437+
},
438+
save() {
439+
const value = this.toogle.get() ? this.value.get() : null;
440+
425441
return call('saveRoomSettings', room._id, 'systemMessages', value).then(
426442
() => {
427443
toastr.success(
@@ -430,6 +446,13 @@ Template.channelSettingsEditing.onCreated(function() {
430446
},
431447
);
432448
},
449+
c() {
450+
return this.toogle.get();
451+
},
452+
toogle: new ReactiveVar(room.sysMes && room.sysMes.length > 0),
453+
values() {
454+
return MessageTypesValues;
455+
},
433456
},
434457
archived: {
435458
type: 'boolean',

app/channel-settings/server/functions/saveRoomSystemMessages.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,18 @@ import { Meteor } from 'meteor/meteor';
22
import { Match } from 'meteor/check';
33

44
import { Rooms } from '../../../models';
5+
import { MessageTypesValues } from '../../../lib/lib/MessageTypes';
56

67
export const saveRoomSystemMessages = function(rid, systemMessages) {
78
if (!Match.test(rid, String)) {
89
throw new Meteor.Error('invalid-room', 'Invalid room', {
910
function: 'RocketChat.saveRoomSystemMessages',
1011
});
1112
}
13+
if (systemMessages && (!Match.test(systemMessages, [String]) || systemMessages.some((value) => !MessageTypesValues.map(({ key }) => key).includes(value)))) {
14+
throw new Meteor.Error('invalid-room', 'Invalid option', {
15+
function: 'RocketChat.saveRoomSystemMessages',
16+
});
17+
}
1218
return Rooms.setSystemMessagesById(rid, systemMessages);
1319
};

app/channel-settings/server/methods/saveRoomSettings.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,7 @@ Meteor.methods({
183183
}
184184
break;
185185
case 'systemMessages':
186-
if (value !== room.sysMes) {
186+
if (JSON.stringify(value) !== JSON.stringify(room.sysMes)) {
187187
saveRoomSystemMessages(rid, value, user);
188188
}
189189
break;

app/lib/lib/MessageTypes.js

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,3 +160,46 @@ Meteor.startup(function() {
160160
},
161161
});
162162
});
163+
164+
export const MessageTypesValues = [
165+
{
166+
key: 'uj',
167+
i18nLabel: 'Message_HideType_uj',
168+
}, {
169+
key: 'ul',
170+
i18nLabel: 'Message_HideType_ul',
171+
}, {
172+
key: 'ru',
173+
i18nLabel: 'Message_HideType_ru',
174+
}, {
175+
key: 'au',
176+
i18nLabel: 'Message_HideType_au',
177+
}, {
178+
key: 'mute_unmute',
179+
i18nLabel: 'Message_HideType_mute_unmute',
180+
}, {
181+
key: 'r',
182+
i18nLabel: 'Message_HideType_r',
183+
}, {
184+
key: 'ut',
185+
i18nLabel: 'Message_HideType_ut',
186+
}, {
187+
key: 'wm',
188+
i18nLabel: 'Message_HideType_wm',
189+
}, {
190+
key: 'rm',
191+
i18nLabel: 'Message_HideType_rm',
192+
}, {
193+
key: 'subscription_role_added',
194+
i18nLabel: 'Message_HideType_subscription_role_added',
195+
}, {
196+
key: 'subscription_role_removed',
197+
i18nLabel: 'Message_HideType_subscription_role_removed',
198+
}, {
199+
key: 'room_archived',
200+
i18nLabel: 'Message_HideType_room_archived',
201+
}, {
202+
key: 'room_unarchived',
203+
i18nLabel: 'Message_HideType_room_unarchived',
204+
},
205+
];

app/lib/server/functions/createRoom.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,6 @@ export const createRoom = function(type, name, owner, members, readOnly, extraDa
5757
}, extraData, {
5858
ts: now,
5959
ro: readOnly === true,
60-
sysMes: readOnly !== true,
6160
});
6261

6362
if (type === 'd') {

app/lib/server/functions/loadMessageHistory.js

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,19 @@
11
import { settings } from '../../../settings';
2-
import { Messages } from '../../../models';
2+
import { Messages, Rooms } from '../../../models';
33
import { normalizeMessagesForUser } from '../../../utils/server/lib/normalizeMessagesForUser';
44

5-
const hideMessagesOfType = new Set();
5+
const hideMessagesOfTypeServer = new Set();
66

77
settings.get('Hide_System_Messages', function(key, values) {
88
const hiddenTypes = values.reduce((array, value) => [...array, ...value === 'mute_unmute' ? ['user-muted', 'user-unmuted'] : [value]], []);
9-
hideMessagesOfType.clear();
10-
hiddenTypes.forEach((item) => hideMessagesOfType.add(item));
9+
hideMessagesOfTypeServer.clear();
10+
hiddenTypes.forEach((item) => hideMessagesOfTypeServer.add(item));
1111
});
1212

1313
export const loadMessageHistory = function loadMessageHistory({ userId, rid, end, limit = 20, ls }) {
14+
const room = Rooms.findOne(rid, { fields: { sysMes: 1 } });
15+
16+
const hiddenMessageTypes = Array.isArray(room && room.sysMes) ? room.sysMes : Array.from(hideMessagesOfTypeServer.values()); // TODO probably remove on chained event system
1417
const options = {
1518
sort: {
1619
ts: -1,
@@ -24,7 +27,7 @@ export const loadMessageHistory = function loadMessageHistory({ userId, rid, end
2427
};
2528
}
2629

27-
const records = end != null ? Messages.findVisibleByRoomIdBeforeTimestampNotContainingTypes(rid, end, Array.from(hideMessagesOfType.values()), options).fetch() : Messages.findVisibleByRoomIdNotContainingTypes(rid, Array.from(hideMessagesOfType.values()), options).fetch();
30+
const records = end != null ? Messages.findVisibleByRoomIdBeforeTimestampNotContainingTypes(rid, end, hiddenMessageTypes, options).fetch() : Messages.findVisibleByRoomIdNotContainingTypes(rid, hiddenMessageTypes, options).fetch();
2831
const messages = normalizeMessagesForUser(records, userId);
2932
let unreadNotLoaded = 0;
3033
let firstUnread;
@@ -34,8 +37,7 @@ export const loadMessageHistory = function loadMessageHistory({ userId, rid, end
3437

3538
if ((firstMessage != null ? firstMessage.ts : undefined) > ls) {
3639
delete options.limit;
37-
38-
const unreadMessages = Messages.findVisibleByRoomIdBetweenTimestampsNotContainingTypes(rid, ls, firstMessage.ts, Array.from(hideMessagesOfType.values()), {
40+
const unreadMessages = Messages.findVisibleByRoomIdBetweenTimestampsNotContainingTypes(rid, ls, firstMessage.ts, hiddenMessageTypes, {
3941
limit: 1,
4042
sort: {
4143
ts: 1,

0 commit comments

Comments
 (0)