diff --git a/.docker/Dockerfile.rhel b/.docker/Dockerfile.rhel index 45789b3ec57a..4b35f1a329e9 100644 --- a/.docker/Dockerfile.rhel +++ b/.docker/Dockerfile.rhel @@ -1,6 +1,6 @@ FROM registry.access.redhat.com/ubi8/nodejs-12 -ENV RC_VERSION 3.17.0 +ENV RC_VERSION 3.17.1 MAINTAINER buildmaster@rocket.chat diff --git a/.github/history.json b/.github/history.json index 4409968e002f..6f5086923400 100644 --- a/.github/history.json +++ b/.github/history.json @@ -63650,6 +63650,77 @@ "4.2" ], "pull_requests": [] + }, + "3.17.1": { + "node_version": "12.22.1", + "npm_version": "6.14.1", + "apps_engine_version": "1.27.1", + "mongo_versions": [ + "3.4", + "3.6", + "4.0", + "4.2" + ], + "pull_requests": [ + { + "pr": "22871", + "title": "[FIX] \"Click to Join\" button is not working if there are no muted users in the room", + "userLogin": "matheusbsilva137", + "description": "- Add check to `room.muted` array so as to cover the case in which it is `undefined`;", + "milestone": "3.17.1", + "contributors": [ + "matheusbsilva137", + "web-flow", + "tassoevan" + ] + }, + { + "pr": "22856", + "title": "[FIX] Message update not working in some cases", + "userLogin": "murtaza98", + "milestone": "3.17.1", + "contributors": [ + "murtaza98", + "KevLehman", + "web-flow" + ] + }, + { + "pr": "22835", + "title": "[FIX] Use correct param on saveBusinessHour method", + "userLogin": "KevLehman", + "milestone": "3.17.1", + "contributors": [ + "KevLehman", + "web-flow", + "renatobecker", + "murtaza98" + ] + }, + { + "pr": "22882", + "title": "[FIX] Apps-Engine's scheduler failing to update run tasks", + "userLogin": "thassiov", + "description": "[Agenda](https://github.com/agenda/agenda), the library that manages scheduling, depended on setting a job property named `nextRunAt` as `undefined` to signal whether it should be run on schedule or not. [Rocket.Chat's current Mongo driver](https://github.com/RocketChat/Rocket.Chat/pull/22399) ignores `undefined` values when updating documents and this was causing jobs to never stop running as Agenda couldn't clear that property (set them as `undefined`). \r\nThis updates Rocket.Chat's dependency on Agenda.js to point to [a fork that fixes the problem](https://github.com/RocketChat/agenda/releases/tag/3.1.2).", + "milestone": "3.17.1", + "contributors": [ + "thassiov", + "web-flow", + "d-gubert" + ] + }, + { + "pr": "22917", + "title": "[FIX] Close omnichannel conversations when agent is deactivated", + "userLogin": "KevLehman", + "milestone": "3.17.1", + "contributors": [ + "KevLehman", + "renatobecker", + "web-flow" + ] + } + ] } } } \ No newline at end of file diff --git a/.snapcraft/resources/prepareRocketChat b/.snapcraft/resources/prepareRocketChat index 07c8b52c203f..881eb8daa1cf 100755 --- a/.snapcraft/resources/prepareRocketChat +++ b/.snapcraft/resources/prepareRocketChat @@ -1,6 +1,6 @@ #!/bin/bash -curl -SLf "https://releases.rocket.chat/3.17.0/download/" -o rocket.chat.tgz +curl -SLf "https://releases.rocket.chat/3.17.1/download/" -o rocket.chat.tgz tar xf rocket.chat.tgz --strip 1 diff --git a/.snapcraft/snap/snapcraft.yaml b/.snapcraft/snap/snapcraft.yaml index 4a24597f5f4d..f3964aabd750 100644 --- a/.snapcraft/snap/snapcraft.yaml +++ b/.snapcraft/snap/snapcraft.yaml @@ -7,7 +7,7 @@ # 5. `snapcraft snap` name: rocketchat-server -version: 3.17.0 +version: 3.17.1 summary: Rocket.Chat server description: Have your own Slack like online chat, built with Meteor. https://rocket.chat/ confinement: strict diff --git a/HISTORY.md b/HISTORY.md index 5e700573d473..cda302321b91 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -1,4 +1,41 @@ +# 3.17.1 +`2021-08-16 ยท 5 ๐Ÿ› ยท 7 ๐Ÿ‘ฉโ€๐Ÿ’ป๐Ÿ‘จโ€๐Ÿ’ป` + +### Engine versions +- Node: `12.22.1` +- NPM: `6.14.1` +- MongoDB: `3.4, 3.6, 4.0, 4.2` +- Apps-Engine: `1.27.1` + +### ๐Ÿ› Bug fixes + + +- "Click to Join" button is not working if there are no muted users in the room ([#22871](https://github.com/RocketChat/Rocket.Chat/pull/22871)) + + - Add check to `room.muted` array so as to cover the case in which it is `undefined`; + +- Apps-Engine's scheduler failing to update run tasks ([#22882](https://github.com/RocketChat/Rocket.Chat/pull/22882)) + + [Agenda](https://github.com/agenda/agenda), the library that manages scheduling, depended on setting a job property named `nextRunAt` as `undefined` to signal whether it should be run on schedule or not. [Rocket.Chat's current Mongo driver](https://github.com/RocketChat/Rocket.Chat/pull/22399) ignores `undefined` values when updating documents and this was causing jobs to never stop running as Agenda couldn't clear that property (set them as `undefined`). + This updates Rocket.Chat's dependency on Agenda.js to point to [a fork that fixes the problem](https://github.com/RocketChat/agenda/releases/tag/3.1.2). + +- Close omnichannel conversations when agent is deactivated ([#22917](https://github.com/RocketChat/Rocket.Chat/pull/22917)) + +- Message update not working in some cases ([#22856](https://github.com/RocketChat/Rocket.Chat/pull/22856)) + +- Use correct param on saveBusinessHour method ([#22835](https://github.com/RocketChat/Rocket.Chat/pull/22835)) + +### ๐Ÿ‘ฉโ€๐Ÿ’ป๐Ÿ‘จโ€๐Ÿ’ป Core Team ๐Ÿค“ + +- [@KevLehman](https://github.com/KevLehman) +- [@d-gubert](https://github.com/d-gubert) +- [@matheusbsilva137](https://github.com/matheusbsilva137) +- [@murtaza98](https://github.com/murtaza98) +- [@renatobecker](https://github.com/renatobecker) +- [@tassoevan](https://github.com/tassoevan) +- [@thassiov](https://github.com/thassiov) + # 3.17.0 `2021-07-30 ยท 7 ๐ŸŽ‰ ยท 19 ๐Ÿš€ ยท 39 ๐Ÿ› ยท 56 ๐Ÿ” ยท 28 ๐Ÿ‘ฉโ€๐Ÿ’ป๐Ÿ‘จโ€๐Ÿ’ป` @@ -5051,7 +5088,7 @@ - [@sampaiodiego](https://github.com/sampaiodiego) # 3.8.0 -`2020-11-13 ยท 14 ๐ŸŽ‰ ยท 4 ๐Ÿš€ ยท 40 ๐Ÿ› ยท 54 ๐Ÿ” ยท 30 ๐Ÿ‘ฉโ€๐Ÿ’ป๐Ÿ‘จโ€๐Ÿ’ป` +`2020-11-14 ยท 14 ๐ŸŽ‰ ยท 4 ๐Ÿš€ ยท 40 ๐Ÿ› ยท 54 ๐Ÿ” ยท 30 ๐Ÿ‘ฉโ€๐Ÿ’ป๐Ÿ‘จโ€๐Ÿ’ป` ### Engine versions - Node: `12.18.4` diff --git a/app/api/server/lib/users.js b/app/api/server/lib/users.js index e91db181dfa2..9801e955f1b7 100644 --- a/app/api/server/lib/users.js +++ b/app/api/server/lib/users.js @@ -10,7 +10,7 @@ export async function findUsersToAutocomplete({ uid, selector }) { const exceptions = selector.exceptions || []; const conditions = selector.conditions || {}; const options = { - fields: { + projection: { name: 1, username: 1, nickname: 1, diff --git a/app/apps/server/bridges/scheduler.ts b/app/apps/server/bridges/scheduler.ts index c1cdf1fd09b7..856d7859eb71 100644 --- a/app/apps/server/bridges/scheduler.ts +++ b/app/apps/server/bridges/scheduler.ts @@ -17,12 +17,12 @@ function _callProcessor(processor: Function): (job: { attrs?: { data: object } } // This field is for internal use, no need to leak to app processor delete (data as any).appId; - processor(data); + return processor(data); }; } /** - * Provides the Apps Engine with task scheduling capabilities + * Provides the Apps Engine with task scheduling capabilities. * It uses {@link agenda:github.com/agenda/agenda} as backend */ export class AppSchedulerBridge extends SchedulerBridge { @@ -43,7 +43,7 @@ export class AppSchedulerBridge extends SchedulerBridge { } /** - * Entity that will be run in a job + * Entity that will be run in a job. * @typedef {Object} Processor * @property {string} id The processor's identifier * @property {function} processor The function that will be run on a given schedule @@ -127,7 +127,7 @@ export class AppSchedulerBridge extends SchedulerBridge { } /** - * Schedules a registered processor to run recurrently according to a given interval + * Schedules a registered processor to run recurrently according to a given interval. * * @param {Object} job * @param {string} job.id The processor's id diff --git a/app/authorization/server/functions/canSendMessage.js b/app/authorization/server/functions/canSendMessage.js index 9c1d48248f9c..31d337c09b55 100644 --- a/app/authorization/server/functions/canSendMessage.js +++ b/app/authorization/server/functions/canSendMessage.js @@ -33,7 +33,7 @@ export const validateRoomMessagePermissionsAsync = async (room, { uid, username, } } - if ((room.muted || []).includes(username)) { + if (room?.muted?.includes(username)) { throw new Error('You_have_been_muted'); } }; diff --git a/app/lib/server/functions/closeOmnichannelConversations.ts b/app/lib/server/functions/closeOmnichannelConversations.ts new file mode 100644 index 000000000000..46be29d8a984 --- /dev/null +++ b/app/lib/server/functions/closeOmnichannelConversations.ts @@ -0,0 +1,19 @@ +import { TAPi18n } from 'meteor/rocketchat:tap-i18n'; + +import { LivechatRooms } from '../../../models/server'; +import { IUser } from '../../../../definition/IUser'; +import { settings } from '../../../settings/server'; +import { Livechat } from '../../../livechat/server/lib/Livechat'; + +type SubscribedRooms = { + rid: string; + t: string; +} + +export const closeOmnichannelConversations = (user: IUser, subscribedRooms: SubscribedRooms[]): void => { + const roomsInfo = LivechatRooms.findByIds(subscribedRooms.map(({ rid }) => rid)); + const language = settings.get('Language') || 'en'; + roomsInfo.map((room: any) => + Livechat.closeRoom({ user, visitor: {}, room, comment: TAPi18n.__('Agent_deactivated', { lng: language }) }), + ); +}; diff --git a/app/lib/server/functions/setUserActiveStatus.js b/app/lib/server/functions/setUserActiveStatus.js index fe9a889e0cf1..28d3111d0d2f 100644 --- a/app/lib/server/functions/setUserActiveStatus.js +++ b/app/lib/server/functions/setUserActiveStatus.js @@ -6,6 +6,7 @@ import * as Mailer from '../../../mailer'; import { Users, Subscriptions, Rooms } from '../../../models'; import { settings } from '../../../settings'; import { relinquishRoomOwnerships } from './relinquishRoomOwnerships'; +import { closeOmnichannelConversations } from './closeOmnichannelConversations'; import { shouldRemoveOrChangeOwner, getSubscribedRoomsForUserWithDetails } from './getRoomsWithSingleOwner'; import { getUserSingleOwnedRooms } from './getUserSingleOwnedRooms'; @@ -41,13 +42,17 @@ export function setUserActiveStatus(userId, active, confirmRelinquish = false) { // Users without username can't do anything, so there is no need to check for owned rooms if (user.username != null && !active) { const subscribedRooms = getSubscribedRoomsForUserWithDetails(userId); + // give omnichannel rooms a special treatment :) + const chatSubscribedRooms = subscribedRooms.filter(({ t }) => t !== 'l'); + const livechatSubscribedRooms = subscribedRooms.filter(({ t }) => t === 'l'); - if (shouldRemoveOrChangeOwner(subscribedRooms) && !confirmRelinquish) { - const rooms = getUserSingleOwnedRooms(subscribedRooms); + if (shouldRemoveOrChangeOwner(chatSubscribedRooms) && !confirmRelinquish) { + const rooms = getUserSingleOwnedRooms(chatSubscribedRooms); throw new Meteor.Error('user-last-owner', '', rooms); } - relinquishRoomOwnerships(user._id, subscribedRooms, false); + closeOmnichannelConversations(user, livechatSubscribedRooms); + relinquishRoomOwnerships(user, chatSubscribedRooms, false); } Users.setUserActive(userId, active); diff --git a/app/lib/server/lib/processDirectEmail.js b/app/lib/server/lib/processDirectEmail.js index deab36914c60..b00a042d476d 100644 --- a/app/lib/server/lib/processDirectEmail.js +++ b/app/lib/server/lib/processDirectEmail.js @@ -87,7 +87,7 @@ export const processDirectEmail = function(email) { return false; } - if ((room.muted || []).includes(user.username)) { + if (room?.muted?.includes(user.username)) { // user is muted return false; } diff --git a/app/livechat/server/methods/saveBusinessHour.ts b/app/livechat/server/methods/saveBusinessHour.ts index d5cd25349203..b5bc8b2c6645 100644 --- a/app/livechat/server/methods/saveBusinessHour.ts +++ b/app/livechat/server/methods/saveBusinessHour.ts @@ -5,6 +5,10 @@ import { businessHourManager } from '../business-hour'; Meteor.methods({ 'livechat:saveBusinessHour'(businessHourData: ILivechatBusinessHour) { - businessHourManager.saveBusinessHour(businessHourData); + try { + Promise.await(businessHourManager.saveBusinessHour(businessHourData)); + } catch (e) { + throw new Meteor.Error(e.message); + } }, }); diff --git a/app/models/server/models/LivechatRooms.js b/app/models/server/models/LivechatRooms.js index a57b5e9f3581..0b3d2b24e760 100644 --- a/app/models/server/models/LivechatRooms.js +++ b/app/models/server/models/LivechatRooms.js @@ -138,6 +138,21 @@ export class LivechatRooms extends Base { return this.find(query, options); } + findByIds(ids, fields) { + const options = {}; + + if (fields) { + options.fields = fields; + } + + const query = { + t: 'l', + _id: { $in: ids }, + }; + + return this.find(query, options); + } + findOneById(_id, fields = {}) { const options = {}; diff --git a/app/utils/rocketchat.info b/app/utils/rocketchat.info index 07463b24bd15..220dddaa4d7c 100644 --- a/app/utils/rocketchat.info +++ b/app/utils/rocketchat.info @@ -1,3 +1,3 @@ { - "version": "3.17.0" + "version": "3.17.1" } diff --git a/app/videobridge/client/actionLink.js b/app/videobridge/client/actionLink.js index fec4addeb4a2..607468e421cb 100644 --- a/app/videobridge/client/actionLink.js +++ b/app/videobridge/client/actionLink.js @@ -15,7 +15,7 @@ actionLinks.register('joinJitsiCall', function(message, params, instance) { const currentTime = new Date().getTime(); const jitsiTimeout = new Date((room && room.jitsiTimeout) || currentTime).getTime(); - if (room && room.muted.includes(username)) { + if (room && room?.muted?.includes(username)) { toastr.error(TAPi18n.__('You_have_been_muted', '')); } else if (jitsiTimeout > currentTime) { instance.tabBar.open('video'); diff --git a/ee/app/canned-responses/server/hooks/onMessageSentParsePlaceholder.ts b/ee/app/canned-responses/server/hooks/onMessageSentParsePlaceholder.ts index de3760dc7ed6..f76f5a988d36 100644 --- a/ee/app/canned-responses/server/hooks/onMessageSentParsePlaceholder.ts +++ b/ee/app/canned-responses/server/hooks/onMessageSentParsePlaceholder.ts @@ -1,7 +1,8 @@ import get from 'lodash.get'; +import { settings } from '../../../../../app/settings/server'; import { callbacks } from '../../../../../app/callbacks/server'; -import { Users, LivechatVisitors } from '../../../../../app/models/server'; +import { Users, LivechatVisitors, Rooms } from '../../../../../app/models/server'; import { IMessage } from '../../../../../definition/IMessage'; import { IOmnichannelRoom, isOmnichannelRoom } from '../../../../../definition/IRoom'; @@ -28,7 +29,12 @@ const placeholderFields = { }, }; -callbacks.add('beforeSaveMessage', (message: IMessage, room: IOmnichannelRoom): any => { +const handleBeforeSaveMessage = (message: IMessage, room: IOmnichannelRoom): any => { + if (!message.msg || message.msg === '') { + return message; + } + + room = room?._id ? room : Rooms.findOneById(message.rid); if (!isOmnichannelRoom(room)) { return message; } @@ -51,4 +57,13 @@ callbacks.add('beforeSaveMessage', (message: IMessage, room: IOmnichannelRoom): message.msg = messageText; return message; -}, callbacks.priority.LOW, 'canned-responses-replace-placeholders'); +}; + +settings.get('Canned_Responses_Enable', function(_, value) { + if (!value) { + callbacks.remove('beforeSaveMessage', 'canned-responses-replace-placeholders'); + return; + } + + callbacks.add('beforeSaveMessage', handleBeforeSaveMessage, callbacks.priority.MEDIUM, 'canned-responses-replace-placeholders'); +}); diff --git a/ee/app/livechat-enterprise/server/business-hour/Custom.ts b/ee/app/livechat-enterprise/server/business-hour/Custom.ts index 890276363f5b..b5ae8b18a2cc 100644 --- a/ee/app/livechat-enterprise/server/business-hour/Custom.ts +++ b/ee/app/livechat-enterprise/server/business-hour/Custom.ts @@ -35,15 +35,19 @@ class CustomBusinessHour extends AbstractBusinessHourType implements IBusinessHo } async saveBusinessHour(businessHour: ILivechatBusinessHour & IBusinessHoursExtraProperties): Promise { + const existingBusinessHour = await this.BusinessHourRepository.findOne({ name: businessHour.name }, { projection: { _id: 1 } }) as ILivechatBusinessHour; + if (existingBusinessHour && existingBusinessHour._id !== businessHour._id) { + throw new Error('error-business-hour-name-already-in-use'); + } const { timezoneName, departmentsToApplyBusinessHour, ...businessHourData } = businessHour; businessHourData.timezone = { name: timezoneName, utc: this.getUTCFromTimezone(timezoneName), }; const departments = departmentsToApplyBusinessHour?.split(',').filter(Boolean) || []; - const businessHourToReturn = { ...businessHourData }; + const businessHourToReturn = { ...businessHourData, departmentsToApplyBusinessHour }; delete businessHourData.departments; - const businessHourId = await this.baseSaveBusinessHour(businessHour); + const businessHourId = await this.baseSaveBusinessHour(businessHourData); const currentDepartments = (await this.DepartmentsRepository.findByBusinessHourId(businessHourId, { fields: { _id: 1 } }).toArray()).map((dept: any) => dept._id); const toRemove = [...currentDepartments.filter((dept: string) => !departments.includes(dept))]; const toAdd = [...departments.filter((dept: string) => !currentDepartments.includes(dept))]; diff --git a/ee/app/livechat-enterprise/server/business-hour/Helper.ts b/ee/app/livechat-enterprise/server/business-hour/Helper.ts index dace2aeb3e53..ef729e8def20 100644 --- a/ee/app/livechat-enterprise/server/business-hour/Helper.ts +++ b/ee/app/livechat-enterprise/server/business-hour/Helper.ts @@ -13,7 +13,7 @@ const getAllAgentIdsWithoutDepartment = async (): Promise => { const agentIdsWithDepartment = (await LivechatDepartmentAgents.find({}, { fields: { agentId: 1 } }).toArray()).map((dept: any) => dept.agentId); const agentIdsWithoutDepartment = (await Users.findUsersInRolesWithQuery('livechat-agent', { _id: { $nin: agentIdsWithDepartment }, - }, { fields: { _id: 1 } }).toArray()).map((user: any) => user._id); + }, { projection: { _id: 1 } }).toArray()).map((user: any) => user._id); return agentIdsWithoutDepartment; }; @@ -21,8 +21,8 @@ const getAgentIdsToHandle = async (businessHour: Record): Promise dept._id); - return (await LivechatDepartmentAgents.findByDepartmentIds(departmentIds, { fields: { agentId: 1 } }).toArray()).map((dept: any) => dept.agentId); + const departmentIds = (await LivechatDepartment.findEnabledByBusinessHourId(businessHour._id, { projection: { _id: 1 } }).toArray()).map((dept: any) => dept._id); + return (await LivechatDepartmentAgents.findByDepartmentIds(departmentIds, { projection: { agentId: 1 } }).toArray()).map((dept: any) => dept.agentId); }; export const openBusinessHour = async (businessHour: Record): Promise => { diff --git a/package-lock.json b/package-lock.json index a2870a8975b8..e53e8d1a1614 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "Rocket.Chat", - "version": "3.17.0", + "version": "3.17.1", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -18901,9 +18901,8 @@ "integrity": "sha512-/9aQCnQHF+0IiCl0qhXoK7qs//SwYE7zX8lsr/DNk1BRAHYxeLZPL4pguwK29gUEqasYQjqPtEpDRSWEkdHn9g==" }, "agenda": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/agenda/-/agenda-3.1.0.tgz", - "integrity": "sha512-UtxV/37gkjDYl0H2Lr4hPrBqOhAgtxYeGSYooSd1eyOmXlK1wFkbs77nItOykufFRv6tR6fskWP2RkyBndXYtg==", + "version": "github:RocketChat/agenda#c2cfcc532b8409561104dca980e6adbbcbdf5442", + "from": "github:RocketChat/agenda#3.1.2", "requires": { "cron": "~1.8.0", "date.js": "~0.3.3", @@ -18923,9 +18922,9 @@ } }, "bson": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/bson/-/bson-1.1.5.tgz", - "integrity": "sha512-kDuEzldR21lHciPQAIulLs1LZlCXdLziXI6Mb/TDkwXhb//UORJNPXgcRs2CuO4H0DcMkpfT3/ySsP3unoZjBg==" + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/bson/-/bson-1.1.6.tgz", + "integrity": "sha512-EvVNVeGo4tHxwi8L6bPj3y3itEvStdwvvlojVxxbyYfoaxJ6keLgrTuKdyfEAszFK+H3olzBuafE0yoh0D1gdg==" }, "debug": { "version": "4.1.1", @@ -18949,9 +18948,9 @@ } }, "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" } } }, diff --git a/package.json b/package.json index 8e5f493043b5..5e4ee9de142d 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "Rocket.Chat", "description": "The Ultimate Open Source WebChat Platform", - "version": "3.17.0", + "version": "3.17.1", "author": { "name": "Rocket.Chat", "url": "https://rocket.chat/" @@ -176,7 +176,7 @@ "@slack/client": "^4.12.0", "@types/lodash": "^4.14.171", "adm-zip": "0.4.14", - "agenda": "^3.1.0", + "agenda": "github:RocketChat/agenda#3.1.2", "apn": "2.2.0", "archiver": "^3.1.1", "arraybuffer-to-string": "^1.0.2", diff --git a/packages/rocketchat-i18n/i18n/en.i18n.json b/packages/rocketchat-i18n/i18n/en.i18n.json index ccb4b1f1ba05..6c82955e481e 100644 --- a/packages/rocketchat-i18n/i18n/en.i18n.json +++ b/packages/rocketchat-i18n/i18n/en.i18n.json @@ -301,6 +301,7 @@ "Agent_messages": "Agent Messages", "Agent_Name_Placeholder": "Please enter an agent name...", "Agent_removed": "Agent removed", + "Agent_deactivated": "Agent was deactivated", "Agents": "Agents", "Alerts": "Alerts", "Alias": "Alias", diff --git a/packages/rocketchat-i18n/i18n/es.i18n.json b/packages/rocketchat-i18n/i18n/es.i18n.json index 4af800aab2db..3027630e92f8 100644 --- a/packages/rocketchat-i18n/i18n/es.i18n.json +++ b/packages/rocketchat-i18n/i18n/es.i18n.json @@ -301,6 +301,7 @@ "Agent_messages": "Mensajes del agente", "Agent_Name_Placeholder": "Por favor, introduzca el nombre de un agente...", "Agent_removed": "Agente eliminado", + "Agent_deactivated": "Agente desactivado", "Agents": "Agentes", "Alerts": "Alertas", "Alias": "Alias",