diff --git a/client/methods/saveRoomName.coffee b/client/methods/saveRoomName.coffee deleted file mode 100644 index 2072d68fa0bb..000000000000 --- a/client/methods/saveRoomName.coffee +++ /dev/null @@ -1,26 +0,0 @@ -Meteor.methods - saveRoomName: (rid, name) -> - if not Meteor.userId() - throw new Meteor.Error 203, t('User_logged_out') - - room = ChatRoom.findOne rid - - if room.u._id isnt Meteor.userId() or room.t not in ['c', 'p'] - throw new Meteor.Error 403, t('Not allowed') - - name = _.slugify name - - if name is room.name - return - - ChatRoom.update rid, - $set: - name: name - - ChatSubscription.update - rid: rid - , - $set: - name: name - - return name diff --git a/client/views/app/room.coffee b/client/views/app/room.coffee index 80dd1c74fb99..4c128db8ece9 100644 --- a/client/views/app/room.coffee +++ b/client/views/app/room.coffee @@ -70,6 +70,11 @@ Template.room.helpers else return roomData.name + roomTopic: -> + roomData = Session.get('roomData' + this._id) + return '' unless roomData + return roomData.topic + roomIcon: -> roomData = Session.get('roomData' + this._id) return '' unless roomData?.t @@ -114,26 +119,9 @@ Template.room.helpers return '' unless roomData return roomData.t is 'c' - canEditName: -> - roomData = Session.get('roomData' + this._id) - return '' unless roomData - if roomData.t in ['c', 'p'] - return RocketChat.authz.hasAtLeastOnePermission('edit-room', this._id) - else - return '' - canDirectMessage: -> return Meteor.user()?.username isnt this.username - roomNameEdit: -> - return Session.get('roomData' + this._id)?.name - - editingTitle: -> - return 'hidden' if Session.get('editRoomTitle') - - showEditingTitle: -> - return 'hidden' if not Session.get('editRoomTitle') - flexOpened: -> return 'opened' if RocketChat.TabBar.isFlexOpen() diff --git a/client/views/app/room.html b/client/views/app/room.html index 3c2380b39296..3399c50d2133 100644 --- a/client/views/app/room.html +++ b/client/views/app/room.html @@ -13,11 +13,8 @@

{{/if}} - {{roomName}} - {{#if canEditName}} - - - {{/if}} + {{roomName}} + {{roomTopic}}

diff --git a/i18n/en.i18n.json b/i18n/en.i18n.json index 3c39e0ccab89..69cd384193ec 100644 --- a/i18n/en.i18n.json +++ b/i18n/en.i18n.json @@ -162,6 +162,7 @@ "Invalid_name" : "The name must not be empty", "Invalid_pass" : "The password must not be empty", "Invalid_room_name" : "%s is not a valid room name,
use only letters, numbers and dashes", + "Invalid_room_type" : "%s is not a valid room type.", "invisible" : "invisible", "Invisible" : "Invisible", "Invitation_HTML" : "Invitation HTML", diff --git a/packages/rocketchat-channel-settings/client/views/channelSettings.coffee b/packages/rocketchat-channel-settings/client/views/channelSettings.coffee index 4f9f5d344c5d..26abf2d703fb 100644 --- a/packages/rocketchat-channel-settings/client/views/channelSettings.coffee +++ b/packages/rocketchat-channel-settings/client/views/channelSettings.coffee @@ -3,6 +3,10 @@ Template.channelSettings.helpers return ChatRoom.findOne(@rid)?.t isnt 'd' roomType: -> return ChatRoom.findOne(@rid)?.t + roomName: -> + return ChatRoom.findOne(@rid)?.name + roomTopic: -> + return ChatRoom.findOne(@rid)?.topic Template.channelSettings.events 'click .save': (e, t) -> @@ -10,14 +14,44 @@ Template.channelSettings.events settings = roomType: t.$('input[name=roomType]:checked').val() + roomName: t.$('input[name=roomName]').val() + roomTopic: t.$('input[name=roomTopic]').val() - Meteor.call 'saveRoomSettings', t.data.rid, settings, (err, results) -> - return toastr.error err.reason if err - toastr.success TAPi18n.__ 'Settings_updated' + if t.validate() + Meteor.call 'saveRoomSettings', t.data.rid, settings, (err, results) -> + if err + if err.error in [ 'duplicate-name', 'name-invalid' ] + return toastr.error TAPi18n.__(err.reason, err.details.channelName) + if err.error is 'invalid-room-type' + return toastr.error TAPi18n.__(err.reason, err.details.roomType) + return toastr.error TAPi18n.__(err.reason) + toastr.success TAPi18n.__ 'Settings_updated' - # switch room.t - # when 'c' - # FlowRouter.go 'channel', name: name - # when 'p' - # FlowRouter.go 'group', name: name +Template.channelSettings.onCreated -> + @validateRoomType = => + type = @$('input[name=roomType]:checked').val() + if type not in ['c', 'p'] + toastr.error t('Invalid_room_type', type) + return true + + @validateRoomName = => + rid = Template.currentData()?.rid + room = ChatRoom.findOne rid + + if room.u._id isnt Meteor.userId() or room.t not in ['c', 'p'] + toastr.error t('Not_allowed') + return false + + name = $('input[name=roomName]').val() + if not /^[0-9a-z-_]+$/.test name + toastr.error t('Invalid_room_name', name) + return false + + return true + + @validateRoomTopic = => + return true + + @validate = => + return @validateRoomType() and @validateRoomName() and @validateRoomTopic() diff --git a/packages/rocketchat-channel-settings/client/views/channelSettings.html b/packages/rocketchat-channel-settings/client/views/channelSettings.html index c72ecae4ad66..13b76fb9cb74 100644 --- a/packages/rocketchat-channel-settings/client/views/channelSettings.html +++ b/packages/rocketchat-channel-settings/client/views/channelSettings.html @@ -7,6 +7,20 @@

{{_ "Room_Settings"}}

+ {{#if notDirect}} +
+ +
+ +
+
+ {{/if}} +
+ +
+ +
+
{{#if notDirect}}
diff --git a/packages/rocketchat-channel-settings/i18n/en.i18n.json b/packages/rocketchat-channel-settings/i18n/en.i18n.json index ba1d6c016df5..3100cf532a87 100644 --- a/packages/rocketchat-channel-settings/i18n/en.i18n.json +++ b/packages/rocketchat-channel-settings/i18n/en.i18n.json @@ -1,6 +1,8 @@ { "Channel": "Channel", "Private_Group": "Private Group", + "Room_Name": "Room Name", + "Room_Topic": "Room Topic", "Room_Type": "Room Type", "Room_Settings": "Room Settings", "room_changed_privacy": "Room type changed to: __room_type__ by __user_by__", diff --git a/packages/rocketchat-channel-settings/package.js b/packages/rocketchat-channel-settings/package.js index 06b8f3fe128a..eaffbdf1f567 100644 --- a/packages/rocketchat-channel-settings/package.js +++ b/packages/rocketchat-channel-settings/package.js @@ -26,6 +26,8 @@ Package.onUse(function(api) { api.addFiles([ 'server/functions/changeRoomType.coffee', + 'server/functions/changeRoomTopic.coffee', + 'server/methods/saveRoomName.coffee', 'server/methods/saveRoomSettings.coffee', 'server/models/Messages.coffee' ], 'server'); diff --git a/packages/rocketchat-channel-settings/server/functions/changeRoomTopic.coffee b/packages/rocketchat-channel-settings/server/functions/changeRoomTopic.coffee new file mode 100644 index 000000000000..9fd7c3f3ea64 --- /dev/null +++ b/packages/rocketchat-channel-settings/server/functions/changeRoomTopic.coffee @@ -0,0 +1,6 @@ +RocketChat.changeRoomTopic = (rid, roomTopic) -> + unless Match.test rid, String + throw new Meteor.Error 'invalid-rid' + + console.log '[function] RocketChat.changeRoomTopic'.green, rid, roomTopic + return RocketChat.models.Rooms.setTopicById(rid, roomTopic) diff --git a/packages/rocketchat-channel-settings/server/functions/changeRoomType.coffee b/packages/rocketchat-channel-settings/server/functions/changeRoomType.coffee index e9c89567302e..6885b59b03cd 100644 --- a/packages/rocketchat-channel-settings/server/functions/changeRoomType.coffee +++ b/packages/rocketchat-channel-settings/server/functions/changeRoomType.coffee @@ -5,43 +5,6 @@ RocketChat.changeRoomType = (rid, roomType) -> throw new Meteor.Error 'invalid-rid' if roomType not in ['c', 'p'] - throw new Meteor.Error 'invalid-room-type' + throw new Meteor.Error 'invalid-room-type', 'Invalid_room_type', { roomType: roomType } 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/server/methods/saveRoomName.coffee b/packages/rocketchat-channel-settings/server/methods/saveRoomName.coffee similarity index 82% rename from server/methods/saveRoomName.coffee rename to packages/rocketchat-channel-settings/server/methods/saveRoomName.coffee index 7dba0b2d710a..2dddd5344230 100644 --- a/server/methods/saveRoomName.coffee +++ b/packages/rocketchat-channel-settings/server/methods/saveRoomName.coffee @@ -13,7 +13,7 @@ Meteor.methods throw new Meteor.Error 403, 'Not allowed' if not /^[0-9a-z-_]+$/.test name - throw new Meteor.Error 'name-invalid' + throw new Meteor.Error 'name-invalid', 'Invalid_room_name', { channelName: name } name = _.slugify name @@ -22,7 +22,7 @@ Meteor.methods # avoid duplicate names if RocketChat.models.Rooms.findOneByName name - throw new Meteor.Error 'duplicate-name' + throw new Meteor.Error 'duplicate-name', 'Duplicate_channel_name', { channelName: name } RocketChat.models.Rooms.setNameById rid, name diff --git a/packages/rocketchat-channel-settings/server/methods/saveRoomSettings.coffee b/packages/rocketchat-channel-settings/server/methods/saveRoomSettings.coffee index 6375bf5f2891..340a0feeabc0 100644 --- a/packages/rocketchat-channel-settings/server/methods/saveRoomSettings.coffee +++ b/packages/rocketchat-channel-settings/server/methods/saveRoomSettings.coffee @@ -3,10 +3,10 @@ Meteor.methods console.log '[method] saveRoomSettings'.green, rid, settings unless Match.test rid, String - throw new Meteor.Error 'invalid-rid' + throw new Meteor.Error 'invalid-rid', 'Invalid room' - unless Match.test settings, Match.ObjectIncluding { roomType: String } - throw new Meteor.Error 'invalid-settings' + unless Match.test settings, Match.ObjectIncluding { roomName: String, roomTopic: String, roomType: String } + throw new Meteor.Error 'invalid-settings', 'Invalid settings provided' unless RocketChat.authz.hasPermission(Meteor.userId(), 'edit-room', rid) throw new Meteor.Error 503, 'Not authorized' @@ -23,4 +23,12 @@ Meteor.methods RocketChat.models.Messages.createRoomSettingsChangedWithTypeRoomIdMessageAndUser 'room_changed_privacy', rid, message, Meteor.user() + if settings.roomName isnt room.name + name = Meteor.call 'saveRoomName', rid, settings.roomName + + if settings.roomTopic isnt room.topic + RocketChat.changeRoomTopic(rid, settings.roomTopic) + message = settings.roomTopic + RocketChat.models.Messages.createRoomSettingsChangedWithTypeRoomIdMessageAndUser 'room_changed_topic', rid, message, Meteor.user() + return true diff --git a/packages/rocketchat-lib/server/models/Rooms.coffee b/packages/rocketchat-lib/server/models/Rooms.coffee index dddc8f8c0216..0ccfb2519b9a 100644 --- a/packages/rocketchat-lib/server/models/Rooms.coffee +++ b/packages/rocketchat-lib/server/models/Rooms.coffee @@ -291,15 +291,25 @@ RocketChat.models.Rooms = new class extends RocketChat.models._Base return @update query, update setTypeById: (_id, type) -> - query = + query = _id: _id - update = - $set: + update = + $set: t: type return @update query, update + setTopicById: (_id, topic) -> + query = + _id: _id + + update = + $set: + topic: topic + + return @update query, update + # INSERT createWithTypeNameUserAndUsernames: (type, name, user, usernames, extraData) -> diff --git a/packages/rocketchat-theme/assets/stylesheets/base.less b/packages/rocketchat-theme/assets/stylesheets/base.less index c8a913a1aa36..c7610498524e 100644 --- a/packages/rocketchat-theme/assets/stylesheets/base.less +++ b/packages/rocketchat-theme/assets/stylesheets/base.less @@ -1989,7 +1989,11 @@ a.github-fork { height: 100%; top: 0; left: 0; - + .room-topic { + font-size: 14px; + opacity: 0.4; + margin-left: 10px; + } .edit-room-title { margin-left: 4px; font-size: 16px; diff --git a/server/startup/roomPublishes.coffee b/server/startup/roomPublishes.coffee index ae5cdd0225f3..d7561a38b16c 100644 --- a/server/startup/roomPublishes.coffee +++ b/server/startup/roomPublishes.coffee @@ -7,6 +7,7 @@ Meteor.startup -> cl: 1 u: 1 usernames: 1 + topic: 1 return RocketChat.models.Rooms.findByTypeAndName 'c', identifier, options RocketChat.roomTypes.addPublish 'p', (identifier) -> @@ -17,6 +18,7 @@ Meteor.startup -> cl: 1 u: 1 usernames: 1 + topic: 1 user = RocketChat.models.Users.findOneById this.userId, fields: username: 1 return RocketChat.models.Rooms.findByTypeAndNameContainigUsername 'p', identifier, user.username, options