diff --git a/.meteor/packages b/.meteor/packages index 8f28d2040643bab8346fba60c10685a31ed98e3d..719996033a22de03f464a9faa893888eaad5075e 100644 --- a/.meteor/packages +++ b/.meteor/packages @@ -63,6 +63,7 @@ rocketchat:statistics rocketchat:theme rocketchat:tutum rocketchat:webrtc +rocketchat:channel-settings rocketchat:wordpress #rocketchat:chatops #rocketchat:hubot diff --git a/.meteor/versions b/.meteor/versions index f2096cfe749384335e8b177d804ac3f497dfbc78..06e1c2c87c1abd96d0b12579252ff62b06487f26 100644 --- a/.meteor/versions +++ b/.meteor/versions @@ -123,6 +123,7 @@ reload@1.1.4 retry@1.0.4 rocketchat:authorization@0.0.1 rocketchat:autolinker@0.0.1 +rocketchat:channel-settings@0.0.1 rocketchat:colors@0.0.1 rocketchat:custom-oauth@1.0.0 rocketchat:emojione@0.0.1 diff --git a/client/lib/RoomManager.coffee b/client/lib/RoomManager.coffee index b5684d5785ed43352576fe217e9c55f576b979c2..a9e8a7a406b3d3c495c9da08cbe051c1fbb32ee3 100644 --- a/client/lib/RoomManager.coffee +++ b/client/lib/RoomManager.coffee @@ -110,13 +110,7 @@ RocketChat.Notifications.onUser 'message', (msg) -> Meteor.defer -> RoomManager.updateMentionsMarksOfRoom typeName - # If room was renamed then close current room and send user to the new one - Tracker.nonreactive -> - if msg.t is 'r' - if Session.get('openedRoom') is msg.rid - type = if FlowRouter.current().route.name is 'channel' then 'c' else 'p' - RoomManager.close type + FlowRouter.getParam('name') - FlowRouter.go FlowRouter.current().route.name, name: msg.msg + RocketChat.callbacks.run 'streamMessage', msg RocketChat.Notifications.onRoom openedRooms[typeName].rid, 'deleteMessage', onDeleteMessageStream diff --git a/client/lib/trackRoomNameChanged.coffee b/client/lib/trackRoomNameChanged.coffee new file mode 100644 index 0000000000000000000000000000000000000000..8b3a0769febae4f4b9f11b9e85d6e2753536a69d --- /dev/null +++ b/client/lib/trackRoomNameChanged.coffee @@ -0,0 +1,12 @@ +Meteor.startup -> + roomNameChangedCallback = (msg) -> + Tracker.nonreactive -> + if msg.t is 'r' + if Session.get('openedRoom') is msg.rid + type = if FlowRouter.current().route.name is 'channel' then 'c' else 'p' + RoomManager.close type + FlowRouter.getParam('name') + FlowRouter.go FlowRouter.current().route.name, name: msg.msg + + return msg + + RocketChat.callbacks.add 'streamMessage', roomNameChangedCallback, RocketChat.callbacks.priority.HIGH diff --git a/client/views/app/message.coffee b/client/views/app/message.coffee index 2e053390781a13f4dc229b523f944ef7009eba1a..2792c4cf8cb7445a57a501193e8116c0f63330a8 100644 --- a/client/views/app/message.coffee +++ b/client/views/app/message.coffee @@ -14,11 +14,14 @@ Template.message.helpers return 'temp' body: -> return Template.instance().body + system: -> if RocketChat.MessageTypes.isSystemMessage(this) return 'system' + edited: -> return Template.instance().wasEdited + editTime: -> if Template.instance().wasEdited return moment(@editedAt).format('LL hh:mma') #TODO profile pref for 12hr/24hr clock? @@ -91,6 +94,7 @@ Template.message.onCreated -> message = RocketChat.callbacks.run 'renderMentions', msg # console.log JSON.stringify message return msg.html + msg.html = msg.msg if _.trim(msg.html) isnt '' msg.html = _.escapeHTML msg.html diff --git a/client/views/app/videoCall/videoCall.coffee b/client/views/app/videoCall/videoCall.coffee index d777b03072723b61f73883413de166efe5693ec6..a3431aa73a0fa6ad33c58a2f1b37b9471b0b6337 100644 --- a/client/views/app/videoCall/videoCall.coffee +++ b/client/views/app/videoCall/videoCall.coffee @@ -9,7 +9,7 @@ Template.videoCall.helpers videoActive: -> webrtc = WebRTC.getInstanceByRoomId(Session.get('openedRoom')) overlay = @overlay? - if overlay isnt webrtc.overlayEnabled.get() + if overlay isnt webrtc?.overlayEnabled.get() return false return webrtc.localUrl.get()? or webrtc.remoteItems.get()?.length > 0 diff --git a/packages/rocketchat-channel-settings/client/startup/messageTypes.coffee b/packages/rocketchat-channel-settings/client/startup/messageTypes.coffee new file mode 100644 index 0000000000000000000000000000000000000000..3870f1ef762ef43f2c38dfbc876c828b2d4170bd --- /dev/null +++ b/packages/rocketchat-channel-settings/client/startup/messageTypes.coffee @@ -0,0 +1,20 @@ +Meteor.startup -> + RocketChat.MessageTypes.registerType + id: 'room_changed_privacy' + system: true + message: 'room_changed_privacy' + data: (message) -> + return { + user_by: message.u?.username + room_type: message.msg + } + + RocketChat.MessageTypes.registerType + id: 'room_changed_topic' + system: true + message: 'room_changed_topic' + data: (message) -> + return { + user_by: message.u?.username + room_topic: message.msg + } diff --git a/packages/rocketchat-channel-settings/client/startup/tabBar.coffee b/packages/rocketchat-channel-settings/client/startup/tabBar.coffee new file mode 100644 index 0000000000000000000000000000000000000000..17d1680317e5f51238544bf6c4a08cc9e7a6cc61 --- /dev/null +++ b/packages/rocketchat-channel-settings/client/startup/tabBar.coffee @@ -0,0 +1,12 @@ +Meteor.startup -> + + RocketChat.callbacks.add 'enter-room', (subscription) -> + + if RocketChat.authz.hasAtLeastOnePermission('edit-room', subscription?.rid) + RocketChat.TabBar.addButton + id: 'channel-settings' + i18nTitle: 'Channel_Settings' + icon: 'octicon octicon-gear' + template: 'channelSettings' + order: 0 + , RocketChat.callbacks.priority.MEDIUM, 'enter-room-tabbar-channel-settings' diff --git a/packages/rocketchat-channel-settings/client/startup/trackSettingsChange.coffee b/packages/rocketchat-channel-settings/client/startup/trackSettingsChange.coffee new file mode 100644 index 0000000000000000000000000000000000000000..b3618dd7232e96c9c775de28896c58df47feef05 --- /dev/null +++ b/packages/rocketchat-channel-settings/client/startup/trackSettingsChange.coffee @@ -0,0 +1,15 @@ +Meteor.startup -> + roomSettingsChangedCallback = (msg) -> + Tracker.nonreactive -> + if msg.t is 'room_changed_privacy' + if Session.get('openedRoom') is msg.rid + type = if FlowRouter.current().route.name is 'channel' then 'c' else 'p' + RoomManager.close type + FlowRouter.getParam('name') + + subscription = ChatSubscription.findOne({ rid: msg.rid }) + route = if subscription.t is 'c' then 'channel' else 'group' + FlowRouter.go route, name: subscription.name + + return msg + + RocketChat.callbacks.add 'streamMessage', roomSettingsChangedCallback, RocketChat.callbacks.priority.HIGH diff --git a/packages/rocketchat-channel-settings/client/stylesheets/channel-settings.less b/packages/rocketchat-channel-settings/client/stylesheets/channel-settings.less new file mode 100644 index 0000000000000000000000000000000000000000..0227c11170d8da36077c2baffa8c113f2edd2ce1 --- /dev/null +++ b/packages/rocketchat-channel-settings/client/stylesheets/channel-settings.less @@ -0,0 +1,17 @@ +.flex-tab { + .channel-settings { + margin-top: 60px; + padding: 20px; + + form { + label { + + } + } + + .submit { + margin-top: 30px; + text-align: center; + } + } +} diff --git a/packages/rocketchat-channel-settings/client/views/channelSettings.coffee b/packages/rocketchat-channel-settings/client/views/channelSettings.coffee new file mode 100644 index 0000000000000000000000000000000000000000..4f9f5d344c5d991fad19f382913407cb7ea7e37b --- /dev/null +++ b/packages/rocketchat-channel-settings/client/views/channelSettings.coffee @@ -0,0 +1,23 @@ +Template.channelSettings.helpers + notDirect: -> + return ChatRoom.findOne(@rid)?.t isnt 'd' + roomType: -> + return ChatRoom.findOne(@rid)?.t + +Template.channelSettings.events + 'click .save': (e, t) -> + e.preventDefault() + + settings = + roomType: t.$('input[name=roomType]:checked').val() + + Meteor.call 'saveRoomSettings', t.data.rid, settings, (err, results) -> + return toastr.error err.reason if err + toastr.success TAPi18n.__ 'Settings_updated' + + + # switch room.t + # when 'c' + # FlowRouter.go 'channel', name: name + # when 'p' + # FlowRouter.go 'group', name: name diff --git a/packages/rocketchat-channel-settings/client/views/channelSettings.html b/packages/rocketchat-channel-settings/client/views/channelSettings.html new file mode 100644 index 0000000000000000000000000000000000000000..c72ecae4ad66d4f22d6ecb136fc607766b3e11ab --- /dev/null +++ b/packages/rocketchat-channel-settings/client/views/channelSettings.html @@ -0,0 +1,25 @@ +<template name="channelSettings"> + <div class="control"> + <div class="header"> + <h2>{{_ "Room_Settings"}}</h2> + </div> + </div> + <div class="channel-settings scrollable"> + <form> + <fieldset> + {{#if notDirect}} + <div class="input-line double-col"> + <label>{{_ "Room_Type"}}</label> + <div> + <label><input type="radio" name="roomType" value="c" checked="{{$eq roomType 'c'}}" /> {{_ "Channel"}}</label> + <label><input type="radio" name="roomType" value="p" checked="{{$eq roomType 'p'}}" /> {{_ "Private_Group"}}</label> + </div> + </div> + {{/if}} + </fieldset> + <div class="submit"> + <button class="button save"><i class="icon-send"></i><span>{{_ "Save_changes"}}</span></button> + </div> + </form> + </div> +</template> diff --git a/packages/rocketchat-channel-settings/i18n/en.i18n.json b/packages/rocketchat-channel-settings/i18n/en.i18n.json new file mode 100644 index 0000000000000000000000000000000000000000..ba1d6c016df575a3fd51bca1114e7e932d220575 --- /dev/null +++ b/packages/rocketchat-channel-settings/i18n/en.i18n.json @@ -0,0 +1,8 @@ +{ + "Channel": "Channel", + "Private_Group": "Private Group", + "Room_Type": "Room Type", + "Room_Settings": "Room Settings", + "room_changed_privacy": "Room type changed to: <em>__room_type__</em> by <em>__user_by__</em>", + "room_changed_topic": "Room topic changed to: <em>__room_topic__</em> by <em>__user_by__</em>" +} diff --git a/packages/rocketchat-channel-settings/package.js b/packages/rocketchat-channel-settings/package.js new file mode 100644 index 0000000000000000000000000000000000000000..06b8f3fe128ac6140841c36bb2827c5a803c48f6 --- /dev/null +++ b/packages/rocketchat-channel-settings/package.js @@ -0,0 +1,48 @@ +Package.describe({ + name: 'rocketchat:channel-settings', + version: '0.0.1', + summary: 'Channel Settings Panel', + git: '' +}); + +Package.onUse(function(api) { + api.versionsFrom('1.0'); + + api.use([ + 'coffeescript', + 'templating', + 'less@2.5.0', + 'rocketchat:lib@0.0.1' + ]); + + api.addFiles([ + 'client/startup/messageTypes.coffee', + 'client/startup/tabBar.coffee', + 'client/startup/trackSettingsChange.coffee', + 'client/views/channelSettings.html', + 'client/views/channelSettings.coffee', + 'client/stylesheets/channel-settings.less' + ], 'client'); + + api.addFiles([ + 'server/functions/changeRoomType.coffee', + 'server/methods/saveRoomSettings.coffee', + 'server/models/Messages.coffee' + ], 'server'); + + // TAPi18n + var _ = Npm.require('underscore'); + var fs = Npm.require('fs'); + tapi18nFiles = _.compact(_.map(fs.readdirSync('packages/rocketchat-channel-settings/i18n'), function(filename) { + if (fs.statSync('packages/rocketchat-channel-settings/i18n/' + filename).size > 16) { + return 'i18n/' + filename; + } + })); + api.use('tap:i18n@1.6.1'); + api.imply('tap:i18n'); + api.addFiles(tapi18nFiles); +}); + +Package.onTest(function(api) { + +}); diff --git a/packages/rocketchat-channel-settings/server/functions/changeRoomType.coffee b/packages/rocketchat-channel-settings/server/functions/changeRoomType.coffee new file mode 100644 index 0000000000000000000000000000000000000000..e9c89567302e183d11b51dec04818c0dacdde7c5 --- /dev/null +++ b/packages/rocketchat-channel-settings/server/functions/changeRoomType.coffee @@ -0,0 +1,47 @@ +RocketChat.changeRoomType = (rid, roomType) -> + console.log '[function] RocketChat.changeRoomType'.green, rid, roomType + + unless Match.test rid, String + throw new Meteor.Error 'invalid-rid' + + if roomType not in ['c', 'p'] + throw new Meteor.Error 'invalid-room-type' + + return RocketChat.models.Rooms.setTypeById(rid, roomType) and RocketChat.models.Subscriptions.updateTypeByRoomId(rid, roomType) + + + # username = s.trim username + # if not user or not username + # return false + + # if not /^[0-9a-zA-Z-_.]+$/.test username + # return false + + # # User already has desired username, return + # if user.username is username + # return user + + # # Check username availability + # unless RocketChat.checkUsernameAvailability username + # return false + + # previousUsername = user.username + + # # Username is available; if coming from old username, update all references + # if previousUsername + # RocketChat.models.Messages.updateAllUsernamesByUserId user._id, username + + # RocketChat.models.Messages.findByMention(previousUsername).forEach (msg) -> + # updatedMsg = msg.msg.replace(new RegExp("@#{previousUsername}", "ig"), "@#{username}") + # RocketChat.models.Messages.updateUsernameAndMessageOfMentionByIdAndOldUsername msg._id, previousUsername, username, updatedMsg + + # RocketChat.models.Rooms.replaceUsername previousUsername, username + # RocketChat.models.Rooms.replaceUsernameOfUserByUserId user._id, username + + # RocketChat.models.Subscriptions.setUserUsernameByUserId user._id, username + # RocketChat.models.Subscriptions.setNameForDirectRoomsWithOldName previousUsername, username + + # # Set new username + # Meteor.users.update { _id: user._id }, { $set: { username: username } } + # user.username = username + # return user diff --git a/packages/rocketchat-channel-settings/server/methods/saveRoomSettings.coffee b/packages/rocketchat-channel-settings/server/methods/saveRoomSettings.coffee new file mode 100644 index 0000000000000000000000000000000000000000..6375bf5f289180ce9e3732a313febb8522c65e56 --- /dev/null +++ b/packages/rocketchat-channel-settings/server/methods/saveRoomSettings.coffee @@ -0,0 +1,26 @@ +Meteor.methods + saveRoomSettings: (rid, settings) -> + console.log '[method] saveRoomSettings'.green, rid, settings + + unless Match.test rid, String + throw new Meteor.Error 'invalid-rid' + + unless Match.test settings, Match.ObjectIncluding { roomType: String } + throw new Meteor.Error 'invalid-settings' + + unless RocketChat.authz.hasPermission(Meteor.userId(), 'edit-room', rid) + throw new Meteor.Error 503, 'Not authorized' + + room = RocketChat.models.Rooms.findOneById rid + if room? + if settings.roomType isnt room.t + RocketChat.changeRoomType(rid, settings.roomType) + + if settings.roomType is 'c' + message = TAPi18n.__('Channel') + else + message = TAPi18n.__('Private_Group') + + RocketChat.models.Messages.createRoomSettingsChangedWithTypeRoomIdMessageAndUser 'room_changed_privacy', rid, message, Meteor.user() + + return true diff --git a/packages/rocketchat-channel-settings/server/models/Messages.coffee b/packages/rocketchat-channel-settings/server/models/Messages.coffee new file mode 100644 index 0000000000000000000000000000000000000000..0a8e900e45d40835d506b73c468240b2d9208a8c --- /dev/null +++ b/packages/rocketchat-channel-settings/server/models/Messages.coffee @@ -0,0 +1,2 @@ +RocketChat.models.Messages.createRoomSettingsChangedWithTypeRoomIdMessageAndUser = (type, roomId, message, user, extraData) -> + return @createWithTypeRoomIdMessageAndUser type, roomId, message, user, extraData diff --git a/packages/rocketchat-lib/client/lib/openRoom.coffee b/packages/rocketchat-lib/client/lib/openRoom.coffee index c4dae8c00a15a6498a45998be145e8e8c029c550..545dce131b85cd960539bb4b3580f566491542bb 100644 --- a/packages/rocketchat-lib/client/lib/openRoom.coffee +++ b/packages/rocketchat-lib/client/lib/openRoom.coffee @@ -62,4 +62,4 @@ currentTracker = undefined if ChatSubscription.findOne({rid: room._id})?.open is false Meteor.call 'openRoom', room._id - RocketChat.callbacks.run 'enter-room' + RocketChat.callbacks.run 'enter-room', ChatSubscription.findOne({rid: room._id}) diff --git a/packages/rocketchat-lib/server/models/Rooms.coffee b/packages/rocketchat-lib/server/models/Rooms.coffee index 579091a1080261a9e2be83a11a8df405c63a2185..dddc8f8c0216399447eb301955ced7cbf142a33c 100644 --- a/packages/rocketchat-lib/server/models/Rooms.coffee +++ b/packages/rocketchat-lib/server/models/Rooms.coffee @@ -290,6 +290,16 @@ RocketChat.models.Rooms = new class extends RocketChat.models._Base return @update query, update + setTypeById: (_id, type) -> + query = + _id: _id + + update = + $set: + t: type + + return @update query, update + # INSERT createWithTypeNameUserAndUsernames: (type, name, user, usernames, extraData) -> diff --git a/packages/rocketchat-lib/server/models/Subscriptions.coffee b/packages/rocketchat-lib/server/models/Subscriptions.coffee index 7c98e495264e9b4c3171767323cef77b0eb98c8e..f698bea67354dfc1d80fd4812577483412f52dc6 100644 --- a/packages/rocketchat-lib/server/models/Subscriptions.coffee +++ b/packages/rocketchat-lib/server/models/Subscriptions.coffee @@ -194,6 +194,16 @@ RocketChat.models.Subscriptions = new class extends RocketChat.models._Base return @update query, update, { multi: true } + updateTypeByRoomId: (roomId, type) -> + query = + rid: roomId + + update = + $set: + t: type + + return @update query, update, { multi: true } + # INSERT createWithRoomAndUser: (room, user, extraData) ->