From 136e9caafedad5bad810d044ef510c5ef09533d6 Mon Sep 17 00:00:00 2001 From: Guilherme Gazzo Date: Fri, 20 Apr 2018 22:43:52 -0300 Subject: [PATCH] [NEW] Broadcast Channels (#9950) * [NEW] Broadcast Channels * code guidelines * fix createroom type p extradata * fix private room can change join_code * test to show member list * Code cleanup * Update message.js --- .../client/views/channelSettings.html | 23 +++++++++++++- .../client/views/channelSettings.js | 24 +++++++++++++-- .../server/methods/saveRoomSettings.js | 9 +++++- packages/rocketchat-i18n/i18n/en.i18n.json | 3 ++ .../rocketchat-lib/client/defaultTabBars.js | 14 ++++++++- packages/rocketchat-lib/lib/RoomTypeConfig.js | 3 +- .../rocketchat-lib/lib/roomTypes/private.js | 6 ++++ .../rocketchat-lib/lib/roomTypes/public.js | 17 ++++++++--- .../server/functions/createRoom.js | 5 ++++ .../server/methods/createChannel.js | 5 ++-- .../client/imports/components/header.css | 4 +++ .../client/imports/forms/button.css | 9 ++++++ .../client/imports/forms/input.css | 3 ++ .../client/imports/forms/popup-list.css | 2 ++ .../client/imports/forms/switch.css | 22 +++++++------- .../rocketchat-ui-master/public/icons.svg | 2 ++ .../rocketchat-ui-message/client/message.html | 5 ++++ .../rocketchat-ui-message/client/message.js | 16 ++++++++-- .../client/messageBox.js | 3 +- .../client/components/popupList.html | 9 ++++++ .../rocketchat-ui/client/lib/chatMessages.js | 5 +++- .../client/views/app/createChannel.html | 16 +++++++++- .../client/views/app/createChannel.js | 30 +++++++++++++++---- .../rocketchat-ui/client/views/app/room.html | 4 +-- .../rocketchat-ui/client/views/app/room.js | 4 +++ .../client/views/app/roomSearch.html | 2 +- server/publications/room.js | 3 +- 27 files changed, 207 insertions(+), 41 deletions(-) diff --git a/packages/rocketchat-channel-settings/client/views/channelSettings.html b/packages/rocketchat-channel-settings/client/views/channelSettings.html index 89f36607485..4cd38d31a1a 100644 --- a/packages/rocketchat-channel-settings/client/views/channelSettings.html +++ b/packages/rocketchat-channel-settings/client/views/channelSettings.html @@ -163,6 +163,23 @@ {{/if}} {{/with}} + {{#with settings.broadcast}} + {{#if canView}} +
+
+ +
+
+ {{/if}} + {{/with}} {{#with settings.joinCode}}
@@ -228,7 +245,11 @@ {{unscape topic}}
- + {{#if broadcast}} + + {{/if}} {{/with}} {{#each channelSettings}}
{{readOnlyDescription}}
+
+ + + {{_"Broadcast_channel_Description"}} + +
diff --git a/packages/rocketchat-ui/client/views/app/createChannel.js b/packages/rocketchat-ui/client/views/app/createChannel.js index aede83016b5..79561556292 100644 --- a/packages/rocketchat-ui/client/views/app/createChannel.js +++ b/packages/rocketchat-ui/client/views/app/createChannel.js @@ -83,6 +83,12 @@ Template.createChannel.helpers({ typeDescription() { return t(Template.instance().type.get() === 'p' ? t('Just_invited_people_can_access_this_channel') : t('Everyone_can_access_this_channel')); }, + broadcast() { + return Template.instance().broadcast.get(); + }, + readOnly() { + return Template.instance().readOnly.get(); + }, readOnlyDescription() { return t(Template.instance().readOnly.get() ? t('Only_authorized_users_can_write_new_messages') : t('All_users_in_the_channel_can_write_new_messages')); }, @@ -113,8 +119,8 @@ Template.createChannel.helpers({ extensionsConfig() { const instance = Template.instance(); return { - validations : Template.instance().extensions_validations, - submits: Template.instance().extensions_submits, + validations : instance.extensions_validations, + submits: instance.extensions_submits, change: instance.change }; }, @@ -154,6 +160,10 @@ Template.createChannel.events({ t.type.set(e.target.checked ? e.target.value : 'd'); t.change(); }, + 'change [name="broadcast"]'(e, t) { + t.broadcast.set(e.target.checked); + t.change(); + }, 'change [name="readOnly"]'(e, t) { t.readOnly.set(e.target.checked); }, @@ -188,6 +198,7 @@ Template.createChannel.events({ const name = e.target.name.value; const type = instance.type.get(); const readOnly = instance.readOnly.get(); + const broadcast = instance.broadcast.get(); const isPrivate = type === 'p'; if (instance.invalid.get() || instance.inUse.get()) { @@ -200,7 +211,7 @@ Template.createChannel.events({ const extraData = Object.keys(instance.extensions_submits) .reduce((result, key) => { return { ...result, ...instance.extensions_submits[key](instance) }; - }, {}); + }, {broadcast}); Meteor.call(isPrivate ? 'createPrivateGroup' : 'createChannel', name, instance.selectedUsers.get().map(user => user.username), readOnly, {}, extraData, function(err, result) { if (err) { @@ -235,13 +246,13 @@ Template.createChannel.onRendered(function() { users.set(usersArr); }); }); -/* global AutoComplete Deps */ +/* global AutoComplete */ Template.createChannel.onCreated(function() { this.selectedUsers = new ReactiveVar([]); const filter = {exceptions :[Meteor.user().username].concat(this.selectedUsers.get().map(u => u.username))}; // this.onViewRead:??y(function() { - Deps.autorun(() => { + Tracker.autorun(() => { filter.exceptions = [Meteor.user().username].concat(this.selectedUsers.get().map(u => u.username)); }); this.extensions_validations = {}; @@ -249,6 +260,7 @@ Template.createChannel.onCreated(function() { this.name = new ReactiveVar(''); this.type = new ReactiveVar('p'); this.readOnly = new ReactiveVar(false); + this.broadcast = new ReactiveVar(false); this.inUse = new ReactiveVar(undefined); this.invalid = new ReactiveVar(false); this.extensions_invalid = new ReactiveVar(false); @@ -257,6 +269,14 @@ Template.createChannel.onCreated(function() { Object.keys(this.extensions_validations).map(key => this.extensions_validations[key]).forEach(f => (valid = f(this) && valid)); this.extensions_invalid.set(!valid); }, 300); + + Tracker.autorun(() => { + const broadcast = this.broadcast.get(); + if (broadcast) { + this.readOnly.set(true); + } + }); + this.userFilter = new ReactiveVar(''); this.tokensRequired = new ReactiveVar(false); this.checkChannel = _.debounce((name) => { diff --git a/packages/rocketchat-ui/client/views/app/room.html b/packages/rocketchat-ui/client/views/app/room.html index e97aa55b9c7..540edf20e70 100644 --- a/packages/rocketchat-ui/client/views/app/room.html +++ b/packages/rocketchat-ui/client/views/app/room.html @@ -112,9 +112,7 @@ {{/if}} {{/if}} - {{#each messagesHistory}} - {{#nrr nrrargs 'message' .}}{{/nrr}} - {{/each}} + {{#each messagesHistory}}{{#nrr nrrargs 'message' .}}{{/nrr}}{{/each}} {{#if hasMoreNext}}
  • {{#if isLoading}} diff --git a/packages/rocketchat-ui/client/views/app/room.js b/packages/rocketchat-ui/client/views/app/room.js index 10833072b0f..16cf3611c27 100644 --- a/packages/rocketchat-ui/client/views/app/room.js +++ b/packages/rocketchat-ui/client/views/app/room.js @@ -381,6 +381,10 @@ let lastTouchY = null; let lastScrollTop; Template.room.events({ + 'click .js-reply-broadcast'() { + const message = this._arguments[1]; + RocketChat.roomTypes.openRouteLink('d', {name: this._arguments[1].u.username}, {...FlowRouter.current().queryParams, reply: message._id}); + }, 'click, touchend'(e, t) { Meteor.setTimeout(() => t.sendToBottomIfNecessaryDebounced(), 100); }, diff --git a/packages/rocketchat-ui/client/views/app/roomSearch.html b/packages/rocketchat-ui/client/views/app/roomSearch.html index fe3610237e2..f8ac8eb3789 100644 --- a/packages/rocketchat-ui/client/views/app/roomSearch.html +++ b/packages/rocketchat-ui/client/views/app/roomSearch.html @@ -2,5 +2,5 @@ {{name}} diff --git a/server/publications/room.js b/server/publications/room.js index 9dfe5637f70..90216804a50 100644 --- a/server/publications/room.js +++ b/server/publications/room.js @@ -33,7 +33,8 @@ const fields = { reactWhenReadOnly: 1, sentiment: 1, tokenpass: 1, - streamingOptions: 1 + streamingOptions: 1, + broadcast: 1 }; const roomMap = (record) => {