diff --git a/packages/rocketchat-channel-settings/client/stylesheets/channel-settings.less b/packages/rocketchat-channel-settings/client/stylesheets/channel-settings.less index 05f745e0abc52a12182c9cdf622b918ba98cb44c..a09d3ee179c2e5800f74f5b334bc852563d37dca 100644 --- a/packages/rocketchat-channel-settings/client/stylesheets/channel-settings.less +++ b/packages/rocketchat-channel-settings/client/stylesheets/channel-settings.less @@ -13,6 +13,10 @@ margin-top: 30px; text-align: center; } + + [data-edit] { + cursor: pointer; + } } } diff --git a/packages/rocketchat-channel-settings/client/views/channelSettings.coffee b/packages/rocketchat-channel-settings/client/views/channelSettings.coffee index a56bc8f54cb6bf794c23a8cf09ecc58c25db4a16..7f5639384fe1a1e628078e36028a9ca694cf9ce7 100644 --- a/packages/rocketchat-channel-settings/client/views/channelSettings.coffee +++ b/packages/rocketchat-channel-settings/client/views/channelSettings.coffee @@ -1,40 +1,64 @@ Template.channelSettings.helpers canEdit: -> - return true + return RocketChat.authz.hasAllPermission('edit-room', @rid) editing: (field) -> - return false + return Template.instance().editing.get() is field notDirect: -> return ChatRoom.findOne(@rid)?.t isnt 'd' roomType: -> return ChatRoom.findOne(@rid)?.t roomTypeDescription: -> - return if ChatRoom.findOne(@rid)?.t is 'c' then t('Channel') else t('Private_Group') + roomType = ChatRoom.findOne(@rid)?.t + if roomType is 'c' + return t('Channel') + else if roomType is 'p' + return t('Private_Group') roomName: -> return ChatRoom.findOne(@rid)?.name roomTopic: -> return ChatRoom.findOne(@rid)?.topic Template.channelSettings.events - 'click .save': (e, t) -> - e.preventDefault() + # 'click .save': (e, t) -> + # e.preventDefault() + + # settings = + # roomType: t.$('input[name=roomType]:checked').val() + # roomName: t.$('input[name=roomName]').val() + # roomTopic: t.$('input[name=roomTopic]').val() + + # 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' - settings = - roomType: t.$('input[name=roomType]:checked').val() - roomName: t.$('input[name=roomName]').val() - roomTopic: t.$('input[name=roomTopic]').val() + 'keydown input[type=text]': (e, t) -> + if e.keyCode is 13 + e.preventDefault() + t.saveSetting() - 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) + 'click [data-edit]': (e, t) -> + e.preventDefault() + t.editing.set($(e.currentTarget).data('edit')) + setTimeout (-> t.$('input.editing').focus().select()), 100 + + 'click .cancel': (e, t) -> + e.preventDefault() + t.editing.set() - toastr.success TAPi18n.__ 'Settings_updated' + 'click .save': (e, t) -> + e.preventDefault() + t.saveSetting() Template.channelSettings.onCreated -> + @editing = new ReactiveVar + @validateRoomType = => type = @$('input[name=roomType]:checked').val() if type not in ['c', 'p'] @@ -45,7 +69,7 @@ Template.channelSettings.onCreated -> rid = Template.currentData()?.rid room = ChatRoom.findOne rid - if room.u._id isnt Meteor.userId() or room.t not in ['c', 'p'] + if not RocketChat.authz.hasAllPermission('edit-room', @rid) or room.t not in ['c', 'p'] toastr.error t('Not_allowed') return false @@ -59,5 +83,28 @@ Template.channelSettings.onCreated -> @validateRoomTopic = => return true - @validate = => - return @validateRoomType() and @validateRoomName() and @validateRoomTopic() + @saveSetting = => + switch @editing.get() + when 'roomName' + if @validateRoomName() + Meteor.call 'saveRoomSettings', @data?.rid, 'roomName', @$('input[name=roomName]').val(), (err, result) -> + if err + if err.error in [ 'duplicate-name', 'name-invalid' ] + return toastr.error TAPi18n.__(err.reason, err.details.channelName) + return toastr.error TAPi18n.__(err.reason) + toastr.success TAPi18n.__ 'Room_name_changed_successfully' + when 'roomTopic' + if @validateRoomTopic() + Meteor.call 'saveRoomSettings', @data?.rid, 'roomTopic', @$('input[name=roomTopic]').val(), (err, result) -> + if err + return toastr.error TAPi18n.__(err.reason) + toastr.success TAPi18n.__ 'Room_topic_changed_successfully' + when 'roomType' + if @validateRoomType() + Meteor.call 'saveRoomSettings', @data?.rid, 'roomType', @$('input[name=roomType]:checked').val(), (err, result) -> + if err + 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.__ 'Room_type_changed_successfully' + @editing.set() diff --git a/packages/rocketchat-channel-settings/client/views/channelSettings.html b/packages/rocketchat-channel-settings/client/views/channelSettings.html index 36a5cc72b4b2be3b94813fde9f645ad7405e333a..042abb276142e61c553597a307f4612330d7be59 100644 --- a/packages/rocketchat-channel-settings/client/views/channelSettings.html +++ b/packages/rocketchat-channel-settings/client/views/channelSettings.html @@ -12,9 +12,9 @@ <label>{{_ "Name"}}</label> <div> {{#if editing 'roomName'}} - <input type="text" name="roomName" value="{{roomName}}" /> + <input type="text" name="roomName" value="{{roomName}}" class="editing" /> <button type="button" class="button secondary cancel">{{_ "Cancel"}}</button> <button type="button" class="button primary save">{{_ "Save"}}</button> {{else}} - {{roomName}}{{#if canEdit}} <i class="octicon octicon-pencil"></i>{{/if}} + {{roomName}}{{#if canEdit}} <i class="octicon octicon-pencil" data-edit="roomName"></i>{{/if}} {{/if}} </div> </div> @@ -23,9 +23,9 @@ <label>{{_ "Topic"}}</label> <div> {{#if editing 'roomTopic'}} - <input type="text" name="roomTopic" value="{{roomTopic}}" /> + <input type="text" name="roomTopic" value="{{roomTopic}}" class="editing" /> <button type="button" class="button secondary cancel">{{_ "Cancel"}}</button> <button type="button" class="button primary save">{{_ "Save"}}</button> {{else}} - {{roomTopic}}{{#if canEdit}} <i class="octicon octicon-pencil"></i>{{/if}} + {{roomTopic}}{{#if canEdit}} <i class="octicon octicon-pencil" data-edit="roomTopic"></i>{{/if}} {{/if}} </div> </div> @@ -34,10 +34,12 @@ <label>{{_ "Type"}}</label> <div> {{#if editing 'roomType'}} - <label><input type="radio" name="roomType" value="c" checked="{{$eq roomType 'c'}}" /> {{_ "Channel"}}</label> + <label><input type="radio" name="roomType" class="editing" value="c" checked="{{$eq roomType 'c'}}" /> {{_ "Channel"}}</label> <label><input type="radio" name="roomType" value="p" checked="{{$eq roomType 'p'}}" /> {{_ "Private_Group"}}</label> + <button type="button" class="button secondary cancel">{{_ "Cancel"}}</button> + <button type="button" class="button primary save">{{_ "Save"}}</button> {{else}} - {{roomTypeDescription}}{{#if canEdit}} <i class="octicon octicon-pencil"></i>{{/if}} + {{roomTypeDescription}}{{#if canEdit}} <i class="octicon octicon-pencil" data-edit="roomType"></i>{{/if}} {{/if}} </div> </div> diff --git a/packages/rocketchat-channel-settings/i18n/en.i18n.json b/packages/rocketchat-channel-settings/i18n/en.i18n.json index 1191953e3ba8bf209eaf3ea75f397fc8d38bb5b6..f9b02ab82b586729c73f7a5071ffe8eedc85d31f 100644 --- a/packages/rocketchat-channel-settings/i18n/en.i18n.json +++ b/packages/rocketchat-channel-settings/i18n/en.i18n.json @@ -1,10 +1,14 @@ { + "Cancel": "Cancel", "Channel": "Channel", "Private_Group": "Private Group", "Name": "Name", + "Save": "Save", "Topic": "Topic", "Type": "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>" + "room_changed_topic": "Room topic changed to: <em>__room_topic__</em> by <em>__user_by__</em>", + "Room_topic_changed_successfully": "Room topic changed successfully", + "Room_type_changed_successfully": "Room type changed successfully" } diff --git a/packages/rocketchat-channel-settings/server/methods/saveRoomSettings.coffee b/packages/rocketchat-channel-settings/server/methods/saveRoomSettings.coffee index 9cc15ad6fb404613498a29d38bb43efc7b94878a..348d43afc661c7972b6e4845e430b40ec817cd0a 100644 --- a/packages/rocketchat-channel-settings/server/methods/saveRoomSettings.coffee +++ b/packages/rocketchat-channel-settings/server/methods/saveRoomSettings.coffee @@ -1,11 +1,11 @@ Meteor.methods - saveRoomSettings: (rid, settings) -> - console.log '[method] saveRoomSettings'.green, rid, settings + saveRoomSettings: (rid, setting, value) -> + console.log '[method] saveRoomSettings'.green, rid, setting, value unless Match.test rid, String throw new Meteor.Error 'invalid-rid', 'Invalid room' - unless Match.test settings, Match.ObjectIncluding { roomName: String, roomTopic: String, roomType: String } + if setting not in ['roomName', 'roomTopic', 'roomType'] throw new Meteor.Error 'invalid-settings', 'Invalid settings provided' unless RocketChat.authz.hasPermission(Meteor.userId(), 'edit-room', rid) @@ -13,22 +13,21 @@ Meteor.methods room = RocketChat.models.Rooms.findOneById rid if room? - if settings.roomName isnt room.name - name = RocketChat.saveRoomName rid, settings.roomName - RocketChat.models.Messages.createRoomRenamedWithRoomIdRoomNameAndUser rid, name, Meteor.user() - - if settings.roomType isnt room.t - RocketChat.saveRoomType(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() - - if settings.roomTopic isnt room.topic - RocketChat.saveRoomTopic(rid, settings.roomTopic) - RocketChat.models.Messages.createRoomSettingsChangedWithTypeRoomIdMessageAndUser 'room_changed_topic', rid, settings.roomTopic, Meteor.user() + switch setting + when 'roomName' + name = RocketChat.saveRoomName rid, value + RocketChat.models.Messages.createRoomRenamedWithRoomIdRoomNameAndUser rid, name, Meteor.user() + when 'roomTopic' + if value isnt room.topic + RocketChat.saveRoomTopic(rid, value) + RocketChat.models.Messages.createRoomSettingsChangedWithTypeRoomIdMessageAndUser 'room_changed_topic', rid, value, Meteor.user() + when 'roomType' + if value isnt room.t + RocketChat.saveRoomType(rid, value) + if value 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-lib/client/lib/roomExit.coffee b/packages/rocketchat-lib/client/lib/roomExit.coffee index d8a44ae00a37fc9a8ad39caeffa568b27ed2b748..7ee736f5e2ea1661e584d971b7224aee8e50131d 100644 --- a/packages/rocketchat-lib/client/lib/roomExit.coffee +++ b/packages/rocketchat-lib/client/lib/roomExit.coffee @@ -10,8 +10,9 @@ if child? if child.classList.contains('room-container') wrapper = child.querySelector('.messages-box > .wrapper') - if wrapper.scrollTop >= wrapper.scrollHeight - wrapper.clientHeight - child.oldScrollTop = 10e10 - else - child.oldScrollTop = wrapper.scrollTop + if wrapper + if wrapper.scrollTop >= wrapper.scrollHeight - wrapper.clientHeight + child.oldScrollTop = 10e10 + else + child.oldScrollTop = wrapper.scrollTop mainNode.removeChild child