Skip to content

Commit 70e3968

Browse files
authored
fix(Omnichannel): Contact Center sort by date (#32566)
1 parent 02dd875 commit 70e3968

File tree

4 files changed

+58
-7
lines changed

4 files changed

+58
-7
lines changed

.changeset/proud-coats-repair.md

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@rocket.chat/meteor": patch
3+
---
4+
5+
Fix the sorting by last chat in Contact Center table

apps/meteor/client/views/omnichannel/directory/contacts/ContactTable.tsx

+8-2
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ import { useCurrentContacts } from './hooks/useCurrentContacts';
2626

2727
function ContactTable(): ReactElement {
2828
const { current, itemsPerPage, setItemsPerPage, setCurrent, ...paginationProps } = usePagination();
29-
const { sortBy, sortDirection, setSort } = useSort<'username' | 'phone' | 'name' | 'visitorEmails.address' | 'lastchat'>('username');
29+
const { sortBy, sortDirection, setSort } = useSort<'username' | 'phone' | 'name' | 'visitorEmails.address' | 'lastChat.ts'>('username');
3030
const isCallReady = useIsCallReady();
3131

3232
const [term, setTerm] = useDebouncedState('', 500);
@@ -90,7 +90,13 @@ function ContactTable(): ReactElement {
9090
>
9191
{t('Email')}
9292
</GenericTableHeaderCell>
93-
<GenericTableHeaderCell key='lastchat' direction={sortDirection} active={sortBy === 'lastchat'} onClick={setSort} sort='lastchat'>
93+
<GenericTableHeaderCell
94+
key='lastchat'
95+
direction={sortDirection}
96+
active={sortBy === 'lastChat.ts'}
97+
onClick={setSort}
98+
sort='lastChat.ts'
99+
>
94100
{t('Last_Chat')}
95101
</GenericTableHeaderCell>
96102
<GenericTableHeaderCell key='call' width={44} />

apps/meteor/tests/data/livechat/rooms.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ export const createLivechatRoom = async (visitorToken: string, extraRoomParams?:
3232
return response.body.room;
3333
};
3434

35-
export const createVisitor = (department?: string): Promise<ILivechatVisitor> =>
35+
export const createVisitor = (department?: string, visitorName?: string): Promise<ILivechatVisitor> =>
3636
new Promise((resolve, reject) => {
3737
const token = getRandomVisitorToken();
3838
const email = `${token}@${token}.com`;
@@ -46,7 +46,7 @@ export const createVisitor = (department?: string): Promise<ILivechatVisitor> =>
4646
.set(credentials)
4747
.send({
4848
visitor: {
49-
name: `Visitor ${Date.now()}`,
49+
name: visitorName || `Visitor ${Date.now()}`,
5050
email,
5151
token,
5252
phone,

apps/meteor/tests/end-to-end/api/livechat/11-livechat.ts

+43-3
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,18 @@
11
import { expect } from 'chai';
2-
import { before, describe, it } from 'mocha';
2+
import { after, before, describe, it } from 'mocha';
33

44
import { sleep } from '../../../../lib/utils/sleep';
55
import { getCredentials, api, request, credentials } from '../../../data/api-data';
66
import { createCustomField, deleteCustomField } from '../../../data/livechat/custom-fields';
77
import { addOrRemoveAgentFromDepartment, createDepartmentWithAnOnlineAgent } from '../../../data/livechat/department';
8-
import { createVisitor, createLivechatRoom, makeAgentUnavailable, closeOmnichannelRoom, sendMessage } from '../../../data/livechat/rooms';
8+
import {
9+
createVisitor,
10+
createLivechatRoom,
11+
makeAgentUnavailable,
12+
closeOmnichannelRoom,
13+
sendMessage,
14+
deleteVisitor,
15+
} from '../../../data/livechat/rooms';
916
import { createBotAgent, getRandomVisitorToken } from '../../../data/livechat/users';
1017
import { removePermissionFromAllRoles, restorePermissionToRoles, updatePermission, updateSetting } from '../../../data/permissions.helper';
1118
import { IS_EE } from '../../../e2e/config/constants';
@@ -15,8 +22,9 @@ describe('LIVECHAT - Utils', function () {
1522

1623
before((done) => getCredentials(done));
1724

18-
before(async () => {
25+
after(async () => {
1926
await updateSetting('Livechat_enabled', true);
27+
await updateSetting('Livechat_offline_email', '');
2028
});
2129

2230
describe('livechat/offline.message', () => {
@@ -453,6 +461,38 @@ describe('LIVECHAT - Utils', function () {
453461
expect(body).to.have.property('token', visitor.token);
454462
});
455463
});
464+
describe('livechat/visitors.search', () => {
465+
it('should bring sorted data by last chat time', async () => {
466+
const visitor1 = await createVisitor(undefined, 'VisitorInPast');
467+
const room1 = await createLivechatRoom(visitor1.token);
468+
469+
const visitor2 = await createVisitor(undefined, 'VisitorInPresent');
470+
const room2 = await createLivechatRoom(visitor2.token);
471+
472+
const { body: result1 } = await request
473+
.get(api('livechat/visitors.search?term=VisitorIn&sort={"lastChat.ts":1}'))
474+
.set(credentials)
475+
.send();
476+
477+
expect(result1).to.have.property('visitors').that.is.an('array');
478+
expect(result1.visitors[0]).to.have.property('name');
479+
expect(result1.visitors[0].name).to.be.eq('VisitorInPast');
480+
481+
const { body: result2 } = await request
482+
.get(api('livechat/visitors.search?term=VisitorIn&sort={"lastChat.ts":-1}'))
483+
.set(credentials)
484+
.send();
485+
486+
expect(result2).to.have.property('visitors').that.is.an('array');
487+
expect(result2.visitors[0]).to.have.property('name');
488+
expect(result2.visitors[0].name).to.be.eq('VisitorInPresent');
489+
490+
await closeOmnichannelRoom(room1._id);
491+
await closeOmnichannelRoom(room2._id);
492+
await deleteVisitor(visitor1.token);
493+
await deleteVisitor(visitor2.token);
494+
});
495+
});
456496

457497
describe('livechat/message', () => {
458498
it('should fail if no token', async () => {

0 commit comments

Comments
 (0)