diff --git a/packages/rocketchat-channel-settings/client/views/channelSettings.coffee b/packages/rocketchat-channel-settings/client/views/channelSettings.coffee index 30b0a7a3d4e5a76410613a77e80548a32ec3412f..d481640a701410f7aaaf2cb75e5e4ef92a593fb4 100644 --- a/packages/rocketchat-channel-settings/client/views/channelSettings.coffee +++ b/packages/rocketchat-channel-settings/client/views/channelSettings.coffee @@ -4,9 +4,9 @@ Template.channelSettings.helpers editing: (field) -> return Template.instance().editing.get() is field notDirect: -> - return ChatRoom.findOne(@rid)?.t isnt 'd' + return ChatRoom.findOne(@rid, { fields: { t: 1 }})?.t isnt 'd' roomType: -> - return ChatRoom.findOne(@rid)?.t + return ChatRoom.findOne(@rid, { fields: { t: 1 }})?.t channelSettings: -> return RocketChat.ChannelSettings.getOptions() roomTypeDescription: -> diff --git a/packages/rocketchat-ui-admin/admin/rooms/adminRoomInfo.coffee b/packages/rocketchat-ui-admin/admin/rooms/adminRoomInfo.coffee new file mode 100644 index 0000000000000000000000000000000000000000..5592231eb5d8f248b54b1b924e6701c6044678f4 --- /dev/null +++ b/packages/rocketchat-ui-admin/admin/rooms/adminRoomInfo.coffee @@ -0,0 +1,114 @@ +Template.adminRoomInfo.helpers + selectedRoom: -> + return Session.get 'adminRoomsSelected' + canEdit: -> + return RocketChat.authz.hasAllPermission('edit-room', @rid) + editing: (field) -> + return Template.instance().editing.get() is field + notDirect: -> + return ChatRoom.findOne(@rid, { fields: { t: 1 }})?.t isnt 'd' + roomType: -> + return ChatRoom.findOne(@rid, { fields: { t: 1 }})?.t + channelSettings: -> + return RocketChat.ChannelSettings.getOptions() + roomTypeDescription: -> + roomType = ChatRoom.findOne(@rid, { fields: { t: 1 }})?.t + if roomType is 'c' + return t('Channel') + else if roomType is 'p' + return t('Private_Group') + roomName: -> + return ChatRoom.findOne(@rid, { fields: { name: 1 }})?.name + roomTopic: -> + return ChatRoom.findOne(@rid, { fields: { topic: 1 }})?.topic + archivationState: -> + return ChatRoom.findOne(@rid, { fields: { archived: 1 }})?.archived + archivationStateDescription: -> + archivationState = ChatRoom.findOne(@rid, { fields: { archived: 1 }})?.archived + if archivationState is true + return t('Room_archivation_state_true') + else + return t('Room_archivation_state_false') + +Template.adminRoomInfo.events + 'keydown input[type=text]': (e, t) -> + if e.keyCode is 13 + e.preventDefault() + t.saveSetting() + + '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() + + 'click .save': (e, t) -> + e.preventDefault() + t.saveSetting() + +Template.adminRoomInfo.onCreated -> + @editing = new ReactiveVar + + @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 not RocketChat.authz.hasAllPermission('edit-room', @rid) 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 + + @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' + when 'archivationState' + if @$('input[name=archivationState]:checked').val() is 'true' + if ChatRoom.findOne(@data.rid)?.archived isnt true + Meteor.call 'archiveRoom', @data?.rid, (err, results) -> + return toastr.error err.reason if err + toastr.success TAPi18n.__ 'Room_archived' + else + if ChatRoom.findOne(@data.rid)?.archived is true + Meteor.call 'unarchiveRoom', @data?.rid, (err, results) -> + return toastr.error err.reason if err + toastr.success TAPi18n.__ 'Room_unarchived' + @editing.set() diff --git a/packages/rocketchat-ui-admin/admin/rooms/adminRoomInfo.html b/packages/rocketchat-ui-admin/admin/rooms/adminRoomInfo.html new file mode 100644 index 0000000000000000000000000000000000000000..7da6881963dcdb23559432488d7eb877eaff59eb --- /dev/null +++ b/packages/rocketchat-ui-admin/admin/rooms/adminRoomInfo.html @@ -0,0 +1,70 @@ +<template name="adminRoomInfo"> + {{#with selectedRoom}} + <div class="content"> + <div class="list-view channel-settings"> + <div class="status"> + <h2>{{_ "Room_Info"}}</h2> + </div> + <form> + <ul class="list clearfix"> + {{#if notDirect}} + <li> + <label>{{_ "Name"}}</label> + <div> + {{#if editing '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}} + <span>{{roomName}}{{#if canEdit}} <i class="octicon octicon-pencil" data-edit="roomName"></i>{{/if}}</span> + {{/if}} + </div> + </li> + {{/if}} + <li> + <label>{{_ "Topic"}}</label> + <div> + {{#if editing '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}} + <span>{{roomTopic}}{{#if canEdit}} <i class="octicon octicon-pencil" data-edit="roomTopic"></i>{{/if}}</span> + {{/if}} + </div> + </li> + {{#if notDirect}} + <li> + <label>{{_ "Type"}}</label> + <div> + {{#if editing 'roomType'}} + <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}} + <span>{{roomTypeDescription}}{{#if canEdit}} <i class="octicon octicon-pencil" data-edit="roomType"></i>{{/if}}</span> + {{/if}} + </div> + </li> + {{/if}} + {{#if notDirect}} + <li> + <label>{{_ "Room_archivation_state"}}</label> + <div> + {{#if editing 'archivationState'}} + <label><input type="radio" name="archivationState" class="editing" value="true" checked="{{$eq archivationState true}}" /> {{_ "Room_archivation_state_true"}}</label> + <label><input type="radio" name="archivationState" value="false" checked="{{$neq archivationState true}}" /> {{_ "Room_archivation_state_false"}}</label> + <button type="button" class="button secondary cancel">{{_ "Cancel"}}</button> + <button type="button" class="button primary save">{{_ "Save"}}</button> + {{else}} + <span>{{archivationStateDescription}}{{#if canEdit}} <i class="octicon octicon-pencil" data-edit="archivationState"></i>{{/if}}</span> + {{/if}} + </div> + </li> + {{/if}} + {{#each channelSettings}} + {{> Template.dynamic template=template data=data}} + {{/each}} + </ul> + </form> + </div> + </div> + {{/with}} +</template> diff --git a/packages/rocketchat-ui-admin/admin/rooms/adminRooms.coffee b/packages/rocketchat-ui-admin/admin/rooms/adminRooms.coffee index de2f055a6e6e39e83a5cb7de45c64c6a85dc7450..4a83338a9580dff593f771e5f49215254a315ec1 100644 --- a/packages/rocketchat-ui-admin/admin/rooms/adminRooms.coffee +++ b/packages/rocketchat-ui-admin/admin/rooms/adminRooms.coffee @@ -25,8 +25,6 @@ Template.adminRooms.helpers return TAPi18n.__ 'Direct Message' if @t is 'p' return TAPi18n.__ 'Private Group' - roomData: -> - return ChatRoom.findOne Session.get 'adminRoomsSelected' flexTemplate: -> return RocketChat.TabBar.getTemplate() @@ -51,7 +49,7 @@ Template.adminRooms.onCreated -> id: 'admin-room', i18nTitle: 'Room_Info', icon: 'octicon octicon-info', - template: 'channelSettings', + template: 'adminRoomInfo', order: 1 }); @@ -113,8 +111,7 @@ Template.adminRooms.events Session.set('adminRoomsSelected', { rid: @_id }); - RocketChat.TabBar.setData { rid: @_id } - RocketChat.TabBar.setTemplate('channelSettings') + RocketChat.TabBar.setTemplate('adminRoomInfo') 'click .load-more': (e, t) -> e.preventDefault() diff --git a/packages/rocketchat-ui-admin/package.js b/packages/rocketchat-ui-admin/package.js index 8537966fb199e9cc5b8d81abc983a62aff9bc137..cee0e308e03e49839787734ec6eff4c4518ce4f0 100644 --- a/packages/rocketchat-ui-admin/package.js +++ b/packages/rocketchat-ui-admin/package.js @@ -27,6 +27,8 @@ Package.onUse(function(api) { api.addFiles('admin/adminInfo.html', 'client'); api.addFiles('admin/rooms/adminRooms.html', 'client'); + api.addFiles('admin/rooms/adminRoomInfo.html', 'client'); + api.addFiles('admin/rooms/adminRoomInfo.coffee', 'client'); api.addFiles('admin/rooms/channelSettingsDefault.html', 'client'); api.addFiles('admin/rooms/channelSettingsDefault.js', 'client');