diff --git a/.changeset/yellow-eggs-behave.md b/.changeset/yellow-eggs-behave.md new file mode 100644 index 0000000000000..2e4363e6818b6 --- /dev/null +++ b/.changeset/yellow-eggs-behave.md @@ -0,0 +1,6 @@ +--- +"@rocket.chat/meteor": patch +"@rocket.chat/rest-typings": patch +--- + +Fixes an issue that prevented the action of removing an agent when editing a department to work. diff --git a/apps/meteor/app/livechat/server/lib/departmentsLib.ts b/apps/meteor/app/livechat/server/lib/departmentsLib.ts index d0fe436a5231e..31c891c23e5aa 100644 --- a/apps/meteor/app/livechat/server/lib/departmentsLib.ts +++ b/apps/meteor/app/livechat/server/lib/departmentsLib.ts @@ -185,7 +185,7 @@ export async function saveDepartmentAgents( departmentAgents: { upsert?: (Pick & { count?: number; - sort?: number; + order?: number; })[]; remove?: Pick[]; }, diff --git a/apps/meteor/client/views/omnichannel/departments/utils/formatAgentListPayload.ts b/apps/meteor/client/views/omnichannel/departments/utils/formatAgentListPayload.ts index 267f0c68257a6..c498fce57d0f8 100644 --- a/apps/meteor/client/views/omnichannel/departments/utils/formatAgentListPayload.ts +++ b/apps/meteor/client/views/omnichannel/departments/utils/formatAgentListPayload.ts @@ -1,20 +1,20 @@ import type { IDepartmentAgent } from '../definitions'; export const formatAgentListPayload = (oldAgentList: IDepartmentAgent[], newAgentList: IDepartmentAgent[]) => { - const upsert: IDepartmentAgent[] = []; - const remove: IDepartmentAgent[] = []; + const upsert: Pick[] = []; + const remove: Pick[] = []; for (const agent of newAgentList) { const initialAgent = agent._id ? oldAgentList.find((initialAgent) => initialAgent._id === agent._id) : undefined; if (!initialAgent || agent.count !== initialAgent.count || agent.order !== initialAgent.order) { - upsert.push(agent); + upsert.push({ agentId: agent.agentId, username: agent.username, count: agent.count, order: agent.order }); } } for (const initialAgent of oldAgentList) { if (!newAgentList.some((agent) => initialAgent._id === agent._id)) { - remove.push(initialAgent); + remove.push({ agentId: initialAgent.agentId, username: initialAgent.username }); } } diff --git a/apps/meteor/tests/end-to-end/api/livechat/10-departments.ts b/apps/meteor/tests/end-to-end/api/livechat/10-departments.ts index 99ca5591b25a4..f219a7a4f0037 100644 --- a/apps/meteor/tests/end-to-end/api/livechat/10-departments.ts +++ b/apps/meteor/tests/end-to-end/api/livechat/10-departments.ts @@ -911,6 +911,30 @@ import { IS_EE } from '../../../e2e/config/constants'; .send({ upsert: [{ agentId: agent._id, username: agent.username, name: agent.name }], remove: [] }) .expect(200); expect(res.body).to.have.property('success', true); + }); + it('should successfully remove an agent from a department', async () => { + const [dep, agent] = await Promise.all([createDepartment(), createAgent()]); + const res = await request + .post(api(`livechat/department/${dep._id}/agents`)) + .set(credentials) + // UI sends the whole agent object, but API only needs agentId and username + .send({ + remove: [ + { + agentId: agent._id, + username: agent.username, + name: agent.name, + count: 0, + order: 0, + departmentId: 'afdsfads', + _id: 'afsdfadsfaf', + _updatedAt: new Date(), + }, + ], + upsert: [], + }) + .expect(200); + expect(res.body).to.have.property('success', true); await deleteDepartment(dep._id); }); }); diff --git a/packages/rest-typings/src/v1/omnichannel.ts b/packages/rest-typings/src/v1/omnichannel.ts index ec93ac5807997..11c6eebe7f34c 100644 --- a/packages/rest-typings/src/v1/omnichannel.ts +++ b/packages/rest-typings/src/v1/omnichannel.ts @@ -215,6 +215,10 @@ const LivechatDepartmentDepartmentIdAgentsPOSTSchema = { order: { type: 'number', }, + departmentEnabled: { type: 'boolean' }, + departmentId: { type: 'string' }, + _id: { type: 'string' }, + _updatedAt: { type: 'string' }, }, required: ['agentId', 'username'], additionalProperties: false,