diff --git a/packages/rocketchat-i18n/i18n/en.i18n.json b/packages/rocketchat-i18n/i18n/en.i18n.json
index 46d3aebac22..ca20919b0ce 100644
--- a/packages/rocketchat-i18n/i18n/en.i18n.json
+++ b/packages/rocketchat-i18n/i18n/en.i18n.json
@@ -1063,7 +1063,9 @@
"error-remove-last-owner": "This is the last owner. Please set a new owner before removing this one.",
"error-role-in-use": "Cannot delete role because it's in use",
"error-role-name-required": "Role name is required",
+ "error-room-is-not-closed": "Room is not closed",
"error-the-field-is-required": "The field __field__ is required.",
+ "error-this-is-not-a-livechat-room": "This is not a Livechat room",
"error-too-many-requests": "Error, too many requests. Please slow down. You must wait __seconds__ seconds before trying again.",
"error-user-has-no-roles": "User has no roles",
"error-user-is-not-activated": "User is not activated",
diff --git a/packages/rocketchat-i18n/i18n/pt-BR.i18n.json b/packages/rocketchat-i18n/i18n/pt-BR.i18n.json
index 30e1105566f..3c33b5ba9d8 100644
--- a/packages/rocketchat-i18n/i18n/pt-BR.i18n.json
+++ b/packages/rocketchat-i18n/i18n/pt-BR.i18n.json
@@ -1059,7 +1059,9 @@
"error-remove-last-owner": "Este é o último proprietário. Por favor, defina um novo proprietário antes de remover este.",
"error-role-in-use": "Não é possível remover o papel pois ele está em uso",
"error-role-name-required": "Nome do papel é obrigatório",
+ "error-room-is-not-closed": "Sala não está fechada",
"error-the-field-is-required": "O campo __field__ é obrigatório.",
+ "error-this-is-not-a-livechat-room": "Esta não é uma sala de Livechat",
"error-too-many-requests": "Erro, muitas solicitações. Por favor, diminua a velocidade. Você deve esperar __seconds__ segundos antes de tentar novamente.",
"error-user-has-no-roles": "O usuário não possui permissões",
"error-user-is-not-activated": "O usuário não está ativo",
diff --git a/packages/rocketchat-i18n/i18n/pt.i18n.json b/packages/rocketchat-i18n/i18n/pt.i18n.json
index bf32a1263dd..598fdcd3af0 100644
--- a/packages/rocketchat-i18n/i18n/pt.i18n.json
+++ b/packages/rocketchat-i18n/i18n/pt.i18n.json
@@ -1059,7 +1059,9 @@
"error-remove-last-owner": "Este é o último proprietário. Por favor, defina um novo proprietário antes de remover este.",
"error-role-in-use": "Não é possível remover o papel pois ele está em uso",
"error-role-name-required": "Nome do papel é obrigatório",
+ "error-room-is-not-closed": "Sala não está fechada",
"error-the-field-is-required": "O campo __field__ é obrigatório.",
+ "error-this-is-not-a-livechat-room": "Esta não é uma sala de Livechat",
"error-too-many-requests": "Erro, muitas solicitações. Por favor, diminua a velocidade. Você deve esperar __seconds__ segundos antes de tentar novamente.",
"error-user-has-no-roles": "O usuário não possui papéis",
"error-user-is-not-activated": "O usuário não está ativo",
diff --git a/packages/rocketchat-livechat/client/views/app/livechatCurrentChats.html b/packages/rocketchat-livechat/client/views/app/livechatCurrentChats.html
index 6e3dda88d2e..4606ad8e4f0 100644
--- a/packages/rocketchat-livechat/client/views/app/livechatCurrentChats.html
+++ b/packages/rocketchat-livechat/client/views/app/livechatCurrentChats.html
@@ -41,7 +41,8 @@
{{_ "Served_By"}} |
{{_ "Started_At"}} |
{{_ "Last_Message_At"}} |
- {{_ "Status"}} |
+ {{_ "Status"}} |
+ |
@@ -52,6 +53,15 @@
{{startedAt}} |
{{lastMessage}} |
{{status}} |
+ {{#requiresPermission 'remove-closed-livechat-rooms'}}
+ {{#if isClosed}}
+ |
+ {{else}}
+ |
+ {{/if}}
+ {{else}}
+ |
+ {{/requiresPermission}}
{{/each}}
diff --git a/packages/rocketchat-livechat/client/views/app/livechatCurrentChats.js b/packages/rocketchat-livechat/client/views/app/livechatCurrentChats.js
index 659784c4f33..f726f14381d 100644
--- a/packages/rocketchat-livechat/client/views/app/livechatCurrentChats.js
+++ b/packages/rocketchat-livechat/client/views/app/livechatCurrentChats.js
@@ -21,6 +21,9 @@ Template.livechatCurrentChats.helpers({
},
agents() {
return AgentUsers.find({}, { sort: { name: 1 } });
+ },
+ isClosed() {
+ return !this.open;
}
});
@@ -55,6 +58,34 @@ Template.livechatCurrentChats.events({
instance.filter.set(filter);
instance.limit.set(20);
+ },
+ 'click .remove-livechat-room'(event) {
+ event.preventDefault();
+ event.stopPropagation();
+
+ modal.open({
+ title: t('Are_you_sure'),
+ type: 'warning',
+ showCancelButton: true,
+ confirmButtonColor: '#DD6B55',
+ confirmButtonText: t('Yes'),
+ cancelButtonText: t('Cancel'),
+ closeOnConfirm: false,
+ html: false
+ }, () => {
+ Meteor.call('livechat:removeRoom', this._id, function(error/*, result*/) {
+ if (error) {
+ return handleError(error);
+ }
+ modal.open({
+ title: t('Deleted'),
+ text: t('Room_has_been_deleted'),
+ type: 'success',
+ timer: 1000,
+ showConfirmButton: false
+ });
+ });
+ });
}
});
diff --git a/packages/rocketchat-livechat/package.js b/packages/rocketchat-livechat/package.js
index 537db759cac..85745d4c6e9 100644
--- a/packages/rocketchat-livechat/package.js
+++ b/packages/rocketchat-livechat/package.js
@@ -160,6 +160,7 @@ Package.onUse(function(api) {
api.addFiles('server/methods/removeDepartment.js', 'server');
api.addFiles('server/methods/removeManager.js', 'server');
api.addFiles('server/methods/removeTrigger.js', 'server');
+ api.addFiles('server/methods/removeRoom.js', 'server');
api.addFiles('server/methods/saveAppearance.js', 'server');
api.addFiles('server/methods/saveCustomField.js', 'server');
api.addFiles('server/methods/saveDepartment.js', 'server');
diff --git a/packages/rocketchat-livechat/server/methods/removeRoom.js b/packages/rocketchat-livechat/server/methods/removeRoom.js
new file mode 100644
index 00000000000..a91f4309de7
--- /dev/null
+++ b/packages/rocketchat-livechat/server/methods/removeRoom.js
@@ -0,0 +1,31 @@
+Meteor.methods({
+ 'livechat:removeRoom'(rid) {
+ if (!Meteor.userId() || !RocketChat.authz.hasPermission(Meteor.userId(), 'remove-closed-livechat-rooms')) {
+ throw new Meteor.Error('error-not-allowed', 'Not allowed', { method: 'livechat:removeRoom' });
+ }
+
+ const room = RocketChat.models.Rooms.findOneById(rid);
+
+ if (!room) {
+ throw new Meteor.Error('error-invalid-room', 'Invalid room', {
+ method: 'livechat:removeRoom'
+ });
+ }
+
+ if (room.t !== 'l') {
+ throw new Meteor.Error('error-this-is-not-a-livechat-room', 'This is not a Livechat room', {
+ method: 'livechat:removeRoom'
+ });
+ }
+
+ if (room.open) {
+ throw new Meteor.Error('error-room-is-not-closed', 'Room is not closed', {
+ method: 'livechat:removeRoom'
+ });
+ }
+
+ RocketChat.models.Messages.removeByRoomId(rid);
+ RocketChat.models.Subscriptions.removeByRoomId(rid);
+ return RocketChat.models.Rooms.removeById(rid);
+ }
+});
diff --git a/server/startup/migrations/v127.js b/server/startup/migrations/v127.js
new file mode 100644
index 00000000000..546a7d526ce
--- /dev/null
+++ b/server/startup/migrations/v127.js
@@ -0,0 +1,20 @@
+RocketChat.Migrations.add({
+ version: 127,
+ up() {
+ if (RocketChat.models && RocketChat.models.Permissions) {
+
+ const newPermission = RocketChat.models.Permissions.findOne('view-livechat-manager');
+ if (newPermission && newPermission.roles.length) {
+ RocketChat.models.Permissions.upsert({ _id: 'remove-closed-livechat-rooms' }, { $set: { roles: newPermission.roles } });
+ }
+ }
+ },
+
+ down() {
+ if (RocketChat.models && RocketChat.models.Permissions) {
+
+ // Revert permission
+ RocketChat.models.Permissions.remove({ _id: 'remove-closed-livechat-rooms' });
+ }
+ }
+});