diff --git a/packages/rocketchat-channel-settings-mail-messages/client/views/channelSettingsMailMessages.coffee b/packages/rocketchat-channel-settings-mail-messages/client/views/channelSettingsMailMessages.coffee index 855a105f0f4c96ff6889df49149839c42f1054de..89be6eda31e43c047deffb1988d571aac8e6cd97 100644 --- a/packages/rocketchat-channel-settings-mail-messages/client/views/channelSettingsMailMessages.coffee +++ b/packages/rocketchat-channel-settings-mail-messages/client/views/channelSettingsMailMessages.coffee @@ -1,3 +1,7 @@ +Template.channelSettingsMailMessages.helpers + canSendEmail: -> + return FlowRouter.getRouteName() isnt 'admin-rooms' + Template.channelSettingsMailMessages.events 'click button.mail-messages': (e, t) -> Session.set 'channelSettingsMailMessages', Session.get('openedRoom') diff --git a/packages/rocketchat-channel-settings-mail-messages/client/views/channelSettingsMailMessages.html b/packages/rocketchat-channel-settings-mail-messages/client/views/channelSettingsMailMessages.html index 10b1cce82fe7934fea31b5bed1a2866b29dc3578..318c54ab66cc3b04fb48f1d12143277255df245c 100644 --- a/packages/rocketchat-channel-settings-mail-messages/client/views/channelSettingsMailMessages.html +++ b/packages/rocketchat-channel-settings-mail-messages/client/views/channelSettingsMailMessages.html @@ -1,8 +1,10 @@ <template name="channelSettingsMailMessages"> - <li> - <label>{{_ "Mail_Messages"}}</label> - <div> - <button type="button" class="button primary mail-messages">{{_ "Choose_messages"}}</button> - </div> - </li> + {{#if canSendEmail}} + <li> + <label>{{_ "Mail_Messages"}}</label> + <div> + <button type="button" class="button primary mail-messages">{{_ "Choose_messages"}}</button> + </div> + </li> + {{/if}} </template> diff --git a/packages/rocketchat-channel-settings/client/views/channelSettings.coffee b/packages/rocketchat-channel-settings/client/views/channelSettings.coffee index 417b2aa91e3b195a8b2a5feeff31bece32a8291c..30b0a7a3d4e5a76410613a77e80548a32ec3412f 100644 --- a/packages/rocketchat-channel-settings/client/views/channelSettings.coffee +++ b/packages/rocketchat-channel-settings/client/views/channelSettings.coffee @@ -10,19 +10,19 @@ Template.channelSettings.helpers channelSettings: -> return RocketChat.ChannelSettings.getOptions() roomTypeDescription: -> - roomType = ChatRoom.findOne(@rid)?.t + 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)?.name + return ChatRoom.findOne(@rid, { fields: { name: 1 }})?.name roomTopic: -> - return ChatRoom.findOne(@rid)?.topic + return ChatRoom.findOne(@rid, { fields: { topic: 1 }})?.topic archivationState: -> - return ChatRoom.findOne(@rid)?.archived + return ChatRoom.findOne(@rid, { fields: { archived: 1 }})?.archived archivationStateDescription: -> - archivationState = ChatRoom.findOne(@rid)?.archived + archivationState = ChatRoom.findOne(@rid, { fields: { archived: 1 }})?.archived if archivationState is true return t('Room_archivation_state_true') else diff --git a/packages/rocketchat-channel-settings/server/methods/saveRoomSettings.coffee b/packages/rocketchat-channel-settings/server/methods/saveRoomSettings.coffee index 2b4d8f95e7873e0de8bd02eccbcc18bd4add98e0..2cfc7fcff1032013c662429334538638788c98e2 100644 --- a/packages/rocketchat-channel-settings/server/methods/saveRoomSettings.coffee +++ b/packages/rocketchat-channel-settings/server/methods/saveRoomSettings.coffee @@ -3,12 +3,15 @@ Meteor.methods unless Match.test rid, String throw new Meteor.Error 'invalid-rid', 'Invalid room' - if setting not in ['roomName', 'roomTopic', 'roomType'] + if setting not in ['roomName', 'roomTopic', 'roomType', 'default'] 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' + if setting is 'default' and not RocketChat.authz.hasPermission(@userId, 'view-room-administration') + throw new Meteor.Error 503, 'Not authorized' + room = RocketChat.models.Rooms.findOneById rid if room? switch setting @@ -27,5 +30,7 @@ Meteor.methods else message = TAPi18n.__('Private_Group') RocketChat.models.Messages.createRoomSettingsChangedWithTypeRoomIdMessageAndUser 'room_changed_privacy', rid, message, Meteor.user() + when 'default' + RocketChat.models.Rooms.saveDefaultById rid, value return true diff --git a/packages/rocketchat-lib/server/models/Rooms.coffee b/packages/rocketchat-lib/server/models/Rooms.coffee index 707a61121b6b8cf67bdc1f957e16bf9ff920ec0b..700e170767b109553f4ef6ecf41a87630d11cd9c 100644 --- a/packages/rocketchat-lib/server/models/Rooms.coffee +++ b/packages/rocketchat-lib/server/models/Rooms.coffee @@ -47,6 +47,9 @@ RocketChat.models.Rooms = new class extends RocketChat.models._Base # FIND + findById: (roomId) -> + return @find { _id: roomId }, options + findByType: (type, options) -> query = t: type @@ -361,6 +364,15 @@ RocketChat.models.Rooms = new class extends RocketChat.models._Base return @update query, update + saveDefaultById: (_id, defaultValue) -> + query = + _id: _id + + update = + $set: + default: defaultValue is 'true' + + return @update query, update # INSERT createWithTypeNameUserAndUsernames: (type, name, user, usernames, extraData) -> diff --git a/packages/rocketchat-ui-admin/admin/rooms/adminRoomInfo.coffee b/packages/rocketchat-ui-admin/admin/rooms/adminRoomInfo.coffee deleted file mode 100644 index 731ea8daf1cb41907a8edaf3f89a3f088cadcbbc..0000000000000000000000000000000000000000 --- a/packages/rocketchat-ui-admin/admin/rooms/adminRoomInfo.coffee +++ /dev/null @@ -1,45 +0,0 @@ -Template.adminRoomInfo.helpers - canDeleteRoom: -> - return RocketChat.authz.hasAtLeastOnePermission("delete-#{@t}") - - type: -> - return if @t is 'd' then 'at' else if @t is 'p' then 'lock' else 'hash' - name: -> - if @t is 'c' or @t is 'p' - return @name - else if @t is 'd' - return @usernames.join ' x ' - route: -> - return switch this.t - when 'd' - FlowRouter.path('direct', {username: @name}) - when 'p' - FlowRouter.path('group', {name: @name}) - when 'c' - FlowRouter.path('channel', {name: @name}) - -Template.adminRoomInfo.events - 'click .delete': -> - _id = Template.currentData()._id - swal { - title: t('Are_you_sure') - text: t('Delete_Room_Warning') - type: 'warning' - showCancelButton: true - confirmButtonColor: '#DD6B55' - confirmButtonText: t('Yes_delete_it') - cancelButtonText: t('Cancel') - closeOnConfirm: false - html: false - }, -> - swal - title: t('Deleted') - text: t('Room_has_been_deleted') - type: 'success' - timer: 2000 - showConfirmButton: false - - Meteor.call 'eraseRoom', _id, (error, result) -> - if error - toastr.error error.reason - diff --git a/packages/rocketchat-ui-admin/admin/rooms/adminRoomInfo.html b/packages/rocketchat-ui-admin/admin/rooms/adminRoomInfo.html deleted file mode 100644 index ea948206f17e7cc50d2bf499a7e7f15dd257c786..0000000000000000000000000000000000000000 --- a/packages/rocketchat-ui-admin/admin/rooms/adminRoomInfo.html +++ /dev/null @@ -1,15 +0,0 @@ -<template name="adminRoomInfo"> - {{#unless hasPermission 'view-room-administration'}} - <p>{{_ "You_are_not_authorized_to_view_this_page"}}</p> - {{else}} - <div> - <h3><a href="{{route}}"><i class="icon-{{type}}"></i> {{name}}</a></h3> - </div> - <nav> - {{#if canDeleteRoom}} - <button class='button delete red'><span><i class='icon-trash'></i> {{_ "Delete"}}</span></button> - {{/if}} - <button class='button delete'><span>{{_ "Make_default"}}</span></button> - </nav> - {{/unless}} -</template> diff --git a/packages/rocketchat-ui-admin/admin/rooms/adminRooms.coffee b/packages/rocketchat-ui-admin/admin/rooms/adminRooms.coffee index b8541ee9ce092718db576ad5e5644fe3bef2bb83..7b6d2aa0808672cb6b0e470dffdd570c73e10343 100644 --- a/packages/rocketchat-ui-admin/admin/rooms/adminRooms.coffee +++ b/packages/rocketchat-ui-admin/admin/rooms/adminRooms.coffee @@ -45,10 +45,18 @@ Template.adminRooms.onCreated -> id: 'admin-room', i18nTitle: 'Room_Info', icon: 'octicon octicon-info', - template: 'adminRoomInfo', + template: 'channelSettings', order: 1 }); + RocketChat.ChannelSettings.addOption + id: 'make-default' + template: 'channelSettingsDefault' + data: -> + return Session.get('adminRoomsSelected') + validation: -> + return RocketChat.authz.hasAllPermission('view-room-administration') + @autorun -> filter = instance.filter.get() types = instance.types.get() @@ -73,7 +81,7 @@ Template.adminRooms.onCreated -> if types.length query['t'] = { $in: types } - return ChatRoom.find(query, { limit: instance.limit?.get(), sort: { name: 1 } }) + return ChatRoom.find(query, { limit: instance.limit?.get(), sort: { default: -1, name: 1 } }) @getSearchTypes = -> return _.map $('[name=room-type]:checked'), (input) -> return $(input).val() @@ -96,10 +104,11 @@ Template.adminRooms.events 'click .room-info': (e) -> e.preventDefault() - # Session.set 'adminRoomsSelected', @_id - RocketChat.TabBar.setData @ - RocketChat.TabBar.setTemplate('adminRoomInfo') - # RocketChat.TabBar.openFlex() + + Session.set('adminRoomsSelected', { rid: @_id }); + + RocketChat.TabBar.setData { rid: @_id } + RocketChat.TabBar.setTemplate('channelSettings') 'click .load-more': (e, t) -> e.preventDefault() diff --git a/packages/rocketchat-ui-admin/admin/rooms/channelSettingsDefault.html b/packages/rocketchat-ui-admin/admin/rooms/channelSettingsDefault.html new file mode 100644 index 0000000000000000000000000000000000000000..8f3bb26913ff1648ae97ab4a11636451cf52df11 --- /dev/null +++ b/packages/rocketchat-ui-admin/admin/rooms/channelSettingsDefault.html @@ -0,0 +1,17 @@ +<template name="channelSettingsDefault"> + {{#if canMakeDefault}} + <li> + <label>{{_ "Default"}}</label> + <div> + {{#if editing 'default'}} + <label><input type="radio" name="default" class="editing" value="true" checked="{{$eq roomDefault true}}" /> {{_ "True"}}</label> + <label><input type="radio" name="default" value="false" checked="{{$neq roomDefault true}}" /> {{_ "False"}}</label> + <button type="button" class="button secondary cancel">{{_ "Cancel"}}</button> + <button type="button" class="button primary save">{{_ "Save"}}</button> + {{else}} + <span>{{defaultDescription}} <i class="octicon octicon-pencil" data-edit="default"></i></span> + {{/if}} + </div> + </li> + {{/if}} +</template> diff --git a/packages/rocketchat-ui-admin/admin/rooms/channelSettingsDefault.js b/packages/rocketchat-ui-admin/admin/rooms/channelSettingsDefault.js new file mode 100644 index 0000000000000000000000000000000000000000..0aac57b8512b2cae9d92c07470190ad3a20ac623 --- /dev/null +++ b/packages/rocketchat-ui-admin/admin/rooms/channelSettingsDefault.js @@ -0,0 +1,57 @@ +Template.channelSettingsDefault.helpers({ + canMakeDefault() { + var room = ChatRoom.findOne(this.rid, { fields: { t: 1 }}); + return room && room.t === 'c'; + }, + editing(field) { + return Template.instance().editing.get() === field; + }, + roomDefault() { + var room = ChatRoom.findOne(this.rid, { fields: { default: 1 }}); + + if (room) { + return room.default; + } + }, + defaultDescription() { + var room = ChatRoom.findOne(this.rid, { fields: { default: 1 }}); + if (room && room.default) { + return t('True'); + } else { + return t('False'); + } + } +}); + +Template.channelSettingsDefault.events({ + '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(); + + Meteor.call('saveRoomSettings', this.rid, 'default', $('input[name=default]:checked').val(), (err, result) => { + if (err) { + if (err.error === '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')); + }); + + t.editing.set(); + } +}); + +Template.channelSettingsDefault.onCreated(function() { + this.editing = new ReactiveVar(); +}); diff --git a/packages/rocketchat-ui-admin/package.js b/packages/rocketchat-ui-admin/package.js index b27778bc2a5268dbd3aab3a3d425000562acc557..8537966fb199e9cc5b8d81abc983a62aff9bc137 100644 --- a/packages/rocketchat-ui-admin/package.js +++ b/packages/rocketchat-ui-admin/package.js @@ -26,8 +26,9 @@ Package.onUse(function(api) { api.addFiles('admin/adminFlex.html', 'client'); api.addFiles('admin/adminInfo.html', 'client'); - api.addFiles('admin/rooms/adminRoomInfo.html', 'client'); api.addFiles('admin/rooms/adminRooms.html', 'client'); + api.addFiles('admin/rooms/channelSettingsDefault.html', 'client'); + api.addFiles('admin/rooms/channelSettingsDefault.js', 'client'); api.addFiles('admin/users/adminInviteUser.html', 'client'); api.addFiles('admin/users/adminUserChannels.html', 'client'); @@ -40,7 +41,6 @@ Package.onUse(function(api) { api.addFiles('admin/adminFlex.coffee', 'client'); api.addFiles('admin/adminInfo.coffee', 'client'); - api.addFiles('admin/rooms/adminRoomInfo.coffee', 'client'); api.addFiles('admin/rooms/adminRooms.coffee', 'client'); api.addFiles('admin/users/adminInviteUser.coffee', 'client'); diff --git a/packages/rocketchat-ui-admin/publications/adminRooms.js b/packages/rocketchat-ui-admin/publications/adminRooms.js index a76f3869c6d5b69da83a4fe2467ea4fd7caafca6..29ea6995877e6474ef5703de3c6684b56eed1b55 100644 --- a/packages/rocketchat-ui-admin/publications/adminRooms.js +++ b/packages/rocketchat-ui-admin/publications/adminRooms.js @@ -17,10 +17,12 @@ Meteor.publish('adminRooms', function(filter, types, limit) { u: 1, usernames: 1, muted: 1, - default: 1 + default: 1, + topic: 1 }, limit: limit, sort: { + default: -1, name: 1 } };