diff --git a/app/livechat/client/views/app/livechatDepartmentForm.html b/app/livechat/client/views/app/livechatDepartmentForm.html index c98305f60ea..8afe8a233f2 100644 --- a/app/livechat/client/views/app/livechatDepartmentForm.html +++ b/app/livechat/client/views/app/livechatDepartmentForm.html @@ -44,7 +44,13 @@ - +
+ +
+ + +
+
{{#if customFieldsTemplate}} {{> Template.dynamic template=customFieldsTemplate data=data }} {{/if}} diff --git a/app/livechat/client/views/app/livechatDepartmentForm.js b/app/livechat/client/views/app/livechatDepartmentForm.js index 8316667d669..a5415796212 100644 --- a/app/livechat/client/views/app/livechatDepartmentForm.js +++ b/app/livechat/client/views/app/livechatDepartmentForm.js @@ -29,6 +29,10 @@ Template.livechatDepartmentForm.helpers({ const department = Template.instance().department.get(); return department.showOnOfflineForm === value || (department.showOnOfflineForm === undefined && value === true); }, + requestTagBeforeClosingChat() { + const department = Template.instance().department.get(); + return !!(department && department.requestTagBeforeClosingChat); + }, customFieldsTemplate() { return getCustomFormTemplate('livechatDepartmentForm'); }, @@ -81,6 +85,7 @@ Template.livechatDepartmentForm.events({ const showOnRegistration = instance.$('input[name=showOnRegistration]:checked').val(); const email = instance.$('input[name=email]').val(); const showOnOfflineForm = instance.$('input[name=showOnOfflineForm]:checked').val(); + const requestTagBeforeClosingChat = instance.$('input[name=requestTagBeforeClosingChat]:checked').val(); if (enabled !== '1' && enabled !== '0') { return toastr.error(t('Please_select_enabled_yes_or_no')); @@ -100,6 +105,7 @@ Template.livechatDepartmentForm.events({ description: description.trim(), showOnRegistration: showOnRegistration === '1', showOnOfflineForm: showOnOfflineForm === '1', + requestTagBeforeClosingChat: requestTagBeforeClosingChat === '1', email: email.trim(), }; } diff --git a/app/livechat/server/hooks/beforeCloseRoom.js b/app/livechat/server/hooks/beforeCloseRoom.js new file mode 100644 index 00000000000..0a2f84b489b --- /dev/null +++ b/app/livechat/server/hooks/beforeCloseRoom.js @@ -0,0 +1,22 @@ +import { Meteor } from 'meteor/meteor'; + +import { callbacks } from '../../../callbacks'; +import { LivechatDepartment } from '../../../models'; + +callbacks.add('livechat.beforeCloseRoom', (room) => { + const { departmentId } = room; + if (!departmentId) { + return room; + } + + const department = LivechatDepartment.findOneById(departmentId); + if (!department || !department.requestTagBeforeClosingChat) { + return room; + } + + if (room.tags && room.tags.length > 0) { + return room; + } + + throw new Meteor.Error('error-tags-must-be-assigned-before-closing-chat', 'Tag(s) must be assigned before closing the chat', { method: 'livechat.beforeCloseRoom' }); +}, callbacks.priority.HIGH, 'livechat-before-close-Room'); diff --git a/app/livechat/server/index.js b/app/livechat/server/index.js index 458b660e15a..9c39d74a514 100644 --- a/app/livechat/server/index.js +++ b/app/livechat/server/index.js @@ -6,6 +6,7 @@ import './permissions'; import '../lib/messageTypes'; import './config'; import './roomType'; +import './hooks/beforeCloseRoom'; import './hooks/beforeGetNextAgent'; import './hooks/externalMessage'; import './hooks/leadCapture'; diff --git a/app/livechat/server/lib/Livechat.js b/app/livechat/server/lib/Livechat.js index 1717d216696..b11f444ebf9 100644 --- a/app/livechat/server/lib/Livechat.js +++ b/app/livechat/server/lib/Livechat.js @@ -299,6 +299,9 @@ export const Livechat = { if (!room || room.t !== 'l' || !room.open) { return false; } + + callbacks.run('livechat.beforeCloseRoom', room); + const now = new Date(); const closeData = { diff --git a/packages/rocketchat-i18n/i18n/en.i18n.json b/packages/rocketchat-i18n/i18n/en.i18n.json index 508c89da8f3..e676c51f982 100644 --- a/packages/rocketchat-i18n/i18n/en.i18n.json +++ b/packages/rocketchat-i18n/i18n/en.i18n.json @@ -1326,6 +1326,7 @@ "error-password-policy-not-met-repeatingCharacters": "Password not not meet the server's policy of forbidden repeating characters (you have too many of the same characters next to each other)", "error-push-disabled": "Push is disabled", "error-remove-last-owner": "This is the last owner. Please set a new owner before removing this one.", + "error-tags-must-be-assigned-before-closing-chat": "Tag(s) must be assigned before closing the chat", "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", @@ -2627,6 +2628,7 @@ "Report_this_message_question_mark": "Report this message?", "Reporting": "Reporting", "Request_comment_when_closing_conversation": "Request comment when closing conversation", + "Request_tag_before_closing_chat": "Request tag(s) before closing conversation", "Require_all_tokens": "Require all tokens", "Require_any_token": "Require any token", "Require_password_change": "Require password change", diff --git a/packages/rocketchat-i18n/i18n/pt-BR.i18n.json b/packages/rocketchat-i18n/i18n/pt-BR.i18n.json index 674ad2f9434..4602c05eca7 100644 --- a/packages/rocketchat-i18n/i18n/pt-BR.i18n.json +++ b/packages/rocketchat-i18n/i18n/pt-BR.i18n.json @@ -1251,6 +1251,7 @@ "error-password-policy-not-met-repeatingCharacters": "A senha não está de acordo com a política do servidor, relativamente aos caracteres proibidos repetidos (existem vários caracteres proibidos próximos uns dos outros)", "error-push-disabled": "Notificações push desativadas", "error-remove-last-owner": "Este é o último proprietário. Por favor, defina um novo proprietário antes de remover este.", + "error-tags-must-be-assigned-before-closing-chat": "É obrigatório atribuir tag(s) antes de encerrar a conversa", "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", @@ -2454,6 +2455,7 @@ "Report_sent": "Relatório enviado", "Report_this_message_question_mark": "Denunciar esta mensagem?", "Reporting": "Relatórios", + "Request_comment_when_closing_conversation": "Solicitar comentário ao encerrar a conversa", "Require_all_tokens": "Exigir todos os tokens", "Require_any_token": "Exigir qualquer token", "Require_password_change": "Exigir alteração de senha", @@ -2795,6 +2797,7 @@ "Sync_Users": "Sincronizar Usuários", "System_messages": "Mensagens do sistema", "Tag": "Tag", + "Request_tag_before_closing_chat": "Solicitar tag(s) antes de encerrar a conversa", "Take_it": "Pegue!", "TargetRoom": "Sala de destino", "TargetRoom_Description": "A sala onde as mensagens serão enviadas, que são o resultado desse evento a ser disparado. Somente uma sala alvo é permitida e deve existir.",