fix: keep pending widget conversations visible and searchable
Build and publish Docker images / Build and publish images (push) Successful in 2m25s

This commit is contained in:
2026-09-14 17:30:24 +08:00
parent ca2a3c2dee
commit 665e531dc3
8 changed files with 74 additions and 4 deletions
@@ -50,6 +50,7 @@ import {
filterItemsByPermission,
} from 'dashboard/helper/permissionsHelper.js';
import { matchesFilters } from '../store/modules/conversations/helpers/filterHelpers';
import { isConversationUnassigned } from '../store/modules/conversations/helpers';
import { CONVERSATION_EVENTS } from '../helper/AnalyticsHelper/events';
import { ASSIGNEE_TYPE_TAB_PERMISSIONS } from 'dashboard/constants/permissions.js';
@@ -305,7 +306,7 @@ function filterByAssigneeTab(conversations) {
);
}
if (activeAssigneeTab.value === wootConstants.ASSIGNEE_TYPE.UNASSIGNED) {
return conversations.filter(c => !c.meta?.assignee);
return conversations.filter(isConversationUnassigned);
}
return [...conversations];
}
@@ -1,5 +1,10 @@
import { MESSAGE_TYPE } from 'shared/constants/messages';
import { applyPageFilters, applyRoleFilter, sortComparator } from './helpers';
import {
applyPageFilters,
applyRoleFilter,
isConversationUnassigned,
sortComparator,
} from './helpers';
import filterQueryGenerator from 'dashboard/helper/filterQueryGenerator';
import { matchesFilters } from './helpers/filterHelpers';
import {
@@ -99,7 +104,7 @@ const getters = {
},
getUnAssignedChats: _state => activeFilters => {
return _state.allConversations.filter(conversation => {
const isUnAssigned = !conversation.meta.assignee;
const isUnAssigned = isConversationUnassigned(conversation);
const shouldFilter = applyPageFilters(conversation, activeFilters);
return isUnAssigned && shouldFilter;
});
@@ -11,6 +11,11 @@ export const findPendingMessageIndex = (chat, message) => {
);
};
export const isConversationUnassigned = conversation => {
const { assignee, assignee_type: assigneeType } = conversation.meta || {};
return !assignee || assigneeType === 'AgentBot';
};
export const filterByStatus = (chatStatus, filterStatus) =>
filterStatus === 'all' ? true : chatStatus === filterStatus;
@@ -95,7 +100,7 @@ export const applyRoleFilter = (
}
const conversationAssignee = conversation.meta.assignee;
const isUnassigned = !conversationAssignee;
const isUnassigned = isConversationUnassigned(conversation);
const isAssignedToUser = conversationAssignee?.id === currentUserId;
// Check unassigned management permission
@@ -159,6 +159,13 @@ describe('#getters', () => {
meta: { team: { id: 5 } },
labels: ['sales'],
},
{
id: 33,
inbox_id: 4,
status: 1,
meta: { assignee: { id: 9 }, assignee_type: 'AgentBot' },
labels: [],
},
];
expect(
@@ -180,6 +187,13 @@ describe('#getters', () => {
meta: { team: { id: 5 } },
labels: ['sales'],
},
{
id: 33,
inbox_id: 4,
status: 1,
meta: { assignee: { id: 9 }, assignee_type: 'AgentBot' },
labels: [],
},
]);
});
});
@@ -1,5 +1,6 @@
import {
findPendingMessageIndex,
isConversationUnassigned,
applyPageFilters,
filterByInbox,
filterByTeam,
@@ -56,6 +57,24 @@ describe('#findPendingMessageIndex', () => {
});
});
describe('#isConversationUnassigned', () => {
it('treats an agent-bot conversation as unassigned for agent queues', () => {
expect(
isConversationUnassigned({
meta: { assignee: { id: 7 }, assignee_type: 'AgentBot' },
})
).toBe(true);
});
it('does not treat a human-assigned conversation as unassigned', () => {
expect(
isConversationUnassigned({
meta: { assignee: { id: 7 }, assignee_type: 'User' },
})
).toBe(false);
});
});
describe('#applyPageFilters', () => {
describe('#filter-team', () => {
it('returns true if conversation has team and team filter is active', () => {